ZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9fX2luaXRfXy5weSBiL0xpYi9lbWFpbC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzAyMjEyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNDYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQSBwYWNrYWdlIGZvciBwYXJzaW5nLCBoYW5kbGluZywgYW5kIGdlbmVyYXRpbmcgZW1haWwgbWVzc2FnZXMuIiIiCisKK19fdmVyc2lvbl9fID0gJzUuMC4wJworCitfX2FsbF9fID0gWworICAgICdiYXNlNjRtaW1lJywKKyAgICAnY2hhcnNldCcsCisgICAgJ2VuY29kZXJzJywKKyAgICAnZXJyb3JzJywKKyAgICAnZ2VuZXJhdG9yJywKKyAgICAnaGVhZGVyJywKKyAgICAnaXRlcmF0b3JzJywKKyAgICAnbWVzc2FnZScsCisgICAgJ21lc3NhZ2VfZnJvbV9maWxlJywKKyAgICAnbWVzc2FnZV9mcm9tX3N0cmluZycsCisgICAgJ21pbWUnLAorICAgICdwYXJzZXInLAorICAgICdxdW9wcmltaW1lJywKKyAgICAndXRpbHMnLAorICAgIF0KKworCisMCisjIFNvbWUgY29udmVuaWVuY2Ugcm91dGluZXMuICBEb24ndCBpbXBvcnQgUGFyc2VyIGFuZCBNZXNzYWdlIGFzIHNpZGUtZWZmZWN0cworIyBvZiBpbXBvcnRpbmcgZW1haWwgc2luY2UgdGhvc2UgY2FzY2FkaW5nbHkgaW1wb3J0IG1vc3Qgb2YgdGhlIHJlc3Qgb2YgdGhlCisjIGVtYWlsIHBhY2thZ2UuCitkZWYgbWVzc2FnZV9mcm9tX3N0cmluZyhzLCAqYXJncywgKiprd3MpOgorICAgICIiIlBhcnNlIGEgc3RyaW5nIGludG8gYSBNZXNzYWdlIG9iamVjdCBtb2RlbC4KKworICAgIE9wdGlvbmFsIF9jbGFzcyBhbmQgc3RyaWN0IGFyZSBwYXNzZWQgdG8gdGhlIFBhcnNlciBjb25zdHJ1Y3Rvci4KKyAgICAiIiIKKyAgICBmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyCisgICAgcmV0dXJuIFBhcnNlcigqYXJncywgKiprd3MpLnBhcnNlc3RyKHMpCisKKworZGVmIG1lc3NhZ2VfZnJvbV9maWxlKGZwLCAqYXJncywgKiprd3MpOgorICAgICIiIlJlYWQgYSBmaWxlIGFuZCBwYXJzZSBpdHMgY29udGVudHMgaW50byBhIE1lc3NhZ2Ugb2JqZWN0IG1vZGVsLgorCisgICAgT3B0aW9uYWwgX2NsYXNzIGFuZCBzdHJpY3QgYXJlIHBhc3NlZCB0byB0aGUgUGFyc2VyIGNvbnN0cnVjdG9yLgorICAgICIiIgorICAgIGZyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKKyAgICByZXR1cm4gUGFyc2VyKCphcmdzLCAqKmt3cykucGFyc2UoZnApCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvX3BhcnNlYWRkci5weSBiL0xpYi9lbWFpbC9fcGFyc2VhZGRyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTEzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvX3BhcnNlYWRkci5weQpAQCAtMCwwICsxLDQ4MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJFbWFpbCBhZGRyZXNzIHBhcnNpbmcgY29kZS4KKworTGlmdGVkIGRpcmVjdGx5IGZyb20gcmZjODIyLnB5LiAgVGhpcyBzaG91bGQgZXZlbnR1YWxseSBiZSByZXdyaXR0ZW4uCisiIiIKKworX19hbGxfXyA9IFsKKyAgICAnbWt0aW1lX3R6JywKKyAgICAncGFyc2VkYXRlJywKKyAgICAncGFyc2VkYXRlX3R6JywKKyAgICAncXVvdGUnLAorICAgIF0KKworaW1wb3J0IHRpbWUKKworU1BBQ0UgPSAnICcKK0VNUFRZU1RSSU5HID0gJycKK0NPTU1BU1BBQ0UgPSAnLCAnCisKKyMgUGFyc2UgYSBkYXRlIGZpZWxkCitfbW9udGhuYW1lcyA9IFsnamFuJywgJ2ZlYicsICdtYXInLCAnYXByJywgJ21heScsICdqdW4nLCAnanVsJywKKyAgICAgICAgICAgICAgICdhdWcnLCAnc2VwJywgJ29jdCcsICdub3YnLCAnZGVjJywKKyAgICAgICAgICAgICAgICdqYW51YXJ5JywgJ2ZlYnJ1YXJ5JywgJ21hcmNoJywgJ2FwcmlsJywgJ21heScsICdqdW5lJywgJ2p1bHknLAorICAgICAgICAgICAgICAgJ2F1Z3VzdCcsICdzZXB0ZW1iZXInLCAnb2N0b2JlcicsICdub3ZlbWJlcicsICdkZWNlbWJlciddCisKK19kYXluYW1lcyA9IFsnbW9uJywgJ3R1ZScsICd3ZWQnLCAndGh1JywgJ2ZyaScsICdzYXQnLCAnc3VuJ10KKworIyBUaGUgdGltZXpvbmUgdGFibGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgbWlsaXRhcnkgdGltZSB6b25lcyBkZWZpbmVkCisjIGluIFJGQzgyMiwgb3RoZXIgdGhhbiBaLiAgQWNjb3JkaW5nIHRvIFJGQzExMjMsIHRoZSBkZXNjcmlwdGlvbiBpbgorIyBSRkM4MjIgZ2V0cyB0aGUgc2lnbnMgd3JvbmcsIHNvIHdlIGNhbid0IHJlbHkgb24gYW55IHN1Y2ggdGltZQorIyB6b25lcy4gIFJGQzExMjMgcmVjb21tZW5kcyB0aGF0IG51bWVyaWMgdGltZXpvbmUgaW5kaWNhdG9ycyBiZSB1c2VkCisjIGluc3RlYWQgb2YgdGltZXpvbmUgbmFtZXMuCisKK190aW1lem9uZXMgPSB7J1VUJzowLCAnVVRDJzowLCAnR01UJzowLCAnWic6MCwKKyAgICAgICAgICAgICAgJ0FTVCc6IC00MDAsICdBRFQnOiAtMzAwLCAgIyBBdGxhbnRpYyAodXNlZCBpbiBDYW5hZGEpCisgICAgICAgICAgICAgICdFU1QnOiAtNTAwLCAnRURUJzogLTQwMCwgICMgRWFzdGVybgorICAgICAgICAgICAgICAnQ1NUJzogLTYwMCwgJ0NEVCc6IC01MDAsICAjIENlbnRyYWwKKyAgICAgICAgICAgICAgJ01TVCc6IC03MDAsICdNRFQnOiAtNjAwLCAgIyBNb3VudGFpbgorICAgICAgICAgICAgICAnUFNUJzogLTgwMCwgJ1BEVCc6IC03MDAgICAjIFBhY2lmaWMKKyAgICAgICAgICAgICAgfQorCisKK2RlZiBwYXJzZWRhdGVfdHooZGF0YSk6CisgICAgIiIiQ29udmVydCBhIGRhdGUgc3RyaW5nIHRvIGEgdGltZSB0dXBsZS4KKworICAgIEFjY291bnRzIGZvciBtaWxpdGFyeSB0aW1lem9uZXMuCisgICAgIiIiCisgICAgZGF0YSA9IGRhdGEuc3BsaXQoKQorICAgICMgVGhlIEZXUyBhZnRlciB0aGUgY29tbWEgYWZ0ZXIgdGhlIGRheS1vZi13ZWVrIGlzIG9wdGlvbmFsLCBzbyBzZWFyY2ggYW5kCisgICAgIyBhZGp1c3QgZm9yIHRoaXMuCisgICAgaWYgZGF0YVswXS5lbmRzd2l0aCgnLCcpIG9yIGRhdGFbMF0ubG93ZXIoKSBpbiBfZGF5bmFtZXM6CisgICAgICAgICMgVGhlcmUncyBhIGRheW5hbWUgaGVyZS4gU2tpcCBpdAorICAgICAgICBkZWwgZGF0YVswXQorICAgIGVsc2U6CisgICAgICAgIGkgPSBkYXRhWzBdLnJmaW5kKCcsJykKKyAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgZGF0YVswXSA9IGRhdGFbMF1baSsxOl0KKyAgICBpZiBsZW4oZGF0YSkgPT0gMzogIyBSRkMgODUwIGRhdGUsIGRlcHJlY2F0ZWQKKyAgICAgICAgc3R1ZmYgPSBkYXRhWzBdLnNwbGl0KCctJykKKyAgICAgICAgaWYgbGVuKHN0dWZmKSA9PSAzOgorICAgICAgICAgICAgZGF0YSA9IHN0dWZmICsgZGF0YVsxOl0KKyAgICBpZiBsZW4oZGF0YSkgPT0gNDoKKyAgICAgICAgcyA9IGRhdGFbM10KKyAgICAgICAgaSA9IHMuZmluZCgnKycpCisgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgZGF0YVszOl0gPSBbc1s6aV0sIHNbaSsxOl1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhLmFwcGVuZCgnJykgIyBEdW1teSB0egorICAgIGlmIGxlbihkYXRhKSA8IDU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZGF0YSA9IGRhdGFbOjVdCisgICAgW2RkLCBtbSwgeXksIHRtLCB0el0gPSBkYXRhCisgICAgbW0gPSBtbS5sb3dlcigpCisgICAgaWYgbW0gbm90IGluIF9tb250aG5hbWVzOgorICAgICAgICBkZCwgbW0gPSBtbSwgZGQubG93ZXIoKQorICAgICAgICBpZiBtbSBub3QgaW4gX21vbnRobmFtZXM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgIG1tID0gX21vbnRobmFtZXMuaW5kZXgobW0pICsgMQorICAgIGlmIG1tID4gMTI6CisgICAgICAgIG1tIC09IDEyCisgICAgaWYgZGRbLTFdID09ICcsJzoKKyAgICAgICAgZGQgPSBkZFs6LTFdCisgICAgaSA9IHl5LmZpbmQoJzonKQorICAgIGlmIGkgPiAwOgorICAgICAgICB5eSwgdG0gPSB0bSwgeXkKKyAgICBpZiB5eVstMV0gPT0gJywnOgorICAgICAgICB5eSA9IHl5WzotMV0KKyAgICBpZiBub3QgeXlbMF0uaXNkaWdpdCgpOgorICAgICAgICB5eSwgdHogPSB0eiwgeXkKKyAgICBpZiB0bVstMV0gPT0gJywnOgorICAgICAgICB0bSA9IHRtWzotMV0KKyAgICB0bSA9IHRtLnNwbGl0KCc6JykKKyAgICBpZiBsZW4odG0pID09IDI6CisgICAgICAgIFt0aGgsIHRtbV0gPSB0bQorICAgICAgICB0c3MgPSAnMCcKKyAgICBlbGlmIGxlbih0bSkgPT0gMzoKKyAgICAgICAgW3RoaCwgdG1tLCB0c3NdID0gdG0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHRyeToKKyAgICAgICAgeXkgPSBpbnQoeXkpCisgICAgICAgIGRkID0gaW50KGRkKQorICAgICAgICB0aGggPSBpbnQodGhoKQorICAgICAgICB0bW0gPSBpbnQodG1tKQorICAgICAgICB0c3MgPSBpbnQodHNzKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHR6b2Zmc2V0ID0gTm9uZQorICAgIHR6ID0gdHoudXBwZXIoKQorICAgIGlmIHR6IGluIF90aW1lem9uZXM6CisgICAgICAgIHR6b2Zmc2V0ID0gX3RpbWV6b25lc1t0el0KKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0em9mZnNldCA9IGludCh0eikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgIyBDb252ZXJ0IGEgdGltZXpvbmUgb2Zmc2V0IGludG8gc2Vjb25kcyA7IC0wNTAwIC0+IC0xODAwMAorICAgIGlmIHR6b2Zmc2V0OgorICAgICAgICBpZiB0em9mZnNldCA8IDA6CisgICAgICAgICAgICB0enNpZ24gPSAtMQorICAgICAgICAgICAgdHpvZmZzZXQgPSAtdHpvZmZzZXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6c2lnbiA9IDEKKyAgICAgICAgdHpvZmZzZXQgPSB0enNpZ24gKiAoICh0em9mZnNldC8vMTAwKSozNjAwICsgKHR6b2Zmc2V0ICUgMTAwKSo2MCkKKyAgICAjIERheWxpZ2h0IFNhdmluZyBUaW1lIGZsYWcgaXMgc2V0IHRvIC0xLCBzaW5jZSBEU1QgaXMgdW5rbm93bi4KKyAgICByZXR1cm4geXksIG1tLCBkZCwgdGhoLCB0bW0sIHRzcywgMCwgMSwgLTEsIHR6b2Zmc2V0CisKKworZGVmIHBhcnNlZGF0ZShkYXRhKToKKyAgICAiIiJDb252ZXJ0IGEgdGltZSBzdHJpbmcgdG8gYSB0aW1lIHR1cGxlLiIiIgorICAgIHQgPSBwYXJzZWRhdGVfdHooZGF0YSkKKyAgICBpZiBpc2luc3RhbmNlKHQsIHR1cGxlKToKKyAgICAgICAgcmV0dXJuIHRbOjldCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHQKKworCitkZWYgbWt0aW1lX3R6KGRhdGEpOgorICAgICIiIlR1cm4gYSAxMC10dXBsZSBhcyByZXR1cm5lZCBieSBwYXJzZWRhdGVfdHooKSBpbnRvIGEgVVRDIHRpbWVzdGFtcC4iIiIKKyAgICBpZiBkYXRhWzldIGlzIE5vbmU6CisgICAgICAgICMgTm8gem9uZSBpbmZvLCBzbyBsb2NhbHRpbWUgaXMgYmV0dGVyIGFzc3VtcHRpb24gdGhhbiBHTVQKKyAgICAgICAgcmV0dXJuIHRpbWUubWt0aW1lKGRhdGFbOjhdICsgKC0xLCkpCisgICAgZWxzZToKKyAgICAgICAgdCA9IHRpbWUubWt0aW1lKGRhdGFbOjhdICsgKDAsKSkKKyAgICAgICAgcmV0dXJuIHQgLSBkYXRhWzldIC0gdGltZS50aW1lem9uZQorCisKK2RlZiBxdW90ZShzdHIpOgorICAgICIiIkFkZCBxdW90ZXMgYXJvdW5kIGEgc3RyaW5nLiIiIgorICAgIHJldHVybiBzdHIucmVwbGFjZSgnXFwnLCAnXFxcXCcpLnJlcGxhY2UoJyInLCAnXFwiJykKKworCitjbGFzcyBBZGRybGlzdENsYXNzOgorICAgICIiIkFkZHJlc3MgcGFyc2VyIGNsYXNzIGJ5IEJlbiBFc2NvdG8uCisKKyAgICBUbyB1bmRlcnN0YW5kIHdoYXQgdGhpcyBjbGFzcyBkb2VzLCBpdCBoZWxwcyB0byBoYXZlIGEgY29weSBvZiBSRkMgMjgyMiBpbgorICAgIGZyb250IG9mIHlvdS4KKworICAgIE5vdGU6IHRoaXMgY2xhc3MgaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQgYW5kIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisgICAgVXNlIHJmYzgyMi5BZGRyZXNzTGlzdCBpbnN0ZWFkLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpZWxkKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZS4KKworICAgICAgICBgZmllbGQnIGlzIGFuIHVucGFyc2VkIGFkZHJlc3MgaGVhZGVyIGZpZWxkLCBjb250YWluaW5nCisgICAgICAgIG9uZSBvciBtb3JlIGFkZHJlc3Nlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3BlY2lhbHMgPSAnKCk8PkAsOjsuXCJbXScKKyAgICAgICAgc2VsZi5wb3MgPSAwCisgICAgICAgIHNlbGYuTFdTID0gJyBcdCcKKyAgICAgICAgc2VsZi5DUiA9ICdcclxuJworICAgICAgICBzZWxmLkZXUyA9IHNlbGYuTFdTICsgc2VsZi5DUgorICAgICAgICBzZWxmLmF0b21lbmRzID0gc2VsZi5zcGVjaWFscyArIHNlbGYuTFdTICsgc2VsZi5DUgorICAgICAgICAjIE5vdGUgdGhhdCBSRkMgMjgyMiBub3cgc3BlY2lmaWVzIGAuJyBhcyBvYnMtcGhyYXNlLCBtZWFuaW5nIHRoYXQgaXQKKyAgICAgICAgIyBpcyBvYnNvbGV0ZSBzeW50YXguICBSRkMgMjgyMiByZXF1aXJlcyB0aGF0IHdlIHJlY29nbml6ZSBvYnNvbGV0ZQorICAgICAgICAjIHN5bnRheCwgc28gYWxsb3cgZG90cyBpbiBwaHJhc2VzLgorICAgICAgICBzZWxmLnBocmFzZWVuZHMgPSBzZWxmLmF0b21lbmRzLnJlcGxhY2UoJy4nLCAnJykKKyAgICAgICAgc2VsZi5maWVsZCA9IGZpZWxkCisgICAgICAgIHNlbGYuY29tbWVudGxpc3QgPSBbXQorCisgICAgZGVmIGdvdG9uZXh0KHNlbGYpOgorICAgICAgICAiIiJQYXJzZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgYWRkcmVzcy4iIiIKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLkxXUyArICdcblxyJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1lbnRsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiBnZXRhZGRybGlzdChzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYWxsIGFkZHJlc3Nlcy4KKworICAgICAgICBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIGFsbCBvZiB0aGUgYWRkcmVzc2VzLgorICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBhZCA9IHNlbGYuZ2V0YWRkcmVzcygpCisgICAgICAgICAgICBpZiBhZDoKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gYWQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycsICcnKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGdldGFkZHJlc3Moc2VsZik6CisgICAgICAgICIiIlBhcnNlIHRoZSBuZXh0IGFkZHJlc3MuIiIiCisgICAgICAgIHNlbGYuY29tbWVudGxpc3QgPSBbXQorICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKworICAgICAgICBvbGRwb3MgPSBzZWxmLnBvcworICAgICAgICBvbGRjbCA9IHNlbGYuY29tbWVudGxpc3QKKyAgICAgICAgcGxpc3QgPSBzZWxmLmdldHBocmFzZWxpc3QoKQorCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICByZXR1cm5saXN0ID0gW10KKworICAgICAgICBpZiBzZWxmLnBvcyA+PSBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICAjIEJhZCBlbWFpbCBhZGRyZXNzIHRlY2huaWNhbGx5LCBubyBkb21haW4uCisgICAgICAgICAgICBpZiBwbGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gWyhTUEFDRS5qb2luKHNlbGYuY29tbWVudGxpc3QpLCBwbGlzdFswXSldCisKKyAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiAnLkAnOgorICAgICAgICAgICAgIyBlbWFpbCBhZGRyZXNzIGlzIGp1c3QgYW4gYWRkcnNwZWMKKyAgICAgICAgICAgICMgdGhpcyBpc24ndCB2ZXJ5IGVmZmljaWVudCBzaW5jZSB3ZSBzdGFydCBvdmVyCisgICAgICAgICAgICBzZWxmLnBvcyA9IG9sZHBvcworICAgICAgICAgICAgc2VsZi5jb21tZW50bGlzdCA9IG9sZGNsCisgICAgICAgICAgICBhZGRyc3BlYyA9IHNlbGYuZ2V0YWRkcnNwZWMoKQorICAgICAgICAgICAgcmV0dXJubGlzdCA9IFsoU1BBQ0Uuam9pbihzZWxmLmNvbW1lbnRsaXN0KSwgYWRkcnNwZWMpXQorCisgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJzonOgorICAgICAgICAgICAgIyBhZGRyZXNzIGlzIGEgZ3JvdXAKKyAgICAgICAgICAgIHJldHVybmxpc3QgPSBbXQorCisgICAgICAgICAgICBmaWVsZGxlbiA9IGxlbihzZWxmLmZpZWxkKQorICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5wb3MgPCBmaWVsZGxlbiBhbmQgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJzsnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcmV0dXJubGlzdCA9IHJldHVybmxpc3QgKyBzZWxmLmdldGFkZHJlc3MoKQorCisgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJzwnOgorICAgICAgICAgICAgIyBBZGRyZXNzIGlzIGEgcGhyYXNlIHRoZW4gYSByb3V0ZSBhZGRyCisgICAgICAgICAgICByb3V0ZWFkZHIgPSBzZWxmLmdldHJvdXRlYWRkcigpCisKKyAgICAgICAgICAgIGlmIHNlbGYuY29tbWVudGxpc3Q6CisgICAgICAgICAgICAgICAgcmV0dXJubGlzdCA9IFsoU1BBQ0Uuam9pbihwbGlzdCkgKyAnICgnICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICcuam9pbihzZWxmLmNvbW1lbnRsaXN0KSArICcpJywgcm91dGVhZGRyKV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJubGlzdCA9IFsoU1BBQ0Uuam9pbihwbGlzdCksIHJvdXRlYWRkcildCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHBsaXN0OgorICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKFNQQUNFLmpvaW4oc2VsZi5jb21tZW50bGlzdCksIHBsaXN0WzBdKV0KKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5zcGVjaWFsczoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisKKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgIGlmIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpIGFuZCBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnLCc6CisgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgIHJldHVybiByZXR1cm5saXN0CisKKyAgICBkZWYgZ2V0cm91dGVhZGRyKHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhIHJvdXRlIGFkZHJlc3MgKFJldHVybi1wYXRoIHZhbHVlKS4KKworICAgICAgICBUaGlzIG1ldGhvZCBqdXN0IHNraXBzIGFsbCB0aGUgcm91dGUgc3R1ZmYgYW5kIHJldHVybnMgdGhlIGFkZHJzcGVjLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gIT0gJzwnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZXhwZWN0cm91dGUgPSBGYWxzZQorICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICBhZGxpc3QgPSAnJworICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIGV4cGVjdHJvdXRlOgorICAgICAgICAgICAgICAgIHNlbGYuZ2V0ZG9tYWluKCkKKyAgICAgICAgICAgICAgICBleHBlY3Ryb3V0ZSA9IEZhbHNlCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc+JzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJ0AnOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgICAgICBleHBlY3Ryb3V0ZSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJzonOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYWRsaXN0ID0gc2VsZi5nZXRhZGRyc3BlYygpCisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKworICAgICAgICByZXR1cm4gYWRsaXN0CisKKyAgICBkZWYgZ2V0YWRkcnNwZWMoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFuIFJGQyAyODIyIGFkZHItc3BlYy4iIiIKKyAgICAgICAgYXNsaXN0ID0gW10KKworICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnLic6CisgICAgICAgICAgICAgICAgYXNsaXN0LmFwcGVuZCgnLicpCisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnIic6CisgICAgICAgICAgICAgICAgYXNsaXN0LmFwcGVuZCgnIiVzIicgJSBzZWxmLmdldHF1b3RlKCkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNsaXN0LmFwcGVuZChzZWxmLmdldGF0b20oKSkKKyAgICAgICAgICAgIHNlbGYuZ290b25leHQoKQorCisgICAgICAgIGlmIHNlbGYucG9zID49IGxlbihzZWxmLmZpZWxkKSBvciBzZWxmLmZpZWxkW3NlbGYucG9zXSAhPSAnQCc6CisgICAgICAgICAgICByZXR1cm4gRU1QVFlTVFJJTkcuam9pbihhc2xpc3QpCisKKyAgICAgICAgYXNsaXN0LmFwcGVuZCgnQCcpCisgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgIHJldHVybiBFTVBUWVNUUklORy5qb2luKGFzbGlzdCkgKyBzZWxmLmdldGRvbWFpbigpCisKKyAgICBkZWYgZ2V0ZG9tYWluKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGNvbXBsZXRlIGRvbWFpbiBuYW1lIGZyb20gYW4gYWRkcmVzcy4iIiIKKyAgICAgICAgc2RsaXN0ID0gW10KKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLkxXUzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1lbnRsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJ1snOgorICAgICAgICAgICAgICAgIHNkbGlzdC5hcHBlbmQoc2VsZi5nZXRkb21haW5saXRlcmFsKCkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcuJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgc2RsaXN0LmFwcGVuZCgnLicpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2RsaXN0LmFwcGVuZChzZWxmLmdldGF0b20oKSkKKyAgICAgICAgcmV0dXJuIEVNUFRZU1RSSU5HLmpvaW4oc2RsaXN0KQorCisgICAgZGVmIGdldGRlbGltaXRlZChzZWxmLCBiZWdpbmNoYXIsIGVuZGNoYXJzLCBhbGxvd2NvbW1lbnRzPVRydWUpOgorICAgICAgICAiIiJQYXJzZSBhIGhlYWRlciBmcmFnbWVudCBkZWxpbWl0ZWQgYnkgc3BlY2lhbCBjaGFyYWN0ZXJzLgorCisgICAgICAgIGBiZWdpbmNoYXInIGlzIHRoZSBzdGFydCBjaGFyYWN0ZXIgZm9yIHRoZSBmcmFnbWVudC4KKyAgICAgICAgSWYgc2VsZiBpcyBub3QgbG9va2luZyBhdCBhbiBpbnN0YW5jZSBvZiBgYmVnaW5jaGFyJyB0aGVuCisgICAgICAgIGdldGRlbGltaXRlZCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuCisKKyAgICAgICAgYGVuZGNoYXJzJyBpcyBhIHNlcXVlbmNlIG9mIGFsbG93YWJsZSBlbmQtZGVsaW1pdGluZyBjaGFyYWN0ZXJzLgorICAgICAgICBQYXJzaW5nIHN0b3BzIHdoZW4gb25lIG9mIHRoZXNlIGlzIGVuY291bnRlcmVkLgorCisgICAgICAgIElmIGBhbGxvd2NvbW1lbnRzJyBpcyBub24temVybywgZW1iZWRkZWQgUkZDIDI4MjIgY29tbWVudHMgYXJlIGFsbG93ZWQKKyAgICAgICAgd2l0aGluIHRoZSBwYXJzZWQgZnJhZ21lbnQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSAhPSBiZWdpbmNoYXI6CisgICAgICAgICAgICByZXR1cm4gJycKKworICAgICAgICBzbGlzdCA9IFsnJ10KKyAgICAgICAgcXVvdGUgPSBGYWxzZQorICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgcXVvdGU6CisgICAgICAgICAgICAgICAgc2xpc3QuYXBwZW5kKHNlbGYuZmllbGRbc2VsZi5wb3NdKQorICAgICAgICAgICAgICAgIHF1b3RlID0gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gZW5kY2hhcnM6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGFsbG93Y29tbWVudHMgYW5kIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoc2VsZi5nZXRjb21tZW50KCkpCisgICAgICAgICAgICAgICAgY29udGludWUgICAgICAgICMgaGF2ZSBhbHJlYWR5IGFkdmFuY2VkIHBvcyBmcm9tIGdldGNvbW1lbnQKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICBxdW90ZSA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2xpc3QuYXBwZW5kKHNlbGYuZmllbGRbc2VsZi5wb3NdKQorICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorCisgICAgICAgIHJldHVybiBFTVBUWVNUUklORy5qb2luKHNsaXN0KQorCisgICAgZGVmIGdldHF1b3RlKHNlbGYpOgorICAgICAgICAiIiJHZXQgYSBxdW90ZS1kZWxpbWl0ZWQgZnJhZ21lbnQgZnJvbSBzZWxmJ3MgZmllbGQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldGRlbGltaXRlZCgnIicsICciXHInLCBGYWxzZSkKKworICAgIGRlZiBnZXRjb21tZW50KHNlbGYpOgorICAgICAgICAiIiJHZXQgYSBwYXJlbnRoZXNpcy1kZWxpbWl0ZWQgZnJhZ21lbnQgZnJvbSBzZWxmJ3MgZmllbGQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldGRlbGltaXRlZCgnKCcsICcpXHInLCBUcnVlKQorCisgICAgZGVmIGdldGRvbWFpbmxpdGVyYWwoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFuIFJGQyAyODIyIGRvbWFpbi1saXRlcmFsLiIiIgorICAgICAgICByZXR1cm4gJ1slc10nICUgc2VsZi5nZXRkZWxpbWl0ZWQoJ1snLCAnXVxyJywgRmFsc2UpCisKKyAgICBkZWYgZ2V0YXRvbShzZWxmLCBhdG9tZW5kcz1Ob25lKToKKyAgICAgICAgIiIiUGFyc2UgYW4gUkZDIDI4MjIgYXRvbS4KKworICAgICAgICBPcHRpb25hbCBhdG9tZW5kcyBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgc2V0IG9mIGVuZCB0b2tlbiBkZWxpbWl0ZXJzCisgICAgICAgICh0aGUgZGVmYXVsdCBpcyB0byB1c2Ugc2VsZi5hdG9tZW5kcykuICBUaGlzIGlzIHVzZWQgZS5nLiBpbgorICAgICAgICBnZXRwaHJhc2VsaXN0KCkgc2luY2UgcGhyYXNlIGVuZGluZ3MgbXVzdCBub3QgaW5jbHVkZSB0aGUgYC4nICh3aGljaAorICAgICAgICBpcyBsZWdhbCBpbiBwaHJhc2VzKS4iIiIKKyAgICAgICAgYXRvbWxpc3QgPSBbJyddCisgICAgICAgIGlmIGF0b21lbmRzIGlzIE5vbmU6CisgICAgICAgICAgICBhdG9tZW5kcyA9IHNlbGYuYXRvbWVuZHMKKworICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIGF0b21lbmRzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGF0b21saXN0LmFwcGVuZChzZWxmLmZpZWxkW3NlbGYucG9zXSkKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKworICAgICAgICByZXR1cm4gRU1QVFlTVFJJTkcuam9pbihhdG9tbGlzdCkKKworICAgIGRlZiBnZXRwaHJhc2VsaXN0KHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhIHNlcXVlbmNlIG9mIFJGQyAyODIyIHBocmFzZXMuCisKKyAgICAgICAgQSBwaHJhc2UgaXMgYSBzZXF1ZW5jZSBvZiB3b3Jkcywgd2hpY2ggYXJlIGluIHR1cm4gZWl0aGVyIFJGQyAyODIyCisgICAgICAgIGF0b21zIG9yIHF1b3RlZC1zdHJpbmdzLiAgUGhyYXNlcyBhcmUgY2Fub25pY2FsaXplZCBieSBzcXVlZXppbmcgYWxsCisgICAgICAgIHJ1bnMgb2YgY29udGludW91cyB3aGl0ZXNwYWNlIGludG8gb25lIHNwYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgcGxpc3QgPSBbXQorCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5GV1M6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnIic6CisgICAgICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHNlbGYuZ2V0cXVvdGUoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QuYXBwZW5kKHNlbGYuZ2V0Y29tbWVudCgpKQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLnBocmFzZWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHNlbGYuZ2V0YXRvbShzZWxmLnBocmFzZWVuZHMpKQorCisgICAgICAgIHJldHVybiBwbGlzdAorCitjbGFzcyBBZGRyZXNzTGlzdChBZGRybGlzdENsYXNzKToKKyAgICAiIiJBbiBBZGRyZXNzTGlzdCBlbmNhcHN1bGF0ZXMgYSBsaXN0IG9mIHBhcnNlZCBSRkMgMjgyMiBhZGRyZXNzZXMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpZWxkKToKKyAgICAgICAgQWRkcmxpc3RDbGFzcy5fX2luaXRfXyhzZWxmLCBmaWVsZCkKKyAgICAgICAgaWYgZmllbGQ6CisgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0ID0gc2VsZi5nZXRhZGRybGlzdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0ID0gW10KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuYWRkcmVzc2xpc3QpCisKKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICMgU2V0IHVuaW9uCisgICAgICAgIG5ld2FkZHIgPSBBZGRyZXNzTGlzdChOb25lKQorICAgICAgICBuZXdhZGRyLmFkZHJlc3NsaXN0ID0gc2VsZi5hZGRyZXNzbGlzdFs6XQorICAgICAgICBmb3IgeCBpbiBvdGhlci5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCB4IGluIHNlbGYuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICAgICAgbmV3YWRkci5hZGRyZXNzbGlzdC5hcHBlbmQoeCkKKyAgICAgICAgcmV0dXJuIG5ld2FkZHIKKworICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICMgU2V0IHVuaW9uLCBpbi1wbGFjZQorICAgICAgICBmb3IgeCBpbiBvdGhlci5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCB4IGluIHNlbGYuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRyZXNzbGlzdC5hcHBlbmQoeCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBTZXQgZGlmZmVyZW5jZQorICAgICAgICBuZXdhZGRyID0gQWRkcmVzc0xpc3QoTm9uZSkKKyAgICAgICAgZm9yIHggaW4gc2VsZi5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCB4IGluIG90aGVyLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgICAgIG5ld2FkZHIuYWRkcmVzc2xpc3QuYXBwZW5kKHgpCisgICAgICAgIHJldHVybiBuZXdhZGRyCisKKyAgICBkZWYgX19pc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIFNldCBkaWZmZXJlbmNlLCBpbi1wbGFjZQorICAgICAgICBmb3IgeCBpbiBvdGhlci5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgIGlmIHggaW4gc2VsZi5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0LnJlbW92ZSh4KQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgIyBNYWtlIGluZGV4aW5nLCBzbGljZXMsIGFuZCAnaW4nIHdvcmsKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRkcmVzc2xpc3RbaW5kZXhdCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvYmFzZTY0bWltZS5weSBiL0xpYi9lbWFpbC9iYXNlNjRtaW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTliYmIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvYmFzZTY0bWltZS5weQpAQCAtMCwwICsxLDE4NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJlbiBHZXJ0emZpZWxkCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkJhc2U2NCBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIHBlciBSRkNzIDIwNDUtMjA0Ny4KKworVGhpcyBtb2R1bGUgaGFuZGxlcyB0aGUgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBtZXRob2QgZGVmaW5lZCBpbiBSRkMgMjA0NQordG8gZW5jb2RlIGFyYml0cmFyeSA4LWJpdCBkYXRhIHVzaW5nIHRoZSB0aHJlZSA4LWJpdCBieXRlcyBpbiBmb3VyIDctYml0CitjaGFyYWN0ZXJzIGVuY29kaW5nIGtub3duIGFzIEJhc2U2NC4KKworSXQgaXMgdXNlZCBpbiB0aGUgTUlNRSBzdGFuZGFyZHMgZm9yIGVtYWlsIHRvIGF0dGFjaCBpbWFnZXMsIGF1ZGlvLCBhbmQgdGV4dAordXNpbmcgc29tZSA4LWJpdCBjaGFyYWN0ZXIgc2V0cyB0byBtZXNzYWdlcy4KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGVuY29kZSBhbmQgZGVjb2RlIGJvdGggaGVhZGVycyBhbmQgYm9kaWVzCit3aXRoIEJhc2U2NCBlbmNvZGluZy4KKworUkZDIDIwNDUgZGVmaW5lcyBhIG1ldGhvZCBmb3IgaW5jbHVkaW5nIGNoYXJhY3RlciBzZXQgaW5mb3JtYXRpb24gaW4gYW4KK2BlbmNvZGVkLXdvcmQnIGluIGEgaGVhZGVyLiAgVGhpcyBtZXRob2QgaXMgY29tbW9ubHkgdXNlZCBmb3IgOC1iaXQgcmVhbCBuYW1lcworaW4gVG86LCBGcm9tOiwgQ2M6LCBldGMuIGZpZWxkcywgYXMgd2VsbCBhcyBTdWJqZWN0OiBsaW5lcy4KKworVGhpcyBtb2R1bGUgZG9lcyBub3QgZG8gdGhlIGxpbmUgd3JhcHBpbmcgb3IgZW5kLW9mLWxpbmUgY2hhcmFjdGVyIGNvbnZlcnNpb24KK25lY2Vzc2FyeSBmb3IgcHJvcGVyIGludGVybmF0aW9uYWxpemVkIGhlYWRlcnM7IGl0IG9ubHkgZG9lcyBkdW1iIGVuY29kaW5nIGFuZAorZGVjb2RpbmcuICBUbyBkZWFsIHdpdGggdGhlIHZhcmlvdXMgbGluZSB3cmFwcGluZyBpc3N1ZXMsIHVzZSB0aGUgZW1haWwuSGVhZGVyCittb2R1bGUuCisiIiIKKworX19hbGxfXyA9IFsKKyAgICAnYmFzZTY0X2xlbicsCisgICAgJ2JvZHlfZGVjb2RlJywKKyAgICAnYm9keV9lbmNvZGUnLAorICAgICdkZWNvZGUnLAorICAgICdkZWNvZGVzdHJpbmcnLAorICAgICdlbmNvZGUnLAorICAgICdlbmNvZGVzdHJpbmcnLAorICAgICdoZWFkZXJfZW5jb2RlJywKKyAgICBdCisKK2ltcG9ydCByZQorCitmcm9tIGJpbmFzY2lpIGltcG9ydCBiMmFfYmFzZTY0LCBhMmJfYmFzZTY0Citmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBmaXhfZW9scworCitDUkxGID0gJ1xyXG4nCitOTCA9ICdcbicKK0VNUFRZU1RSSU5HID0gJycKKworIyBTZWUgYWxzbyBDaGFyc2V0LnB5CitNSVNDX0xFTiA9IDcKKworCisMCisjIEhlbHBlcnMKK2RlZiBiYXNlNjRfbGVuKHMpOgorICAgICIiIlJldHVybiB0aGUgbGVuZ3RoIG9mIHMgd2hlbiBpdCBpcyBlbmNvZGVkIHdpdGggYmFzZTY0LiIiIgorICAgIGdyb3Vwc19vZl8zLCBsZWZ0b3ZlciA9IGRpdm1vZChsZW4ocyksIDMpCisgICAgIyA0IGJ5dGVzIG91dCBmb3IgZWFjaCAzIGJ5dGVzIChvciBub256ZXJvIGZyYWN0aW9uIHRoZXJlb2YpIGluLgorICAgICMgVGhhbmtzLCBUaW0hCisgICAgbiA9IGdyb3Vwc19vZl8zICogNAorICAgIGlmIGxlZnRvdmVyOgorICAgICAgICBuICs9IDQKKyAgICByZXR1cm4gbgorCisKKwwKK2RlZiBoZWFkZXJfZW5jb2RlKGhlYWRlciwgY2hhcnNldD0naXNvLTg4NTktMScsIGtlZXBfZW9scz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgIG1heGxpbmVsZW49NzYsIGVvbD1OTCk6CisgICAgIiIiRW5jb2RlIGEgc2luZ2xlIGhlYWRlciBsaW5lIHdpdGggQmFzZTY0IGVuY29kaW5nIGluIGEgZ2l2ZW4gY2hhcnNldC4KKworICAgIERlZmluZWQgaW4gUkZDIDIwNDUsIHRoaXMgQmFzZTY0IGVuY29kaW5nIGlzIGlkZW50aWNhbCB0byBub3JtYWwgQmFzZTY0CisgICAgZW5jb2RpbmcsIGV4Y2VwdCB0aGF0IGVhY2ggbGluZSBtdXN0IGJlIGludGVsbGlnZW50bHkgd3JhcHBlZCAocmVzcGVjdGluZworICAgIHRoZSBCYXNlNjQgZW5jb2RpbmcpLCBhbmQgc3Vic2VxdWVudCBsaW5lcyBtdXN0IHN0YXJ0IHdpdGggYSBzcGFjZS4KKworICAgIGNoYXJzZXQgbmFtZXMgdGhlIGNoYXJhY3RlciBzZXQgdG8gdXNlIHRvIGVuY29kZSB0aGUgaGVhZGVyLiAgSXQgZGVmYXVsdHMKKyAgICB0byBpc28tODg1OS0xLgorCisgICAgRW5kLW9mLWxpbmUgY2hhcmFjdGVycyAoXFxyLCBcXG4sIFxcclxcbikgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZAorICAgIHRvIHRoZSBjYW5vbmljYWwgZW1haWwgbGluZSBzZXBhcmF0b3IgXFxyXFxuIHVubGVzcyB0aGUga2VlcF9lb2xzCisgICAgcGFyYW1ldGVyIGlzIFRydWUgKHRoZSBkZWZhdWx0IGlzIEZhbHNlKS4KKworICAgIEVhY2ggbGluZSBvZiB0aGUgaGVhZGVyIHdpbGwgYmUgdGVybWluYXRlZCBpbiB0aGUgdmFsdWUgb2YgZW9sLCB3aGljaAorICAgIGRlZmF1bHRzIHRvICJcXG4iLiAgU2V0IHRoaXMgdG8gIlxcclxcbiIgaWYgeW91IGFyZSB1c2luZyB0aGUgcmVzdWx0IG9mCisgICAgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSBpbiBlbWFpbC4KKworICAgIFRoZSByZXN1bHRpbmcgc3RyaW5nIHdpbGwgYmUgaW4gdGhlIGZvcm06CisKKyAgICAiPT9jaGFyc2V0P2I/V1cvNWNpQnRZWHA2NlhMcklIZjhlaUJoSUdoaGJYQnpkR0h1Y2lCQklGbHYrWElnYldGNmV1bHk/PVxcbgorICAgICAgPT9jaGFyc2V0P2I/NnlCMy9Ib2dZU0JvWVcxd2MzUmg3bklnUWtNZ1dXLzVjaUJ0WVhwNjZYTHJJSGY4ZWlCaElHaGg/PSIKKworICAgIHdpdGggZWFjaCBsaW5lIHdyYXBwZWQgYXQsIGF0IG1vc3QsIG1heGxpbmVsZW4gY2hhcmFjdGVycyAoZGVmYXVsdHMgdG8gNzYKKyAgICBjaGFyYWN0ZXJzKS4KKyAgICAiIiIKKyAgICAjIFJldHVybiBlbXB0eSBoZWFkZXJzIHVuY2hhbmdlZAorICAgIGlmIG5vdCBoZWFkZXI6CisgICAgICAgIHJldHVybiBoZWFkZXIKKworICAgIGlmIG5vdCBrZWVwX2VvbHM6CisgICAgICAgIGhlYWRlciA9IGZpeF9lb2xzKGhlYWRlcikKKworICAgICMgQmFzZTY0IGVuY29kZSBlYWNoIGxpbmUsIGluIGVuY29kZWQgY2h1bmtzIG5vIGdyZWF0ZXIgdGhhbiBtYXhsaW5lbGVuIGluCisgICAgIyBsZW5ndGgsIGFmdGVyIHRoZSBSRkMgY2hyb21lIGlzIGFkZGVkIGluLgorICAgIGJhc2U2NGVkID0gW10KKyAgICBtYXhfZW5jb2RlZCA9IG1heGxpbmVsZW4gLSBsZW4oY2hhcnNldCkgLSBNSVNDX0xFTgorICAgIG1heF91bmVuY29kZWQgPSBtYXhfZW5jb2RlZCAqIDMgLy8gNAorCisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGhlYWRlciksIG1heF91bmVuY29kZWQpOgorICAgICAgICBiYXNlNjRlZC5hcHBlbmQoYjJhX2Jhc2U2NChoZWFkZXJbaTppK21heF91bmVuY29kZWRdKSkKKworICAgICMgTm93IGFkZCB0aGUgUkZDIGNocm9tZSB0byBlYWNoIGVuY29kZWQgY2h1bmsKKyAgICBsaW5lcyA9IFtdCisgICAgZm9yIGxpbmUgaW4gYmFzZTY0ZWQ6CisgICAgICAgICMgSWdub3JlIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBlYWNoIGxpbmUgaWYgaXQgaXMgYSBuZXdsaW5lCisgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoTkwpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAjIEFkZCB0aGUgY2hyb21lCisgICAgICAgIGxpbmVzLmFwcGVuZCgnPT8lcz9iPyVzPz0nICUgKGNoYXJzZXQsIGxpbmUpKQorICAgICMgR2x1ZSB0aGUgbGluZXMgdG9nZXRoZXIgYW5kIHJldHVybiBpdC4gIEJBVzogc2hvdWxkIHdlIGJlIGFibGUgdG8KKyAgICAjIHNwZWNpZnkgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBpbiB0aGUgam9pbmVyPworICAgIGpvaW5lciA9IGVvbCArICcgJworICAgIHJldHVybiBqb2luZXIuam9pbihsaW5lcykKKworCisMCitkZWYgZW5jb2RlKHMsIGJpbmFyeT1UcnVlLCBtYXhsaW5lbGVuPTc2LCBlb2w9TkwpOgorICAgICIiIkVuY29kZSBhIHN0cmluZyB3aXRoIGJhc2U2NC4KKworICAgIEVhY2ggbGluZSB3aWxsIGJlIHdyYXBwZWQgYXQsIGF0IG1vc3QsIG1heGxpbmVsZW4gY2hhcmFjdGVycyAoZGVmYXVsdHMgdG8KKyAgICA3NiBjaGFyYWN0ZXJzKS4KKworICAgIElmIGJpbmFyeSBpcyBGYWxzZSwgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUKKyAgICBjYW5vbmljYWwgZW1haWwgZW5kLW9mLWxpbmUgc2VxdWVuY2UgXFxyXFxuLiAgT3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBsZWZ0CisgICAgdmVyYmF0aW0gKHRoaXMgaXMgdGhlIGRlZmF1bHQpLgorCisgICAgRWFjaCBsaW5lIG9mIGVuY29kZWQgdGV4dCB3aWxsIGVuZCB3aXRoIGVvbCwgd2hpY2ggZGVmYXVsdHMgdG8gIlxcbiIuICBTZXQKKyAgICB0aGlzIHRvICJcclxuIiBpZiB5b3Ugd2lsbCBiZSB1c2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKKyAgICBpbiBhbiBlbWFpbC4KKyAgICAiIiIKKyAgICBpZiBub3QgczoKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGlmIG5vdCBiaW5hcnk6CisgICAgICAgIHMgPSBmaXhfZW9scyhzKQorCisgICAgZW5jdmVjID0gW10KKyAgICBtYXhfdW5lbmNvZGVkID0gbWF4bGluZWxlbiAqIDMgLy8gNAorICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzKSwgbWF4X3VuZW5jb2RlZCk6CisgICAgICAgICMgQkFXOiBzaG91bGQgZW5jb2RlKCkgaW5oZXJpdCBiMmFfYmFzZTY0KCkncyBkdWJpb3VzIGJlaGF2aW9yIGluCisgICAgICAgICMgYWRkaW5nIGEgbmV3bGluZSB0byB0aGUgZW5jb2RlZCBzdHJpbmc/CisgICAgICAgIGVuYyA9IHN0cihiMmFfYmFzZTY0KHNbaTppICsgbWF4X3VuZW5jb2RlZF0pKQorICAgICAgICBpZiBlbmMuZW5kc3dpdGgoTkwpIGFuZCBlb2wgIT0gTkw6CisgICAgICAgICAgICBlbmMgPSBlbmNbOi0xXSArIGVvbAorICAgICAgICBlbmN2ZWMuYXBwZW5kKGVuYykKKyAgICByZXR1cm4gRU1QVFlTVFJJTkcuam9pbihlbmN2ZWMpCisKKworIyBGb3IgY29udmVuaWVuY2UgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHcvIHN0YW5kYXJkIGJhc2U2NCBtb2R1bGUKK2JvZHlfZW5jb2RlID0gZW5jb2RlCitlbmNvZGVzdHJpbmcgPSBlbmNvZGUKKworCisMCitkZWYgZGVjb2RlKHMsIGNvbnZlcnRfZW9scz1GYWxzZSk6CisgICAgIiIiRGVjb2RlIGEgcmF3IGJhc2U2NCBzdHJpbmcsIHJldHVybmluZyBhIGJ5dGVzIG9iamVjdC4KKworICAgIElmIGNvbnZlcnRfZW9scyBpcyBzZXQgdG8gYSBzdHJpbmcgdmFsdWUsIGFsbCBjYW5vbmljYWwgZW1haWwgbGluZWZlZWRzLAorICAgIGUuZy4gIlxcclxcbiIsIGluIHRoZSBkZWNvZGVkIHRleHQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHZhbHVlIG9mCisgICAgY29udmVydF9lb2xzLiAgb3MubGluZXNlcCBpcyBhIGdvb2QgY2hvaWNlIGZvciBjb252ZXJ0X2VvbHMgaWYgeW91IGFyZQorICAgIGRlY29kaW5nIGEgdGV4dCBhdHRhY2htZW50LgorCisgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwYXJzZSBhIGZ1bGwgTUlNRSBoZWFkZXIgdmFsdWUgZW5jb2RlZCB3aXRoCisgICAgYmFzZTY0IChsaWtlID0/aXNvLTg4OTUtMT9iP2JtbG9JU0J1YVdnaD89KSAtLSBwbGVhc2UgdXNlIHRoZSBoaWdoCisgICAgbGV2ZWwgZW1haWwuSGVhZGVyIGNsYXNzIGZvciB0aGF0IGZ1bmN0aW9uYWxpdHkuCisgICAgIiIiCisgICAgaWYgbm90IHM6CisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWMgPSBhMmJfYmFzZTY0KHMpCisgICAgaWYgY29udmVydF9lb2xzOgorICAgICAgICByZXR1cm4gZGVjLnJlcGxhY2UoQ1JMRiwgY29udmVydF9lb2xzKQorICAgIHJldHVybiBkZWMKKworCisjIEZvciBjb252ZW5pZW5jZSBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdy8gc3RhbmRhcmQgYmFzZTY0IG1vZHVsZQorYm9keV9kZWNvZGUgPSBkZWNvZGUKK2RlY29kZXN0cmluZyA9IGRlY29kZQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL2NoYXJzZXQucHkgYi9MaWIvZW1haWwvY2hhcnNldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDM1ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL2NoYXJzZXQucHkKQEAgLTAsMCArMSwzODkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCZW4gR2VydHpmaWVsZCwgQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKK19fYWxsX18gPSBbCisgICAgJ0NoYXJzZXQnLAorICAgICdhZGRfYWxpYXMnLAorICAgICdhZGRfY2hhcnNldCcsCisgICAgJ2FkZF9jb2RlYycsCisgICAgXQorCitpbXBvcnQgZW1haWwuYmFzZTY0bWltZQoraW1wb3J0IGVtYWlsLnF1b3ByaW1pbWUKKworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCitmcm9tIGVtYWlsLmVuY29kZXJzIGltcG9ydCBlbmNvZGVfN29yOGJpdAorCisKKwwKKyMgRmxhZ3MgZm9yIHR5cGVzIG9mIGhlYWRlciBlbmNvZGluZ3MKK1FQICAgICAgICAgID0gMSAjIFF1b3RlZC1QcmludGFibGUKK0JBU0U2NCAgICAgID0gMiAjIEJhc2U2NAorU0hPUlRFU1QgICAgPSAzICMgdGhlIHNob3J0ZXIgb2YgUVAgYW5kIGJhc2U2NCwgYnV0IG9ubHkgZm9yIGhlYWRlcnMKKworIyBJbiAiPT9jaGFyc2V0P3E/aGVsbG9fd29ybGQ/PSIsIHRoZSA9PywgP3E/LCBhbmQgPz0gYWRkIHVwIHRvIDcKK01JU0NfTEVOID0gNworCitERUZBVUxUX0NIQVJTRVQgPSAndXMtYXNjaWknCisKKworDAorIyBEZWZhdWx0cworQ0hBUlNFVFMgPSB7CisgICAgIyBpbnB1dCAgICAgICAgaGVhZGVyIGVuYyAgYm9keSBlbmMgb3V0cHV0IGNvbnYKKyAgICAnaXNvLTg4NTktMSc6ICAoUVAsICAgICAgICBRUCwgICAgICBOb25lKSwKKyAgICAnaXNvLTg4NTktMic6ICAoUVAsICAgICAgICBRUCwgICAgICBOb25lKSwKKyAgICAnaXNvLTg4NTktMyc6ICAoUVAsICAgICAgICBRUCwgICAgICBOb25lKSwKKyAgICAnaXNvLTg4NTktNCc6ICAoUVAsICAgICAgICBRUCwgICAgICBOb25lKSwKKyAgICAjIGlzby04ODU5LTUgaXMgQ3lyaWxsaWMsIGFuZCBub3QgZXNwZWNpYWxseSB1c2VkCisgICAgIyBpc28tODg1OS02IGlzIEFyYWJpYywgYWxzbyBub3QgcGFydGljdWxhcmx5IHVzZWQKKyAgICAjIGlzby04ODU5LTcgaXMgR3JlZWssIFFQIHdpbGwgbm90IG1ha2UgaXQgcmVhZGFibGUKKyAgICAjIGlzby04ODU5LTggaXMgSGVicmV3LCBRUCB3aWxsIG5vdCBtYWtlIGl0IHJlYWRhYmxlCisgICAgJ2lzby04ODU5LTknOiAgKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTEwJzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgIyBpc28tODg1OS0xMSBpcyBUaGFpLCBRUCB3aWxsIG5vdCBtYWtlIGl0IHJlYWRhYmxlCisgICAgJ2lzby04ODU5LTEzJzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTE0JzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTE1JzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTE2JzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ3dpbmRvd3MtMTI1Mic6KFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ3Zpc2NpaSc6ICAgICAgKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ3VzLWFzY2lpJzogICAgKE5vbmUsICAgICAgTm9uZSwgICAgTm9uZSksCisgICAgJ2JpZzUnOiAgICAgICAgKEJBU0U2NCwgICAgQkFTRTY0LCAgTm9uZSksCisgICAgJ2diMjMxMic6ICAgICAgKEJBU0U2NCwgICAgQkFTRTY0LCAgTm9uZSksCisgICAgJ2V1Yy1qcCc6ICAgICAgKEJBU0U2NCwgICAgTm9uZSwgICAgJ2lzby0yMDIyLWpwJyksCisgICAgJ3NoaWZ0X2ppcyc6ICAgKEJBU0U2NCwgICAgTm9uZSwgICAgJ2lzby0yMDIyLWpwJyksCisgICAgJ2lzby0yMDIyLWpwJzogKEJBU0U2NCwgICAgTm9uZSwgICAgTm9uZSksCisgICAgJ2tvaTgtcic6ICAgICAgKEJBU0U2NCwgICAgQkFTRTY0LCAgTm9uZSksCisgICAgJ3V0Zi04JzogICAgICAgKFNIT1JURVNULCAgQkFTRTY0LCAndXRmLTgnKSwKKyAgICB9CisKKyMgQWxpYXNlcyBmb3Igb3RoZXIgY29tbW9ubHktdXNlZCBuYW1lcyBmb3IgY2hhcmFjdGVyIHNldHMuICBNYXAKKyMgdGhlbSB0byB0aGUgcmVhbCBvbmVzIHVzZWQgaW4gZW1haWwuCitBTElBU0VTID0geworICAgICdsYXRpbl8xJzogJ2lzby04ODU5LTEnLAorICAgICdsYXRpbi0xJzogJ2lzby04ODU5LTEnLAorICAgICdsYXRpbl8yJzogJ2lzby04ODU5LTInLAorICAgICdsYXRpbi0yJzogJ2lzby04ODU5LTInLAorICAgICdsYXRpbl8zJzogJ2lzby04ODU5LTMnLAorICAgICdsYXRpbi0zJzogJ2lzby04ODU5LTMnLAorICAgICdsYXRpbl80JzogJ2lzby04ODU5LTQnLAorICAgICdsYXRpbi00JzogJ2lzby04ODU5LTQnLAorICAgICdsYXRpbl81JzogJ2lzby04ODU5LTknLAorICAgICdsYXRpbi01JzogJ2lzby04ODU5LTknLAorICAgICdsYXRpbl82JzogJ2lzby04ODU5LTEwJywKKyAgICAnbGF0aW4tNic6ICdpc28tODg1OS0xMCcsCisgICAgJ2xhdGluXzcnOiAnaXNvLTg4NTktMTMnLAorICAgICdsYXRpbi03JzogJ2lzby04ODU5LTEzJywKKyAgICAnbGF0aW5fOCc6ICdpc28tODg1OS0xNCcsCisgICAgJ2xhdGluLTgnOiAnaXNvLTg4NTktMTQnLAorICAgICdsYXRpbl85JzogJ2lzby04ODU5LTE1JywKKyAgICAnbGF0aW4tOSc6ICdpc28tODg1OS0xNScsCisgICAgJ2xhdGluXzEwJzonaXNvLTg4NTktMTYnLAorICAgICdsYXRpbi0xMCc6J2lzby04ODU5LTE2JywKKyAgICAnY3A5NDknOiAgICdrc19jXzU2MDEtMTk4NycsCisgICAgJ2V1Y19qcCc6ICAnZXVjLWpwJywKKyAgICAnZXVjX2tyJzogICdldWMta3InLAorICAgICdhc2NpaSc6ICAgJ3VzLWFzY2lpJywKKyAgICB9CisKKworIyBNYXAgY2hhcnNldHMgdG8gdGhlaXIgVW5pY29kZSBjb2RlYyBzdHJpbmdzLgorQ09ERUNfTUFQID0geworICAgICdnYjIzMTInOiAgICAgICdldWNnYjIzMTJfY24nLAorICAgICdiaWc1JzogICAgICAgICdiaWc1X3R3JywKKyAgICAjIEhhY2s6IFdlIGRvbid0IHdhbnQgKmFueSogY29udmVyc2lvbiBmb3Igc3R1ZmYgbWFya2VkIHVzLWFzY2lpLCBhcyBhbGwKKyAgICAjIHNvcnRzIG9mIGdhcmJhZ2UgbWlnaHQgYmUgc2VudCB0byB1cyBpbiB0aGUgZ3Vpc2Ugb2YgNy1iaXQgdXMtYXNjaWkuCisgICAgIyBMZXQgdGhhdCBzdHVmZiBwYXNzIHRocm91Z2ggd2l0aG91dCBjb252ZXJzaW9uIHRvL2Zyb20gVW5pY29kZS4KKyAgICAndXMtYXNjaWknOiAgICBOb25lLAorICAgIH0KKworCisMCisjIENvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgZXh0ZW5kaW5nIHRoZSBhYm92ZSBtYXBwaW5ncworZGVmIGFkZF9jaGFyc2V0KGNoYXJzZXQsIGhlYWRlcl9lbmM9Tm9uZSwgYm9keV9lbmM9Tm9uZSwgb3V0cHV0X2NoYXJzZXQ9Tm9uZSk6CisgICAgIiIiQWRkIGNoYXJhY3RlciBzZXQgcHJvcGVydGllcyB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5LgorCisgICAgY2hhcnNldCBpcyB0aGUgaW5wdXQgY2hhcmFjdGVyIHNldCwgYW5kIG11c3QgYmUgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEKKyAgICBjaGFyYWN0ZXIgc2V0LgorCisgICAgT3B0aW9uYWwgaGVhZGVyX2VuYyBhbmQgYm9keV9lbmMgaXMgZWl0aGVyIENoYXJzZXQuUVAgZm9yCisgICAgcXVvdGVkLXByaW50YWJsZSwgQ2hhcnNldC5CQVNFNjQgZm9yIGJhc2U2NCBlbmNvZGluZywgQ2hhcnNldC5TSE9SVEVTVCBmb3IKKyAgICB0aGUgc2hvcnRlc3Qgb2YgcXAgb3IgYmFzZTY0IGVuY29kaW5nLCBvciBOb25lIGZvciBubyBlbmNvZGluZy4gIFNIT1JURVNUCisgICAgaXMgb25seSB2YWxpZCBmb3IgaGVhZGVyX2VuYy4gIEl0IGRlc2NyaWJlcyBob3cgbWVzc2FnZSBoZWFkZXJzIGFuZAorICAgIG1lc3NhZ2UgYm9kaWVzIGluIHRoZSBpbnB1dCBjaGFyc2V0IGFyZSB0byBiZSBlbmNvZGVkLiAgRGVmYXVsdCBpcyBubworICAgIGVuY29kaW5nLgorCisgICAgT3B0aW9uYWwgb3V0cHV0X2NoYXJzZXQgaXMgdGhlIGNoYXJhY3RlciBzZXQgdGhhdCB0aGUgb3V0cHV0IHNob3VsZCBiZQorICAgIGluLiAgQ29udmVyc2lvbnMgd2lsbCBwcm9jZWVkIGZyb20gaW5wdXQgY2hhcnNldCwgdG8gVW5pY29kZSwgdG8gdGhlCisgICAgb3V0cHV0IGNoYXJzZXQgd2hlbiB0aGUgbWV0aG9kIENoYXJzZXQuY29udmVydCgpIGlzIGNhbGxlZC4gIFRoZSBkZWZhdWx0CisgICAgaXMgdG8gb3V0cHV0IGluIHRoZSBzYW1lIGNoYXJhY3RlciBzZXQgYXMgdGhlIGlucHV0LgorCisgICAgQm90aCBpbnB1dF9jaGFyc2V0IGFuZCBvdXRwdXRfY2hhcnNldCBtdXN0IGhhdmUgVW5pY29kZSBjb2RlYyBlbnRyaWVzIGluCisgICAgdGhlIG1vZHVsZSdzIGNoYXJzZXQtdG8tY29kZWMgbWFwcGluZzsgdXNlIGFkZF9jb2RlYyhjaGFyc2V0LCBjb2RlY25hbWUpCisgICAgdG8gYWRkIGNvZGVjcyB0aGUgbW9kdWxlIGRvZXMgbm90IGtub3cgYWJvdXQuICBTZWUgdGhlIGNvZGVjcyBtb2R1bGUncworICAgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgIiIiCisgICAgaWYgYm9keV9lbmMgPT0gU0hPUlRFU1Q6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1NIT1JURVNUIG5vdCBhbGxvd2VkIGZvciBib2R5X2VuYycpCisgICAgQ0hBUlNFVFNbY2hhcnNldF0gPSAoaGVhZGVyX2VuYywgYm9keV9lbmMsIG91dHB1dF9jaGFyc2V0KQorCisKK2RlZiBhZGRfYWxpYXMoYWxpYXMsIGNhbm9uaWNhbCk6CisgICAgIiIiQWRkIGEgY2hhcmFjdGVyIHNldCBhbGlhcy4KKworICAgIGFsaWFzIGlzIHRoZSBhbGlhcyBuYW1lLCBlLmcuIGxhdGluLTEKKyAgICBjYW5vbmljYWwgaXMgdGhlIGNoYXJhY3RlciBzZXQncyBjYW5vbmljYWwgbmFtZSwgZS5nLiBpc28tODg1OS0xCisgICAgIiIiCisgICAgQUxJQVNFU1thbGlhc10gPSBjYW5vbmljYWwKKworCitkZWYgYWRkX2NvZGVjKGNoYXJzZXQsIGNvZGVjbmFtZSk6CisgICAgIiIiQWRkIGEgY29kZWMgdGhhdCBtYXAgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gY2hhcnNldCB0by9mcm9tIFVuaWNvZGUuCisKKyAgICBjaGFyc2V0IGlzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIGNoYXJhY3RlciBzZXQuICBjb2RlY25hbWUgaXMgdGhlIG5hbWUKKyAgICBvZiBhIFB5dGhvbiBjb2RlYywgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHVuaWNvZGUoKQorICAgIGJ1aWx0LWluLCBvciB0byB0aGUgZW5jb2RlKCkgbWV0aG9kIG9mIGEgVW5pY29kZSBzdHJpbmcuCisgICAgIiIiCisgICAgQ09ERUNfTUFQW2NoYXJzZXRdID0gY29kZWNuYW1lCisKKworDAorY2xhc3MgQ2hhcnNldDoKKyAgICAiIiJNYXAgY2hhcmFjdGVyIHNldHMgdG8gdGhlaXIgZW1haWwgcHJvcGVydGllcy4KKworICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVpcmVtZW50cyBpbXBvc2VkIG9uIGVtYWlsCisgICAgZm9yIGEgc3BlY2lmaWMgY2hhcmFjdGVyIHNldC4gIEl0IGFsc28gcHJvdmlkZXMgY29udmVuaWVuY2Ugcm91dGluZXMgZm9yCisgICAgY29udmVydGluZyBiZXR3ZWVuIGNoYXJhY3RlciBzZXRzLCBnaXZlbiB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZQorICAgIGFwcGxpY2FibGUgY29kZWNzLiAgR2l2ZW4gYSBjaGFyYWN0ZXIgc2V0LCBpdCB3aWxsIGRvIGl0cyBiZXN0IHRvIHByb3ZpZGUKKyAgICBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoYXQgY2hhcmFjdGVyIHNldCBpbiBhbiBlbWFpbCBpbiBhbgorICAgIFJGQy1jb21wbGlhbnQgd2F5LgorCisgICAgQ2VydGFpbiBjaGFyYWN0ZXIgc2V0cyBtdXN0IGJlIGVuY29kZWQgd2l0aCBxdW90ZWQtcHJpbnRhYmxlIG9yIGJhc2U2NAorICAgIHdoZW4gdXNlZCBpbiBlbWFpbCBoZWFkZXJzIG9yIGJvZGllcy4gIENlcnRhaW4gY2hhcmFjdGVyIHNldHMgbXVzdCBiZQorICAgIGNvbnZlcnRlZCBvdXRyaWdodCwgYW5kIGFyZSBub3QgYWxsb3dlZCBpbiBlbWFpbC4gIEluc3RhbmNlcyBvZiB0aGlzCisgICAgbW9kdWxlIGV4cG9zZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgY2hhcmFjdGVyIHNldDoKKworICAgIGlucHV0X2NoYXJzZXQ6IFRoZSBpbml0aWFsIGNoYXJhY3RlciBzZXQgc3BlY2lmaWVkLiAgQ29tbW9uIGFsaWFzZXMKKyAgICAgICAgICAgICAgICAgICBhcmUgY29udmVydGVkIHRvIHRoZWlyIGBvZmZpY2lhbCcgZW1haWwgbmFtZXMgKGUuZy4gbGF0aW5fMQorICAgICAgICAgICAgICAgICAgIGlzIGNvbnZlcnRlZCB0byBpc28tODg1OS0xKS4gIERlZmF1bHRzIHRvIDctYml0IHVzLWFzY2lpLgorCisgICAgaGVhZGVyX2VuY29kaW5nOiBJZiB0aGUgY2hhcmFjdGVyIHNldCBtdXN0IGJlIGVuY29kZWQgYmVmb3JlIGl0IGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBhbiBlbWFpbCBoZWFkZXIsIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICBDaGFyc2V0LlFQIChmb3IgcXVvdGVkLXByaW50YWJsZSksIENoYXJzZXQuQkFTRTY0IChmb3IKKyAgICAgICAgICAgICAgICAgICAgIGJhc2U2NCBlbmNvZGluZyksIG9yIENoYXJzZXQuU0hPUlRFU1QgZm9yIHRoZSBzaG9ydGVzdCBvZgorICAgICAgICAgICAgICAgICAgICAgUVAgb3IgQkFTRTY0IGVuY29kaW5nLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIE5vbmUuCisKKyAgICBib2R5X2VuY29kaW5nOiBTYW1lIGFzIGhlYWRlcl9lbmNvZGluZywgYnV0IGRlc2NyaWJlcyB0aGUgZW5jb2RpbmcgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgIG1haWwgbWVzc2FnZSdzIGJvZHksIHdoaWNoIGluZGVlZCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlCisgICAgICAgICAgICAgICAgICAgaGVhZGVyIGVuY29kaW5nLiAgQ2hhcnNldC5TSE9SVEVTVCBpcyBub3QgYWxsb3dlZCBmb3IKKyAgICAgICAgICAgICAgICAgICBib2R5X2VuY29kaW5nLgorCisgICAgb3V0cHV0X2NoYXJzZXQ6IFNvbWUgY2hhcmFjdGVyIHNldHMgbXVzdCBiZSBjb252ZXJ0ZWQgYmVmb3JlIHRoZSBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBlbWFpbCBoZWFkZXJzIG9yIGJvZGllcy4gIElmIHRoZSBpbnB1dF9jaGFyc2V0IGlzCisgICAgICAgICAgICAgICAgICAgIG9uZSBvZiB0aGVtLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGNvbnRhaW4gdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgb3V0cHV0IHdpbGwgYmUgY29udmVydGVkIHRvLiAgT3RoZXJ3aXNlLCBpdCB3aWxsCisgICAgICAgICAgICAgICAgICAgIGJlIE5vbmUuCisKKyAgICBpbnB1dF9jb2RlYzogVGhlIG5hbWUgb2YgdGhlIFB5dGhvbiBjb2RlYyB1c2VkIHRvIGNvbnZlcnQgdGhlCisgICAgICAgICAgICAgICAgIGlucHV0X2NoYXJzZXQgdG8gVW5pY29kZS4gIElmIG5vIGNvbnZlcnNpb24gY29kZWMgaXMKKyAgICAgICAgICAgICAgICAgbmVjZXNzYXJ5LCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIE5vbmUuCisKKyAgICBvdXRwdXRfY29kZWM6IFRoZSBuYW1lIG9mIHRoZSBQeXRob24gY29kZWMgdXNlZCB0byBjb252ZXJ0IFVuaWNvZGUKKyAgICAgICAgICAgICAgICAgIHRvIHRoZSBvdXRwdXRfY2hhcnNldC4gIElmIG5vIGNvbnZlcnNpb24gY29kZWMgaXMgbmVjZXNzYXJ5LAorICAgICAgICAgICAgICAgICAgdGhpcyBhdHRyaWJ1dGUgd2lsbCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBpbnB1dF9jb2RlYy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5wdXRfY2hhcnNldD1ERUZBVUxUX0NIQVJTRVQpOgorICAgICAgICAjIFJGQyAyMDQ2LCAkNC4xLjIgc2F5cyBjaGFyc2V0cyBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlLiAgV2UgY29lcmNlIHRvCisgICAgICAgICMgdW5pY29kZSBiZWNhdXNlIGl0cyAubG93ZXIoKSBpcyBsb2NhbGUgaW5zZW5zaXRpdmUuICBJZiB0aGUgYXJndW1lbnQKKyAgICAgICAgIyBpcyBhbHJlYWR5IGEgdW5pY29kZSwgd2UgbGVhdmUgaXQgYXQgdGhhdCwgYnV0IGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAjIGNoYXJzZXQgaXMgQVNDSUksIGFzIHRoZSBzdGFuZGFyZCAoUkZDIFhYWCkgcmVxdWlyZXMuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5wdXRfY2hhcnNldCwgc3RyKToKKyAgICAgICAgICAgICAgICBpbnB1dF9jaGFyc2V0LmVuY29kZSgnYXNjaWknKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbnB1dF9jaGFyc2V0ID0gc3RyKGlucHV0X2NoYXJzZXQsICdhc2NpaScpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBlcnJvcnMuQ2hhcnNldEVycm9yKGlucHV0X2NoYXJzZXQpCisgICAgICAgIGlucHV0X2NoYXJzZXQgPSBpbnB1dF9jaGFyc2V0Lmxvd2VyKCkKKyAgICAgICAgIyBTZXQgdGhlIGlucHV0IGNoYXJzZXQgYWZ0ZXIgZmlsdGVyaW5nIHRocm91Z2ggdGhlIGFsaWFzZXMKKyAgICAgICAgc2VsZi5pbnB1dF9jaGFyc2V0ID0gQUxJQVNFUy5nZXQoaW5wdXRfY2hhcnNldCwgaW5wdXRfY2hhcnNldCkKKyAgICAgICAgIyBXZSBjYW4gdHJ5IHRvIGd1ZXNzIHdoaWNoIGVuY29kaW5nIGFuZCBjb252ZXJzaW9uIHRvIHVzZSBieSB0aGUKKyAgICAgICAgIyBjaGFyc2V0X21hcCBkaWN0aW9uYXJ5LiAgVHJ5IHRoYXQgZmlyc3QsIGJ1dCBsZXQgdGhlIHVzZXIgb3ZlcnJpZGUKKyAgICAgICAgIyBpdC4KKyAgICAgICAgaGVuYywgYmVuYywgY29udiA9IENIQVJTRVRTLmdldChzZWxmLmlucHV0X2NoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNIT1JURVNULCBCQVNFNjQsIE5vbmUpKQorICAgICAgICBpZiBub3QgY29udjoKKyAgICAgICAgICAgIGNvbnYgPSBzZWxmLmlucHV0X2NoYXJzZXQKKyAgICAgICAgIyBTZXQgdGhlIGF0dHJpYnV0ZXMsIGFsbG93aW5nIHRoZSBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCisgICAgICAgIHNlbGYuaGVhZGVyX2VuY29kaW5nID0gaGVuYworICAgICAgICBzZWxmLmJvZHlfZW5jb2RpbmcgPSBiZW5jCisgICAgICAgIHNlbGYub3V0cHV0X2NoYXJzZXQgPSBBTElBU0VTLmdldChjb252LCBjb252KQorICAgICAgICAjIE5vdyBzZXQgdGhlIGNvZGVjcy4gIElmIG9uZSBpc24ndCBkZWZpbmVkIGZvciBpbnB1dF9jaGFyc2V0LAorICAgICAgICAjIGd1ZXNzIGFuZCB0cnkgYSBVbmljb2RlIGNvZGVjIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBpbnB1dF9jb2RlYy4KKyAgICAgICAgc2VsZi5pbnB1dF9jb2RlYyA9IENPREVDX01BUC5nZXQoc2VsZi5pbnB1dF9jaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlucHV0X2NoYXJzZXQpCisgICAgICAgIHNlbGYub3V0cHV0X2NvZGVjID0gQ09ERUNfTUFQLmdldChzZWxmLm91dHB1dF9jaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXRfY2hhcnNldCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnB1dF9jaGFyc2V0Lmxvd2VyKCkKKworICAgIF9fcmVwcl9fID0gX19zdHJfXworCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZikgPT0gc3RyKG90aGVyKS5sb3dlcigpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKKworICAgIGRlZiBnZXRfYm9keV9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nIHVzZWQgZm9yIGJvZHkgZW5jb2RpbmcuCisKKyAgICAgICAgVGhpcyBpcyBlaXRoZXIgdGhlIHN0cmluZyBgcXVvdGVkLXByaW50YWJsZScgb3IgYGJhc2U2NCcgZGVwZW5kaW5nIG9uCisgICAgICAgIHRoZSBlbmNvZGluZyB1c2VkLCBvciBpdCBpcyBhIGZ1bmN0aW9uIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBjYWxsCisgICAgICAgIHRoZSBmdW5jdGlvbiB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LCB0aGUgTWVzc2FnZSBvYmplY3QgYmVpbmcKKyAgICAgICAgZW5jb2RlZC4gIFRoZSBmdW5jdGlvbiBzaG91bGQgdGhlbiBzZXQgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcKKyAgICAgICAgaGVhZGVyIGl0c2VsZiB0byB3aGF0ZXZlciBpcyBhcHByb3ByaWF0ZS4KKworICAgICAgICBSZXR1cm5zICJxdW90ZWQtcHJpbnRhYmxlIiBpZiBzZWxmLmJvZHlfZW5jb2RpbmcgaXMgUVAuCisgICAgICAgIFJldHVybnMgImJhc2U2NCIgaWYgc2VsZi5ib2R5X2VuY29kaW5nIGlzIEJBU0U2NC4KKyAgICAgICAgUmV0dXJucyAiN2JpdCIgb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IHNlbGYuYm9keV9lbmNvZGluZyAhPSBTSE9SVEVTVAorICAgICAgICBpZiBzZWxmLmJvZHlfZW5jb2RpbmcgPT0gUVA6CisgICAgICAgICAgICByZXR1cm4gJ3F1b3RlZC1wcmludGFibGUnCisgICAgICAgIGVsaWYgc2VsZi5ib2R5X2VuY29kaW5nID09IEJBU0U2NDoKKyAgICAgICAgICAgIHJldHVybiAnYmFzZTY0JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGVuY29kZV83b3I4Yml0CisKKyAgICBkZWYgY29udmVydChzZWxmLCBzKToKKyAgICAgICAgIiIiQ29udmVydCBhIHN0cmluZyBmcm9tIHRoZSBpbnB1dF9jb2RlYyB0byB0aGUgb3V0cHV0X2NvZGVjLiIiIgorICAgICAgICBpZiBzZWxmLmlucHV0X2NvZGVjICE9IHNlbGYub3V0cHV0X2NvZGVjOgorICAgICAgICAgICAgcmF3Ynl0ZXMgPSBieXRlcyhvcmQoYykgZm9yIGMgaW4gcykKKyAgICAgICAgICAgIGRlY29kZWQgPSByYXdieXRlcy5kZWNvZGUoc2VsZi5pbnB1dF9jb2RlYykKKyAgICAgICAgICAgIGVuY29kZWQgPSBkZWNvZGVkLmVuY29kZShzZWxmLm91dHB1dF9jb2RlYykKKyAgICAgICAgICAgIHJldHVybiBzdHIoZW5jb2RlZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgdG9fc3BsaXR0YWJsZShzZWxmLCBzKToKKyAgICAgICAgIiIiQ29udmVydCBhIHBvc3NpYmx5IG11bHRpYnl0ZSBzdHJpbmcgdG8gYSBzYWZlbHkgc3BsaXR0YWJsZSBmb3JtYXQuCisKKyAgICAgICAgVXNlcyB0aGUgaW5wdXRfY29kZWMgdG8gdHJ5IGFuZCBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gVW5pY29kZSwgc28gaXQKKyAgICAgICAgY2FuIGJlIHNhZmVseSBzcGxpdCBvbiBjaGFyYWN0ZXIgYm91bmRhcmllcyAoZXZlbiBmb3IgbXVsdGlieXRlCisgICAgICAgIGNoYXJhY3RlcnMpLgorCisgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyBhcy1pcyBpZiBpdCBpc24ndCBrbm93biBob3cgdG8gY29udmVydCBpdCB0bworICAgICAgICBVbmljb2RlIHdpdGggdGhlIGlucHV0X2NoYXJzZXQuCisKKyAgICAgICAgQ2hhcmFjdGVycyB0aGF0IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSB3aWxsIGJlIHJlcGxhY2VkCisgICAgICAgIHdpdGggdGhlIFVuaWNvZGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIFUrRkZGRC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uocywgc3RyKSBvciBzZWxmLmlucHV0X2NvZGVjIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc3RyKHMsIHNlbGYuaW5wdXRfY29kZWMsICdyZXBsYWNlJykKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgIyBJbnB1dCBjb2RlYyBub3QgaW5zdGFsbGVkIG9uIHN5c3RlbSwgc28gcmV0dXJuIHRoZSBvcmlnaW5hbAorICAgICAgICAgICAgIyBzdHJpbmcgdW5jaGFuZ2VkLgorICAgICAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBmcm9tX3NwbGl0dGFibGUoc2VsZiwgdXN0ciwgdG9fb3V0cHV0PVRydWUpOgorICAgICAgICAiIiJDb252ZXJ0IGEgc3BsaXR0YWJsZSBzdHJpbmcgYmFjayBpbnRvIGFuIGVuY29kZWQgc3RyaW5nLgorCisgICAgICAgIFVzZXMgdGhlIHByb3BlciBjb2RlYyB0byB0cnkgYW5kIGNvbnZlcnQgdGhlIHN0cmluZyBmcm9tIFVuaWNvZGUgYmFjaworICAgICAgICBpbnRvIGFuIGVuY29kZWQgZm9ybWF0LiAgUmV0dXJuIHRoZSBzdHJpbmcgYXMtaXMgaWYgaXQgaXMgbm90IFVuaWNvZGUsCisgICAgICAgIG9yIGlmIGl0IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgZnJvbSBVbmljb2RlLgorCisgICAgICAgIENoYXJhY3RlcnMgdGhhdCBjb3VsZCBub3QgYmUgY29udmVydGVkIGZyb20gVW5pY29kZSB3aWxsIGJlIHJlcGxhY2VkCisgICAgICAgIHdpdGggYW4gYXBwcm9wcmlhdGUgY2hhcmFjdGVyICh1c3VhbGx5ICc/JykuCisKKyAgICAgICAgSWYgdG9fb3V0cHV0IGlzIFRydWUgKHRoZSBkZWZhdWx0KSwgdXNlcyBvdXRwdXRfY29kZWMgdG8gY29udmVydCB0byBhbgorICAgICAgICBlbmNvZGVkIGZvcm1hdC4gIElmIHRvX291dHB1dCBpcyBGYWxzZSwgdXNlcyBpbnB1dF9jb2RlYy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHRvX291dHB1dDoKKyAgICAgICAgICAgIGNvZGVjID0gc2VsZi5vdXRwdXRfY29kZWMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvZGVjID0gc2VsZi5pbnB1dF9jb2RlYworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh1c3RyLCBzdHIpIG9yIGNvZGVjIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdXN0cgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc3RyKHVzdHIuZW5jb2RlKGNvZGVjLCAncmVwbGFjZScpKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAjIE91dHB1dCBjb2RlYyBub3QgaW5zdGFsbGVkCisgICAgICAgICAgICByZXR1cm4gdXN0cgorCisgICAgZGVmIGdldF9vdXRwdXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvdXRwdXQgY2hhcmFjdGVyIHNldC4KKworICAgICAgICBUaGlzIGlzIHNlbGYub3V0cHV0X2NoYXJzZXQgaWYgdGhhdCBpcyBub3QgTm9uZSwgb3RoZXJ3aXNlIGl0IGlzCisgICAgICAgIHNlbGYuaW5wdXRfY2hhcnNldC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLm91dHB1dF9jaGFyc2V0IG9yIHNlbGYuaW5wdXRfY2hhcnNldAorCisgICAgZGVmIGVuY29kZWRfaGVhZGVyX2xlbihzZWxmLCBzKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGVuY29kZWQgaGVhZGVyIHN0cmluZy4iIiIKKyAgICAgICAgY3NldCA9IHNlbGYuZ2V0X291dHB1dF9jaGFyc2V0KCkKKyAgICAgICAgIyBUaGUgbGVuKHMpIG9mIGEgN2JpdCBlbmNvZGluZyBpcyBsZW4ocykKKyAgICAgICAgaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gQkFTRTY0OgorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NG1pbWUuYmFzZTY0X2xlbihzKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCisgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gUVA6CisgICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihzKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCisgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gU0hPUlRFU1Q6CisgICAgICAgICAgICBsZW5iNjQgPSBlbWFpbC5iYXNlNjRtaW1lLmJhc2U2NF9sZW4ocykKKyAgICAgICAgICAgIGxlbnFwID0gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihzKQorICAgICAgICAgICAgcmV0dXJuIG1pbihsZW5iNjQsIGxlbnFwKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbGVuKHMpCisKKyAgICBkZWYgaGVhZGVyX2VuY29kZShzZWxmLCBzdHJpbmcpOgorICAgICAgICAiIiJIZWFkZXItZW5jb2RlIGEgc3RyaW5nIGJ5IGNvbnZlcnRpbmcgaXQgZmlyc3QgdG8gYnl0ZXMuCisKKyAgICAgICAgOnBhcmFtIHN0cmluZzogQSB1bmljb2RlIHN0cmluZyBmb3IgdGhlIGhlYWRlci4gIFRoaXMgbXVzdCBiZQorICAgICAgICBlbmNvZGFibGUgdG8gYnl0ZXMgdXNpbmcgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIHNldCdzIGBvdXRwdXRfY29kZWNgLgorCisgICAgICAgIFRoZSB0eXBlIG9mIGVuY29kaW5nIChiYXNlNjQgb3IgcXVvdGVkLXByaW50YWJsZSkgd2lsbCBiZSBiYXNlZCBvbgorICAgICAgICB0aGlzIGNoYXJzZXQncyBgaGVhZGVyX2VuY29kaW5nYC4KKyAgICAgICAgIiIiCisgICAgICAgIGNvZGVjID0gc2VsZi5vdXRwdXRfY29kZWMgb3IgJ3VzLWFzY2lpJworICAgICAgICBjaGFyc2V0ID0gc2VsZi5nZXRfb3V0cHV0X2NoYXJzZXQoKQorICAgICAgICBoZWFkZXJfYnl0ZXMgPSBzdHJpbmcuZW5jb2RlKGNvZGVjKQorICAgICAgICAjIDdiaXQvOGJpdCBlbmNvZGluZ3MgcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkIChtb2R1bG8gY29udmVyc2lvbnMpCisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IEJBU0U2NDoKKyAgICAgICAgICAgIGVuY29kZXIgPSBlbWFpbC5iYXNlNjRtaW1lLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBRUDoKKyAgICAgICAgICAgIGVuY29kZXIgPSBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBTSE9SVEVTVDoKKyAgICAgICAgICAgIGxlbmI2NCA9IGVtYWlsLmJhc2U2NG1pbWUuYmFzZTY0X2xlbihoZWFkZXJfYnl0ZXMpCisgICAgICAgICAgICBsZW5xcCA9IGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4oaGVhZGVyX2J5dGVzKQorICAgICAgICAgICAgaWYgbGVuYjY0IDwgbGVucXA6CisgICAgICAgICAgICAgICAgZW5jb2RlciA9IGVtYWlsLmJhc2U2NG1pbWUuaGVhZGVyX2VuY29kZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbmNvZGVyID0gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfZW5jb2RlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nCisgICAgICAgIHJldHVybiBlbmNvZGVyKGhlYWRlcl9ieXRlcywgY29kZWMpCisKKyAgICBkZWYgYm9keV9lbmNvZGUoc2VsZiwgcywgY29udmVydD1UcnVlKToKKyAgICAgICAgIiIiQm9keS1lbmNvZGUgYSBzdHJpbmcgYW5kIGNvbnZlcnQgaXQgdG8gb3V0cHV0X2NoYXJzZXQuCisKKyAgICAgICAgSWYgY29udmVydCBpcyBUcnVlICh0aGUgZGVmYXVsdCksIHRoZSBzdHJpbmcgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbQorICAgICAgICB0aGUgaW5wdXQgY2hhcnNldCB0byBvdXRwdXQgY2hhcnNldCBhdXRvbWF0aWNhbGx5LiAgVW5saWtlCisgICAgICAgIGhlYWRlcl9lbmNvZGUoKSwgdGhlcmUgYXJlIG5vIGlzc3VlcyB3aXRoIGJ5dGUgYm91bmRhcmllcyBhbmQKKyAgICAgICAgbXVsdGlieXRlIGNoYXJzZXRzIGluIGVtYWlsIGJvZGllcywgc28gdGhpcyBpcyB1c3VhbGx5IHByZXR0eSBzYWZlLgorCisgICAgICAgIFRoZSB0eXBlIG9mIGVuY29kaW5nIChiYXNlNjQgb3IgcXVvdGVkLXByaW50YWJsZSkgd2lsbCBiZSBiYXNlZCBvbgorICAgICAgICBzZWxmLmJvZHlfZW5jb2RpbmcuCisgICAgICAgICIiIgorICAgICAgICBpZiBjb252ZXJ0OgorICAgICAgICAgICAgcyA9IHNlbGYuY29udmVydChzKQorICAgICAgICAjIDdiaXQvOGJpdCBlbmNvZGluZ3MgcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkIChtb2R1bGUgY29udmVyc2lvbnMpCisgICAgICAgIGlmIHNlbGYuYm9keV9lbmNvZGluZyBpcyBCQVNFNjQ6CisgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0bWltZS5ib2R5X2VuY29kZShzKQorICAgICAgICBlbGlmIHNlbGYuYm9keV9lbmNvZGluZyBpcyBRUDoKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmltaW1lLmJvZHlfZW5jb2RlKHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL2VuY29kZXJzLnB5IGIvTGliL2VtYWlsL2VuY29kZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDE2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvZW5jb2RlcnMucHkKQEAgLTAsMCArMSw4OCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJFbmNvZGluZ3MgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLiIiIgorCitfX2FsbF9fID0gWworICAgICdlbmNvZGVfN29yOGJpdCcsCisgICAgJ2VuY29kZV9iYXNlNjQnLAorICAgICdlbmNvZGVfbm9vcCcsCisgICAgJ2VuY29kZV9xdW9wcmknLAorICAgIF0KKworaW1wb3J0IGJhc2U2NAorCitmcm9tIHF1b3ByaSBpbXBvcnQgZW5jb2Rlc3RyaW5nIGFzIF9lbmNvZGVzdHJpbmcKKworCisMCitkZWYgX3FlbmNvZGUocyk6CisgICAgZW5jID0gX2VuY29kZXN0cmluZyhzLCBxdW90ZXRhYnM9VHJ1ZSkKKyAgICAjIE11c3QgZW5jb2RlIHNwYWNlcywgd2hpY2ggcXVvcHJpLmVuY29kZXN0cmluZygpIGRvZXNuJ3QgZG8KKyAgICByZXR1cm4gZW5jLnJlcGxhY2UoJyAnLCAnPTIwJykKKworCitkZWYgX2JlbmNvZGUocyk6CisgICAgIyBXZSBjYW4ndCBxdWl0ZSB1c2UgYmFzZTY0LmVuY29kZXN0cmluZygpIHNpbmNlIGl0IHRhY2tzIG9uIGEgImNvdXJ0ZXN5CisgICAgIyBuZXdsaW5lIi4gIEJsZWNoIQorICAgIGlmIG5vdCBzOgorICAgICAgICByZXR1cm4gcworICAgIGhhc25ld2xpbmUgPSAoc1stMV0gPT0gJ1xuJykKKyAgICB2YWx1ZSA9IGJhc2U2NC5lbmNvZGVzdHJpbmcocykKKyAgICBpZiBub3QgaGFzbmV3bGluZSBhbmQgdmFsdWVbLTFdID09ICdcbic6CisgICAgICAgIHJldHVybiB2YWx1ZVs6LTFdCisgICAgcmV0dXJuIHZhbHVlCisKKworDAorZGVmIGVuY29kZV9iYXNlNjQobXNnKToKKyAgICAiIiJFbmNvZGUgdGhlIG1lc3NhZ2UncyBwYXlsb2FkIGluIEJhc2U2NC4KKworICAgIEFsc28sIGFkZCBhbiBhcHByb3ByaWF0ZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlci4KKyAgICAiIiIKKyAgICBvcmlnID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICBlbmNkYXRhID0gX2JlbmNvZGUob3JpZykKKyAgICBtc2cuc2V0X3BheWxvYWQoZW5jZGF0YSkKKyAgICBtc2dbJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnXSA9ICdiYXNlNjQnCisKKworDAorZGVmIGVuY29kZV9xdW9wcmkobXNnKToKKyAgICAiIiJFbmNvZGUgdGhlIG1lc3NhZ2UncyBwYXlsb2FkIGluIHF1b3RlZC1wcmludGFibGUuCisKKyAgICBBbHNvLCBhZGQgYW4gYXBwcm9wcmlhdGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIuCisgICAgIiIiCisgICAgb3JpZyA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgZW5jZGF0YSA9IF9xZW5jb2RlKG9yaWcpCisgICAgbXNnLnNldF9wYXlsb2FkKGVuY2RhdGEpCisgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAncXVvdGVkLXByaW50YWJsZScKKworCisMCitkZWYgZW5jb2RlXzdvcjhiaXQobXNnKToKKyAgICAiIiJTZXQgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyIHRvIDdiaXQgb3IgOGJpdC4iIiIKKyAgICBvcmlnID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICBpZiBvcmlnIGlzIE5vbmU6CisgICAgICAgICMgVGhlcmUncyBubyBwYXlsb2FkLiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdlIHVzZSA3Yml0CisgICAgICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJzdiaXQnCisgICAgICAgIHJldHVybgorICAgICMgV2UgcGxheSBhIHRyaWNrIHRvIG1ha2UgdGhpcyBnbyBmYXN0LiAgSWYgZW5jb2RpbmcgdG8gQVNDSUkgc3VjY2VlZHMsIHdlCisgICAgIyBrbm93IHRoZSBkYXRhIG11c3QgYmUgN2JpdCwgb3RoZXJ3aXNlIHRyZWF0IGl0IGFzIDhiaXQuCisgICAgdHJ5OgorICAgICAgICBvcmlnLmVuY29kZSgnYXNjaWknKQorICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICMgaXNvLTIwMjItKiBpcyBub24tQVNDSUkgYnV0IHN0aWxsIDctYml0CisgICAgICAgIGNoYXJzZXQgPSBtc2cuZ2V0X2NoYXJzZXQoKQorICAgICAgICBvdXRwdXRfY3NldCA9IGNoYXJzZXQgYW5kIGNoYXJzZXQub3V0cHV0X2NoYXJzZXQKKyAgICAgICAgaWYgb3V0cHV0X2NzZXQgYW5kIG91dHB1dF9jc2V0Lmxvd2VyKCkuc3RhcnRzd2l0aCgnaXNvLTIyMDItJyk6CisgICAgICAgICAgICBtc2dbJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnXSA9ICc3Yml0JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAnOGJpdCcKKyAgICBlbHNlOgorICAgICAgICBtc2dbJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnXSA9ICc3Yml0JworCisKKwwKK2RlZiBlbmNvZGVfbm9vcChtc2cpOgorICAgICIiIkRvIG5vdGhpbmcuIiIiCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvZXJyb3JzLnB5IGIvTGliL2VtYWlsL2Vycm9ycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTJhNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL2Vycm9ycy5weQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiImVtYWlsIHBhY2thZ2UgZXhjZXB0aW9uIGNsYXNzZXMuIiIiCisKKworDAorY2xhc3MgTWVzc2FnZUVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgZXJyb3JzIGluIHRoZSBlbWFpbCBwYWNrYWdlLiIiIgorCisKK2NsYXNzIE1lc3NhZ2VQYXJzZUVycm9yKE1lc3NhZ2VFcnJvcik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgbWVzc2FnZSBwYXJzaW5nIGVycm9ycy4iIiIKKworCitjbGFzcyBIZWFkZXJQYXJzZUVycm9yKE1lc3NhZ2VQYXJzZUVycm9yKToKKyAgICAiIiJFcnJvciB3aGlsZSBwYXJzaW5nIGhlYWRlcnMuIiIiCisKKworY2xhc3MgQm91bmRhcnlFcnJvcihNZXNzYWdlUGFyc2VFcnJvcik6CisgICAgIiIiQ291bGRuJ3QgZmluZCB0ZXJtaW5hdGluZyBib3VuZGFyeS4iIiIKKworCitjbGFzcyBNdWx0aXBhcnRDb252ZXJzaW9uRXJyb3IoTWVzc2FnZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICIiIkNvbnZlcnNpb24gdG8gYSBtdWx0aXBhcnQgaXMgcHJvaGliaXRlZC4iIiIKKworCitjbGFzcyBDaGFyc2V0RXJyb3IoTWVzc2FnZUVycm9yKToKKyAgICAiIiJBbiBpbGxlZ2FsIGNoYXJzZXQgd2FzIGdpdmVuLiIiIgorCisKKwwKKyMgVGhlc2UgYXJlIHBhcnNpbmcgZGVmZWN0cyB3aGljaCB0aGUgcGFyc2VyIHdhcyBhYmxlIHRvIHdvcmsgYXJvdW5kLgorY2xhc3MgTWVzc2FnZURlZmVjdDoKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBhIG1lc3NhZ2UgZGVmZWN0LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmU9Tm9uZSk6CisgICAgICAgIHNlbGYubGluZSA9IGxpbmUKKworY2xhc3MgTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KE1lc3NhZ2VEZWZlY3QpOgorICAgICIiIkEgbWVzc2FnZSBjbGFpbWVkIHRvIGJlIGEgbXVsdGlwYXJ0IGJ1dCBoYWQgbm8gYm91bmRhcnkgcGFyYW1ldGVyLiIiIgorCitjbGFzcyBTdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QoTWVzc2FnZURlZmVjdCk6CisgICAgIiIiVGhlIGNsYWltZWQgc3RhcnQgYm91bmRhcnkgd2FzIG5ldmVyIGZvdW5kLiIiIgorCitjbGFzcyBGaXJzdEhlYWRlckxpbmVJc0NvbnRpbnVhdGlvbkRlZmVjdChNZXNzYWdlRGVmZWN0KToKKyAgICAiIiJBIG1lc3NhZ2UgaGFkIGEgY29udGludWF0aW9uIGxpbmUgYXMgaXRzIGZpcnN0IGhlYWRlciBsaW5lLiIiIgorCitjbGFzcyBNaXNwbGFjZWRFbnZlbG9wZUhlYWRlckRlZmVjdChNZXNzYWdlRGVmZWN0KToKKyAgICAiIiJBICdVbml4LWZyb20nIGhlYWRlciB3YXMgZm91bmQgaW4gdGhlIG1pZGRsZSBvZiBhIGhlYWRlciBibG9jay4iIiIKKworY2xhc3MgTWFsZm9ybWVkSGVhZGVyRGVmZWN0KE1lc3NhZ2VEZWZlY3QpOgorICAgICIiIkZvdW5kIGEgaGVhZGVyIHRoYXQgd2FzIG1pc3NpbmcgYSBjb2xvbiwgb3Igd2FzIG90aGVyd2lzZSBtYWxmb3JtZWQuIiIiCisKK2NsYXNzIE11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdChNZXNzYWdlRGVmZWN0KToKKyAgICAiIiJBIG1lc3NhZ2UgY2xhaW1lZCB0byBiZSBhIG11bHRpcGFydCBidXQgbm8gc3VicGFydHMgd2VyZSBmb3VuZC4iIiIKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9mZWVkcGFyc2VyLnB5IGIvTGliL2VtYWlsL2ZlZWRwYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkOGU0ZAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9mZWVkcGFyc2VyLnB5CkBAIC0wLDAgKzEsNDgwIEBACisjIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcnM6IEJheHRlciwgV291dGVycyBhbmQgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkZlZWRQYXJzZXIgLSBBbiBlbWFpbCBmZWVkIHBhcnNlci4KKworVGhlIGZlZWQgcGFyc2VyIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIGZvciBpbmNyZW1lbnRhbGx5IHBhcnNpbmcgYW4gZW1haWwKK21lc3NhZ2UsIGxpbmUgYnkgbGluZS4gIFRoaXMgaGFzIGFkdmFudGFnZXMgZm9yIGNlcnRhaW4gYXBwbGljYXRpb25zLCBzdWNoIGFzCit0aG9zZSByZWFkaW5nIGVtYWlsIG1lc3NhZ2VzIG9mZiBhIHNvY2tldC4KKworRmVlZFBhcnNlci5mZWVkKCkgaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGZvciBwdXNoaW5nIG5ldyBkYXRhIGludG8gdGhlCitwYXJzZXIuICBJdCByZXR1cm5zIHdoZW4gdGhlcmUncyBub3RoaW5nIG1vcmUgaXQgY2FuIGRvIHdpdGggdGhlIGF2YWlsYWJsZQorZGF0YS4gIFdoZW4geW91IGhhdmUgbm8gbW9yZSBkYXRhIHRvIHB1c2ggaW50byB0aGUgcGFyc2VyLCBjYWxsIC5jbG9zZSgpLgorVGhpcyBjb21wbGV0ZXMgdGhlIHBhcnNpbmcgYW5kIHJldHVybnMgdGhlIHJvb3QgbWVzc2FnZSBvYmplY3QuCisKK1RoZSBvdGhlciBhZHZhbnRhZ2Ugb2YgdGhpcyBwYXJzZXIgaXMgdGhhdCBpdCB3aWxsIG5ldmVyIHRocm93IGEgcGFyc2luZworZXhjZXB0aW9uLiAgSW5zdGVhZCwgd2hlbiBpdCBmaW5kcyBzb21ldGhpbmcgdW5leHBlY3RlZCwgaXQgYWRkcyBhICdkZWZlY3QnIHRvCit0aGUgY3VycmVudCBtZXNzYWdlLiAgRGVmZWN0cyBhcmUganVzdCBpbnN0YW5jZXMgdGhhdCBsaXZlIG9uIHRoZSBtZXNzYWdlCitvYmplY3QncyAuZGVmZWN0cyBhdHRyaWJ1dGUuCisiIiIKKworX19hbGxfXyA9IFsnRmVlZFBhcnNlciddCisKK2ltcG9ydCByZQorCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2UKKworTkxDUkUgPSByZS5jb21waWxlKCdcclxufFxyfFxuJykKK05MQ1JFX2JvbCA9IHJlLmNvbXBpbGUoJyhcclxufFxyfFxuKScpCitOTENSRV9lb2wgPSByZS5jb21waWxlKCcoXHJcbnxccnxcbikkJykKK05MQ1JFX2NyYWNrID0gcmUuY29tcGlsZSgnKFxyXG58XHJ8XG4pJykKKyMgUkZDIDI4MjIgJDMuNi44IE9wdGlvbmFsIGZpZWxkcy4gIGZ0ZXh0IGlzICVkMzMtNTcgLyAlZDU5LTEyNiwgQW55IGNoYXJhY3RlcgorIyBleGNlcHQgY29udHJvbHMsIFNQLCBhbmQgIjoiLgoraGVhZGVyUkUgPSByZS5jb21waWxlKHInXihGcm9tIHxbXDA0MS1cMDcxXDA3My1cMTc2XXsxLH06fFtcdCBdKScpCitFTVBUWVNUUklORyA9ICcnCitOTCA9ICdcbicKKworTmVlZE1vcmVEYXRhID0gb2JqZWN0KCkKKworCisMCitjbGFzcyBCdWZmZXJlZFN1YkZpbGUob2JqZWN0KToKKyAgICAiIiJBIGZpbGUtaXNoIG9iamVjdCB0aGF0IGNhbiBoYXZlIG5ldyBkYXRhIGxvYWRlZCBpbnRvIGl0LgorCisgICAgWW91IGNhbiBhbHNvIHB1c2ggYW5kIHBvcCBsaW5lLW1hdGNoaW5nIHByZWRpY2F0ZXMgb250byBhIHN0YWNrLiAgV2hlbiB0aGUKKyAgICBjdXJyZW50IHByZWRpY2F0ZSBtYXRjaGVzIHRoZSBjdXJyZW50IGxpbmUsIGEgZmFsc2UgRU9GIHJlc3BvbnNlCisgICAgKGkuZS4gZW1wdHkgc3RyaW5nKSBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhpcyBsZXRzIHRoZSBwYXJzZXIgYWRoZXJlIHRvIGEKKyAgICBzaW1wbGUgYWJzdHJhY3Rpb24gLS0gaXQgcGFyc2VzIHVudGlsIEVPRiBjbG9zZXMgdGhlIGN1cnJlbnQgbWVzc2FnZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgVGhlIGxhc3QgcGFydGlhbCBsaW5lIHB1c2hlZCBpbnRvIHRoaXMgb2JqZWN0LgorICAgICAgICBzZWxmLl9wYXJ0aWFsID0gJycKKyAgICAgICAgIyBUaGUgbGlzdCBvZiBmdWxsLCBwdXNoZWQgbGluZXMsIGluIHJldmVyc2Ugb3JkZXIKKyAgICAgICAgc2VsZi5fbGluZXMgPSBbXQorICAgICAgICAjIFRoZSBzdGFjayBvZiBmYWxzZS1FT0YgY2hlY2tpbmcgcHJlZGljYXRlcy4KKyAgICAgICAgc2VsZi5fZW9mc3RhY2sgPSBbXQorICAgICAgICAjIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaGFzIGJlZW4gY2xvc2VkIG9yIG5vdC4KKyAgICAgICAgc2VsZi5fY2xvc2VkID0gRmFsc2UKKworICAgIGRlZiBwdXNoX2VvZl9tYXRjaGVyKHNlbGYsIHByZWQpOgorICAgICAgICBzZWxmLl9lb2ZzdGFjay5hcHBlbmQocHJlZCkKKworICAgIGRlZiBwb3BfZW9mX21hdGNoZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lb2ZzdGFjay5wb3AoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAjIERvbid0IGZvcmdldCBhbnkgdHJhaWxpbmcgcGFydGlhbCBsaW5lLgorICAgICAgICBzZWxmLl9saW5lcy5hcHBlbmQoc2VsZi5fcGFydGlhbCkKKyAgICAgICAgc2VsZi5fcGFydGlhbCA9ICcnCisgICAgICAgIHNlbGYuX2Nsb3NlZCA9IFRydWUKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2xpbmVzOgorICAgICAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICAgICAgcmV0dXJuIE5lZWRNb3JlRGF0YQorICAgICAgICAjIFBvcCB0aGUgbGluZSBvZmYgdGhlIHN0YWNrIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcyB0aGUgY3VycmVudAorICAgICAgICAjIGZhbHNlLUVPRiBwcmVkaWNhdGUuCisgICAgICAgIGxpbmUgPSBzZWxmLl9saW5lcy5wb3AoKQorICAgICAgICAjIFJGQyAyMDQ2LCBzZWN0aW9uIDUuMS4yIHJlcXVpcmVzIHVzIHRvIHJlY29nbml6ZSBvdXRlciBsZXZlbAorICAgICAgICAjIGJvdW5kYXJpZXMgYXQgYW55IGxldmVsIG9mIGlubmVyIG5lc3RpbmcuICBEbyB0aGlzLCBidXQgYmUgc3VyZSBpdCdzCisgICAgICAgICMgaW4gdGhlIG9yZGVyIG9mIG1vc3QgdG8gbGVhc3QgbmVzdGVkLgorICAgICAgICBmb3IgYXRlb2YgaW4gc2VsZi5fZW9mc3RhY2tbOjotMV06CisgICAgICAgICAgICBpZiBhdGVvZihsaW5lKToKKyAgICAgICAgICAgICAgICAjIFdlJ3JlIGF0IHRoZSBmYWxzZSBFT0YuICBCdXQgcHVzaCB0aGUgbGFzdCBsaW5lIGJhY2sgZmlyc3QuCisgICAgICAgICAgICAgICAgc2VsZi5fbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICBkZWYgdW5yZWFkbGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgIyBMZXQgdGhlIGNvbnN1bWVyIHB1c2ggYSBsaW5lIGJhY2sgaW50byB0aGUgYnVmZmVyLgorICAgICAgICBhc3NlcnQgbGluZSBpcyBub3QgTmVlZE1vcmVEYXRhCisgICAgICAgIHNlbGYuX2xpbmVzLmFwcGVuZChsaW5lKQorCisgICAgZGVmIHB1c2goc2VsZiwgZGF0YSk6CisgICAgICAgICIiIlB1c2ggc29tZSBuZXcgZGF0YSBpbnRvIHRoaXMgb2JqZWN0LiIiIgorICAgICAgICAjIEhhbmRsZSBhbnkgcHJldmlvdXMgbGVmdG92ZXJzCisgICAgICAgIGRhdGEsIHNlbGYuX3BhcnRpYWwgPSBzZWxmLl9wYXJ0aWFsICsgZGF0YSwgJycKKyAgICAgICAgIyBDcmFjayBpbnRvIGxpbmVzLCBidXQgcHJlc2VydmUgdGhlIG5ld2xpbmVzIG9uIHRoZSBlbmQgb2YgZWFjaAorICAgICAgICBwYXJ0cyA9IE5MQ1JFX2NyYWNrLnNwbGl0KGRhdGEpCisgICAgICAgICMgVGhlICphaGVtKiBpbnRlcmVzdGluZyBiZWhhdmlvdXIgb2YgcmUuc3BsaXQgd2hlbiBzdXBwbGllZCBncm91cGluZworICAgICAgICAjIHBhcmVudGhlc2VzIGlzIHRoYXQgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3QgaXMgdGhlCisgICAgICAgICMgZGF0YSBhZnRlciB0aGUgZmluYWwgUkUuICBJbiB0aGUgY2FzZSBvZiBhIE5ML0NSIHRlcm1pbmF0ZWQgc3RyaW5nLAorICAgICAgICAjIHRoaXMgaXMgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgICAgc2VsZi5fcGFydGlhbCA9IHBhcnRzLnBvcCgpCisgICAgICAgICMgcGFydHMgaXMgYSBsaXN0IG9mIHN0cmluZ3MsIGFsdGVybmF0aW5nIGJldHdlZW4gdGhlIGxpbmUgY29udGVudHMKKyAgICAgICAgIyBhbmQgdGhlIGVvbCBjaGFyYWN0ZXIocykuICBHYXRoZXIgdXAgYSBsaXN0IG9mIGxpbmVzIGFmdGVyCisgICAgICAgICMgcmUtYXR0YWNoaW5nIHRoZSBuZXdsaW5lcy4KKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocGFydHMpIC8vIDIpOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHBhcnRzW2kqMl0gKyBwYXJ0c1tpKjIrMV0pCisgICAgICAgIHNlbGYucHVzaGxpbmVzKGxpbmVzKQorCisgICAgZGVmIHB1c2hsaW5lcyhzZWxmLCBsaW5lcyk6CisgICAgICAgICMgUmV2ZXJzZSBhbmQgaW5zZXJ0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGluZXMuCisgICAgICAgIHNlbGYuX2xpbmVzWzowXSA9IGxpbmVzWzo6LTFdCisKKyAgICBkZWYgaXNfY2xvc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2xvc2VkCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIGxpbmUKKworCisMCitjbGFzcyBGZWVkUGFyc2VyOgorICAgICIiIkEgZmVlZC1zdHlsZSBwYXJzZXIgb2YgZW1haWwuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX2ZhY3Rvcnk9bWVzc2FnZS5NZXNzYWdlKToKKyAgICAgICAgIiIiX2ZhY3RvcnkgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIHRvIGNyZWF0ZSBhIG5ldyBtZXNzYWdlIG9iaiIiIgorICAgICAgICBzZWxmLl9mYWN0b3J5ID0gX2ZhY3RvcnkKKyAgICAgICAgc2VsZi5faW5wdXQgPSBCdWZmZXJlZFN1YkZpbGUoKQorICAgICAgICBzZWxmLl9tc2dzdGFjayA9IFtdCisgICAgICAgIHNlbGYuX3BhcnNlID0gc2VsZi5fcGFyc2VnZW4oKS5fX25leHRfXworICAgICAgICBzZWxmLl9jdXIgPSBOb25lCisgICAgICAgIHNlbGYuX2xhc3QgPSBOb25lCisgICAgICAgIHNlbGYuX2hlYWRlcnNvbmx5ID0gRmFsc2UKKworICAgICMgTm9uLXB1YmxpYyBpbnRlcmZhY2UgZm9yIHN1cHBvcnRpbmcgUGFyc2VyJ3MgaGVhZGVyc29ubHkgZmxhZworICAgIGRlZiBfc2V0X2hlYWRlcnNvbmx5KHNlbGYpOgorICAgICAgICBzZWxmLl9oZWFkZXJzb25seSA9IFRydWUKKworICAgIGRlZiBmZWVkKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJQdXNoIG1vcmUgZGF0YSBpbnRvIHRoZSBwYXJzZXIuIiIiCisgICAgICAgIHNlbGYuX2lucHV0LnB1c2goZGF0YSkKKyAgICAgICAgc2VsZi5fY2FsbF9wYXJzZSgpCisKKyAgICBkZWYgX2NhbGxfcGFyc2Uoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlKCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFsbCByZW1haW5pbmcgZGF0YSBhbmQgcmV0dXJuIHRoZSByb290IG1lc3NhZ2Ugb2JqZWN0LiIiIgorICAgICAgICBzZWxmLl9pbnB1dC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2NhbGxfcGFyc2UoKQorICAgICAgICByb290ID0gc2VsZi5fcG9wX21lc3NhZ2UoKQorICAgICAgICBhc3NlcnQgbm90IHNlbGYuX21zZ3N0YWNrCisgICAgICAgICMgTG9vayBmb3IgZmluYWwgc2V0IG9mIGRlZmVjdHMKKyAgICAgICAgaWYgcm9vdC5nZXRfY29udGVudF9tYWludHlwZSgpID09ICdtdWx0aXBhcnQnIFwKKyAgICAgICAgICAgICAgIGFuZCBub3Qgcm9vdC5pc19tdWx0aXBhcnQoKToKKyAgICAgICAgICAgIHJvb3QuZGVmZWN0cy5hcHBlbmQoZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCgpKQorICAgICAgICByZXR1cm4gcm9vdAorCisgICAgZGVmIF9uZXdfbWVzc2FnZShzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeSgpCisgICAgICAgIGlmIHNlbGYuX2N1ciBhbmQgc2VsZi5fY3VyLmdldF9jb250ZW50X3R5cGUoKSA9PSAnbXVsdGlwYXJ0L2RpZ2VzdCc6CisgICAgICAgICAgICBtc2cuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBpZiBzZWxmLl9tc2dzdGFjazoKKyAgICAgICAgICAgIHNlbGYuX21zZ3N0YWNrWy0xXS5hdHRhY2gobXNnKQorICAgICAgICBzZWxmLl9tc2dzdGFjay5hcHBlbmQobXNnKQorICAgICAgICBzZWxmLl9jdXIgPSBtc2cKKyAgICAgICAgc2VsZi5fbGFzdCA9IG1zZworCisgICAgZGVmIF9wb3BfbWVzc2FnZShzZWxmKToKKyAgICAgICAgcmV0dmFsID0gc2VsZi5fbXNnc3RhY2sucG9wKCkKKyAgICAgICAgaWYgc2VsZi5fbXNnc3RhY2s6CisgICAgICAgICAgICBzZWxmLl9jdXIgPSBzZWxmLl9tc2dzdGFja1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2N1ciA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHJldHZhbAorCisgICAgZGVmIF9wYXJzZWdlbihzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgbWVzc2FnZSBhbmQgc3RhcnQgYnkgcGFyc2luZyBoZWFkZXJzLgorICAgICAgICBzZWxmLl9uZXdfbWVzc2FnZSgpCisgICAgICAgIGhlYWRlcnMgPSBbXQorICAgICAgICAjIENvbGxlY3QgdGhlIGhlYWRlcnMsIHNlYXJjaGluZyBmb3IgYSBsaW5lIHRoYXQgZG9lc24ndCBtYXRjaCB0aGUgUkZDCisgICAgICAgICMgMjgyMiBoZWFkZXIgb3IgY29udGludWF0aW9uIHBhdHRlcm4gKGluY2x1ZGluZyBhbiBlbXB0eSBsaW5lKS4KKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5faW5wdXQ6CisgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGhlYWRlclJFLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgICMgSWYgd2Ugc2F3IHRoZSBSRkMgZGVmaW5lZCBoZWFkZXIvYm9keSBzZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAjIChpLmUuIG5ld2xpbmUpLCBqdXN0IHRocm93IGl0IGF3YXkuIE90aGVyd2lzZSB0aGUgbGluZSBpcworICAgICAgICAgICAgICAgICMgcGFydCBvZiB0aGUgYm9keSBzbyBwdXNoIGl0IGJhY2suCisgICAgICAgICAgICAgICAgaWYgbm90IE5MQ1JFLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC51bnJlYWRsaW5lKGxpbmUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGhlYWRlcnMuYXBwZW5kKGxpbmUpCisgICAgICAgICMgRG9uZSB3aXRoIHRoZSBoZWFkZXJzLCBzbyBwYXJzZSB0aGVtIGFuZCBmaWd1cmUgb3V0IHdoYXQgd2UncmUKKyAgICAgICAgIyBzdXBwb3NlZCB0byBzZWUgaW4gdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgIHNlbGYuX3BhcnNlX2hlYWRlcnMoaGVhZGVycykKKyAgICAgICAgIyBIZWFkZXJzLW9ubHkgcGFyc2luZyBpcyBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGhhY2ssIHdoaWNoIHdhcworICAgICAgICAjIG5lY2Vzc2FyeSBpbiB0aGUgb2xkZXIgcGFyc2VyLCB3aGljaCBjb3VsZCB0aHJvdyBlcnJvcnMuICBBbGwKKyAgICAgICAgIyByZW1haW5pbmcgbGluZXMgaW4gdGhlIGlucHV0IGFyZSB0aHJvd24gaW50byB0aGUgbWVzc2FnZSBib2R5LgorICAgICAgICBpZiBzZWxmLl9oZWFkZXJzb25seToKKyAgICAgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX2lucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIHNlbGYuX2N1ci5zZXRfcGF5bG9hZChFTVBUWVNUUklORy5qb2luKGxpbmVzKSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9jdXIuZ2V0X2NvbnRlbnRfdHlwZSgpID09ICdtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyc6CisgICAgICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIGNvbnRhaW5zIGJsb2NrcyBvZiBoZWFkZXJzIHNlcGFyYXRlZCBieQorICAgICAgICAgICAgIyBhIGJsYW5rIGxpbmUuICBXZSdsbCByZXByZXNlbnQgZWFjaCBoZWFkZXIgYmxvY2sgYXMgYSBzZXBhcmF0ZQorICAgICAgICAgICAgIyBuZXN0ZWQgbWVzc2FnZSBvYmplY3QsIGJ1dCB0aGUgcHJvY2Vzc2luZyBpcyBhIGJpdCBkaWZmZXJlbnQKKyAgICAgICAgICAgICMgdGhhbiBzdGFuZGFyZCBtZXNzYWdlLyogdHlwZXMgYmVjYXVzZSB0aGVyZSBpcyBubyBib2R5IGZvciB0aGUKKyAgICAgICAgICAgICMgbmVzdGVkIG1lc3NhZ2VzLiAgQSBibGFuayBsaW5lIHNlcGFyYXRlcyB0aGUgc3VicGFydHMuCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnB1c2hfZW9mX21hdGNoZXIoTkxDUkUubWF0Y2gpCisgICAgICAgICAgICAgICAgZm9yIHJldHZhbCBpbiBzZWxmLl9wYXJzZWdlbigpOgorICAgICAgICAgICAgICAgICAgICBpZiByZXR2YWwgaXMgTmVlZE1vcmVEYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG1zZyA9IHNlbGYuX3BvcF9tZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gcG9wIHRoZSBFT0YgbWF0Y2hlciBpbiBvcmRlciB0byB0ZWxsIGlmIHdlJ3JlIGF0CisgICAgICAgICAgICAgICAgIyB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZpbGUsIG5vdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGJsb2NrCisgICAgICAgICAgICAgICAgIyBvZiBtZXNzYWdlIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgc2VsZi5faW5wdXQucG9wX2VvZl9tYXRjaGVyKCkKKyAgICAgICAgICAgICAgICAjIFRoZSBpbnB1dCBzdHJlYW0gbXVzdCBiZSBzaXR0aW5nIGF0IHRoZSBuZXdsaW5lIG9yIGF0IHRoZQorICAgICAgICAgICAgICAgICMgRU9GLiAgV2Ugd2FudCB0byBzZWUgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGlzIHN1YnBhcnQsIHNvCisgICAgICAgICAgICAgICAgIyBmaXJzdCBjb25zdW1lIHRoZSBibGFuayBsaW5lLCB0aGVuIHRlc3QgdGhlIG5leHQgbGluZSB0byBzZWUKKyAgICAgICAgICAgICAgICAjIGlmIHdlJ3JlIGF0IHRoaXMgc3VicGFydCdzIEVPRi4KKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5faW5wdXQucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5faW5wdXQucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICMgTm90IGF0IEVPRiBzbyB0aGlzIGlzIGEgbGluZSB3ZSdyZSBnb2luZyB0byBuZWVkLgorICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnVucmVhZGxpbmUobGluZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9jdXIuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSA9PSAnbWVzc2FnZSc6CisgICAgICAgICAgICAjIFRoZSBtZXNzYWdlIGNsYWltcyB0byBiZSBhIG1lc3NhZ2UvKiB0eXBlLCB0aGVuIHdoYXQgZm9sbG93cyBpcworICAgICAgICAgICAgIyBhbm90aGVyIFJGQyAyODIyIG1lc3NhZ2UuCisgICAgICAgICAgICBmb3IgcmV0dmFsIGluIHNlbGYuX3BhcnNlZ2VuKCk6CisgICAgICAgICAgICAgICAgaWYgcmV0dmFsIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuX3BvcF9tZXNzYWdlKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9jdXIuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JzoKKyAgICAgICAgICAgIGJvdW5kYXJ5ID0gc2VsZi5fY3VyLmdldF9ib3VuZGFyeSgpCisgICAgICAgICAgICBpZiBib3VuZGFyeSBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgVGhlIG1lc3NhZ2UgL2NsYWltcy8gdG8gYmUgYSBtdWx0aXBhcnQgYnV0IGl0IGhhcyBub3QKKyAgICAgICAgICAgICAgICAjIGRlZmluZWQgYSBib3VuZGFyeS4gIFRoYXQncyBhIHByb2JsZW0gd2hpY2ggd2UnbGwgaGFuZGxlIGJ5CisgICAgICAgICAgICAgICAgIyByZWFkaW5nIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIEVPRiBhbmQgbWFya2luZyB0aGUgbWVzc2FnZSBhcworICAgICAgICAgICAgICAgICMgZGVmZWN0aXZlLgorICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChlcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KCkpCisgICAgICAgICAgICAgICAgbGluZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLnNldF9wYXlsb2FkKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgIyBDcmVhdGUgYSBsaW5lIG1hdGNoIHByZWRpY2F0ZSB3aGljaCBtYXRjaGVzIHRoZSBpbnRlci1wYXJ0CisgICAgICAgICAgICAjIGJvdW5kYXJ5IGFzIHdlbGwgYXMgdGhlIGVuZC1vZi1tdWx0aXBhcnQgYm91bmRhcnkuICBEb24ndCBwdXNoCisgICAgICAgICAgICAjIHRoaXMgb250byB0aGUgaW5wdXQgc3RyZWFtIHVudGlsIHdlJ3ZlIHNjYW5uZWQgcGFzdCB0aGUKKyAgICAgICAgICAgICMgcHJlYW1ibGUuCisgICAgICAgICAgICBzZXBhcmF0b3IgPSAnLS0nICsgYm91bmRhcnkKKyAgICAgICAgICAgIGJvdW5kYXJ5cmUgPSByZS5jb21waWxlKAorICAgICAgICAgICAgICAgICcoP1A8c2VwPicgKyByZS5lc2NhcGUoc2VwYXJhdG9yKSArCisgICAgICAgICAgICAgICAgcicpKD9QPGVuZD4tLSk/KD9QPHdzPlsgXHRdKikoP1A8bGluZXNlcD5cclxufFxyfFxuKT8kJykKKyAgICAgICAgICAgIGNhcHR1cmluZ19wcmVhbWJsZSA9IFRydWUKKyAgICAgICAgICAgIHByZWFtYmxlID0gW10KKyAgICAgICAgICAgIGxpbmVzZXAgPSBGYWxzZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5faW5wdXQucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTmVlZE1vcmVEYXRhOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG1vID0gYm91bmRhcnlyZS5tYXRjaChsaW5lKQorICAgICAgICAgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIGxvb2tpbmcgYXQgdGhlIGVuZCBib3VuZGFyeSwgd2UncmUgZG9uZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICMgdGhpcyBtdWx0aXBhcnQuICBJZiB0aGVyZSB3YXMgYSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgY2xvc2luZyBib3VuZGFyeSwgdGhlbiB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlCisgICAgICAgICAgICAgICAgICAgICMgZXBpbG9ndWUgd2l0aCB0aGUgZW1wdHkgc3RyaW5nIChzZWUgYmVsb3cpLgorICAgICAgICAgICAgICAgICAgICBpZiBtby5ncm91cCgnZW5kJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2VwID0gbW8uZ3JvdXAoJ2xpbmVzZXAnKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBXZSBzYXcgYW4gaW50ZXItcGFydCBib3VuZGFyeS4gIFdlcmUgd2UgaW4gdGhlIHByZWFtYmxlPworICAgICAgICAgICAgICAgICAgICBpZiBjYXB0dXJpbmdfcHJlYW1ibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcmVhbWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFjY29yZGluZyB0byBSRkMgMjA0NiwgdGhlIGxhc3QgbmV3bGluZSBiZWxvbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0byB0aGUgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGxpbmUgPSBwcmVhbWJsZVstMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2xtbyA9IE5MQ1JFX2VvbC5zZWFyY2gobGFzdGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW9sbW86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFtYmxlWy0xXSA9IGxhc3RsaW5lWzotbGVuKGVvbG1vLmdyb3VwKDApKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXIucHJlYW1ibGUgPSBFTVBUWVNUUklORy5qb2luKHByZWFtYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyaW5nX3ByZWFtYmxlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnVucmVhZGxpbmUobGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICMgV2Ugc2F3IGEgYm91bmRhcnkgc2VwYXJhdGluZyB0d28gcGFydHMuICBDb25zdW1lIGFueQorICAgICAgICAgICAgICAgICAgICAjIG11bHRpcGxlIGJvdW5kYXJ5IGxpbmVzIHRoYXQgbWF5IGJlIGZvbGxvd2luZy4gIE91cgorICAgICAgICAgICAgICAgICAgICAjIGludGVycHJldGF0aW9uIG9mIFJGQyAyMDQ2IEJORiBncmFtbWFyIGRvZXMgbm90IHByb2R1Y2UKKyAgICAgICAgICAgICAgICAgICAgIyBib2R5IHBhcnRzIHdpdGhpbiBzdWNoIGRvdWJsZSBib3VuZGFyaWVzLgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX2lucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTmVlZE1vcmVEYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBtbyA9IGJvdW5kYXJ5cmUubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC51bnJlYWRsaW5lKGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBSZWN1cnNlIHRvIHBhcnNlIHRoaXMgc3VicGFydDsgdGhlIGlucHV0IHN0cmVhbSBwb2ludHMKKyAgICAgICAgICAgICAgICAgICAgIyBhdCB0aGUgc3VicGFydCdzIGZpcnN0IGxpbmUuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnB1c2hfZW9mX21hdGNoZXIoYm91bmRhcnlyZS5tYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIHJldHZhbCBpbiBzZWxmLl9wYXJzZWdlbigpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmV0dmFsIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBCZWNhdXNlIG9mIFJGQyAyMDQ2LCB0aGUgbmV3bGluZSBwcmVjZWRpbmcgdGhlIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgICAgICMgc2VwYXJhdG9yIGFjdHVhbGx5IGJlbG9uZ3MgdG8gdGhlIGJvdW5kYXJ5LCBub3QgdGhlCisgICAgICAgICAgICAgICAgICAgICMgcHJldmlvdXMgc3VicGFydCdzIHBheWxvYWQgKG9yIGVwaWxvZ3VlIGlmIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAjIHBhcnQgaXMgYSBtdWx0aXBhcnQpLgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9sYXN0LmdldF9jb250ZW50X21haW50eXBlKCkgPT0gJ211bHRpcGFydCc6CisgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2d1ZSA9IHNlbGYuX2xhc3QuZXBpbG9ndWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVwaWxvZ3VlID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3QuZXBpbG9ndWUgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGVwaWxvZ3VlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vID0gTkxDUkVfZW9sLnNlYXJjaChlcGlsb2d1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gbGVuKG1vLmdyb3VwKDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0LmVwaWxvZ3VlID0gZXBpbG9ndWVbOi1lbmRdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VsZi5fbGFzdC5nZXRfcGF5bG9hZCgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBheWxvYWQsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vID0gTkxDUkVfZW9sLnNlYXJjaChwYXlsb2FkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZFs6LWxlbihtby5ncm91cCgwKSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3Quc2V0X3BheWxvYWQocGF5bG9hZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5wdXQucG9wX2VvZl9tYXRjaGVyKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcG9wX21lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAjIFNldCB0aGUgbXVsdGlwYXJ0IHVwIGZvciBuZXdsaW5lIGNsZWFuc2luZywgd2hpY2ggd2lsbAorICAgICAgICAgICAgICAgICAgICAjIGhhcHBlbiBpZiB3ZSdyZSBpbiBhIG5lc3RlZCBtdWx0aXBhcnQuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3QgPSBzZWxmLl9jdXIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEkgdGhpbmsgd2UgbXVzdCBiZSBpbiB0aGUgcHJlYW1ibGUKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGNhcHR1cmluZ19wcmVhbWJsZQorICAgICAgICAgICAgICAgICAgICBwcmVhbWJsZS5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICMgV2UndmUgc2VlbiBlaXRoZXIgdGhlIEVPRiBvciB0aGUgZW5kIGJvdW5kYXJ5LiAgSWYgd2UncmUgc3RpbGwKKyAgICAgICAgICAgICMgY2FwdHVyaW5nIHRoZSBwcmVhbWJsZSwgd2UgbmV2ZXIgc2F3IHRoZSBzdGFydCBib3VuZGFyeS4gIE5vdGUKKyAgICAgICAgICAgICMgdGhhdCBhcyBhIGRlZmVjdCBhbmQgc3RvcmUgdGhlIGNhcHR1cmVkIHRleHQgYXMgdGhlIHBheWxvYWQuCisgICAgICAgICAgICAjIEV2ZXJ5dGhpbmcgZnJvbSBoZXJlIHRvIHRoZSBFT0YgaXMgZXBpbG9ndWUuCisgICAgICAgICAgICBpZiBjYXB0dXJpbmdfcHJlYW1ibGU6CisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QoKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9jdXIuc2V0X3BheWxvYWQoRU1QVFlTVFJJTkcuam9pbihwcmVhbWJsZSkpCisgICAgICAgICAgICAgICAgZXBpbG9ndWUgPSBbXQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZXBpbG9ndWUgPSBFTVBUWVNUUklORy5qb2luKGVwaWxvZ3VlKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgIyBJZiB0aGUgZW5kIGJvdW5kYXJ5IGVuZGVkIGluIGEgbmV3bGluZSwgd2UnbGwgbmVlZCB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICMgdGhlIGVwaWxvZ3VlIGlzbid0IE5vbmUKKyAgICAgICAgICAgIGlmIGxpbmVzZXA6CisgICAgICAgICAgICAgICAgZXBpbG9ndWUgPSBbJyddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVwaWxvZ3VlID0gW10KKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgorICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTmVlZE1vcmVEYXRhOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlcGlsb2d1ZS5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICMgQW55IENSTEYgYXQgdGhlIGZyb250IG9mIHRoZSBlcGlsb2d1ZSBpcyBub3QgdGVjaG5pY2FsbHkgcGFydCBvZgorICAgICAgICAgICAgIyB0aGUgZXBpbG9ndWUuICBBbHNvLCB3YXRjaCBvdXQgZm9yIGFuIGVtcHR5IHN0cmluZyBlcGlsb2d1ZSwKKyAgICAgICAgICAgICMgd2hpY2ggbWVhbnMgYSBzaW5nbGUgbmV3bGluZS4KKyAgICAgICAgICAgIGlmIGVwaWxvZ3VlOgorICAgICAgICAgICAgICAgIGZpcnN0bGluZSA9IGVwaWxvZ3VlWzBdCisgICAgICAgICAgICAgICAgYm9sbW8gPSBOTENSRV9ib2wubWF0Y2goZmlyc3RsaW5lKQorICAgICAgICAgICAgICAgIGlmIGJvbG1vOgorICAgICAgICAgICAgICAgICAgICBlcGlsb2d1ZVswXSA9IGZpcnN0bGluZVtsZW4oYm9sbW8uZ3JvdXAoMCkpOl0KKyAgICAgICAgICAgIHNlbGYuX2N1ci5lcGlsb2d1ZSA9IEVNUFRZU1RSSU5HLmpvaW4oZXBpbG9ndWUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBPdGhlcndpc2UsIGl0J3Mgc29tZSBub24tbXVsdGlwYXJ0IHR5cGUsIHNvIHRoZSBlbnRpcmUgcmVzdCBvZiB0aGUKKyAgICAgICAgIyBmaWxlIGNvbnRlbnRzIGJlY29tZXMgdGhlIHBheWxvYWQuCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5faW5wdXQ6CisgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgIHNlbGYuX2N1ci5zZXRfcGF5bG9hZChFTVBUWVNUUklORy5qb2luKGxpbmVzKSkKKworICAgIGRlZiBfcGFyc2VfaGVhZGVycyhzZWxmLCBsaW5lcyk6CisgICAgICAgICMgUGFzc2VkIGEgbGlzdCBvZiBsaW5lcyB0aGF0IG1ha2UgdXAgdGhlIGhlYWRlcnMgZm9yIHRoZSBjdXJyZW50IG1zZworICAgICAgICBsYXN0aGVhZGVyID0gJycKKyAgICAgICAgbGFzdHZhbHVlID0gW10KKyAgICAgICAgZm9yIGxpbmVubywgbGluZSBpbiBlbnVtZXJhdGUobGluZXMpOgorICAgICAgICAgICAgIyBDaGVjayBmb3IgY29udGludWF0aW9uCisgICAgICAgICAgICBpZiBsaW5lWzBdIGluICcgXHQnOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsYXN0aGVhZGVyOgorICAgICAgICAgICAgICAgICAgICAjIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSBoZWFkZXJzIHdhcyBhIGNvbnRpbnVhdGlvbi4gIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgIyBpcyBpbGxlZ2FsLCBzbyBsZXQncyBub3RlIHRoZSBkZWZlY3QsIHN0b3JlIHRoZSBpbGxlZ2FsCisgICAgICAgICAgICAgICAgICAgICMgbGluZSwgYW5kIGlnbm9yZSBpdCBmb3IgcHVycG9zZXMgb2YgaGVhZGVycy4KKyAgICAgICAgICAgICAgICAgICAgZGVmZWN0ID0gZXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChkZWZlY3QpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbGFzdHZhbHVlLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBsYXN0aGVhZGVyOgorICAgICAgICAgICAgICAgICMgWFhYIHJlY29uc2lkZXIgdGhlIGpvaW5pbmcgb2YgZm9sZGVkIGxpbmVzCisgICAgICAgICAgICAgICAgbGhkciA9IEVNUFRZU1RSSU5HLmpvaW4obGFzdHZhbHVlKVs6LTFdLnJzdHJpcCgnXHJcbicpCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyW2xhc3RoZWFkZXJdID0gbGhkcgorICAgICAgICAgICAgICAgIGxhc3RoZWFkZXIsIGxhc3R2YWx1ZSA9ICcnLCBbXQorICAgICAgICAgICAgIyBDaGVjayBmb3IgZW52ZWxvcGUgaGVhZGVyLCBpLmUuIHVuaXgtZnJvbQorICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdGcm9tICcpOgorICAgICAgICAgICAgICAgIGlmIGxpbmVubyA9PSAwOgorICAgICAgICAgICAgICAgICAgICAjIFN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZQorICAgICAgICAgICAgICAgICAgICBtbyA9IE5MQ1JFX2VvbC5zZWFyY2gobGluZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbW86CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LWxlbihtby5ncm91cCgwKSldCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5zZXRfdW5peGZyb20obGluZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVubyA9PSBsZW4obGluZXMpIC0gMToKKyAgICAgICAgICAgICAgICAgICAgIyBTb21ldGhpbmcgbG9va2luZyBsaWtlIGEgdW5peC1mcm9tIGF0IHRoZSBlbmQgLSBpdCdzCisgICAgICAgICAgICAgICAgICAgICMgcHJvYmFibHkgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJvZHksIHNvIHB1c2ggYmFjayB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBsaW5lIGFuZCBzdG9wLgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC51bnJlYWRsaW5lKGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgV2VpcmRseSBwbGFjZWQgdW5peC1mcm9tIGxpbmUuICBOb3RlIHRoaXMgYXMgYSBkZWZlY3QKKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgaWdub3JlIGl0LgorICAgICAgICAgICAgICAgICAgICBkZWZlY3QgPSBlcnJvcnMuTWlzcGxhY2VkRW52ZWxvcGVIZWFkZXJEZWZlY3QobGluZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGRlZmVjdCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgU3BsaXQgdGhlIGxpbmUgb24gdGhlIGNvbG9uIHNlcGFyYXRpbmcgZmllbGQgbmFtZSBmcm9tIHZhbHVlLgorICAgICAgICAgICAgaSA9IGxpbmUuZmluZCgnOicpCisgICAgICAgICAgICBpZiBpIDwgMDoKKyAgICAgICAgICAgICAgICBkZWZlY3QgPSBlcnJvcnMuTWFsZm9ybWVkSGVhZGVyRGVmZWN0KGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGRlZmVjdCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGFzdGhlYWRlciA9IGxpbmVbOmldCisgICAgICAgICAgICBsYXN0dmFsdWUgPSBbbGluZVtpKzE6XS5sc3RyaXAoKV0KKyAgICAgICAgIyBEb25lIHdpdGggYWxsIHRoZSBsaW5lcywgc28gaGFuZGxlIHRoZSBsYXN0IGhlYWRlci4KKyAgICAgICAgaWYgbGFzdGhlYWRlcjoKKyAgICAgICAgICAgICMgWFhYIHJlY29uc2lkZXIgdGhlIGpvaW5pbmcgb2YgZm9sZGVkIGxpbmVzCisgICAgICAgICAgICBzZWxmLl9jdXJbbGFzdGhlYWRlcl0gPSBFTVBUWVNUUklORy5qb2luKGxhc3R2YWx1ZSkucnN0cmlwKCdcclxuJykKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9nZW5lcmF0b3IucHkgYi9MaWIvZW1haWwvZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNTJlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMzMyIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkNsYXNzZXMgdG8gZ2VuZXJhdGUgcGxhaW4gdGV4dCBmcm9tIGEgbWVzc2FnZSBvYmplY3QgdHJlZS4iIiIKKworX19hbGxfXyA9IFsnR2VuZXJhdG9yJywgJ0RlY29kZWRHZW5lcmF0b3InXQorCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gZW1haWwuaGVhZGVyIGltcG9ydCBIZWFkZXIKKworVU5ERVJTQ09SRSA9ICdfJworTkwgPSAnXG4nCisKK2ZjcmUgPSByZS5jb21waWxlKHInXkZyb20gJywgcmUuTVVMVElMSU5FKQorCisKKwwKK2NsYXNzIEdlbmVyYXRvcjoKKyAgICAiIiJHZW5lcmF0ZXMgb3V0cHV0IGZyb20gYSBNZXNzYWdlIG9iamVjdCB0cmVlLgorCisgICAgVGhpcyBiYXNpYyBnZW5lcmF0b3Igd3JpdGVzIHRoZSBtZXNzYWdlIHRvIHRoZSBnaXZlbiBmaWxlIG9iamVjdCBhcyBwbGFpbgorICAgIHRleHQuCisgICAgIiIiCisgICAgIworICAgICMgUHVibGljIGludGVyZmFjZQorICAgICMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXRmcCwgbWFuZ2xlX2Zyb21fPVRydWUsIG1heGhlYWRlcmxlbj03OCk6CisgICAgICAgICIiIkNyZWF0ZSB0aGUgZ2VuZXJhdG9yIGZvciBtZXNzYWdlIGZsYXR0ZW5pbmcuCisKKyAgICAgICAgb3V0ZnAgaXMgdGhlIG91dHB1dCBmaWxlLWxpa2Ugb2JqZWN0IGZvciB3cml0aW5nIHRoZSBtZXNzYWdlIHRvLiAgSXQKKyAgICAgICAgbXVzdCBoYXZlIGEgd3JpdGUoKSBtZXRob2QuCisKKyAgICAgICAgT3B0aW9uYWwgbWFuZ2xlX2Zyb21fIGlzIGEgZmxhZyB0aGF0LCB3aGVuIFRydWUgKHRoZSBkZWZhdWx0KSwgZXNjYXBlcworICAgICAgICBGcm9tXyBsaW5lcyBpbiB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSBieSBwdXR0aW5nIGEgYD4nIGluIGZyb250IG9mCisgICAgICAgIHRoZW0uCisKKyAgICAgICAgT3B0aW9uYWwgbWF4aGVhZGVybGVuIHNwZWNpZmllcyB0aGUgbG9uZ2VzdCBsZW5ndGggZm9yIGEgbm9uLWNvbnRpbnVlZAorICAgICAgICBoZWFkZXIuICBXaGVuIGEgaGVhZGVyIGxpbmUgaXMgbG9uZ2VyIChpbiBjaGFyYWN0ZXJzLCB3aXRoIHRhYnMKKyAgICAgICAgZXhwYW5kZWQgdG8gOCBzcGFjZXMpIHRoYW4gbWF4aGVhZGVybGVuLCB0aGUgaGVhZGVyIHdpbGwgc3BsaXQgYXMKKyAgICAgICAgZGVmaW5lZCBpbiB0aGUgSGVhZGVyIGNsYXNzLiAgU2V0IG1heGhlYWRlcmxlbiB0byB6ZXJvIHRvIGRpc2FibGUKKyAgICAgICAgaGVhZGVyIHdyYXBwaW5nLiAgVGhlIGRlZmF1bHQgaXMgNzgsIGFzIHJlY29tbWVuZGVkIChidXQgbm90IHJlcXVpcmVkKQorICAgICAgICBieSBSRkMgMjgyMi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2ZwID0gb3V0ZnAKKyAgICAgICAgc2VsZi5fbWFuZ2xlX2Zyb21fID0gbWFuZ2xlX2Zyb21fCisgICAgICAgIHNlbGYuX21heGhlYWRlcmxlbiA9IG1heGhlYWRlcmxlbgorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICAjIEp1c3QgZGVsZWdhdGUgdG8gdGhlIGZpbGUgb2JqZWN0CisgICAgICAgIHNlbGYuX2ZwLndyaXRlKHMpCisKKyAgICBkZWYgZmxhdHRlbihzZWxmLCBtc2csIHVuaXhmcm9tPUZhbHNlKToKKyAgICAgICAgIiIiUHJpbnQgdGhlIG1lc3NhZ2Ugb2JqZWN0IHRyZWUgcm9vdGVkIGF0IG1zZyB0byB0aGUgb3V0cHV0IGZpbGUKKyAgICAgICAgc3BlY2lmaWVkIHdoZW4gdGhlIEdlbmVyYXRvciBpbnN0YW5jZSB3YXMgY3JlYXRlZC4KKworICAgICAgICB1bml4ZnJvbSBpcyBhIGZsYWcgdGhhdCBmb3JjZXMgdGhlIHByaW50aW5nIG9mIGEgVW5peCBGcm9tXyBkZWxpbWl0ZXIKKyAgICAgICAgYmVmb3JlIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIG1lc3NhZ2UgdHJlZS4gIElmIHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgICAgICAgIGhhcyBubyBGcm9tXyBkZWxpbWl0ZXIsIGEgYHN0YW5kYXJkJyBvbmUgaXMgY3JhZnRlZC4gIEJ5IGRlZmF1bHQsIHRoaXMKKyAgICAgICAgaXMgRmFsc2UgdG8gaW5oaWJpdCB0aGUgcHJpbnRpbmcgb2YgYW55IEZyb21fIGRlbGltaXRlci4KKworICAgICAgICBOb3RlIHRoYXQgZm9yIHN1Ym9iamVjdHMsIG5vIEZyb21fIGxpbmUgaXMgcHJpbnRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHVuaXhmcm9tOgorICAgICAgICAgICAgdWZyb20gPSBtc2cuZ2V0X3VuaXhmcm9tKCkKKyAgICAgICAgICAgIGlmIG5vdCB1ZnJvbToKKyAgICAgICAgICAgICAgICB1ZnJvbSA9ICdGcm9tIG5vYm9keSAnICsgdGltZS5jdGltZSh0aW1lLnRpbWUoKSkKKyAgICAgICAgICAgIHByaW50KHVmcm9tLCBmaWxlPXNlbGYuX2ZwKQorICAgICAgICBzZWxmLl93cml0ZShtc2cpCisKKyAgICBkZWYgY2xvbmUoc2VsZiwgZnApOgorICAgICAgICAiIiJDbG9uZSB0aGlzIGdlbmVyYXRvciB3aXRoIHRoZSBleGFjdCBzYW1lIG9wdGlvbnMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhmcCwgc2VsZi5fbWFuZ2xlX2Zyb21fLCBzZWxmLl9tYXhoZWFkZXJsZW4pCisKKyAgICAjCisgICAgIyBQcm90ZWN0ZWQgaW50ZXJmYWNlIC0gdW5kb2N1bWVudGVkIDsvCisgICAgIworCisgICAgZGVmIF93cml0ZShzZWxmLCBtc2cpOgorICAgICAgICAjIFdlIGNhbid0IHdyaXRlIHRoZSBoZWFkZXJzIHlldCBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86CisgICAgICAgICMgc2F5IGEgbXVsdGlwYXJ0IG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGJvdW5kYXJ5IHN0cmluZyBzb21ld2hlcmUgaW4KKyAgICAgICAgIyBpdHMgYm9keS4gIFdlJ2QgaGF2ZSB0byBjYWxjdWxhdGUgdGhlIG5ldyBib3VuZGFyeSAvYmVmb3JlLyB3ZSB3cml0ZQorICAgICAgICAjIHRoZSBoZWFkZXJzIHNvIHRoYXQgd2UgY2FuIHdyaXRlIHRoZSBjb3JyZWN0IENvbnRlbnQtVHlwZToKKyAgICAgICAgIyBwYXJhbWV0ZXIuCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgd2F5IHdlIGRvIHRoaXMsIHNvIGFzIHRvIG1ha2UgdGhlIF9oYW5kbGVfKigpIG1ldGhvZHMgc2ltcGxlciwKKyAgICAgICAgIyBpcyB0byBjYWNoZSBhbnkgc3VicGFydCB3cml0ZXMgaW50byBhIFN0cmluZ0lPLiAgVGhlIHdlIHdyaXRlIHRoZQorICAgICAgICAjIGhlYWRlcnMgYW5kIHRoZSBTdHJpbmdJTyBjb250ZW50cy4gIFRoYXQgd2F5LCBzdWJwYXJ0IGhhbmRsZXJzIGNhbgorICAgICAgICAjIERvIFRoZSBSaWdodCBUaGluZywgYW5kIGNhbiBzdGlsbCBtb2RpZnkgdGhlIENvbnRlbnQtVHlwZTogaGVhZGVyIGlmCisgICAgICAgICMgbmVjZXNzYXJ5LgorICAgICAgICBvbGRmcCA9IHNlbGYuX2ZwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2ZwID0gc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgc2VsZi5fZGlzcGF0Y2gobXNnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fZnAgPSBvbGRmcAorICAgICAgICAjIFdyaXRlIHRoZSBoZWFkZXJzLiAgRmlyc3Qgd2Ugc2VlIGlmIHRoZSBtZXNzYWdlIG9iamVjdCB3YW50cyB0bworICAgICAgICAjIGhhbmRsZSB0aGF0IGl0c2VsZi4gIElmIG5vdCwgd2UnbGwgZG8gaXQgZ2VuZXJpY2FsbHkuCisgICAgICAgIG1ldGggPSBnZXRhdHRyKG1zZywgJ193cml0ZV9oZWFkZXJzJywgTm9uZSkKKyAgICAgICAgaWYgbWV0aCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycyhtc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZXRoKHNlbGYpCisgICAgICAgIHNlbGYuX2ZwLndyaXRlKHNmcC5nZXR2YWx1ZSgpKQorCisgICAgZGVmIF9kaXNwYXRjaChzZWxmLCBtc2cpOgorICAgICAgICAjIEdldCB0aGUgQ29udGVudC1UeXBlOiBmb3IgdGhlIG1lc3NhZ2UsIHRoZW4gdHJ5IHRvIGRpc3BhdGNoIHRvCisgICAgICAgICMgc2VsZi5faGFuZGxlXzxtYWludHlwZT5fPHN1YnR5cGU+KCkuICBJZiB0aGVyZSdzIG5vIGhhbmRsZXIgZm9yIHRoZQorICAgICAgICAjIGZ1bGwgTUlNRSB0eXBlLCB0aGVuIGRpc3BhdGNoIHRvIHNlbGYuX2hhbmRsZV88bWFpbnR5cGU+KCkuICBJZgorICAgICAgICAjIHRoYXQncyBtaXNzaW5nIHRvbywgdGhlbiBkaXNwYXRjaCB0byBzZWxmLl93cml0ZUJvZHkoKS4KKyAgICAgICAgbWFpbiA9IG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpCisgICAgICAgIHN1YiA9IG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCkKKyAgICAgICAgc3BlY2lmaWMgPSBVTkRFUlNDT1JFLmpvaW4oKG1haW4sIHN1YikpLnJlcGxhY2UoJy0nLCAnXycpCisgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICdfaGFuZGxlXycgKyBzcGVjaWZpYywgTm9uZSkKKyAgICAgICAgaWYgbWV0aCBpcyBOb25lOgorICAgICAgICAgICAgZ2VuZXJpYyA9IG1haW4ucmVwbGFjZSgnLScsICdfJykKKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICdfaGFuZGxlXycgKyBnZW5lcmljLCBOb25lKQorICAgICAgICAgICAgaWYgbWV0aCBpcyBOb25lOgorICAgICAgICAgICAgICAgIG1ldGggPSBzZWxmLl93cml0ZUJvZHkKKyAgICAgICAgbWV0aChtc2cpCisKKyAgICAjCisgICAgIyBEZWZhdWx0IGhhbmRsZXJzCisgICAgIworCisgICAgZGVmIF93cml0ZV9oZWFkZXJzKHNlbGYsIG1zZyk6CisgICAgICAgIGZvciBoLCB2IGluIG1zZy5pdGVtcygpOgorICAgICAgICAgICAgcHJpbnQoJyVzOicgJSBoLCBlbmQ9JyAnLCBmaWxlPXNlbGYuX2ZwKQorICAgICAgICAgICAgaWYgc2VsZi5fbWF4aGVhZGVybGVuID09IDA6CisgICAgICAgICAgICAgICAgIyBFeHBsaWNpdCBuby13cmFwcGluZworICAgICAgICAgICAgICAgIHByaW50KHYsIGZpbGU9c2VsZi5fZnApCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodiwgSGVhZGVyKToKKyAgICAgICAgICAgICAgICAjIEhlYWRlciBpbnN0YW5jZXMga25vdyB3aGF0IHRvIGRvCisgICAgICAgICAgICAgICAgcHJpbnQodi5lbmNvZGUoKSwgZmlsZT1zZWxmLl9mcCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBIZWFkZXIncyBnb3QgbG90cyBvZiBzbWFydHMsIHNvIHVzZSBpdC4KKyAgICAgICAgICAgICAgICBoZWFkZXIgPSBIZWFkZXIodiwgbWF4bGluZWxlbj1zZWxmLl9tYXhoZWFkZXJsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lPWgsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICAgICAgICAgIHByaW50KGhlYWRlci5lbmNvZGUoKSwgZmlsZT1zZWxmLl9mcCkKKyAgICAgICAgIyBBIGJsYW5rIGxpbmUgYWx3YXlzIHNlcGFyYXRlcyBoZWFkZXJzIGZyb20gYm9keQorICAgICAgICBwcmludChmaWxlPXNlbGYuX2ZwKQorCisgICAgIworICAgICMgSGFuZGxlcnMgZm9yIHdyaXRpbmcgdHlwZXMgYW5kIHN1YnR5cGVzCisgICAgIworCisgICAgZGVmIF9oYW5kbGVfdGV4dChzZWxmLCBtc2cpOgorICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgaWYgcGF5bG9hZCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBheWxvYWQsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdzdHJpbmcgcGF5bG9hZCBleHBlY3RlZDogJXMnICUgdHlwZShwYXlsb2FkKSkKKyAgICAgICAgaWYgc2VsZi5fbWFuZ2xlX2Zyb21fOgorICAgICAgICAgICAgcGF5bG9hZCA9IGZjcmUuc3ViKCc+RnJvbSAnLCBwYXlsb2FkKQorICAgICAgICBzZWxmLl9mcC53cml0ZShwYXlsb2FkKQorCisgICAgIyBEZWZhdWx0IGJvZHkgaGFuZGxlcgorICAgIF93cml0ZUJvZHkgPSBfaGFuZGxlX3RleHQKKworICAgIGRlZiBfaGFuZGxlX211bHRpcGFydChzZWxmLCBtc2cpOgorICAgICAgICAjIFRoZSB0cmljayBoZXJlIGlzIHRvIHdyaXRlIG91dCBlYWNoIHBhcnQgc2VwYXJhdGVseSwgbWVyZ2UgdGhlbSBhbGwKKyAgICAgICAgIyB0b2dldGhlciwgYW5kIHRoZW4gbWFrZSBzdXJlIHRoYXQgdGhlIGJvdW5kYXJ5IHdlJ3ZlIGNob3NlbiBpc24ndAorICAgICAgICAjIHByZXNlbnQgaW4gdGhlIHBheWxvYWQuCisgICAgICAgIG1zZ3RleHRzID0gW10KKyAgICAgICAgc3VicGFydHMgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgICAgICBpZiBzdWJwYXJ0cyBpcyBOb25lOgorICAgICAgICAgICAgc3VicGFydHMgPSBbXQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3VicGFydHMsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgIyBlLmcuIGEgbm9uLXN0cmljdCBwYXJzZSBvZiBhIG1lc3NhZ2Ugd2l0aCBubyBzdGFydGluZyBib3VuZGFyeS4KKyAgICAgICAgICAgIHNlbGYuX2ZwLndyaXRlKHN1YnBhcnRzKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc3VicGFydHMsIGxpc3QpOgorICAgICAgICAgICAgIyBTY2FsYXIgcGF5bG9hZAorICAgICAgICAgICAgc3VicGFydHMgPSBbc3VicGFydHNdCisgICAgICAgIGZvciBwYXJ0IGluIHN1YnBhcnRzOgorICAgICAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIGcgPSBzZWxmLmNsb25lKHMpCisgICAgICAgICAgICBnLmZsYXR0ZW4ocGFydCwgdW5peGZyb209RmFsc2UpCisgICAgICAgICAgICBtc2d0ZXh0cy5hcHBlbmQocy5nZXR2YWx1ZSgpKQorICAgICAgICAjIE5vdyBtYWtlIHN1cmUgdGhlIGJvdW5kYXJ5IHdlJ3ZlIHNlbGVjdGVkIGRvZXNuJ3QgYXBwZWFyIGluIGFueSBvZgorICAgICAgICAjIHRoZSBtZXNzYWdlIHRleHRzLgorICAgICAgICBhbGx0ZXh0ID0gTkwuam9pbihtc2d0ZXh0cykKKyAgICAgICAgIyBCQVc6IFdoYXQgYWJvdXQgYm91bmRhcmllcyB0aGF0IGFyZSB3cmFwcGVkIGluIGRvdWJsZS1xdW90ZXM/CisgICAgICAgIGJvdW5kYXJ5ID0gbXNnLmdldF9ib3VuZGFyeShmYWlsb2JqPV9tYWtlX2JvdW5kYXJ5KGFsbHRleHQpKQorICAgICAgICAjIElmIHdlIGhhZCB0byBjYWxjdWxhdGUgYSBuZXcgYm91bmRhcnkgYmVjYXVzZSB0aGUgYm9keSB0ZXh0CisgICAgICAgICMgY29udGFpbmVkIHRoYXQgc3RyaW5nLCBzZXQgdGhlIG5ldyBib3VuZGFyeS4gIFdlIGRvbid0IGRvIGl0CisgICAgICAgICMgdW5jb25kaXRpb25hbGx5IGJlY2F1c2UsIHdoaWxlIHNldF9ib3VuZGFyeSgpIHByZXNlcnZlcyBvcmRlciwgaXQKKyAgICAgICAgIyBkb2Vzbid0IHByZXNlcnZlIG5ld2xpbmVzL2NvbnRpbnVhdGlvbnMgaW4gaGVhZGVycy4gIFRoaXMgaXMgbm8gYmlnCisgICAgICAgICMgZGVhbCBpbiBwcmFjdGljZSwgYnV0IHR1cm5zIG91dCB0byBiZSBpbmNvbnZlbmllbnQgZm9yIHRoZSB1bml0dGVzdAorICAgICAgICAjIHN1aXRlLgorICAgICAgICBpZiBtc2cuZ2V0X2JvdW5kYXJ5KCkgIT0gYm91bmRhcnk6CisgICAgICAgICAgICBtc2cuc2V0X2JvdW5kYXJ5KGJvdW5kYXJ5KQorICAgICAgICAjIElmIHRoZXJlJ3MgYSBwcmVhbWJsZSwgd3JpdGUgaXQgb3V0LCB3aXRoIGEgdHJhaWxpbmcgQ1JMRgorICAgICAgICBpZiBtc2cucHJlYW1ibGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludChtc2cucHJlYW1ibGUsIGZpbGU9c2VsZi5fZnApCisgICAgICAgICMgZGFzaC1ib3VuZGFyeSB0cmFuc3BvcnQtcGFkZGluZyBDUkxGCisgICAgICAgIHByaW50KCctLScgKyBib3VuZGFyeSwgZmlsZT1zZWxmLl9mcCkKKyAgICAgICAgIyBib2R5LXBhcnQKKyAgICAgICAgaWYgbXNndGV4dHM6CisgICAgICAgICAgICBzZWxmLl9mcC53cml0ZShtc2d0ZXh0cy5wb3AoMCkpCisgICAgICAgICMgKmVuY2Fwc3VsYXRpb24KKyAgICAgICAgIyAtLT4gZGVsaW1pdGVyIHRyYW5zcG9ydC1wYWRkaW5nCisgICAgICAgICMgLS0+IENSTEYgYm9keS1wYXJ0CisgICAgICAgIGZvciBib2R5X3BhcnQgaW4gbXNndGV4dHM6CisgICAgICAgICAgICAjIGRlbGltaXRlciB0cmFuc3BvcnQtcGFkZGluZyBDUkxGCisgICAgICAgICAgICBwcmludCgnXG4tLScgKyBib3VuZGFyeSwgZmlsZT1zZWxmLl9mcCkKKyAgICAgICAgICAgICMgYm9keS1wYXJ0CisgICAgICAgICAgICBzZWxmLl9mcC53cml0ZShib2R5X3BhcnQpCisgICAgICAgICMgY2xvc2UtZGVsaW1pdGVyIHRyYW5zcG9ydC1wYWRkaW5nCisgICAgICAgIHNlbGYuX2ZwLndyaXRlKCdcbi0tJyArIGJvdW5kYXJ5ICsgJy0tJykKKyAgICAgICAgaWYgbXNnLmVwaWxvZ3VlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoZmlsZT1zZWxmLl9mcCkKKyAgICAgICAgICAgIHNlbGYuX2ZwLndyaXRlKG1zZy5lcGlsb2d1ZSkKKworICAgIGRlZiBfaGFuZGxlX21lc3NhZ2VfZGVsaXZlcnlfc3RhdHVzKHNlbGYsIG1zZyk6CisgICAgICAgICMgV2UgY2FuJ3QganVzdCB3cml0ZSB0aGUgaGVhZGVycyBkaXJlY3RseSB0byBzZWxmJ3MgZmlsZSBvYmplY3QKKyAgICAgICAgIyBiZWNhdXNlIHRoaXMgd2lsbCBsZWF2ZSBhbiBleHRyYSBuZXdsaW5lIGJldHdlZW4gdGhlIGxhc3QgaGVhZGVyCisgICAgICAgICMgYmxvY2sgYW5kIHRoZSBib3VuZGFyeS4gIFNpZ2guCisgICAgICAgIGJsb2NrcyA9IFtdCisgICAgICAgIGZvciBwYXJ0IGluIG1zZy5nZXRfcGF5bG9hZCgpOgorICAgICAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIGcgPSBzZWxmLmNsb25lKHMpCisgICAgICAgICAgICBnLmZsYXR0ZW4ocGFydCwgdW5peGZyb209RmFsc2UpCisgICAgICAgICAgICB0ZXh0ID0gcy5nZXR2YWx1ZSgpCisgICAgICAgICAgICBsaW5lcyA9IHRleHQuc3BsaXQoJ1xuJykKKyAgICAgICAgICAgICMgU3RyaXAgb2ZmIHRoZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBlbXB0eSBsaW5lCisgICAgICAgICAgICBpZiBsaW5lcyBhbmQgbGluZXNbLTFdID09ICcnOgorICAgICAgICAgICAgICAgIGJsb2Nrcy5hcHBlbmQoTkwuam9pbihsaW5lc1s6LTFdKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYmxvY2tzLmFwcGVuZCh0ZXh0KQorICAgICAgICAjIE5vdyBqb2luIGFsbCB0aGUgYmxvY2tzIHdpdGggYW4gZW1wdHkgbGluZS4gIFRoaXMgaGFzIHRoZSBsb3ZlbHkKKyAgICAgICAgIyBlZmZlY3Qgb2Ygc2VwYXJhdGluZyBlYWNoIGJsb2NrIHdpdGggYW4gZW1wdHkgbGluZSwgYnV0IG5vdCBhZGRpbmcKKyAgICAgICAgIyBhbiBleHRyYSBvbmUgYWZ0ZXIgdGhlIGxhc3Qgb25lLgorICAgICAgICBzZWxmLl9mcC53cml0ZShOTC5qb2luKGJsb2NrcykpCisKKyAgICBkZWYgX2hhbmRsZV9tZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBzZWxmLmNsb25lKHMpCisgICAgICAgICMgVGhlIHBheWxvYWQgb2YgYSBtZXNzYWdlL3JmYzgyMiBwYXJ0IHNob3VsZCBiZSBhIG11bHRpcGFydCBzZXF1ZW5jZQorICAgICAgICAjIG9mIGxlbmd0aCAxLiAgVGhlIHplcm90aCBlbGVtZW50IG9mIHRoZSBsaXN0IHNob3VsZCBiZSB0aGUgTWVzc2FnZQorICAgICAgICAjIG9iamVjdCBmb3IgdGhlIHN1YnBhcnQuICBFeHRyYWN0IHRoYXQgb2JqZWN0LCBzdHJpbmdpZnkgaXQsIGFuZAorICAgICAgICAjIHdyaXRlIGl0IG91dC4KKyAgICAgICAgZy5mbGF0dGVuKG1zZy5nZXRfcGF5bG9hZCgwKSwgdW5peGZyb209RmFsc2UpCisgICAgICAgIHNlbGYuX2ZwLndyaXRlKHMuZ2V0dmFsdWUoKSkKKworCisMCitfRk1UID0gJ1tOb24tdGV4dCAoJSh0eXBlKXMpIHBhcnQgb2YgbWVzc2FnZSBvbWl0dGVkLCBmaWxlbmFtZSAlKGZpbGVuYW1lKXNdJworCitjbGFzcyBEZWNvZGVkR2VuZXJhdG9yKEdlbmVyYXRvcik6CisgICAgIiIiR2VuZXJhdG9yIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIG1lc3NhZ2UuCisKKyAgICBMaWtlIHRoZSBHZW5lcmF0b3IgYmFzZSBjbGFzcywgZXhjZXB0IHRoYXQgbm9uLXRleHQgcGFydHMgYXJlIHN1YnN0aXR1dGVkCisgICAgd2l0aCBhIGZvcm1hdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXJ0LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXRmcCwgbWFuZ2xlX2Zyb21fPVRydWUsIG1heGhlYWRlcmxlbj03OCwgZm10PU5vbmUpOgorICAgICAgICAiIiJMaWtlIEdlbmVyYXRvci5fX2luaXRfXygpIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgb3B0aW9uYWwKKyAgICAgICAgYXJndW1lbnQgaXMgYWxsb3dlZC4KKworICAgICAgICBXYWxrcyB0aHJvdWdoIGFsbCBzdWJwYXJ0cyBvZiBhIG1lc3NhZ2UuICBJZiB0aGUgc3VicGFydCBpcyBvZiBtYWluCisgICAgICAgIHR5cGUgYHRleHQnLCB0aGVuIGl0IHByaW50cyB0aGUgZGVjb2RlZCBwYXlsb2FkIG9mIHRoZSBzdWJwYXJ0LgorCisgICAgICAgIE90aGVyd2lzZSwgZm10IGlzIGEgZm9ybWF0IHN0cmluZyB0aGF0IGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgbWVzc2FnZQorICAgICAgICBwYXlsb2FkLiAgZm10IGlzIGV4cGFuZGVkIHdpdGggdGhlIGZvbGxvd2luZyBrZXl3b3JkcyAoaW4KKyAgICAgICAgJShrZXl3b3JkKXMgZm9ybWF0KToKKworICAgICAgICB0eXBlICAgICAgIDogRnVsbCBNSU1FIHR5cGUgb2YgdGhlIG5vbi10ZXh0IHBhcnQKKyAgICAgICAgbWFpbnR5cGUgICA6IE1haW4gTUlNRSB0eXBlIG9mIHRoZSBub24tdGV4dCBwYXJ0CisgICAgICAgIHN1YnR5cGUgICAgOiBTdWItTUlNRSB0eXBlIG9mIHRoZSBub24tdGV4dCBwYXJ0CisgICAgICAgIGZpbGVuYW1lICAgOiBGaWxlbmFtZSBvZiB0aGUgbm9uLXRleHQgcGFydAorICAgICAgICBkZXNjcmlwdGlvbjogRGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBub24tdGV4dCBwYXJ0CisgICAgICAgIGVuY29kaW5nICAgOiBDb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIG9mIHRoZSBub24tdGV4dCBwYXJ0CisKKyAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGZtdCBpcyBOb25lLCBtZWFuaW5nCisKKyAgICAgICAgW05vbi10ZXh0ICglKHR5cGUpcykgcGFydCBvZiBtZXNzYWdlIG9taXR0ZWQsIGZpbGVuYW1lICUoZmlsZW5hbWUpc10KKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRvci5fX2luaXRfXyhzZWxmLCBvdXRmcCwgbWFuZ2xlX2Zyb21fLCBtYXhoZWFkZXJsZW4pCisgICAgICAgIGlmIGZtdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fZm10ID0gX0ZNVAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZm10ID0gZm10CisKKyAgICBkZWYgX2Rpc3BhdGNoKHNlbGYsIG1zZyk6CisgICAgICAgIGZvciBwYXJ0IGluIG1zZy53YWxrKCk6CisgICAgICAgICAgICBtYWludHlwZSA9IHBhcnQuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKQorICAgICAgICAgICAgaWYgbWFpbnR5cGUgPT0gJ3RleHQnOgorICAgICAgICAgICAgICAgIHByaW50KHBhcnQuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBmaWxlPXNlbGYpCisgICAgICAgICAgICBlbGlmIG1haW50eXBlID09ICdtdWx0aXBhcnQnOgorICAgICAgICAgICAgICAgICMgSnVzdCBza2lwIHRoaXMKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KHNlbGYuX2ZtdCAlIHsKKyAgICAgICAgICAgICAgICAgICAgJ3R5cGUnICAgICAgIDogcGFydC5nZXRfY29udGVudF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICdtYWludHlwZScgICA6IHBhcnQuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgJ3N1YnR5cGUnICAgIDogcGFydC5nZXRfY29udGVudF9zdWJ0eXBlKCksCisgICAgICAgICAgICAgICAgICAgICdmaWxlbmFtZScgICA6IHBhcnQuZ2V0X2ZpbGVuYW1lKCdbbm8gZmlsZW5hbWVdJyksCisgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHBhcnQuZ2V0KCdDb250ZW50LURlc2NyaXB0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tubyBkZXNjcmlwdGlvbl0nKSwKKyAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJyAgIDogcGFydC5nZXQoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW25vIGVuY29kaW5nXScpLAorICAgICAgICAgICAgICAgICAgICB9LCBmaWxlPXNlbGYpCisKKworDAorIyBIZWxwZXIKK193aWR0aCA9IGxlbihyZXByKHN5cy5tYXhpbnQtMSkpCitfZm10ID0gJyUlMCVkZCcgJSBfd2lkdGgKKworZGVmIF9tYWtlX2JvdW5kYXJ5KHRleHQ9Tm9uZSk6CisgICAgIyBDcmFmdCBhIHJhbmRvbSBib3VuZGFyeS4gIElmIHRleHQgaXMgZ2l2ZW4sIGVuc3VyZSB0aGF0IHRoZSBjaG9zZW4KKyAgICAjIGJvdW5kYXJ5IGRvZXNuJ3QgYXBwZWFyIGluIHRoZSB0ZXh0LgorICAgIHRva2VuID0gcmFuZG9tLnJhbmRyYW5nZShzeXMubWF4aW50KQorICAgIGJvdW5kYXJ5ID0gKCc9JyAqIDE1KSArIChfZm10ICUgdG9rZW4pICsgJz09JworICAgIGlmIHRleHQgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIGJvdW5kYXJ5CisgICAgYiA9IGJvdW5kYXJ5CisgICAgY291bnRlciA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBjcmUgPSByZS5jb21waWxlKCdeLS0nICsgcmUuZXNjYXBlKGIpICsgJygtLSk/JCcsIHJlLk1VTFRJTElORSkKKyAgICAgICAgaWYgbm90IGNyZS5zZWFyY2godGV4dCk6CisgICAgICAgICAgICBicmVhaworICAgICAgICBiID0gYm91bmRhcnkgKyAnLicgKyBzdHIoY291bnRlcikKKyAgICAgICAgY291bnRlciArPSAxCisgICAgcmV0dXJuIGIKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9oZWFkZXIucHkgYi9MaWIvZW1haWwvaGVhZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTdmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvaGVhZGVyLnB5CkBAIC0wLDAgKzEsNTIwIEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmVuIEdlcnR6ZmllbGQsIEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJIZWFkZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZ1bmN0aW9uYWxpdHkuIiIiCisKK19fYWxsX18gPSBbCisgICAgJ0hlYWRlcicsCisgICAgJ2RlY29kZV9oZWFkZXInLAorICAgICdtYWtlX2hlYWRlcicsCisgICAgXQorCitpbXBvcnQgcmUKK2ltcG9ydCBiaW5hc2NpaQorCitpbXBvcnQgZW1haWwucXVvcHJpbWltZQoraW1wb3J0IGVtYWlsLmJhc2U2NG1pbWUKKworZnJvbSBlbWFpbC5lcnJvcnMgaW1wb3J0IEhlYWRlclBhcnNlRXJyb3IKK2Zyb20gZW1haWwuY2hhcnNldCBpbXBvcnQgQ2hhcnNldAorCitOTCA9ICdcbicKK1NQQUNFID0gJyAnCitCU1BBQ0UgPSBiJyAnCitTUEFDRTggPSAnICcgKiA4CitFTVBUWVNUUklORyA9ICcnCisKK01BWExJTkVMRU4gPSA3NgorCitVU0FTQ0lJID0gQ2hhcnNldCgndXMtYXNjaWknKQorVVRGOCA9IENoYXJzZXQoJ3V0Zi04JykKKworIyBNYXRjaCBlbmNvZGVkLXdvcmQgc3RyaW5ncyBpbiB0aGUgZm9ybSA9P2NoYXJzZXQ/cT9IZWxsb19Xb3JsZD89CitlY3JlID0gcmUuY29tcGlsZShyJycnCisgID1cPyAgICAgICAgICAgICAgICAgICAjIGxpdGVyYWwgPT8KKyAgKD9QPGNoYXJzZXQ+W14/XSo/KSAgICMgbm9uLWdyZWVkeSB1cCB0byB0aGUgbmV4dCA/IGlzIHRoZSBjaGFyc2V0CisgIFw/ICAgICAgICAgICAgICAgICAgICAjIGxpdGVyYWwgPworICAoP1A8ZW5jb2Rpbmc+W3FiXSkgICAgIyBlaXRoZXIgYSAicSIgb3IgYSAiYiIsIGNhc2UgaW5zZW5zaXRpdmUKKyAgXD8gICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA/CisgICg/UDxlbmNvZGVkPi4qPykgICAgICAjIG5vbi1ncmVlZHkgdXAgdG8gdGhlIG5leHQgPz0gaXMgdGhlIGVuY29kZWQgc3RyaW5nCisgIFw/PSAgICAgICAgICAgICAgICAgICAjIGxpdGVyYWwgPz0KKyAgKD89WyBcdF18JCkgICAgICAgICAgICMgd2hpdGVzcGFjZSBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgJycnLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSB8IHJlLk1VTFRJTElORSkKKworIyBGaWVsZCBuYW1lIHJlZ2V4cCwgaW5jbHVkaW5nIHRyYWlsaW5nIGNvbG9uLCBidXQgbm90IHNlcGFyYXRpbmcgd2hpdGVzcGFjZSwKKyMgYWNjb3JkaW5nIHRvIFJGQyAyODIyLiAgQ2hhcmFjdGVyIHJhbmdlIGlzIGZyb20gdGlsZGUgdG8gZXhjbGFtYXRpb24gbWFyay4KKyMgRm9yIHVzZSB3aXRoIC5tYXRjaCgpCitmY3JlID0gcmUuY29tcGlsZShyJ1tcMDQxLVwxNzZdKzokJykKKworCisMCisjIEhlbHBlcnMKK19tYXhfYXBwZW5kID0gZW1haWwucXVvcHJpbWltZS5fbWF4X2FwcGVuZAorCisKKwwKK2RlZiBkZWNvZGVfaGVhZGVyKGhlYWRlcik6CisgICAgIiIiRGVjb2RlIGEgbWVzc2FnZSBoZWFkZXIgdmFsdWUgd2l0aG91dCBjb252ZXJ0aW5nIGNoYXJzZXQuCisKKyAgICBSZXR1cm5zIGEgbGlzdCBvZiAoc3RyaW5nLCBjaGFyc2V0KSBwYWlycyBjb250YWluaW5nIGVhY2ggb2YgdGhlIGRlY29kZWQKKyAgICBwYXJ0cyBvZiB0aGUgaGVhZGVyLiAgQ2hhcnNldCBpcyBOb25lIGZvciBub24tZW5jb2RlZCBwYXJ0cyBvZiB0aGUgaGVhZGVyLAorICAgIG90aGVyd2lzZSBhIGxvd2VyLWNhc2Ugc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBzZXQKKyAgICBzcGVjaWZpZWQgaW4gdGhlIGVuY29kZWQgc3RyaW5nLgorCisgICAgQW4gZW1haWwuRXJyb3JzLkhlYWRlclBhcnNlRXJyb3IgbWF5IGJlIHJhaXNlZCB3aGVuIGNlcnRhaW4gZGVjb2RpbmcgZXJyb3IKKyAgICBvY2N1cnMgKGUuZy4gYSBiYXNlNjQgZGVjb2RpbmcgZXhjZXB0aW9uKS4KKyAgICAiIiIKKyAgICAjIElmIG5vIGVuY29kaW5nLCBqdXN0IHJldHVybiB0aGUgaGVhZGVyIHdpdGggbm8gY2hhcnNldC4KKyAgICBpZiBub3QgZWNyZS5zZWFyY2goaGVhZGVyKToKKyAgICAgICAgcmV0dXJuIFsoaGVhZGVyLCBOb25lKV0KKyAgICAjIEZpcnN0IHN0ZXAgaXMgdG8gcGFyc2UgYWxsIHRoZSBlbmNvZGVkIHBhcnRzIGludG8gdHJpcGxldHMgb2YgdGhlIGZvcm0KKyAgICAjIChlbmNvZGVkX3N0cmluZywgZW5jb2RpbmcsIGNoYXJzZXQpLiAgRm9yIHVuZW5jb2RlZCBzdHJpbmdzLCB0aGUgbGFzdAorICAgICMgdHdvIHBhcnRzIHdpbGwgYmUgTm9uZS4KKyAgICB3b3JkcyA9IFtdCisgICAgZm9yIGxpbmUgaW4gaGVhZGVyLnNwbGl0bGluZXMoKToKKyAgICAgICAgcGFydHMgPSBlY3JlLnNwbGl0KGxpbmUpCisgICAgICAgIHdoaWxlIHBhcnRzOgorICAgICAgICAgICAgdW5lbmNvZGVkID0gcGFydHMucG9wKDApLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIHVuZW5jb2RlZDoKKyAgICAgICAgICAgICAgICB3b3Jkcy5hcHBlbmQoKHVuZW5jb2RlZCwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICBpZiBwYXJ0czoKKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gcGFydHMucG9wKDApLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHBhcnRzLnBvcCgwKS5sb3dlcigpCisgICAgICAgICAgICAgICAgZW5jb2RlZCA9IHBhcnRzLnBvcCgwKQorICAgICAgICAgICAgICAgIHdvcmRzLmFwcGVuZCgoZW5jb2RlZCwgZW5jb2RpbmcsIGNoYXJzZXQpKQorICAgICMgVGhlIG5leHQgc3RlcCBpcyB0byBkZWNvZGUgZWFjaCBlbmNvZGVkIHdvcmQgYnkgYXBwbHlpbmcgdGhlIHJldmVyc2UKKyAgICAjIGJhc2U2NCBvciBxdW9wcmkgdHJhbnNmb3JtYXRpb24uICBkZWNvZGVkX3dvcmRzIGlzIG5vdyBhIGxpc3Qgb2YgdGhlCisgICAgIyBmb3JtIChkZWNvZGVkX3dvcmQsIGNoYXJzZXQpLgorICAgIGRlY29kZWRfd29yZHMgPSBbXQorICAgIGZvciBlbmNvZGVkX3N0cmluZywgZW5jb2RpbmcsIGNoYXJzZXQgaW4gd29yZHM6CisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICAjIFRoaXMgaXMgYW4gdW5lbmNvZGVkIHdvcmQuCisgICAgICAgICAgICBkZWNvZGVkX3dvcmRzLmFwcGVuZCgoZW5jb2RlZF9zdHJpbmcsIGNoYXJzZXQpKQorICAgICAgICBlbGlmIGVuY29kaW5nID09ICdxJzoKKyAgICAgICAgICAgIHdvcmQgPSBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9kZWNvZGUoZW5jb2RlZF9zdHJpbmcpCisgICAgICAgICAgICBkZWNvZGVkX3dvcmRzLmFwcGVuZCgod29yZCwgY2hhcnNldCkpCisgICAgICAgIGVsaWYgZW5jb2RpbmcgPT0gJ2InOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdvcmQgPSBlbWFpbC5iYXNlNjRtaW1lLmRlY29kZShlbmNvZGVkX3N0cmluZykKKyAgICAgICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBIZWFkZXJQYXJzZUVycm9yKCdCYXNlNjQgZGVjb2RpbmcgZXJyb3InKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWNvZGVkX3dvcmRzLmFwcGVuZCgod29yZCwgY2hhcnNldCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5leHBlY3RlZCBlbmNvZGluZzogJyArIGVuY29kaW5nKQorICAgICMgTm93IGNvbnZlcnQgYWxsIHdvcmRzIHRvIGJ5dGVzIGFuZCBjb2xsYXBzZSBjb25zZWN1dGl2ZSBydW5zIG9mCisgICAgIyBzaW1pbGFybHkgZW5jb2RlZCB3b3Jkcy4KKyAgICBjb2xsYXBzZWQgPSBbXQorICAgIGxhc3Rfd29yZCA9IGxhc3RfY2hhcnNldCA9IE5vbmUKKyAgICBmb3Igd29yZCwgY2hhcnNldCBpbiBkZWNvZGVkX3dvcmRzOgorICAgICAgICBpZiBpc2luc3RhbmNlKHdvcmQsIHN0cik6CisgICAgICAgICAgICB3b3JkID0gYnl0ZXMob3JkKGMpIGZvciBjIGluIHdvcmQpCisgICAgICAgIGlmIGxhc3Rfd29yZCBpcyBOb25lOgorICAgICAgICAgICAgbGFzdF93b3JkID0gd29yZAorICAgICAgICAgICAgbGFzdF9jaGFyc2V0ID0gY2hhcnNldAorICAgICAgICBlbGlmIGNoYXJzZXQgIT0gbGFzdF9jaGFyc2V0OgorICAgICAgICAgICAgY29sbGFwc2VkLmFwcGVuZCgobGFzdF93b3JkLCBsYXN0X2NoYXJzZXQpKQorICAgICAgICAgICAgbGFzdF93b3JkID0gd29yZAorICAgICAgICAgICAgbGFzdF9jaGFyc2V0ID0gY2hhcnNldAorICAgICAgICBlbGlmIGxhc3RfY2hhcnNldCBpcyBOb25lOgorICAgICAgICAgICAgbGFzdF93b3JkICs9IEJTUEFDRSArIHdvcmQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxhc3Rfd29yZCArPSB3b3JkCisgICAgY29sbGFwc2VkLmFwcGVuZCgobGFzdF93b3JkLCBsYXN0X2NoYXJzZXQpKQorICAgIHJldHVybiBjb2xsYXBzZWQKKworCisMCitkZWYgbWFrZV9oZWFkZXIoZGVjb2RlZF9zZXEsIG1heGxpbmVsZW49Tm9uZSwgaGVhZGVyX25hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9JyAnKToKKyAgICAiIiJDcmVhdGUgYSBIZWFkZXIgZnJvbSBhIHNlcXVlbmNlIG9mIHBhaXJzIGFzIHJldHVybmVkIGJ5IGRlY29kZV9oZWFkZXIoKQorCisgICAgZGVjb2RlX2hlYWRlcigpIHRha2VzIGEgaGVhZGVyIHZhbHVlIHN0cmluZyBhbmQgcmV0dXJucyBhIHNlcXVlbmNlIG9mCisgICAgcGFpcnMgb2YgdGhlIGZvcm1hdCAoZGVjb2RlZF9zdHJpbmcsIGNoYXJzZXQpIHdoZXJlIGNoYXJzZXQgaXMgdGhlIHN0cmluZworICAgIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBzZXQuCisKKyAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIG9uZSBvZiB0aG9zZSBzZXF1ZW5jZSBvZiBwYWlycyBhbmQgcmV0dXJucyBhIEhlYWRlcgorICAgIGluc3RhbmNlLiAgT3B0aW9uYWwgbWF4bGluZWxlbiwgaGVhZGVyX25hbWUsIGFuZCBjb250aW51YXRpb25fd3MgYXJlIGFzIGluCisgICAgdGhlIEhlYWRlciBjb25zdHJ1Y3Rvci4KKyAgICAiIiIKKyAgICBoID0gSGVhZGVyKG1heGxpbmVsZW49bWF4bGluZWxlbiwgaGVhZGVyX25hbWU9aGVhZGVyX25hbWUsCisgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9Y29udGludWF0aW9uX3dzKQorICAgIGZvciBzLCBjaGFyc2V0IGluIGRlY29kZWRfc2VxOgorICAgICAgICAjIE5vbmUgbWVhbnMgdXMtYXNjaWkgYnV0IHdlIGNhbiBzaW1wbHkgcGFzcyBpdCBvbiB0byBoLmFwcGVuZCgpCisgICAgICAgIGlmIGNoYXJzZXQgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKGNoYXJzZXQsIENoYXJzZXQpOgorICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgaC5hcHBlbmQocywgY2hhcnNldCkKKyAgICByZXR1cm4gaAorCisKKwwKK2NsYXNzIEhlYWRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcz1Ob25lLCBjaGFyc2V0PU5vbmUsCisgICAgICAgICAgICAgICAgIG1heGxpbmVsZW49Tm9uZSwgaGVhZGVyX25hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPScgJywgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgTUlNRS1jb21wbGlhbnQgaGVhZGVyIHRoYXQgY2FuIGNvbnRhaW4gbWFueSBjaGFyYWN0ZXIgc2V0cy4KKworICAgICAgICBPcHRpb25hbCBzIGlzIHRoZSBpbml0aWFsIGhlYWRlciB2YWx1ZS4gIElmIE5vbmUsIHRoZSBpbml0aWFsIGhlYWRlcgorICAgICAgICB2YWx1ZSBpcyBub3Qgc2V0LiAgWW91IGNhbiBsYXRlciBhcHBlbmQgdG8gdGhlIGhlYWRlciB3aXRoIC5hcHBlbmQoKQorICAgICAgICBtZXRob2QgY2FsbHMuICBzIG1heSBiZSBhIGJ5dGUgc3RyaW5nIG9yIGEgVW5pY29kZSBzdHJpbmcsIGJ1dCBzZWUgdGhlCisgICAgICAgIC5hcHBlbmQoKSBkb2N1bWVudGF0aW9uIGZvciBzZW1hbnRpY3MuCisKKyAgICAgICAgT3B0aW9uYWwgY2hhcnNldCBzZXJ2ZXMgdHdvIHB1cnBvc2VzOiBpdCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGUKKyAgICAgICAgY2hhcnNldCBhcmd1bWVudCB0byB0aGUgLmFwcGVuZCgpIG1ldGhvZC4gIEl0IGFsc28gc2V0cyB0aGUgZGVmYXVsdAorICAgICAgICBjaGFyYWN0ZXIgc2V0IGZvciBhbGwgc3Vic2VxdWVudCAuYXBwZW5kKCkgY2FsbHMgdGhhdCBvbWl0IHRoZSBjaGFyc2V0CisgICAgICAgIGFyZ3VtZW50LiAgSWYgY2hhcnNldCBpcyBub3QgcHJvdmlkZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCB0aGUgdXMtYXNjaWkKKyAgICAgICAgY2hhcnNldCBpcyB1c2VkIGJvdGggYXMgcydzIGluaXRpYWwgY2hhcnNldCBhbmQgYXMgdGhlIGRlZmF1bHQgZm9yCisgICAgICAgIHN1YnNlcXVlbnQgLmFwcGVuZCgpIGNhbGxzLgorCisgICAgICAgIFRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGNhbiBiZSBzcGVjaWZpZWQgZXhwbGljaXQgdmlhIG1heGxpbmVsZW4uICBGb3IKKyAgICAgICAgc3BsaXR0aW5nIHRoZSBmaXJzdCBsaW5lIHRvIGEgc2hvcnRlciB2YWx1ZSAodG8gYWNjb3VudCBmb3IgdGhlIGZpZWxkCisgICAgICAgIGhlYWRlciB3aGljaCBpc24ndCBpbmNsdWRlZCBpbiBzLCBlLmcuIGBTdWJqZWN0JykgcGFzcyBpbiB0aGUgbmFtZSBvZgorICAgICAgICB0aGUgZmllbGQgaW4gaGVhZGVyX25hbWUuICBUaGUgZGVmYXVsdCBtYXhsaW5lbGVuIGlzIDc2LgorCisgICAgICAgIGNvbnRpbnVhdGlvbl93cyBtdXN0IGJlIFJGQyAyODIyIGNvbXBsaWFudCBmb2xkaW5nIHdoaXRlc3BhY2UgKHVzdWFsbHkKKyAgICAgICAgZWl0aGVyIGEgc3BhY2Ugb3IgYSBoYXJkIHRhYikgd2hpY2ggd2lsbCBiZSBwcmVwZW5kZWQgdG8gY29udGludWF0aW9uCisgICAgICAgIGxpbmVzLgorCisgICAgICAgIGVycm9ycyBpcyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgLmFwcGVuZCgpIGNhbGwuCisgICAgICAgICIiIgorICAgICAgICBpZiBjaGFyc2V0IGlzIE5vbmU6CisgICAgICAgICAgICBjaGFyc2V0ID0gVVNBU0NJSQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGNoYXJzZXQsIENoYXJzZXQpOgorICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgc2VsZi5fY2hhcnNldCA9IGNoYXJzZXQKKyAgICAgICAgc2VsZi5fY29udGludWF0aW9uX3dzID0gY29udGludWF0aW9uX3dzCisgICAgICAgIHNlbGYuX2NodW5rcyA9IFtdCisgICAgICAgIGlmIHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFwcGVuZChzLCBjaGFyc2V0LCBlcnJvcnMpCisgICAgICAgIGlmIG1heGxpbmVsZW4gaXMgTm9uZToKKyAgICAgICAgICAgIG1heGxpbmVsZW4gPSBNQVhMSU5FTEVOCisgICAgICAgIHNlbGYuX21heGxpbmVsZW4gPSBtYXhsaW5lbGVuCisgICAgICAgIGlmIGhlYWRlcl9uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9oZWFkZXJsZW4gPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRha2UgdGhlIHNlcGFyYXRpbmcgY29sb24gYW5kIHNwYWNlIGludG8gYWNjb3VudC4KKyAgICAgICAgICAgIHNlbGYuX2hlYWRlcmxlbiA9IGxlbihoZWFkZXJfbmFtZSkgKyAyCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGhlYWRlci4iIiIKKyAgICAgICAgdWNodW5rcyA9IFtdCisgICAgICAgIGxhc3RjcyA9IE5vbmUKKyAgICAgICAgZm9yIHMsIGNoYXJzZXQgaW4gc2VsZi5fY2h1bmtzOgorICAgICAgICAgICAgIyBXZSBtdXN0IHByZXNlcnZlIHNwYWNlcyBiZXR3ZWVuIGVuY29kZWQgYW5kIG5vbi1lbmNvZGVkIHdvcmQKKyAgICAgICAgICAgICMgYm91bmRhcmllcywgd2hpY2ggbWVhbnMgZm9yIHVzIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2Ugd2hlbiB3ZSBnbworICAgICAgICAgICAgIyBmcm9tIGEgY2hhcnNldCB0byBOb25lL3VzLWFzY2lpLCBvciBmcm9tIE5vbmUvdXMtYXNjaWkgdG8gYQorICAgICAgICAgICAgIyBjaGFyc2V0LiAgT25seSBkbyB0aGlzIGZvciB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGNodW5rcy4KKyAgICAgICAgICAgIG5leHRjcyA9IGNoYXJzZXQKKyAgICAgICAgICAgIGlmIHVjaHVua3M6CisgICAgICAgICAgICAgICAgaWYgbGFzdGNzIG5vdCBpbiAoTm9uZSwgJ3VzLWFzY2lpJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5leHRjcyBpbiAoTm9uZSwgJ3VzLWFzY2lpJyk6CisgICAgICAgICAgICAgICAgICAgICAgICB1Y2h1bmtzLmFwcGVuZChTUEFDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRjcyA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbGlmIG5leHRjcyBub3QgaW4gKE5vbmUsICd1cy1hc2NpaScpOgorICAgICAgICAgICAgICAgICAgICB1Y2h1bmtzLmFwcGVuZChTUEFDRSkKKyAgICAgICAgICAgIGxhc3RjcyA9IG5leHRjcworICAgICAgICAgICAgdWNodW5rcy5hcHBlbmQocykKKyAgICAgICAgcmV0dXJuIEVNUFRZU1RSSU5HLmpvaW4odWNodW5rcykKKworICAgICMgUmljaCBjb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgZXF1YWxpdHkgb25seS4gIEJBVzogZG9lcyBpdCBtYWtlIHNlbnNlIHRvCisgICAgIyBoYXZlIG9yIGV4cGxpY2l0bHkgZGlzYWJsZSA8LCA8PSwgPiwgPj0gb3BlcmF0b3JzPworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIG90aGVyIG1heSBiZSBhIEhlYWRlciBvciBhIHN0cmluZy4gIEJvdGggYXJlIGZpbmUgc28gY29lcmNlCisgICAgICAgICMgb3Vyc2VsdmVzIHRvIGEgc3RyaW5nLCBzd2FwIHRoZSBhcmdzIGFuZCBkbyBhbm90aGVyIGNvbXBhcmlzb24uCisgICAgICAgIHJldHVybiBvdGhlciA9PSBzZWxmLmVuY29kZSgpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIHMsIGNoYXJzZXQ9Tm9uZSwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgIiIiQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBNSU1FIGhlYWRlci4KKworICAgICAgICBPcHRpb25hbCBjaGFyc2V0LCBpZiBnaXZlbiwgc2hvdWxkIGJlIGEgQ2hhcnNldCBpbnN0YW5jZSBvciB0aGUgbmFtZQorICAgICAgICBvZiBhIGNoYXJhY3RlciBzZXQgKHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgQ2hhcnNldCBpbnN0YW5jZSkuICBBCisgICAgICAgIHZhbHVlIG9mIE5vbmUgKHRoZSBkZWZhdWx0KSBtZWFucyB0aGF0IHRoZSBjaGFyc2V0IGdpdmVuIGluIHRoZQorICAgICAgICBjb25zdHJ1Y3RvciBpcyB1c2VkLgorCisgICAgICAgIHMgbWF5IGJlIGEgYnl0ZSBzdHJpbmcgb3IgYSBVbmljb2RlIHN0cmluZy4gIElmIGl0IGlzIGEgYnl0ZSBzdHJpbmcKKyAgICAgICAgKGkuZS4gaXNpbnN0YW5jZShzLCBzdHIpIGlzIHRydWUpLCB0aGVuIGNoYXJzZXQgaXMgdGhlIGVuY29kaW5nIG9mCisgICAgICAgIHRoYXQgYnl0ZSBzdHJpbmcsIGFuZCBhIFVuaWNvZGVFcnJvciB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgc3RyaW5nCisgICAgICAgIGNhbm5vdCBiZSBkZWNvZGVkIHdpdGggdGhhdCBjaGFyc2V0LiAgSWYgcyBpcyBhIFVuaWNvZGUgc3RyaW5nLCB0aGVuCisgICAgICAgIGNoYXJzZXQgaXMgYSBoaW50IHNwZWNpZnlpbmcgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGNoYXJhY3RlcnMgaW4KKyAgICAgICAgdGhlIHN0cmluZy4gIEluIHRoaXMgY2FzZSwgd2hlbiBwcm9kdWNpbmcgYW4gUkZDIDI4MjIgY29tcGxpYW50IGhlYWRlcgorICAgICAgICB1c2luZyBSRkMgMjA0NyBydWxlcywgdGhlIFVuaWNvZGUgc3RyaW5nIHdpbGwgYmUgZW5jb2RlZCB1c2luZyB0aGUKKyAgICAgICAgZm9sbG93aW5nIGNoYXJzZXRzIGluIG9yZGVyOiB1cy1hc2NpaSwgdGhlIGNoYXJzZXQgaGludCwgdXRmLTguICBUaGUKKyAgICAgICAgZmlyc3QgY2hhcmFjdGVyIHNldCBub3QgdG8gcHJvdm9rZSBhIFVuaWNvZGVFcnJvciBpcyB1c2VkLgorCisgICAgICAgIE9wdGlvbmFsIGBlcnJvcnMnIGlzIHBhc3NlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYW55IHVuaWNvZGUoKSBvcgorICAgICAgICB1c3RyLmVuY29kZSgpIGNhbGwuCisgICAgICAgICIiIgorICAgICAgICBpZiBjaGFyc2V0IGlzIE5vbmU6CisgICAgICAgICAgICBjaGFyc2V0ID0gc2VsZi5fY2hhcnNldAorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGNoYXJzZXQsIENoYXJzZXQpOgorICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBzdHIpOgorICAgICAgICAgICAgIyBDb252ZXJ0IHRoZSBzdHJpbmcgZnJvbSB0aGUgaW5wdXQgY2hhcmFjdGVyIHNldCB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAjIGNoYXJhY3RlciBzZXQgYW5kIHN0b3JlIHRoZSByZXN1bHRpbmcgYnl0ZXMgYW5kIHRoZSBjaGFyc2V0IGZvcgorICAgICAgICAgICAgIyBjb21wb3NpdGlvbiBsYXRlci4KKyAgICAgICAgICAgIGlucHV0X2NoYXJzZXQgPSBjaGFyc2V0LmlucHV0X2NvZGVjIG9yICd1cy1hc2NpaScKKyAgICAgICAgICAgIGlucHV0X2J5dGVzID0gcy5lbmNvZGUoaW5wdXRfY2hhcnNldCwgZXJyb3JzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXZSBhbHJlYWR5IGhhdmUgdGhlIGJ5dGVzIHdlIHdpbGwgc3RvcmUgaW50ZXJuYWxseS4KKyAgICAgICAgICAgIGlucHV0X2J5dGVzID0gcworICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBieXRlcyB3ZSdyZSBzdG9yaW5nIGNhbiBiZSBkZWNvZGVkIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgIyBjaGFyYWN0ZXIgc2V0LCBvdGhlcndpc2UgYW4gZWFybHkgZXJyb3IgaXMgdGhyb3duLgorICAgICAgICBvdXRwdXRfY2hhcnNldCA9IGNoYXJzZXQub3V0cHV0X2NvZGVjIG9yICd1cy1hc2NpaScKKyAgICAgICAgb3V0cHV0X3N0cmluZyA9IGlucHV0X2J5dGVzLmRlY29kZShvdXRwdXRfY2hhcnNldCwgZXJyb3JzKQorICAgICAgICBzZWxmLl9jaHVua3MuYXBwZW5kKChvdXRwdXRfc3RyaW5nLCBjaGFyc2V0KSkKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgc3BsaXRjaGFycz0nOywgXHQnKToKKyAgICAgICAgIiIiRW5jb2RlIGEgbWVzc2FnZSBoZWFkZXIgaW50byBhbiBSRkMtY29tcGxpYW50IGZvcm1hdC4KKworICAgICAgICBUaGVyZSBhcmUgbWFueSBpc3N1ZXMgaW52b2x2ZWQgaW4gY29udmVydGluZyBhIGdpdmVuIHN0cmluZyBmb3IgdXNlIGluCisgICAgICAgIGFuIGVtYWlsIGhlYWRlci4gIE9ubHkgY2VydGFpbiBjaGFyYWN0ZXIgc2V0cyBhcmUgcmVhZGFibGUgaW4gbW9zdAorICAgICAgICBlbWFpbCBjbGllbnRzLCBhbmQgYXMgaGVhZGVyIHN0cmluZ3MgY2FuIG9ubHkgY29udGFpbiBhIHN1YnNldCBvZgorICAgICAgICA3LWJpdCBBU0NJSSwgY2FyZSBtdXN0IGJlIHRha2VuIHRvIHByb3Blcmx5IGNvbnZlcnQgYW5kIGVuY29kZSAod2l0aAorICAgICAgICBCYXNlNjQgb3IgcXVvdGVkLXByaW50YWJsZSkgaGVhZGVyIHN0cmluZ3MuICBJbiBhZGRpdGlvbiwgdGhlcmUgaXMgYQorICAgICAgICA3NS1jaGFyYWN0ZXIgbGVuZ3RoIGxpbWl0IG9uIGFueSBnaXZlbiBlbmNvZGVkIGhlYWRlciBmaWVsZCwgc28KKyAgICAgICAgbGluZS13cmFwcGluZyBtdXN0IGJlIHBlcmZvcm1lZCwgZXZlbiB3aXRoIGRvdWJsZS1ieXRlIGNoYXJhY3RlciBzZXRzLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZG8gaXRzIGJlc3QgdG8gY29udmVydCB0aGUgc3RyaW5nIHRvIHRoZSBjb3JyZWN0CisgICAgICAgIGNoYXJhY3RlciBzZXQgdXNlZCBpbiBlbWFpbCwgYW5kIGVuY29kZSBhbmQgbGluZSB3cmFwIGl0IHNhZmVseSB3aXRoCisgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBzY2hlbWUgZm9yIHRoYXQgY2hhcmFjdGVyIHNldC4KKworICAgICAgICBJZiB0aGUgZ2l2ZW4gY2hhcnNldCBpcyBub3Qga25vd24gb3IgYW4gZXJyb3Igb2NjdXJzIGR1cmluZworICAgICAgICBjb252ZXJzaW9uLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBoZWFkZXIgdW50b3VjaGVkLgorCisgICAgICAgIE9wdGlvbmFsIHNwbGl0Y2hhcnMgaXMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIHNwbGl0IGxvbmcKKyAgICAgICAgQVNDSUkgbGluZXMgb24sIGluIHJvdWdoIHN1cHBvcnQgb2YgUkZDIDI4MjIncyBgaGlnaGVzdCBsZXZlbAorICAgICAgICBzeW50YWN0aWMgYnJlYWtzJy4gIFRoaXMgZG9lc24ndCBhZmZlY3QgUkZDIDIwNDcgZW5jb2RlZCBsaW5lcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX25vcm1hbGl6ZSgpCisgICAgICAgIGZvcm1hdHRlciA9IF9WYWx1ZUZvcm1hdHRlcihzZWxmLl9oZWFkZXJsZW4sIHNlbGYuX21heGxpbmVsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb250aW51YXRpb25fd3MsIHNwbGl0Y2hhcnMpCisgICAgICAgIGZvciBzdHJpbmcsIGNoYXJzZXQgaW4gc2VsZi5fY2h1bmtzOgorICAgICAgICAgICAgbGluZXMgPSBzdHJpbmcuc3BsaXRsaW5lcygpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICBmb3JtYXR0ZXIuZmVlZChsaW5lLCBjaGFyc2V0KQorICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lcykgPiAxOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXIubmV3bGluZSgpCisgICAgICAgIHJldHVybiBzdHIoZm9ybWF0dGVyKQorCisgICAgZGVmIF9ub3JtYWxpemUoc2VsZik6CisgICAgICAgICMgTm9ybWFsaXplIHRoZSBjaHVua3Mgc28gdGhhdCBhbGwgcnVucyBvZiBpZGVudGljYWwgY2hhcnNldHMgZ2V0CisgICAgICAgICMgY29sbGFwc2VkIGludG8gYSBzaW5nbGUgdW5pY29kZSBzdHJpbmcuICBZb3UgbmVlZCBhIHNwYWNlIGJldHdlZW4KKyAgICAgICAgIyBlbmNvZGVkIHdvcmRzLCBvciBiZXR3ZWVuIGVuY29kZWQgYW5kIHVuZW5jb2RlZCB3b3Jkcy4KKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgbGFzdF9jaGFyc2V0ID0gTm9uZQorICAgICAgICBsYXN0X2NodW5rID0gW10KKyAgICAgICAgZm9yIHN0cmluZywgY2hhcnNldCBpbiBzZWxmLl9jaHVua3M6CisgICAgICAgICAgICBpZiBjaGFyc2V0ID09IGxhc3RfY2hhcnNldDoKKyAgICAgICAgICAgICAgICBsYXN0X2NodW5rLmFwcGVuZChzdHJpbmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGxhc3RfY2hhcnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCgoU1BBQ0Uuam9pbihsYXN0X2NodW5rKSwgbGFzdF9jaGFyc2V0KSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGFzdF9jaGFyc2V0ICE9IFVTQVNDSUkgb3IgY2hhcnNldCAhPSBVU0FTQ0lJOgorICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCgoJyAnLCBVU0FTQ0lJKSkKKyAgICAgICAgICAgICAgICBsYXN0X2NodW5rID0gW3N0cmluZ10KKyAgICAgICAgICAgICAgICBsYXN0X2NoYXJzZXQgPSBjaGFyc2V0CisgICAgICAgIGlmIGxhc3RfY2h1bms6CisgICAgICAgICAgICBjaHVua3MuYXBwZW5kKChTUEFDRS5qb2luKGxhc3RfY2h1bmspLCBsYXN0X2NoYXJzZXQpKQorICAgICAgICBzZWxmLl9jaHVua3MgPSBjaHVua3MKKworCisMCitjbGFzcyBfVmFsdWVGb3JtYXR0ZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcmxlbiwgbWF4bGVuLCBjb250aW51YXRpb25fd3MsIHNwbGl0Y2hhcnMpOgorICAgICAgICBzZWxmLl9tYXhsZW4gPSBtYXhsZW4KKyAgICAgICAgc2VsZi5fY29udGludWF0aW9uX3dzID0gY29udGludWF0aW9uX3dzCisgICAgICAgIHNlbGYuX2NvbnRpbnVhdGlvbl93c19sZW4gPSBsZW4oY29udGludWF0aW9uX3dzLnJlcGxhY2UoJ1x0JywgU1BBQ0U4KSkKKyAgICAgICAgc2VsZi5fc3BsaXRjaGFycyA9IHNwbGl0Y2hhcnMKKyAgICAgICAgc2VsZi5fbGluZXMgPSBbXQorICAgICAgICBzZWxmLl9jdXJyZW50X2xpbmUgPSBfQWNjdW11bGF0b3IoaGVhZGVybGVuKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgIHJldHVybiBOTC5qb2luKHNlbGYuX2xpbmVzKQorCisgICAgZGVmIG5ld2xpbmUoc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl9jdXJyZW50X2xpbmUpID4gMDoKKyAgICAgICAgICAgIHNlbGYuX2xpbmVzLmFwcGVuZChzdHIoc2VsZi5fY3VycmVudF9saW5lKSkKKyAgICAgICAgc2VsZi5fY3VycmVudF9saW5lLnJlc2V0KCkKKworICAgIGRlZiBmZWVkKHNlbGYsIHN0cmluZywgY2hhcnNldCk6CisgICAgICAgICMgSWYgdGhlIHN0cmluZyBpdHNlbGYgZml0cyBvbiB0aGUgY3VycmVudCBsaW5lIGluIGl0cyBlbmNvZGVkIGZvcm1hdCwKKyAgICAgICAgIyB0aGVuIGFkZCBpdCBub3cgYW5kIGJlIGRvbmUgd2l0aCBpdC4KKyAgICAgICAgZW5jb2RlZF9zdHJpbmcgPSBjaGFyc2V0LmhlYWRlcl9lbmNvZGUoc3RyaW5nKQorICAgICAgICBpZiBsZW4oZW5jb2RlZF9zdHJpbmcpICsgbGVuKHNlbGYuX2N1cnJlbnRfbGluZSkgPD0gc2VsZi5fbWF4bGVuOgorICAgICAgICAgICAgc2VsZi5fY3VycmVudF9saW5lLnB1c2goZW5jb2RlZF9zdHJpbmcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBBdHRlbXB0IHRvIHNwbGl0IHRoZSBsaW5lIGF0IHRoZSBoaWdoZXN0LWxldmVsIHN5bnRhY3RpYyBicmVhaworICAgICAgICAjIHBvc3NpYmxlLiAgTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBsb3Qgb2Ygc21hcnRzIGFib3V0IGZpZWxkCisgICAgICAgICMgc3ludGF4OyB3ZSBqdXN0IHRyeSB0byBicmVhayBvbiBzZW1pLWNvbG9ucywgdGhlbiBjb21tYXMsIHRoZW4KKyAgICAgICAgIyB3aGl0ZXNwYWNlLiAgRXZlbnR1YWxseSwgd2UnbGwgYWxsb3cgdGhpcyB0byBiZSBwbHVnZ2FibGUuCisgICAgICAgIGZvciBjaCBpbiBzZWxmLl9zcGxpdGNoYXJzOgorICAgICAgICAgICAgaWYgY2ggaW4gc3RyaW5nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGNhbid0IHNwbGl0IHRoZSBzdHJpbmcgdG8gZml0IG9uIHRoZSBjdXJyZW50IGxpbmUsIHNvIGp1c3QKKyAgICAgICAgICAgICMgcHV0IGl0IG9uIGEgbGluZSBieSBpdHNlbGYuCisgICAgICAgICAgICBzZWxmLl9saW5lcy5hcHBlbmQoc3RyKHNlbGYuX2N1cnJlbnRfbGluZSkpCisgICAgICAgICAgICBzZWxmLl9jdXJyZW50X2xpbmUucmVzZXQoc2VsZi5fY29udGludWF0aW9uX3dzKQorICAgICAgICAgICAgc2VsZi5fY3VycmVudF9saW5lLnB1c2goZW5jb2RlZF9zdHJpbmcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fc3BsaXRlcmF0ZShzdHJpbmcsIGNoLCBjaGFyc2V0KQorCisgICAgZGVmIF9zcGxpdGVyYXRlKHNlbGYsIHN0cmluZywgY2gsIGNoYXJzZXQpOgorICAgICAgICBob2xkaW5nID0gX0FjY3VtdWxhdG9yKHRyYW5zZm9ybWZ1bmM9Y2hhcnNldC5oZWFkZXJfZW5jb2RlKQorICAgICAgICAjIFNwbGl0IHRoZSBsaW5lIG9uIHRoZSBzcGxpdCBjaGFyYWN0ZXIsIHByZXNlcnZpbmcgaXQuICBJZiB0aGUgc3BsaXQKKyAgICAgICAgIyBjaGFyYWN0ZXIgaXMgd2hpdGVzcGFjZSBSRkMgMjgyMiAkMi4yLjMgcmVxdWlyZXMgdXMgdG8gZm9sZCBvbiB0aGUKKyAgICAgICAgIyB3aGl0ZXNwYWNlLCBzbyB0aGF0IHRoZSBsaW5lIGxlYWRzIHdpdGggdGhlIG9yaWdpbmFsIHdoaXRlc3BhY2Ugd2UKKyAgICAgICAgIyBzcGxpdCBvbi4gIEhvd2V2ZXIsIGlmIGEgaGlnaGVyIHN5bnRhY3RpYyBicmVhayBpcyB1c2VkIGluc3RlYWQKKyAgICAgICAgIyAoZS5nLiBjb21tYSBvciBzZW1pY29sb24pLCB0aGUgZm9sZGluZyBzaG91bGQgaGFwcGVuIGFmdGVyIHRoZSBzcGxpdAorICAgICAgICAjIGNoYXJhY3Rlci4gIEJ1dCB0aGVuIGluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBhZGQgb3VyIG93bgorICAgICAgICAjIGNvbnRpbnVhdGlvbiB3aGl0ZXNwYWNlIC0tIGFsdGhvdWdoIHdvbid0IHRoYXQgYnJlYWsgdW5mb2xkaW5nPworICAgICAgICBmb3IgcGFydCwgc3BsaXRwYXJ0LCBuZXh0cGFydCBpbiBfc3BsaXRlcmF0b3IoY2gsIHN0cmluZyk6CisgICAgICAgICAgICBpZiBub3Qgc3BsaXRwYXJ0OgorICAgICAgICAgICAgICAgICMgTm8gc3BsaXRwYXJ0IG1lYW5zIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmsuICBQdXQgdGhpcyBwYXJ0CisgICAgICAgICAgICAgICAgIyBlaXRoZXIgb24gdGhlIGN1cnJlbnQgbGluZSBvciB0aGUgbmV4dCBsaW5lIGRlcGVuZGluZyBvbgorICAgICAgICAgICAgICAgICMgd2hldGhlciBpdCBmaXRzLgorICAgICAgICAgICAgICAgIGhvbGRpbmcucHVzaChwYXJ0KQorICAgICAgICAgICAgICAgIGlmIGxlbihob2xkaW5nKSArIGxlbihzZWxmLl9jdXJyZW50X2xpbmUpIDw9IHNlbGYuX21heGxlbjoKKyAgICAgICAgICAgICAgICAgICAgIyBJdCBmaXRzLCBidXQgd2UncmUgZG9uZS4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VycmVudF9saW5lLnB1c2goc3RyKGhvbGRpbmcpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgSXQgZG9lc24ndCBmaXQsIGJ1dCB3ZSdyZSBkb25lLiAgQmVmb3JlIHB1c2hpbmcgYSBuZXcKKyAgICAgICAgICAgICAgICAgICAgIyBsaW5lLCB3YXRjaCBvdXQgZm9yIHRoZSBjdXJyZW50IGxpbmUgY29udGFpbmluZyBvbmx5CisgICAgICAgICAgICAgICAgICAgICMgd2hpdGVzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgaG9sZGluZy5wb3AoKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi5fY3VycmVudF9saW5lKSA9PSAwIGFuZCAoCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4oaG9sZGluZykgPT0gMCBvciBzdHIoaG9sZGluZykuaXNzcGFjZSgpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3Qgc3RhcnQgYSBuZXcgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRpbmcucHVzaChwYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VycmVudF9saW5lLnB1c2goc3RyKGhvbGRpbmcpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9saW5lcy5hcHBlbmQoc3RyKHNlbGYuX2N1cnJlbnRfbGluZSkpCisgICAgICAgICAgICAgICAgICAgIGlmIHBhcnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1cnJlbnRfbGluZS5yZXNldCgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBob2xkaW5nLnJlc2V0KHBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXJyZW50X2xpbmUucmVzZXQoc3RyKGhvbGRpbmcpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxpZiBub3QgbmV4dHBhcnQ6CisgICAgICAgICAgICAgICAgIyBUaGVyZSBtdXN0IGJlIHNvbWUgdHJhaWxpbmcgc3BsaXQgY2hhcmFjdGVycyBiZWNhdXNlIHdlCisgICAgICAgICAgICAgICAgIyBmb3VuZCBhIHNwbGl0IGNoYXJhY3RlciBidXQgbm8gbmV4dCBwYXJ0LiAgSW4gdGhpcyBjYXNlIHdlCisgICAgICAgICAgICAgICAgIyBtdXN0IHRyZWF0IHRoZSB0aGluZyB0byBmaXQgYXMgdGhlIHBhcnQgKyBzcGxpdHBhcnQgYmVjYXVzZQorICAgICAgICAgICAgICAgICMgaWYgc3BsaXRwYXJ0IGlzIHdoaXRlc3BhY2UgaXQncyBub3QgYWxsb3dlZCB0byBiZSB0aGUgb25seQorICAgICAgICAgICAgICAgICMgdGhpbmcgb24gdGhlIGxpbmUsIGFuZCBpZiBpdCdzIG5vdCB3aGl0ZXNwYWNlIHdlIG11c3Qgc3BsaXQKKyAgICAgICAgICAgICAgICAjIGFmdGVyIHRoZSBzeW50YWN0aWMgYnJlYWsuICBJbiBlaXRoZXIgY2FzZSwgd2UncmUgZG9uZS4KKyAgICAgICAgICAgICAgICBob2xkaW5nX3ByZWxlbiA9IGxlbihob2xkaW5nKQorICAgICAgICAgICAgICAgIGhvbGRpbmcucHVzaChwYXJ0ICsgc3BsaXRwYXJ0KQorICAgICAgICAgICAgICAgIGlmIGxlbihob2xkaW5nKSArIGxlbihzZWxmLl9jdXJyZW50X2xpbmUpIDw9IHNlbGYuX21heGxlbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VycmVudF9saW5lLnB1c2goc3RyKGhvbGRpbmcpKQorICAgICAgICAgICAgICAgIGVsaWYgaG9sZGluZ19wcmVsZW4gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBvbmx5IGNodW5rIGxlZnQgc28gaXQgaGFzIHRvIGdvIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAjIGN1cnJlbnQgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VycmVudF9saW5lLnB1c2goc3RyKGhvbGRpbmcpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNhdmVfcGFydCA9IGhvbGRpbmcucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VycmVudF9saW5lLnB1c2goc3RyKGhvbGRpbmcpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9saW5lcy5hcHBlbmQoc3RyKHNlbGYuX2N1cnJlbnRfbGluZSkpCisgICAgICAgICAgICAgICAgICAgIGhvbGRpbmcucmVzZXQoc2F2ZV9wYXJ0KQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXJyZW50X2xpbmUucmVzZXQoc3RyKGhvbGRpbmcpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxpZiBub3QgcGFydDoKKyAgICAgICAgICAgICAgICAjIFdlJ3JlIGxlYWRpbmcgd2l0aCBhIHNwbGl0IGNoYXJhY3Rlci4gIFNlZSBpZiB0aGUgc3BsaXRwYXJ0CisgICAgICAgICAgICAgICAgIyBhbmQgbmV4dHBhcnQgZml0cyBvbiB0aGUgY3VycmVudCBsaW5lLgorICAgICAgICAgICAgICAgIGhvbGRpbmcucHVzaChzcGxpdHBhcnQgKyBuZXh0cGFydCkKKyAgICAgICAgICAgICAgICBob2xkaW5nX2xlbiA9IGxlbihob2xkaW5nKQorICAgICAgICAgICAgICAgICMgV2Uga25vdyB3ZSdyZSBub3QgbGVhdmluZyB0aGUgbmV4dHBhcnQgb24gdGhlIHN0YWNrLgorICAgICAgICAgICAgICAgIGhvbGRpbmcucG9wKCkKKyAgICAgICAgICAgICAgICBpZiBob2xkaW5nX2xlbiArIGxlbihzZWxmLl9jdXJyZW50X2xpbmUpIDw9IHNlbGYuX21heGxlbjoKKyAgICAgICAgICAgICAgICAgICAgaG9sZGluZy5wdXNoKHNwbGl0cGFydCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEl0IGRvZXNuJ3QgZml0LiAgU2luY2UgdGhlcmUncyBubyBjdXJyZW50IHBhcnQgcmVhbGx5CisgICAgICAgICAgICAgICAgICAgICMgdGhlIGJlc3Qgd2UgY2FuIGRvIGlzIHN0YXJ0IGEgbmV3IGxpbmUgYW5kIHB1c2ggdGhlCisgICAgICAgICAgICAgICAgICAgICMgc3BsaXQgcGFydCBvbnRvIGl0LgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXJyZW50X2xpbmUucHVzaChzdHIoaG9sZGluZykpCisgICAgICAgICAgICAgICAgICAgIGhvbGRpbmcucmVzZXQoKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi5fY3VycmVudF9saW5lKSA+IDAgYW5kIHNlbGYuX2xpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGluZXMuYXBwZW5kKHN0cihzZWxmLl9jdXJyZW50X2xpbmUpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VycmVudF9saW5lLnJlc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgaG9sZGluZy5wdXNoKHNwbGl0cGFydCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBbGwgdGhyZWUgcGFydHMgYXJlIHByZXNlbnQuICBGaXJzdCBsZXQncyBzZWUgaWYgYWxsIHRocmVlCisgICAgICAgICAgICAgICAgIyBwYXJ0cyB3aWxsIGZpdCBvbiB0aGUgY3VycmVudCBsaW5lLiAgSWYgc28sIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgICAgICAgICAjIHNwbGl0IGl0LgorICAgICAgICAgICAgICAgIGhvbGRpbmcucHVzaChwYXJ0ICsgc3BsaXRwYXJ0ICsgbmV4dHBhcnQpCisgICAgICAgICAgICAgICAgaG9sZGluZ19sZW4gPSBsZW4oaG9sZGluZykKKyAgICAgICAgICAgICAgICAjIFBvcCB0aGUgcGFydCBiZWNhdXNlIHdlJ2xsIHB1c2ggbmV4dHBhcnQgb24gdGhlIG5leHQKKyAgICAgICAgICAgICAgICAjIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBsb29wLgorICAgICAgICAgICAgICAgIGhvbGRpbmcucG9wKCkKKyAgICAgICAgICAgICAgICBpZiBob2xkaW5nX2xlbiArIGxlbihzZWxmLl9jdXJyZW50X2xpbmUpIDw9IHNlbGYuX21heGxlbjoKKyAgICAgICAgICAgICAgICAgICAgaG9sZGluZy5wdXNoKHBhcnQgKyBzcGxpdHBhcnQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgZW50aXJlIHRoaW5nIGRvZXNuJ3QgZml0LiAgU2VlIGlmIHdlIG5lZWQgdG8gc3BsaXQKKyAgICAgICAgICAgICAgICAgICAgIyBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHNwbGl0IGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgICAgIGlmIHNwbGl0cGFydC5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNwbGl0IGJlZm9yZSB3aGl0ZXNwYWNlLiAgUmVtZW1iZXIgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpdGVzcGFjZSBiZWNvbWVzIHRoZSBjb250aW51YXRpb24gd2hpdGVzcGFjZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgbmV4dCBsaW5lIHNvIGl0IGdvZXMgdG8gY3VycmVudF9saW5lIG5vdCBob2xkaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGluZy5wdXNoKHBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXJyZW50X2xpbmUucHVzaChzdHIoaG9sZGluZykpCisgICAgICAgICAgICAgICAgICAgICAgICBob2xkaW5nLnJlc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xpbmVzLmFwcGVuZChzdHIoc2VsZi5fY3VycmVudF9saW5lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1cnJlbnRfbGluZS5yZXNldChzcGxpdHBhcnQpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNwbGl0IGFmdGVyIG5vbi13aGl0ZXNwYWNlLiAgVGhlIGNvbnRpbnVhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGl0ZXNwYWNlIGNvbWVzIGZyb20gdGhlIGluc3RhbmNlIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGluZy5wdXNoKHBhcnQgKyBzcGxpdHBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXJyZW50X2xpbmUucHVzaChzdHIoaG9sZGluZykpCisgICAgICAgICAgICAgICAgICAgICAgICBob2xkaW5nLnJlc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xpbmVzLmFwcGVuZChzdHIoc2VsZi5fY3VycmVudF9saW5lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5leHRwYXJ0WzBdLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXJyZW50X2xpbmUucmVzZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXJyZW50X2xpbmUucmVzZXQoc2VsZi5fY29udGludWF0aW9uX3dzKQorICAgICAgICAjIEdldCB0aGUgbGFzdCBvZiB0aGUgaG9sZGluZyBwYXJ0CisgICAgICAgIHNlbGYuX2N1cnJlbnRfbGluZS5wdXNoKHN0cihob2xkaW5nKSkKKworCisMCitkZWYgX3NwbGl0ZXJhdG9yKGNoYXJhY3Rlciwgc3RyaW5nKToKKyAgICBwYXJ0cyA9IGxpc3QocmV2ZXJzZWQocmUuc3BsaXQoJyglcyknICUgY2hhcmFjdGVyLCBzdHJpbmcpKSkKKyAgICB3aGlsZSBwYXJ0czoKKyAgICAgICAgcGFydCA9IHBhcnRzLnBvcCgpCisgICAgICAgIHNwbGl0cGFydHMgPSAocGFydHMucG9wKCkgaWYgcGFydHMgZWxzZSBOb25lKQorICAgICAgICBuZXh0cGFydCA9IChwYXJ0cy5wb3AoKSBpZiBwYXJ0cyBlbHNlIE5vbmUpCisgICAgICAgIHlpZWxkIChwYXJ0LCBzcGxpdHBhcnRzLCBuZXh0cGFydCkKKyAgICAgICAgaWYgbmV4dHBhcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwYXJ0cy5hcHBlbmQobmV4dHBhcnQpCisKKworY2xhc3MgX0FjY3VtdWxhdG9yOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbml0aWFsX3NpemU9MCwgdHJhbnNmb3JtZnVuYz1Ob25lKToKKyAgICAgICAgc2VsZi5faW5pdGlhbF9zaXplID0gaW5pdGlhbF9zaXplCisgICAgICAgIGlmIHRyYW5zZm9ybWZ1bmMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3RyYW5zZm9ybWZ1bmMgPSBsYW1iZGEgc3RyaW5nOiBzdHJpbmcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3RyYW5zZm9ybWZ1bmMgPSB0cmFuc2Zvcm1mdW5jCisgICAgICAgIHNlbGYuX2N1cnJlbnQgPSBbXQorCisgICAgZGVmIHB1c2goc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi5fY3VycmVudC5hcHBlbmQoc3RyaW5nKQorCisgICAgZGVmIHBvcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2N1cnJlbnQucG9wKCkKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHN0cihzZWxmKSkgKyBzZWxmLl9pbml0aWFsX3NpemUKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdHJhbnNmb3JtZnVuYyhFTVBUWVNUUklORy5qb2luKHNlbGYuX2N1cnJlbnQpKQorCisgICAgZGVmIHJlc2V0KHNlbGYsIHN0cmluZz1Ob25lKToKKyAgICAgICAgc2VsZi5fY3VycmVudCA9IFtdCisgICAgICAgIHNlbGYuX2N1cnJlbnRfbGVuID0gMAorICAgICAgICBzZWxmLl9pbml0aWFsX3NpemUgPSAwCisgICAgICAgIGlmIHN0cmluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHVzaChzdHJpbmcpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvaXRlcmF0b3JzLnB5IGIvTGliL2VtYWlsL2l0ZXJhdG9ycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQ3NmUzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL2l0ZXJhdG9ycy5weQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIlZhcmlvdXMgdHlwZXMgb2YgdXNlZnVsIGl0ZXJhdG9ycyBhbmQgZ2VuZXJhdG9ycy4iIiIKKworX19hbGxfXyA9IFsKKyAgICAnYm9keV9saW5lX2l0ZXJhdG9yJywKKyAgICAndHlwZWRfc3VicGFydF9pdGVyYXRvcicsCisgICAgJ3dhbGsnLAorICAgICMgRG8gbm90IGluY2x1ZGUgX3N0cnVjdHVyZSgpIHNpbmNlIGl0J3MgcGFydCBvZiB0aGUgZGVidWdnaW5nIEFQSS4KKyAgICBdCisKK2ltcG9ydCBzeXMKK2Zyb20gaW8gaW1wb3J0IFN0cmluZ0lPCisKKworDAorIyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmVjb21lIGEgbWV0aG9kIG9mIHRoZSBNZXNzYWdlIGNsYXNzCitkZWYgd2FsayhzZWxmKToKKyAgICAiIiJXYWxrIG92ZXIgdGhlIG1lc3NhZ2UgdHJlZSwgeWllbGRpbmcgZWFjaCBzdWJwYXJ0LgorCisgICAgVGhlIHdhbGsgaXMgcGVyZm9ybWVkIGluIGRlcHRoLWZpcnN0IG9yZGVyLiAgVGhpcyBtZXRob2QgaXMgYQorICAgIGdlbmVyYXRvci4KKyAgICAiIiIKKyAgICB5aWVsZCBzZWxmCisgICAgaWYgc2VsZi5pc19tdWx0aXBhcnQoKToKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gc2VsZi5nZXRfcGF5bG9hZCgpOgorICAgICAgICAgICAgZm9yIHN1YnN1YnBhcnQgaW4gc3VicGFydC53YWxrKCk6CisgICAgICAgICAgICAgICAgeWllbGQgc3Vic3VicGFydAorCisKKwwKKyMgVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgaW1wb3J0ZWQgaW50byB0aGUgSXRlcmF0b3JzLnB5IGludGVyZmFjZSBtb2R1bGUuCitkZWYgYm9keV9saW5lX2l0ZXJhdG9yKG1zZywgZGVjb2RlPUZhbHNlKToKKyAgICAiIiJJdGVyYXRlIG92ZXIgdGhlIHBhcnRzLCByZXR1cm5pbmcgc3RyaW5nIHBheWxvYWRzIGxpbmUtYnktbGluZS4KKworICAgIE9wdGlvbmFsIGRlY29kZSAoZGVmYXVsdCBGYWxzZSkgaXMgcGFzc2VkIHRocm91Z2ggdG8gLmdldF9wYXlsb2FkKCkuCisgICAgIiIiCisgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgcGF5bG9hZCA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoZGVjb2RlPWRlY29kZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXlsb2FkLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIFN0cmluZ0lPKHBheWxvYWQpOgorICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKKworCitkZWYgdHlwZWRfc3VicGFydF9pdGVyYXRvcihtc2csIG1haW50eXBlPSd0ZXh0Jywgc3VidHlwZT1Ob25lKToKKyAgICAiIiJJdGVyYXRlIG92ZXIgdGhlIHN1YnBhcnRzIHdpdGggYSBnaXZlbiBNSU1FIHR5cGUuCisKKyAgICBVc2UgYG1haW50eXBlJyBhcyB0aGUgbWFpbiBNSU1FIHR5cGUgdG8gbWF0Y2ggYWdhaW5zdDsgdGhpcyBkZWZhdWx0cyB0bworICAgICJ0ZXh0Ii4gIE9wdGlvbmFsIGBzdWJ0eXBlJyBpcyB0aGUgTUlNRSBzdWJ0eXBlIHRvIG1hdGNoIGFnYWluc3Q7IGlmCisgICAgb21pdHRlZCwgb25seSB0aGUgbWFpbiB0eXBlIGlzIG1hdGNoZWQuCisgICAgIiIiCisgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgaWYgc3VicGFydC5nZXRfY29udGVudF9tYWludHlwZSgpID09IG1haW50eXBlOgorICAgICAgICAgICAgaWYgc3VidHlwZSBpcyBOb25lIG9yIHN1YnBhcnQuZ2V0X2NvbnRlbnRfc3VidHlwZSgpID09IHN1YnR5cGU6CisgICAgICAgICAgICAgICAgeWllbGQgc3VicGFydAorCisKKwwKK2RlZiBfc3RydWN0dXJlKG1zZywgZnA9Tm9uZSwgbGV2ZWw9MCwgaW5jbHVkZV9kZWZhdWx0PUZhbHNlKToKKyAgICAiIiJBIGhhbmR5IGRlYnVnZ2luZyBhaWQiIiIKKyAgICBpZiBmcCBpcyBOb25lOgorICAgICAgICBmcCA9IHN5cy5zdGRvdXQKKyAgICB0YWIgPSAnICcgKiAobGV2ZWwgKiA0KQorICAgIHByaW50KHRhYiArIG1zZy5nZXRfY29udGVudF90eXBlKCksIGVuZD0nJywgZmlsZT1mcCkKKyAgICBpZiBpbmNsdWRlX2RlZmF1bHQ6CisgICAgICAgIHByaW50KCcgWyVzXScgJSBtc2cuZ2V0X2RlZmF1bHRfdHlwZSgpLCBmaWxlPWZwKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KGZpbGU9ZnApCisgICAgaWYgbXNnLmlzX211bHRpcGFydCgpOgorICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cuZ2V0X3BheWxvYWQoKToKKyAgICAgICAgICAgIF9zdHJ1Y3R1cmUoc3VicGFydCwgZnAsIGxldmVsKzEsIGluY2x1ZGVfZGVmYXVsdCkKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9tZXNzYWdlLnB5IGIvTGliL2VtYWlsL21lc3NhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5YWY5MAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9tZXNzYWdlLnB5CkBAIC0wLDAgKzEsNzkwIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkJhc2ljIG1lc3NhZ2Ugb2JqZWN0IGZvciB0aGUgZW1haWwgcGFja2FnZSBvYmplY3QgbW9kZWwuIiIiCisKK19fYWxsX18gPSBbJ01lc3NhZ2UnXQorCitpbXBvcnQgcmUKK2ltcG9ydCB1dQoraW1wb3J0IGJpbmFzY2lpCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8sIFN0cmluZ0lPCisKKyMgSW50cmFwYWNrYWdlIGltcG9ydHMKK2ltcG9ydCBlbWFpbC5jaGFyc2V0Citmcm9tIGVtYWlsIGltcG9ydCB1dGlscworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCisKK1NFTUlTUEFDRSA9ICc7ICcKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBzcGxpdCBoZWFkZXIgcGFyYW1ldGVycy4gIEJBVzogdGhpcyBtYXkgYmUgdG9vCisjIHNpbXBsZS4gIEl0IGlzbid0IHN0cmljdGx5IFJGQyAyMDQ1IChzZWN0aW9uIDUuMSkgY29tcGxpYW50LCBidXQgaXQgY2F0Y2hlcworIyBtb3N0IGhlYWRlcnMgZm91bmQgaW4gdGhlIHdpbGQuICBXZSBtYXkgZXZlbnR1YWxseSBuZWVkIGEgZnVsbCBmbGVkZ2VkCisjIHBhcnNlciBldmVudHVhbGx5LgorcGFyYW1yZSA9IHJlLmNvbXBpbGUocidccyo7XHMqJykKKyMgUmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBgc3BlY2lhbCcgY2hhcmFjdGVycyBpbiBwYXJhbWV0ZXJzLCB0aGUKKyMgZXhpc3RhbmNlIG9mIHdoaWNoIGZvcmNlIHF1b3Rpbmcgb2YgdGhlIHBhcmFtZXRlciB2YWx1ZS4KK3RzcGVjaWFscyA9IHJlLmNvbXBpbGUocidbIFwoXCk8PkAsOzpcXCIvXFtcXVw/PV0nKQorCisKKwwKKyMgSGVscGVyIGZ1bmN0aW9ucworZGVmIF9mb3JtYXRwYXJhbShwYXJhbSwgdmFsdWU9Tm9uZSwgcXVvdGU9VHJ1ZSk6CisgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZm9ybWF0IGFuZCByZXR1cm4gYSBrZXk9dmFsdWUgcGFpci4KKworICAgIFRoaXMgd2lsbCBxdW90ZSB0aGUgdmFsdWUgaWYgbmVlZGVkIG9yIGlmIHF1b3RlIGlzIHRydWUuCisgICAgIiIiCisgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIGxlbih2YWx1ZSkgPiAwOgorICAgICAgICAjIEEgdHVwbGUgaXMgdXNlZCBmb3IgUkZDIDIyMzEgZW5jb2RlZCBwYXJhbWV0ZXIgdmFsdWVzIHdoZXJlIGl0ZW1zCisgICAgICAgICMgYXJlIChjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUpLiAgY2hhcnNldCBpcyBhIHN0cmluZywgbm90IGEgQ2hhcnNldAorICAgICAgICAjIGluc3RhbmNlLgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CisgICAgICAgICAgICAjIEVuY29kZSBhcyBwZXIgUkZDIDIyMzEKKyAgICAgICAgICAgIHBhcmFtICs9ICcqJworICAgICAgICAgICAgdmFsdWUgPSB1dGlscy5lbmNvZGVfcmZjMjIzMSh2YWx1ZVsyXSwgdmFsdWVbMF0sIHZhbHVlWzFdKQorICAgICAgICAjIEJBVzogUGxlYXNlIGNoZWNrIHRoaXMuICBJIHRoaW5rIHRoYXQgaWYgcXVvdGUgaXMgc2V0IGl0IHNob3VsZAorICAgICAgICAjIGZvcmNlIHF1b3RpbmcgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LgorICAgICAgICBpZiBxdW90ZSBvciB0c3BlY2lhbHMuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgICAgIHJldHVybiAnJXM9IiVzIicgJSAocGFyYW0sIHV0aWxzLnF1b3RlKHZhbHVlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnJXM9JXMnICUgKHBhcmFtLCB2YWx1ZSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcGFyYW0KKworZGVmIF9wYXJzZXBhcmFtKHMpOgorICAgIHBsaXN0ID0gW10KKyAgICB3aGlsZSBzWzoxXSA9PSAnOyc6CisgICAgICAgIHMgPSBzWzE6XQorICAgICAgICBlbmQgPSBzLmZpbmQoJzsnKQorICAgICAgICB3aGlsZSBlbmQgPiAwIGFuZCBzLmNvdW50KCciJywgMCwgZW5kKSAlIDI6CisgICAgICAgICAgICBlbmQgPSBzLmZpbmQoJzsnLCBlbmQgKyAxKQorICAgICAgICBpZiBlbmQgPCAwOgorICAgICAgICAgICAgZW5kID0gbGVuKHMpCisgICAgICAgIGYgPSBzWzplbmRdCisgICAgICAgIGlmICc9JyBpbiBmOgorICAgICAgICAgICAgaSA9IGYuaW5kZXgoJz0nKQorICAgICAgICAgICAgZiA9IGZbOmldLnN0cmlwKCkubG93ZXIoKSArICc9JyArIGZbaSsxOl0uc3RyaXAoKQorICAgICAgICBwbGlzdC5hcHBlbmQoZi5zdHJpcCgpKQorICAgICAgICBzID0gc1tlbmQ6XQorICAgIHJldHVybiBwbGlzdAorCisKK2RlZiBfdW5xdW90ZXZhbHVlKHZhbHVlKToKKyAgICAjIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZSgpIGJlY2F1c2UgaXQgZG9lc24ndAorICAgICMgdHJ5IHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgdW5pY29kZS4gIE1lc3NhZ2UuZ2V0X3BhcmFtKCkgYW5kCisgICAgIyBNZXNzYWdlLmdldF9wYXJhbXMoKSBhcmUgYm90aCBjdXJyZW50bHkgZGVmaW5lZCB0byByZXR1cm4gdGhlIHR1cGxlIGluCisgICAgIyB0aGUgZmFjZSBvZiBSRkMgMjIzMSBwYXJhbWV0ZXJzLgorICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgcmV0dXJuIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdXRpbHMudW5xdW90ZSh2YWx1ZVsyXSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gdXRpbHMudW5xdW90ZSh2YWx1ZSkKKworCisMCitjbGFzcyBNZXNzYWdlOgorICAgICIiIkJhc2ljIG1lc3NhZ2Ugb2JqZWN0LgorCisgICAgQSBtZXNzYWdlIG9iamVjdCBpcyBkZWZpbmVkIGFzIHNvbWV0aGluZyB0aGF0IGhhcyBhIGJ1bmNoIG9mIFJGQyAyODIyCisgICAgaGVhZGVycyBhbmQgYSBwYXlsb2FkLiAgSXQgbWF5IG9wdGlvbmFsbHkgaGF2ZSBhbiBlbnZlbG9wZSBoZWFkZXIKKyAgICAoYS5rLmEuIFVuaXgtRnJvbSBvciBGcm9tXyBoZWFkZXIpLiAgSWYgdGhlIG1lc3NhZ2UgaXMgYSBjb250YWluZXIgKGkuZS4gYQorICAgIG11bHRpcGFydCBvciBhIG1lc3NhZ2UvcmZjODIyKSwgdGhlbiB0aGUgcGF5bG9hZCBpcyBhIGxpc3Qgb2YgTWVzc2FnZQorICAgIG9iamVjdHMsIG90aGVyd2lzZSBpdCBpcyBhIHN0cmluZy4KKworICAgIE1lc3NhZ2Ugb2JqZWN0cyBpbXBsZW1lbnQgcGFydCBvZiB0aGUgYG1hcHBpbmcnIGludGVyZmFjZSwgd2hpY2ggYXNzdW1lcworICAgIHRoZXJlIGlzIGV4YWN0bHkgb25lIG9jY3VycmFuY2Ugb2YgdGhlIGhlYWRlciBwZXIgbWVzc2FnZS4gIFNvbWUgaGVhZGVycworICAgIGRvIGluIGZhY3QgYXBwZWFyIG11bHRpcGxlIHRpbWVzIChlLmcuIFJlY2VpdmVkKSBhbmQgZm9yIHRob3NlIGhlYWRlcnMsCisgICAgeW91IG11c3QgdXNlIHRoZSBleHBsaWNpdCBBUEkgdG8gc2V0IG9yIGdldCBhbGwgdGhlIGhlYWRlcnMuICBOb3QgYWxsIG9mCisgICAgdGhlIG1hcHBpbmcgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9oZWFkZXJzID0gW10KKyAgICAgICAgc2VsZi5fdW5peGZyb20gPSBOb25lCisgICAgICAgIHNlbGYuX3BheWxvYWQgPSBOb25lCisgICAgICAgIHNlbGYuX2NoYXJzZXQgPSBOb25lCisgICAgICAgICMgRGVmYXVsdHMgZm9yIG11bHRpcGFydCBtZXNzYWdlcworICAgICAgICBzZWxmLnByZWFtYmxlID0gc2VsZi5lcGlsb2d1ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5kZWZlY3RzID0gW10KKyAgICAgICAgIyBEZWZhdWx0IGNvbnRlbnQgdHlwZQorICAgICAgICBzZWxmLl9kZWZhdWx0X3R5cGUgPSAndGV4dC9wbGFpbicKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGVudGlyZSBmb3JtYXR0ZWQgbWVzc2FnZSBhcyBhIHN0cmluZy4KKyAgICAgICAgVGhpcyBpbmNsdWRlcyB0aGUgaGVhZGVycywgYm9keSwgYW5kIGVudmVsb3BlIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmFzX3N0cmluZygpCisKKyAgICBkZWYgYXNfc3RyaW5nKHNlbGYsIHVuaXhmcm9tPUZhbHNlLCBtYXhoZWFkZXJsZW49MCk6CisgICAgICAgICIiIlJldHVybiB0aGUgZW50aXJlIGZvcm1hdHRlZCBtZXNzYWdlIGFzIGEgc3RyaW5nLgorICAgICAgICBPcHRpb25hbCBgdW5peGZyb20nIHdoZW4gVHJ1ZSwgbWVhbnMgaW5jbHVkZSB0aGUgVW5peCBGcm9tXyBlbnZlbG9wZQorICAgICAgICBoZWFkZXIuCisKKyAgICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgbWF5IG5vdCBnZW5lcmF0ZSB0aGUgbWVzc2FnZSBleGFjdGx5CisgICAgICAgIGFzIHlvdSBpbnRlbmQgYmVjYXVzZSBieSBkZWZhdWx0IGl0IG1hbmdsZXMgbGluZXMgdGhhdCBiZWdpbiB3aXRoCisgICAgICAgICJGcm9tICIuICBGb3IgbW9yZSBmbGV4aWJpbGl0eSwgdXNlIHRoZSBmbGF0dGVuKCkgbWV0aG9kIG9mIGEKKyAgICAgICAgR2VuZXJhdG9yIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvcgorICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihmcCwgbWFuZ2xlX2Zyb21fPUZhbHNlLCBtYXhoZWFkZXJsZW49bWF4aGVhZGVybGVuKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZiwgdW5peGZyb209dW5peGZyb20pCisgICAgICAgIHJldHVybiBmcC5nZXR2YWx1ZSgpCisKKyAgICBkZWYgaXNfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb25zaXN0cyBvZiBtdWx0aXBsZSBwYXJ0cy4iIiIKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uoc2VsZi5fcGF5bG9hZCwgbGlzdCkKKworICAgICMKKyAgICAjIFVuaXggRnJvbV8gbGluZQorICAgICMKKyAgICBkZWYgc2V0X3VuaXhmcm9tKHNlbGYsIHVuaXhmcm9tKToKKyAgICAgICAgc2VsZi5fdW5peGZyb20gPSB1bml4ZnJvbQorCisgICAgZGVmIGdldF91bml4ZnJvbShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VuaXhmcm9tCisKKyAgICAjCisgICAgIyBQYXlsb2FkIG1hbmlwdWxhdGlvbi4KKyAgICAjCisgICAgZGVmIGF0dGFjaChzZWxmLCBwYXlsb2FkKToKKyAgICAgICAgIiIiQWRkIHRoZSBnaXZlbiBwYXlsb2FkIHRvIHRoZSBjdXJyZW50IHBheWxvYWQuCisKKyAgICAgICAgVGhlIGN1cnJlbnQgcGF5bG9hZCB3aWxsIGFsd2F5cyBiZSBhIGxpc3Qgb2Ygb2JqZWN0cyBhZnRlciB0aGlzIG1ldGhvZAorICAgICAgICBpcyBjYWxsZWQuICBJZiB5b3Ugd2FudCB0byBzZXQgdGhlIHBheWxvYWQgdG8gYSBzY2FsYXIgb2JqZWN0LCB1c2UKKyAgICAgICAgc2V0X3BheWxvYWQoKSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fcGF5bG9hZCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fcGF5bG9hZCA9IFtwYXlsb2FkXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcGF5bG9hZC5hcHBlbmQocGF5bG9hZCkKKworICAgIGRlZiBnZXRfcGF5bG9hZChzZWxmLCBpPU5vbmUsIGRlY29kZT1GYWxzZSk6CisgICAgICAgICIiIlJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgcGF5bG9hZC4KKworICAgICAgICBUaGUgcGF5bG9hZCB3aWxsIGVpdGhlciBiZSBhIGxpc3Qgb2JqZWN0IG9yIGEgc3RyaW5nLiAgSWYgeW91IG11dGF0ZQorICAgICAgICB0aGUgbGlzdCBvYmplY3QsIHlvdSBtb2RpZnkgdGhlIG1lc3NhZ2UncyBwYXlsb2FkIGluIHBsYWNlLiAgT3B0aW9uYWwKKyAgICAgICAgaSByZXR1cm5zIHRoYXQgaW5kZXggaW50byB0aGUgcGF5bG9hZC4KKworICAgICAgICBPcHRpb25hbCBkZWNvZGUgaXMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGF5bG9hZCBzaG91bGQgYmUKKyAgICAgICAgZGVjb2RlZCBvciBub3QsIGFjY29yZGluZyB0byB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIKKyAgICAgICAgKGRlZmF1bHQgaXMgRmFsc2UpLgorCisgICAgICAgIFdoZW4gVHJ1ZSBhbmQgdGhlIG1lc3NhZ2UgaXMgbm90IGEgbXVsdGlwYXJ0LCB0aGUgcGF5bG9hZCB3aWxsIGJlCisgICAgICAgIGRlY29kZWQgaWYgdGhpcyBoZWFkZXIncyB2YWx1ZSBpcyBgcXVvdGVkLXByaW50YWJsZScgb3IgYGJhc2U2NCcuICBJZgorICAgICAgICBzb21lIG90aGVyIGVuY29kaW5nIGlzIHVzZWQsIG9yIHRoZSBoZWFkZXIgaXMgbWlzc2luZywgb3IgaWYgdGhlCisgICAgICAgIHBheWxvYWQgaGFzIGJvZ3VzIGRhdGEgKGkuZS4gYm9ndXMgYmFzZTY0IG9yIHV1ZW5jb2RlZCBkYXRhKSwgdGhlCisgICAgICAgIHBheWxvYWQgaXMgcmV0dXJuZWQgYXMtaXMuCisKKyAgICAgICAgSWYgdGhlIG1lc3NhZ2UgaXMgYSBtdWx0aXBhcnQgYW5kIHRoZSBkZWNvZGUgZmxhZyBpcyBUcnVlLCB0aGVuIE5vbmUKKyAgICAgICAgaXMgcmV0dXJuZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBpIGlzIE5vbmU6CisgICAgICAgICAgICBwYXlsb2FkID0gc2VsZi5fcGF5bG9hZAorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNlbGYuX3BheWxvYWQsIGxpc3QpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBsaXN0LCBnb3QgJXMnICUgdHlwZShzZWxmLl9wYXlsb2FkKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBheWxvYWQgPSBzZWxmLl9wYXlsb2FkW2ldCisgICAgICAgIGlmIG5vdCBkZWNvZGU6CisgICAgICAgICAgICByZXR1cm4gcGF5bG9hZAorICAgICAgICAjIERlY29kZWQgcGF5bG9hZHMgYWx3YXlzIHJldHVybiBieXRlcy4gIFhYWCBzcGxpdCB0aGlzIHBhcnQgb3V0IGludG8KKyAgICAgICAgIyBhIG5ldyBtZXRob2QgY2FsbGVkIC5nZXRfZGVjb2RlZF9wYXlsb2FkKCkuCisgICAgICAgIGlmIHNlbGYuaXNfbXVsdGlwYXJ0KCk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBjdGUgPSBzZWxmLmdldCgnY29udGVudC10cmFuc2Zlci1lbmNvZGluZycsICcnKS5sb3dlcigpCisgICAgICAgIGlmIGN0ZSA9PSAncXVvdGVkLXByaW50YWJsZSc6CisgICAgICAgICAgICByZXR1cm4gdXRpbHMuX3FkZWNvZGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBjdGUgPT0gJ2Jhc2U2NCc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLl9iZGVjb2RlKHBheWxvYWQpCisgICAgICAgICAgICBleGNlcHQgYmluYXNjaWkuRXJyb3I6CisgICAgICAgICAgICAgICAgIyBJbmNvcnJlY3QgcGFkZGluZworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBjdGUgaW4gKCd4LXV1ZW5jb2RlJywgJ3V1ZW5jb2RlJywgJ3V1ZScsICd4LXV1ZScpOgorICAgICAgICAgICAgaW5fZmlsZSA9IEJ5dGVzSU8oYnl0ZXMocGF5bG9hZCArICdcbicpKQorICAgICAgICAgICAgb3V0X2ZpbGUgPSBCeXRlc0lPKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1dS5kZWNvZGUoaW5fZmlsZSwgb3V0X2ZpbGUsIHF1aWV0PVRydWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIG91dF9maWxlLmdldHZhbHVlKCkKKyAgICAgICAgICAgIGV4Y2VwdCB1dS5FcnJvcjoKKyAgICAgICAgICAgICAgICAjIFNvbWUgZGVjb2RpbmcgcHJvYmxlbQorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz8gIFdlIGNhbid0IHVzZSB0aGUgYnl0ZXMKKyAgICAgICAgIyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgcmV0dXJuIGJ5dGVzKG9yZChjKSBmb3IgYyBpbiBwYXlsb2FkKQorCisgICAgZGVmIHNldF9wYXlsb2FkKHNlbGYsIHBheWxvYWQsIGNoYXJzZXQ9Tm9uZSk6CisgICAgICAgICIiIlNldCB0aGUgcGF5bG9hZCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisKKyAgICAgICAgT3B0aW9uYWwgY2hhcnNldCBzZXRzIHRoZSBtZXNzYWdlJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0LiAgU2VlCisgICAgICAgIHNldF9jaGFyc2V0KCkgZm9yIGRldGFpbHMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9wYXlsb2FkID0gcGF5bG9hZAorICAgICAgICBpZiBjaGFyc2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zZXRfY2hhcnNldChjaGFyc2V0KQorCisgICAgZGVmIHNldF9jaGFyc2V0KHNlbGYsIGNoYXJzZXQpOgorICAgICAgICAiIiJTZXQgdGhlIGNoYXJzZXQgb2YgdGhlIHBheWxvYWQgdG8gYSBnaXZlbiBjaGFyYWN0ZXIgc2V0LgorCisgICAgICAgIGNoYXJzZXQgY2FuIGJlIGEgQ2hhcnNldCBpbnN0YW5jZSwgYSBzdHJpbmcgbmFtaW5nIGEgY2hhcmFjdGVyIHNldCwgb3IKKyAgICAgICAgTm9uZS4gIElmIGl0IGlzIGEgc3RyaW5nIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgQ2hhcnNldCBpbnN0YW5jZS4KKyAgICAgICAgSWYgY2hhcnNldCBpcyBOb25lLCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlCisgICAgICAgIENvbnRlbnQtVHlwZSBmaWVsZC4gIEFueXRoaW5nIGVsc2Ugd2lsbCBnZW5lcmF0ZSBhIFR5cGVFcnJvci4KKworICAgICAgICBUaGUgbWVzc2FnZSB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgb2YgdHlwZSB0ZXh0LyogZW5jb2RlZCB3aXRoCisgICAgICAgIGNoYXJzZXQuaW5wdXRfY2hhcnNldC4gIEl0IHdpbGwgYmUgY29udmVydGVkIHRvIGNoYXJzZXQub3V0cHV0X2NoYXJzZXQKKyAgICAgICAgYW5kIGVuY29kZWQgcHJvcGVybHksIGlmIG5lZWRlZCwgd2hlbiBnZW5lcmF0aW5nIHRoZSBwbGFpbiB0ZXh0CisgICAgICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiAgTUlNRSBoZWFkZXJzIChNSU1FLVZlcnNpb24sCisgICAgICAgIENvbnRlbnQtVHlwZSwgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZykgd2lsbCBiZSBhZGRlZCBhcyBuZWVkZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNoYXJzZXQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVsX3BhcmFtKCdjaGFyc2V0JykKKyAgICAgICAgICAgIHNlbGYuX2NoYXJzZXQgPSBOb25lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShjaGFyc2V0LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGNoYXJzZXQgPSBlbWFpbC5jaGFyc2V0LkNoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2hhcnNldCwgZW1haWwuY2hhcnNldC5DaGFyc2V0KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihjaGFyc2V0KQorICAgICAgICAjIEJBVzogc2hvdWxkIHdlIGFjY2VwdCBzdHJpbmdzIHRoYXQgY2FuIHNlcnZlIGFzIGFyZ3VtZW50cyB0byB0aGUKKyAgICAgICAgIyBDaGFyc2V0IGNvbnN0cnVjdG9yPworICAgICAgICBzZWxmLl9jaGFyc2V0ID0gY2hhcnNldAorICAgICAgICBpZiAnTUlNRS1WZXJzaW9uJyBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHNlbGYuYWRkX2hlYWRlcignTUlNRS1WZXJzaW9uJywgJzEuMCcpCisgICAgICAgIGlmICdDb250ZW50LVR5cGUnIG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD1jaGFyc2V0LmdldF9vdXRwdXRfY2hhcnNldCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZXRfcGFyYW0oJ2NoYXJzZXQnLCBjaGFyc2V0LmdldF9vdXRwdXRfY2hhcnNldCgpKQorICAgICAgICBpZiBzdHIoY2hhcnNldCkgIT0gY2hhcnNldC5nZXRfb3V0cHV0X2NoYXJzZXQoKToKKyAgICAgICAgICAgIHNlbGYuX3BheWxvYWQgPSBjaGFyc2V0LmJvZHlfZW5jb2RlKHNlbGYuX3BheWxvYWQpCisgICAgICAgIGlmICdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJyBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIGN0ZSA9IGNoYXJzZXQuZ2V0X2JvZHlfZW5jb2RpbmcoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGN0ZShzZWxmKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLl9wYXlsb2FkID0gY2hhcnNldC5ib2R5X2VuY29kZShzZWxmLl9wYXlsb2FkKQorICAgICAgICAgICAgICAgIHNlbGYuYWRkX2hlYWRlcignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsIGN0ZSkKKworICAgIGRlZiBnZXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBDaGFyc2V0IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZSdzIHBheWxvYWQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY2hhcnNldAorCisgICAgIworICAgICMgTUFQUElORyBJTlRFUkZBQ0UgKHBhcnRpYWwpCisgICAgIworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBoZWFkZXJzLCBpbmNsdWRpbmcgZHVwbGljYXRlcy4iIiIKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9oZWFkZXJzKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJHZXQgYSBoZWFkZXIgdmFsdWUuCisKKyAgICAgICAgUmV0dXJuIE5vbmUgaWYgdGhlIGhlYWRlciBpcyBtaXNzaW5nIGluc3RlYWQgb2YgcmFpc2luZyBhbiBleGNlcHRpb24uCisKKyAgICAgICAgTm90ZSB0aGF0IGlmIHRoZSBoZWFkZXIgYXBwZWFyZWQgbXVsdGlwbGUgdGltZXMsIGV4YWN0bHkgd2hpY2gKKyAgICAgICAgb2NjdXJyYW5jZSBnZXRzIHJldHVybmVkIGlzIHVuZGVmaW5lZC4gIFVzZSBnZXRfYWxsKCkgdG8gZ2V0IGFsbAorICAgICAgICB0aGUgdmFsdWVzIG1hdGNoaW5nIGEgaGVhZGVyIGZpZWxkIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXQobmFtZSkKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWwpOgorICAgICAgICAiIiJTZXQgdGhlIHZhbHVlIG9mIGEgaGVhZGVyLgorCisgICAgICAgIE5vdGU6IHRoaXMgZG9lcyBub3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGhlYWRlciB3aXRoIHRoZSBzYW1lIGZpZWxkCisgICAgICAgIG5hbWUuICBVc2UgX19kZWxpdGVtX18oKSBmaXJzdCB0byBkZWxldGUgYW55IGV4aXN0aW5nIGhlYWRlcnMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9oZWFkZXJzLmFwcGVuZCgobmFtZSwgdmFsKSkKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiRGVsZXRlIGFsbCBvY2N1cnJlbmNlcyBvZiBhIGhlYWRlciwgaWYgcHJlc2VudC4KKworICAgICAgICBEb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGhlYWRlciBpcyBtaXNzaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICBuZXdoZWFkZXJzID0gW10KKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyczoKKyAgICAgICAgICAgIGlmIGsubG93ZXIoKSAhPSBuYW1lOgorICAgICAgICAgICAgICAgIG5ld2hlYWRlcnMuYXBwZW5kKChrLCB2KSkKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IG5ld2hlYWRlcnMKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lLmxvd2VyKCkgaW4gW2subG93ZXIoKSBmb3IgaywgdiBpbiBzZWxmLl9oZWFkZXJzXQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBmb3IgZmllbGQsIHZhbHVlIGluIHNlbGYuX2hlYWRlcnM6CisgICAgICAgICAgICB5aWVsZCBmaWVsZAorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5faGVhZGVycykKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbWVzc2FnZSdzIGhlYWRlciBmaWVsZCBuYW1lcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwKKyAgICAgICAgbWVzc2FnZSwgb3Igd2VyZSBhZGRlZCB0byB0aGUgbWVzc2FnZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuCisgICAgICAgIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyCisgICAgICAgIGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gW2sgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyc10KKworICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBtZXNzYWdlJ3MgaGVhZGVyIHZhbHVlcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwKKyAgICAgICAgbWVzc2FnZSwgb3Igd2VyZSBhZGRlZCB0byB0aGUgbWVzc2FnZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuCisgICAgICAgIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyCisgICAgICAgIGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gW3YgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyc10KKworICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgIiIiR2V0IGFsbCB0aGUgbWVzc2FnZSdzIGhlYWRlciBmaWVsZHMgYW5kIHZhbHVlcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwKKyAgICAgICAgbWVzc2FnZSwgb3Igd2VyZSBhZGRlZCB0byB0aGUgbWVzc2FnZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuCisgICAgICAgIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyCisgICAgICAgIGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5faGVhZGVyc1s6XQorCisgICAgZGVmIGdldChzZWxmLCBuYW1lLCBmYWlsb2JqPU5vbmUpOgorICAgICAgICAiIiJHZXQgYSBoZWFkZXIgdmFsdWUuCisKKyAgICAgICAgTGlrZSBfX2dldGl0ZW1fXygpIGJ1dCByZXR1cm4gZmFpbG9iaiBpbnN0ZWFkIG9mIE5vbmUgd2hlbiB0aGUgZmllbGQKKyAgICAgICAgaXMgbWlzc2luZy4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyczoKKyAgICAgICAgICAgIGlmIGsubG93ZXIoKSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIHJldHVybiBmYWlsb2JqCisKKyAgICAjCisgICAgIyBBZGRpdGlvbmFsIHVzZWZ1bCBzdHVmZgorICAgICMKKworICAgIGRlZiBnZXRfYWxsKHNlbGYsIG5hbWUsIGZhaWxvYmo9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBuYW1lZCBmaWVsZC4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwKKyAgICAgICAgbWVzc2FnZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kCisgICAgICAgIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlciBsaXN0LgorCisgICAgICAgIElmIG5vIHN1Y2ggZmllbGRzIGV4aXN0LCBmYWlsb2JqIGlzIHJldHVybmVkIChkZWZhdWx0cyB0byBOb25lKS4KKyAgICAgICAgIiIiCisgICAgICAgIHZhbHVlcyA9IFtdCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyczoKKyAgICAgICAgICAgIGlmIGsubG93ZXIoKSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQodikKKyAgICAgICAgaWYgbm90IHZhbHVlczoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgIHJldHVybiB2YWx1ZXMKKworICAgIGRlZiBhZGRfaGVhZGVyKHNlbGYsIF9uYW1lLCBfdmFsdWUsICoqX3BhcmFtcyk6CisgICAgICAgICIiIkV4dGVuZGVkIGhlYWRlciBzZXR0aW5nLgorCisgICAgICAgIG5hbWUgaXMgdGhlIGhlYWRlciBmaWVsZCB0byBhZGQuICBrZXl3b3JkIGFyZ3VtZW50cyBjYW4gYmUgdXNlZCB0byBzZXQKKyAgICAgICAgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgaGVhZGVyIGZpZWxkLCB3aXRoIHVuZGVyc2NvcmVzIGNvbnZlcnRlZAorICAgICAgICB0byBkYXNoZXMuICBOb3JtYWxseSB0aGUgcGFyYW1ldGVyIHdpbGwgYmUgYWRkZWQgYXMga2V5PSJ2YWx1ZSIgdW5sZXNzCisgICAgICAgIHZhbHVlIGlzIE5vbmUsIGluIHdoaWNoIGNhc2Ugb25seSB0aGUga2V5IHdpbGwgYmUgYWRkZWQuCisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICBtc2cuYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9J2J1ZC5naWYnKQorICAgICAgICAiIiIKKyAgICAgICAgcGFydHMgPSBbXQorICAgICAgICBmb3IgaywgdiBpbiBfcGFyYW1zLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB2IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKGsucmVwbGFjZSgnXycsICctJykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChfZm9ybWF0cGFyYW0oay5yZXBsYWNlKCdfJywgJy0nKSwgdikpCisgICAgICAgIGlmIF92YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhcnRzLmluc2VydCgwLCBfdmFsdWUpCisgICAgICAgIHNlbGYuX2hlYWRlcnMuYXBwZW5kKChfbmFtZSwgU0VNSVNQQUNFLmpvaW4ocGFydHMpKSkKKworICAgIGRlZiByZXBsYWNlX2hlYWRlcihzZWxmLCBfbmFtZSwgX3ZhbHVlKToKKyAgICAgICAgIiIiUmVwbGFjZSBhIGhlYWRlci4KKworICAgICAgICBSZXBsYWNlIHRoZSBmaXJzdCBtYXRjaGluZyBoZWFkZXIgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIHJldGFpbmluZworICAgICAgICBoZWFkZXIgb3JkZXIgYW5kIGNhc2UuICBJZiBubyBtYXRjaGluZyBoZWFkZXIgd2FzIGZvdW5kLCBhIEtleUVycm9yIGlzCisgICAgICAgIHJhaXNlZC4KKyAgICAgICAgIiIiCisgICAgICAgIF9uYW1lID0gX25hbWUubG93ZXIoKQorICAgICAgICBmb3IgaSwgKGssIHYpIGluIHppcChyYW5nZShsZW4oc2VsZi5faGVhZGVycykpLCBzZWxmLl9oZWFkZXJzKToKKyAgICAgICAgICAgIGlmIGsubG93ZXIoKSA9PSBfbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLl9oZWFkZXJzW2ldID0gKGssIF92YWx1ZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoX25hbWUpCisKKyAgICAjCisgICAgIyBVc2UgdGhlc2UgdGhyZWUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSB0aHJlZSBhYm92ZS4KKyAgICAjCisKKyAgICBkZWYgZ2V0X2NvbnRlbnRfdHlwZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgY29udGVudCB0eXBlLgorCisgICAgICAgIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY29lcmNlZCB0byBsb3dlciBjYXNlIG9mIHRoZSBmb3JtCisgICAgICAgIGBtYWludHlwZS9zdWJ0eXBlJy4gIElmIHRoZXJlIHdhcyBubyBDb250ZW50LVR5cGUgaGVhZGVyIGluIHRoZQorICAgICAgICBtZXNzYWdlLCB0aGUgZGVmYXVsdCB0eXBlIGFzIGdpdmVuIGJ5IGdldF9kZWZhdWx0X3R5cGUoKSB3aWxsIGJlCisgICAgICAgIHJldHVybmVkLiAgU2luY2UgYWNjb3JkaW5nIHRvIFJGQyAyMDQ1LCBtZXNzYWdlcyBhbHdheXMgaGF2ZSBhIGRlZmF1bHQKKyAgICAgICAgdHlwZSB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiBhIHZhbHVlLgorCisgICAgICAgIFJGQyAyMDQ1IGRlZmluZXMgYSBtZXNzYWdlJ3MgZGVmYXVsdCB0eXBlIHRvIGJlIHRleHQvcGxhaW4gdW5sZXNzIGl0CisgICAgICAgIGFwcGVhcnMgaW5zaWRlIGEgbXVsdGlwYXJ0L2RpZ2VzdCBjb250YWluZXIsIGluIHdoaWNoIGNhc2UgaXQgd291bGQgYmUKKyAgICAgICAgbWVzc2FnZS9yZmM4MjIuCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgdmFsdWUgPSBzZWxmLmdldCgnY29udGVudC10eXBlJywgbWlzc2luZykKKyAgICAgICAgaWYgdmFsdWUgaXMgbWlzc2luZzoKKyAgICAgICAgICAgICMgVGhpcyBzaG91bGQgaGF2ZSBubyBwYXJhbWV0ZXJzCisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfZGVmYXVsdF90eXBlKCkKKyAgICAgICAgY3R5cGUgPSBwYXJhbXJlLnNwbGl0KHZhbHVlKVswXS5sb3dlcigpLnN0cmlwKCkKKyAgICAgICAgIyBSRkMgMjA0NSwgc2VjdGlvbiA1LjIgc2F5cyBpZiBpdHMgaW52YWxpZCwgdXNlIHRleHQvcGxhaW4KKyAgICAgICAgaWYgY3R5cGUuY291bnQoJy8nKSAhPSAxOgorICAgICAgICAgICAgcmV0dXJuICd0ZXh0L3BsYWluJworICAgICAgICByZXR1cm4gY3R5cGUKKworICAgIGRlZiBnZXRfY29udGVudF9tYWludHlwZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgbWFpbiBjb250ZW50IHR5cGUuCisKKyAgICAgICAgVGhpcyBpcyB0aGUgYG1haW50eXBlJyBwYXJ0IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkKKyAgICAgICAgZ2V0X2NvbnRlbnRfdHlwZSgpLgorICAgICAgICAiIiIKKyAgICAgICAgY3R5cGUgPSBzZWxmLmdldF9jb250ZW50X3R5cGUoKQorICAgICAgICByZXR1cm4gY3R5cGUuc3BsaXQoJy8nKVswXQorCisgICAgZGVmIGdldF9jb250ZW50X3N1YnR5cGUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIG1lc3NhZ2UncyBzdWItY29udGVudCB0eXBlLgorCisgICAgICAgIFRoaXMgaXMgdGhlIGBzdWJ0eXBlJyBwYXJ0IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkKKyAgICAgICAgZ2V0X2NvbnRlbnRfdHlwZSgpLgorICAgICAgICAiIiIKKyAgICAgICAgY3R5cGUgPSBzZWxmLmdldF9jb250ZW50X3R5cGUoKQorICAgICAgICByZXR1cm4gY3R5cGUuc3BsaXQoJy8nKVsxXQorCisgICAgZGVmIGdldF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgYGRlZmF1bHQnIGNvbnRlbnQgdHlwZS4KKworICAgICAgICBNb3N0IG1lc3NhZ2VzIGhhdmUgYSBkZWZhdWx0IGNvbnRlbnQgdHlwZSBvZiB0ZXh0L3BsYWluLCBleGNlcHQgZm9yCisgICAgICAgIG1lc3NhZ2VzIHRoYXQgYXJlIHN1YnBhcnRzIG9mIG11bHRpcGFydC9kaWdlc3QgY29udGFpbmVycy4gIFN1Y2gKKyAgICAgICAgc3VicGFydHMgaGF2ZSBhIGRlZmF1bHQgY29udGVudCB0eXBlIG9mIG1lc3NhZ2UvcmZjODIyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RlZmF1bHRfdHlwZQorCisgICAgZGVmIHNldF9kZWZhdWx0X3R5cGUoc2VsZiwgY3R5cGUpOgorICAgICAgICAiIiJTZXQgdGhlIGBkZWZhdWx0JyBjb250ZW50IHR5cGUuCisKKyAgICAgICAgY3R5cGUgc2hvdWxkIGJlIGVpdGhlciAidGV4dC9wbGFpbiIgb3IgIm1lc3NhZ2UvcmZjODIyIiwgYWx0aG91Z2ggdGhpcworICAgICAgICBpcyBub3QgZW5mb3JjZWQuICBUaGUgZGVmYXVsdCBjb250ZW50IHR5cGUgaXMgbm90IHN0b3JlZCBpbiB0aGUKKyAgICAgICAgQ29udGVudC1UeXBlIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2RlZmF1bHRfdHlwZSA9IGN0eXBlCisKKyAgICBkZWYgX2dldF9wYXJhbXNfcHJlc2VydmUoc2VsZiwgZmFpbG9iaiwgaGVhZGVyKToKKyAgICAgICAgIyBMaWtlIGdldF9wYXJhbXMoKSBidXQgcHJlc2VydmVzIHRoZSBxdW90aW5nIG9mIHZhbHVlcy4gIEJBVzoKKyAgICAgICAgIyBzaG91bGQgdGhpcyBiZSBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlPworICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgdmFsdWUgPSBzZWxmLmdldChoZWFkZXIsIG1pc3NpbmcpCisgICAgICAgIGlmIHZhbHVlIGlzIG1pc3Npbmc6CisgICAgICAgICAgICByZXR1cm4gZmFpbG9iagorICAgICAgICBwYXJhbXMgPSBbXQorICAgICAgICBmb3IgcCBpbiBfcGFyc2VwYXJhbSgnOycgKyB2YWx1ZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmFtZSwgdmFsID0gcC5zcGxpdCgnPScsIDEpCisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQorICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdHJpcCgpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIE11c3QgaGF2ZSBiZWVuIGEgYmFyZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBuYW1lID0gcC5zdHJpcCgpCisgICAgICAgICAgICAgICAgdmFsID0gJycKKyAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoKG5hbWUsIHZhbCkpCisgICAgICAgIHBhcmFtcyA9IHV0aWxzLmRlY29kZV9wYXJhbXMocGFyYW1zKQorICAgICAgICByZXR1cm4gcGFyYW1zCisKKyAgICBkZWYgZ2V0X3BhcmFtcyhzZWxmLCBmYWlsb2JqPU5vbmUsIGhlYWRlcj0nY29udGVudC10eXBlJywgdW5xdW90ZT1UcnVlKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgQ29udGVudC1UeXBlIHBhcmFtZXRlcnMsIGFzIGEgbGlzdC4KKworICAgICAgICBUaGUgZWxlbWVudHMgb2YgdGhlIHJldHVybmVkIGxpc3QgYXJlIDItdHVwbGVzIG9mIGtleS92YWx1ZSBwYWlycywgYXMKKyAgICAgICAgc3BsaXQgb24gdGhlIGA9JyBzaWduLiAgVGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBgPScgaXMgdGhlIGtleSwKKyAgICAgICAgd2hpbGUgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpcyB0aGUgdmFsdWUuICBJZiB0aGVyZSBpcyBubyBgPScgc2lnbiBpbgorICAgICAgICB0aGUgcGFyYW1ldGVyIHRoZSB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLiAgVGhlIHZhbHVlIGlzIGFzCisgICAgICAgIGRlc2NyaWJlZCBpbiB0aGUgZ2V0X3BhcmFtKCkgbWV0aG9kLgorCisgICAgICAgIE9wdGlvbmFsIGZhaWxvYmogaXMgdGhlIG9iamVjdCB0byByZXR1cm4gaWYgdGhlcmUgaXMgbm8gQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlci4gIE9wdGlvbmFsIGhlYWRlciBpcyB0aGUgaGVhZGVyIHRvIHNlYXJjaCBpbnN0ZWFkIG9mCisgICAgICAgIENvbnRlbnQtVHlwZS4gIElmIHVucXVvdGUgaXMgVHJ1ZSwgdGhlIHZhbHVlIGlzIHVucXVvdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIHBhcmFtcyA9IHNlbGYuX2dldF9wYXJhbXNfcHJlc2VydmUobWlzc2luZywgaGVhZGVyKQorICAgICAgICBpZiBwYXJhbXMgaXMgbWlzc2luZzoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgIGlmIHVucXVvdGU6CisgICAgICAgICAgICByZXR1cm4gWyhrLCBfdW5xdW90ZXZhbHVlKHYpKSBmb3IgaywgdiBpbiBwYXJhbXNdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcGFyYW1zCisKKyAgICBkZWYgZ2V0X3BhcmFtKHNlbGYsIHBhcmFtLCBmYWlsb2JqPU5vbmUsIGhlYWRlcj0nY29udGVudC10eXBlJywKKyAgICAgICAgICAgICAgICAgIHVucXVvdGU9VHJ1ZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgcGFyYW1ldGVyIHZhbHVlIGlmIGZvdW5kIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIE9wdGlvbmFsIGZhaWxvYmogaXMgdGhlIG9iamVjdCB0byByZXR1cm4gaWYgdGhlcmUgaXMgbm8gQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlciwgb3IgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaGFzIG5vIHN1Y2ggcGFyYW1ldGVyLiAgT3B0aW9uYWwKKyAgICAgICAgaGVhZGVyIGlzIHRoZSBoZWFkZXIgdG8gc2VhcmNoIGluc3RlYWQgb2YgQ29udGVudC1UeXBlLgorCisgICAgICAgIFBhcmFtZXRlciBrZXlzIGFyZSBhbHdheXMgY29tcGFyZWQgY2FzZSBpbnNlbnNpdGl2ZWx5LiAgVGhlIHJldHVybgorICAgICAgICB2YWx1ZSBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nLCBvciBhIDMtdHVwbGUgaWYgdGhlIHBhcmFtZXRlciB3YXMgUkZDCisgICAgICAgIDIyMzEgZW5jb2RlZC4gIFdoZW4gaXQncyBhIDMtdHVwbGUsIHRoZSBlbGVtZW50cyBvZiB0aGUgdmFsdWUgYXJlIG9mCisgICAgICAgIHRoZSBmb3JtIChDSEFSU0VULCBMQU5HVUFHRSwgVkFMVUUpLiAgTm90ZSB0aGF0IGJvdGggQ0hBUlNFVCBhbmQKKyAgICAgICAgTEFOR1VBR0UgY2FuIGJlIE5vbmUsIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBjb25zaWRlciBWQUxVRSB0byBiZQorICAgICAgICBlbmNvZGVkIGluIHRoZSB1cy1hc2NpaSBjaGFyc2V0LiAgWW91IGNhbiB1c3VhbGx5IGlnbm9yZSBMQU5HVUFHRS4KKworICAgICAgICBZb3VyIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggMy10dXBsZSByZXR1cm4KKyAgICAgICAgdmFsdWVzLCBhbmQgY2FuIGNvbnZlcnQgdGhlIHBhcmFtZXRlciB0byBhIFVuaWNvZGUgc3RyaW5nIGxpa2Ugc286CisKKyAgICAgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnZm9vJykKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKToKKyAgICAgICAgICAgICAgICBwYXJhbSA9IHVuaWNvZGUocGFyYW1bMl0sIHBhcmFtWzBdIG9yICd1cy1hc2NpaScpCisKKyAgICAgICAgSW4gYW55IGNhc2UsIHRoZSBwYXJhbWV0ZXIgdmFsdWUgKGVpdGhlciB0aGUgcmV0dXJuZWQgc3RyaW5nLCBvciB0aGUKKyAgICAgICAgVkFMVUUgaXRlbSBpbiB0aGUgMy10dXBsZSkgaXMgYWx3YXlzIHVucXVvdGVkLCB1bmxlc3MgdW5xdW90ZSBpcyBzZXQKKyAgICAgICAgdG8gRmFsc2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBoZWFkZXIgbm90IGluIHNlbGY6CisgICAgICAgICAgICByZXR1cm4gZmFpbG9iagorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl9nZXRfcGFyYW1zX3ByZXNlcnZlKGZhaWxvYmosIGhlYWRlcik6CisgICAgICAgICAgICBpZiBrLmxvd2VyKCkgPT0gcGFyYW0ubG93ZXIoKToKKyAgICAgICAgICAgICAgICBpZiB1bnF1b3RlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3VucXVvdGV2YWx1ZSh2KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIHJldHVybiBmYWlsb2JqCisKKyAgICBkZWYgc2V0X3BhcmFtKHNlbGYsIHBhcmFtLCB2YWx1ZSwgaGVhZGVyPSdDb250ZW50LVR5cGUnLCByZXF1b3RlPVRydWUsCisgICAgICAgICAgICAgICAgICBjaGFyc2V0PU5vbmUsIGxhbmd1YWdlPScnKToKKyAgICAgICAgIiIiU2V0IGEgcGFyYW1ldGVyIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIElmIHRoZSBwYXJhbWV0ZXIgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGhlYWRlciwgaXRzIHZhbHVlIHdpbGwgYmUKKyAgICAgICAgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IHZhbHVlLgorCisgICAgICAgIElmIGhlYWRlciBpcyBDb250ZW50LVR5cGUgYW5kIGhhcyBub3QgeWV0IGJlZW4gZGVmaW5lZCBmb3IgdGhpcworICAgICAgICBtZXNzYWdlLCBpdCB3aWxsIGJlIHNldCB0byAidGV4dC9wbGFpbiIgYW5kIHRoZSBuZXcgcGFyYW1ldGVyIGFuZAorICAgICAgICB2YWx1ZSB3aWxsIGJlIGFwcGVuZGVkIGFzIHBlciBSRkMgMjA0NS4KKworICAgICAgICBBbiBhbHRlcm5hdGUgaGVhZGVyIGNhbiBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBhcmd1bWVudCwgYW5kIGFsbAorICAgICAgICBwYXJhbWV0ZXJzIHdpbGwgYmUgcXVvdGVkIGFzIG5lY2Vzc2FyeSB1bmxlc3MgcmVxdW90ZSBpcyBGYWxzZS4KKworICAgICAgICBJZiBjaGFyc2V0IGlzIHNwZWNpZmllZCwgdGhlIHBhcmFtZXRlciB3aWxsIGJlIGVuY29kZWQgYWNjb3JkaW5nIHRvIFJGQworICAgICAgICAyMjMxLiAgT3B0aW9uYWwgbGFuZ3VhZ2Ugc3BlY2lmaWVzIHRoZSBSRkMgMjIzMSBsYW5ndWFnZSwgZGVmYXVsdGluZworICAgICAgICB0byB0aGUgZW1wdHkgc3RyaW5nLiAgQm90aCBjaGFyc2V0IGFuZCBsYW5ndWFnZSBzaG91bGQgYmUgc3RyaW5ncy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSkgYW5kIGNoYXJzZXQ6CisgICAgICAgICAgICB2YWx1ZSA9IChjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUpCisKKyAgICAgICAgaWYgaGVhZGVyIG5vdCBpbiBzZWxmIGFuZCBoZWFkZXIubG93ZXIoKSA9PSAnY29udGVudC10eXBlJzoKKyAgICAgICAgICAgIGN0eXBlID0gJ3RleHQvcGxhaW4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjdHlwZSA9IHNlbGYuZ2V0KGhlYWRlcikKKyAgICAgICAgaWYgbm90IHNlbGYuZ2V0X3BhcmFtKHBhcmFtLCBoZWFkZXI9aGVhZGVyKToKKyAgICAgICAgICAgIGlmIG5vdCBjdHlwZToKKyAgICAgICAgICAgICAgICBjdHlwZSA9IF9mb3JtYXRwYXJhbShwYXJhbSwgdmFsdWUsIHJlcXVvdGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN0eXBlID0gU0VNSVNQQUNFLmpvaW4oCisgICAgICAgICAgICAgICAgICAgIFtjdHlwZSwgX2Zvcm1hdHBhcmFtKHBhcmFtLCB2YWx1ZSwgcmVxdW90ZSldKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3R5cGUgPSAnJworICAgICAgICAgICAgZm9yIG9sZF9wYXJhbSwgb2xkX3ZhbHVlIGluIHNlbGYuZ2V0X3BhcmFtcyhoZWFkZXI9aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnF1b3RlPXJlcXVvdGUpOgorICAgICAgICAgICAgICAgIGFwcGVuZF9wYXJhbSA9ICcnCisgICAgICAgICAgICAgICAgaWYgb2xkX3BhcmFtLmxvd2VyKCkgPT0gcGFyYW0ubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3BhcmFtID0gX2Zvcm1hdHBhcmFtKHBhcmFtLCB2YWx1ZSwgcmVxdW90ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhcHBlbmRfcGFyYW0gPSBfZm9ybWF0cGFyYW0ob2xkX3BhcmFtLCBvbGRfdmFsdWUsIHJlcXVvdGUpCisgICAgICAgICAgICAgICAgaWYgbm90IGN0eXBlOgorICAgICAgICAgICAgICAgICAgICBjdHlwZSA9IGFwcGVuZF9wYXJhbQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGN0eXBlID0gU0VNSVNQQUNFLmpvaW4oW2N0eXBlLCBhcHBlbmRfcGFyYW1dKQorICAgICAgICBpZiBjdHlwZSAhPSBzZWxmLmdldChoZWFkZXIpOgorICAgICAgICAgICAgZGVsIHNlbGZbaGVhZGVyXQorICAgICAgICAgICAgc2VsZltoZWFkZXJdID0gY3R5cGUKKworICAgIGRlZiBkZWxfcGFyYW0oc2VsZiwgcGFyYW0sIGhlYWRlcj0nY29udGVudC10eXBlJywgcmVxdW90ZT1UcnVlKToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBnaXZlbiBwYXJhbWV0ZXIgY29tcGxldGVseSBmcm9tIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIFRoZSBoZWFkZXIgd2lsbCBiZSByZS13cml0dGVuIGluIHBsYWNlIHdpdGhvdXQgdGhlIHBhcmFtZXRlciBvciBpdHMKKyAgICAgICAgdmFsdWUuIEFsbCB2YWx1ZXMgd2lsbCBiZSBxdW90ZWQgYXMgbmVjZXNzYXJ5IHVubGVzcyByZXF1b3RlIGlzCisgICAgICAgIEZhbHNlLiAgT3B0aW9uYWwgaGVhZGVyIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGhlYWRlciBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBuZXdfY3R5cGUgPSAnJworICAgICAgICBmb3IgcCwgdiBpbiBzZWxmLmdldF9wYXJhbXMoaGVhZGVyPWhlYWRlciwgdW5xdW90ZT1yZXF1b3RlKToKKyAgICAgICAgICAgIGlmIHAubG93ZXIoKSAhPSBwYXJhbS5sb3dlcigpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBuZXdfY3R5cGU6CisgICAgICAgICAgICAgICAgICAgIG5ld19jdHlwZSA9IF9mb3JtYXRwYXJhbShwLCB2LCByZXF1b3RlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5ld19jdHlwZSA9IFNFTUlTUEFDRS5qb2luKFtuZXdfY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZm9ybWF0cGFyYW0ocCwgdiwgcmVxdW90ZSldKQorICAgICAgICBpZiBuZXdfY3R5cGUgIT0gc2VsZi5nZXQoaGVhZGVyKToKKyAgICAgICAgICAgIGRlbCBzZWxmW2hlYWRlcl0KKyAgICAgICAgICAgIHNlbGZbaGVhZGVyXSA9IG5ld19jdHlwZQorCisgICAgZGVmIHNldF90eXBlKHNlbGYsIHR5cGUsIGhlYWRlcj0nQ29udGVudC1UeXBlJywgcmVxdW90ZT1UcnVlKToKKyAgICAgICAgIiIiU2V0IHRoZSBtYWluIHR5cGUgYW5kIHN1YnR5cGUgZm9yIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIHR5cGUgbXVzdCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSAibWFpbnR5cGUvc3VidHlwZSIsIG90aGVyd2lzZSBhCisgICAgICAgIFZhbHVlRXJyb3IgaXMgcmFpc2VkLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLCBrZWVwaW5nIGFsbCB0aGUKKyAgICAgICAgcGFyYW1ldGVycyBpbiBwbGFjZS4gIElmIHJlcXVvdGUgaXMgRmFsc2UsIHRoaXMgbGVhdmVzIHRoZSBleGlzdGluZworICAgICAgICBoZWFkZXIncyBxdW90aW5nIGFzIGlzLiAgT3RoZXJ3aXNlLCB0aGUgcGFyYW1ldGVycyB3aWxsIGJlIHF1b3RlZCAodGhlCisgICAgICAgIGRlZmF1bHQpLgorCisgICAgICAgIEFuIGFsdGVybmF0aXZlIGhlYWRlciBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIgYXJndW1lbnQuICBXaGVuCisgICAgICAgIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGlzIHNldCwgd2UnbGwgYWx3YXlzIGFsc28gYWRkIGEgTUlNRS1WZXJzaW9uCisgICAgICAgIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgICMgQkFXOiBzaG91bGQgd2UgYmUgc3RyaWN0PworICAgICAgICBpZiBub3QgdHlwZS5jb3VudCgnLycpID09IDE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgICMgU2V0IHRoZSBDb250ZW50LVR5cGUsIHlvdSBnZXQgYSBNSU1FLVZlcnNpb24KKyAgICAgICAgaWYgaGVhZGVyLmxvd2VyKCkgPT0gJ2NvbnRlbnQtdHlwZSc6CisgICAgICAgICAgICBkZWwgc2VsZlsnbWltZS12ZXJzaW9uJ10KKyAgICAgICAgICAgIHNlbGZbJ01JTUUtVmVyc2lvbiddID0gJzEuMCcKKyAgICAgICAgaWYgaGVhZGVyIG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgc2VsZltoZWFkZXJdID0gdHlwZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBhcmFtcyA9IHNlbGYuZ2V0X3BhcmFtcyhoZWFkZXI9aGVhZGVyLCB1bnF1b3RlPXJlcXVvdGUpCisgICAgICAgIGRlbCBzZWxmW2hlYWRlcl0KKyAgICAgICAgc2VsZltoZWFkZXJdID0gdHlwZQorICAgICAgICAjIFNraXAgdGhlIGZpcnN0IHBhcmFtOyBpdCdzIHRoZSBvbGQgdHlwZS4KKyAgICAgICAgZm9yIHAsIHYgaW4gcGFyYW1zWzE6XToKKyAgICAgICAgICAgIHNlbGYuc2V0X3BhcmFtKHAsIHYsIGhlYWRlciwgcmVxdW90ZSkKKworICAgIGRlZiBnZXRfZmlsZW5hbWUoc2VsZiwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBmaWxlbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBheWxvYWQgaWYgcHJlc2VudC4KKworICAgICAgICBUaGUgZmlsZW5hbWUgaXMgZXh0cmFjdGVkIGZyb20gdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyJ3MKKyAgICAgICAgYGZpbGVuYW1lJyBwYXJhbWV0ZXIsIGFuZCBpdCBpcyB1bnF1b3RlZC4gIElmIHRoYXQgaGVhZGVyIGlzIG1pc3NpbmcKKyAgICAgICAgdGhlIGBmaWxlbmFtZScgcGFyYW1ldGVyLCB0aGlzIG1ldGhvZCBmYWxscyBiYWNrIHRvIGxvb2tpbmcgZm9yIHRoZQorICAgICAgICBgbmFtZScgcGFyYW1ldGVyLgorICAgICAgICAiIiIKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfcGFyYW0oJ2ZpbGVuYW1lJywgbWlzc2luZywgJ2NvbnRlbnQtZGlzcG9zaXRpb24nKQorICAgICAgICBpZiBmaWxlbmFtZSBpcyBtaXNzaW5nOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9wYXJhbSgnbmFtZScsIG1pc3NpbmcsICdjb250ZW50LWRpc3Bvc2l0aW9uJykKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgbWlzc2luZzoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgIHJldHVybiB1dGlscy5jb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKGZpbGVuYW1lKS5zdHJpcCgpCisKKyAgICBkZWYgZ2V0X2JvdW5kYXJ5KHNlbGYsIGZhaWxvYmo9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgYm91bmRhcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXlsb2FkIGlmIHByZXNlbnQuCisKKyAgICAgICAgVGhlIGJvdW5kYXJ5IGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyJ3MgYGJvdW5kYXJ5JworICAgICAgICBwYXJhbWV0ZXIsIGFuZCBpdCBpcyB1bnF1b3RlZC4KKyAgICAgICAgIiIiCisgICAgICAgIG1pc3NpbmcgPSBvYmplY3QoKQorICAgICAgICBib3VuZGFyeSA9IHNlbGYuZ2V0X3BhcmFtKCdib3VuZGFyeScsIG1pc3NpbmcpCisgICAgICAgIGlmIGJvdW5kYXJ5IGlzIG1pc3Npbmc6CisgICAgICAgICAgICByZXR1cm4gZmFpbG9iagorICAgICAgICAjIFJGQyAyMDQ2IHNheXMgdGhhdCBib3VuZGFyaWVzIG1heSBiZWdpbiBidXQgbm90IGVuZCBpbiB3L3MKKyAgICAgICAgcmV0dXJuIHV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoYm91bmRhcnkpLnJzdHJpcCgpCisKKyAgICBkZWYgc2V0X2JvdW5kYXJ5KHNlbGYsIGJvdW5kYXJ5KToKKyAgICAgICAgIiIiU2V0IHRoZSBib3VuZGFyeSBwYXJhbWV0ZXIgaW4gQ29udGVudC1UeXBlIHRvICdib3VuZGFyeScuCisKKyAgICAgICAgVGhpcyBpcyBzdWJ0bHkgZGlmZmVyZW50IHRoYW4gZGVsZXRpbmcgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgYW5kCisgICAgICAgIGFkZGluZyBhIG5ldyBvbmUgd2l0aCBhIG5ldyBib3VuZGFyeSBwYXJhbWV0ZXIgdmlhIGFkZF9oZWFkZXIoKS4gIFRoZQorICAgICAgICBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB1c2luZyB0aGUgc2V0X2JvdW5kYXJ5KCkgbWV0aG9kIHByZXNlcnZlcyB0aGUKKyAgICAgICAgb3JkZXIgb2YgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaW4gdGhlIG9yaWdpbmFsIG1lc3NhZ2UuCisKKyAgICAgICAgSGVhZGVyUGFyc2VFcnJvciBpcyByYWlzZWQgaWYgdGhlIG1lc3NhZ2UgaGFzIG5vIENvbnRlbnQtVHlwZSBoZWFkZXIuCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgcGFyYW1zID0gc2VsZi5fZ2V0X3BhcmFtc19wcmVzZXJ2ZShtaXNzaW5nLCAnY29udGVudC10eXBlJykKKyAgICAgICAgaWYgcGFyYW1zIGlzIG1pc3Npbmc6CisgICAgICAgICAgICAjIFRoZXJlIHdhcyBubyBDb250ZW50LVR5cGUgaGVhZGVyLCBhbmQgd2UgZG9uJ3Qga25vdyB3aGF0IHR5cGUKKyAgICAgICAgICAgICMgdG8gc2V0IGl0IHRvLCBzbyByYWlzZSBhbiBleGNlcHRpb24uCisgICAgICAgICAgICByYWlzZSBlcnJvcnMuSGVhZGVyUGFyc2VFcnJvcignTm8gQ29udGVudC1UeXBlIGhlYWRlciBmb3VuZCcpCisgICAgICAgIG5ld3BhcmFtcyA9IFtdCisgICAgICAgIGZvdW5kcCA9IEZhbHNlCisgICAgICAgIGZvciBwaywgcHYgaW4gcGFyYW1zOgorICAgICAgICAgICAgaWYgcGsubG93ZXIoKSA9PSAnYm91bmRhcnknOgorICAgICAgICAgICAgICAgIG5ld3BhcmFtcy5hcHBlbmQoKCdib3VuZGFyeScsICciJXMiJyAlIGJvdW5kYXJ5KSkKKyAgICAgICAgICAgICAgICBmb3VuZHAgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld3BhcmFtcy5hcHBlbmQoKHBrLCBwdikpCisgICAgICAgIGlmIG5vdCBmb3VuZHA6CisgICAgICAgICAgICAjIFRoZSBvcmlnaW5hbCBDb250ZW50LVR5cGUgaGVhZGVyIGhhZCBubyBib3VuZGFyeSBhdHRyaWJ1dGUuCisgICAgICAgICAgICAjIFRhY2sgb25lIG9uIHRoZSBlbmQuICBCQVc6IHNob3VsZCB3ZSByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICMgaW5zdGVhZD8/PworICAgICAgICAgICAgbmV3cGFyYW1zLmFwcGVuZCgoJ2JvdW5kYXJ5JywgJyIlcyInICUgYm91bmRhcnkpKQorICAgICAgICAjIFJlcGxhY2UgdGhlIGV4aXN0aW5nIENvbnRlbnQtVHlwZSBoZWFkZXIgd2l0aCB0aGUgbmV3IHZhbHVlCisgICAgICAgIG5ld2hlYWRlcnMgPSBbXQorICAgICAgICBmb3IgaCwgdiBpbiBzZWxmLl9oZWFkZXJzOgorICAgICAgICAgICAgaWYgaC5sb3dlcigpID09ICdjb250ZW50LXR5cGUnOgorICAgICAgICAgICAgICAgIHBhcnRzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBuZXdwYXJhbXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHYgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoaykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnJXM9JXMnICUgKGssIHYpKQorICAgICAgICAgICAgICAgIG5ld2hlYWRlcnMuYXBwZW5kKChoLCBTRU1JU1BBQ0Uuam9pbihwYXJ0cykpKQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld2hlYWRlcnMuYXBwZW5kKChoLCB2KSkKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IG5ld2hlYWRlcnMKKworICAgIGRlZiBnZXRfY29udGVudF9jaGFyc2V0KHNlbGYsIGZhaWxvYmo9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgY2hhcnNldCBwYXJhbWV0ZXIgb2YgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIuCisKKyAgICAgICAgVGhlIHJldHVybmVkIHN0cmluZyBpcyBhbHdheXMgY29lcmNlZCB0byBsb3dlciBjYXNlLiAgSWYgdGhlcmUgaXMgbm8KKyAgICAgICAgQ29udGVudC1UeXBlIGhlYWRlciwgb3IgaWYgdGhhdCBoZWFkZXIgaGFzIG5vIGNoYXJzZXQgcGFyYW1ldGVyLAorICAgICAgICBmYWlsb2JqIGlzIHJldHVybmVkLgorICAgICAgICAiIiIKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIGNoYXJzZXQgPSBzZWxmLmdldF9wYXJhbSgnY2hhcnNldCcsIG1pc3NpbmcpCisgICAgICAgIGlmIGNoYXJzZXQgaXMgbWlzc2luZzoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hhcnNldCwgdHVwbGUpOgorICAgICAgICAgICAgIyBSRkMgMjIzMSBlbmNvZGVkLCBzbyBkZWNvZGUgaXQsIGFuZCBpdCBiZXR0ZXIgZW5kIHVwIGFzIGFzY2lpLgorICAgICAgICAgICAgcGNoYXJzZXQgPSBjaGFyc2V0WzBdIG9yICd1cy1hc2NpaScKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIExvb2t1cEVycm9yIHdpbGwgYmUgcmFpc2VkIGlmIHRoZSBjaGFyc2V0IGlzbid0IGtub3duIHRvCisgICAgICAgICAgICAgICAgIyBQeXRob24uICBVbmljb2RlRXJyb3Igd2lsbCBiZSByYWlzZWQgaWYgdGhlIGVuY29kZWQgdGV4dAorICAgICAgICAgICAgICAgICMgY29udGFpbnMgYSBjaGFyYWN0ZXIgbm90IGluIHRoZSBjaGFyc2V0LgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBzdHIoYnl0ZXMoY2hhcnNldFsyXSksIHBjaGFyc2V0KQorICAgICAgICAgICAgZXhjZXB0IChMb29rdXBFcnJvciwgVW5pY29kZUVycm9yKToKKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gY2hhcnNldFsyXQorICAgICAgICAjIGNoYXJzZXQgY2hhcmFjdGVycyBtdXN0IGJlIGluIHVzLWFzY2lpIHJhbmdlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNoYXJzZXQuZW5jb2RlKCd1cy1hc2NpaScpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gZmFpbG9iagorICAgICAgICAjIFJGQyAyMDQ2LCAkNC4xLjIgc2F5cyBjaGFyc2V0cyBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlCisgICAgICAgIHJldHVybiBjaGFyc2V0Lmxvd2VyKCkKKworICAgIGRlZiBnZXRfY2hhcnNldHMoc2VsZiwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBjaGFyc2V0KHMpIHVzZWQgaW4gdGhpcyBtZXNzYWdlLgorCisgICAgICAgIFRoZSByZXR1cm5lZCBsaXN0IG9mIGl0ZW1zIGRlc2NyaWJlcyB0aGUgQ29udGVudC1UeXBlIGhlYWRlcnMnCisgICAgICAgIGNoYXJzZXQgcGFyYW1ldGVyIGZvciB0aGlzIG1lc3NhZ2UgYW5kIGFsbCB0aGUgc3VicGFydHMgaW4gaXRzCisgICAgICAgIHBheWxvYWQuCisKKyAgICAgICAgRWFjaCBpdGVtIHdpbGwgZWl0aGVyIGJlIGEgc3RyaW5nICh0aGUgdmFsdWUgb2YgdGhlIGNoYXJzZXQgcGFyYW1ldGVyCisgICAgICAgIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIG9mIHRoYXQgcGFydCkgb3IgdGhlIHZhbHVlIG9mIHRoZQorICAgICAgICAnZmFpbG9iaicgcGFyYW1ldGVyIChkZWZhdWx0cyB0byBOb25lKSwgaWYgdGhlIHBhcnQgZG9lcyBub3QgaGF2ZSBhCisgICAgICAgIG1haW4gTUlNRSB0eXBlIG9mICJ0ZXh0Iiwgb3IgdGhlIGNoYXJzZXQgaXMgbm90IGRlZmluZWQuCisKKyAgICAgICAgVGhlIGxpc3Qgd2lsbCBjb250YWluIG9uZSBzdHJpbmcgZm9yIGVhY2ggcGFydCBvZiB0aGUgbWVzc2FnZSwgcGx1cworICAgICAgICBvbmUgZm9yIHRoZSBjb250YWluZXIgbWVzc2FnZSAoaS5lLiBzZWxmKSwgc28gdGhhdCBhIG5vbi1tdWx0aXBhcnQKKyAgICAgICAgbWVzc2FnZSB3aWxsIHN0aWxsIHJldHVybiBhIGxpc3Qgb2YgbGVuZ3RoIDEuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gW3BhcnQuZ2V0X2NvbnRlbnRfY2hhcnNldChmYWlsb2JqKSBmb3IgcGFydCBpbiBzZWxmLndhbGsoKV0KKworICAgICMgSS5lLiBkZWYgd2FsayhzZWxmKTogLi4uCisgICAgZnJvbSBlbWFpbC5pdGVyYXRvcnMgaW1wb3J0IHdhbGsKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5IGIvTGliL2VtYWlsL21pbWUvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weSBiL0xpYi9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGJiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weQpAQCAtMCwwICsxLDM2IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogS2VpdGggRGFydAorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJDbGFzcyByZXByZXNlbnRpbmcgYXBwbGljYXRpb24vKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgorCitfX2FsbF9fID0gWyJNSU1FQXBwbGljYXRpb24iXQorCitmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAorCisKK2NsYXNzIE1JTUVBcHBsaWNhdGlvbihNSU1FTm9uTXVsdGlwYXJ0KToKKyAgICAiIiJDbGFzcyBmb3IgZ2VuZXJhdGluZyBhcHBsaWNhdGlvbi8qIE1JTUUgZG9jdW1lbnRzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9kYXRhLCBfc3VidHlwZT0nb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgICAgICAgICAgX2VuY29kZXI9ZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NCwgKipfcGFyYW1zKToKKyAgICAgICAgIiIiQ3JlYXRlIGFuIGFwcGxpY2F0aW9uLyogdHlwZSBNSU1FIGRvY3VtZW50LgorCisgICAgICAgIF9kYXRhIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJhdyBhcHBsaWNhdG9pbiBkYXRhLgorCisgICAgICAgIF9zdWJ0eXBlIGlzIHRoZSBNSU1FIGNvbnRlbnQgdHlwZSBzdWJ0eXBlLCBkZWZhdWx0aW5nIHRvCisgICAgICAgICdvY3RldC1zdHJlYW0nLgorCisgICAgICAgIF9lbmNvZGVyIGlzIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBwZXJmb3JtIHRoZSBhY3R1YWwgZW5jb2RpbmcgZm9yCisgICAgICAgIHRyYW5zcG9ydCBvZiB0aGUgYXBwbGljYXRpb24gZGF0YSwgZGVmYXVsdGluZyB0byBiYXNlNjQgZW5jb2RpbmcuCisKKyAgICAgICAgQW55IGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgYmFzZSBjbGFzcworICAgICAgICBjb25zdHJ1Y3Rvciwgd2hpY2ggdHVybnMgdGhlbSBpbnRvIHBhcmFtZXRlcnMgb24gdGhlIENvbnRlbnQtVHlwZQorICAgICAgICBoZWFkZXIuCisgICAgICAgICIiIgorICAgICAgICBpZiBfc3VidHlwZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdJbnZhbGlkIGFwcGxpY2F0aW9uIE1JTUUgc3VidHlwZScpCisgICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ2FwcGxpY2F0aW9uJywgX3N1YnR5cGUsICoqX3BhcmFtcykKKyAgICAgICAgc2VsZi5zZXRfcGF5bG9hZChfZGF0YSkKKyAgICAgICAgX2VuY29kZXIoc2VsZikKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9taW1lL2F1ZGlvLnB5IGIvTGliL2VtYWlsL21pbWUvYXVkaW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjMTE4OQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9taW1lL2F1ZGlvLnB5CkBAIC0wLDAgKzEsNzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBBbnRob255IEJheHRlcgorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJDbGFzcyByZXByZXNlbnRpbmcgYXVkaW8vKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgorCitfX2FsbF9fID0gWydNSU1FQXVkaW8nXQorCitpbXBvcnQgc25kaGRyCisKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CisKKworDAorX3NuZGhkcl9NSU1FbWFwID0geydhdScgIDogJ2Jhc2ljJywKKyAgICAgICAgICAgICAgICAgICAnd2F2JyA6J3gtd2F2JywKKyAgICAgICAgICAgICAgICAgICAnYWlmZic6J3gtYWlmZicsCisgICAgICAgICAgICAgICAgICAgJ2FpZmMnOid4LWFpZmYnLAorICAgICAgICAgICAgICAgICAgIH0KKworIyBUaGVyZSBhcmUgb3RoZXJzIGluIHNuZGhkciB0aGF0IGRvbid0IGhhdmUgTUlNRSB0eXBlcy4gOigKKyMgQWRkaXRpb25hbCBvbmVzIHRvIGJlIGFkZGVkIHRvIHNuZGhkcj8gbWlkaSwgbXAzLCByZWFsYXVkaW8sIHdtYT8/CitkZWYgX3doYXRzbmQoZGF0YSk6CisgICAgIiIiVHJ5IHRvIGlkZW50aWZ5IGEgc291bmQgZmlsZSB0eXBlLgorCisgICAgc25kaGRyLndoYXQoKSBoYXMgYSBwcmV0dHkgY3J1ZGR5IGludGVyZmFjZSwgdW5mb3J0dW5hdGVseS4gIFRoaXMgaXMgd2h5CisgICAgd2UgcmUtZG8gaXQgaGVyZS4gIEl0IHdvdWxkIGJlIGVhc2llciB0byByZXZlcnNlIGVuZ2luZWVyIHRoZSBVbml4ICdmaWxlJworICAgIGNvbW1hbmQgYW5kIHVzZSB0aGUgc3RhbmRhcmQgJ21hZ2ljJyBmaWxlLCBhcyBzaGlwcGVkIHdpdGggYSBtb2Rlcm4gVW5peC4KKyAgICAiIiIKKyAgICBoZHIgPSBkYXRhWzo1MTJdCisgICAgZmFrZWZpbGUgPSBCeXRlc0lPKGhkcikKKyAgICBmb3IgdGVzdGZuIGluIHNuZGhkci50ZXN0czoKKyAgICAgICAgcmVzID0gdGVzdGZuKGhkciwgZmFrZWZpbGUpCisgICAgICAgIGlmIHJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBfc25kaGRyX01JTUVtYXAuZ2V0KHJlc1swXSkKKyAgICByZXR1cm4gTm9uZQorCisKKwwKK2NsYXNzIE1JTUVBdWRpbyhNSU1FTm9uTXVsdGlwYXJ0KToKKyAgICAiIiJDbGFzcyBmb3IgZ2VuZXJhdGluZyBhdWRpby8qIE1JTUUgZG9jdW1lbnRzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9hdWRpb2RhdGEsIF9zdWJ0eXBlPU5vbmUsCisgICAgICAgICAgICAgICAgIF9lbmNvZGVyPWVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcyk6CisgICAgICAgICIiIkNyZWF0ZSBhbiBhdWRpby8qIHR5cGUgTUlNRSBkb2N1bWVudC4KKworICAgICAgICBfYXVkaW9kYXRhIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJhdyBhdWRpbyBkYXRhLiAgSWYgdGhpcyBkYXRhCisgICAgICAgIGNhbiBiZSBkZWNvZGVkIGJ5IHRoZSBzdGFuZGFyZCBQeXRob24gYHNuZGhkcicgbW9kdWxlLCB0aGVuIHRoZQorICAgICAgICBzdWJ0eXBlIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlci4KKyAgICAgICAgT3RoZXJ3aXNlLCB5b3UgY2FuIHNwZWNpZnkgIHRoZSBzcGVjaWZpYyBhdWRpbyBzdWJ0eXBlIHZpYSB0aGUKKyAgICAgICAgX3N1YnR5cGUgcGFyYW1ldGVyLiAgSWYgX3N1YnR5cGUgaXMgbm90IGdpdmVuLCBhbmQgbm8gc3VidHlwZSBjYW4gYmUKKyAgICAgICAgZ3Vlc3NlZCwgYSBUeXBlRXJyb3IgaXMgcmFpc2VkLgorCisgICAgICAgIF9lbmNvZGVyIGlzIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBwZXJmb3JtIHRoZSBhY3R1YWwgZW5jb2RpbmcgZm9yCisgICAgICAgIHRyYW5zcG9ydCBvZiB0aGUgaW1hZ2UgZGF0YS4gIEl0IHRha2VzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhpcworICAgICAgICBJbWFnZSBpbnN0YW5jZS4gIEl0IHNob3VsZCB1c2UgZ2V0X3BheWxvYWQoKSBhbmQgc2V0X3BheWxvYWQoKSB0bworICAgICAgICBjaGFuZ2UgdGhlIHBheWxvYWQgdG8gdGhlIGVuY29kZWQgZm9ybS4gIEl0IHNob3VsZCBhbHNvIGFkZCBhbnkKKyAgICAgICAgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBvciBvdGhlciBoZWFkZXJzIHRvIHRoZSBtZXNzYWdlIGFzCisgICAgICAgIG5lY2Vzc2FyeS4gIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIEJhc2U2NC4KKworICAgICAgICBBbnkgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBiYXNlIGNsYXNzCisgICAgICAgIGNvbnN0cnVjdG9yLCB3aGljaCB0dXJucyB0aGVtIGludG8gcGFyYW1ldGVycyBvbiB0aGUgQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIF9zdWJ0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICBfc3VidHlwZSA9IF93aGF0c25kKF9hdWRpb2RhdGEpCisgICAgICAgIGlmIF9zdWJ0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGF1ZGlvIE1JTUUgc3VidHlwZScpCisgICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ2F1ZGlvJywgX3N1YnR5cGUsICoqX3BhcmFtcykKKyAgICAgICAgc2VsZi5zZXRfcGF5bG9hZChfYXVkaW9kYXRhKQorICAgICAgICBfZW5jb2RlcihzZWxmKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL21pbWUvYmFzZS5weSBiL0xpYi9lbWFpbC9taW1lL2Jhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5MTkyNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9taW1lL2Jhc2UucHkKQEAgLTAsMCArMSwyNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJCYXNlIGNsYXNzIGZvciBNSU1FIHNwZWNpYWxpemF0aW9ucy4iIiIKKworX19hbGxfXyA9IFsnTUlNRUJhc2UnXQorCitmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlCisKKworDAorY2xhc3MgTUlNRUJhc2UobWVzc2FnZS5NZXNzYWdlKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBNSU1FIHNwZWNpYWxpemF0aW9ucy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfbWFpbnR5cGUsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpOgorICAgICAgICAiIiJUaGlzIGNvbnN0cnVjdG9yIGFkZHMgYSBDb250ZW50LVR5cGU6IGFuZCBhIE1JTUUtVmVyc2lvbjogaGVhZGVyLgorCisgICAgICAgIFRoZSBDb250ZW50LVR5cGU6IGhlYWRlciBpcyB0YWtlbiBmcm9tIHRoZSBfbWFpbnR5cGUgYW5kIF9zdWJ0eXBlCisgICAgICAgIGFyZ3VtZW50cy4gIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBoZWFkZXIgYXJlIHRha2VuIGZyb20gdGhlCisgICAgICAgIGtleXdvcmQgYXJndW1lbnRzLgorICAgICAgICAiIiIKKyAgICAgICAgbWVzc2FnZS5NZXNzYWdlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGN0eXBlID0gJyVzLyVzJyAlIChfbWFpbnR5cGUsIF9zdWJ0eXBlKQorICAgICAgICBzZWxmLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsIGN0eXBlLCAqKl9wYXJhbXMpCisgICAgICAgIHNlbGZbJ01JTUUtVmVyc2lvbiddID0gJzEuMCcKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9taW1lL2ltYWdlLnB5IGIvTGliL2VtYWlsL21pbWUvaW1hZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2MzgyMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9taW1lL2ltYWdlLnB5CkBAIC0wLDAgKzEsNDYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGltYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKKworX19hbGxfXyA9IFsnTUlNRUltYWdlJ10KKworaW1wb3J0IGltZ2hkcgorCitmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAorCisKKwwKK2NsYXNzIE1JTUVJbWFnZShNSU1FTm9uTXVsdGlwYXJ0KToKKyAgICAiIiJDbGFzcyBmb3IgZ2VuZXJhdGluZyBpbWFnZS8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX2ltYWdlZGF0YSwgX3N1YnR5cGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgX2VuY29kZXI9ZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NCwgKipfcGFyYW1zKToKKyAgICAgICAgIiIiQ3JlYXRlIGFuIGltYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50LgorCisgICAgICAgIF9pbWFnZWRhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGltYWdlIGRhdGEuICBJZiB0aGlzIGRhdGEKKyAgICAgICAgY2FuIGJlIGRlY29kZWQgYnkgdGhlIHN0YW5kYXJkIFB5dGhvbiBgaW1naGRyJyBtb2R1bGUsIHRoZW4gdGhlCisgICAgICAgIHN1YnR5cGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorICAgICAgICBPdGhlcndpc2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgc3BlY2lmaWMgaW1hZ2Ugc3VidHlwZSB2aWEgdGhlIF9zdWJ0eXBlCisgICAgICAgIHBhcmFtZXRlci4KKworICAgICAgICBfZW5jb2RlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsIGVuY29kaW5nIGZvcgorICAgICAgICB0cmFuc3BvcnQgb2YgdGhlIGltYWdlIGRhdGEuICBJdCB0YWtlcyBvbmUgYXJndW1lbnQsIHdoaWNoIGlzIHRoaXMKKyAgICAgICAgSW1hZ2UgaW5zdGFuY2UuICBJdCBzaG91bGQgdXNlIGdldF9wYXlsb2FkKCkgYW5kIHNldF9wYXlsb2FkKCkgdG8KKyAgICAgICAgY2hhbmdlIHRoZSBwYXlsb2FkIHRvIHRoZSBlbmNvZGVkIGZvcm0uICBJdCBzaG91bGQgYWxzbyBhZGQgYW55CisgICAgICAgIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmcgb3Igb3RoZXIgaGVhZGVycyB0byB0aGUgbWVzc2FnZSBhcworICAgICAgICBuZWNlc3NhcnkuICBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBCYXNlNjQuCisKKyAgICAgICAgQW55IGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgYmFzZSBjbGFzcworICAgICAgICBjb25zdHJ1Y3Rvciwgd2hpY2ggdHVybnMgdGhlbSBpbnRvIHBhcmFtZXRlcnMgb24gdGhlIENvbnRlbnQtVHlwZQorICAgICAgICBoZWFkZXIuCisgICAgICAgICIiIgorICAgICAgICBpZiBfc3VidHlwZSBpcyBOb25lOgorICAgICAgICAgICAgX3N1YnR5cGUgPSBpbWdoZHIud2hhdChOb25lLCBfaW1hZ2VkYXRhKQorICAgICAgICBpZiBfc3VidHlwZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdDb3VsZCBub3QgZ3Vlc3MgaW1hZ2UgTUlNRSBzdWJ0eXBlJykKKyAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAnaW1hZ2UnLCBfc3VidHlwZSwgKipfcGFyYW1zKQorICAgICAgICBzZWxmLnNldF9wYXlsb2FkKF9pbWFnZWRhdGEpCisgICAgICAgIF9lbmNvZGVyKHNlbGYpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWltZS9tZXNzYWdlLnB5IGIvTGliL2VtYWlsL21pbWUvbWVzc2FnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzVkYmZkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL21pbWUvbWVzc2FnZS5weQpAQCAtMCwwICsxLDM0IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkNsYXNzIHJlcHJlc2VudGluZyBtZXNzYWdlLyogTUlNRSBkb2N1bWVudHMuIiIiCisKK19fYWxsX18gPSBbJ01JTUVNZXNzYWdlJ10KKworZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZQorZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAorCisKKwwKK2NsYXNzIE1JTUVNZXNzYWdlKE1JTUVOb25NdWx0aXBhcnQpOgorICAgICIiIkNsYXNzIHJlcHJlc2VudGluZyBtZXNzYWdlLyogTUlNRSBkb2N1bWVudHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX21zZywgX3N1YnR5cGU9J3JmYzgyMicpOgorICAgICAgICAiIiJDcmVhdGUgYSBtZXNzYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50LgorCisgICAgICAgIF9tc2cgaXMgYSBtZXNzYWdlIG9iamVjdCBhbmQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlLCBvciBhCisgICAgICAgIGRlcml2ZWQgY2xhc3Mgb2YgTWVzc2FnZSwgb3RoZXJ3aXNlIGEgVHlwZUVycm9yIGlzIHJhaXNlZC4KKworICAgICAgICBPcHRpb25hbCBfc3VidHlwZSBkZWZpbmVzIHRoZSBzdWJ0eXBlIG9mIHRoZSBjb250YWluZWQgbWVzc2FnZS4gIFRoZQorICAgICAgICBkZWZhdWx0IGlzICJyZmM4MjIiICh0aGlzIGlzIGRlZmluZWQgYnkgdGhlIE1JTUUgc3RhbmRhcmQsIGV2ZW4gdGhvdWdoCisgICAgICAgIHRoZSB0ZXJtICJyZmM4MjIiIGlzIHRlY2huaWNhbGx5IG91dGRhdGVkIGJ5IFJGQyAyODIyKS4KKyAgICAgICAgIiIiCisgICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ21lc3NhZ2UnLCBfc3VidHlwZSkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoX21zZywgbWVzc2FnZS5NZXNzYWdlKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQXJndW1lbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIE1lc3NhZ2UnKQorICAgICAgICAjIEl0J3MgY29udmVuaWVudCB0byB1c2UgdGhpcyBiYXNlIGNsYXNzIG1ldGhvZC4gIFdlIG5lZWQgdG8gZG8gaXQKKyAgICAgICAgIyB0aGlzIHdheSBvciB3ZSdsbCBnZXQgYW4gZXhjZXB0aW9uCisgICAgICAgIG1lc3NhZ2UuTWVzc2FnZS5hdHRhY2goc2VsZiwgX21zZykKKyAgICAgICAgIyBBbmQgYmUgc3VyZSBvdXIgZGVmYXVsdCB0eXBlIGlzIHNldCBjb3JyZWN0bHkKKyAgICAgICAgc2VsZi5zZXRfZGVmYXVsdF90eXBlKCdtZXNzYWdlL3JmYzgyMicpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWltZS9tdWx0aXBhcnQucHkgYi9MaWIvZW1haWwvbWltZS9tdWx0aXBhcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4YzlkYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9taW1lL211bHRpcGFydC5weQpAQCAtMCwwICsxLDQxIEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgbXVsdGlwYXJ0LyogdHlwZSBtZXNzYWdlcy4iIiIKKworX19hbGxfXyA9IFsnTUlNRU11bHRpcGFydCddCisKK2Zyb20gZW1haWwubWltZS5iYXNlIGltcG9ydCBNSU1FQmFzZQorCisKKwwKK2NsYXNzIE1JTUVNdWx0aXBhcnQoTUlNRUJhc2UpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgbXVsdGlwYXJ0LyogdHlwZSBtZXNzYWdlcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfc3VidHlwZT0nbWl4ZWQnLCBib3VuZGFyeT1Ob25lLCBfc3VicGFydHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgKipfcGFyYW1zKToKKyAgICAgICAgIiIiQ3JlYXRlcyBhIG11bHRpcGFydC8qIHR5cGUgbWVzc2FnZS4KKworICAgICAgICBCeSBkZWZhdWx0LCBjcmVhdGVzIGEgbXVsdGlwYXJ0L21peGVkIG1lc3NhZ2UsIHdpdGggcHJvcGVyCisgICAgICAgIENvbnRlbnQtVHlwZSBhbmQgTUlNRS1WZXJzaW9uIGhlYWRlcnMuCisKKyAgICAgICAgX3N1YnR5cGUgaXMgdGhlIHN1YnR5cGUgb2YgdGhlIG11bHRpcGFydCBjb250ZW50IHR5cGUsIGRlZmF1bHRpbmcgdG8KKyAgICAgICAgYG1peGVkJy4KKworICAgICAgICBib3VuZGFyeSBpcyB0aGUgbXVsdGlwYXJ0IGJvdW5kYXJ5IHN0cmluZy4gIEJ5IGRlZmF1bHQgaXQgaXMKKyAgICAgICAgY2FsY3VsYXRlZCBhcyBuZWVkZWQuCisKKyAgICAgICAgX3N1YnBhcnRzIGlzIGEgc2VxdWVuY2Ugb2YgaW5pdGlhbCBzdWJwYXJ0cyBmb3IgdGhlIHBheWxvYWQuICBJdAorICAgICAgICBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9iamVjdCwgc3VjaCBhcyBhIGxpc3QuICBZb3UgY2FuIGFsd2F5cworICAgICAgICBhdHRhY2ggbmV3IHN1YnBhcnRzIHRvIHRoZSBtZXNzYWdlIGJ5IHVzaW5nIHRoZSBhdHRhY2goKSBtZXRob2QuCisKKyAgICAgICAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBhcmUgdGFrZW4gZnJvbSB0aGUKKyAgICAgICAga2V5d29yZCBhcmd1bWVudHMgKG9yIHBhc3NlZCBpbnRvIHRoZSBfcGFyYW1zIGFyZ3VtZW50KS4KKyAgICAgICAgIiIiCisgICAgICAgIE1JTUVCYXNlLl9faW5pdF9fKHNlbGYsICdtdWx0aXBhcnQnLCBfc3VidHlwZSwgKipfcGFyYW1zKQorICAgICAgICBpZiBfc3VicGFydHM6CisgICAgICAgICAgICBmb3IgcCBpbiBfc3VicGFydHM6CisgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2gocCkKKyAgICAgICAgaWYgYm91bmRhcnk6CisgICAgICAgICAgICBzZWxmLnNldF9ib3VuZGFyeShib3VuZGFyeSkKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weSBiL0xpYi9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI4MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL21pbWUvbm9ubXVsdGlwYXJ0LnB5CkBAIC0wLDAgKzEsMjYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSB0eXBlIG1lc3NhZ2VzIHRoYXQgYXJlIG5vdCBtdWx0aXBhcnQuIiIiCisKK19fYWxsX18gPSBbJ01JTUVOb25NdWx0aXBhcnQnXQorCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwubWltZS5iYXNlIGltcG9ydCBNSU1FQmFzZQorCisKKwwKK2NsYXNzIE1JTUVOb25NdWx0aXBhcnQoTUlNRUJhc2UpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgbXVsdGlwYXJ0LyogdHlwZSBtZXNzYWdlcy4iIiIKKworICAgIF9fcHljaGVja2VyX18gPSAndW51c2VkbmFtZXM9cGF5bG9hZCcKKworICAgIGRlZiBhdHRhY2goc2VsZiwgcGF5bG9hZCk6CisgICAgICAgICMgVGhlIHB1YmxpYyBBUEkgcHJvaGliaXRzIGF0dGFjaGluZyBtdWx0aXBsZSBzdWJwYXJ0cyB0byBNSU1FQmFzZQorICAgICAgICAjIGRlcml2ZWQgc3VidHlwZXMgc2luY2Ugbm9uZSBvZiB0aGVtIGFyZSwgYnkgZGVmaW5pdGlvbiwgb2YgY29udGVudAorICAgICAgICAjIHR5cGUgbXVsdGlwYXJ0LyoKKyAgICAgICAgcmFpc2UgZXJyb3JzLk11bHRpcGFydENvbnZlcnNpb25FcnJvcigKKyAgICAgICAgICAgICdDYW5ub3QgYXR0YWNoIGFkZGl0aW9uYWwgc3VicGFydHMgdG8gbm9uLW11bHRpcGFydC8qJykKKworICAgIGRlbCBfX3B5Y2hlY2tlcl9fCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWltZS90ZXh0LnB5IGIvTGliL2VtYWlsL21pbWUvdGV4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ3ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL21pbWUvdGV4dC5weQpAQCAtMCwwICsxLDMwIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkNsYXNzIHJlcHJlc2VudGluZyB0ZXh0LyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKKworX19hbGxfXyA9IFsnTUlNRVRleHQnXQorCitmcm9tIGVtYWlsLmVuY29kZXJzIGltcG9ydCBlbmNvZGVfN29yOGJpdAorZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAorCisKKwwKK2NsYXNzIE1JTUVUZXh0KE1JTUVOb25NdWx0aXBhcnQpOgorICAgICIiIkNsYXNzIGZvciBnZW5lcmF0aW5nIHRleHQvKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF90ZXh0LCBfc3VidHlwZT0ncGxhaW4nLCBfY2hhcnNldD0ndXMtYXNjaWknKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgdGV4dC8qIHR5cGUgTUlNRSBkb2N1bWVudC4KKworICAgICAgICBfdGV4dCBpcyB0aGUgc3RyaW5nIGZvciB0aGlzIG1lc3NhZ2Ugb2JqZWN0LgorCisgICAgICAgIF9zdWJ0eXBlIGlzIHRoZSBNSU1FIHN1YiBjb250ZW50IHR5cGUsIGRlZmF1bHRpbmcgdG8gInBsYWluIi4KKworICAgICAgICBfY2hhcnNldCBpcyB0aGUgY2hhcmFjdGVyIHNldCBwYXJhbWV0ZXIgYWRkZWQgdG8gdGhlIENvbnRlbnQtVHlwZQorICAgICAgICBoZWFkZXIuICBUaGlzIGRlZmF1bHRzIHRvICJ1cy1hc2NpaSIuICBOb3RlIHRoYXQgYXMgYSBzaWRlLWVmZmVjdCwgdGhlCisgICAgICAgIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyIHdpbGwgYWxzbyBiZSBzZXQuCisgICAgICAgICIiIgorICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICd0ZXh0JywgX3N1YnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKip7J2NoYXJzZXQnOiBfY2hhcnNldH0pCisgICAgICAgIHNlbGYuc2V0X3BheWxvYWQoX3RleHQsIF9jaGFyc2V0KQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3BhcnNlci5weSBiL0xpYi9lbWFpbC9wYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5YTRhMAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9wYXJzZXIucHkKQEAgLTAsMCArMSw5NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdywgVGhvbWFzIFdvdXRlcnMsIEFudGhvbnkgQmF4dGVyCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkEgcGFyc2VyIG9mIFJGQyAyODIyIGFuZCBNSU1FIGVtYWlsIG1lc3NhZ2VzLiIiIgorCitfX2FsbF9fID0gWydQYXJzZXInLCAnSGVhZGVyUGFyc2VyJ10KKworaW1wb3J0IHdhcm5pbmdzCitmcm9tIGlvIGltcG9ydCBTdHJpbmdJTworCitmcm9tIGVtYWlsLmZlZWRwYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKK2Zyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorCisKKwwKK2NsYXNzIFBhcnNlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dzKToKKyAgICAgICAgIiIiUGFyc2VyIG9mIFJGQyAyODIyIGFuZCBNSU1FIGVtYWlsIG1lc3NhZ2VzLgorCisgICAgICAgIENyZWF0ZXMgYW4gaW4tbWVtb3J5IG9iamVjdCB0cmVlIHJlcHJlc2VudGluZyB0aGUgZW1haWwgbWVzc2FnZSwgd2hpY2gKKyAgICAgICAgY2FuIHRoZW4gYmUgbWFuaXB1bGF0ZWQgYW5kIHR1cm5lZCBvdmVyIHRvIGEgR2VuZXJhdG9yIHRvIHJldHVybiB0aGUKKyAgICAgICAgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZS4KKworICAgICAgICBUaGUgc3RyaW5nIG11c3QgYmUgZm9ybWF0dGVkIGFzIGEgYmxvY2sgb2YgUkZDIDI4MjIgaGVhZGVycyBhbmQgaGVhZGVyCisgICAgICAgIGNvbnRpbnVhdGlvbiBsaW5lcywgb3B0aW9uYWxseSBwcmVjZWVkZWQgYnkgYSBgVW5peC1mcm9tJyBoZWFkZXIuICBUaGUKKyAgICAgICAgaGVhZGVyIGJsb2NrIGlzIHRlcm1pbmF0ZWQgZWl0aGVyIGJ5IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciBieSBhCisgICAgICAgIGJsYW5rIGxpbmUuCisKKyAgICAgICAgX2NsYXNzIGlzIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZSBmb3IgbmV3IG1lc3NhZ2Ugb2JqZWN0cyB3aGVuIHRoZXkKKyAgICAgICAgbXVzdCBiZSBjcmVhdGVkLiAgVGhpcyBjbGFzcyBtdXN0IGhhdmUgYSBjb25zdHJ1Y3RvciB0aGF0IGNhbiB0YWtlCisgICAgICAgIHplcm8gYXJndW1lbnRzLiAgRGVmYXVsdCBpcyBNZXNzYWdlLk1lc3NhZ2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBsZW4oYXJncykgPj0gMToKKyAgICAgICAgICAgIGlmICdfY2xhc3MnIGluIGt3czoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmcgJ19jbGFzcyciKQorICAgICAgICAgICAga3dzWydfY2xhc3MnXSA9IGFyZ3NbMF0KKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICBpZiAnc3RyaWN0JyBpbiBrd3M6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJNdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJnICdzdHJpY3QnIikKKyAgICAgICAgICAgIGt3c1snc3RyaWN0J10gPSBhcmdzWzFdCisgICAgICAgIGlmIGxlbihhcmdzKSA+IDI6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IGFyZ3VtZW50cycpCisgICAgICAgIGlmICdfY2xhc3MnIGluIGt3czoKKyAgICAgICAgICAgIHNlbGYuX2NsYXNzID0ga3dzWydfY2xhc3MnXQorICAgICAgICAgICAgZGVsIGt3c1snX2NsYXNzJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2NsYXNzID0gTWVzc2FnZQorICAgICAgICBpZiAnc3RyaWN0JyBpbiBrd3M6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCInc3RyaWN0JyBhcmd1bWVudCBpcyBkZXByZWNhdGVkIChhbmQgaWdub3JlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisgICAgICAgICAgICBkZWwga3dzWydzdHJpY3QnXQorICAgICAgICBpZiBrd3M6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1VuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudHMnKQorCisgICAgZGVmIHBhcnNlKHNlbGYsIGZwLCBoZWFkZXJzb25seT1GYWxzZSk6CisgICAgICAgICIiIkNyZWF0ZSBhIG1lc3NhZ2Ugc3RydWN0dXJlIGZyb20gdGhlIGRhdGEgaW4gYSBmaWxlLgorCisgICAgICAgIFJlYWRzIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlIGFuZCByZXR1cm5zIHRoZSByb290IG9mIHRoZSBtZXNzYWdlCisgICAgICAgIHN0cnVjdHVyZS4gIE9wdGlvbmFsIGhlYWRlcnNvbmx5IGlzIGEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gc3RvcAorICAgICAgICBwYXJzaW5nIGFmdGVyIHJlYWRpbmcgdGhlIGhlYWRlcnMgb3Igbm90LiAgVGhlIGRlZmF1bHQgaXMgRmFsc2UsCisgICAgICAgIG1lYW5pbmcgaXQgcGFyc2VzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBmZWVkcGFyc2VyID0gRmVlZFBhcnNlcihzZWxmLl9jbGFzcykKKyAgICAgICAgaWYgaGVhZGVyc29ubHk6CisgICAgICAgICAgICBmZWVkcGFyc2VyLl9zZXRfaGVhZGVyc29ubHkoKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWQoODE5MikKKyAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIFhYWCBXaGVuIEd1aWRvIGZpeGVzIFRleHRJT1dyYXBwZXIucmVhZCgpIHRvIGFjdCBqdXN0IGxpa2UKKyAgICAgICAgICAgICMgLnJlYWRsaW5lcygpLCB0aGlzLi4uCisgICAgICAgICAgICBmZWVkcGFyc2VyLmZlZWQoc3RyKGRhdGEpKQorICAgICAgICAgICAgIyAuLi5nZXRzIHJldmVydGVkIGJhY2sgdG8KKyAgICAgICAgICAgICNmZWVkcGFyc2VyLmZlZWQoZGF0YSkKKyAgICAgICAgcmV0dXJuIGZlZWRwYXJzZXIuY2xvc2UoKQorCisgICAgZGVmIHBhcnNlc3RyKHNlbGYsIHRleHQsIGhlYWRlcnNvbmx5PUZhbHNlKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbWVzc2FnZSBzdHJ1Y3R1cmUgZnJvbSBhIHN0cmluZy4KKworICAgICAgICBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBtZXNzYWdlIHN0cnVjdHVyZS4gIE9wdGlvbmFsIGhlYWRlcnNvbmx5IGlzIGEKKyAgICAgICAgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gc3RvcCBwYXJzaW5nIGFmdGVyIHJlYWRpbmcgdGhlIGhlYWRlcnMgb3IKKyAgICAgICAgbm90LiAgVGhlIGRlZmF1bHQgaXMgRmFsc2UsIG1lYW5pbmcgaXQgcGFyc2VzIHRoZSBlbnRpcmUgY29udGVudHMgb2YKKyAgICAgICAgdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wYXJzZShTdHJpbmdJTyh0ZXh0KSwgaGVhZGVyc29ubHk9aGVhZGVyc29ubHkpCisKKworDAorY2xhc3MgSGVhZGVyUGFyc2VyKFBhcnNlcik6CisgICAgZGVmIHBhcnNlKHNlbGYsIGZwLCBoZWFkZXJzb25seT1UcnVlKToKKyAgICAgICAgcmV0dXJuIFBhcnNlci5wYXJzZShzZWxmLCBmcCwgVHJ1ZSkKKworICAgIGRlZiBwYXJzZXN0cihzZWxmLCB0ZXh0LCBoZWFkZXJzb25seT1UcnVlKToKKyAgICAgICAgcmV0dXJuIFBhcnNlci5wYXJzZXN0cihzZWxmLCB0ZXh0LCBUcnVlKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3F1b3ByaW1pbWUucHkgYi9MaWIvZW1haWwvcXVvcHJpbWltZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTYyNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3F1b3ByaW1pbWUucHkKQEAgLTAsMCArMSwzMDcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCZW4gR2VydHpmaWVsZAorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJRdW90ZWQtcHJpbnRhYmxlIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcgcGVyIFJGQ3MgMjA0NS0yMDQ3LgorCitUaGlzIG1vZHVsZSBoYW5kbGVzIHRoZSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIG1ldGhvZCBkZWZpbmVkIGluIFJGQyAyMDQ1Cit0byBlbmNvZGUgVVMgQVNDSUktbGlrZSA4LWJpdCBkYXRhIGNhbGxlZCBgcXVvdGVkLXByaW50YWJsZScuICBJdCBpcyB1c2VkIHRvCitzYWZlbHkgZW5jb2RlIHRleHQgdGhhdCBpcyBpbiBhIGNoYXJhY3RlciBzZXQgc2ltaWxhciB0byB0aGUgNy1iaXQgVVMgQVNDSUkKK2NoYXJhY3RlciBzZXQsIGJ1dCB0aGF0IGluY2x1ZGVzIHNvbWUgOC1iaXQgY2hhcmFjdGVycyB0aGF0IGFyZSBub3JtYWxseSBub3QKK2FsbG93ZWQgaW4gZW1haWwgYm9kaWVzIG9yIGhlYWRlcnMuCisKK1F1b3RlZC1wcmludGFibGUgaXMgdmVyeSBzcGFjZS1pbmVmZmljaWVudCBmb3IgZW5jb2RpbmcgYmluYXJ5IGZpbGVzOyB1c2UgdGhlCitlbWFpbC5iYXNlNjRNSU1FIG1vZHVsZSBmb3IgdGhhdCBpbnN0ZWFkLgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gZW5jb2RlIGFuZCBkZWNvZGUgYm90aCBoZWFkZXJzIGFuZCBib2RpZXMKK3dpdGggcXVvdGVkLXByaW50YWJsZSBlbmNvZGluZy4KKworUkZDIDIwNDUgZGVmaW5lcyBhIG1ldGhvZCBmb3IgaW5jbHVkaW5nIGNoYXJhY3RlciBzZXQgaW5mb3JtYXRpb24gaW4gYW4KK2BlbmNvZGVkLXdvcmQnIGluIGEgaGVhZGVyLiAgVGhpcyBtZXRob2QgaXMgY29tbW9ubHkgdXNlZCBmb3IgOC1iaXQgcmVhbCBuYW1lcworaW4gVG86L0Zyb206L0NjOiBldGMuIGZpZWxkcywgYXMgd2VsbCBhcyBTdWJqZWN0OiBsaW5lcy4KKworVGhpcyBtb2R1bGUgZG9lcyBub3QgZG8gdGhlIGxpbmUgd3JhcHBpbmcgb3IgZW5kLW9mLWxpbmUgY2hhcmFjdGVyCitjb252ZXJzaW9uIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGludGVybmF0aW9uYWxpemVkIGhlYWRlcnM7IGl0IG9ubHkKK2RvZXMgZHVtYiBlbmNvZGluZyBhbmQgZGVjb2RpbmcuICBUbyBkZWFsIHdpdGggdGhlIHZhcmlvdXMgbGluZQord3JhcHBpbmcgaXNzdWVzLCB1c2UgdGhlIGVtYWlsLkhlYWRlciBtb2R1bGUuCisiIiIKKworX19hbGxfXyA9IFsKKyAgICAnYm9keV9kZWNvZGUnLAorICAgICdib2R5X2VuY29kZScsCisgICAgJ2JvZHlfcXVvcHJpX2NoZWNrJywKKyAgICAnYm9keV9xdW9wcmlfbGVuJywKKyAgICAnZGVjb2RlJywKKyAgICAnZGVjb2Rlc3RyaW5nJywKKyAgICAnZW5jb2RlJywKKyAgICAnZW5jb2Rlc3RyaW5nJywKKyAgICAnaGVhZGVyX2RlY29kZScsCisgICAgJ2hlYWRlcl9lbmNvZGUnLAorICAgICdoZWFkZXJfcXVvcHJpX2NoZWNrJywKKyAgICAnaGVhZGVyX3F1b3ByaV9sZW4nLAorICAgICdxdW90ZScsCisgICAgJ3VucXVvdGUnLAorICAgIF0KKworaW1wb3J0IHJlCisKK2Zyb20gc3RyaW5nIGltcG9ydCBhc2NpaV9sZXR0ZXJzLCBkaWdpdHMsIGhleGRpZ2l0cworZnJvbSBlbWFpbC51dGlscyBpbXBvcnQgZml4X2VvbHMKKworQ1JMRiA9ICdcclxuJworTkwgPSAnXG4nCitFTVBUWVNUUklORyA9ICcnCisKKyMgU2VlIGFsc28gQ2hhcnNldC5weQorTUlTQ19MRU4gPSA3CisKK0hFQURFUl9TQUZFX0JZVEVTID0gYictISorLyAnICsgYnl0ZXMoYXNjaWlfbGV0dGVycykgKyBieXRlcyhkaWdpdHMpCitCT0RZX1NBRkVfQllURVMgICA9IChiJyAhIiMkJSZcJygpKissLS4vMDEyMzQ1Njc4OTo7PD4nCisgICAgICAgICAgICAgICAgICAgICBiJz9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9gJworICAgICAgICAgICAgICAgICAgICAgYidhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cdCcpCisKKworDAorIyBIZWxwZXJzCitkZWYgaGVhZGVyX3F1b3ByaV9jaGVjayhjKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIHNob3VsZCBiZSBlc2NhcGVkIHdpdGggaGVhZGVyIHF1b3ByaS4iIiIKKyAgICByZXR1cm4gYyBub3QgaW4gSEVBREVSX1NBRkVfQllURVMKKworCitkZWYgYm9keV9xdW9wcmlfY2hlY2soYyk6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIGNoYXJhY3RlciBzaG91bGQgYmUgZXNjYXBlZCB3aXRoIGJvZHkgcXVvcHJpLiIiIgorICAgIHJldHVybiBjIG5vdCBpbiBCT0RZX1NBRkVfQllURVMKKworCitkZWYgaGVhZGVyX3F1b3ByaV9sZW4oYnl0ZWFycmF5KToKKyAgICAiIiJSZXR1cm4gdGhlIGxlbmd0aCBvZiBieXRlYXJyYXkgd2hlbiBpdCBpcyBlbmNvZGVkIHdpdGggaGVhZGVyIHF1b3ByaS4KKworICAgIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgYW55IFJGQyAyMDQ3IGNocm9tZSBhZGRlZCBieQorICAgIGBoZWFkZXJfZW5jb2RlKClgLgorICAgICIiIgorICAgIGNvdW50ID0gMAorICAgIGZvciBjIGluIGJ5dGVhcnJheToKKyAgICAgICAgY291bnQgKz0gKDMgaWYgaGVhZGVyX3F1b3ByaV9jaGVjayhjKSBlbHNlIDEpCisgICAgcmV0dXJuIGNvdW50CisKKworZGVmIGJvZHlfcXVvcHJpX2xlbihieXRlYXJyYXkpOgorICAgICIiIlJldHVybiB0aGUgbGVuZ3RoIG9mIGJ5dGVhcnJheSB3aGVuIGl0IGlzIGVuY29kZWQgd2l0aCBib2R5IHF1b3ByaS4iIiIKKyAgICBjb3VudCA9IDAKKyAgICBmb3IgYyBpbiBieXRlYXJyYXk6CisgICAgICAgIGNvdW50ICs9ICgzIGlmIGJvZHlfcXVvcHJpX2NoZWNrKGMpIGVsc2UgMSkKKyAgICByZXR1cm4gY291bnQKKworCitkZWYgX21heF9hcHBlbmQoTCwgcywgbWF4bGVuLCBleHRyYT0nJyk6CisgICAgaWYgbm90IGlzaW5zdGFuY2Uocywgc3RyKToKKyAgICAgICAgcyA9IGNocihzKQorICAgIGlmIG5vdCBMOgorICAgICAgICBMLmFwcGVuZChzLmxzdHJpcCgpKQorICAgIGVsaWYgbGVuKExbLTFdKSArIGxlbihzKSA8PSBtYXhsZW46CisgICAgICAgIExbLTFdICs9IGV4dHJhICsgcworICAgIGVsc2U6CisgICAgICAgIEwuYXBwZW5kKHMubHN0cmlwKCkpCisKKworZGVmIHVucXVvdGUocyk6CisgICAgIiIiVHVybiBhIHN0cmluZyBpbiB0aGUgZm9ybSA9QUIgdG8gdGhlIEFTQ0lJIGNoYXJhY3RlciB3aXRoIHZhbHVlIDB4YWIiIiIKKyAgICByZXR1cm4gY2hyKGludChzWzE6M10sIDE2KSkKKworCitkZWYgcXVvdGUoYyk6CisgICAgcmV0dXJuICc9JTAyWCcgJSBvcmQoYykKKworCisMCitkZWYgaGVhZGVyX2VuY29kZShoZWFkZXJfYnl0ZXMsIGNoYXJzZXQ9J2lzby04ODU5LTEnKToKKyAgICAiIiJFbmNvZGUgYSBzaW5nbGUgaGVhZGVyIGxpbmUgd2l0aCBxdW90ZWQtcHJpbnRhYmxlIChsaWtlKSBlbmNvZGluZy4KKworICAgIERlZmluZWQgaW4gUkZDIDIwNDUsIHRoaXMgYFEnIGVuY29kaW5nIGlzIHNpbWlsYXIgdG8gcXVvdGVkLXByaW50YWJsZSwgYnV0CisgICAgdXNlZCBzcGVjaWZpY2FsbHkgZm9yIGVtYWlsIGhlYWRlciBmaWVsZHMgdG8gYWxsb3cgY2hhcnNldHMgd2l0aCBtb3N0bHkgNworICAgIGJpdCBjaGFyYWN0ZXJzIChhbmQgc29tZSA4IGJpdCkgdG8gcmVtYWluIG1vcmUgb3IgbGVzcyByZWFkYWJsZSBpbiBub24tUkZDCisgICAgMjA0NSBhd2FyZSBtYWlsIGNsaWVudHMuCisKKyAgICBjaGFyc2V0IG5hbWVzIHRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZSBpbiB0aGUgUkZDIDIwNDYgaGVhZGVyLiAgSXQKKyAgICBkZWZhdWx0cyB0byBpc28tODg1OS0xLgorICAgICIiIgorICAgICMgUmV0dXJuIGVtcHR5IGhlYWRlcnMgdW5jaGFuZ2VkCisgICAgaWYgbm90IGhlYWRlcl9ieXRlczoKKyAgICAgICAgcmV0dXJuIHN0cihoZWFkZXJfYnl0ZXMpCisgICAgIyBJdGVyYXRlIG92ZXIgZXZlcnkgYnl0ZSwgZW5jb2RpbmcgaWYgbmVjZXNzYXJ5LgorICAgIGVuY29kZWQgPSBbXQorICAgIGZvciBjaGFyYWN0ZXIgaW4gaGVhZGVyX2J5dGVzOgorICAgICAgICAjIFNwYWNlIG1heSBiZSByZXByZXNlbnRlZCBhcyBfIGluc3RlYWQgb2YgPTIwIGZvciByZWFkYWJpbGl0eQorICAgICAgICBpZiBjaGFyYWN0ZXIgPT0gb3JkKCcgJyk6CisgICAgICAgICAgICBlbmNvZGVkLmFwcGVuZCgnXycpCisgICAgICAgICMgVGhlc2UgY2hhcmFjdGVycyBjYW4gYmUgaW5jbHVkZWQgdmVyYmF0aW0uCisgICAgICAgIGVsaWYgbm90IGhlYWRlcl9xdW9wcmlfY2hlY2soY2hhcmFjdGVyKToKKyAgICAgICAgICAgIGVuY29kZWQuYXBwZW5kKGNocihjaGFyYWN0ZXIpKQorICAgICAgICAjIE90aGVyd2lzZSwgcmVwbGFjZSB3aXRoIGhleCB2YWx1ZSBsaWtlID1FMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW5jb2RlZC5hcHBlbmQoJz0lMDJYJyAlIGNoYXJhY3RlcikKKyAgICAjIE5vdyBhZGQgdGhlIFJGQyBjaHJvbWUgdG8gZWFjaCBlbmNvZGVkIGNodW5rIGFuZCBnbHVlIHRoZSBjaHVua3MKKyAgICAjIHRvZ2V0aGVyLgorICAgIHJldHVybiAnPT8lcz9xPyVzPz0nICUgKGNoYXJzZXQsIEVNUFRZU1RSSU5HLmpvaW4oZW5jb2RlZCkpCisKKworDAorZGVmIGVuY29kZShib2R5LCBiaW5hcnk9RmFsc2UsIG1heGxpbmVsZW49NzYsIGVvbD1OTCk6CisgICAgIiIiRW5jb2RlIHdpdGggcXVvdGVkLXByaW50YWJsZSwgd3JhcHBpbmcgYXQgbWF4bGluZWxlbiBjaGFyYWN0ZXJzLgorCisgICAgSWYgYmluYXJ5IGlzIEZhbHNlICh0aGUgZGVmYXVsdCksIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgd2lsbCBiZSBjb252ZXJ0ZWQKKyAgICB0byB0aGUgY2Fub25pY2FsIGVtYWlsIGVuZC1vZi1saW5lIHNlcXVlbmNlIFxcclxcbi4gIE90aGVyd2lzZSB0aGV5IHdpbGwKKyAgICBiZSBsZWZ0IHZlcmJhdGltLgorCisgICAgRWFjaCBsaW5lIG9mIGVuY29kZWQgdGV4dCB3aWxsIGVuZCB3aXRoIGVvbCwgd2hpY2ggZGVmYXVsdHMgdG8gIlxcbiIuICBTZXQKKyAgICB0aGlzIHRvICJcXHJcXG4iIGlmIHlvdSB3aWxsIGJlIHVzaW5nIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBkaXJlY3RseQorICAgIGluIGFuIGVtYWlsLgorCisgICAgRWFjaCBsaW5lIHdpbGwgYmUgd3JhcHBlZCBhdCwgYXQgbW9zdCwgbWF4bGluZWxlbiBjaGFyYWN0ZXJzIChkZWZhdWx0cyB0bworICAgIDc2IGNoYXJhY3RlcnMpLiAgTG9uZyBsaW5lcyB3aWxsIGhhdmUgdGhlIGBzb2Z0IGxpbmVmZWVkJyBxdW90ZWQtcHJpbnRhYmxlCisgICAgY2hhcmFjdGVyICI9IiBhcHBlbmRlZCB0byB0aGVtLCBzbyB0aGUgZGVjb2RlZCB0ZXh0IHdpbGwgYmUgaWRlbnRpY2FsIHRvCisgICAgdGhlIG9yaWdpbmFsIHRleHQuCisgICAgIiIiCisgICAgaWYgbm90IGJvZHk6CisgICAgICAgIHJldHVybiBib2R5CisKKyAgICBpZiBub3QgYmluYXJ5OgorICAgICAgICBib2R5ID0gZml4X2VvbHMoYm9keSkKKworICAgICMgQkFXOiBXZSdyZSBhY2N1bXVsYXRpbmcgdGhlIGJvZHkgdGV4dCBieSBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gIFRoYXQKKyAgICAjIGNhbid0IGJlIHZlcnkgZWZmaWNpZW50LCBidXQgSSBkb24ndCBoYXZlIHRpbWUgbm93IHRvIHJld3JpdGUgaXQuICBJdAorICAgICMganVzdCBmZWVscyBsaWtlIHRoaXMgYWxnb3JpdGhtIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50LgorICAgIGVuY29kZWRfYm9keSA9ICcnCisgICAgbGluZW5vID0gLTEKKyAgICAjIFByZXNlcnZlIGxpbmUgZW5kaW5ncyBoZXJlIHNvIHdlIGNhbiBjaGVjayBsYXRlciB0byBzZWUgYW4gZW9sIG5lZWRzIHRvCisgICAgIyBiZSBhZGRlZCB0byB0aGUgb3V0cHV0IGxhdGVyLgorICAgIGxpbmVzID0gYm9keS5zcGxpdGxpbmVzKDEpCisgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICMgQnV0IHN0cmlwIG9mZiBsaW5lLWVuZGluZ3MgZm9yIHByb2Nlc3NpbmcgdGhpcyBsaW5lLgorICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKENSTEYpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXQorICAgICAgICBlbGlmIGxpbmVbLTFdIGluIENSTEY6CisgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCisKKyAgICAgICAgbGluZW5vICs9IDEKKyAgICAgICAgZW5jb2RlZF9saW5lID0gJycKKyAgICAgICAgcHJldiA9IE5vbmUKKyAgICAgICAgbGluZWxlbiA9IGxlbihsaW5lKQorICAgICAgICAjIE5vdyB3ZSBuZWVkIHRvIGV4YW1pbmUgZXZlcnkgY2hhcmFjdGVyIHRvIHNlZSBpZiBpdCBuZWVkcyB0byBiZQorICAgICAgICAjIHF1b3ByaSBlbmNvZGVkLiAgQkFXOiBhZ2Fpbiwgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgaW5lZmZpY2llbnQuCisgICAgICAgIGZvciBqIGluIHJhbmdlKGxpbmVsZW4pOgorICAgICAgICAgICAgYyA9IGxpbmVbal0KKyAgICAgICAgICAgIHByZXYgPSBjCisgICAgICAgICAgICBpZiBib2R5X3F1b3ByaV9jaGVjayhjKToKKyAgICAgICAgICAgICAgICBjID0gcXVvdGUoYykKKyAgICAgICAgICAgIGVsaWYgaisxID09IGxpbmVsZW46CisgICAgICAgICAgICAgICAgIyBDaGVjayBmb3Igd2hpdGVzcGFjZSBhdCBlbmQgb2YgbGluZTsgc3BlY2lhbCBjYXNlCisgICAgICAgICAgICAgICAgaWYgYyBub3QgaW4gJyBcdCc6CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfbGluZSArPSBjCisgICAgICAgICAgICAgICAgcHJldiA9IGMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgdG8gc2VlIGlmIHRoZSBsaW5lIGhhcyByZWFjaGVkIGl0cyBtYXhpbXVtIGxlbmd0aAorICAgICAgICAgICAgaWYgbGVuKGVuY29kZWRfbGluZSkgKyBsZW4oYykgPj0gbWF4bGluZWxlbjoKKyAgICAgICAgICAgICAgICBlbmNvZGVkX2JvZHkgKz0gZW5jb2RlZF9saW5lICsgJz0nICsgZW9sCisgICAgICAgICAgICAgICAgZW5jb2RlZF9saW5lID0gJycKKyAgICAgICAgICAgIGVuY29kZWRfbGluZSArPSBjCisgICAgICAgICMgTm93IGF0IGVuZCBvZiBsaW5lLi4KKyAgICAgICAgaWYgcHJldiBhbmQgcHJldiBpbiAnIFx0JzoKKyAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiBmaWxlCisgICAgICAgICAgICBpZiBsaW5lbm8gKyAxID09IGxlbihsaW5lcyk6CisgICAgICAgICAgICAgICAgcHJldiA9IHF1b3RlKHByZXYpCisgICAgICAgICAgICAgICAgaWYgbGVuKGVuY29kZWRfbGluZSkgKyBsZW4ocHJldikgPiBtYXhsaW5lbGVuOgorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkX2JvZHkgKz0gZW5jb2RlZF9saW5lICsgJz0nICsgZW9sICsgcHJldgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfYm9keSArPSBlbmNvZGVkX2xpbmUgKyBwcmV2CisgICAgICAgICAgICAjIEp1c3Qgbm9ybWFsIHdoaXRlc3BhY2UgYXQgZW5kIG9mIGxpbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW5jb2RlZF9ib2R5ICs9IGVuY29kZWRfbGluZSArIHByZXYgKyAnPScgKyBlb2wKKyAgICAgICAgICAgIGVuY29kZWRfbGluZSA9ICcnCisgICAgICAgICMgTm93IGxvb2sgYXQgdGhlIGxpbmUgd2UganVzdCBmaW5pc2hlZCBhbmQgaXQgaGFzIGEgbGluZSBlbmRpbmcsIHdlCisgICAgICAgICMgbmVlZCB0byBhZGQgZW9sIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisgICAgICAgIGlmIGxpbmVzW2xpbmVub10uZW5kc3dpdGgoQ1JMRikgb3IgbGluZXNbbGluZW5vXVstMV0gaW4gQ1JMRjoKKyAgICAgICAgICAgIGVuY29kZWRfYm9keSArPSBlbmNvZGVkX2xpbmUgKyBlb2wKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuY29kZWRfYm9keSArPSBlbmNvZGVkX2xpbmUKKyAgICAgICAgZW5jb2RlZF9saW5lID0gJycKKyAgICByZXR1cm4gZW5jb2RlZF9ib2R5CisKKworIyBGb3IgY29udmVuaWVuY2UgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHcvIHN0YW5kYXJkIGJhc2U2NCBtb2R1bGUKK2JvZHlfZW5jb2RlID0gZW5jb2RlCitlbmNvZGVzdHJpbmcgPSBlbmNvZGUKKworCisMCisjIEJBVzogSSdtIG5vdCBzdXJlIGlmIHRoZSBpbnRlbnQgd2FzIGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoaXMgZnVuY3Rpb24gdG8gYmUKKyMgdGhlIHNhbWUgYXMgYmFzZTY0TUlNRS5kZWNvZGUoKSBvciBub3QuLi4KK2RlZiBkZWNvZGUoZW5jb2RlZCwgZW9sPU5MKToKKyAgICAiIiJEZWNvZGUgYSBxdW90ZWQtcHJpbnRhYmxlIHN0cmluZy4KKworICAgIExpbmVzIGFyZSBzZXBhcmF0ZWQgd2l0aCBlb2wsIHdoaWNoIGRlZmF1bHRzIHRvIFxcbi4KKyAgICAiIiIKKyAgICBpZiBub3QgZW5jb2RlZDoKKyAgICAgICAgcmV0dXJuIGVuY29kZWQKKyAgICAjIEJBVzogc2VlIGNvbW1lbnQgaW4gZW5jb2RlKCkgYWJvdmUuICBBZ2Fpbiwgd2UncmUgYnVpbGRpbmcgdXAgdGhlCisgICAgIyBkZWNvZGVkIHN0cmluZyB3aXRoIHN0cmluZyBjb25jYXRlbmF0aW9uLCB3aGljaCBjb3VsZCBiZSBkb25lIG11Y2ggbW9yZQorICAgICMgZWZmaWNpZW50bHkuCisgICAgZGVjb2RlZCA9ICcnCisKKyAgICBmb3IgbGluZSBpbiBlbmNvZGVkLnNwbGl0bGluZXMoKToKKyAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBkZWNvZGVkICs9IGVvbAorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpID0gMAorICAgICAgICBuID0gbGVuKGxpbmUpCisgICAgICAgIHdoaWxlIGkgPCBuOgorICAgICAgICAgICAgYyA9IGxpbmVbaV0KKyAgICAgICAgICAgIGlmIGMgIT0gJz0nOgorICAgICAgICAgICAgICAgIGRlY29kZWQgKz0gYworICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgIyBPdGhlcndpc2UsIGMgPT0gIj0iLiAgQXJlIHdlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU/ICBJZiBzbywgYWRkCisgICAgICAgICAgICAjIGEgc29mdCBsaW5lIGJyZWFrLgorICAgICAgICAgICAgZWxpZiBpKzEgPT0gbjoKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBEZWNvZGUgaWYgaW4gZm9ybSA9QUIKKyAgICAgICAgICAgIGVsaWYgaSsyIDwgbiBhbmQgbGluZVtpKzFdIGluIGhleGRpZ2l0cyBhbmQgbGluZVtpKzJdIGluIGhleGRpZ2l0czoKKyAgICAgICAgICAgICAgICBkZWNvZGVkICs9IHVucXVvdGUobGluZVtpOmkrM10pCisgICAgICAgICAgICAgICAgaSArPSAzCisgICAgICAgICAgICAjIE90aGVyd2lzZSwgbm90IGluIGZvcm0gPUFCLCBwYXNzIGxpdGVyYWxseQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWNvZGVkICs9IGMKKyAgICAgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAgICAgaWYgaSA9PSBuOgorICAgICAgICAgICAgICAgIGRlY29kZWQgKz0gZW9sCisgICAgIyBTcGVjaWFsIGNhc2UgaWYgb3JpZ2luYWwgc3RyaW5nIGRpZCBub3QgZW5kIHdpdGggZW9sCisgICAgaWYgbm90IGVuY29kZWQuZW5kc3dpdGgoZW9sKSBhbmQgZGVjb2RlZC5lbmRzd2l0aChlb2wpOgorICAgICAgICBkZWNvZGVkID0gZGVjb2RlZFs6LTFdCisgICAgcmV0dXJuIGRlY29kZWQKKworCisjIEZvciBjb252ZW5pZW5jZSBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdy8gc3RhbmRhcmQgYmFzZTY0IG1vZHVsZQorYm9keV9kZWNvZGUgPSBkZWNvZGUKK2RlY29kZXN0cmluZyA9IGRlY29kZQorCisKKwwKK2RlZiBfdW5xdW90ZV9tYXRjaChtYXRjaCk6CisgICAgIiIiVHVybiBhIG1hdGNoIGluIHRoZSBmb3JtID1BQiB0byB0aGUgQVNDSUkgY2hhcmFjdGVyIHdpdGggdmFsdWUgMHhhYiIiIgorICAgIHMgPSBtYXRjaC5ncm91cCgwKQorICAgIHJldHVybiB1bnF1b3RlKHMpCisKKworIyBIZWFkZXIgZGVjb2RpbmcgaXMgZG9uZSBhIGJpdCBkaWZmZXJlbnRseQorZGVmIGhlYWRlcl9kZWNvZGUocyk6CisgICAgIiIiRGVjb2RlIGEgc3RyaW5nIGVuY29kZWQgd2l0aCBSRkMgMjA0NSBNSU1FIGhlYWRlciBgUScgZW5jb2RpbmcuCisKKyAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBhcnNlIGEgZnVsbCBNSU1FIGhlYWRlciB2YWx1ZSBlbmNvZGVkIHdpdGgKKyAgICBxdW90ZWQtcHJpbnRhYmxlIChsaWtlID0/aXNvLTg4OTUtMT9xP0hlbGxvX1dvcmxkPz0pIC0tIHBsZWFzZSB1c2UKKyAgICB0aGUgaGlnaCBsZXZlbCBlbWFpbC5IZWFkZXIgY2xhc3MgZm9yIHRoYXQgZnVuY3Rpb25hbGl0eS4KKyAgICAiIiIKKyAgICBzID0gcy5yZXBsYWNlKCdfJywgJyAnKQorICAgIHJldHVybiByZS5zdWIocic9XHd7Mn0nLCBfdW5xdW90ZV9tYXRjaCwgcykKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L19faW5pdF9fLnB5IGIvTGliL2VtYWlsL3Rlc3QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL1B5QmFubmVyMDQ4LmdpZiBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvUHlCYW5uZXIwNDguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNWM4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL1B5QmFubmVyMDQ4LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL2F1ZGlvdGVzdC5hdSBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvYXVkaW90ZXN0LmF1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZDI4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL2F1ZGlvdGVzdC5hdQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18wMS50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18wMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzM2JjZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzAxLnR4dApAQCAtMCwwICsxLDE5IEBACitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK01lc3NhZ2UtSUQ6IDwxNTA5MC42MTMwNC4xMTA5MjkuNDU2ODRAYWFhLnp6ei5vcmc+CitGcm9tOiBiYmJAZGRkLmNvbSAoSm9obiBYLiBEb2UpCitUbzogYmJiQHp6ei5vcmcKK1N1YmplY3Q6IFRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UKK0RhdGU6IEZyaSwgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMAorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDIudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjI0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18wMi50eHQKQEAgLTAsMCArMSwxMzUgQEAKK01JTUUtdmVyc2lvbjogMS4wCitGcm9tOiBwcHAtcmVxdWVzdEB6enoub3JnCitTZW5kZXI6IHBwcC1hZG1pbkB6enoub3JnCitUbzogcHBwQHp6ei5vcmcKK1N1YmplY3Q6IFBwcCBkaWdlc3QsIFZvbCAxICMyIC0gNSBtc2dzCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDIwOjE4OjAwIC0wNDAwIChFRFQpCitYLU1haWxlcjogTWFpbG1hbiB2Mi4wLjQKK1gtTWFpbG1hbi1WZXJzaW9uOiAyLjAuNAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIxOTIuMTY4LjEuMi44ODkuMzI2MTQuOTg3ODEyMjU1LjUwMC4yMTgxNCIKKworLS0xOTIuMTY4LjEuMi44ODkuMzI2MTQuOTg3ODEyMjU1LjUwMC4yMTgxNAorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LWRlc2NyaXB0aW9uOiBNYXN0aGVhZCAoUHBwIGRpZ2VzdCwgVm9sIDEgIzIpCisKK1NlbmQgUHBwIG1haWxpbmcgbGlzdCBzdWJtaXNzaW9ucyB0bworCXBwcEB6enoub3JnCisKK1RvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB2aWEgdGhlIFdvcmxkIFdpZGUgV2ViLCB2aXNpdAorCWh0dHA6Ly93d3cuenp6Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3BwcAorb3IsIHZpYSBlbWFpbCwgc2VuZCBhIG1lc3NhZ2Ugd2l0aCBzdWJqZWN0IG9yIGJvZHkgJ2hlbHAnIHRvCisJcHBwLXJlcXVlc3RAenp6Lm9yZworCitZb3UgY2FuIHJlYWNoIHRoZSBwZXJzb24gbWFuYWdpbmcgdGhlIGxpc3QgYXQKKwlwcHAtYWRtaW5Aenp6Lm9yZworCitXaGVuIHJlcGx5aW5nLCBwbGVhc2UgZWRpdCB5b3VyIFN1YmplY3QgbGluZSBzbyBpdCBpcyBtb3JlIHNwZWNpZmljCit0aGFuICJSZTogQ29udGVudHMgb2YgUHBwIGRpZ2VzdC4uLiIKKworCistLTE5Mi4xNjguMS4yLjg4OS4zMjYxNC45ODc4MTIyNTUuNTAwLjIxODE0CitDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtZGVzY3JpcHRpb246IFRvZGF5J3MgVG9waWNzICg1IG1zZ3MpCisKK1RvZGF5J3MgVG9waWNzOgorCisgICAxLiB0ZXN0aW5nICMxIChCYXJyeSBBLiBXYXJzYXcpCisgICAyLiB0ZXN0aW5nICMyIChCYXJyeSBBLiBXYXJzYXcpCisgICAzLiB0ZXN0aW5nICMzIChCYXJyeSBBLiBXYXJzYXcpCisgICA0LiB0ZXN0aW5nICM0IChCYXJyeSBBLiBXYXJzYXcpCisgICA1LiB0ZXN0aW5nICM1IChCYXJyeSBBLiBXYXJzYXcpCisKKy0tMTkyLjE2OC4xLjIuODg5LjMyNjE0Ljk4NzgxMjI1NS41MDAuMjE4MTQKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdDsgYm91bmRhcnk9Il9fLS1fXy0tIgorCistLV9fLS1fXy0tCisKK01lc3NhZ2U6IDEKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAyMDoxNjoxMyAtMDQwMAorVG86IHBwcEB6enoub3JnCitGcm9tOiBiYXJyeUBkaWdpY29vbC5jb20gKEJhcnJ5IEEuIFdhcnNhdykKK1N1YmplY3Q6IFtQcHBdIHRlc3RpbmcgIzEKK1ByZWNlZGVuY2U6IGJ1bGsKKworCitoZWxsbworCisKKy0tX18tLV9fLS0KKworTWVzc2FnZTogMgorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAyMDoxNjoyMSAtMDQwMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitUbzogcHBwQHp6ei5vcmcKK0Zyb206IGJhcnJ5QGRpZ2ljb29sLmNvbSAoQmFycnkgQS4gV2Fyc2F3KQorUHJlY2VkZW5jZTogYnVsaworCisKK2hlbGxvCisKKworLS1fXy0tX18tLQorCitNZXNzYWdlOiAzCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDIwOjE2OjI1IC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK1RvOiBwcHBAenp6Lm9yZworRnJvbTogYmFycnlAZGlnaWNvb2wuY29tIChCYXJyeSBBLiBXYXJzYXcpCitTdWJqZWN0OiBbUHBwXSB0ZXN0aW5nICMzCitQcmVjZWRlbmNlOiBidWxrCisKKworaGVsbG8KKworCistLV9fLS1fXy0tCisKK01lc3NhZ2U6IDQKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMjA6MTY6MjggLTA0MDAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorVG86IHBwcEB6enoub3JnCitGcm9tOiBiYXJyeUBkaWdpY29vbC5jb20gKEJhcnJ5IEEuIFdhcnNhdykKK1N1YmplY3Q6IFtQcHBdIHRlc3RpbmcgIzQKK1ByZWNlZGVuY2U6IGJ1bGsKKworCitoZWxsbworCisKKy0tX18tLV9fLS0KKworTWVzc2FnZTogNQorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAyMDoxNjozMiAtMDQwMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitUbzogcHBwQHp6ei5vcmcKK0Zyb206IGJhcnJ5QGRpZ2ljb29sLmNvbSAoQmFycnkgQS4gV2Fyc2F3KQorU3ViamVjdDogW1BwcF0gdGVzdGluZyAjNQorUHJlY2VkZW5jZTogYnVsaworCisKK2hlbGxvCisKKworCisKKy0tX18tLV9fLS0tLQorLS0xOTIuMTY4LjEuMi44ODkuMzI2MTQuOTg3ODEyMjU1LjUwMC4yMTgxNAorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LWRlc2NyaXB0aW9uOiBEaWdlc3QgRm9vdGVyCisKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitQcHAgbWFpbGluZyBsaXN0CitQcHBAenp6Lm9yZworaHR0cDovL3d3dy56enoub3JnL21haWxtYW4vbGlzdGluZm8vcHBwCisKKworLS0xOTIuMTY4LjEuMi44ODkuMzI2MTQuOTg3ODEyMjU1LjUwMC4yMTgxNC0tCisKK0VuZCBvZiBQcHAgRGlnZXN0CisKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzAzLnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzAzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ4ZWJmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDMudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1JldHVybi1QYXRoOiA8YmJiQHp6ei5vcmc+CitEZWxpdmVyZWQtVG86IGJiYkB6enoub3JnCitSZWNlaXZlZDogYnkgbWFpbC56enoub3JnIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA4ODkpCisJaWQgMjdDRUFEMzhDQzsgRnJpLCAgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMCAoRURUKQorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCisKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18wNC50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18wNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2MzNjNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzA0LnR4dApAQCAtMCwwICsxLDM3IEBACitSZXR1cm4tUGF0aDogPGJhcnJ5QHB5dGhvbi5vcmc+CitEZWxpdmVyZWQtVG86IGJhcnJ5QHB5dGhvbi5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnB5dGhvbi5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKwlpZCBDMkJGMEQzN0M2OyBUdWUsIDExIFNlcCAyMDAxIDAwOjA1OjA1IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJoOTBWSUlJS214IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MjYxLjM2MjA5LjM1ODg0Ni4xMTg2NzRAYW50aGVtLnB5dGhvbi5vcmc+CitGcm9tOiBiYXJyeUBweXRob24ub3JnIChCYXJyeSBBLiBXYXJzYXcpCitUbzogYmFycnlAcHl0aG9uLm9yZworU3ViamVjdDogYSBzaW1wbGUgbXVsdGlwYXJ0CitEYXRlOiBUdWUsIDExIFNlcCAyMDAxIDAwOjA1OjA1IC0wNDAwCitYLU1haWxlcjogVk0gNi45NSB1bmRlciAyMS40IChwYXRjaCA0KSAiQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UiIFhFbWFjcyBMdWNpZAorWC1BdHRyaWJ1dGlvbjogQkFXCitYLU9ibGlxdWUtU3RyYXRlZ3k6IE1ha2UgYSBkb29yIGludG8gYSB3aW5kb3cKKworCistLWg5MFZJSUlLbXgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworCWZpbGVuYW1lPSJtc2cudHh0IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KKworLS1oOTBWSUlJS214CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKKwlmaWxlbmFtZT0ibXNnLnR4dCIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworYSBzaW1wbGUga2luZCBvZiBtaXJyb3IKK3RvIHJlZmxlY3QgdXBvbiBvdXIgb3duCisKKy0taDkwVklJSUtteC0tCisKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzA1LnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzA1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Q1ZTljCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDUudHh0CkBAIC0wLDAgKzEsMjggQEAKK0Zyb206IGZvbworU3ViamVjdDogYmFyCitUbzogYmF6CitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVwb3J0OyByZXBvcnQtdHlwZT1kZWxpdmVyeS1zdGF0dXM7CisJYm91bmRhcnk9IkQxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20iCitNZXNzYWdlLUlkOiA8MjAwMTA4MDMxNjI4MTAuMENBOEFBN0FDQ0BtYWlsLmV4YW1wbGUuY29tPgorCitUaGlzIGlzIGEgTUlNRS1lbmNhcHN1bGF0ZWQgbWVzc2FnZS4KKworLS1EMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworWWFkZGEgeWFkZGEgeWFkZGEKKworLS1EMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tCisKK1lhZGRhIHlhZGRhIHlhZGRhCisKKy0tRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorCitGcm9tOiBub2JvZHlAcHl0aG9uLm9yZworCitZYWRkYSB5YWRkYSB5YWRkYQorCistLUQxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20tLQorCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18wNi50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18wNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmM2E0NwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzA2LnR4dApAQCAtMCwwICsxLDMzIEBACitSZXR1cm4tUGF0aDogPGJhcnJ5QHB5dGhvbi5vcmc+CitEZWxpdmVyZWQtVG86IGJhcnJ5QHB5dGhvbi5vcmcKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCitDb250ZW50LURlc2NyaXB0aW9uOiBmb3J3YXJkZWQgbWVzc2FnZQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MjY1Ljk0ODIuNjQxMzM4LjU1NTM1MkBweXRob24ub3JnPgorRnJvbTogYmFycnlAem9wZS5jb20gKEJhcnJ5IEEuIFdhcnNhdykKK1NlbmRlcjogYmFycnlAcHl0aG9uLm9yZworVG86IGJhcnJ5QHB5dGhvbi5vcmcKK1N1YmplY3Q6IGZvcndhcmRlZCBtZXNzYWdlIGZyb20gQmFycnkgQS4gV2Fyc2F3CitEYXRlOiBUaHUsIDEzIFNlcCAyMDAxIDE3OjI4OjQyIC0wNDAwCitYLU1haWxlcjogVk0gNi45NSB1bmRlciAyMS40IChwYXRjaCA0KSAiQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UiIFhFbWFjcyBMdWNpZAorWC1BdHRyaWJ1dGlvbjogQkFXCitYLU9ibGlxdWUtU3RyYXRlZ3k6IEJlIGRpcnR5CitYLVVybDogaHR0cDovL2JhcnJ5Lndvb3oub3JnCisKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK1JldHVybi1QYXRoOiA8YmFycnlAcHl0aG9uLm9yZz4KK0RlbGl2ZXJlZC1UbzogYmFycnlAcHl0aG9uLm9yZworTWVzc2FnZS1JRDogPDE1MjY1Ljk0NjguNzEzNTMwLjk4NDQxQHB5dGhvbi5vcmc+CitGcm9tOiBiYXJyeUB6b3BlLmNvbSAoQmFycnkgQS4gV2Fyc2F3KQorU2VuZGVyOiBiYXJyeUBweXRob24ub3JnCitUbzogYmFycnlAcHl0aG9uLm9yZworU3ViamVjdDogdGVzdGluZworRGF0ZTogVGh1LCAxMyBTZXAgMjAwMSAxNzoyODoyOCAtMDQwMAorWC1NYWlsZXI6IFZNIDYuOTUgdW5kZXIgMjEuNCAocGF0Y2ggNCkgIkFydGlmaWNpYWwgSW50ZWxsaWdlbmNlIiBYRW1hY3MgTHVjaWQKK1gtQXR0cmlidXRpb246IEJBVworWC1PYmxpcXVlLVN0cmF0ZWd5OiBTcGVjdHJ1bSBhbmFseXNpcworWC1Vcmw6IGh0dHA6Ly9iYXJyeS53b296Lm9yZworCisKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzA3LnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzA3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFmM2EwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDcudHh0CkBAIC0wLDAgKzEsODMgQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSA8YmFycnlAZGlnaWNvb2wuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBIZXJlIGlzIHlvdXIgZGluZ3VzIGZpc2gKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKK0hpIHRoZXJlLAorCitUaGlzIGlzIHRoZSBkaW5ndXMgZmlzaC4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBpbWFnZS9naWY7IG5hbWU9ImRpbmd1c2Zpc2guZ2lmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0Citjb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iZGluZ3VzZmlzaC5naWYiCisKK1IwbEdPRGRoQUFFQUFmQUFBUC8vL3dBQUFDd0FBQUFBQUFFQUFRQUMvb1NQcWN2dEQ2T2N0TnFMczk2OCt3K0c0a2lXNW9tbTZzcTIKKzdndkg4a3pYOW8zbitzNzMvZzhNQ29mRW92R0lUR0lDVEtieUNWMEZETk9vOVNxcFFxcE9ySmZYelRRajJ2RDNUR3RxTCtOdEdRMmYKK3FUWG14enVPZDdXWGRjYzlEeWpVNTNld0ZuaTRzMGZHaGRpWWFFaEdCZWxJQ1ROb1YxajVOVW5GY3JtVXFlbWpOaWZKVldwYU9xYUkKK29GcTNTc3Bac1NyYUU3c0hxM2pyMU1acVd2aTY2MnZ4VjR0RCtwdktXNmFMRE9DTHl1cjhQRHdiYW55RGVxME4zRGN0YlFZZUxEdlIKK1JZNnQ5NW02VUIwZDNtd0lyVjdlMlZHTnZqamZmdWtlSnA0dzdGNjVLZWNHRnNUSFFHQXlnT3JncldzMWp0MjhSYzg4S0VTWWNHTEEKKy9vYnZUa0g2cCtDaW5XSmlKbUlNcVhHUXdIL3k0cWswU1lqZ1FUY3pUM2FqS1pHZnVJMHVKNGtrVkkvRFQ1czMvZWpreEkwYVQ0WSsKK1lUWWdXYkltVWFYazlubExtblNoMXFKaUpGbDBPcFVxUks0b095N055UlF0SFdvZmhvWVZ4a3dXWEtVU24wWXNTK2ZVVjZsaHFmWWIKKzZheWQzWjVxUWRHMUI3YnZRemFKandVVjJsaXhNVVo3SlZzT2xmaldWci8zTkIvdUZ2bnlTQk42RGNiNnJHd2FSTTN3c29ybXc1Y0MKK005TnhXeS9iV2R1ZnVkQ3Z5OGJPQWpYalZWd3RhL3VPMjFzRTVSSEJDek5GWHRncTlPUnRINGVZalZQNFlyeW8wMjZudmtGbUNleUEKK0IyOWVmVjZyYXZDTUs1SndXZDU4OTdRcng3bGwzOG82aUhEWi9yWFBSLy9mZWV2aEY0bDd3alVHWDN4cTFlZVJmTTRSU0pHQklWMUQKK3oxZ0tQa2ZXYWczbVZCVnZ2YTFSbFg1YkFKVFBSLzJZcU50dy9Ga0lZWUVpL3BJWmlBZHBjeHBvSHRtbllZb1p0dmhVZnR6ZHg1WlgKK0pTS0RXNDA1emtHY1p6ekdaNktFdjRGSTIyNG9EbWlqbEVmK3hwNk1KSzVvalkvQVNlVlVSK3dzS1J1SitYRlo1bzdaZUVpbWU4dDEKK291VXNVNllqRjVadFVpaGhrR2ZDZEZRTFdRRkozVVh4bUVsZmhRblIrZUNkY0Ria0ZacDZ2VFJtajU2QXBDaWhuNVFHcGFUb05abVIKK24zTlZTcFpjUXBaMktFT051c2FpQ3NLQXVnMHdrUWJKU0ZPK1BUU2puZUd4T3VGalBsVWszb3ZXdmRJZXJqVWc5WkdJT3RHcS9xZVgKK2VDWXJyQ1grMVVQc2dUS0dHUlNiemQ1cTE1NmQvZ3BmYkp4ZTY2ZUQ1aVFLclhqN1JHZ3J1R3hzNjJxZWJCSFVLUzMyQ0tsdUNpcVoKK3FoK3BtZWhtRWI3MW5vQVVvZTVlOVptMTdTNzc3M1YxMHBqcnRHNENtdXVyQ1YvbjZ6TEs1dHVyV05ocU92Rlhiamhack1EMFloS2UKK3dSMHpPeXV2c2g2TVdyR29JdXp2eVd1NXkxV0lGQXFtSnNlbHlweFhoNmRLTE5PS0VCOThMODhiUzJya05xcWxLekNOSnA5YzBHMGoKK0d6aDBpUnJDYkhTWG1QUjY0M1FTKzRyV2hnRm1uU2JTdVhDalMweEFPV2tVMlVkTHF5dVVOZkhTRmRVb3V5M2JtNWk1R25ETTN0RzgKK2RvSjRyNXRxdTNwUGJSU1ZmdnM4dUp6ZU5YaHAzbjRqL3RaNDJTd0g3ZWFXVVVPamMzcUZWOTQ1M1VIVFhaZmNMSCtPZU5zNWczNngKK2xCbkh2VG03RWJNYkxldWFMbmNhbzh2V0NYaW1mbzFvKzg0M0FrNnk0Q2hOZUdudHZBWXZmTEs0ZXptb3lOSWJOQ0xUQ1hPOVpWM0EKK0U4L3M4OFJjelB6RHdJNE9iN1haeWw3KzlNaWJhbjI5aCt0SlpQckUyMXdndkJwaERmcnJmUGRDVFBLSkQveTk4TDFyWndIY1Y2SnEKK1phYjBtZXRwdU5JWC9xQUZQb3oxNzFXVWFVYjRIQWhCU3pIdUhmanpIYjNraGEvMkNjdGlzL09SQXJWSE5ZZkZ5WVJIMnBZSVJ6aWMKK2lzVk9mUFdEMWI2bVJUcXBDUkJvenpvZjZVWlZ2RlhSeFdJcjNHR3JFdmlHWWd5UE1mYWhoZWlTYUxzLzlRZUZ1N29aL25kU1k4REQKK3lhOXgrdVBlZCs3bXhOMkl6SUlTQk9NTEZZV1ZxQzNQZXcxVDJuRnV1Q2l3WlM1L3Y2SUkxMGk0dDFPSmNVSDJVOXp4S29kSHNHR3YKK09hK3prdk5VWVVPYS9UQ0NSdXRGOU16RHdkbFVNSkFEVENHU2JEUTVPVjRQVGFtRG9QRWk2RWNjL1JGNVJXd2tjZFNYdlNPYURXU24KK0k5TGx2dWJGVFFwdWM2SktYTGNLZWIreGRiS1JCbndSRWVtWHlqZzZNRTY1YUppT3VCZ3JrdHp5a2ZQTEpCS1I5Q2xNYXZKNjIvRmYKK0JsTkl5b2Q5eVg5d2NTWGV4blhGcHZrcmJYazY0eHN4NURiN3dYS1A1ZlNnc3Z3SU1NLzk2MzFWTEJma210YkhSWHBxbXRlaTUyaEcKK3BVd1NsbytCQVNRb2VJTERPQmdSRUVDeEJCaDUvaVltTnNROWRJdjUrT0krK1FrcWRzSlBjM3V5a3o1ZmtNK09yYWVla2NRRjdYNG4KK0I1UzY3emE1VTk2N1Btb29HUWhVWGZGN2FmWHlDRDdPTmRSZTE3UW9nWWpWeDM4dUx3dHJTNm5oVG5tMTVMUVVudTlFMnVLNkNOSS8KKzFIT0FCajBFU3dPanV0NEZFcEZRcGROQW00SzJMSG5EV0hOY21LQjJpb0tCb2d5c1ZadE1PMm5TeFVkWjhZazJrSmM3VVJpb0xWSTAKK1lnbXRJd1pqNExvZUtlbWduT25iVWRHbnpaNE9hNnNjcWlvbEJHcVM2UmdXTkx1MFJNaGNhRTZyaGhVNGhpdXFGWFBBRzhmR3dUUFcKK0ZLZUxNdGRWbVhMU3M1WUpHRi9ZZVZtN3JSRU1sWTNVWUUreUN4YmFNWFg4eTE1bTV6VkhxNkdPS0RNeW56SUkvamRVSGR5VnFJeTAKK2lmWDIrci9FZ3RaY3ZSelNiNzJnVTl1aTg3TTJWZWNqS2lsZFcvYUZxYVloS29yeVVqZkIvZzRxdHlWdWM2MHhGREdtQ3h3alcrcXUKK3pqdXdsMkdrT1duNjYrM1FpaUVjdHZkMDRPVnZjQ1Z6amdUN2xya3ZqVkdLS0htbWxEVUtvd1NlaWtiNWtLL21KUmV1V094T054K3MKK1VMc2wrTHFiMENWbjBTclZ5SjZ3dDR0NnlUZVNDYWZoUGhBZjBPWG42TDYwVU14aUxvbEZBdG1OMzVTMk9iMWxacFExci9uMFFiNUQKK29RMXpKaVJWRGdGOE4zUThUWWZiaTNEeVdDeTNsVDFueHlCczZGVDNTMkdPeldSbHh3S3ZsUlAwUlBKQTlTanhFeTBVb0Vua0ErTTQKK2NuekxNSnJCR1dMRkVhYVViNWx2cHFicS9sb09hVTUrREZ1SFB4bzgyL09adU04RlhHM29WTlpodFdwTXBiLzBYdTVtL0xmTGhIWlEKKzd5dVZJME1xWjdORTQzaW1DOGpIM0l3R1psYlBtMHhrSllzNysyVTQ4aFhUc0ZTTXFnR0R2YWkwa0x4eXluS05UL3dhaitxMWMxdHoKK0dqT3BQQmdkQ1NxM1VLWnhDU3NxRklZK082SmJBV0dXY1YxcHdxTHlqNXNHcUNGMXhiMUYzdmFyVVdxckp2NmNOM1ByVVh6aWp0ZloKK0ZzaHBCTDNYd3I0R0lQdlUyTjhFanJKZ1MxemwyMXJiWFFNWGVYYzVqakZ5cmhwQ3ppalN2L1JRdHlQU3pIQ0ZNaGxNRTk1ZkhnbHQKK3BSc1grZGZTUWpVZUhBbHBXeko1aU9vNzlMZG5heGFpNmJYVGNHTzNmcDA3cmk3SExFbVhYUGxZaThidi9xVnh2TmNkcmE2bTdSbGIKKzZKQlRiNWZkNjZWaEZSakdBcmgybjdSMXJEVzRQNU5PVDlLMEkxODNUMnNjWWtlWjNxL1ZGeUxiMDlVOWFqelhCUzhLZ2toYzRtQlMKK2tZWTljeTNWeTlsVW51TkpIOEhHSWNsVWlsd25CdGpVT0gwZ3RlR09aNGMvWE5yaFhMU1lEeXhmbkQ4ejFwRHk3cllSdkRvbGhuYmUKK1VNenhDWlVzNDBzNnM3VUl2Qm5MZ2MwK3ZLdU9rSVhlT3JEeW1scCtaeHJhNE1aTEJiVnJxRC9qVEo1OTdwRG1udzVjNCtEYnlCODgKKzlDZzlEb2RZY1N1TVpULzExNHBwdHFjL0V1VGpSUHZIL3o1c2x6STN0bHVPRUJCTHFPWExPWCswSTU5Mjl0Tzk3d2t2bC9hdEN6K3kKK3hKcmR3dGVXMkZOVy9OU21CUCtmL21hWXRWcy9iWXlCQzdPeDNqc1laSEwwNUNJckJhL25TK2IzYkhmaVltNFVlaWwxWVpaU2dBVUkKK2ZGWjFkeFVtZUEyb1FSUTNSdUdYTkdMRlY5L1hiR0ZHUFY2a2Z6azFUQkJDZCtpemM3cTFIK09ITUp3bWFCWDJJUU5ZVkFLSFllcFYKK1NTR0NlNkNuYllISEVUS0dOZTQzRUR2RmdacjBnQi9uVkhQSFo4MFZWMW9qT2lJM1hEdllJa2w0YXlvNGJ4UUlnckZYV1R2QkkwbkgKK1ZFbFdNdXcyYUxVV0NSSEhmOHltVkNIakZsSm5PU29qZmV2Q1l5eXlaREgwSWN2SGhyc25RNU8xT3NXek9OdVZWS0l4U3hpRlovdFIKK2ZLREFmNnhGVG53NE85UWlnMlZDZlcyaEpRcm1NT3VIVzBXM2RMUW1DTU8yY2NkVWQveHlmZmxIL29sVGlIWlZkR3diOG5Jd1J6U0UKK0oxNWpGbE9KdUJaQlo0Q2l5SHlkMklGeWxGbEIrSGdIaFlhYmhXT0d3WU8xWkgvT2cxZHRRbEZNazM1MkNHUlNJRlRhcG5XUUVVdE4KK2w0enY4UzBhYUNGRHlHQ0JxRFV4WllweEdIWDAxeS9KdUgxeGhuN1RPQ25OQ0k0ZUtEczVXR1g0UjQyNUY0dkYxbzNCSjR2TzBvdHEKK0kzcmltSTdqSlkxaklTcW5CeGtuQ0l2cnVGODNtRjV3TjRYN3FHTEloUjhBMlZnMHlGRVJTSVhuOVZ2M0dIeTNWai9XSWtLZGRsWWkKK3lJTXYySS9WTWpUTHBXN3B0MDVTV0laUjBSUHl4cEI0U0lVTTlsQlBHQmwwR0M3b1NFRXdSWUxlNHBKcFpZMlAwemJJMW4rT2M0NHcKK3FZM1BVbm1GMGl4alZwREQvbUo5d3BPQkdUVmdYbGFDYVppUGNJV0s1TmlLQklpUGRHYVEwVFdHdkFpRzduTWNoZFpiN1ZnZjh6TmkKK011TXl6UmR5L2xlUGU5aUM0VFJ4N1doaE9RSS9RaVNWTkFtQWEybFQvcGlGYnVoN29mSm9ZU1p6clNaMWJ2bVd3M2VOMm5LVVBWa3kKK3VQTjUvVlJmb2hSZDBWWVpvcWhLSWxVNlRYWWhKeG1QVUlsb0F3YzFiUG1IRXBhWllaT1JITmxYVUpNMDdoQVR3SFI4TUpZcWt3V1IKK1dhSWV6Rmh4U0ZsYzgvRnE4MmhFbnBlUm96ZzNVTGhocjlsQUd0VkVrQ2c1Wk5SdXVWbGVCUGFaYWRoRzBaZ2t5UG1ET1RPS3pWaU0KK1lnT2NwdWtLcVFjYmpBV1MwSWxlUTJST2pkaDZBK21kMXFXZEJSU1g3aVNZZ0ZSVHRSbUJwSmlvaWVYSmlIZkppTUdJUjlmSk9uOEkKK01TZlhZaHNwbjRvb1NhMm1TQWo0bis4Qm1nMDNmQkpab1BPSmdzVlpSeHUxb09NUlBYWVlqZHFqaWhGYUVvWnBYQlJFYW51Sm9SSTYKK2NpYkZpbnE0bmdVS2gvd1FkL0g1b2ZZQ1owSEpYUjYyb3BaRmFBVDBpRklabzRESWlVb2pramVxS2l1b1ppcktvNVkxYTdBV2NrR2EKK0JrdVlvRDVscERLNmVVczZDa0RxcEVUd2wxRXFwZmhKcFZlS3BWbDZFZ1VBQURzPQorCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzA4LnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzA4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYzMDgzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDgudHh0CkBAIC0wLDAgKzEsMjQgQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBMeXJpY3MKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0yIgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0ia29pOC1yIgorCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDkudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NWM0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18wOS50eHQKQEAgLTAsMCArMSwyNCBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0Zyb206IEJhcnJ5IFdhcnNhdyA8YmFycnlAem9wZS5jb20+CitUbzogRGluZ3VzIExvdmVycyA8Y3JhdmluZG9nc0BjcmF2aW5kb2dzLmNvbT4KK1N1YmplY3Q6IEx5cmljcworRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAxOTozNTowMiAtMDQwMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0iaXNvLTg4NTktMSIKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9ImtvaTgtciIKKworCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzEwLnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzEwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDMwZDEzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTAudHh0CkBAIC0wLDAgKzEsMzIgQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBMeXJpY3MKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK1RoaXMgaXMgYSA3Yml0IGVuY29kZWQgbWVzc2FnZS4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBRdW90ZWQtUHJpbnRhYmxlCisKKz1BMVRoaXMgaXMgYSBRdW90ZWQgUHJpbnRhYmxlIGVuY29kZWQgbWVzc2FnZSEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogQmFzZTY0CisKK1ZHaHBjeUJwY3lCaElFSmhjMlUyTkNCbGJtTnZaR1ZrSUcxbGMzTmhaMlV1CisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIgorCitUaGlzIGhhcyBubyBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBoZWFkZXIuCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTEudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmN2YxOTkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xMS50eHQKQEAgLTAsMCArMSw3IEBACitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogVGhlIGVuY2xvc2luZyBtZXNzYWdlCisKK1N1YmplY3Q6IEFuIGVuY2xvc2VkIG1lc3NhZ2UKKworSGVyZSBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzEyLnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzEyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmVjOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTIudHh0CkBAIC0wLDAgKzEsMzYgQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBMeXJpY3MKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJBTk9USEVSIgorCistLUFOT1RIRVIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMiIKKworCistLUFOT1RIRVIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMyIKKworLS1BTk9USEVSLS0KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9ImtvaTgtciIKKworCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzEyYS50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xMmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDIyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xMmEudHh0CkBAIC0wLDAgKzEsMzggQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBMeXJpY3MKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJBTk9USEVSIgorCistLUFOT1RIRVIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMiIKKworCistLUFOT1RIRVIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMyIKKworCistLUFOT1RIRVItLQorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJrb2k4LXIiCisKKworLS1CT1VOREFSWS0tCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xMy50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2ZDUyZAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzEzLnR4dApAQCAtMCwwICsxLDk0IEBACitNSU1FLVZlcnNpb246IDEuMAorRnJvbTogQmFycnkgPGJhcnJ5QGRpZ2ljb29sLmNvbT4KK1RvOiBEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPgorU3ViamVjdDogSGVyZSBpcyB5b3VyIGRpbmd1cyBmaXNoCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDE5OjM1OjAyIC0wNDAwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ik9VVEVSIgorCistLU9VVEVSCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorCitBIHRleHQvcGxhaW4gcGFydAorCistLU9VVEVSCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Qk9VTkRBUlkKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorCitIaSB0aGVyZSwKKworVGhpcyBpcyB0aGUgZGluZ3VzIGZpc2guCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogaW1hZ2UvZ2lmOyBuYW1lPSJkaW5ndXNmaXNoLmdpZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorY29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ImRpbmd1c2Zpc2guZ2lmIgorCitSMGxHT0RkaEFBRUFBZkFBQVAvLy93QUFBQ3dBQUFBQUFBRUFBUUFDL29TUHFjdnRENk9jdE5xTHM5NjgrdytHNGtpVzVvbW02c3EyCis3Z3ZIOGt6WDlvM24rczczL2c4TUNvZkVvdkdJVEdJQ1RLYnlDVjBGRE5PbzlTcXBRcXBPckpmWHpUUWoydkQzVEd0cUwrTnRHUTJmCitxVFhteHp1T2Q3V1hkY2M5RHlqVTUzZXdGbmk0czBmR2hkaVlhRWhHQmVsSUNUTm9WMWo1TlVuRmNybVVxZW1qTmlmSlZXcGFPcWFJCitvRnEzU3NwWnNTcmFFN3NIcTNqcjFNWnFXdmk2NjJ2eFY0dEQrcHZLVzZhTERPQ0x5dXI4UER3YmFueURlcTBOM0RjdGJRWWVMRHZSCitSWTZ0OTVtNlVCMGQzbXdJclY3ZTJWR052ampmZnVrZUpwNHc3RjY1S2VjR0ZzVEhRR0F5Z09yZ3JXczFqdDI4UmM4OEtFU1ljR0xBCisvb2J2VGtINnArQ2luV0ppSm1JTXFYR1F3SC95NHFrMFNZamdRVGN6VDNhaktaR2Z1STB1SjRra1ZJL0RUNXMzL2Vqa3hJMGFUNFkrCitZVFlnV2JJbVVhWGs5bmxMbW5TaDFxSmlKRmwwT3BVcVJLNG9PeTdOeVJRdEhXb2Zob1lWeGt3V1hLVVNuMFlzUytmVVY2bGhxZlliCis2YXlkM1o1cVFkRzFCN2J2UXphSmp3VVYybGl4TVVaN0pWc09sZmpXVnIvM05CL3VGdm55U0JONkRjYjZyR3dhUk0zd3Nvcm13NWNDCitNOU54V3kvYldkdWZ1ZEN2eThiT0FqWGpWVnd0YS91TzIxc0U1UkhCQ3pORlh0Z3E5T1J0SDRlWWpWUDRZcnlvMDI2bnZrRm1DZXlBCitCMjllZlY2cmF2Q01LNUp3V2Q1ODk3UXJ4N2xsMzhvNmlIRFovclhQUi8vZmVldmhGNGw3d2pVR1gzeHExZWVSZk00UlNKR0JJVjFECit6MWdLUGtmV2FnM21WQlZ2dmExUmxYNWJBSlRQUi8yWXFOdHcvRmtJWVlFaS9wSVppQWRwY3hwb0h0bW5ZWW9adHZoVWZ0emR4NVpYCitKU0tEVzQwNXprR2NaenpHWjZLRXY0RkkyMjRvRG1pamxFZit4cDZNSks1b2pZL0FTZVZVUit3c0tSdUorWEZaNW83WmVFaW1lOHQxCitvdVVzVTZZakY1WnRVaWhoa0dmQ2RGUUxXUUZKM1VYeG1FbGZoUW5SK2VDZGNEYmtGWnA2dlRSbWo1NkFwQ2lobjVRR3BhVG9OWm1SCituM05WU3BaY1FwWjJLRU9OdXNhaUNzS0F1ZzB3a1FiSlNGTytQVFNqbmVHeE91RmpQbFVrM292V3ZkSWVyalVnOVpHSU90R3EvcWVYCitlQ1lyckNYKzFVUHNnVEtHR1JTYnpkNXExNTZkL2dwZmJKeGU2NmVENWlRS3JYajdSR2dydUd4czYycWViQkhVS1MzMkNLbHVDaXFaCitxaCtwbWVobUViNzFub0FVb2U1ZTlabTE3Uzc3NzNWMTBwanJ0RzRDbXV1ckNWL242ekxLNXR1cldOaHFPdkZYYmpoWnJNRDBZaEtlCit3UjB6T3l1dnNoNk1XckdvSXV6dnlXdTV5MVdJRkFxbUpzZWx5cHhYaDZkS0xOT0tFQjk4TDg4YlMycmtOcXFsS3pDTkpwOWMwRzBqCitHemgwaVJyQ2JIU1htUFI2NDNRUys0cldoZ0ZtblNiU3VYQ2pTMHhBT1drVTJVZExxeXVVTmZIU0ZkVW91eTNibTVpNUduRE0zdEc4Citkb0o0cjV0cXUzcFBiUlNWZnZzOHVKemVOWGhwM240ai90WjQyU3dIN2VhV1VVT2pjM3FGVjk0NTNVSFRYWmZjTEgrT2VOczVnMzZ4CitsQm5IdlRtN0ViTWJMZXVhTG5jYW84dldDWGltZm8xbys4NDNBazZ5NENoTmVHbnR2QVl2ZkxLNGV6bW95TkliTkNMVENYTzlaVjNBCitFOC9zODhSY3pQekR3STRPYjdYWnlsNys5TWliYW4yOWgrdEpaUHJFMjF3Z3ZCcGhEZnJyZlBkQ1RQS0pEL3k5OEwxclp3SGNWNkpxCitaYWIwbWV0cHVOSVgvcUFGUG96MTcxV1VhVWI0SEFoQlN6SHVIZmp6SGIza2hhLzJDY3Rpcy9PUkFyVkhOWWZGeVlSSDJwWUlSemljCitpc1ZPZlBXRDFiNm1SVHFwQ1JCb3p6b2Y2VVpWdkZYUnhXSXIzR0dyRXZpR1lneVBNZmFoaGVpU2FMcy85UWVGdTdvWi9uZFNZOERECit5YTl4K3VQZWQrN214TjJJeklJU0JPTUxGWVdWcUMzUGV3MVQybkZ1dUNpd1pTNS92NklJMTBpNHQxT0pjVUgyVTl6eEtvZEhzR0d2CitPYSt6a3ZOVVlVT2EvVENDUnV0RjlNekR3ZGxVTUpBRFRDR1NiRFE1T1Y0UFRhbURvUEVpNkVjYy9SRjVSV3drY2RTWHZTT2FEV1NuCitJOUxsdnViRlRRcHVjNkpLWExjS2ViK3hkYktSQm53UkVlbVh5amc2TUU2NWFKaU91Qmdya3R6eWtmUExKQktSOUNsTWF2SjYyL0ZmCitCbE5JeW9kOXlYOXdjU1hleG5YRnB2a3JiWGs2NHhzeDVEYjd3WEtQNWZTZ3N2d0lNTS85NjMxVkxCZmttdGJIUlhwcW10ZWk1MmhHCitwVXdTbG8rQkFTUW9lSUxET0JnUkVFQ3hCQmg1L2lZbU5zUTlkSXY1K09JKytRa3Fkc0pQYzN1eWt6NWZrTStPcmFlZWtjUUY3WDRuCitCNVM2N3phNVU5NjdQbW9vR1FoVVhmRjdhZlh5Q0Q3T05kUmUxN1FvZ1lqVngzOHVMd3RyUzZuaFRubTE1TFFVbnU5RTJ1SzZDTkkvCisxSE9BQmowRVN3T2p1dDRGRXBGUXBkTkFtNEsyTEhuRFdITmNtS0IyaW9LQm9neXNWWnRNTzJuU3hVZFo4WWsya0pjN1VSaW9MVkkwCitZZ210SXdaajRMb2VLZW1nbk9uYlVkR256WjRPYTZzY3Fpb2xCR3FTNlJnV05MdTBSTWhjYUU2cmhoVTRoaXVxRlhQQUc4Zkd3VFBXCitGS2VMTXRkVm1YTFNzNVlKR0YvWWVWbTdyUkVNbFkzVVlFK3lDeGJhTVhYOHkxNW01elZIcTZHT0tETXlueklJL2pkVUhkeVZxSXkwCitpZlgyK3IvRWd0WmN2UnpTYjcyZ1U5dWk4N00yVmVjaktpbGRXL2FGcWFZaEtvcnlVamZCL2c0cXR5VnVjNjB4RkRHbUN4d2pXK3F1Cit6anV3bDJHa09XbjY2KzNRaWlFY3R2ZDA0T1Z2Y0NWempnVDdscmt2alZHS0tIbW1sRFVLb3dTZWlrYjVrSy9tSlJldVdPeE9OeCtzCitVTHNsK0xxYjBDVm4wU3JWeUo2d3Q0dDZ5VGVTQ2FmaFBoQWYwT1huNkw2MFVNeGlMb2xGQXRtTjM1UzJPYjFsWnBRMXIvbjBRYjVECitvUTF6SmlSVkRnRjhOM1E4VFlmYmkzRHlXQ3kzbFQxbnh5QnM2RlQzUzJHT3pXUmx4d0t2bFJQMFJQSkE5U2p4RXkwVW9FbmtBK000CitjbnpMTUpyQkdXTEZFYWFVYjVsdnBxYnEvbG9PYVU1K0RGdUhQeG84Mi9PWnVNOEZYRzNvVk5aaHRXcE1wYi8wWHU1bS9MZkxoSFpRCis3eXVWSTBNcVo3TkU0M2ltQzhqSDNJd0dabGJQbTB4a0pZczcrMlU0OGhYVHNGU01xZ0dEdmFpMGtMeHl5bktOVC93YWorcTFjMXR6CitHak9wUEJnZENTcTNVS1p4Q1NzcUZJWStPNkpiQVdHV2NWMXB3cUx5ajVzR3FDRjF4YjFGM3ZhclVXcXJKdjZjTjNQclVYemlqdGZaCitGc2hwQkwzWHdyNEdJUHZVMk44RWpySmdTMXpsMjFyYlhRTVhlWGM1ampGeXJocEN6aWpTdi9SUXR5UFN6SENGTWhsTUU5NWZIZ2x0CitwUnNYK2RmU1FqVWVIQWxwV3pKNWlPbzc5TGRuYXhhaTZiWFRjR08zZnAwN3JpN0hMRW1YWFBsWWk4YnYvcVZ4dk5jZHJhNm03UmxiCis2SkJUYjVmZDY2VmhGUmpHQXJoMm43UjFyRFc0UDVOT1Q5SzBJMTgzVDJzY1lrZVozcS9WRnlMYjA5VTlhanpYQlM4S2draGM0bUJTCitrWVk5Y3kzVnk5bFVudU5KSDhIR0ljbFVpbHduQnRqVU9IMGd0ZUdPWjRjL1hOcmhYTFNZRHl4Zm5EOHoxcER5N3JZUnZEb2xobmJlCitVTXp4Q1pVczQwczZzN1VJdkJuTGdjMCt2S3VPa0lYZU9yRHltbHArWnhyYTRNWkxCYlZycUQvalRKNTk3cERtbnc1YzQrRGJ5Qjg4Cis5Q2c5RG9kWWNTdU1aVC8xMTRwcHRxYy9FdVRqUlB2SC96NXNsekkzdGx1T0VCQkxxT1hMT1grMEk1OTI5dE85N3drdmwvYXRDeit5Cit4SnJkd3RlVzJGTlcvTlNtQlArZi9tYVl0VnMvYll5QkM3T3gzanNZWkhMMDVDSXJCYS9uUytiM2JIZmlZbTRVZWlsMVlaWlNnQVVJCitmRloxZHhVbWVBMm9RUlEzUnVHWE5HTEZWOS9YYkdGR1BWNmtmemsxVEJCQ2QraXpjN3ExSCtPSE1Kd21hQlgySVFOWVZBS0hZZXBWCitTU0dDZTZDbmJZSEhFVEtHTmU0M0VEdkZnWnIwZ0IvblZIUEhaODBWVjFvak9pSTNYRHZZSWtsNGF5bzRieFFJZ3JGWFdUdkJJMG5ICitWRWxXTXV3MmFMVVdDUkhIZjh5bVZDSGpGbEpuT1NvamZldkNZeXl5WkRIMEljdkhocnNuUTVPMU9zV3pPTnVWVktJeFN4aUZaL3RSCitmS0RBZjZ4RlRudzRPOVFpZzJWQ2ZXMmhKUXJtTU91SFcwVzNkTFFtQ01PMmNjZFVkL3h5ZmZsSC9vbFRpSFpWZEd3YjhuSXdSelNFCitKMTVqRmxPSnVCWkJaNENpeUh5ZDJJRnlsRmxCK0hnSGhZYWJoV09Hd1lPMVpIL09nMWR0UWxGTWszNTJDR1JTSUZUYXBuV1FFVXROCitsNHp2OFMwYWFDRkR5R0NCcURVeFpZcHhHSFgwMXkvSnVIMXhobjdUT0NuTkNJNGVLRHM1V0dYNFI0MjVGNHZGMW8zQko0dk8wb3RxCitJM3JpbUk3akpZMWpJU3FuQnhrbkNJdnJ1RjgzbUY1d040WDdxR0xJaFI4QTJWZzB5RkVSU0lYbjlWdjNHSHkzVmovV0lrS2RkbFlpCit5SU12MkkvVk1qVExwVzdwdDA1U1dJWlIwUlB5eHBCNFNJVU05bEJQR0JsMEdDN29TRUV3UllMZTRwSnBaWTJQMHpiSTFuK09jNDR3CitxWTNQVW5tRjBpeGpWcEREL21KOXdwT0JHVFZnWGxhQ2FaaVBjSVdLNU5pS0JJaVBkR2FRMFRXR3ZBaUc3bk1jaGRaYjdWZ2Y4ek5pCitNdU15elJkeS9sZVBlOWlDNFRSeDdXaGhPUUkvUWlTVk5BbUFhMmxUL3BpRmJ1aDdvZkpvWVNaenJTWjFidm1XdzNlTjJuS1VQVmt5Cit1UE41L1ZSZm9oUmQwVllab3FoS0lsVTZUWFloSnhtUFVJbG9Bd2MxYlBtSEVwYVpZWk9SSE5sWFVKTTA3aEFUd0hSOE1KWXFrd1dSCitXYUllekZoeFNGbGM4L0ZxODJoRW5wZVJvemczVUxoaHI5bEFHdFZFa0NnNVpOUnV1VmxlQlBhWmFkaEcwWmdreVBtRE9UT0t6VmlNCitZZ09jcHVrS3FRY2JqQVdTMElsZVEyUk9qZGg2QSttZDFxV2RCUlNYN2lTWWdGUlR0Um1CcEppb2llWEppSGZKaU1HSVI5ZkpPbjhJCitNU2ZYWWhzcG40b29TYTJtU0FqNG4rOEJtZzAzZkJKWm9QT0pnc1ZaUnh1MW9PTVJQWFlZamRxamloRmFFb1pwWEJSRWFudUpvUkk2CitjaWJGaW5xNG5nVUtoL3dRZC9INW9mWUNaMEhKWFI2Mm9wWkZhQVQwaUZJWm80RElpVW9qa2plcUtpdW9aaXJLbzVZMWE3QVdja0dhCitCa3VZb0Q1bHBESzZlVXM2Q2tEcXBFVHdsMUVxcGZoSnBWZUtwVmw2RWdVQUFEcz0KKworLS1CT1VOREFSWS0tCisKKy0tT1VURVItLQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTQudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOThkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xNC50eHQKQEAgLTAsMCArMSwyMyBAQAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKwlpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0OyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKKworCitIaSwKKworSSdtIHNvcnJ5IGJ1dCBJJ20gdXNpbmcgYSBkcmFpbmJyZWFkIElTUCwgd2hpY2ggYWx0aG91Z2ggYmlnIGFuZAord2VhbHRoeSBjYW4ndCBzZWVtIHRvIGdlbmVyYXRlIHN0YW5kYXJkIGNvbXBsaWFudCBlbWFpbC4gOigKKworVGhpcyBtZXNzYWdlIGhhcyBhIENvbnRlbnQtVHlwZTogaGVhZGVyIHdpdGggbm8gc3VidHlwZS4gIEkgaG9wZSB5b3UKK2NhbiBzdGlsbCByZWFkIGl0LgorCistTWUKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzE1LnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzE1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I4NDg3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTUudHh0CkBAIC0wLDAgKzEsNTIgQEAKK1JldHVybi1QYXRoOiA8eHhAeHguZGs+CitSZWNlaXZlZDogZnJvbSBmZXBELnBvc3QudGVsZS5kayAoMTk1LjQxLjQ2LjE0OSkgYnkgbWFpbC5ncm91cGNhcmUuZGsgKExTTVRQIGZvciBXaW5kb3dzIE5UIHYxLjFiKSB3aXRoIFNNVFAgaWQgPDAuMDAxNEY4QTJAbWFpbC5ncm91cGNhcmUuZGs+OyBNb24sIDMwIEFwciAyMDAxIDEyOjE3OjUwICswMjAwCitVc2VyLUFnZW50OiBNaWNyb3NvZnQtT3V0bG9vay1FeHByZXNzLU1hY2ludG9zaC1FZGl0aW9uLzUuMDIuMjEwNgorU3ViamVjdDogWFgKK0Zyb206IHh4QHh4LmRrCitUbzogWFgKK01lc3NhZ2UtSUQ6IDx4eHh4PgorTWltZS12ZXJzaW9uOiAxLjAKK0NvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVkOworICAgYm91bmRhcnk9Ik1TX01hY19PRV8zMDcxNDc3ODQ3XzcyMDI1Ml9NSU1FX1BhcnQiCisKKz4gRGVubmUgbWVkZGVsZWxzZSBlciBpIE1JTUUtZm9ybWF0LiBEYSBkaXQgcG9zdGy+c25pbmdzcHJvZ3JhbSBpa2tlIGZvcnN0jHIgZGV0dGUgZm9ybWF0LCBrYW4gZGVsIGFmIGVsbGVyIGhlbGUgbWVkZGVsZWxzZW4gdr5yZSB1bL5zZWxpZy4KKworLS1NU19NYWNfT0VfMzA3MTQ3Nzg0N183MjAyNTJfTUlNRV9QYXJ0CitDb250ZW50LXR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKKyAgIGJvdW5kYXJ5PSJNU19NYWNfT0VfMzA3MTQ3Nzg0N183MjAyNTJfTUlNRV9QYXJ0IgorCisKKy0tTVNfTWFjX09FXzMwNzE0Nzc4NDdfNzIwMjUyX01JTUVfUGFydAorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJJU08tODg1OS0xIgorQ29udGVudC10cmFuc2Zlci1lbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQorCitTb21lIHJlbW92ZWQgdGVzdC4gCisKKy0tTVNfTWFjX09FXzMwNzE0Nzc4NDdfNzIwMjUyX01JTUVfUGFydAorQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9IklTTy04ODU5LTEiCitDb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlCisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+U29tZSByZW1vdmVkIEhUTUw8L1RJVExFPgorPC9IRUFEPgorPEJPRFk+CitTb21lIHJlbW92ZWQgdGV4dC4KKzwvQk9EWT4KKzwvSFRNTD4KKworCistLU1TX01hY19PRV8zMDcxNDc3ODQ3XzcyMDI1Ml9NSU1FX1BhcnQtLQorCisKKy0tTVNfTWFjX09FXzMwNzE0Nzc4NDdfNzIwMjUyX01JTUVfUGFydAorQ29udGVudC10eXBlOiBpbWFnZS9naWY7IG5hbWU9Inh4LmdpZiI7CisgeC1tYWMtY3JlYXRvcj0iNkY2NzZDNjUiOworIHgtbWFjLXR5cGU9IjQ3NDk0NjY2IgorQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudAorQ29udGVudC10cmFuc2Zlci1lbmNvZGluZzogYmFzZTY0CisKK1NvbWUgcmVtb3ZlZCBiYXNlNjQgZW5jb2RlZCBjaGFycy4KKworLS1NU19NYWNfT0VfMzA3MTQ3Nzg0N183MjAyNTJfTUlNRV9QYXJ0LS0KKwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTYudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTY3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xNi50eHQKQEAgLTAsMCArMSwxMjMgQEAKK1JldHVybi1QYXRoOiA8PgorRGVsaXZlcmVkLVRvOiBzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnCitSZWNlaXZlZDogZnJvbSBjb3VnYXIubm9jLnVjbGEuZWR1IChjb3VnYXIubm9jLnVjbGEuZWR1IFsxNjkuMjMyLjEwLjE4XSkKKwlieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBDQ0MyQzUxQjg0CisJZm9yIDxzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnPjsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxMzo1NCAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGZyb20gc2ltcy1tcy1kYWVtb24gYnkgY291Z2FyLm5vYy51Y2xhLmVkdQorIChTdW4gSW50ZXJuZXQgTWFpbCBTZXJ2ZXIgc2ltcy4zLjUuMjAwMC4wMy4yMy4xOC4wMy5wMTApCisgaWQgPDBHSzUwMEIwMUQwQjhZQGNvdWdhci5ub2MudWNsYS5lZHU+IGZvciBzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnOyBTdW4sCisgMjMgU2VwIDIwMDEgMjA6MTQ6MzUgLTA3MDAgKFBEVCkKK1JlY2VpdmVkOiBmcm9tIGNvdWdhci5ub2MudWNsYS5lZHUKKyAoU3VuIEludGVybmV0IE1haWwgU2VydmVyIHNpbXMuMy41LjIwMDAuMDMuMjMuMTguMDMucDEwKQorIGlkIDwwR0s1MDBCMDFEMEI4WEBjb3VnYXIubm9jLnVjbGEuZWR1PjsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxNDozNSAtMDcwMCAoUERUKQorRGF0ZTogU3VuLCAyMyBTZXAgMjAwMSAyMDoxNDozNSAtMDcwMCAoUERUKQorRnJvbTogSW50ZXJuZXQgTWFpbCBEZWxpdmVyeSA8cG9zdG1hc3RlckB1Y2xhLmVkdT4KK1N1YmplY3Q6IERlbGl2ZXJ5IE5vdGlmaWNhdGlvbjogRGVsaXZlcnkgaGFzIGZhaWxlZAorVG86IHNjci1hZG1pbkBzb2NhbC1yYXZlcy5vcmcKK01lc3NhZ2UtaWQ6IDwwR0s1MDBCMDREMEI4WEBjb3VnYXIubm9jLnVjbGEuZWR1PgorTUlNRS12ZXJzaW9uOiAxLjAKK1NlbmRlcjogc2NyLW93bmVyQHNvY2FsLXJhdmVzLm9yZworRXJyb3JzLVRvOiBzY3Itb3duZXJAc29jYWwtcmF2ZXMub3JnCitYLUJlZW5UaGVyZTogc2NyQHNvY2FsLXJhdmVzLm9yZworWC1NYWlsbWFuLVZlcnNpb246IDIuMWEzCitQcmVjZWRlbmNlOiBidWxrCitMaXN0LUhlbHA6IDxtYWlsdG86c2NyLXJlcXVlc3RAc29jYWwtcmF2ZXMub3JnP3N1YmplY3Q9aGVscD4KK0xpc3QtUG9zdDogPG1haWx0bzpzY3JAc29jYWwtcmF2ZXMub3JnPgorTGlzdC1TdWJzY3JpYmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vbGlzdGluZm8vc2NyPiwKKwk8bWFpbHRvOnNjci1yZXF1ZXN0QHNvY2FsLXJhdmVzLm9yZz9zdWJqZWN0PXN1YnNjcmliZT4KK0xpc3QtSWQ6IFNvQ2FsLVJhdmVzIDxzY3Iuc29jYWwtcmF2ZXMub3JnPgorTGlzdC1VbnN1YnNjcmliZTogPGh0dHA6Ly9zb2NhbC1yYXZlcy5vcmcvbWFpbG1hbi9saXN0aW5mby9zY3I+LAorCTxtYWlsdG86c2NyLXJlcXVlc3RAc29jYWwtcmF2ZXMub3JnP3N1YmplY3Q9dW5zdWJzY3JpYmU+CitMaXN0LUFyY2hpdmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vcHJpdmF0ZS9zY3IvPgorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVwb3J0OyBib3VuZGFyeT0iQm91bmRhcnlfKElEX1BHUzJGMmEreisvakw3aHVwS2dSaEEpIgorCisKKy0tQm91bmRhcnlfKElEX1BHUzJGMmEreisvakw3aHVwS2dSaEEpCitDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMQorCitUaGlzIHJlcG9ydCByZWxhdGVzIHRvIGEgbWVzc2FnZSB5b3Ugc2VudCB3aXRoIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpZWxkczoKKworICBNZXNzYWdlLWlkOiA8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+CisgIERhdGU6IFN1biwgMjMgU2VwIDIwMDEgMjA6MTA6NTUgLTA3MDAKKyAgRnJvbTogIklhbiBULiBIZW5yeSIgPGhlbnJ5aUBveHkuZWR1PgorICBUbzogU29DYWwgUmF2ZXMgPHNjckBzb2NhbC1yYXZlcy5vcmc+CisgIFN1YmplY3Q6IFtzY3JdIHllYWggZm9yIElhbnMhIQorCitZb3VyIG1lc3NhZ2UgY2Fubm90IGJlIGRlbGl2ZXJlZCB0byB0aGUgZm9sbG93aW5nIHJlY2lwaWVudHM6CisKKyAgUmVjaXBpZW50IGFkZHJlc3M6IGphbmdlbDFAY291Z2FyLm5vYy51Y2xhLmVkdQorICBSZWFzb246IHJlY2lwaWVudCByZWFjaGVkIGRpc2sgcXVvdGEKKworCistLUJvdW5kYXJ5XyhJRF9QR1MyRjJhK3orL2pMN2h1cEtnUmhBKQorQ29udGVudC10eXBlOiBtZXNzYWdlL0RFTElWRVJZLVNUQVRVUworCitPcmlnaW5hbC1lbnZlbG9wZS1pZDogMEdLNTAwQjRIRDA4ODhAY291Z2FyLm5vYy51Y2xhLmVkdQorUmVwb3J0aW5nLU1UQTogZG5zOyBjb3VnYXIubm9jLnVjbGEuZWR1CisKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuMC4wIChyZWNpcGllbnQgcmVhY2hlZCBkaXNrIHF1b3RhKQorT3JpZ2luYWwtcmVjaXBpZW50OiByZmM4MjI7amFuZ2VsMUBjb3VnYXIubm9jLnVjbGEuZWR1CitGaW5hbC1yZWNpcGllbnQ6IHJmYzgyMjtqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUKKworLS1Cb3VuZGFyeV8oSURfUEdTMkYyYSt6Ky9qTDdodXBLZ1JoQSkKK0NvbnRlbnQtdHlwZTogTUVTU0FHRS9SRkM4MjIKKworUmV0dXJuLXBhdGg6IHNjci1hZG1pbkBzb2NhbC1yYXZlcy5vcmcKK1JlY2VpdmVkOiBmcm9tIHNpbXMtbXMtZGFlbW9uIGJ5IGNvdWdhci5ub2MudWNsYS5lZHUKKyAoU3VuIEludGVybmV0IE1haWwgU2VydmVyIHNpbXMuMy41LjIwMDAuMDMuMjMuMTguMDMucDEwKQorIGlkIDwwR0s1MDBCMDFEMEI4WEBjb3VnYXIubm9jLnVjbGEuZWR1PjsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxNDozNSAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGZyb20gcGFudGhlci5ub2MudWNsYS5lZHUgYnkgY291Z2FyLm5vYy51Y2xhLmVkdQorIChTdW4gSW50ZXJuZXQgTWFpbCBTZXJ2ZXIgc2ltcy4zLjUuMjAwMC4wMy4yMy4xOC4wMy5wMTApCisgd2l0aCBFU01UUCBpZCA8MEdLNTAwQjRHRDA4ODhAY291Z2FyLm5vYy51Y2xhLmVkdT4gZm9yIGphbmdlbDFAc2ltcy1tcy1kYWVtb247CisgU3VuLCAyMyBTZXAgMjAwMSAyMDoxNDozMyAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcKKyAoaXAtMjA5LTg1LTIyMi0xMTcuZHJlYW1ob3N0LmNvbSBbMjA5Ljg1LjIyMi4xMTddKQorIGJ5IHBhbnRoZXIubm9jLnVjbGEuZWR1ICg4LjkuMWEvOC45LjEpIHdpdGggRVNNVFAgaWQgVUFBMDk3OTMgZm9yCisgPGphbmdlbDFAdWNsYS5lZHU+OyBTdW4sIDIzIFNlcCAyMDAxIDIwOjE0OjMyIC0wNzAwIChQRFQpCitSZWNlaXZlZDogZnJvbSBiYWJ5bG9uIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pIGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnCisgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgRDNCMjk1MUI3MDsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxMzo0NyAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA2MDAwMSkKKyBpZCBBNjExRjUxQjgyOyBTdW4sIDIzIFNlcCAyMDAxIDIwOjEzOjQ2IC0wNzAwIChQRFQpCitSZWNlaXZlZDogZnJvbSB0aWdlci5jYy5veHkuZWR1ICh0aWdlci5jYy5veHkuZWR1IFsxMzQuNjkuMy4xMTJdKQorIGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEFEQTczNTFCNzAgZm9yCisgPHNjckBzb2NhbC1yYXZlcy5vcmc+OyBTdW4sIDIzIFNlcCAyMDAxIDIwOjEzOjQ0IC0wNzAwIChQRFQpCitSZWNlaXZlZDogZnJvbSBlbnQgKG4xNmg4Ni5kaGNwLm94eS5lZHUgWzEzNC42OS4xNi44Nl0pCisgYnkgdGlnZXIuY2Mub3h5LmVkdSAoOC44LjgvOC44LjgpIHdpdGggU01UUCBpZCBVQUEwODEwMCBmb3IKKyA8c2NyQHNvY2FsLXJhdmVzLm9yZz47IFN1biwgMjMgU2VwIDIwMDEgMjA6MTQ6MjQgLTA3MDAgKFBEVCkKK0RhdGU6IFN1biwgMjMgU2VwIDIwMDEgMjA6MTA6NTUgLTA3MDAKK0Zyb206ICJJYW4gVC4gSGVucnkiIDxoZW5yeWlAb3h5LmVkdT4KK1N1YmplY3Q6IFtzY3JdIHllYWggZm9yIElhbnMhIQorU2VuZGVyOiBzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnCitUbzogU29DYWwgUmF2ZXMgPHNjckBzb2NhbC1yYXZlcy5vcmc+CitFcnJvcnMtdG86IHNjci1hZG1pbkBzb2NhbC1yYXZlcy5vcmcKK01lc3NhZ2UtaWQ6IDwwMDIwMDFjMTQ0YTYkODc1MmUwNjAkNTYxMDQ1ODZAb3h5LmVkdT4KK01JTUUtdmVyc2lvbjogMS4wCitYLU1haWxlcjogTWljcm9zb2Z0IE91dGxvb2sgRXhwcmVzcyA1LjUwLjQ1MjIuMTIwMAorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitQcmVjZWRlbmNlOiBidWxrCitEZWxpdmVyZWQtdG86IHNjci1wb3N0QGJhYnlsb24uc29jYWwtcmF2ZXMub3JnCitEZWxpdmVyZWQtdG86IHNjckBzb2NhbC1yYXZlcy5vcmcKK1gtQ29udmVydGVkLVRvLVBsYWluLVRleHQ6IGZyb20gbXVsdGlwYXJ0L2FsdGVybmF0aXZlIGJ5IGRlbWltZSAwLjk4ZQorWC1Db252ZXJ0ZWQtVG8tUGxhaW4tVGV4dDogQWx0ZXJuYXRpdmUgc2VjdGlvbiB1c2VkIHdhcyB0ZXh0L3BsYWluCitYLUJlZW5UaGVyZTogc2NyQHNvY2FsLXJhdmVzLm9yZworWC1NYWlsbWFuLVZlcnNpb246IDIuMWEzCitMaXN0LUhlbHA6IDxtYWlsdG86c2NyLXJlcXVlc3RAc29jYWwtcmF2ZXMub3JnP3N1YmplY3Q9aGVscD4KK0xpc3QtUG9zdDogPG1haWx0bzpzY3JAc29jYWwtcmF2ZXMub3JnPgorTGlzdC1TdWJzY3JpYmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vbGlzdGluZm8vc2NyPiwKKyA8bWFpbHRvOnNjci1yZXF1ZXN0QHNvY2FsLXJhdmVzLm9yZz9zdWJqZWN0PXN1YnNjcmliZT4KK0xpc3QtSWQ6IFNvQ2FsLVJhdmVzIDxzY3Iuc29jYWwtcmF2ZXMub3JnPgorTGlzdC1VbnN1YnNjcmliZTogPGh0dHA6Ly9zb2NhbC1yYXZlcy5vcmcvbWFpbG1hbi9saXN0aW5mby9zY3I+LAorIDxtYWlsdG86c2NyLXJlcXVlc3RAc29jYWwtcmF2ZXMub3JnP3N1YmplY3Q9dW5zdWJzY3JpYmU+CitMaXN0LUFyY2hpdmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vcHJpdmF0ZS9zY3IvPgorCitJIGFsd2F5cyBsb3ZlIHRvIGZpbmQgbW9yZSBJYW4ncyB0aGF0IGFyZSBvdmVyIDMgeWVhcnMgb2xkISEKKworSWFuCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworRm9yIGV2ZW50IGluZm8sIGxpc3QgcXVlc3Rpb25zLCBvciB0byB1bnN1YnNjcmliZSwgc2VlIGh0dHA6Ly93d3cuc29jYWwtcmF2ZXMub3JnLworCisKKworLS1Cb3VuZGFyeV8oSURfUEdTMkYyYSt6Ky9qTDdodXBLZ1JoQSktLQorCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xNy50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4NmU0MQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzE3LnR4dApAQCAtMCwwICsxLDEyIEBACitNSU1FLVZlcnNpb246IDEuMAorRnJvbTogQmFycnkgPGJhcnJ5QGRpZ2ljb29sLmNvbT4KK1RvOiBEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPgorU3ViamVjdDogSGVyZSBpcyB5b3VyIGRpbmd1cyBmaXNoCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDE5OjM1OjAyIC0wNDAwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCitIaSB0aGVyZSwKKworVGhpcyBpcyB0aGUgZGluZ3VzIGZpc2guCisKK1tOb24tdGV4dCAoaW1hZ2UvZ2lmKSBwYXJ0IG9mIG1lc3NhZ2Ugb21pdHRlZCwgZmlsZW5hbWUgZGluZ3VzZmlzaC5naWZdCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xOC50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmNDkwNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzE4LnR4dApAQCAtMCwwICsxLDYgQEAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdDogd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsKKwlzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSIKKwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTkudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmY3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18xOS50eHQKQEAgLTAsMCArMSw0MyBAQAorU2VuZCBQcHAgbWFpbGluZyBsaXN0IHN1Ym1pc3Npb25zIHRvCisJcHBwQHp6ei5vcmcKKworVG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHZpYSB0aGUgV29ybGQgV2lkZSBXZWIsIHZpc2l0CisJaHR0cDovL3d3dy56enoub3JnL21haWxtYW4vbGlzdGluZm8vcHBwCitvciwgdmlhIGVtYWlsLCBzZW5kIGEgbWVzc2FnZSB3aXRoIHN1YmplY3Qgb3IgYm9keSAnaGVscCcgdG8KKwlwcHAtcmVxdWVzdEB6enoub3JnCisKK1lvdSBjYW4gcmVhY2ggdGhlIHBlcnNvbiBtYW5hZ2luZyB0aGUgbGlzdCBhdAorCXBwcC1hZG1pbkB6enoub3JnCisKK1doZW4gcmVwbHlpbmcsIHBsZWFzZSBlZGl0IHlvdXIgU3ViamVjdCBsaW5lIHNvIGl0IGlzIG1vcmUgc3BlY2lmaWMKK3RoYW4gIlJlOiBDb250ZW50cyBvZiBQcHAgZGlnZXN0Li4uIgorCitUb2RheSdzIFRvcGljczoKKworICAgMS4gdGVzdGluZyAjMSAoQmFycnkgQS4gV2Fyc2F3KQorICAgMi4gdGVzdGluZyAjMiAoQmFycnkgQS4gV2Fyc2F3KQorICAgMy4gdGVzdGluZyAjMyAoQmFycnkgQS4gV2Fyc2F3KQorICAgNC4gdGVzdGluZyAjNCAoQmFycnkgQS4gV2Fyc2F3KQorICAgNS4gdGVzdGluZyAjNSAoQmFycnkgQS4gV2Fyc2F3KQorCitoZWxsbworCisKK2hlbGxvCisKKworaGVsbG8KKworCitoZWxsbworCisKK2hlbGxvCisKKworCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworUHBwIG1haWxpbmcgbGlzdAorUHBwQHp6ei5vcmcKK2h0dHA6Ly93d3cuenp6Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3BwcAorCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yMC50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2YTg4NwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzIwLnR4dApAQCAtMCwwICsxLDIyIEBACitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK01lc3NhZ2UtSUQ6IDwxNTA5MC42MTMwNC4xMTA5MjkuNDU2ODRAYWFhLnp6ei5vcmc+CitGcm9tOiBiYmJAZGRkLmNvbSAoSm9obiBYLiBEb2UpCitUbzogYmJiQHp6ei5vcmcKK0NjOiBjY2NAenp6Lm9yZworQ0M6IGRkZEB6enoub3JnCitjYzogZWVlQHp6ei5vcmcKK1N1YmplY3Q6IFRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UKK0RhdGU6IEZyaSwgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMAorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjEudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTkwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yMS50eHQKQEAgLTAsMCArMSwyMCBAQAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiBUZXN0CitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCitNSU1FIG1lc3NhZ2UKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitPbmUKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitUd28KKy0tQk9VTkRBUlktLQorRW5kIG9mIE1JTUUgbWVzc2FnZQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjIudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOWRlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yMi50eHQKQEAgLTAsMCArMSw0NiBAQAorTWltZS1WZXJzaW9uOiAxLjAKK01lc3NhZ2UtSWQ6IDxhMDUwMDE5MDJiN2YxYzMzNzczZTlAWzEzNC44NC4xODMuMTM4XT4KK0RhdGU6IFR1ZSwgMTYgT2N0IDIwMDEgMTM6NTk6MjUgKzAzMDAKK1RvOiBhQGV4YW1wbGUuY29tCitGcm9tOiBiQGV4YW1wbGUuY29tCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ij09PT09PT09PT09PV8tMTIwODg5MjUyMz09Xz09PT09PT09PT09PSIKKworLS09PT09PT09PT09PT1fLTEyMDg4OTI1MjM9PV89PT09PT09PT09PT0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiIDsgZm9ybWF0PSJmbG93ZWQiCisKK1RleHQgdGV4dCB0ZXh0LgorLS09PT09PT09PT09PT1fLTEyMDg4OTI1MjM9PV89PT09PT09PT09PT0KK0NvbnRlbnQtSWQ6IDxhMDUwMDE5MDJiN2YxYzMzNzczZTlAWzEzNC44NC4xODMuMTM4XS4wLjA+CitDb250ZW50LVR5cGU6IGltYWdlL2pwZWc7IG5hbWU9IndpYmJsZS5KUEciCisgOyB4LW1hYy10eXBlPSI0QTUwNDU0NyIKKyA7IHgtbWFjLWNyZWF0b3I9IjQ3NEI0RjRFIgorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IndpYmJsZS5KUEciCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIKK0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFMQ0FYQUJJRUJBUkVBCitnNmJDamp3L3BJWlNqTzZGV0ZwbGRqeVNPbUNOck83REJaaWJVWGhUd3RDaXh3K0d0QWlqVmRxeHhhUHAwYUt2bUdYYQorcXJiQlF2bXMwbUFNZVlTLzNpVFYxZEcwaEhhUk5LMDFYYmxuV3h0VmRqa0hMTUlnVHlxbms5VkI3Q3JQMkt6SUlOcGEKKzRPN0krenhZTzlXVjhqWmc3MVpsYis4ck1Ea0VpckFWUUZBVUFLQUZBQUFVQVlBVURnQURnWTZEanBSdFhqNVJ4akhBCis0d1FSajB3UUNNZENBZXdwYUtLSy85az0KKy0tPT09PT09PT09PT09Xy0xMjA4ODkyNTIzPT1fPT09PT09PT09PT09CitDb250ZW50LUlkOiA8YTA1MDAxOTAyYjdmMWMzMzc3M2U5QFsxMzQuODQuMTgzLjEzOF0uMC4xPgorQ29udGVudC1UeXBlOiBpbWFnZS9qcGVnOyBuYW1lPSJ3aWJibGUyLkpQRyIKKyA7IHgtbWFjLXR5cGU9IjRBNTA0NTQ3IgorIDsgeC1tYWMtY3JlYXRvcj0iNDc0QjRGNEUiCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0id2liYmxlMi5KUEciCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIKK0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFMQ0FYQUJKMEJBUkVBCisvOFFBSHdBQUFRVUJBUUVCQVFFQUFBQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkFBQWdFREF3SUVBd1VGQkFRQQorVzZORkpKQkVrVTEwa0tHVGNXTUR3eHVVKzBKSHZrOHFBdE9wTndxU1IwbjhjM0JsRHlYSGxxc1VsdEhFaVR2ZFhMeFIKKzd2TWlHRE5KQUpXa0FNazhaa0NGcDVHMm9vNVcrK0lOcmJRdE5mVFF4SkF1WGx1cHo5b1M0ZDVZMVcrRTJYbFdaSkpFCitZN0xXWVF4VExFMXp1TWJmQlB4dzhYMmZpYlZkSWJTYkk2bkxaeFg2MzV0OVRqdFlyZVdSN1dHS0pUTEpGRktTbG96TworMFNoeElYTTQzdUMzLzlrPQorLS09PT09PT09PT09PT1fLTEyMDg4OTI1MjM9PV89PT09PT09PT09PT0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiIDsgZm9ybWF0PSJmbG93ZWQiCisKK1RleHQgdGV4dCB0ZXh0LgorLS09PT09PT09PT09PT1fLTEyMDg4OTI1MjM9PV89PT09PT09PT09PT0tLQorCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yMy50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyZThlYwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzIzLnR4dApAQCAtMCwwICsxLDggQEAKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK0EgbWVzc2FnZSBwYXJ0CistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzI0LnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzI0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTUyMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjQudHh0CkBAIC0wLDAgKzEsMTAgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjUudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzUyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yNS50eHQKQEAgLTAsMCArMSwxMTcgQEAKK0Zyb20gTUFJTEVSLURBRU1PTiBGcmkgQXByIDA2IDE2OjQ2OjA5IDIwMDEKK1JlY2VpdmVkOiBmcm9tIFsyMDQuMjQ1LjE5OS45OF0gKGhlbG89emluZmFuZGVsLmxhY2l0YS5jb20pCisJYnkgd3d3LmxpbnV4Lm9yZy51ayB3aXRoIGVzbXRwIChFeGltIDMuMTMgIzEpCisJaWQgMTRsWVI2LTAwMDhJdi0wMAorCWZvciBsaW51eHVzZXItYWRtaW5Ad3d3LmxpbnV4Lm9yZy51azsgRnJpLCAwNiBBcHIgMjAwMSAxNjo0NjowOSArMDEwMAorUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0IChsb2NhbGhvc3QpIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIGludGVybmFsIGlkIEpBQjAzMjI1OyBGcmksIDYgQXByIDIwMDEgMDk6MjM6MDYgLTA4MDAgKEdNVC0wODAwKQorRGF0ZTogRnJpLCA2IEFwciAyMDAxIDA5OjIzOjA2IC0wODAwIChHTVQtMDgwMCkKK0Zyb206IE1haWwgRGVsaXZlcnkgU3Vic3lzdGVtIDxNQUlMRVItREFFTU9OQHppbmZhbmRlbC5sYWNpdGEuY29tPgorU3ViamVjdDogUmV0dXJuZWQgbWFpbDogVG9vIG1hbnkgaG9wcyAxOSAoMTcgbWF4KTogZnJvbSA8bGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWs+IHZpYSBbMTk5LjE2NC4yMzUuMjI2XSwgdG8gPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT4KK01lc3NhZ2UtSWQ6IDwyMDAxMDQwNjE3MjMuSkFCMDMyMjVAemluZmFuZGVsLmxhY2l0YS5jb20+CitUbzogPGxpbnV4dXNlci1hZG1pbkB3d3cubGludXgub3JnLnVrPgorVG86IHBvc3RtYXN0ZXJAemluZmFuZGVsLmxhY2l0YS5jb20KK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9yZXBvcnQ7IHJlcG9ydC10eXBlPWRlbGl2ZXJ5LXN0YXR1czsKKwlibworQXV0by1TdWJtaXR0ZWQ6IGF1dG8tZ2VuZXJhdGVkIChmYWlsdXJlKQorCitUaGlzIGlzIGEgTUlNRS1lbmNhcHN1bGF0ZWQgbWVzc2FnZQorCistLUpBQjAzMjI1Ljk4NjU3Nzc4Ni96aW5mYW5kZWwubGFjaXRhLmNvbQorCitUaGUgb3JpZ2luYWwgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgYXQgRnJpLCA2IEFwciAyMDAxIDA5OjIzOjAzIC0wODAwIChHTVQtMDgwMCkKK2Zyb20gWzE5OS4xNjQuMjM1LjIyNl0KKworICAgLS0tLS0gVGhlIGZvbGxvd2luZyBhZGRyZXNzZXMgaGF2ZSBkZWxpdmVyeSBub3RpZmljYXRpb25zIC0tLS0tCis8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPiAgKHVucmVjb3ZlcmFibGUgZXJyb3IpCisKKyAgIC0tLS0tIFRyYW5zY3JpcHQgb2Ygc2Vzc2lvbiBmb2xsb3dzIC0tLS0tCis1NTQgVG9vIG1hbnkgaG9wcyAxOSAoMTcgbWF4KTogZnJvbSA8bGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWs+IHZpYSBbMTk5LjE2NC4yMzUuMjI2XSwgdG8gPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT4KKworLS1KQUIwMzIyNS45ODY1Nzc3ODYvemluZmFuZGVsLmxhY2l0YS5jb20KK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKKworUmVwb3J0aW5nLU1UQTogZG5zOyB6aW5mYW5kZWwubGFjaXRhLmNvbQorUmVjZWl2ZWQtRnJvbS1NVEE6IGRuczsgWzE5OS4xNjQuMjM1LjIyNl0KK0Fycml2YWwtRGF0ZTogRnJpLCA2IEFwciAyMDAxIDA5OjIzOjAzIC0wODAwIChHTVQtMDgwMCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbQorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS40LjYKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDYgQXByIDIwMDEgMDk6MjM6MDYgLTA4MDAgKEdNVC0wODAwKQorCistLUpBQjAzMjI1Ljk4NjU3Nzc4Ni96aW5mYW5kZWwubGFjaXRhLmNvbQorQ29udGVudC1UeXBlOiB0ZXh0L3JmYzgyMi1oZWFkZXJzCisKK1JldHVybi1QYXRoOiBsaW51eHVzZXItYWRtaW5Ad3d3LmxpbnV4Lm9yZy51aworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjI1IGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjIzOjAzIC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzIyMSBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToyMjoxOCAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoWzIwNC4yNDUuMTk5Ljk4XSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBuczEud2VsbHBhcnRuZXIubmV0IChbMTk5LjE2NC4yMzUuMjI2XSkgYnkgemluZmFuZGVsLmxhY2l0YS5jb20gKDguNy4zLzguNi4xMC1NVDQuMDApIHdpdGggRVNNVFAgaWQgSkFBMDMyMTcgZm9yIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+OyBGcmksIDYgQXByIDIwMDEgMDk6MjE6MzcgLTA4MDAgKEdNVC0wODAwKQorUmVjZWl2ZWQ6IGZyb20gemluZmFuZGVsLmxhY2l0YS5jb20gKFsyMDQuMjQ1LjE5OS45OF0pCisJYnkKKwlmbworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjEzIGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjIwOjU2IC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzIwOSBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToyMDoxNSAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoWzIwNC4yNDUuMTk5Ljk4XSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBuczEud2VsbHBhcnRuZXIubmV0IChbMTk5LjE2NC4yMzUuMjI2XSkgYnkgemluZmFuZGVsLmxhY2l0YS5jb20gKDguNy4zLzguNi4xMC1NVDQuMDApIHdpdGggRVNNVFAgaWQgSkFBMDMyMDUgZm9yIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+OyBGcmksIDYgQXByIDIwMDEgMDk6MTk6MzMgLTA4MDAgKEdNVC0wODAwKQorUmVjZWl2ZWQ6IGZyb20gemluZmFuZGVsLmxhY2l0YS5jb20gKFsyMDQuMjQ1LjE5OS45OF0pCisJYnkKKwlmbworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjAxIGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjE4OjUyIC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzE5NyBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToxNzo1NCAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB3d3cubGludXgub3JnLnVrIChwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWsgWzE5NS45Mi4yNDkuMjUyXSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBsb2NhbGhvc3QubG9jYWxkb21haW4KKwkoWworCWJ5CisJaWQKK1JlY2VpdmVkOiBmcm9tIFsyMTIuMS4xMzAuMTFdIChoZWxvPXMxLnVrbGludXgubmV0IGlkZW50PXJvb3QpCisJYnkKKwlpZAorCWZvCitSZWNlaXZlZDogZnJvbSBzZXJ2ZXIgKHBwcC0yLTIyLmN2eDQudGVsaW5jby5uZXQgWzIxMi4xLjE0OS4yMl0pCisJYnkKKwlmbworRnJvbTogRGFuaWVsIEphbWVzIDxkYW5pZWxAbGludXh1c2VyLmNvLnVrPgorT3JnYW5pemF0aW9uOiBMaW51eFVzZXIKK1RvOiBsaW51eHVzZXJAd3d3LmxpbnV4Lm9yZy51aworWC1NYWlsZXI6IEtNYWlsIFt2ZXJzaW9uIDEuMS45OV0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsKKyAgYworTUlNRS1WZXJzaW9uOiAxLjAKK01lc3NhZ2UtSWQ6IDwwMTA0MDYxNjAzMzkwMy4wMDk2MkBzZXJ2ZXI+CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitTdWJqZWN0OiBbTGludXhVc2VyXSBidWxsZXRpbiBuby4gNDUKK1NlbmRlcjogbGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWsKK0Vycm9ycy1UbzogbGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWsKK1gtQmVlblRoZXJlOiBsaW51eHVzZXJAd3d3LmxpbnV4Lm9yZy51aworWC1NYWlsbWFuLVZlcnNpb246IDIuMC4zCitQcmVjZWRlbmNlOiBidWxrCitMaXN0LUhlbHA6IDxtYWlsdG86bGludXh1c2VyLXJlcXVlc3RAd3d3LmxpbnV4Lm9yZy51az9zdWJqZWN0PWhlbHA+CitMaXN0LVBvc3Q6IDxtYWlsdG86bGludXh1c2VyQHd3dy5saW51eC5vcmcudWs+CitMaXN0LVN1YnNjcmliZTogPGh0dHA6Ly93d3cubGludXgub3JnLnVrL21haWxtYW4vbGlzdGluZm8vbGludXh1c2VyPiwKKwk8bQorTGlzdC1JZDogYnVsbGV0aW5zIGZyb20gTGludXhVc2VyIG1hZ2F6aW5lIDxsaW51eHVzZXIud3d3LmxpbnV4Lm9yZy51az4KK0xpc3QtVW5zdWJzY3JpYmU6IDxodHRwOi8vd3d3LmxpbnV4Lm9yZy51ay9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4dXNlcj4sCisJPG0KK0xpc3QtQXJjaGl2ZTogPGh0dHA6Ly93d3cubGludXgub3JnLnVrL3BpcGVybWFpbC9saW51eHVzZXIvPgorRGF0ZTogRnJpLCA2IEFwciAyMDAxIDE2OjAzOjM5ICswMTAwCisKKy0tSkFCMDMyMjUuOTg2NTc3Nzg2L3ppbmZhbmRlbC5sYWNpdGEuY29tLS0KKworCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yNi50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3MWJjZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzI2LnR4dApAQCAtMCwwICsxLDQ1IEBACitSZWNlaXZlZDogZnJvbSB4Y2FyIFsxOTIuMTY4LjAuMl0gYnkgamVldmVzLndvb3N0ZXIubG9jYWwNCisgIChTTVRQRDMyLTcuMDcgRVZBTCkgaWQgQUZGOTJGMDIxNDsgU3VuLCAxMiBNYXkgMjAwMiAwODo1NTozNyArMDEwMA0KK0RhdGU6IFN1biwgMTIgTWF5IDIwMDIgMDg6NTY6MTUgKzAxMDANCitGcm9tOiBGYXRoZXIgVGltZSA8ZmF0aGVyLnRpbWVAeGNhci53b29zdGVyLmxvY2FsPg0KK1RvOiB0aW1ib0BqZWV2ZXMud29vc3Rlci5sb2NhbA0KK1N1YmplY3Q6IElNQVAgZmlsZSB0ZXN0DQorTWVzc2FnZS1JRDogPDZkZjY1ZDM1NGIuZmF0aGVyLnRpbWVAcnBjLndvb3N0ZXIubG9jYWw+DQorWC1Pcmdhbml6YXRpb246IEhvbWUNCitVc2VyLUFnZW50OiBNZXNzZW5nZXItUHJvLzIuNTBhIChNc2dTZXJ2ZS8xLjUwKSAoUklTQy1PUy80LjAyKSBQT1BzdGFyLzIuMDMNCitNSU1FLVZlcnNpb246IDEuMA0KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iMTYxODQ5Mjg2MC0tMjA1MTMwMTE5MC0tMTEzODUzNjgwIg0KK1N0YXR1czogUg0KK1gtVUlETDogMzE5OTk4MzAyDQorDQorVGhpcyBtZXNzYWdlIGlzIGluIE1JTUUgZm9ybWF0IHdoaWNoIHlvdXIgbWFpbGVyIGFwcGFyZW50bHkgZG9lcyBub3Qgc3VwcG9ydC4NCitZb3UgZWl0aGVyIHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIHlvdXIgc29mdHdhcmUgd2hpY2ggc3VwcG9ydHMgTUlNRSwgb3INCithIHNlcGFyYXRlIE1JTUUgZGVjb2RpbmcgdXRpbGl0eS4gIEFsdGVybmF0aXZlbHksIGFzayB0aGUgc2VuZGVyIG9mIHRoaXMNCittZXNzYWdlIHRvIHJlc2VuZCBpdCBpbiBhIGRpZmZlcmVudCBmb3JtYXQuDQorDQorLS0xNjE4NDkyODYwLS0yMDUxMzAxMTkwLS0xMTM4NTM2ODANCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkNCisNCitTaW1wbGUgZW1haWwgd2l0aCBhdHRhY2htZW50Lg0KKw0KKw0KKy0tMTYxODQ5Mjg2MC0tMjA1MTMwMTE5MC0tMTEzODUzNjgwDQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9yaXNjb3M7IG5hbWU9ImNsb2NrLmJtcCw2OWMiOyB0eXBlPUJNUDsgbG9hZD0mZmZmNjljNGI7IGV4ZWM9JjM1NWRkNGQxOyBhY2Nlc3M9JjAzDQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ImNsb2NrLmJtcCINCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQNCisNCitRazEyQWdBQUFBQUFBSFlBQUFBb0FBQUFJQUFBQUNBQUFBQUJBQVFBQUFBQUFBQUFBQURYRFFBQTF3MEFBQUFBQUFBQQ0KK0FBQUFBQUFBQUFBQWlBQUFpQUFBQUlpSUFJZ0FBQUNJQUlnQWlJZ0FBTHU3dXdDSWlJZ0FFUkhkQUNMdUlnQXovLzhBDQorekFBQUFOMFIzUUR1N2lJQS8vLy9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWkzQUFBQUFBQUFBRGVBQUFBQUFBQUENCitDM0FETXpNek1BTndBQUFBQUFBQUFBQUhNQUFBQUFOd0FBQUFBQUFBQUFDQU1BZDN6UGZ3QXdnQUFBQUFBQUFJQXdkLw0KK2Y4eC9mM0F3Z0FBQUFBQUFnREIweC9mMy8velBBd2dBQUFBQUFBY0hmTTkvLy8vOHovQXdBQUFBQUFpd2QvZjMvLy8vDQorLy8vL0E0QUFBQUFBY0V4L2YvLy8vLy8vekFNQUFBQUFpd2ZNOS8vLy8zLy8vOHp3T0FBQUFBY0hmMy8vLy9CLy8vLy8NCis4REFBQUFBTEIvZjMvLy93ZDNkMy8vQXdBQUFBQndUUGYvL3dDUUFBRC96QU1BQUFBQXNFeC9mLy8vQi8vLy84d0RBQQ0KK0FBQUhCMzkvLy8vd2YvLy8vL0F3QUFBQUN3ZjM5Ly8vOEgvLy8vL3dNQUFBQUljSGZNOS8vL0IvLy8vTThEZ0FBQUFBDQorc0hUSC8vL3dmLy8veEFNQUFBQUFDSEIzZjMvLzhILy8vL2NEZ0FBQUFBQUxCM3pILy9ELy9NOXdNQUFBQUFBQWdMQjANCit6MzkvLy94SEF3Z0FBQUFBQUFnTEIzZDNSSGQzY0RDQUFBQUFBQUFBZ0xBSGQwUjNjQU1JQUFBQUFBQUFnQWdMY0FBQQ0KK0FBTXdnQWdBQUFBQUNEQUFBQXU3dDdjd0FBZ0RnQUFBQUFCemNJQUFBQUFBQUFnRE13QUFBQUFBTjd1d2dBQUFBQWdIDQorTXpNQUFBQUFDSDk3dHpBQUFBQUx1M2MzZ0FBQUFBQUwrN3R6REFCQXU3ZjdjQUFBQUFBQUNBKzNNQTdFUUF2L3NJQUENCitBQUFBQUFBSUFBQUFBQUFBQUlBQUFBQUENCisNCistLTE2MTg0OTI4NjAtLTIwNTEzMDExOTAtLTExMzg1MzY4MC0tDQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjcudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTkxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yNy50eHQKQEAgLTAsMCArMSwxNSBAQAorUmV0dXJuLVBhdGg6IDxhcGVyc29uQGRvbS5haW4+CitSZWNlaXZlZDogYnkgbWFpbC5kb20uYWluIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA4ODkpCisJaWQgQjlEMEFEMzVEQjsgVHVlLCAgNCBKdW4gMjAwMiAyMTo0Njo1OSAtMDQwMCAoRURUKQorTWVzc2FnZS1JRDogPDE1NjEzLjI4MDUxLjcwNzEyNi41Njk2OTNAZG9tLmFpbj4KK0RhdGU6IFR1ZSwgNCBKdW4gMjAwMiAyMTo0Njo1OSAtMDQwMAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorU3ViamVjdDogYnVnIGRlbW9uc3RyYXRpb24KKwkxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorCW1vcmUgdGV4dAorRnJvbTogYXBlcnNvbkBkb20uYWluIChBbm5lIFAuIEVyc29uKQorVG86IGJwZXJzb25AZG9tLmFpbiAoQmFybmV5IFAuIEVyc29uKQorCit0ZXN0CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yOC50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0ODI0YwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzI4LnR4dApAQCAtMCwwICsxLDI1IEBACitGcm9tOiBhcGVyc29uQGRvbS5haW4KK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PUJPVU5EQVJZCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitUbzogYWFAYmIub3JnCitGcm9tOiBjY0BkZC5vcmcKK1N1YmplY3Q6IGVlCisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorVG86IGFhQGJiLm9yZworRnJvbTogY2NAZGQub3JnCitTdWJqZWN0OiBlZQorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yOS50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18yOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhYjU2MQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzI5LnR4dApAQCAtMCwwICsxLDIyIEBACitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWk7CisgICAgIHRpdGxlKjAqPSJ1cy1hc2NpaSdlbidUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CisgICAgIHRpdGxlKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworICAgICB0aXRsZSoyPSJpc24ndCBpdCEiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKKworCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzMwLnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzMwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM0YmI2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzAudHh0CkBAIC0wLDAgKzEsMjMgQEAKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdDsgYm91bmRhcnk9Qk9VTkRBUlkKKworLS1CT1VOREFSWQorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK1RvOiBhYUBiYi5vcmcKK0Zyb206IGNjQGRkLm9yZworU3ViamVjdDogZWUKKworbWVzc2FnZSAxCisKKy0tQk9VTkRBUlkKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitUbzogYWFAYmIub3JnCitGcm9tOiBjY0BkZC5vcmcKK1N1YmplY3Q6IGVlCisKK21lc3NhZ2UgMgorCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzMxLnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzMxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTU4ZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzEudHh0CkBAIC0wLDAgKzEsMTUgQEAKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1CT1VOREFSWV8KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzIudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWM1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zMi50eHQKQEAgLTAsMCArMSwxNCBAQAorRGVsaXZlcmVkLVRvOiBmcmVlYnNkLWlzcEBmcmVlYnNkLm9yZworRGF0ZTogVHVlLCAyNiBTZXAgMjAwMCAxMjoyMzowMyAtMDUwMAorRnJvbTogQW5uZSBQZXJzb24gPGFwZXJzb25AZXhhbXBsZS5jb20+CitUbzogQmFybmV5IER1ZGUgPGJkdWRlQGV4YW1wbGUuY29tPgorU3ViamVjdDogUmU6IExpbWl0aW5nIFBlcmwgQ1BVIFV0aWxpemF0aW9uLi4uCitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0Kj1hbnNpLXgzLjQtMTk2OCcndXMtYXNjaWkKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZQorVXNlci1BZ2VudDogTXV0dC8xLjMuOGkKK1NlbmRlcjogb3duZXItZnJlZWJzZC1pc3BARnJlZUJTRC5PUkcKK1ByZWNlZGVuY2U6IGJ1bGsKK1gtTG9vcDogRnJlZUJTRC5vcmcKKworU29tZSBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzMudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Mjc4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zMy50eHQKQEAgLTAsMCArMSwyOSBAQAorRGVsaXZlcmVkLVRvOiBmcmVlYnNkLWlzcEBmcmVlYnNkLm9yZworRGF0ZTogV2VkLCAyNyBTZXAgMjAwMCAxMToxMTowOSAtMDUwMAorRnJvbTogQW5uZSBQZXJzb24gPGFwZXJzb25AZXhhbXBsZS5jb20+CitUbzogQmFybmV5IER1ZGUgPGJkdWRlQGV4YW1wbGUuY29tPgorU3ViamVjdDogUmU6IExpbWl0aW5nIFBlcmwgQ1BVIFV0aWxpemF0aW9uLi4uCitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvc2lnbmVkOyBtaWNhbGcqPWFuc2kteDMuNC0xOTY4JydwZ3AtbWQ1OworCXByb3RvY29sKj1hbnNpLXgzLjQtMTk2OCcnYXBwbGljYXRpb24lMkZwZ3Atc2lnbmF0dXJlOworCWJvdW5kYXJ5Kj0iYW5zaS14My40LTE5NjgnJ0VlUWZHd1BjUVNPSkJhUVUiCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKK1NlbmRlcjogb3duZXItZnJlZWJzZC1pc3BARnJlZUJTRC5PUkcKK1ByZWNlZGVuY2U6IGJ1bGsKK1gtTG9vcDogRnJlZUJTRC5vcmcKKworCistLUVlUWZHd1BjUVNPSkJhUVUKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldCo9YW5zaS14My40LTE5NjgnJ3VzLWFzY2lpCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUKKworcGFydCAxCisKKy0tRWVRZkd3UGNRU09KQmFRVQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKKworcGFydCAyCisKKy0tRWVRZkd3UGNRU09KQmFRVS0tCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zNC50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1ZGZlYQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzM0LnR4dApAQCAtMCwwICsxLDE5IEBACitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdDsgYm91bmRhcnk9WFlaCisKKy0tWFlaCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworCitUaGlzIGlzIGEgdGV4dCBwbGFpbiBwYXJ0IHRoYXQgaXMgY291bnRlciB0byByZWNvbW1lbmRlZCBwcmFjdGljZSBpbgorUkZDIDIwNDYsICQ1LjEuNSwgYnV0IGlzIG5vdCBpbGxlZ2FsCisKKy0tWFlaCisKK0Zyb206IGNwZXJzb25AZG9tLmFpbgorVG86IGRwZXJzb25AZG9tLmFpbgorCitBIHN1Ym1lc3NhZ2UKKworLS1YWVotLQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzUudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlN2Q1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zNS50eHQKQEAgLTAsMCArMSw0IEBACitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IGhlcmUncyBzb21ldGhpbmcgaW50ZXJlc3RpbmcKK2NvdW50ZXIgdG8gUkZDIDI4MjIsIHRoZXJlJ3Mgbm8gc2VwYXJhdGluZyBuZXdsaW5lIGhlcmUKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzM2LnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzM2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMyYzMwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzYudHh0CkBAIC0wLDAgKzEsNDAgQEAKK01pbWUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IE11bHRpcGFydC9NaXhlZDsgQm91bmRhcnk9Ik5leHRQYXJ0IgorVG86IElFVEYtQW5ub3VuY2U6OworRnJvbTogSW50ZXJuZXQtRHJhZnRzQGlldGYub3JnCitTdWJqZWN0OiBJLUQgQUNUSU9OOmRyYWZ0LWlldGYtbWJvbmVkLW1peC0wMC50eHQKK0RhdGU6IFR1ZSwgMjIgRGVjIDE5OTggMTY6NTU6MDYgLTA1MDAKKworLS1OZXh0UGFydAorCitCbGFoIGJsYWggYmxhaAorCistLU5leHRQYXJ0CitDb250ZW50LVR5cGU6IE11bHRpcGFydC9BbHRlcm5hdGl2ZTsgQm91bmRhcnk9Ik90aGVyQWNjZXNzIgorCistLU90aGVyQWNjZXNzCitDb250ZW50LVR5cGU6IE1lc3NhZ2UvRXh0ZXJuYWwtYm9keTsKKwlhY2Nlc3MtdHlwZT0ibWFpbC1zZXJ2ZXIiOworCXNlcnZlcj0ibWFpbHNlcnZAaWV0Zi5vcmciCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1JRDogPDE5OTgxMjIyMTUxNDA2LkktREBpZXRmLm9yZz4KKworRU5DT0RJTkcgbWltZQorRklMRSAvaW50ZXJuZXQtZHJhZnRzL2RyYWZ0LWlldGYtbWJvbmVkLW1peC0wMC50eHQKKworLS1PdGhlckFjY2VzcworQ29udGVudC1UeXBlOiBNZXNzYWdlL0V4dGVybmFsLWJvZHk7CisJbmFtZT0iZHJhZnQtaWV0Zi1tYm9uZWQtbWl4LTAwLnR4dCI7CisJc2l0ZT0iZnRwLmlldGYub3JnIjsKKwlhY2Nlc3MtdHlwZT0iYW5vbi1mdHAiOworCWRpcmVjdG9yeT0iaW50ZXJuZXQtZHJhZnRzIgorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0NvbnRlbnQtSUQ6IDwxOTk4MTIyMjE1MTQwNi5JLURAaWV0Zi5vcmc+CisKKworLS1PdGhlckFjY2Vzcy0tCisKKy0tTmV4dFBhcnQtLQorCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zNy50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZDM0YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzM3LnR4dApAQCAtMCwwICsxLDIyIEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9QUJDREUKKworLS1BQkNERQorQ29udGVudC1UeXBlOiB0ZXh0L3gtb25lCisKK0JsYWgKKworLS1BQkNERQorLS1BQkNERQorQ29udGVudC1UeXBlOiB0ZXh0L3gtdHdvCisKK0JsYWgKKworLS1BQkNERQorLS1BQkNERQorLS1BQkNERQorLS1BQkNERQorQ29udGVudC1UeXBlOiB0ZXh0L3gtdHdvCisKK0JsYWgKKworLS1BQkNERS0tCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zOC50eHQgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2ZGY4MQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzM4LnR4dApAQCAtMCwwICsxLDEwMSBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMCIKKworLS0tLS0tLSA9X2FhYWFhYWFhYWEwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTEiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xQGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMiIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjJAZXhhbXBsZS5jb20+CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4zQGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogdmVyeSB0cmlja3kKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworCitVbmxpa2UgdGhlIHRlc3QgdGVzdF9uZXN0ZWQtbXVsdGlwbGVzLXdpdGgtaW50ZXJuYWwtYm91bmRhcnksIHRoaXMKK3BpZWNlIG9mIHRleHQgbm90IG9ubHkgY29udGFpbnMgdGhlIG91dGVyIGJvdW5kYXJ5IHRhZ3MgCistLS0tLS0tID1fYWFhYWFhYWFhYTEgCithbmQgCistLS0tLS0tID1fYWFhYWFhYWFhYTAgCitidXQgcHV0cyB0aGVtIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUhIEFuZCwgdG8gYmUgZXZlbiBuYXN0aWVyLCBpdAorZXZlbiBpbmNsdWRlcyBhIGNvdXBsZSBvZiBlbmQgdGFncywgc3VjaCBhcyB0aGlzIG9uZToKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExLS0KKworYW5kIHRoaXMgb25lLCB3aGljaCBpcyBmcm9tIGEgbXVsdGlwYXJ0IHdlIGhhdmVuJ3QgZXZlbiBzZWVuIHlldCEKKworLS0tLS0tLSA9X2FhYWFhYWFhYWE0LS0KKworVGhpcyB3aWxsLCBJJ20gc3VyZSwgY2F1c2UgbXVjaCBicmVha2FnZSBvZiBNSU1FIHBhcnNlcnMuIEJ1dCwgYXMgCitmYXIgYXMgSSBjYW4gdGVsbCwgaXQncyBwZXJmZWN0bHkgbGVnYWwuIEkgaGF2ZSBub3QgeWV0IGV2ZXIgc2VlbgorYSBjYXNlIG9mIHRoaXMgaW4gdGhlIHdpbGQsIGJ1dCBJJ3ZlIHNlZW4gKnNpbWlsYXIqIHRoaW5ncy4KKworCistLS0tLS0tID1fYWFhYWFhYWFhYTIKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS40QGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2gyCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMi0tCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSItLS0tLSA9X2FhYWFhYWFhYWEzIgorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuNkBleGFtcGxlLmNvbT4KKworLS0tLS0tLSA9X2FhYWFhYWFhYWEzCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuN0BleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoMworQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTMKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS44QGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2g0CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMy0tCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSItLS0tLSA9X2FhYWFhYWFhYWE0IgorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuMTBAZXhhbXBsZS5jb20+CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhNAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjExQGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2g1CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhNAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjEyQGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2g2CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhNC0tCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMS0tCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjE1QGV4YW1wbGUuY29tPgorCistLQorSXQncyBuZXZlciB0b28gbGF0ZSB0byBoYXZlIGEgaGFwcHkgY2hpbGRob29kLgorCistLS0tLS0tID1fYWFhYWFhYWFhYTAtLQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzkudHh0IGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNGIyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC9kYXRhL21zZ18zOS50eHQKQEAgLTAsMCArMSw4MyBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMCIKKworLS0tLS0tLSA9X2FhYWFhYWFhYWEwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTEiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xQGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMSIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjJAZXhhbXBsZS5jb20+CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjNAZXhhbXBsZS5jb20+CitDb250ZW50LURlc2NyaXB0aW9uOiBwYXRjaDEKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitYWFgKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuNEBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoMgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTEtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMSIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjZAZXhhbXBsZS5jb20+CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjdAZXhhbXBsZS5jb20+CitDb250ZW50LURlc2NyaXB0aW9uOiBwYXRjaDMKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitYWFgKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuOEBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoNAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTEtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMSIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjEwQGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xMUBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoNQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xMkBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoNgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTEtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTEtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xNUBleGFtcGxlLmNvbT4KKworLS0KK0l0J3MgbmV2ZXIgdG9vIGxhdGUgdG8gaGF2ZSBhIGhhcHB5IGNoaWxkaG9vZC4KKworLS0tLS0tLSA9X2FhYWFhYWFhYWEwLS0KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQwLnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDM1ZmExCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDAudHh0CkBAIC0wLDAgKzEsMTAgQEAKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgYm91bmRhcnk9Ii0tOTYxMjg0MjM2NTUyNTIyMjY5IgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5CitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdCaXQKKworPGh0bWw+PC9odG1sPgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5LS0KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQxLnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNkZDFjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDEudHh0CkBAIC0wLDAgKzEsOCBAQAorRnJvbTogIkFsbGlzb24gRHVubGFwIiA8eHh4QGV4YW1wbGUuY29tPgorVG86IHl5eUBleGFtcGxlLmNvbQorU3ViamVjdDogNjQ0MjMKK0RhdGU6IFN1biwgMTEgSnVsIDIwMDQgMTY6MDk6MjcgLTAzMDAKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKKworQmxhaCBibGFoIGJsYWgKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQyLnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzVmOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDIudHh0CkBAIC0wLDAgKzEsMjAgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQUFBIgorRnJvbTogTWFpbCBEZWxpdmVyeSBTdWJzeXN0ZW0gPHh4eEBleGFtcGxlLmNvbT4KK1RvOiB5eXlAZXhhbXBsZS5jb20KKworVGhpcyBpcyBhIE1JTUUtZW5jYXBzdWxhdGVkIG1lc3NhZ2UKKworLS1BQUEKKworU3R1ZmYKKworLS1BQUEKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKKworRnJvbTogd2VibWFzdGVyQHB5dGhvbi5vcmcKK1RvOiB6enpAZXhhbXBsZS5jb20KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQkJCIgorCistLUJCQi0tCisKKy0tQUFBLS0KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQzLnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTdkMTJjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDMudHh0CkBAIC0wLDAgKzEsMjE3IEBACitGcm9tIFNSUzA9YU8vcD1PTj1iYWcucHl0aG9uLm9yZz1Ob25lQGJvdW5jZTIucG9ib3guY29tICBGcmkgTm92IDI2IDIxOjQwOjM2IDIwMDQKK1gtVk0tdjUtRGF0YTogKFtuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0KKwlbbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsICJNQUlMRVIgREFFTU9OIDw+IiAiTUFJTEVSIERBRU1PTiA8PiIgbmlsIG5pbCAiQmFubmVkIGZpbGU6IGF1dG9fX21haWwucHl0aG9uLmJhdCBpbiBtYWlsIGZyb20geW91IiAiXkZyb206IiBuaWwgbmlsIG5pbCBuaWwgIkJhbm5lZCBmaWxlOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQgaW4gbWFpbCBmcm9tIHlvdSIgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXQorCW5pbCkKK01JTUUtVmVyc2lvbjogMS4wCitNZXNzYWdlLUlkOiA8ZWRhYi43ODA0ZjVjYjgwNzBAcHl0aG9uLm9yZz4KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3JlcG9ydDsgcmVwb3J0LXR5cGU9ZGVsaXZlcnktc3RhdHVzOworICAgIGNoYXJzZXQ9dXRmLTg7CisgICAgYm91bmRhcnk9Ii0tLS0tLS0tLS09XzExMDE1MjY5MDQtMTk1Ni01IgorWC1WaXJ1cy1TY2FubmVkOiBieSBYUzRBTEwgVmlydXMgU2Nhbm5lcgorWC1VSURMOiA0XEchISE8YyIhVVZbIiFNN0MhIQorRnJvbTogTUFJTEVSIERBRU1PTiA8PgorVG86IDx3ZWJtYXN0ZXJAcHl0aG9uLm9yZz4KK1N1YmplY3Q6IEJhbm5lZCBmaWxlOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQgaW4gbWFpbCBmcm9tIHlvdQorRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0Li4uCisKKy0tLS0tLS0tLS0tLT1fMTEwMTUyNjkwNC0xOTU2LTUKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXRmLTgiCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworQkFOTkVEIEZJTEVOQU1FIEFMRVJUCisKK1lvdXIgbWVzc2FnZSB0bzogeHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHhAZG90LmNhLmdvdiwgeHh4QGRvdC5jYS5nb3YsIHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292Cit3YXMgYmxvY2tlZCBieSBvdXIgU3BhbSBGaXJld2FsbC4gVGhlIGVtYWlsIHlvdSBzZW50IHdpdGggdGhlIGZvbGxvd2luZyBzdWJqZWN0IGhhcyBOT1QgQkVFTiBERUxJVkVSRUQ6CisKK1N1YmplY3Q6IERlbGl2ZXJ5X2ZhaWx1cmVfbm90aWNlCisKK0FuIGF0dGFjaG1lbnQgaW4gdGhhdCBtYWlsIHdhcyBvZiBhIGZpbGUgdHlwZSB0aGF0IHRoZSBTcGFtIEZpcmV3YWxsIGlzIHNldCB0byBibG9jay4KKworCisKKy0tLS0tLS0tLS0tLT1fMTEwMTUyNjkwNC0xOTU2LTUKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorQ29udGVudC1EZXNjcmlwdGlvbjogRGVsaXZlcnkgZXJyb3IgcmVwb3J0CisKK1JlcG9ydGluZy1NVEE6IGRuczsgc2Fjc3BhbTAxLmRvdC5jYS5nb3YKK1JlY2VpdmVkLUZyb20tTVRBOiBzbXRwOyBzYWNzcGFtMDEuZG90LmNhLmdvdiAoWzEyNy4wLjAuMV0pCitBcnJpdmFsLURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKKy0tLS0tLS0tLS0tLT1fMTEwMTUyNjkwNC0xOTU2LTUKK0NvbnRlbnQtVHlwZTogdGV4dC9yZmM4MjItaGVhZGVycworQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitDb250ZW50LURlc2NyaXB0aW9uOiBVbmRlbGl2ZXJlZC1tZXNzYWdlIGhlYWRlcnMKKworUmVjZWl2ZWQ6IGZyb20ga2dzYXYub3JnIChwcHAtNzAtMjQyLTE2Mi02My5kc2wuc3BmZG1vLnN3YmVsbC5uZXQgWzcwLjI0Mi4xNjIuNjNdKQorCWJ5IHNhY3NwYW0wMS5kb3QuY2EuZ292IChTcGFtIEZpcmV3YWxsKSB3aXRoIFNNVFAKKwlpZCBBMjMyQUQwM0RFM0E7IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6MzUgLTA4MDAgKFBTVCkKK0Zyb206IHdlYm1hc3RlckBweXRob24ub3JnCitUbzogeHh4eHhAZG90LmNhLmdvdgorRGF0ZTogU2F0LCAyNyBOb3YgMjAwNCAwMzozNTozMCBVVEMKK1N1YmplY3Q6IERlbGl2ZXJ5X2ZhaWx1cmVfbm90aWNlCitJbXBvcnRhbmNlOiBOb3JtYWwKK1gtUHJpb3JpdHk6IDMgKE5vcm1hbCkKK1gtTVNNYWlsLVByaW9yaXR5OiBOb3JtYWwKK01lc3NhZ2UtSUQ6IDxlZGFiLjc4MDRmNWNiODA3MEBweXRob24ub3JnPgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iPT09PTY3YmQyYjdhNS5mOTlmNyIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworLS0tLS0tLS0tLS0tPV8xMTAxNTI2OTA0LTE5NTYtNS0tCisKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQ0LnR4dCBiL0xpYi9lbWFpbC90ZXN0L2RhdGEvbXNnXzQ0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQ2MmE2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDQudHh0CkBAIC0wLDAgKzEsMzUgQEAKK1JldHVybi1QYXRoOiA8YmFycnlAcHl0aG9uLm9yZz4KK0RlbGl2ZXJlZC1UbzogYmFycnlAcHl0aG9uLm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwucHl0aG9uLm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIEMyQkYwRDM3QzY7IFR1ZSwgMTEgU2VwIDIwMDEgMDA6MDU6MDUgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Img5MFZJSUlLbXgiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUyNjEuMzYyMDkuMzU4ODQ2LjExODY3NEBhbnRoZW0ucHl0aG9uLm9yZz4KK0Zyb206IGJhcnJ5QHB5dGhvbi5vcmcgKEJhcnJ5IEEuIFdhcnNhdykKK1RvOiBiYXJyeUBweXRob24ub3JnCitTdWJqZWN0OiBhIHNpbXBsZSBtdWx0aXBhcnQKK0RhdGU6IFR1ZSwgMTEgU2VwIDIwMDEgMDA6MDU6MDUgLTA0MDAKK1gtTWFpbGVyOiBWTSA2Ljk1IHVuZGVyIDIxLjQgKHBhdGNoIDQpICJBcnRpZmljaWFsIEludGVsbGlnZW5jZSIgWEVtYWNzIEx1Y2lkCitYLUF0dHJpYnV0aW9uOiBCQVcKK1gtT2JsaXF1ZS1TdHJhdGVneTogTWFrZSBhIGRvb3IgaW50byBhIHdpbmRvdworCisKKy0taDkwVklJSUtteAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IG5hbWU9Im1zZy50eHQiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2Egc2ltcGxlIGtpbmQgb2YgbWlycm9yCit0byByZWZsZWN0IHVwb24gb3VyIG93bgorCistLWg5MFZJSUlLbXgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBuYW1lPSJtc2cudHh0IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KKworLS1oOTBWSUlJS214LS0KKwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4MjI0YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKQEAgLTAsMCArMSwzMzA3IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgorCitpbXBvcnQgZW1haWwKKworZnJvbSBlbWFpbC5jaGFyc2V0IGltcG9ydCBDaGFyc2V0Citmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyLCBtYWtlX2hlYWRlcgorZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlciwgSGVhZGVyUGFyc2VyCitmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yLCBEZWNvZGVkR2VuZXJhdG9yCitmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKK2Zyb20gZW1haWwubWltZS5hcHBsaWNhdGlvbiBpbXBvcnQgTUlNRUFwcGxpY2F0aW9uCitmcm9tIGVtYWlsLm1pbWUuYXVkaW8gaW1wb3J0IE1JTUVBdWRpbworZnJvbSBlbWFpbC5taW1lLnRleHQgaW1wb3J0IE1JTUVUZXh0Citmcm9tIGVtYWlsLm1pbWUuaW1hZ2UgaW1wb3J0IE1JTUVJbWFnZQorZnJvbSBlbWFpbC5taW1lLmJhc2UgaW1wb3J0IE1JTUVCYXNlCitmcm9tIGVtYWlsLm1pbWUubWVzc2FnZSBpbXBvcnQgTUlNRU1lc3NhZ2UKK2Zyb20gZW1haWwubWltZS5tdWx0aXBhcnQgaW1wb3J0IE1JTUVNdWx0aXBhcnQKK2Zyb20gZW1haWwgaW1wb3J0IHV0aWxzCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsIGltcG9ydCBpdGVyYXRvcnMKK2Zyb20gZW1haWwgaW1wb3J0IGJhc2U2NG1pbWUKK2Zyb20gZW1haWwgaW1wb3J0IHF1b3ByaW1pbWUKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIHJ1bl91bml0dGVzdAorZnJvbSBlbWFpbC50ZXN0IGltcG9ydCBfX2ZpbGVfXyBhcyBsYW5kbWFyaworCisKK05MID0gJ1xuJworRU1QVFlTVFJJTkcgPSAnJworU1BBQ0UgPSAnICcKKworCisMCitkZWYgb3BlbmZpbGUoZmlsZW5hbWUsICphcmdzLCAqKmt3cyk6CisgICAgcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUobGFuZG1hcmspLCAnZGF0YScsIGZpbGVuYW1lKQorICAgIHJldHVybiBvcGVuKHBhdGgsICphcmdzLCAqKmt3cykKKworCisMCisjIEJhc2UgdGVzdCBjbGFzcworY2xhc3MgVGVzdEVtYWlsQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIG5kaWZmQXNzZXJ0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCk6CisgICAgICAgICIiIkxpa2UgZmFpbFVubGVzc0VxdWFsIGV4Y2VwdCB1c2UgbmRpZmYgZm9yIHJlYWRhYmxlIG91dHB1dC4iIiIKKyAgICAgICAgaWYgZmlyc3QgIT0gc2Vjb25kOgorICAgICAgICAgICAgc2ZpcnN0ID0gc3RyKGZpcnN0KQorICAgICAgICAgICAgc3NlY29uZCA9IHN0cihzZWNvbmQpCisgICAgICAgICAgICByZmlyc3QgPSBbcmVwcihsaW5lKSBmb3IgbGluZSBpbiBzZmlyc3Quc3BsaXRsaW5lcygpXQorICAgICAgICAgICAgcnNlY29uZCA9IFtyZXByKGxpbmUpIGZvciBsaW5lIGluIHNzZWNvbmQuc3BsaXRsaW5lcygpXQorICAgICAgICAgICAgZGlmZiA9IGRpZmZsaWIubmRpZmYocmZpcnN0LCByc2Vjb25kKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKE5MICsgTkwuam9pbihkaWZmKSkKKworICAgIGRlZiBfbXNnb2JqKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgd2l0aCBvcGVuZmlsZShmaW5kZmlsZShmaWxlbmFtZSkpIGFzIGZwOgorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorCisKKwwKKyMgVGVzdCB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIE1lc3NhZ2UgY2xhc3MncyBBUEkKK2NsYXNzIFRlc3RNZXNzYWdlQVBJKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2dldF9hbGwoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yMC50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2FsbCgnY2MnKSwgWydjY2NAenp6Lm9yZycsICdkZGRAenp6Lm9yZycsICdlZWVAenp6Lm9yZyddKQorICAgICAgICBlcShtc2cuZ2V0X2FsbCgneHgnLCAnbi9hJyksICduL2EnKQorCisgICAgZGVmIHRlc3RfZ2V0c2V0X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCksIE5vbmUpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KCdpc28tODg1OS0xJykKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGVxKG1zZ1snbWltZS12ZXJzaW9uJ10sICcxLjAnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ2lzby04ODU5LTEnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1b3RlZC1wcmludGFibGUnKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAnaXNvLTg4NTktMScpCisgICAgICAgICMgUmVtb3ZlIHRoZSBjaGFyc2V0CisgICAgICAgIG1zZy5zZXRfY2hhcnNldChOb25lKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICAjIFRyeSBhZGRpbmcgYSBjaGFyc2V0IHdoZW4gdGhlcmUncyBhbHJlYWR5IE1JTUUgaGVhZGVycyBwcmVzZW50CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ01JTUUtVmVyc2lvbiddID0gJzIuMCcKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3gtd2VpcmQnCisgICAgICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ3F1aW50ZWQtcHVudGFibGUnCisgICAgICAgIG1zZy5zZXRfY2hhcnNldChjaGFyc2V0KQorICAgICAgICBlcShtc2dbJ21pbWUtdmVyc2lvbiddLCAnMi4wJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQveC13ZWlyZDsgY2hhcnNldD0iaXNvLTg4NTktMSInKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1aW50ZWQtcHVudGFibGUnKQorCisgICAgZGVmIHRlc3Rfc2V0X2NoYXJzZXRfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KCd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCisgICAgZGVmIHRlc3Rfc2V0X3BheWxvYWRfd2l0aF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ1RoaXMgaXMgYSBzdHJpbmcgcGF5bG9hZCcsIGNoYXJzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ2lzby04ODU5LTEnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NoYXJzZXRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wOC50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShjaGFyc2V0cywgW05vbmUsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgJ2lzby04ODU5LTInLCAna29pOC1yJ10pCisKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDkudHh0JykKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCdkaW5nYmF0JykKKyAgICAgICAgZXEoY2hhcnNldHMsIFsnZGluZ2JhdCcsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgJ2RpbmdiYXQnLAorICAgICAgICAgICAgICAgICAgICAgICdrb2k4LXInXSkKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMi50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShjaGFyc2V0cywgW05vbmUsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgTm9uZSwgJ2lzby04ODU5LTInLAorICAgICAgICAgICAgICAgICAgICAgICdpc28tODg1OS0zJywgJ3VzLWFzY2lpJywgJ2tvaTgtciddKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBmaWxlbmFtZXMgPSBbcC5nZXRfZmlsZW5hbWUoKSBmb3IgcCBpbiBtc2cuZ2V0X3BheWxvYWQoKV0KKyAgICAgICAgZXEoZmlsZW5hbWVzLCBbJ21zZy50eHQnLCAnbXNnLnR4dCddKQorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfZmlsZW5hbWUoKSwgJ2Rpbmd1c2Zpc2guZ2lmJykKKworICAgIGRlZiB0ZXN0X2dldF9maWxlbmFtZV93aXRoX25hbWVfcGFyYW1ldGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180NC50eHQnKQorICAgICAgICBmaWxlbmFtZXMgPSBbcC5nZXRfZmlsZW5hbWUoKSBmb3IgcCBpbiBtc2cuZ2V0X3BheWxvYWQoKV0KKyAgICAgICAgZXEoZmlsZW5hbWVzLCBbJ21zZy50eHQnLCAnbXNnLnR4dCddKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDcudHh0JykKKyAgICAgICAgIyBObyBxdW90ZXMhCisgICAgICAgIGVxKG1zZy5nZXRfYm91bmRhcnkoKSwgJ0JPVU5EQVJZJykKKworICAgIGRlZiB0ZXN0X3NldF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVGhpcyBvbmUgaGFzIG5vIGV4aXN0aW5nIGJvdW5kYXJ5IHBhcmFtZXRlciwgYnV0IHRoZSBDb250ZW50LVR5cGU6CisgICAgICAgICMgaGVhZGVyIGFwcGVhcnMgZmlmdGguCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIG1zZy5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgaGVhZGVyLCB2YWx1ZSA9IG1zZy5pdGVtcygpWzRdCisgICAgICAgIGVxKGhlYWRlci5sb3dlcigpLCAnY29udGVudC10eXBlJykKKyAgICAgICAgZXEodmFsdWUsICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSI7IGJvdW5kYXJ5PSJCT1VOREFSWSInKQorICAgICAgICAjIFRoaXMgb25lIGhhcyBhIENvbnRlbnQtVHlwZTogaGVhZGVyLCB3aXRoIGEgYm91bmRhcnksIHN0dWNrIGluIHRoZQorICAgICAgICAjIG1pZGRsZSBvZiBpdHMgaGVhZGVycy4gIE1ha2Ugc3VyZSB0aGUgb3JkZXIgaXMgcHJlc2VydmVkOyBpdCBzaG91bGQKKyAgICAgICAgIyBiZSBmaWZ0aC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDQudHh0JykKKyAgICAgICAgbXNnLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBoZWFkZXIsIHZhbHVlID0gbXNnLml0ZW1zKClbNF0KKyAgICAgICAgZXEoaGVhZGVyLmxvd2VyKCksICdjb250ZW50LXR5cGUnKQorICAgICAgICBlcSh2YWx1ZSwgJ211bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIicpCisgICAgICAgICMgQW5kIHRoaXMgb25lIGhhcyBubyBDb250ZW50LVR5cGU6IGhlYWRlciBhdCBhbGwuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5IZWFkZXJQYXJzZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc2V0X2JvdW5kYXJ5LCAnQk9VTkRBUlknKQorCisgICAgZGVmIHRlc3RfZ2V0X2RlY29kZWRfcGF5bG9hZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzEwLnR4dCcpCisgICAgICAgICMgVGhlIG91dGVyIG1lc3NhZ2UgaXMgYSBtdWx0aXBhcnQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgTm9uZSkKKyAgICAgICAgIyBTdWJwYXJ0IDEgaXMgN2JpdCBlbmNvZGVkCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksCisgICAgICAgICAgIGInVGhpcyBpcyBhIDdiaXQgZW5jb2RlZCBtZXNzYWdlLlxuJykKKyAgICAgICAgIyBTdWJwYXJ0IDIgaXMgcXVvcHJpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgxKS5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksCisgICAgICAgICAgIGInXHhhMVRoaXMgaXMgYSBRdW90ZWQgUHJpbnRhYmxlIGVuY29kZWQgbWVzc2FnZSFcbicpCisgICAgICAgICMgU3VicGFydCAzIGlzIGJhc2U2NAorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMikuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICBiJ1RoaXMgaXMgYSBCYXNlNjQgZW5jb2RlZCBtZXNzYWdlLicpCisgICAgICAgICMgU3VicGFydCA0IGhhcyBubyBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBoZWFkZXIuCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgzKS5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksCisgICAgICAgICAgIGInVGhpcyBoYXMgbm8gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogaGVhZGVyLlxuJykKKworICAgIGRlZiB0ZXN0X2dldF9kZWNvZGVkX3V1X3BheWxvYWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdiZWdpbiA2NjYgLVxuKzomNUw7JlxcQD1WXVI7JjAgXG4gXG5lbmRcbicpCisgICAgICAgIGZvciBjdGUgaW4gKCd4LXV1ZW5jb2RlJywgJ3V1ZW5jb2RlJywgJ3V1ZScsICd4LXV1ZScpOgorICAgICAgICAgICAgbXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10gPSBjdGUKKyAgICAgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIGInaGVsbG8gd29ybGQnKQorICAgICAgICAjIE5vdyB0cnkgc29tZSBib2d1cyBkYXRhCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnZm9vJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgYidmb28nKQorCisgICAgZGVmIHRlc3RfZGVjb2RlZF9nZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNy50eHQnKQorICAgICAgICB3aXRoIG9wZW5maWxlKCdtc2dfMTcudHh0JykgYXMgZnA6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBEZWNvZGVkR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHMuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X19jb250YWluc19fKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnTWUnCisgICAgICAgIG1zZ1sndG8nXSA9ICdZb3UnCisgICAgICAgICMgQ2hlY2sgZm9yIGNhc2UgaW5zZW5zaXRpdml0eQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ2Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdGcm9tJyBpbiBtc2cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnRlJPTScgaW4gbXNnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ3RvJyBpbiBtc2cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnVG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdUTycgaW4gbXNnKQorCisgICAgZGVmIHRlc3RfYXNfc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICB3aXRoIG9wZW5maWxlKCdtc2dfMDEudHh0JykgYXMgZnA6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGVxKHRleHQsIHN0cihtc2cpKQorICAgICAgICBmdWxscmVwciA9IG1zZy5hc19zdHJpbmcodW5peGZyb209VHJ1ZSkKKyAgICAgICAgbGluZXMgPSBmdWxscmVwci5zcGxpdCgnXG4nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGluZXNbMF0uc3RhcnRzd2l0aCgnRnJvbSAnKSkKKyAgICAgICAgZXEodGV4dCwgTkwuam9pbihsaW5lc1sxOl0pKQorCisgICAgZGVmIHRlc3RfYmFkX3BhcmFtKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJDb250ZW50LVR5cGU6IGJsYXJnOyBiYXo7IGJvb1xuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdiYXonKSwgJycpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJGcm9tOiBmb29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfYm9ndXNfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBibGFyZzsgZmlsZW5hbWVcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLCAnJykKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfYm91bmRhcnkoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIkZyb206IGZvb1xuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2JvdW5kYXJ5KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vPW9uZTsgYmFyPXR3bzsgYmF6PXRocmVlXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyhoZWFkZXI9J3gtaGVhZGVyJyksCisgICAgICAgICAgIFsoJ2ZvbycsICdvbmUnKSwgKCdiYXInLCAndHdvJyksICgnYmF6JywgJ3RocmVlJyldKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ1gtSGVhZGVyOiBmb287IGJhcj1vbmU7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKGhlYWRlcj0neC1oZWFkZXInKSwKKyAgICAgICAgICAgWygnZm9vJywgJycpLCAoJ2JhcicsICdvbmUnKSwgKCdiYXonLCAndHdvJyldKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLCBOb25lKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ1gtSGVhZGVyOiBmb287IGJhcj0ib25lIjsgYmF6PXR3b1xuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoaGVhZGVyPSd4LWhlYWRlcicpLAorICAgICAgICAgICBbKCdmb28nLCAnJyksICgnYmFyJywgJ29uZScpLCAoJ2JheicsICd0d28nKV0pCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1fbGliZXJhbChzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnQ29udGVudC1UeXBlOiBNdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5ID0gIkNQSU1TU01UUEMwNnA1ZjN0RyInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnYm91bmRhcnknKSwgJ0NQSU1TU01UUEMwNnA1ZjN0RycpCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgIlgtSGVhZGVyOiBmb289b25lOyBiYXI9dHdvOyBiYXo9dGhyZWVcbiIpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JhcicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ3R3bycpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3F1dXonLCBoZWFkZXI9J3gtaGVhZGVyJyksIE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3F1dXonKSwgTm9uZSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9Im9uZSI7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ZvbycsIGhlYWRlcj0neC1oZWFkZXInKSwgJycpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JhcicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ29uZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JheicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ3R3bycpCisgICAgICAgICMgWFhYOiBXZSBhcmUgbm90IFJGQy0yMDQ1IGNvbXBsaWFudCEgIFdlIGNhbm5vdCBwYXJzZToKKyAgICAgICAgIyBtc2dbIkNvbnRlbnQtVHlwZSJdID0gJ3RleHQvcGxhaW47IHdlaXJkPSJoZXk7IGRvbGx5PyBbeW91XSBAIDxcXCJob21lXFwiPj8iJworICAgICAgICAjIG1zZy5nZXRfcGFyYW0oIndlaXJkIikKKyAgICAgICAgIyB5ZXQuCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1fZnVua3lfY29udGludWF0aW9uX2xpbmVzKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yMi50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgxKS5nZXRfcGFyYW0oJ25hbWUnKSwgJ3dpYmJsZS5KUEcnKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX3dpdGhfc2VtaXNfaW5fcXVvdGVzKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogaW1hZ2UvcGpwZWc7IG5hbWU9IkppbSZhbXA7JmFtcDtKaWxsIlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCduYW1lJyksICdKaW0mYW1wOyZhbXA7SmlsbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnbmFtZScsIHVucXVvdGU9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICciSmltJmFtcDsmYW1wO0ppbGwiJykKKworICAgIGRlZiB0ZXN0X2ZpZWxkX2NvbnRhaW5tZW50KHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygnSGVhZGVyOiBleGlzdHMnKQorICAgICAgICB1bmxlc3MoJ2hlYWRlcicgaW4gbXNnKQorICAgICAgICB1bmxlc3MoJ0hlYWRlcicgaW4gbXNnKQorICAgICAgICB1bmxlc3MoJ0hFQURFUicgaW4gbXNnKQorICAgICAgICBzZWxmLmZhaWxJZignaGVhZGVyeCcgaW4gbXNnKQorCisgICAgZGVmIHRlc3Rfc2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAnaXNvLTIwMjItanAnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICdpc28tMjAyMi1qcCcpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2ltcG9ydGFuY2UnLCAnaGlnaCB2YWx1ZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ltcG9ydGFuY2UnKSwgJ2hpZ2ggdmFsdWUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdpbXBvcnRhbmNlJywgdW5xdW90ZT1GYWxzZSksICciaGlnaCB2YWx1ZSInKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLCBbKCd0ZXh0L3BsYWluJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjaGFyc2V0JywgJ2lzby0yMDIyLWpwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ltcG9ydGFuY2UnLCAnaGlnaCB2YWx1ZScpXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXModW5xdW90ZT1GYWxzZSksIFsoJ3RleHQvcGxhaW4nLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NoYXJzZXQnLCAnImlzby0yMDIyLWpwIicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbXBvcnRhbmNlJywgJyJoaWdoIHZhbHVlIicpXSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnY2hhcnNldCcsICdpc28tOTk5OS14eCcsIGhlYWRlcj0nWC1KaW1teScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnLCBoZWFkZXI9J1gtSmltbXknKSwgJ2lzby05OTk5LXh4JykKKworICAgIGRlZiB0ZXN0X2RlbF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA1LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksICgncmVwb3J0LXR5cGUnLCAnZGVsaXZlcnktc3RhdHVzJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKV0pCisgICAgICAgIG9sZF92YWwgPSBtc2cuZ2V0X3BhcmFtKCJyZXBvcnQtdHlwZSIpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oInJlcG9ydC10eXBlIikKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwKKyAgICAgICAgICAgWygnbXVsdGlwYXJ0L3JlcG9ydCcsICcnKSwKKyAgICAgICAgICAgICgnYm91bmRhcnknLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpXSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgicmVwb3J0LXR5cGUiLCBvbGRfdmFsKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLAorICAgICAgICAgICBbKCdtdWx0aXBhcnQvcmVwb3J0JywgJycpLAorICAgICAgICAgICAgKCdib3VuZGFyeScsICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJyksCisgICAgICAgICAgICAoJ3JlcG9ydC10eXBlJywgb2xkX3ZhbCldKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtX29uX290aGVyX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLCBmaWxlbmFtZT0nYnVkLmdpZicpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oJ2ZpbGVuYW1lJywgJ2NvbnRlbnQtZGlzcG9zaXRpb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snY29udGVudC1kaXNwb3NpdGlvbiddLCAnYXR0YWNobWVudCcpCisKKyAgICBkZWYgdGVzdF9zZXRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtc2cuc2V0X3R5cGUsICd0ZXh0JykKKyAgICAgICAgbXNnLnNldF90eXBlKCd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdjaGFyc2V0JywgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisgICAgICAgIG1zZy5zZXRfdHlwZSgndGV4dC9odG1sJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvaHRtbDsgY2hhcnNldD0idXMtYXNjaWkiJykKKworICAgIGRlZiB0ZXN0X3NldF90eXBlX29uX290aGVyX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snWC1Db250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluJworICAgICAgICBtc2cuc2V0X3R5cGUoJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICdYLUNvbnRlbnQtVHlwZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWyd4LWNvbnRlbnQtdHlwZSddLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfbWlzc2luZyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfaW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX21pc3Npbmcoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ21lc3NhZ2UnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9tYWludHlwZSgpLCAnbWVzc2FnZScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X21haW50eXBlKCksICdtZXNzYWdlJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9taXNzaW5nKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9zdWJ0eXBlKCksICdyZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9lcnJvcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnbm8tc2xhc2gtaW4tdGhpcy1zdHJpbmcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ25vLXNsYXNoLWluLXRoaXMtc3RyaW5nJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignRmlyc3QnLCAnT25lJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ1NlY29uZCcsICdUd28nKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignVGhpcmQnLCAnVGhyZWUnKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lJywgJ1R3bycsICdUaHJlZSddKQorICAgICAgICBtc2cucmVwbGFjZV9oZWFkZXIoJ1NlY29uZCcsICdUd2VudHknKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lJywgJ1R3ZW50eScsICdUaHJlZSddKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignRmlyc3QnLCAnRWxldmVuJykKKyAgICAgICAgbXNnLnJlcGxhY2VfaGVhZGVyKCdGaXJzdCcsICdPbmUgSHVuZHJlZCcpCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFsnRmlyc3QnLCAnU2Vjb25kJywgJ1RoaXJkJywgJ0ZpcnN0J10pCisgICAgICAgIGVxKG1zZy52YWx1ZXMoKSwgWydPbmUgSHVuZHJlZCcsICdUd2VudHknLCAnVGhyZWUnLCAnRWxldmVuJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBtc2cucmVwbGFjZV9oZWFkZXIsICdGb3VydGgnLCAnTWlzc2luZycpCisKKyAgICBkZWYgdGVzdF9icm9rZW5fYmFzZTY0X3BheWxvYWQoc2VsZik6CisgICAgICAgIHggPSAnQXdEcDBQNy8veTZMd0tFQWNQYS82UT05JworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydjb250ZW50LXR5cGUnXSA9ICdhdWRpby94LW1pZGknCisgICAgICAgIG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddID0gJ2Jhc2U2NCcKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyhvcmQoYykgZm9yIGMgaW4geCkpCisKKworDAorIyBUZXN0IHRoZSBlbWFpbC5lbmNvZGVycyBtb2R1bGUKK2NsYXNzIFRlc3RFbmNvZGVycyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZW5jb2RlX2VtcHR5X3BheWxvYWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KCd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAnN2JpdCcpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2N0ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAnN2JpdCcpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2N0ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgV2l0aCBubyBleHBsaWNpdCBfY2hhcnNldCBpdHMgdXMtYXNjaWksIGFuZCBhbGwgYXJlIDctYml0CisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAnN2JpdCcpCisgICAgICAgICMgU2ltaWxhciwgYnV0IHdpdGggOC1iaXQgZGF0YQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gXHhmOCB3b3JsZCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAnOGJpdCcpCisgICAgICAgICMgQW5kIG5vdyB3aXRoIGEgZGlmZmVyZW50IGNoYXJzZXQKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIFx4Zjggd29ybGQnLCBfY2hhcnNldD0naXNvLTg4NTktMScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVvdGVkLXByaW50YWJsZScpCisKKworDAorIyBUZXN0IGxvbmcgaGVhZGVyIHdyYXBwaW5nCitjbGFzcyBUZXN0TG9uZ0hlYWRlcnMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3Rfc3BsaXRfbG9uZ19jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIiIiXAorU3ViamVjdDogYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0CisKK3Rlc3QKKyIiIikKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK1N1YmplY3Q6IGJ1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dAorCit0ZXN0CisiIiIpCisKKyAgICBkZWYgdGVzdF9hbm90aGVyX2xvbmdfYWxtb3N0X3Vuc3BsaXR0YWJsZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAiIiJcCitidWcgZGVtb25zdHJhdGlvbgorXHQxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorXHRtb3JlIHRleHQiIiIKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0IiIiKQorICAgICAgICBoID0gSGVhZGVyKGhzdHIucmVwbGFjZSgnXHQnLCAnICcpKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitidWcgZGVtb25zdHJhdGlvbgorIDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CisgbW9yZSB0ZXh0IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19ub25zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGcgPSBDaGFyc2V0KCJpc28tODg1OS0xIikKKyAgICAgICAgY3ogPSBDaGFyc2V0KCJpc28tODg1OS0yIikKKyAgICAgICAgdXRmOCA9IENoYXJzZXQoInV0Zi04IikKKyAgICAgICAgZ19oZWFkID0gKGInRGllIE1pZXRlciB0cmV0ZW4gaGllciBlaW4gd2VyZGVuIG1pdCBlaW5lbSBGb2VyZGVyYmFuZCAnCisgICAgICAgICAgICAgICAgICBiJ2tvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhmY2RsXHhmY25kaXNjaGVuICcKKyAgICAgICAgICAgICAgICAgIGInV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gJworICAgICAgICAgICAgICAgICAgYidiZWZceGY2cmRlcnQuICcpCisgICAgICAgIGN6X2hlYWQgPSAoYidGaW5hblx4ZThuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kIHRsYWtlbSBqZWppY2ggJworICAgICAgICAgICAgICAgICAgIGInZFx4Zjl2dGlwdS4uICcpCisgICAgICAgIHV0ZjhfaGVhZCA9ICgnXHU2YjYzXHU3OGJhXHUzMDZiXHU4YTAwXHUzMDQ2XHUzMDY4XHU3ZmZiXHU4YTMzXHUzMDZmJworICAgICAgICAgICAgICAgICAgICAgJ1x1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NGUwMCcKKyAgICAgICAgICAgICAgICAgICAgICdcdTkwZThcdTMwNmZcdTMwYzlcdTMwYTRcdTMwYzRcdThhOWVcdTMwNjdcdTMwNTlcdTMwNGMnCisgICAgICAgICAgICAgICAgICAgICAnXHUzMDAxXHUzMDQyXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDVmXHUzMDg5XHUzMDgxXHUzMDY3JworICAgICAgICAgICAgICAgICAgICAgJ1x1MzA1OVx1MzAwMlx1NWI5Zlx1OTY5Ylx1MzA2Ylx1MzA2Zlx1MzAwY1dlbm4gaXN0IGRhcyAnCisgICAgICAgICAgICAgICAgICAgICAnTnVuc3R1Y2sgZ2l0IHVuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgJworICAgICAgICAgICAgICAgICAgICAgJ2RpZSBGbGlwcGVyd2FsZHQgZ2Vyc3B1dC5cdTMwMGRcdTMwNjhcdThhMDBcdTMwNjNcdTMwNjYnCisgICAgICAgICAgICAgICAgICAgICAnXHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyJykKKyAgICAgICAgaCA9IEhlYWRlcihnX2hlYWQsIGcsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgaC5hcHBlbmQoY3pfaGVhZCwgY3opCisgICAgICAgIGguYXBwZW5kKHV0ZjhfaGVhZCwgdXRmOCkKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gaAorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorU3ViamVjdDogPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZD89CisgPT9pc28tODg1OS0xP3E/ZXJiYW5kX2tvbWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaT89CisgPT9pc28tODg1OS0xP3E/c2NoZW5fV2FuZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2dlZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZz89CisgPT9pc28tODg1OS0xP3E/ZW5fYmVmPUY2cmRlcnQ9MkVfPz0gPT9pc28tODg1OS0yP3E/RmluYW49RThuaV9tZXQ/PQorID0/aXNvLTg4NTktMj9xP3JvcG9sZV9zZV9ocm91dGlseV9wb2RfdGxha2VtX2plamljaF9kPUY5dnRpcHU9MkU9MkVfPz0KKyA9P3V0Zi04P2I/NXEyajU2SzY0NEdyNktpQTQ0R0c0NEdvNTcrNzZLaXo0NEd2NDRHVjQ0S000NEdtNDRHRT89CisgPT91dGYtOD9iPzQ0Rys0NEdiNDRLVDQ0Q0M1TGlBNllPbzQ0R3Y0NE9KNDRLazQ0T0U2S3FlNDRHbjQ0R1o0NEdNNDRDQj89CisgPT91dGYtOD9iPzQ0R0M0NEdvNDRHdjQ0R240NEdmNDRLSjQ0S0I0NEduNDRHWjQ0Q0M1YTZmNlpxYjQ0R3I0NEd2NDRDTT89CisgPT91dGYtOD9xP1dlbm5faXN0X2Rhc19OdW5zdHVja19naXRfdW5kX1Nsb3Rlcm1leWVyPTNGX0phIV9CZWloZXJodW5kX2Rhcz89CisgPT91dGYtOD9iP0lFOWtaWElnWkdsbElFWnNhWEJ3WlhKM1lXeGtkQ0JuWlhKemNIVjBMdU9BamVPQnFPaW9nT09Cb3c9PT89CisgPT91dGYtOD9iPzQ0R200NEdFNDRHKzQ0R1o0NENDPz0KKworIiIiKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCis9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkPz0KKyA9P2lzby04ODU5LTE/cT9lcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpPz0KKyA9P2lzby04ODU5LTE/cT9zY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZ2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nPz0KKyA9P2lzby04ODU5LTE/cT9lbl9iZWY9RjZyZGVydD0yRV8/PSA9P2lzby04ODU5LTI/cT9GaW5hbj1FOG5pX21ldD89CisgPT9pc28tODg1OS0yP3E/cm9wb2xlX3NlX2hyb3V0aWx5X3BvZF90bGFrZW1famVqaWNoX2Q9Rjl2dGlwdT0yRT0yRV8/PQorID0/dXRmLTg/Yj81cTJqNTZLNjQ0R3I2S2lBNDRHRzQ0R281Nys3NktpejQ0R3Y0NEdWNDRLTTQ0R200NEdFPz0KKyA9P3V0Zi04P2I/NDRHKzQ0R2I0NEtUNDRDQzVMaUE2WU9vNDRHdjQ0T0o0NEtrNDRPRTZLcWU0NEduNDRHWjQ0R000NENCPz0KKyA9P3V0Zi04P2I/NDRHQzQ0R280NEd2NDRHbjQ0R2Y0NEtKNDRLQjQ0R240NEdaNDRDQzVhNmY2WnFiNDRHcjQ0R3Y0NENNPz0KKyA9P3V0Zi04P3E/V2Vubl9pc3RfZGFzX051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzPz0KKyA9P3V0Zi04P2I/SUU5a1pYSWdaR2xsSUVac2FYQndaWEozWVd4a2RDQm5aWEp6Y0hWMEx1T0FqZU9CcU9pb2dPT0Jvdz09Pz0KKyA9P3V0Zi04P2I/NDRHbTQ0R0U0NEcrNDRHWjQ0Q0M/PSIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcignd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsgJworICAgICAgICAgICAgICAgICAgICdzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInLAorICAgICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lPSdYLUZvb2Jhci1TcG9pbmstRGVmcm9ibml0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJycnXAord2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsKKyBzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInJycpCisKKyAgICBkZWYgdGVzdF9sb25nX2hlYWRlcl9lbmNvZGVfd2l0aF90YWJfY29udGludWF0aW9uX2lzX2p1c3RfYV9oaW50KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAgICAgICAgJ3Nwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicsCisgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnLAorICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCit3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworIHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyX2VuY29kZV93aXRoX3RhYl9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7XHQnCisgICAgICAgICAgICAgICAgICAgJ3Nwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicsCisgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnLAorICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCit3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworXHRzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInJycpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfc3BsaXR0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCcnKQorICAgICAgICAjIEl0J2QgYmUgZ3JlYXQgaWYgd2UgY291bGQgdXNlIGFkZF9oZWFkZXIoKSBoZXJlLCBidXQgdGhhdCBkb2Vzbid0CisgICAgICAgICMgZ3VhcmFudGVlIGFuIG9yZGVyIG9mIHRoZSBwYXJhbWV0ZXJzLgorICAgICAgICBtc2dbJ1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnXSA9ICgKKyAgICAgICAgICAgICd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAnc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdDogd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsKKyBzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSIKKworJycnKQorCisgICAgZGVmIHRlc3Rfbm9fc2VtaXNfaGVhZGVyX3NwbGl0dGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAndGVzdEBkb20uYWluJworICAgICAgICBtc2dbJ1JlZmVyZW5jZXMnXSA9IFNQQUNFLmpvaW4oJzwlZEBkb20uYWluPicgJSBpIGZvciBpIGluIHJhbmdlKDEwKSkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdUZXN0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK0Zyb206IHRlc3RAZG9tLmFpbgorUmVmZXJlbmNlczogPDBAZG9tLmFpbj4gPDFAZG9tLmFpbj4gPDJAZG9tLmFpbj4gPDNAZG9tLmFpbj4gPDRAZG9tLmFpbj4KKyA8NUBkb20uYWluPiA8NkBkb20uYWluPiA8N0Bkb20uYWluPiA8OEBkb20uYWluPiA8OUBkb20uYWluPgorCitUZXN0IiIiKQorCisgICAgZGVmIHRlc3Rfbm9fc3BsaXRfbG9uZ19oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAnUmVmZXJlbmNlczogJyArICd4JyAqIDgwCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK1JlZmVyZW5jZXM6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IiIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXR0aW5nX211bHRpcGxlX2xvbmdfbGluZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAiIiJcCitmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOyBmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OyBTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsgYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsgZm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsgU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorIiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2Zyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7CisgYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsKKyBmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OworIFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorXHRmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOworIGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7CisgZm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsKKyBTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKKyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworIGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CisgU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpIiIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXR0aW5nX2ZpcnN0X2xpbmVfb25seV9pc19sb25nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorZnJvbSBtb2RlbWNhYmxlMDkzLjEzOS0yMDEtMjQucXVlLm1jLnZpZGVvdHJvbi5jYSAoWzI0LjIwMS4xMzkuOTNdIGhlbG89Y3RodWxodS5nZXJnLmNhKQorXHRieSBrcm9ub3MubWVtcy1leGNoYW5nZS5vcmcgd2l0aCBlc210cCAoRXhpbSA0LjA1KQorXHRpZCAxN2s0aDUtMDAwMzRpLTAwCitcdGZvciB0ZXN0QG1lbXMtZXhjaGFuZ2Uub3JnOyBXZWQsIDI4IEF1ZyAyMDAyIDExOjI1OjIwIC0wNDAwIiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgbWF4bGluZWxlbj03OCwgaGVhZGVyX25hbWU9J1JlY2VpdmVkJywKKyAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorZnJvbSBtb2RlbWNhYmxlMDkzLjEzOS0yMDEtMjQucXVlLm1jLnZpZGVvdHJvbi5jYSAoWzI0LjIwMS4xMzkuOTNdCisgaGVsbz1jdGh1bGh1LmdlcmcuY2EpCitcdGJ5IGtyb25vcy5tZW1zLWV4Y2hhbmdlLm9yZyB3aXRoIGVzbXRwIChFeGltIDQuMDUpCitcdGlkIDE3azRoNS0wMDAzNGktMDAKK1x0Zm9yIHRlc3RAbWVtcy1leGNoYW5nZS5vcmc7IFdlZCwgMjggQXVnIDIwMDIgMTE6MjU6MjAgLTA0MDAiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nXzhiaXRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgaCA9IEhlYWRlcignQnJpdGlzY2hlIFJlZ2llcnVuZyBnaWJ0JywgJ2lzby04ODU5LTEnLAorICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbmFtZT0nU3ViamVjdCcpCisgICAgICAgIGguYXBwZW5kKCdnclx4ZmNuZXMgTGljaHQgZlx4ZmNyIE9mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlJykKKyAgICAgICAgbXNnWydTdWJqZWN0J10gPSBoCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorU3ViamVjdDogPT9pc28tODg1OS0xP3E/QnJpdGlzY2hlX1JlZ2llcnVuZ19naWJ0X2dyPUZDbmVzX0xpY2h0X2Y9RkNyPz0KKyA9P2lzby04ODU5LTE/cT9PZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZT89CisKKyIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfOGJpdF9oZWFkZXJfbm9fY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snUmVwbHktVG8nXSA9ICdCcml0aXNjaGUgUmVnaWVydW5nIGdpYnQgZ3JceGZjbmVzIExpY2h0IGZceGZjciBPZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZSA8YS12ZXJ5LWxvbmctYWRkcmVzc0BleGFtcGxlLmNvbT4nCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmVwbHktVG86IEJyaXRpc2NoZSBSZWdpZXJ1bmcgZ2lidCBnclx4ZmNuZXMgTGljaHQgZlx4ZmNyIE9mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlIDxhLXZlcnktbG9uZy1hZGRyZXNzQGV4YW1wbGUuY29tPgorCisiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nX3RvX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgdG8gPSAoJyJTb21lb25lIFRlc3QgI0EiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwnCisgICAgICAgICAgICAgICc8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sJworICAgICAgICAgICAgICAnIlNvbWVvbmUgVGVzdCAjQiIgPHNvbWVvbmVAdW1pY2guZWR1PiwgJworICAgICAgICAgICAgICAnIlNvbWVvbmUgVGVzdCAjQyIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCAnCisgICAgICAgICAgICAgICciU29tZW9uZSBUZXN0ICNEIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4nKQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydUbyddID0gdG8KKyAgICAgICAgZXEobXNnLmFzX3N0cmluZyhtYXhoZWFkZXJsZW49NzgpLCAnJydcCitUbzogIlNvbWVvbmUgVGVzdCAjQSIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sCitcdCJTb21lb25lIFRlc3QgI0IiIDxzb21lb25lQHVtaWNoLmVkdT4sCitcdCJTb21lb25lIFRlc3QgI0MiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwKK1x0IlNvbWVvbmUgVGVzdCAjRCIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+CisKKycnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfbGluZV9hZnRlcl9hcHBlbmQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhpcyBpcyBhbiBleGFtcGxlIG9mIHN0cmluZyB3aGljaCBoYXMgYWxtb3N0IHRoZSBsaW1pdCBvZiBoZWFkZXIgbGVuZ3RoLicKKyAgICAgICAgaCA9IEhlYWRlcihzKQorICAgICAgICBoLmFwcGVuZCgnQWRkIGFub3RoZXIgbGluZS4nKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitUaGlzIGlzIGFuIGV4YW1wbGUgb2Ygc3RyaW5nIHdoaWNoIGhhcyBhbG1vc3QgdGhlIGxpbWl0IG9mIGhlYWRlciBsZW5ndGguCisgQWRkIGFub3RoZXIgbGluZS4iIiIpCisKKyAgICBkZWYgdGVzdF9zaG9ydGVyX2xpbmVfd2l0aF9hcHBlbmQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhpcyBpcyBhIHNob3J0ZXIgbGluZS4nCisgICAgICAgIGggPSBIZWFkZXIocykKKyAgICAgICAgaC5hcHBlbmQoJ0FkZCBhbm90aGVyIHNlbnRlbmNlLiAoU3VycHJpc2U/KScpCisgICAgICAgIGVxKGguZW5jb2RlKCksCisgICAgICAgICAgICdUaGlzIGlzIGEgc2hvcnRlciBsaW5lLiBBZGQgYW5vdGhlciBzZW50ZW5jZS4gKFN1cnByaXNlPyknKQorCisgICAgZGVmIHRlc3RfbG9uZ19maWVsZF9uYW1lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBmbiA9ICdYLVZlcnktVmVyeS1WZXJ5LUxvbmctSGVhZGVyLU5hbWUnCisgICAgICAgIGdzID0gIkRpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQga29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGZjZGxceGZjbmRpc2NoZW4gV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAiCisgICAgICAgIGggPSBIZWFkZXIoZ3MsICdpc28tODg1OS0xJywgaGVhZGVyX25hbWU9Zm4pCisgICAgICAgICMgQkFXOiB0aGlzIHNlZW1zIGJyb2tlbiBiZWNhdXNlIHRoZSBmaXJzdCBsaW5lIGlzIHRvbyBsb25nCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKKz0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfPz0KKyA9P2lzby04ODU5LTE/cT9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZGVyYmFuZF9rb21mb3J0YWJlbF9kZW5fS29ycmlkb3JfPz0KKyA9P2lzby04ODU5LTE/cT9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaXNjaGVuX1dhbmRnZW09RTRsZGVuX3ZvcmJlaT0yQ19nPz0KKyA9P2lzby04ODU5LTE/cT9lZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZ2VuX2JlZj1GNnJkZXJ0PTJFXz89IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19yZWNlaXZlZF9oZWFkZXIoc2VsZik6CisgICAgICAgIGggPSAoJ2Zyb20gRk9PLlRMRCAodml6d29ybGQuYWNsLmZvby50bGQgWzEyMy40NTIuNjc4LjldKSAnCisgICAgICAgICAgICAgJ2J5IGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7ICcKKyAgICAgICAgICAgICAnV2VkLCAwNSBNYXIgMjAwMyAxODoxMDoxOCAtMDcwMCcpCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlY2VpdmVkLTEnXSA9IEhlYWRlcihoLCBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgbXNnWydSZWNlaXZlZC0yJ10gPSBoCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChtc2cuYXNfc3RyaW5nKG1heGhlYWRlcmxlbj03OCksICIiIlwKK1JlY2VpdmVkLTE6IGZyb20gRk9PLlRMRCAodml6d29ybGQuYWNsLmZvby50bGQgWzEyMy40NTIuNjc4LjldKSBieQorXHRocm90aGdhci5sYS5tYXN0YWxlci5jb20gKHRtZGEtb2ZtaXBkKSB3aXRoIEVTTVRQOworXHRXZWQsIDA1IE1hciAyMDAzIDE4OjEwOjE4IC0wNzAwCitSZWNlaXZlZC0yOiBmcm9tIEZPTy5UTEQgKHZpendvcmxkLmFjbC5mb28udGxkIFsxMjMuNDUyLjY3OC45XSkgYnkKK1x0aHJvdGhnYXIubGEubWFzdGFsZXIuY29tICh0bWRhLW9mbWlwZCkgd2l0aCBFU01UUDsKK1x0V2VkLCAwNSBNYXIgMjAwMyAxODoxMDoxOCAtMDcwMAorCisiIiIpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfaGVhZGVyaW5zdF9lcShzZWxmKToKKyAgICAgICAgaCA9ICgnPDE1OTc1LjE3OTAxLjIwNzI0MC40MTQ2MDRAc2dpZ3JpdHptYW5uMS5tYXRoZW1hdGlrLicKKyAgICAgICAgICAgICAndHUtbXVlbmNoZW4uZGU+IChEYXZpZCBCcmVtbmVyXCdzIG1lc3NhZ2Ugb2YgJworICAgICAgICAgICAgICciVGh1LCA2IE1hciAyMDAzIDEzOjU4OjIxICswMTAwIiknKQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydSZWNlaXZlZC0xJ10gPSBIZWFkZXIoaCwgaGVhZGVyX25hbWU9J1JlY2VpdmVkLTEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgbXNnWydSZWNlaXZlZC0yJ10gPSBoCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChtc2cuYXNfc3RyaW5nKG1heGhlYWRlcmxlbj03OCksICIiIlwKK1JlY2VpdmVkLTE6IDwxNTk3NS4xNzkwMS4yMDcyNDAuNDE0NjA0QHNnaWdyaXR6bWFubjEubWF0aGVtYXRpay50dS1tdWVuY2hlbi5kZT4KK1x0KERhdmlkIEJyZW1uZXIncyBtZXNzYWdlIG9mICJUaHUsIDYgTWFyIDIwMDMgMTM6NTg6MjEgKzAxMDAiKQorUmVjZWl2ZWQtMjogPDE1OTc1LjE3OTAxLjIwNzI0MC40MTQ2MDRAc2dpZ3JpdHptYW5uMS5tYXRoZW1hdGlrLnR1LW11ZW5jaGVuLmRlPgorXHQoRGF2aWQgQnJlbW5lcidzIG1lc3NhZ2Ugb2YgIlRodSwgNiBNYXIgMjAwMyAxMzo1ODoyMSArMDEwMCIpCisKKyIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfdW5icmVha2FibGVfbGluZXNfd2l0aF9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICB0ID0gIiIiXAoraVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdCQU1BQUFDbExPUzBBQUFBR0ZCTVZFVUFBQUFrSGlKZVJVSWNHQmk5CisgbG9jUURRNHpKeWtGQkFYSmZXRGpBQUFDWVVsRVFWUjRuRjJUUVkvaklBeUZjNmx5ZGxHNXg4TnlwMVk2OXdqMVBOMkk1Z3pwIiIiCisgICAgICAgIG1zZ1snRmFjZS0xJ10gPSB0CisgICAgICAgIG1zZ1snRmFjZS0yJ10gPSBIZWFkZXIodCwgaGVhZGVyX25hbWU9J0ZhY2UtMicpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcobWF4aGVhZGVybGVuPTc4KSwgIiIiXAorRmFjZS0xOiBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0JBTUFBQUNsTE9TMEFBQUFHRkJNVkVVQUFBQWtIaUplUlVJY0dCaTkKKyBsb2NRRFE0ekp5a0ZCQVhKZldEakFBQUNZVWxFUVZSNG5GMlRRWS9qSUF5RmM2bHlkbEc1eDhOeXAxWTY5d2oxUE4ySTVnenAKK0ZhY2UtMjogaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdCQU1BQUFDbExPUzBBQUFBR0ZCTVZFVUFBQUFrSGlKZVJVSWNHQmk5CisgbG9jUURRNHpKeWtGQkFYSmZXRGpBQUFDWVVsRVFWUjRuRjJUUVkvaklBeUZjNmx5ZGxHNXg4TnlwMVk2OXdqMVBOMkk1Z3pwCisKKyIiIikKKworICAgIGRlZiB0ZXN0X2Fub3RoZXJfbG9uZ19tdWx0aWxpbmVfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtID0gKCdSZWNlaXZlZDogZnJvbSBzaWltYWdlLmNvbSAnCisgICAgICAgICAgICAgJyhbMTcyLjI1LjEuM10pIGJ5IHppbWEuc2lsaWNvbmltYWdlLmNvbSB3aXRoICcKKyAgICAgICAgICAgICAnTWljcm9zb2Z0IFNNVFBTVkMoNS4wLjIxOTUuNDkwNSk7JworICAgICAgICAgICAgICdcdFdlZCwgMTYgT2N0IDIwMDIgMDc6NDE6MTEgLTA3MDAnKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcobWF4aGVhZGVybGVuPTc4KSwgJycnXAorUmVjZWl2ZWQ6IGZyb20gc2lpbWFnZS5jb20gKFsxNzIuMjUuMS4zXSkgYnkgemltYS5zaWxpY29uaW1hZ2UuY29tIHdpdGgKK1x0TWljcm9zb2Z0IFNNVFBTVkMoNS4wLjIxOTUuNDkwNSk7IFdlZCwgMTYgT2N0IDIwMDIgMDc6NDE6MTEgLTA3MDAKKworJycnKQorCisgICAgZGVmIHRlc3RfbG9uZ19saW5lc193aXRoX2RpZmZlcmVudF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSAoJ0xpc3QtVW5zdWJzY3JpYmU6ICcKKyAgICAgICAgICAgICAnPGh0dHA6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vc3BhbWFzc2Fzc2luLXRhbGs+LCcKKyAgICAgICAgICAgICAnICAgICAgICA8bWFpbHRvOnNwYW1hc3Nhc3Npbi10YWxrLXJlcXVlc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0JworICAgICAgICAgICAgICc/c3ViamVjdD11bnN1YnNjcmliZT4nKQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydMaXN0J10gPSBoCisgICAgICAgIG1zZ1snTGlzdCddID0gSGVhZGVyKGgsIGhlYWRlcl9uYW1lPSdMaXN0JykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZyhtYXhoZWFkZXJsZW49NzgpLCAiIiJcCitMaXN0OiBMaXN0LVVuc3Vic2NyaWJlOiA8aHR0cDovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcGFtYXNzYXNzaW4tdGFsaz4sCitcdDxtYWlsdG86c3BhbWFzc2Fzc2luLXRhbGstcmVxdWVzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ/c3ViamVjdD11bnN1YnNjcmliZT4KK0xpc3Q6IExpc3QtVW5zdWJzY3JpYmU6IDxodHRwOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwYW1hc3Nhc3Npbi10YWxrPiwKKyA8bWFpbHRvOnNwYW1hc3Nhc3Npbi10YWxrLXJlcXVlc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0P3N1YmplY3Q9dW5zdWJzY3JpYmU+CisKKyIiIikKKworCisMCisjIFRlc3QgbWFuZ2xpbmcgb2YgIkZyb20gIiBsaW5lcyBpbiB0aGUgYm9keSBvZiBhIG1lc3NhZ2UKK2NsYXNzIFRlc3RGcm9tTWFuZ2xpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5tc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5tc2dbJ0Zyb20nXSA9ICdhYWFAYmJiLm9yZycKKyAgICAgICAgc2VsZi5tc2cuc2V0X3BheWxvYWQoIiIiXAorRnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfbWFuZ2xlZF9mcm9tKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1hbmdsZV9mcm9tXz1UcnVlKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZi5tc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiBhYWFAYmJiLm9yZworCis+RnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfZG9udF9tYW5nbGVfZnJvbShzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYW5nbGVfZnJvbV89RmFsc2UpCisgICAgICAgIGcuZmxhdHRlbihzZWxmLm1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICIiIlwKK0Zyb206IGFhYUBiYmIub3JnCisKK0Zyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworCisMCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVBdWRpbyBjbGFzcworY2xhc3MgVGVzdE1JTUVBdWRpbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBwaWNrIHVwIHRoZSBhdWRpb3Rlc3QuYXUgdGhhdCBsaXZlcyBpbiBlbWFpbC90ZXN0L2RhdGEuCisgICAgICAgICMgSW4gUHl0aG9uLCB0aGVyZSdzIGFuIGF1ZGlvdGVzdC5hdSBsaXZpbmcgaW4gTGliL3Rlc3QgYnV0IHRoYXQgaXNuJ3QKKyAgICAgICAgIyBpbmNsdWRlZCBpbiBzb21lIGJpbmFyeSBkaXN0cm9zIHRoYXQgZG9uJ3QgaW5jbHVkZSB0aGUgdGVzdAorICAgICAgICAjIHBhY2thZ2UuICBUaGUgdHJhaWxpbmcgZW1wdHkgc3RyaW5nIG9uIHRoZSAuam9pbigpIGlzIHNpZ25pZmljYW50CisgICAgICAgICMgc2luY2UgZmluZGZpbGUoKSB3aWxsIGRvIGEgZGlybmFtZSgpLgorICAgICAgICBkYXRhZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShsYW5kbWFyayksICdkYXRhJywgJycpCisgICAgICAgIHdpdGggb3BlbihmaW5kZmlsZSgnYXVkaW90ZXN0LmF1JywgZGF0YWRpciksICdyYicpIGFzIGZwOgorICAgICAgICAgICAgc2VsZi5fYXVkaW9kYXRhID0gZnAucmVhZCgpCisgICAgICAgIHNlbGYuX2F1ID0gTUlNRUF1ZGlvKHNlbGYuX2F1ZGlvZGF0YSkKKworICAgIGRlZiB0ZXN0X2d1ZXNzX21pbm9yX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYXUuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXVkaW8vYmFzaWMnKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHBheWxvYWQgPSBzZWxmLl9hdS5nZXRfcGF5bG9hZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZTY0LmRlY29kZXN0cmluZyhwYXlsb2FkKSwgc2VsZi5fYXVkaW9kYXRhKQorCisgICAgZGVmIHRlc3RfY2hlY2tTZXRNaW5vcihzZWxmKToKKyAgICAgICAgYXUgPSBNSU1FQXVkaW8oc2VsZi5fYXVkaW9kYXRhLCAnZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXUuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXVkaW8vZmlzaCcpCisKKyAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHNlbGYuX2F1LmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2F1ZGlvdGVzdC5hdScpCisgICAgICAgIGVxKHNlbGYuX2F1Wydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCisgICAgICAgICAgICdhdHRhY2htZW50OyBmaWxlbmFtZT0iYXVkaW90ZXN0LmF1IicpCisgICAgICAgIGVxKHNlbGYuX2F1LmdldF9wYXJhbXMoaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgIFsoJ2F0dGFjaG1lbnQnLCAnJyksICgnZmlsZW5hbWUnLCAnYXVkaW90ZXN0LmF1JyldKQorICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW0oJ2ZpbGVuYW1lJywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgICdhdWRpb3Rlc3QuYXUnKQorICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgZXEoc2VsZi5fYXUuZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksICcnKQorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdmb28nLCBmYWlsb2JqPW1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJykgaXMgbWlzc2luZykKKyAgICAgICAgIyBUcnkgc29tZSBtaXNzaW5nIHN0dWZmCisgICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCisgICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBtaXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJykgaXMgbWlzc2luZykKKworCisMCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVJbWFnZSBjbGFzcworY2xhc3MgVGVzdE1JTUVJbWFnZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW5maWxlKCdQeUJhbm5lcjA0OC5naWYnLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuX2ltZ2RhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgc2VsZi5faW0gPSBNSU1FSW1hZ2Uoc2VsZi5faW1nZGF0YSkKKworICAgIGRlZiB0ZXN0X2d1ZXNzX21pbm9yX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5faW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZ2lmJykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5faW0uZ2V0X3BheWxvYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2U2NC5kZWNvZGVzdHJpbmcocGF5bG9hZCksIHNlbGYuX2ltZ2RhdGEpCisKKyAgICBkZWYgdGVzdF9jaGVja1NldE1pbm9yKHNlbGYpOgorICAgICAgICBpbSA9IE1JTUVJbWFnZShzZWxmLl9pbWdkYXRhLCAnZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZmlzaCcpCisKKyAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHNlbGYuX2ltLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgZXEoc2VsZi5faW1bJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwKKyAgICAgICAgICAgJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJkaW5ndXNmaXNoLmdpZiInKQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW1zKGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICBbKCdhdHRhY2htZW50JywgJycpLCAoJ2ZpbGVuYW1lJywgJ2Rpbmd1c2Zpc2guZ2lmJyldKQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZpbGVuYW1lJywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgICdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgJycpCisgICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZvbycsIGZhaWxvYmo9bWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSBpcyBtaXNzaW5nKQorICAgICAgICAjIFRyeSBzb21lIG1pc3Npbmcgc3R1ZmYKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZykgaXMgbWlzc2luZykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnYXR0YWNobWVudCcsIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdmb29iYXInKSBpcyBtaXNzaW5nKQorCisKKwwKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRUFwcGxpY2F0aW9uIGNsYXNzCitjbGFzcyBUZXN0TUlNRUFwcGxpY2F0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9oZWFkZXJzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRUFwcGxpY2F0aW9uKCdceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdiYXNlNjQnKQorCisgICAgZGVmIHRlc3RfYm9keShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGJ5dGVzID0gJ1x4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZicKKyAgICAgICAgbXNnID0gTUlNRUFwcGxpY2F0aW9uKGJ5dGVzKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJyt2djgvZjcvJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgYnl0ZXMpCisKKworDAorIyBUZXN0IHRoZSBiYXNpYyBNSU1FVGV4dCBjbGFzcworY2xhc3MgVGVzdE1JTUVUZXh0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX21zZyA9IE1JTUVUZXh0KCdoZWxsbyB0aGVyZScpCisKKyAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIHVubGVzcyhzZWxmLl9tc2cuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcsIG1pc3NpbmcsIGhlYWRlcj0nZm9vYmFyJykKKyAgICAgICAgICAgICAgIGlzIG1pc3NpbmcpCisKKyAgICBkZWYgdGVzdF9wYXlsb2FkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX21zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gdGhlcmUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKKworICAgIGRlZiB0ZXN0X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gdGhlcmUnLCBfY2hhcnNldD0ndXMtYXNjaWknKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiJykKKworCisMCisjIFRlc3QgY29tcGxpY2F0ZWQgbXVsdGlwYXJ0LyogbWVzc2FnZXMKK2NsYXNzIFRlc3RNdWx0aXBhcnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW5maWxlKCdQeUJhbm5lcjA0OC5naWYnLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgY29udGFpbmVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcsIGJvdW5kYXJ5PSdCT1VOREFSWScpCisgICAgICAgIGltYWdlID0gTUlNRUltYWdlKGRhdGEsIG5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgaW1hZ2UuYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBpbnRybyA9IE1JTUVUZXh0KCcnJ1wKK0hpIHRoZXJlLAorCitUaGlzIGlzIHRoZSBkaW5ndXMgZmlzaC4KKycnJykKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChpbnRybykKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChpbWFnZSkKKyAgICAgICAgY29udGFpbmVyWydGcm9tJ10gPSAnQmFycnkgPGJhcnJ5QGRpZ2ljb29sLmNvbT4nCisgICAgICAgIGNvbnRhaW5lclsnVG8nXSA9ICdEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPicKKyAgICAgICAgY29udGFpbmVyWydTdWJqZWN0J10gPSAnSGVyZSBpcyB5b3VyIGRpbmd1cyBmaXNoJworCisgICAgICAgIG5vdyA9IDk4NzgwOTcwMi41NDg0ODU5OQorICAgICAgICB0aW1ldHVwbGUgPSB0aW1lLmxvY2FsdGltZShub3cpCisgICAgICAgIGlmIHRpbWV0dXBsZVstMV0gPT0gMDoKKyAgICAgICAgICAgIHR6c2VjcyA9IHRpbWUudGltZXpvbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6c2VjcyA9IHRpbWUuYWx0em9uZQorICAgICAgICBpZiB0enNlY3MgPiAwOgorICAgICAgICAgICAgc2lnbiA9ICctJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2lnbiA9ICcrJworICAgICAgICB0em9mZnNldCA9ICcgJXMlMDRkJyAlIChzaWduLCB0enNlY3MgLyAzNikKKyAgICAgICAgY29udGFpbmVyWydEYXRlJ10gPSB0aW1lLnN0cmZ0aW1lKAorICAgICAgICAgICAgJyVhLCAlZCAlYiAlWSAlSDolTTolUycsCisgICAgICAgICAgICB0aW1lLmxvY2FsdGltZShub3cpKSArIHR6b2Zmc2V0CisgICAgICAgIHNlbGYuX21zZyA9IGNvbnRhaW5lcgorICAgICAgICBzZWxmLl9pbSA9IGltYWdlCisgICAgICAgIHNlbGYuX3R4dCA9IGludHJvCisKKyAgICBkZWYgdGVzdF9oaWVyYXJjaHkoc2VsZik6CisgICAgICAgICMgY29udmVuaWVuY2UKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICAjIHRlc3RzCisgICAgICAgIG0gPSBzZWxmLl9tc2cKKyAgICAgICAgdW5sZXNzKG0uaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKG0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKKyAgICAgICAgZXEobGVuKG0uZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIHJhaXNlcyhJbmRleEVycm9yLCBtLmdldF9wYXlsb2FkLCAyKQorICAgICAgICBtMCA9IG0uZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgbTEgPSBtLmdldF9wYXlsb2FkKDEpCisgICAgICAgIHVubGVzcyhtMCBpcyBzZWxmLl90eHQpCisgICAgICAgIHVubGVzcyhtMSBpcyBzZWxmLl9pbSkKKyAgICAgICAgZXEobS5nZXRfcGF5bG9hZCgpLCBbbTAsIG0xXSkKKyAgICAgICAgdW5sZXNzKG5vdCBtMC5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgdW5sZXNzKG5vdCBtMS5pc19tdWx0aXBhcnQoKSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X211bHRpcGFydF9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICB0ZXh0ID0gIiIiXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKKworCistLUJPVU5EQVJZLS0KKyIiIgorICAgICAgICBtc2cgPSBQYXJzZXIoKS5wYXJzZXN0cih0ZXh0KQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwodGV4dCwgbXNnLmFzX3N0cmluZygpKQorCisgICAgZGVmIHRlc3Rfbm9fcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ub25lX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCisKKy0tQk9VTkRBUlktLScnJykKKworICAgIGRlZiB0ZXN0X25vX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5wcmVhbWJsZSA9ICcnCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKKworLS1CT1VOREFSWS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9vbmVfcGFydF9pbl9hX211bHRpcGFydChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIucHJlYW1ibGUgPSAnJworICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gTm9uZQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9IE5vbmUKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9lbXB0eV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tCisnJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25sX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnXG4nCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLQorCisnJycpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2V4dGVybmFsX2JvZHkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNi50eHQnKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBtc2cxID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJykKKyAgICAgICAgZXEobGVuKG1zZzEuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZzEuZ2V0X3BheWxvYWQoKToKKyAgICAgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9leHRlcm5hbC1ib2R5JykKKyAgICAgICAgICAgIGVxKGxlbihzdWJwYXJ0LmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICAgICAgc3Vic3VicGFydCA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kb3VibGVfYm91bmRhcnkoc2VsZik6CisgICAgICAgICMgbXNnXzM3LnR4dCBpcyBhIG11bHRpcGFydCB0aGF0IGNvbnRhaW5zIHR3byBkYXNoLWJvdW5kYXJ5J3MgaW4gYQorICAgICAgICAjIHJvdy4gIE91ciBpbnRlcnByZXRhdGlvbiBvZiBSRkMgMjA0NiBjYWxscyBmb3IgaWdub3JpbmcgdGhlIHNlY29uZAorICAgICAgICAjIGFuZCBzdWJzZXF1ZW50IGJvdW5kYXJpZXMuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM3LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9pbm5lcl9jb250YWluc19vdXRlcl9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtc2dfMzgudHh0IGhhcyBhbiBpbm5lciBwYXJ0IHRoYXQgY29udGFpbnMgb3V0ZXIgYm91bmRhcmllcy4gIE15CisgICAgICAgICMgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDIwNDYgKGJhc2VkIG9uIHNlY3Rpb25zIDUuMSBhbmQgNS4xLjIpIHNheQorICAgICAgICAjIHRoZXNlIGFyZSBpbGxlZ2FsIGFuZCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdW50ZXJtaW5hdGVkIGlubmVyCisgICAgICAgICMgcGFydHMuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM4LnR4dCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgaXRlcmF0b3JzLl9zdHJ1Y3R1cmUobXNnLCBzZnApCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCittdWx0aXBhcnQvbWl4ZWQKKyAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgbXVsdGlwYXJ0L2FsdGVybmF0aXZlCisgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9wbGFpbgorIiIiKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX3dpdGhfc2FtZV9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtc2cgMzkudHh0IGlzIHNpbWlsYXJseSBldmlsIGluIHRoYXQgaXQncyBnb3QgaW5uZXIgcGFydHMgdGhhdCB1c2UKKyAgICAgICAgIyB0aGUgc2FtZSBib3VuZGFyeSBhcyBvdXRlciBwYXJ0cy4gIEFnYWluLCBJIGJlbGlldmUgdGhlIHdheSB0aGlzIGlzCisgICAgICAgICMgcGFyc2VkIGlzIGNsb3Nlc3QgdG8gdGhlIHNwaXJpdCBvZiBSRkMgMjA0NgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zOS50eHQnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGl0ZXJhdG9ycy5fc3RydWN0dXJlKG1zZywgc2ZwKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorbXVsdGlwYXJ0L21peGVkCisgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgIG11bHRpcGFydC9hbHRlcm5hdGl2ZQorICAgICAgICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KKyAgICAgICAgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCisgICAgdGV4dC9wbGFpbgorIiIiKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfaW5fbm9uX211bHRpcGFydChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuYXNfc3RyaW5nKCksICcnJ1wKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgYm91bmRhcnk9Ii0tOTYxMjg0MjM2NTUyNTIyMjY5IgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5CitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdCaXQKKworPGh0bWw+PC9odG1sPgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5LS0KKycnJykKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJ5X3dpdGhfbGVhZGluZ19zcGFjZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoJycnXAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iICAgIFhYWFgiCisKKy0tICAgIFhYWFgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCisKKy0tICAgIFhYWFgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCistLSAgICBYWFhYLS0KKycnJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnICAgIFhYWFgnKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfd2l0aG91dF90cmFpbGluZ19uZXdsaW5lKHNlbGYpOgorICAgICAgICBtID0gUGFyc2VyKCkucGFyc2VzdHIoIiIiXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9PT09PT09PT09PT09PT0wMDEyMzk0MTY0PT0iCitNSU1FLVZlcnNpb246IDEuMAorCistLT09PT09PT09PT09PT09PTAwMTIzOTQxNjQ9PQorQ29udGVudC1UeXBlOiBpbWFnZS9maWxlMS5qcGcKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWVhOa1pnPT0KKy0tPT09PT09PT09PT09PT09MDAxMjM5NDE2ND09LS0iIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG0uZ2V0X3BheWxvYWQoMCkuZ2V0X3BheWxvYWQoKSwgJ1lYTmtaZz09JykKKworCisMCisjIFRlc3Qgc29tZSBiYWRseSBmb3JtYXR0ZWQgbWVzc2FnZXMKK2NsYXNzIFRlc3ROb25Db25mb3JtYW50KFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X3BhcnNlX21pc3NpbmdfbWlub3JfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE0LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X3NhbWVfYm91bmRhcnlfaW5uZXJfb3V0ZXIoc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNS50eHQnKQorICAgICAgICAjIFhYWCBXZSBjYW4gcHJvYmFibHkgZXZlbnR1YWxseSBkbyBiZXR0ZXIKKyAgICAgICAgaW5uZXIgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgdW5sZXNzKGhhc2F0dHIoaW5uZXIsICdkZWZlY3RzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGlubmVyLmRlZmVjdHMpLCAxKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShpbm5lci5kZWZlY3RzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9ub19ib3VuZGFyeShzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI1LnR4dCcpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZGVmZWN0cyksIDIpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLCBlcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QpKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9jb250ZW50X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgICMgUkZDIDIwNDUsICQ1LjIgc2F5cyBpbnZhbGlkIHlpZWxkcyB0ZXh0L3BsYWluCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAndGV4dCcKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICAjIENsZWFyIHRoZSBvbGQgdmFsdWUgYW5kIHRyeSBzb21ldGhpbmcgL3JlYWxseS8gaW52YWxpZAorICAgICAgICBkZWwgbXNnWydjb250ZW50LXR5cGUnXQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ2ZvbycKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICAjIFN0aWxsLCBtYWtlIHN1cmUgdGhhdCB0aGUgbWVzc2FnZSBpcyBpZGVtcG90ZW50bHkgZ2VuZXJhdGVkCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocykKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgbmVxKHMuZ2V0dmFsdWUoKSwgJ0NvbnRlbnQtVHlwZTogZm9vXG5cbicpCisKKyAgICBkZWYgdGVzdF9ub19zdGFydF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzEudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICIiIlwKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK21lc3NhZ2UgMgorCistLUJPVU5EQVJZLS0KKyIiIikKKworICAgIGRlZiB0ZXN0X25vX3NlcGFyYXRpbmdfYmxhbmtfbGluZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzUudHh0JykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IGhlcmUncyBzb21ldGhpbmcgaW50ZXJlc3RpbmcKKworY291bnRlciB0byBSRkMgMjgyMiwgdGhlcmUncyBubyBzZXBhcmF0aW5nIG5ld2xpbmUgaGVyZQorIiIiKQorCisgICAgZGVmIHRlc3RfbHlpbmdfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDEudHh0JykKKyAgICAgICAgdW5sZXNzKGhhc2F0dHIobXNnLCAnZGVmZWN0cycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZGVmZWN0cyksIDIpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLCBlcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QpKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19zdGFydF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgb3V0ZXIgPSBzZWxmLl9tc2dvYmooJ21zZ180Mi50eHQnKQorICAgICAgICAjIFRoZSBtZXNzYWdlIHN0cnVjdHVyZSBpczoKKyAgICAgICAgIworICAgICAgICAjIG11bHRpcGFydC9taXhlZAorICAgICAgICAjICAgIHRleHQvcGxhaW4KKyAgICAgICAgIyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICAgICBtdWx0aXBhcnQvbWl4ZWQgWypdCisgICAgICAgICMKKyAgICAgICAgIyBbKl0gVGhpcyBtZXNzYWdlIGlzIG1pc3NpbmcgaXRzIHN0YXJ0IGJvdW5kYXJ5CisgICAgICAgIGJhZCA9IG91dGVyLmdldF9wYXlsb2FkKDEpLmdldF9wYXlsb2FkKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJhZC5kZWZlY3RzKSwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoYmFkLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpKQorCisgICAgZGVmIHRlc3RfZmlyc3RfbGluZV9pc19jb250aW51YXRpb25faGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICcgTGluZSAxXG5MaW5lIDJcbkxpbmUgMycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShtc2cua2V5cygpLCBbXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdMaW5lIDJcbkxpbmUgMycpCisgICAgICAgIGVxKGxlbihtc2cuZGVmZWN0cyksIDEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuRmlyc3RIZWFkZXJMaW5lSXNDb250aW51YXRpb25EZWZlY3QpKQorICAgICAgICBlcShtc2cuZGVmZWN0c1swXS5saW5lLCAnIExpbmUgMVxuJykKKworCisMCisjIFRlc3QgUkZDIDIwNDcgaGVhZGVyIGVuY29kaW5nIGFuZCBkZWNvZGluZworY2xhc3MgVGVzdFJGQzIwNDcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3JmYzIwNDdfbXVsdGlsaW5lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICIiIlJlOiA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IGJhegorIGZvbyBiYXIgPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSIiIgorICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoZGgsIFsKKyAgICAgICAgICAgIChiJ1JlOicsIE5vbmUpLAorICAgICAgICAgICAgKGInclx4OGFrc21ceDlhcmdceDhjcycsICdtYWMtaWNlbGFuZCcpLAorICAgICAgICAgICAgKGInYmF6IGZvbyBiYXInLCBOb25lKSwKKyAgICAgICAgICAgIChiJ3JceDhha3NtXHg5YXJnXHg4Y3MnLCAnbWFjLWljZWxhbmQnKV0pCisgICAgICAgIGhlYWRlciA9IG1ha2VfaGVhZGVyKGRoKQorICAgICAgICBlcShzdHIoaGVhZGVyKSwKKyAgICAgICAgICAgJ1JlOiByXHhlNGtzbVx4ZjZyZ1x4ZTVzIGJheiBmb28gYmFyIHJceGU0a3NtXHhmNnJnXHhlNXMnKQorICAgICAgICBlcShoZWFkZXIuZW5jb2RlKCksCisgICAgICAgICAgICIiIlJlOiA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IGJheiBmb28gYmFyCisgPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSIiIikKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfZWF0ZXJfdW5pY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnPT9JU08tODg1OS0xP1E/QW5kcj1FOT89IFBpcmFyZCA8cGlyYXJkQGRvbS5haW4+JworICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoZGgsIFsoYidBbmRyXHhlOScsICdpc28tODg1OS0xJyksCisgICAgICAgICAgICAgICAgKGInUGlyYXJkIDxwaXJhcmRAZG9tLmFpbj4nLCBOb25lKV0pCisgICAgICAgIGhlYWRlciA9IHN0cihtYWtlX2hlYWRlcihkaCkpCisgICAgICAgIGVxKGhlYWRlciwgJ0FuZHJceGU5IFBpcmFyZCA8cGlyYXJkQGRvbS5haW4+JykKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfZWF0ZXJfdW5pY29kZV8yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdUaGUgPT9pc28tODg1OS0xP2I/Y1hWcFkyc2dZbkp2ZDI0Z1ptOTQ/PSBqdW1wZWQgb3ZlciB0aGUgPT9pc28tODg1OS0xP2I/YkdGNmVTQmtiMmM9Pz0nCisgICAgICAgIGRoID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShkaCwgWyhiJ1RoZScsIE5vbmUpLCAoYidxdWljayBicm93biBmb3gnLCAnaXNvLTg4NTktMScpLAorICAgICAgICAgICAgICAgIChiJ2p1bXBlZCBvdmVyIHRoZScsIE5vbmUpLCAoYidsYXp5IGRvZycsICdpc28tODg1OS0xJyldKQorICAgICAgICBodSA9IHN0cihtYWtlX2hlYWRlcihkaCkpCisgICAgICAgIGVxKGh1LCAnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cnKQorCisgICAgZGVmIHRlc3RfcmZjMjA0N19taXNzaW5nX3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIHMgPSAnU209P0lTTy04ODU5LTE/Qj85Zz09Pz1yZz0/SVNPLTg4NTktMT9CPzVRPT0/PXNib3JkJworICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaCwgWyhzLCBOb25lKV0pCisKKyAgICBkZWYgdGVzdF9yZmMyMDQ3X3dpdGhfd2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgcyA9ICdTbSA9P0lTTy04ODU5LTE/Qj85Zz09Pz0gcmcgPT9JU08tODg1OS0xP0I/NVE9PT89IHNib3JkJworICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaCwgWyhiJ1NtJywgTm9uZSksIChiJ1x4ZjYnLCAnaXNvLTg4NTktMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGIncmcnLCBOb25lKSwgKGInXHhlNScsICdpc28tODg1OS0xJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYidzYm9yZCcsIE5vbmUpXSkKKworCisMCisjIFRlc3QgdGhlIE1JTUVNZXNzYWdlIGNsYXNzCitjbGFzcyBUZXN0TUlNRU1lc3NhZ2UoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW5maWxlKCdtc2dfMTEudHh0JykgYXMgZnA6CisgICAgICAgICAgICBzZWxmLl90ZXh0ID0gZnAucmVhZCgpCisKKyAgICBkZWYgdGVzdF90eXBlX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIE1JTUVNZXNzYWdlLCAnYSBwbGFpbiBzdHJpbmcnKQorCisgICAgZGVmIHRlc3RfdmFsaWRfYXJndW1lbnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgc3ViamVjdCA9ICdBIHN1Yi1tZXNzYWdlJworICAgICAgICBtID0gTWVzc2FnZSgpCisgICAgICAgIG1bJ1N1YmplY3QnXSA9IHN1YmplY3QKKyAgICAgICAgciA9IE1JTUVNZXNzYWdlKG0pCisgICAgICAgIGVxKHIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gci5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1YnBhcnQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhzdWJwYXJ0IGlzIG0pCisgICAgICAgIGVxKHN1YnBhcnRbJ3N1YmplY3QnXSwgc3ViamVjdCkKKworICAgIGRlZiB0ZXN0X2JhZF9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cxID0gTWVzc2FnZSgpCisgICAgICAgIG1zZzFbJ1N1YmplY3QnXSA9ICdzdWJwYXJ0IDEnCisgICAgICAgIG1zZzIgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnMlsnU3ViamVjdCddID0gJ3N1YnBhcnQgMicKKyAgICAgICAgciA9IE1JTUVNZXNzYWdlKG1zZzEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5NdWx0aXBhcnRDb252ZXJzaW9uRXJyb3IsIHIuYXR0YWNoLCBtc2cyKQorCisgICAgZGVmIHRlc3RfZ2VuZXJhdGUoc2VsZik6CisgICAgICAgICMgRmlyc3QgY3JhZnQgdGhlIG1lc3NhZ2UgdG8gYmUgZW5jYXBzdWxhdGVkCisgICAgICAgIG0gPSBNZXNzYWdlKCkKKyAgICAgICAgbVsnU3ViamVjdCddID0gJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnCisgICAgICAgIG0uc2V0X3BheWxvYWQoJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQorICAgICAgICByID0gTUlNRU1lc3NhZ2UobSkKKyAgICAgICAgclsnU3ViamVjdCddID0gJ1RoZSBlbmNsb3NpbmcgbWVzc2FnZScKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4ocikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICIiIlwKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBUaGUgZW5jbG9zaW5nIG1lc3NhZ2UKKworU3ViamVjdDogQW4gZW5jbG9zZWQgbWVzc2FnZQorCitIZXJlIGlzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorIiIiKQorCisgICAgZGVmIHRlc3RfcGFyc2VfbWVzc2FnZV9yZmM4MjIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTEudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1Ym1zZyA9IHBheWxvYWRbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc3VibXNnLCBNZXNzYWdlKSkKKyAgICAgICAgZXEoc3VibXNnWydzdWJqZWN0J10sICdBbiBlbmNsb3NlZCBtZXNzYWdlJykKKyAgICAgICAgZXEoc3VibXNnLmdldF9wYXlsb2FkKCksICdIZXJlIGlzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLlxuJykKKworICAgIGRlZiB0ZXN0X2RzbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICAjIG1zZyAxNiBpcyBhIERlbGl2ZXJ5IFN0YXR1cyBOb3RpZmljYXRpb24sIHNlZSBSRkMgMTg5NAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNi50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgIHVubGVzcyhtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisgICAgICAgICMgU3VicGFydCAxIGlzIGEgdGV4dC9wbGFpbiwgaHVtYW4gcmVhZGFibGUgc2VjdGlvbgorICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSwgIiIiXAorVGhpcyByZXBvcnQgcmVsYXRlcyB0byBhIG1lc3NhZ2UgeW91IHNlbnQgd2l0aCB0aGUgZm9sbG93aW5nIGhlYWRlciBmaWVsZHM6CisKKyAgTWVzc2FnZS1pZDogPDAwMjAwMWMxNDRhNiQ4NzUyZTA2MCQ1NjEwNDU4NkBveHkuZWR1PgorICBEYXRlOiBTdW4sIDIzIFNlcCAyMDAxIDIwOjEwOjU1IC0wNzAwCisgIEZyb206ICJJYW4gVC4gSGVucnkiIDxoZW5yeWlAb3h5LmVkdT4KKyAgVG86IFNvQ2FsIFJhdmVzIDxzY3JAc29jYWwtcmF2ZXMub3JnPgorICBTdWJqZWN0OiBbc2NyXSB5ZWFoIGZvciBJYW5zISEKKworWW91ciBtZXNzYWdlIGNhbm5vdCBiZSBkZWxpdmVyZWQgdG8gdGhlIGZvbGxvd2luZyByZWNpcGllbnRzOgorCisgIFJlY2lwaWVudCBhZGRyZXNzOiBqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUKKyAgUmVhc29uOiByZWNpcGllbnQgcmVhY2hlZCBkaXNrIHF1b3RhCisKKyIiIikKKyAgICAgICAgIyBTdWJwYXJ0IDIgY29udGFpbnMgdGhlIG1hY2hpbmUgcGFyc2FibGUgRFNOIGluZm9ybWF0aW9uLiAgSXQKKyAgICAgICAgIyBjb25zaXN0cyBvZiB0d28gYmxvY2tzIG9mIGhlYWRlcnMsIHJlcHJlc2VudGVkIGJ5IHR3byBuZXN0ZWQgTWVzc2FnZQorICAgICAgICAjIG9iamVjdHMuCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cycpCisgICAgICAgIGVxKGxlbihzdWJwYXJ0LmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIHNob3VsZCB0cmVhdCBlYWNoIGJsb2NrIGFzIGEgYnVuY2ggb2YKKyAgICAgICAgIyBoZWFkZXJzLCBpLmUuIGEgYnVuY2ggb2YgTWVzc2FnZSBvYmplY3RzLgorICAgICAgICBkc24xID0gc3VicGFydC5nZXRfcGF5bG9hZCgwKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShkc24xLCBNZXNzYWdlKSkKKyAgICAgICAgZXEoZHNuMVsnb3JpZ2luYWwtZW52ZWxvcGUtaWQnXSwgJzBHSzUwMEI0SEQwODg4QGNvdWdhci5ub2MudWNsYS5lZHUnKQorICAgICAgICBlcShkc24xLmdldF9wYXJhbSgnZG5zJywgaGVhZGVyPSdyZXBvcnRpbmctbXRhJyksICcnKQorICAgICAgICAjIFRyeSBhIG1pc3Npbmcgb25lIDx3aW5rPgorICAgICAgICBlcShkc24xLmdldF9wYXJhbSgnbnNkJywgaGVhZGVyPSdyZXBvcnRpbmctbXRhJyksIE5vbmUpCisgICAgICAgIGRzbjIgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDEpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGRzbjIsIE1lc3NhZ2UpKQorICAgICAgICBlcShkc24yWydhY3Rpb24nXSwgJ2ZhaWxlZCcpCisgICAgICAgIGVxKGRzbjIuZ2V0X3BhcmFtcyhoZWFkZXI9J29yaWdpbmFsLXJlY2lwaWVudCcpLAorICAgICAgICAgICBbKCdyZmM4MjInLCAnJyksICgnamFuZ2VsMUBjb3VnYXIubm9jLnVjbGEuZWR1JywgJycpXSkKKyAgICAgICAgZXEoZHNuMi5nZXRfcGFyYW0oJ3JmYzgyMicsIGhlYWRlcj0nZmluYWwtcmVjaXBpZW50JyksICcnKQorICAgICAgICAjIFN1YnBhcnQgMyBpcyB0aGUgb3JpZ2luYWwgbWVzc2FnZQorICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDIpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gc3VicGFydC5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1YnN1YnBhcnQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnN1YnBhcnQsIE1lc3NhZ2UpKQorICAgICAgICBlcShzdWJzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShzdWJzdWJwYXJ0WydtZXNzYWdlLWlkJ10sCisgICAgICAgICAgICc8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+JykKKworICAgIGRlZiB0ZXN0X2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICB3aXRoIG9wZW5maWxlKCdtc2dfMjEudHh0JykgYXMgZnA6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0Zyb20nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snVG8nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gJ1Rlc3QnCisgICAgICAgIG1zZy5wcmVhbWJsZSA9ICdNSU1FIG1lc3NhZ2UnCisgICAgICAgIG1zZy5lcGlsb2d1ZSA9ICdFbmQgb2YgTUlNRSBtZXNzYWdlXG4nCisgICAgICAgIG1zZzEgPSBNSU1FVGV4dCgnT25lJykKKyAgICAgICAgbXNnMiA9IE1JTUVUZXh0KCdUd28nKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9taXhlZCcsIGJvdW5kYXJ5PSdCT1VOREFSWScpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMSkKKyAgICAgICAgbXNnLmF0dGFjaChtc2cyKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X25vX25sX3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1RvJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdUZXN0JworICAgICAgICBtc2cucHJlYW1ibGUgPSAnTUlNRSBtZXNzYWdlJworICAgICAgICBtc2cuZXBpbG9ndWUgPSAnJworICAgICAgICBtc2cxID0gTUlNRVRleHQoJ09uZScpCisgICAgICAgIG1zZzIgPSBNSU1FVGV4dCgnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvbWl4ZWQnLCBib3VuZGFyeT0nQk9VTkRBUlknKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzEpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMikKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IFRlc3QKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKK01JTUUgbWVzc2FnZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK09uZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK1R3bworLS1CT1VOREFSWS0tCisiIiIpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB3aXRoIG9wZW5maWxlKCdtc2dfMzAudHh0JykgYXMgZnA6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgY29udGFpbmVyMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBjb250YWluZXIxYSA9IGNvbnRhaW5lcjEuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBjb250YWluZXIyYSA9IGNvbnRhaW5lcjIuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlX3dpdGhfZXhwbGljaXRfY29udGFpbmVyX3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB3aXRoIG9wZW5maWxlKCdtc2dfMjgudHh0JykgYXMgZnA6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgY29udGFpbmVyMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBjb250YWluZXIxYSA9IGNvbnRhaW5lcjEuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBjb250YWluZXIyYSA9IGNvbnRhaW5lcjIuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlX25vbl9wYXJzZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBTZXQgdXAgY29udGFpbmVyCisgICAgICAgIGNvbnRhaW5lciA9IE1JTUVNdWx0aXBhcnQoJ2RpZ2VzdCcsICdCT1VOREFSWScpCisgICAgICAgIGNvbnRhaW5lci5lcGlsb2d1ZSA9ICcnCisgICAgICAgICMgU2V0IHVwIHN1YnBhcnRzCisgICAgICAgIHN1YnBhcnQxYSA9IE1JTUVUZXh0KCdtZXNzYWdlIDFcbicpCisgICAgICAgIHN1YnBhcnQyYSA9IE1JTUVUZXh0KCdtZXNzYWdlIDJcbicpCisgICAgICAgIHN1YnBhcnQxID0gTUlNRU1lc3NhZ2Uoc3VicGFydDFhKQorICAgICAgICBzdWJwYXJ0MiA9IE1JTUVNZXNzYWdlKHN1YnBhcnQyYSkKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChzdWJwYXJ0MSkKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChzdWJwYXJ0MikKKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCitNSU1FLVZlcnNpb246IDEuMAorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworbWVzc2FnZSAxCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisnJycpCisgICAgICAgIGRlbCBzdWJwYXJ0MVsnY29udGVudC10eXBlJ10KKyAgICAgICAgZGVsIHN1YnBhcnQxWydtaW1lLXZlcnNpb24nXQorICAgICAgICBkZWwgc3VicGFydDJbJ2NvbnRlbnQtdHlwZSddCisgICAgICAgIGRlbCBzdWJwYXJ0MlsnbWltZS12ZXJzaW9uJ10KKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorCistLUJPVU5EQVJZCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQorJycnKQorCisgICAgZGVmIHRlc3RfbWltZV9hdHRhY2htZW50c19pbl9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHRleHQxID0gTUlNRVRleHQoJycpCisgICAgICAgIHRleHQyID0gTUlNRVRleHQoJycpCisgICAgICAgIG1zZyA9IE1JTUVNdWx0aXBhcnQoX3N1YnBhcnRzPSh0ZXh0MSwgdGV4dDIpKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMCksIHRleHQxKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMSksIHRleHQyKQorCisKKwwKKyMgQSBnZW5lcmFsIHRlc3Qgb2YgcGFyc2VyLT5tb2RlbC0+Z2VuZXJhdG9yIGlkZW1wb3RlbmN5LiAgSU9XLCByZWFkIGEgbWVzc2FnZQorIyBpbiwgcGFyc2UgaXQgaW50byBhIG1lc3NhZ2Ugb2JqZWN0IHRyZWUsIHRoZW4gd2l0aG91dCB0b3VjaGluZyB0aGUgdHJlZSwKKyMgcmVnZW5lcmF0ZSB0aGUgcGxhaW4gdGV4dC4gIFRoZSBvcmlnaW5hbCB0ZXh0IGFuZCB0aGUgdHJhbnNmb3JtZWQgdGV4dAorIyBzaG91bGQgYmUgaWRlbnRpY2FsLiAgTm90ZTogdGhhdCB3ZSBpZ25vcmUgdGhlIFVuaXgtRnJvbSBzaW5jZSB0aGF0IG1heQorIyBjb250YWluIGEgY2hhbmdlZCBkYXRlLgorY2xhc3MgVGVzdElkZW1wb3RlbnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIF9tc2dvYmooc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICB3aXRoIG9wZW5maWxlKGZpbGVuYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhkYXRhKQorICAgICAgICByZXR1cm4gbXNnLCBkYXRhCisKKyAgICBkZWYgX2lkZW1wb3RlbnQoc2VsZiwgbXNnLCB0ZXh0KToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEodGV4dCwgcy5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHRlc3RfcGFyc2VfdGV4dF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKVsxXSwgKCdjaGFyc2V0JywgJ3VzLWFzY2lpJykpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCBOb25lKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsIE5vbmUpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfcGFyc2VfdW50eXBlZF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCBOb25lKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfTUlNRV9kaWdlc3Qoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAyLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXIoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzI3LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfTUlNRV9kaWdlc3Rfd2l0aF9wYXJ0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbWl4ZWRfd2l0aF9pbWFnZShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDYudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfcmVwb3J0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2RzbihzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMTYudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9wcmVhbWJsZV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjEudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfb25lX3BhcnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzIzLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX3BhcnRzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yNC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X25vX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zMS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfY2hhcnNldChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzIudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tb3JlX3JmYzIyMzFfcGFyYW1ldGVycyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzMudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF90ZXh0X3BsYWluX2luX2FfbXVsdGlwYXJ0X2RpZ2VzdChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzQudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfbXVsdGlwYXJ0X21peGVkcyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMTJhLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9leHRlcm5hbF9ib2R5X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzM2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfY29udGVudF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgICMgVGVzdCB0aGUgQ29udGVudC1UeXBlOiBwYXJhbWV0ZXJzCisgICAgICAgIHBhcmFtcyA9IHt9CisgICAgICAgIGZvciBwaywgcHYgaW4gbXNnLmdldF9wYXJhbXMoKToKKyAgICAgICAgICAgIHBhcmFtc1twa10gPSBwdgorICAgICAgICBlcShwYXJhbXNbJ3JlcG9ydC10eXBlJ10sICdkZWxpdmVyeS1zdGF0dXMnKQorICAgICAgICBlcShwYXJhbXNbJ2JvdW5kYXJ5J10sICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJykKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCAnVGhpcyBpcyBhIE1JTUUtZW5jYXBzdWxhdGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsICdcbicpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdWJwYXJ0cyBhcmUgd2hhdCB3ZSBleHBlY3QKKyAgICAgICAgbXNnMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShtc2cyLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cyLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMyA9IG1zZy5nZXRfcGF5bG9hZCgyKQorICAgICAgICBlcShtc2czLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMywgTWVzc2FnZSkpCisgICAgICAgIHBheWxvYWQgPSBtc2czLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgbXNnNCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnNCwgTWVzc2FnZSkpCisgICAgICAgIGVxKG1zZzQuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQorCisgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNi50eHQnKQorICAgICAgICAjIENoZWNrIHNvbWUgb2YgdGhlIG91dGVyIGhlYWRlcnMKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHBheWxvYWQgaXMgYSBsaXN0IG9mIGV4YWN0bHkgb25lIHN1Yi1NZXNzYWdlLCBhbmQgdGhhdAorICAgICAgICAjIHRoYXQgc3VibWVzc2FnZSBoYXMgYSB0eXBlIG9mIHRleHQvcGxhaW4KKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIG1zZzEgPSBwYXlsb2FkWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzEsIE1lc3NhZ2UpKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIGVxKG1zZzEuZ2V0X3BheWxvYWQoKSwgJ1xuJykKKworCisMCisjIFRlc3QgdmFyaW91cyBvdGhlciBiaXRzIG9mIHRoZSBwYWNrYWdlJ3MgZnVuY3Rpb25hbGl0eQorY2xhc3MgVGVzdE1pc2NlbGxhbmVvdXMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpIGFzIGZwOgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQpCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgICMgRG9uJ3Qgd3JhcC9jb250aW51ZSBsb25nIGhlYWRlcnMgc2luY2Ugd2UncmUgdHJ5aW5nIHRvIHRlc3QKKyAgICAgICAgIyBpZGVtcG90ZW5jeS4KKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzLmdldHZhbHVlKCkpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpIGFzIGZwOgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICAgICAgZnAuc2VlaygwKQorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgIyBEb24ndCB3cmFwL2NvbnRpbnVlIGxvbmcgaGVhZGVycyBzaW5jZSB3ZSdyZSB0cnlpbmcgdG8gdGVzdAorICAgICAgICAgICAgIyBpZGVtcG90ZW5jeS4KKyAgICAgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWF4aGVhZGVybGVuPTApCisgICAgICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzLmdldHZhbHVlKCkpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fc3RyaW5nX3dpdGhfY2xhc3Moc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB3aXRoIG9wZW5maWxlKCdtc2dfMDEudHh0JykgYXMgZnA6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisKKyAgICAgICAgIyBDcmVhdGUgYSBzdWJjbGFzcworICAgICAgICBjbGFzcyBNeU1lc3NhZ2UoTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh0ZXh0LCBNeU1lc3NhZ2UpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZywgTXlNZXNzYWdlKSkKKyAgICAgICAgIyBUcnkgc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQKKyAgICAgICAgd2l0aCBvcGVuZmlsZSgnbXNnXzAyLnR4dCcpIGFzIGZwOgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQsIE15TWVzc2FnZSkKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fZmlsZV93aXRoX2NsYXNzKHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgIyBDcmVhdGUgYSBzdWJjbGFzcworICAgICAgICBjbGFzcyBNeU1lc3NhZ2UoTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpIGFzIGZwOgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnAsIE15TWVzc2FnZSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpKQorICAgICAgICAjIFRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZAorICAgICAgICB3aXRoIG9wZW5maWxlKCdtc2dfMDIudHh0JykgYXMgZnA6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCwgTXlNZXNzYWdlKQorICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cud2FsaygpOgorICAgICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3VicGFydCwgTXlNZXNzYWdlKSkKKworICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXygnZW1haWwnKQorICAgICAgICAjIENhbid0IHVzZSBzb3J0ZWQoKSBoZXJlIGR1ZSB0byBQeXRob24gMi4zIGNvbXBhdGliaWxpdHkKKyAgICAgICAgYWxsID0gbW9kdWxlLl9fYWxsX19bOl0KKyAgICAgICAgYWxsLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbCwgWworICAgICAgICAgICAgJ2Jhc2U2NG1pbWUnLCAnY2hhcnNldCcsICdlbmNvZGVycycsICdlcnJvcnMnLCAnZ2VuZXJhdG9yJywKKyAgICAgICAgICAgICdoZWFkZXInLCAnaXRlcmF0b3JzJywgJ21lc3NhZ2UnLCAnbWVzc2FnZV9mcm9tX2ZpbGUnLAorICAgICAgICAgICAgJ21lc3NhZ2VfZnJvbV9zdHJpbmcnLCAnbWltZScsICdwYXJzZXInLAorICAgICAgICAgICAgJ3F1b3ByaW1pbWUnLCAndXRpbHMnLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdGRhdGUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VkYXRlKHV0aWxzLmZvcm1hdGRhdGUobm93KSlbOjZdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuZ210aW1lKG5vdylbOjZdKQorCisgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZV9sb2NhbHRpbWUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5wYXJzZWRhdGUodXRpbHMuZm9ybWF0ZGF0ZShub3csIGxvY2FsdGltZT1UcnVlKSlbOjZdLAorICAgICAgICAgICAgdGltZS5sb2NhbHRpbWUobm93KVs6Nl0pCisKKyAgICBkZWYgdGVzdF9mb3JtYXRkYXRlX3VzZWdtdChzZWxmKToKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGRhdGUobm93LCBsb2NhbHRpbWU9RmFsc2UpLAorICAgICAgICAgICAgdGltZS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIC0wMDAwJywgdGltZS5nbXRpbWUobm93KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRkYXRlKG5vdywgbG9jYWx0aW1lPUZhbHNlLCB1c2VnbXQ9VHJ1ZSksCisgICAgICAgICAgICB0aW1lLnN0cmZ0aW1lKCclYSwgJWQgJWIgJVkgJUg6JU06JVMgR01UJywgdGltZS5nbXRpbWUobm93KSkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfbm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWRhdGUoJycpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2NvbXBhY3Qoc2VsZik6CisgICAgICAgICMgVGhlIEZXUyBhZnRlciB0aGUgY29tbWEgaXMgb3B0aW9uYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWRhdGUoJ1dlZCwzIEFwciAyMDAyIDE0OjU4OjI2ICswODAwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMucGFyc2VkYXRlKCdXZWQsIDMgQXByIDIwMDIgMTQ6NTg6MjYgKzA4MDAnKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5wYXJzZWRhdGVfdHooJzI1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICgyMDAzLCAyLCAyNSwgMTMsIDQ3LCAyNiwgMCwgMSwgLTEsIC0yODgwMCkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfY29tcGFjdF9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5wYXJzZWRhdGVfdHooJzUgRmViIDIwMDMgMTM6NDc6MjYgLTA4MDAnKSwKKyAgICAgICAgICAgKDIwMDMsIDIsIDUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2FjY2VwdGFibGVfdG9fdGltZV9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB0aW1ldHVwID0gdXRpbHMucGFyc2VkYXRlKCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwKSkKKyAgICAgICAgZXEodGltZS5sb2NhbHRpbWUodClbOjZdLCB0aW1ldHVwWzo2XSkKKyAgICAgICAgZXEoaW50KHRpbWUuc3RyZnRpbWUoJyVZJywgdGltZXR1cCkpLCAyMDAzKQorICAgICAgICB0aW1ldHVwID0gdXRpbHMucGFyc2VkYXRlX3R6KCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwWzo5XSkpCisgICAgICAgIGVxKHRpbWUubG9jYWx0aW1lKHQpWzo2XSwgdGltZXR1cFs6Nl0pCisgICAgICAgIGVxKGludCh0aW1lLnN0cmZ0aW1lKCclWScsIHRpbWV0dXBbOjldKSksIDIwMDMpCisKKyAgICBkZWYgdGVzdF9wYXJzZWFkZHJfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKCc8PicpLCAoJycsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5mb3JtYXRhZGRyKHV0aWxzLnBhcnNlYWRkcignPD4nKSksICcnKQorCisgICAgZGVmIHRlc3Rfbm9xdW90ZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0EgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgJ0EgU2lsbHkgUGVyc29uIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2R1bXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRhZGRyKCgnQSAoVmVyeSkgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQSBcKFZlcnlcKSBTaWxseSBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBIFwoU3BlY2lhbFwpIFBlcnNvbicKKyAgICAgICAgYiA9ICdwZXJzb25AZG9tLmFpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWFkZHIodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpKSwgKGEsIGIpKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2JhY2tzbGFzaGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0FydGh1ciBcQmFja3NsYXNoXCBGb29iYXInLCAncGVyc29uQGRvbS5haW4nKSksCisgICAgICAgICAgICByJyJBcnRodXIgXFxCYWNrc2xhc2hcXCBGb29iYXIiIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBcnRodXIgXEJhY2tzbGFzaFwgRm9vYmFyJworICAgICAgICBiID0gJ3BlcnNvbkBkb20uYWluJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcih1dGlscy5mb3JtYXRhZGRyKChhLCBiKSkpLCAoYSwgYikpCisKKyAgICBkZWYgdGVzdF9uYW1lX3dpdGhfZG90KHNlbGYpOgorICAgICAgICB4ID0gJ0pvaG4gWC4gRG9lIDxqeGRAZXhhbXBsZS5jb20+JworICAgICAgICB5ID0gJyJKb2huIFguIERvZSIgPGp4ZEBleGFtcGxlLmNvbT4nCisgICAgICAgIGEsIGIgPSAoJ0pvaG4gWC4gRG9lJywgJ2p4ZEBleGFtcGxlLmNvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHgpLCAoYSwgYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHkpLCAoYSwgYikpCisgICAgICAgICMgZm9ybWF0YWRkcigpIHF1b3RlcyB0aGUgbmFtZSBpZiB0aGVyZSdzIGEgZG90IGluIGl0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpLCB5KQorCisgICAgZGVmIHRlc3RfbXVsdGlsaW5lX2Zyb21fY29tbWVudChzZWxmKToKKyAgICAgICAgeCA9ICIiIlwKK0ZvbworXHRCYXIgPGZvb0BleGFtcGxlLmNvbT4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWFkZHIoeCksICgnRm9vIEJhcicsICdmb29AZXhhbXBsZS5jb20nKSkKKworICAgIGRlZiB0ZXN0X3F1b3RlX2R1bXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRhZGRyKCgnQSBTaWxseTsgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQSBTaWxseTsgUGVyc29uIiA8cGVyc29uQGRvbS5haW4+JykKKworICAgIGRlZiB0ZXN0X2ZpeF9lb2xzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvJyksICdoZWxsbycpCisgICAgICAgIGVxKHV0aWxzLmZpeF9lb2xzKCdoZWxsb1xuJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG9ccicpLCAnaGVsbG9cclxuJykKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvXHJcbicpLCAnaGVsbG9cclxuJykKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvXG5ccicpLCAnaGVsbG9cclxuXHJcbicpCisKKyAgICBkZWYgdGVzdF9jaGFyc2V0X3JpY2hjb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lID0gc2VsZi5mYWlsSWZFcXVhbAorICAgICAgICBjc2V0MSA9IENoYXJzZXQoKQorICAgICAgICBjc2V0MiA9IENoYXJzZXQoKQorICAgICAgICBlcShjc2V0MSwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEoY3NldDEsICdVUy1BU0NJSScpCisgICAgICAgIGVxKGNzZXQxLCAnVXMtQXNDaUknKQorICAgICAgICBlcSgndXMtYXNjaWknLCBjc2V0MSkKKyAgICAgICAgZXEoJ1VTLUFTQ0lJJywgY3NldDEpCisgICAgICAgIGVxKCdVcy1Bc0NpSScsIGNzZXQxKQorICAgICAgICBuZShjc2V0MSwgJ3VzYXNjaWknKQorICAgICAgICBuZShjc2V0MSwgJ1VTQVNDSUknKQorICAgICAgICBuZShjc2V0MSwgJ1VzQXNDaUknKQorICAgICAgICBuZSgndXNhc2NpaScsIGNzZXQxKQorICAgICAgICBuZSgnVVNBU0NJSScsIGNzZXQxKQorICAgICAgICBuZSgnVXNBc0NpSScsIGNzZXQxKQorICAgICAgICBlcShjc2V0MSwgY3NldDIpCisgICAgICAgIGVxKGNzZXQyLCBjc2V0MSkKKworICAgIGRlZiB0ZXN0X2dldGFkZHJlc3NlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHV0aWxzLmdldGFkZHJlc3NlcyhbJ2FwZXJzb25AZG9tLmFpbiAoQWwgUGVyc29uKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0J1ZCBQZXJzb24gPGJwZXJzb25AZG9tLmFpbj4nXSksCisgICAgICAgICAgIFsoJ0FsIFBlcnNvbicsICdhcGVyc29uQGRvbS5haW4nKSwKKyAgICAgICAgICAgICgnQnVkIFBlcnNvbicsICdicGVyc29uQGRvbS5haW4nKV0pCisKKyAgICBkZWYgdGVzdF9nZXRhZGRyZXNzZXNfbmFzdHkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5nZXRhZGRyZXNzZXMoWydmb286IDsnXSksIFsoJycsICcnKV0pCisgICAgICAgIGVxKHV0aWxzLmdldGFkZHJlc3NlcygKKyAgICAgICAgICAgWydbXSotLSA9fiQnXSksCisgICAgICAgICAgIFsoJycsICcnKSwgKCcnLCAnJyksICgnJywgJyotLScpXSkKKyAgICAgICAgZXEodXRpbHMuZ2V0YWRkcmVzc2VzKAorICAgICAgICAgICBbJ2ZvbzogOycsICciSmFzb24gUi4gTWFzdGFsZXIiIDxqYXNvbkBkb20uYWluPiddKSwKKyAgICAgICAgICAgWygnJywgJycpLCAoJ0phc29uIFIuIE1hc3RhbGVyJywgJ2phc29uQGRvbS5haW4nKV0pCisKKyAgICBkZWYgdGVzdF9nZXRhZGRyZXNzZXNfZW1iZWRkZWRfY29tbWVudChzZWxmKToKKyAgICAgICAgIiIiVGVzdCBwcm9wZXIgaGFuZGxpbmcgb2YgYSBuZXN0ZWQgY29tbWVudCIiIgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYWRkcnMgPSB1dGlscy5nZXRhZGRyZXNzZXMoWydVc2VyICgobmVzdGVkIGNvbW1lbnQpKSA8Zm9vQGJhci5jb20+J10pCisgICAgICAgIGVxKGFkZHJzWzBdWzFdLCAnZm9vQGJhci5jb20nKQorCisgICAgZGVmIHRlc3RfdXRpbHNfcXVvdGVfdW5xdW90ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Zvb1xcd2Fja3kibmFtZScpCisgICAgICAgIGVxKG1zZy5nZXRfZmlsZW5hbWUoKSwgJ2Zvb1xcd2Fja3kibmFtZScpCisKKyAgICBkZWYgdGVzdF9nZXRfYm9keV9lbmNvZGluZ193aXRoX2JvZ3VzX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KCdub3QgYSBjaGFyc2V0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCksICdiYXNlNjQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvZHlfZW5jb2Rpbmdfd2l0aF91cHBlcmNhc2VfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgnCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04JykKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCkKKyAgICAgICAgZXEobGVuKGNoYXJzZXRzKSwgMSkKKyAgICAgICAgZXEoY2hhcnNldHNbMF0sICd1dGYtOCcpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KGNoYXJzZXRzWzBdKQorICAgICAgICBlcShjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCksICdiYXNlNjQnKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2hlbGxvIHdvcmxkJywgY2hhcnNldD1jaGFyc2V0KQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2FHVnNiRzhnZDI5eWJHUT1cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIGInaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ2Jhc2U2NCcpCisgICAgICAgICMgVHJ5IGFub3RoZXIgb25lCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9IlVTLUFTQ0lJIicKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCkKKyAgICAgICAgZXEobGVuKGNoYXJzZXRzKSwgMSkKKyAgICAgICAgZXEoY2hhcnNldHNbMF0sICd1cy1hc2NpaScpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KGNoYXJzZXRzWzBdKQorICAgICAgICBlcShjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCksIGVuY29kZXJzLmVuY29kZV83b3I4Yml0KQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2hlbGxvIHdvcmxkJywgY2hhcnNldD1jaGFyc2V0KQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2NoYXJzZXRzX2Nhc2VfaW5zZW5zaXRpdmUoc2VsZik6CisgICAgICAgIGxjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICB1YyA9IENoYXJzZXQoJ1VTLUFTQ0lJJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYy5nZXRfYm9keV9lbmNvZGluZygpLCB1Yy5nZXRfYm9keV9lbmNvZGluZygpKQorCisgICAgZGVmIHRlc3RfcGFydGlhbF9mYWxsc19pbnNpZGVfbWVzc2FnZV9kZWxpdmVyeV9zdGF0dXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgVGhlIFBhcnNlciBpbnRlcmZhY2UgcHJvdmlkZXMgY2h1bmtzIG9mIGRhdGEgdG8gRmVlZFBhcnNlciBpbiA4MTkyCisgICAgICAgICMgYnl0ZSBndWxwcy4gIFNGIGJ1ZyAjMTA3NjQ4NSBmb3VuZCBvbmUgb2YgdGhvc2UgY2h1bmtzIGluc2lkZQorICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIGhlYWRlciBibG9jaywgd2hpY2ggdHJpZ2dlcmVkIGFuCisgICAgICAgICMgdW5yZWFkbGluZSgpIG9mIE5lZWRNb3JlRGF0YS4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDMudHh0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBpdGVyYXRvcnMuX3N0cnVjdHVyZShtc2csIHNmcCkKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9yZXBvcnQKKyAgICB0ZXh0L3BsYWluCisgICAgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9yZmM4MjItaGVhZGVycworIiIiKQorCisKKwwKKyMgVGVzdCB0aGUgaXRlcmF0b3IvZ2VuZXJhdG9ycworY2xhc3MgVGVzdEl0ZXJhdG9ycyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9ib2R5X2xpbmVfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBGaXJzdCBhIHNpbXBsZSBub24tbXVsdGlwYXJ0IG1lc3NhZ2UKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgaXQgPSBpdGVyYXRvcnMuYm9keV9saW5lX2l0ZXJhdG9yKG1zZykKKyAgICAgICAgbGluZXMgPSBsaXN0KGl0KQorICAgICAgICBlcShsZW4obGluZXMpLCA2KQorICAgICAgICBuZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksIG1zZy5nZXRfcGF5bG9hZCgpKQorICAgICAgICAjIE5vdyBhIG1vcmUgY29tcGxpY2F0ZWQgbXVsdGlwYXJ0CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAyLnR4dCcpCisgICAgICAgIGl0ID0gaXRlcmF0b3JzLmJvZHlfbGluZV9pdGVyYXRvcihtc2cpCisgICAgICAgIGxpbmVzID0gbGlzdChpdCkKKyAgICAgICAgZXEobGVuKGxpbmVzKSwgNDMpCisgICAgICAgIHdpdGggb3BlbmZpbGUoJ21zZ18xOS50eHQnKSBhcyBmcDoKKyAgICAgICAgICAgIG5lcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgZnAucmVhZCgpKQorCisgICAgZGVmIHRlc3RfdHlwZWRfc3VicGFydF9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIGl0ID0gaXRlcmF0b3JzLnR5cGVkX3N1YnBhcnRfaXRlcmF0b3IobXNnLCAndGV4dCcpCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgc3VicGFydHMgPSAwCisgICAgICAgIGZvciBzdWJwYXJ0IGluIGl0OgorICAgICAgICAgICAgc3VicGFydHMgKz0gMQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSkKKyAgICAgICAgZXEoc3VicGFydHMsIDIpCisgICAgICAgIGVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCAiIiJcCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KK2Egc2ltcGxlIGtpbmQgb2YgbWlycm9yCit0byByZWZsZWN0IHVwb24gb3VyIG93bgorIiIiKQorCisgICAgZGVmIHRlc3RfdHlwZWRfc3VicGFydF9pdGVyYXRvcl9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBpdCA9IGl0ZXJhdG9ycy50eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKG1zZywgJ3RleHQnLCAncGxhaW4nKQorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIHN1YnBhcnRzID0gMAorICAgICAgICBmb3Igc3VicGFydCBpbiBpdDoKKyAgICAgICAgICAgIHN1YnBhcnRzICs9IDEKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChzdWJwYXJ0LmdldF9wYXlsb2FkKCkpCisgICAgICAgIGVxKHN1YnBhcnRzLCAxKQorICAgICAgICBlcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgIiIiXAorCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKKyIiIikKKworCisMCitjbGFzcyBUZXN0UGFyc2VycyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9oZWFkZXJfcGFyc2VyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBQYXJzZSBvbmx5IHRoZSBoZWFkZXJzIG9mIGEgY29tcGxleCBtdWx0aXBhcnQgTUlNRSBkb2N1bWVudAorICAgICAgICB3aXRoIG9wZW5maWxlKCdtc2dfMDIudHh0JykgYXMgZnA6CisgICAgICAgICAgICBtc2cgPSBIZWFkZXJQYXJzZXIoKS5wYXJzZShmcCkKKyAgICAgICAgZXEobXNnWydmcm9tJ10sICdwcHAtcmVxdWVzdEB6enoub3JnJykKKyAgICAgICAgZXEobXNnWyd0byddLCAncHBwQHp6ei5vcmcnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKKyAgICAgICAgc2VsZi5mYWlsSWYobXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUaGlzIG1lc3NhZ2UgY29udGFpbnMgYSBsaW5lIGFmdGVyIHRoZSBTdWJqZWN0OiBoZWFkZXIgdGhhdCBoYXMgb25seQorICAgICAgICAjIHdoaXRlc3BhY2UsIGJ1dCBpdCBpcyBub3QgZW1wdHkhCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiB0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0CitceDIwCitEYXRlOiBNb24sIDggQXByIDIwMDIgMTU6MDk6MTkgLTA0MDAKK01lc3NhZ2UtSUQ6IHNwYW0KKworSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHkKKyIiIikKKyAgICAgICAgZXEobXNnWydzdWJqZWN0J10sICd0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0XG4gJykKKyAgICAgICAgZXEobXNnWydtZXNzYWdlLWlkJ10sICdzcGFtJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICJIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keVxuIikKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfY29udGludWF0aW9uX2xhc3RfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBMaWtlIHRoZSBwcmV2aW91cyB0ZXN0LCBidXQgdGhlIHN1YmplY3QgbGluZSBpcyB0aGUgbGFzdAorICAgICAgICAjIGhlYWRlci4KKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK0RhdGU6IE1vbiwgOCBBcHIgMjAwMiAxNTowOToxOSAtMDQwMAorTWVzc2FnZS1JRDogc3BhbQorU3ViamVjdDogdGhlIG5leHQgbGluZSBoYXMgYSBzcGFjZSBvbiBpdAorXHgyMAorCitIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keQorIiIiKQorICAgICAgICBlcShtc2dbJ3N1YmplY3QnXSwgJ3RoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXRcbiAnKQorICAgICAgICBlcShtc2dbJ21lc3NhZ2UtaWQnXSwgJ3NwYW0nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIkhlcmUncyB0aGUgbWVzc2FnZSBib2R5XG4iKQorCisgICAgZGVmIHRlc3RfY3JsZl9zZXBhcmF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBYWFggV2hlbiBHdWlkbyBmaXhlcyBUZXh0SU9XcmFwcGVyLnJlYWQoKSB0byBhY3QganVzdCBsaWtlCisgICAgICAgICMgLnJlYWRsaW5lcygpLCBvcGVuIHRoaXMgaW4gJ3JiJyBtb2RlIHdpdGggbmV3bGluZXM9J1xuJy4KKyAgICAgICAgd2l0aCBvcGVuZmlsZSgnbXNnXzI2LnR4dCcsIG1vZGU9J3JiJykgYXMgZnA6CisgICAgICAgICAgICBtc2cgPSBQYXJzZXIoKS5wYXJzZShmcCkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHBhcnQxLmdldF9wYXlsb2FkKCksICdTaW1wbGUgZW1haWwgd2l0aCBhdHRhY2htZW50LlxyXG5cclxuJykKKyAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXBwbGljYXRpb24vcmlzY29zJykKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9kaWdlc3Rfd2l0aF9leHRyYV9taW1lX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgd2l0aCBvcGVuZmlsZSgnbXNnXzI4LnR4dCcpIGFzIGZwOgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgICMgU3RydWN0dXJlIGlzOgorICAgICAgICAjIG11bHRpcGFydC9kaWdlc3QKKyAgICAgICAgIyAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICMgICAgIHRleHQvcGxhaW4KKyAgICAgICAgIyAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICMgICAgIHRleHQvcGxhaW4KKyAgICAgICAgZXEobXNnLmlzX211bHRpcGFydCgpLCAxKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBwYXJ0MSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHBhcnQxLmlzX211bHRpcGFydCgpLCAxKQorICAgICAgICBlcShsZW4ocGFydDEuZ2V0X3BheWxvYWQoKSksIDEpCisgICAgICAgIHBhcnQxYSA9IHBhcnQxLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHBhcnQxYS5pc19tdWx0aXBhcnQoKSwgMCkKKyAgICAgICAgZXEocGFydDFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBuZXEocGFydDFhLmdldF9wYXlsb2FkKCksICdtZXNzYWdlIDFcbicpCisgICAgICAgICMgbmV4dCBtZXNzYWdlL3JmYzgyMgorICAgICAgICBwYXJ0MiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShwYXJ0Mi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHBhcnQyLmlzX211bHRpcGFydCgpLCAxKQorICAgICAgICBlcShsZW4ocGFydDIuZ2V0X3BheWxvYWQoKSksIDEpCisgICAgICAgIHBhcnQyYSA9IHBhcnQyLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHBhcnQyYS5pc19tdWx0aXBhcnQoKSwgMCkKKyAgICAgICAgZXEocGFydDJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBuZXEocGFydDJhLmdldF9wYXlsb2FkKCksICdtZXNzYWdlIDJcbicpCisKKyAgICBkZWYgdGVzdF90aHJlZV9saW5lcyhzZWxmKToKKyAgICAgICAgIyBBIGJ1ZyByZXBvcnQgYnkgQW5kcmV3IE1jTmFtYXJhCisgICAgICAgIGxpbmVzID0gWydGcm9tOiBBbmRyZXcgUGVyc29uIDxhcGVyc29uQGRvbS5haW4nLAorICAgICAgICAgICAgICAgICAnU3ViamVjdDogVGVzdCcsCisgICAgICAgICAgICAgICAgICdEYXRlOiBUdWUsIDIwIEF1ZyAyMDAyIDE2OjQzOjQ1ICsxMDAwJ10KKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhOTC5qb2luKGxpbmVzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ2RhdGUnXSwgJ1R1ZSwgMjAgQXVnIDIwMDIgMTY6NDM6NDUgKzEwMDAnKQorCisgICAgZGVmIHRlc3Rfc3RyaXBfbGluZV9mZWVkX2FuZF9jYXJyaWFnZV9yZXR1cm5faW5faGVhZGVycyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgRm9yIFsgMTAwMjQ3NSBdIGVtYWlsIG1lc3NhZ2UgcGFyc2VyIGRvZXNuJ3QgaGFuZGxlIFxyXG4gY29ycmVjdGx5CisgICAgICAgIHZhbHVlMSA9ICd0ZXh0JworICAgICAgICB2YWx1ZTIgPSAnbW9yZSB0ZXh0JworICAgICAgICBtID0gJ0hlYWRlcjogJXNcclxuTmV4dC1IZWFkZXI6ICVzXHJcblxyXG5Cb2R5XHJcblxyXG4nICUgKAorICAgICAgICAgICAgdmFsdWUxLCB2YWx1ZTIpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmdldCgnSGVhZGVyJyksIHZhbHVlMSkKKyAgICAgICAgZXEobXNnLmdldCgnTmV4dC1IZWFkZXInKSwgdmFsdWUyKQorCisgICAgZGVmIHRlc3RfcmZjMjgyMl9oZWFkZXJfc3ludGF4KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICc+RnJvbTogZm9vXG5Gcm9tOiBiYXJcbiEiI1FVWDt+OiB6b29cblxuYm9keScKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShsZW4obXNnKSwgMykKKyAgICAgICAgZXEoc29ydGVkKGZpZWxkIGZvciBmaWVsZCBpbiBtc2cpLCBbJyEiI1FVWDt+JywgJz5Gcm9tJywgJ0Zyb20nXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdib2R5JykKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfc3BhY2Vfbm90X2FsbG93ZWRfaW5faGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICc+RnJvbSBmb29AZXhhbXBsZS5jb20gMTE6MjU6NTNcbkZyb206IGJhclxuISIjUVVYO346IHpvb1xuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKGxlbihtc2cua2V5cygpKSwgMCkKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfb25lX2NoYXJhY3Rlcl9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJ0E6IGZpcnN0IGhlYWRlclxuQjogc2Vjb25kIGhlYWRlclxuQ0M6IHRoaXJkIGhlYWRlclxuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGhlYWRlcnMgPSBtc2cua2V5cygpCisgICAgICAgIGhlYWRlcnMuc29ydCgpCisgICAgICAgIGVxKGhlYWRlcnMsIFsnQScsICdCJywgJ0NDJ10pCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnYm9keScpCisKKworDAorY2xhc3MgVGVzdEJhc2U2NCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0bWltZS5iYXNlNjRfbGVuKCdoZWxsbycpLAorICAgICAgICAgICBsZW4oYmFzZTY0bWltZS5lbmNvZGUoJ2hlbGxvJywgZW9sPScnKSkpCisgICAgICAgIGZvciBzaXplIGluIHJhbmdlKDE1KToKKyAgICAgICAgICAgIGlmICAgc2l6ZSA9PSAwIDogYnNpemUgPSAwCisgICAgICAgICAgICBlbGlmIHNpemUgPD0gMyA6IGJzaXplID0gNAorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDYgOiBic2l6ZSA9IDgKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSA5IDogYnNpemUgPSAxMgorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDEyOiBic2l6ZSA9IDE2CisgICAgICAgICAgICBlbHNlICAgICAgICAgICA6IGJzaXplID0gMjAKKyAgICAgICAgICAgIGVxKGJhc2U2NG1pbWUuYmFzZTY0X2xlbigneCcqc2l6ZSksIGJzaXplKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0bWltZS5kZWNvZGUoJycpLCAnJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5kZWNvZGUoJ2FHVnNiRzg9JyksIGInaGVsbG8nKQorICAgICAgICBlcShiYXNlNjRtaW1lLmRlY29kZSgnYUdWc2JHOD0nLCAnWCcpLCBiJ2hlbGxvJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5kZWNvZGUoJ2FHVnNiRzhOQ25kdmNteGtcbicsICdYJyksIGInaGVsbG9Yd29ybGQnKQorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJycpLCAnJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ2hlbGxvJyksICdhR1ZzYkc4PVxuJykKKyAgICAgICAgIyBUZXN0IHRoZSBiaW5hcnkgZmxhZworICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgnaGVsbG9cbicpLCAnYUdWc2JHOEtcbicpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCdoZWxsb1xuJywgMCksICdhR1ZzYkc4TkNnPT1cbicpCisgICAgICAgICMgVGVzdCB0aGUgbWF4bGluZWxlbiBhcmcKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZworZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZworZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZworZUhoNGVDQjRlSGg0SUE9PQorIiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnXHIKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2dccgorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZ1xyCitlSGg0ZUNCNGVIaDRJQT09XHIKKyIiIikKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoZSA9IGJhc2U2NG1pbWUuaGVhZGVyX2VuY29kZQorICAgICAgICBlcShoZSgnaGVsbG8nKSwgJz0/aXNvLTg4NTktMT9iP2FHVnNiRzg9Pz0nKQorICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJyksICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4TkNuZHZjbXhrPz0nKQorICAgICAgICAjIFRlc3QgdGhlIGNoYXJzZXQgb3B0aW9uCisgICAgICAgIGVxKGhlKCdoZWxsbycsIGNoYXJzZXQ9J2lzby04ODU5LTInKSwgJz0/aXNvLTg4NTktMj9iP2FHVnNiRzg9Pz0nKQorICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJyksICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4S2QyOXliR1E9Pz0nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9lSGdnZUhoNGVDQjRlSGg0SUhoNGVIZz0/PQorID0/aXNvLTg4NTktMT9iP0lIaDRlSGdnZUhoNGVDQjRlSGg0SUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9lQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQT0/PQorID0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnPz0iIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKKz0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lSGdnZUhoNGVDQjRlSGg0SUhoNGVIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQT0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2c/PSIiIikKKworCisMCitjbGFzcyBUZXN0UXVvcHJpKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgU2V0IG9mIGNoYXJhY3RlcnMgKGFzIGJ5dGUgaW50ZWdlcnMpIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBlbmNvZGVkCisgICAgICAgICMgaW4gaGVhZGVycy4KKyAgICAgICAgc2VsZi5obGl0ID0gbGlzdChjaGFpbigKKyAgICAgICAgICAgIHJhbmdlKG9yZCgnYScpLCBvcmQoJ3onKSArIDEpLAorICAgICAgICAgICAgcmFuZ2Uob3JkKCdBJyksIG9yZCgnWicpICsgMSksCisgICAgICAgICAgICByYW5nZShvcmQoJzAnKSwgb3JkKCc5JykgKyAxKSwKKyAgICAgICAgICAgIChjIGZvciBjIGluIGInISorLS8gJykpKQorICAgICAgICAjIFNldCBvZiBjaGFyYWN0ZXJzIChhcyBieXRlIGludGVnZXJzKSB0aGF0IGRvIG5lZWQgdG8gYmUgZW5jb2RlZCBpbgorICAgICAgICAjIGhlYWRlcnMuCisgICAgICAgIHNlbGYuaG5vbiA9IFtjIGZvciBjIGluIHJhbmdlKDI1NikgaWYgYyBub3QgaW4gc2VsZi5obGl0XQorICAgICAgICBhc3NlcnQgbGVuKHNlbGYuaGxpdCkgKyBsZW4oc2VsZi5obm9uKSA9PSAyNTYKKyAgICAgICAgIyBTZXQgb2YgY2hhcmFjdGVycyAoYXMgYnl0ZSBpbnRlZ2VycykgdGhhdCBkb24ndCBuZWVkIHRvIGJlIGVuY29kZWQKKyAgICAgICAgIyBpbiBib2RpZXMuCisgICAgICAgIHNlbGYuYmxpdCA9IGxpc3QocmFuZ2Uob3JkKCcgJyksIG9yZCgnficpICsgMSkpCisgICAgICAgIHNlbGYuYmxpdC5hcHBlbmQob3JkKCdcdCcpKQorICAgICAgICBzZWxmLmJsaXQucmVtb3ZlKG9yZCgnPScpKQorICAgICAgICAjIFNldCBvZiBjaGFyYWN0ZXJzIChhcyBieXRlIGludGVnZXJzKSB0aGF0IGRvIG5lZWQgdG8gYmUgZW5jb2RlZCBpbgorICAgICAgICAjIGJvZGllcy4KKyAgICAgICAgc2VsZi5ibm9uID0gW2MgZm9yIGMgaW4gcmFuZ2UoMjU2KSBpZiBjIG5vdCBpbiBzZWxmLmJsaXRdCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5ibGl0KSArIGxlbihzZWxmLmJub24pID09IDI1NgorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9jaGVjayhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obGl0OgorICAgICAgICAgICAgc2VsZi5mYWlsSWYocXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhub246CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQorCisgICAgZGVmIHRlc3RfYm9keV9xdW9wcmlfY2hlY2soc2VsZik6CisgICAgICAgIGZvciBjIGluIHNlbGYuYmxpdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfY2hlY2soYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuYm5vbjoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhxdW9wcmltaW1lLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfbGVuKGInaGVsbG8nKSwgNSkKKyAgICAgICAgIyBSRkMgMjA0NyBjaHJvbWUgaXMgbm90IGluY2x1ZGVkIGluIGhlYWRlcl9xdW9wcmlfbGVuKCkuCisgICAgICAgIGVxKGxlbihxdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUoYidoZWxsbycsIGNoYXJzZXQ9J3h4eCcpKSwKKyAgICAgICAgICAgcXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihiJ2hlbGxvJykgKworICAgICAgICAgICAjID0/eHh4P3E/Li4uPz0gbWVhbnMgMTAgZXh0cmEgY2hhcmFjdGVycworICAgICAgICAgICAxMCkKKyAgICAgICAgZXEocXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihiJ2hAZUBsQGxAb0AnKSwgMjApCisgICAgICAgICMgUkZDIDIwNDcgY2hyb21lIGlzIG5vdCBpbmNsdWRlZCBpbiBoZWFkZXJfcXVvcHJpX2xlbigpLgorICAgICAgICBlcShsZW4ocXVvcHJpbWltZS5oZWFkZXJfZW5jb2RlKGInaEBlQGxAbEBvQCcsIGNoYXJzZXQ9J3h4eCcpKSwKKyAgICAgICAgICAgcXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihiJ2hAZUBsQGxAb0AnKSArCisgICAgICAgICAgICMgPT94eHg/cT8uLi4/PSBtZWFucyAxMCBleHRyYSBjaGFyYWN0ZXJzCisgICAgICAgICAgIDEwKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhsaXQ6CisgICAgICAgICAgICBlcShxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfbGVuKGJ5dGVzKFtjXSkpLCAxLAorICAgICAgICAgICAgICAgJ2V4cGVjdGVkIGxlbmd0aCAxIGZvciAlcicgJSBjaHIoYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuaG5vbjoKKyAgICAgICAgICAgIGVxKHF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4oYnl0ZXMoW2NdKSksIDMsCisgICAgICAgICAgICAgICAnZXhwZWN0ZWQgbGVuZ3RoIDMgZm9yICVyJyAlIGNocihjKSkKKworICAgIGRlZiB0ZXN0X2JvZHlfcXVvcHJpX2xlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGJxbCA9IHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfbGVuCisgICAgICAgIGZvciBjIGluIHNlbGYuYmxpdDoKKyAgICAgICAgICAgIGVxKGJxbChjKSwgMSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibm9uOgorICAgICAgICAgICAgZXEoYnFsKGMpLCAzKQorCisgICAgZGVmIHRlc3RfcXVvdGVfdW5xdW90ZV9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBmb3IgeCBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgYyA9IGNocih4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdW9wcmltaW1lLnVucXVvdGUocXVvcHJpbWltZS5xdW90ZShjKSksIGMpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaGUgPSBxdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZXEoaGUoYidoZWxsbycpLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PScpCisgICAgICAgIGVxKGhlKGInaGVsbG8nLCBjaGFyc2V0PSdpc28tODg1OS0yJyksICc9P2lzby04ODU5LTI/cT9oZWxsbz89JykKKyAgICAgICAgZXEoaGUoYidoZWxsb1xud29ybGQnKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPTBBd29ybGQ/PScpCisgICAgICAgICMgVGVzdCBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIKKyAgICAgICAgZXEoaGUoYidoZWxsb1x4Yzd0aGVyZScpLCAnPT9pc28tODg1OS0xP3E/aGVsbG89Qzd0aGVyZT89JykKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZGVjb2RlKCcnKSwgJycpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZGVjb2RlKCdoZWxsbycpLCAnaGVsbG8nKQorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnaGVsbG8nLCAnWCcpLCAnaGVsbG8nKQorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnaGVsbG9cbndvcmxkJywgJ1gnKSwgJ2hlbGxvWHdvcmxkJykKKworICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCcnKSwgJycpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCdoZWxsbycpLCAnaGVsbG8nKQorICAgICAgICAjIFRlc3QgdGhlIGJpbmFyeSBmbGFnCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCdoZWxsb1xyXG53b3JsZCcpLCAnaGVsbG9cbndvcmxkJykKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJ2hlbGxvXHJcbndvcmxkJywgMCksICdoZWxsb1xud29ybGQnKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJnCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKK3h4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eD0KKyB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eD0KK3ggeHh4eCB4eHh4IHh4eHggeHh4eD0yMCIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAoreHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4PVxyCisgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHg9XHIKK3ggeHh4eCB4eHh4IHh4eHggeHh4eD0yMCIiIikKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoIiIiXAorb25lIGxpbmUKKwordHdvIGxpbmUiIiIpLCAiIiJcCitvbmUgbGluZQorCit0d28gbGluZSIiIikKKworCisMCisjIFRlc3QgdGhlIENoYXJzZXQgY2xhc3MKK2NsYXNzIFRlc3RDaGFyc2V0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZyb20gZW1haWwgaW1wb3J0IGNoYXJzZXQgYXMgQ2hhcnNldE1vZHVsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgQ2hhcnNldE1vZHVsZS5DSEFSU0VUU1snZmFrZSddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIE1ha2Ugc3VyZSB1cy1hc2NpaSA9IG5vIFVuaWNvZGUgY29udmVyc2lvbgorICAgICAgICBjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBzID0gJ0hlbGxvIFdvcmxkIScKKyAgICAgICAgc3AgPSBjLnRvX3NwbGl0dGFibGUocykKKyAgICAgICAgZXEocywgYy5mcm9tX3NwbGl0dGFibGUoc3ApKQorICAgICAgICAjIHRlc3QgOC1iaXQgaWRlbXBvdGVuY3kgd2l0aCB1cy1hc2NpaQorICAgICAgICBzID0gJ1x4YTRceGEyXHhhNFx4YTRceGE0XHhhNlx4YTRceGE4XHhhNFx4YWEnCisgICAgICAgIHNwID0gYy50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVxKHMsIGMuZnJvbV9zcGxpdHRhYmxlKHNwKSkKKworICAgIGRlZiB0ZXN0X2JvZHlfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggUVAgYm9keSBlbmNvZGluZworICAgICAgICBjID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCisgICAgICAgIGVxKCdoZWxsbyB3PUY2cmxkJywgYy5ib2R5X2VuY29kZShiJ2hlbGxvIHdceGY2cmxkJykpCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIEJhc2U2NCBib2R5IGVuY29kaW5nCisgICAgICAgIGMgPSBDaGFyc2V0KCd1dGYtOCcpCisgICAgICAgIGVxKCdhR1ZzYkc4Z2QyOXliR1E9XG4nLCBjLmJvZHlfZW5jb2RlKGInaGVsbG8gd29ybGQnKSkKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggTm9uZSBib2R5IGVuY29kaW5nCisgICAgICAgIGMgPSBDaGFyc2V0KCd1cy1hc2NpaScpCisgICAgICAgIGVxKCdoZWxsbyB3b3JsZCcsIGMuYm9keV9lbmNvZGUoYidoZWxsbyB3b3JsZCcpKQorICAgICAgICAjIFRyeSB0aGUgY29udmVydCBhcmd1bWVudCwgd2hlcmUgaW5wdXQgY29kZWMgIT0gb3V0cHV0IGNvZGVjCisgICAgICAgIGMgPSBDaGFyc2V0KCdldWMtanAnKQorICAgICAgICAjIFdpdGggYXBvbG9naWVzIHRvIFRva2lvIEtpa3VjaGkgOykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXEoJ1x4MWIkQjVGQ087fklXXHgxYihCJywKKyAgICAgICAgICAgICAgIGMuYm9keV9lbmNvZGUoYidceGI1XHhjNlx4YzNceGNmXHhiYlx4ZmVceGM5XHhkNycpKQorICAgICAgICAgICAgZXEoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JywKKyAgICAgICAgICAgICAgIGMuYm9keV9lbmNvZGUoYidceGI1XHhjNlx4YzNceGNmXHhiYlx4ZmVceGM5XHhkNycsIEZhbHNlKSkKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgIyBXZSBwcm9iYWJseSBkb24ndCBoYXZlIHRoZSBKYXBhbmVzZSBjb2RlY3MgaW5zdGFsbGVkCisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgVGVzdGluZyBTRiBidWcgIzYyNTUwOSwgd2hpY2ggd2UgaGF2ZSB0byBmYWtlLCBzaW5jZSB0aGVyZSBhcmUgbm8KKyAgICAgICAgIyBidWlsdC1pbiBlbmNvZGluZ3Mgd2hlcmUgdGhlIGhlYWRlciBlbmNvZGluZyBpcyBRUCBidXQgdGhlIGJvZHkKKyAgICAgICAgIyBlbmNvZGluZyBpcyBub3QuCisgICAgICAgIGZyb20gZW1haWwgaW1wb3J0IGNoYXJzZXQgYXMgQ2hhcnNldE1vZHVsZQorICAgICAgICBDaGFyc2V0TW9kdWxlLmFkZF9jaGFyc2V0KCdmYWtlJywgQ2hhcnNldE1vZHVsZS5RUCwgTm9uZSkKKyAgICAgICAgYyA9IENoYXJzZXQoJ2Zha2UnKQorICAgICAgICBlcSgnaGVsbG8gd1x4ZjZybGQnLCBjLmJvZHlfZW5jb2RlKGInaGVsbG8gd1x4ZjZybGQnKSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfY2hhcnNldF9uYW1lKHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjaGFyc2V0KSwgJ3VzLWFzY2lpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JzLkNoYXJzZXRFcnJvciwgQ2hhcnNldCwgJ2FzY1x4ZmZpaScpCisKKworDAorIyBUZXN0IG11bHRpbGluZ3VhbCBNSU1FIGhlYWRlcnMuCitjbGFzcyBUZXN0SGVhZGVyKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcignSGVsbG8gV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGguYXBwZW5kKCcgR29vZGJ5ZSBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhICBHb29kYnllIFdvcmxkIScpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfc3VycHJpc2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGVxKGguZW5jb2RlKCksICdIZWxsbyBXb3JsZCEnKQorICAgICAgICBoLmFwcGVuZCgnR29vZGJ5ZSBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhIEdvb2RieWUgV29ybGQhJykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9uZWVkc19ub19kZWNvZGluZyhzZWxmKToKKyAgICAgICAgaCA9ICdubyBkZWNvZGluZyBuZWVkZWQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlX2hlYWRlcihoKSwgWyhoLCBOb25lKV0pCisKKyAgICBkZWYgdGVzdF9sb25nKHNlbGYpOgorICAgICAgICBoID0gSGVhZGVyKCJJIGFtIHRoZSB2ZXJ5IG1vZGVsIG9mIGEgbW9kZXJuIE1ham9yLUdlbmVyYWw7IEkndmUgaW5mb3JtYXRpb24gdmVnZXRhYmxlLCBhbmltYWwsIGFuZCBtaW5lcmFsOyBJIGtub3cgdGhlIGtpbmdzIG9mIEVuZ2xhbmQsIGFuZCBJIHF1b3RlIHRoZSBmaWdodHMgaGlzdG9yaWNhbCBmcm9tIE1hcmF0aG9uIHRvIFdhdGVybG9vLCBpbiBvcmRlciBjYXRlZ29yaWNhbDsgSSdtIHZlcnkgd2VsbCBhY3F1YWludGVkLCB0b28sIHdpdGggbWF0dGVycyBtYXRoZW1hdGljYWw7IEkgdW5kZXJzdGFuZCBlcXVhdGlvbnMsIGJvdGggdGhlIHNpbXBsZSBhbmQgcXVhZHJhdGljYWw7IGFib3V0IGJpbm9taWFsIHRoZW9yZW0gSSdtIHRlZW1pbmcgd2l0aCBhIGxvdCBvJyBuZXdzLCB3aXRoIG1hbnkgY2hlZXJmdWwgZmFjdHMgYWJvdXQgdGhlIHNxdWFyZSBvZiB0aGUgaHlwb3RlbnVzZS4iLAorICAgICAgICAgICAgICAgICAgIG1heGxpbmVsZW49NzYpCisgICAgICAgIGZvciBsIGluIGguZW5jb2RlKHNwbGl0Y2hhcnM9JyAnKS5zcGxpdCgnXG4gJyk6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGVuKGwpIDw9IDc2KQorCisgICAgZGVmIHRlc3RfbXVsdGlsaW5ndWFsKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBnID0gQ2hhcnNldCgiaXNvLTg4NTktMSIpCisgICAgICAgIGN6ID0gQ2hhcnNldCgiaXNvLTg4NTktMiIpCisgICAgICAgIHV0ZjggPSBDaGFyc2V0KCJ1dGYtOCIpCisgICAgICAgIGdfaGVhZCA9IChiJ0RpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gJworICAgICAgICAgICAgICAgICAgYidGb2VyZGVyYmFuZCBrb21mb3J0YWJlbCBkZW4gS29ycmlkb3IgZW50bGFuZywgJworICAgICAgICAgICAgICAgICAgYidhbiBzXHhmY2RsXHhmY25kaXNjaGVuIFdhbmRnZW1ceGU0bGRlbiB2b3JiZWksICcKKyAgICAgICAgICAgICAgICAgIGInZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAnKQorICAgICAgICBjel9oZWFkID0gKGInRmluYW5ceGU4bmkgbWV0cm9wb2xlIHNlIGhyb3V0aWx5IHBvZCB0bGFrZW0gamVqaWNoICcKKyAgICAgICAgICAgICAgICAgICBiJ2RceGY5dnRpcHUuLiAnKQorICAgICAgICB1dGY4X2hlYWQgPSAoJ1x1NmI2M1x1NzhiYVx1MzA2Ylx1OGEwMFx1MzA0Nlx1MzA2OFx1N2ZmYlx1OGEzM1x1MzA2ZicKKyAgICAgICAgICAgICAgICAgICAgICdcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTRlMDAnCisgICAgICAgICAgICAgICAgICAgICAnXHU5MGU4XHUzMDZmXHUzMGM5XHUzMGE0XHUzMGM0XHU4YTllXHUzMDY3XHUzMDU5XHUzMDRjJworICAgICAgICAgICAgICAgICAgICAgJ1x1MzAwMVx1MzA0Mlx1MzA2OFx1MzA2Zlx1MzA2N1x1MzA1Zlx1MzA4OVx1MzA4MVx1MzA2NycKKyAgICAgICAgICAgICAgICAgICAgICdcdTMwNTlcdTMwMDJcdTViOWZcdTk2OWJcdTMwNmJcdTMwNmZcdTMwMGNXZW5uIGlzdCBkYXMgJworICAgICAgICAgICAgICAgICAgICAgJ051bnN0dWNrIGdpdCB1bmQgU2xvdGVybWV5ZXI/IEphISBCZWloZXJodW5kIGRhcyBPZGVyICcKKyAgICAgICAgICAgICAgICAgICAgICdkaWUgRmxpcHBlcndhbGR0IGdlcnNwdXQuXHUzMDBkXHUzMDY4XHU4YTAwXHUzMDYzXHUzMDY2JworICAgICAgICAgICAgICAgICAgICAgJ1x1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMicpCisgICAgICAgIGggPSBIZWFkZXIoZ19oZWFkLCBnKQorICAgICAgICBoLmFwcGVuZChjel9oZWFkLCBjeikKKyAgICAgICAgaC5hcHBlbmQodXRmOF9oZWFkLCB1dGY4KQorICAgICAgICBlbmMgPSBoLmVuY29kZSgpCisgICAgICAgIGVxKGVuYywgIiIiXAorPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZGVyYmFuZF9rbz89CisgPT9pc28tODg1OS0xP3E/bWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaXNjaGVuX1dhbj89CisgPT9pc28tODg1OS0xP3E/ZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2dlZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZ2VuX2JlZj1GNj89CisgPT9pc28tODg1OS0xP3E/cmRlcnQ9MkVfPz0gPT9pc28tODg1OS0yP3E/RmluYW49RThuaV9tZXRyb3BvbGVfc2VfaHJvdXRpbHk/PQorID0/aXNvLTg4NTktMj9xP19wb2RfdGxha2VtX2plamljaF9kPUY5dnRpcHU9MkU9MkVfPz0gPT91dGYtOD9iPzVxMmo1Nks2Pz0KKyA9P3V0Zi04P2I/NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U0NEcrNDRHYjQ0S1Q0NENDPz0KKyA9P3V0Zi04P2I/NUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I0NEdDNDRHbzQ0R3Y0NEduPz0KKyA9P3V0Zi04P2I/NDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q01WMlZ1YmlCcGMzUWdaR0Z6Pz0KKyA9P3V0Zi04P3E/X051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzX09kZXJfZGllX0ZsPz0KKyA9P3V0Zi04P2I/YVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm8rT0JwdU9CaE9PQnZ1T0JtUT09Pz0KKyA9P3V0Zi04P2I/NDRDQz89IiIiKQorICAgICAgICBlcShkZWNvZGVfaGVhZGVyKGVuYyksCisgICAgICAgICAgIFsoZ19oZWFkLCAiaXNvLTg4NTktMSIpLCAoY3pfaGVhZCwgImlzby04ODU5LTIiKSwKKyAgICAgICAgICAgICh1dGY4X2hlYWQsICJ1dGYtOCIpXSkKKyAgICAgICAgdXN0ciA9IHN0cihoKQorICAgICAgICBlcSh1c3RyLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgJ0RpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQgJworICAgICAgICAgICAna29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGMzXHhiY2RsXHhjM1x4YmNuZGlzY2hlbiAnCisgICAgICAgICAgICdXYW5kZ2VtXHhjM1x4YTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gJworICAgICAgICAgICAnYmVmXHhjM1x4YjZyZGVydC4gRmluYW5ceGM0XHg4ZG5pIG1ldHJvcG9sZSBzZSBocm91dGlseSBwb2QgJworICAgICAgICAgICAndGxha2VtIGplamljaCBkXHhjNVx4YWZ2dGlwdS4uIFx4ZTZceGFkXHhhM1x4ZTdceGEyXHhiYVx4ZTNceDgxJworICAgICAgICAgICAnXHhhYlx4ZThceGE4XHg4MFx4ZTNceDgxXHg4Nlx4ZTNceDgxXHhhOFx4ZTdceGJmXHhiYlx4ZThceGE4XHhiMycKKyAgICAgICAgICAgJ1x4ZTNceDgxXHhhZlx4ZTNceDgxXHg5NVx4ZTNceDgyXHg4Y1x4ZTNceDgxXHhhNlx4ZTNceDgxXHg4NFx4ZTMnCisgICAgICAgICAgICdceDgxXHhiZVx4ZTNceDgxXHg5Ylx4ZTNceDgyXHg5M1x4ZTNceDgwXHg4Mlx4ZTRceGI4XHg4MFx4ZTlceDgzJworICAgICAgICAgICAnXHhhOFx4ZTNceDgxXHhhZlx4ZTNceDgzXHg4OVx4ZTNceDgyXHhhNFx4ZTNceDgzXHg4NFx4ZThceGFhXHg5ZScKKyAgICAgICAgICAgJ1x4ZTNceDgxXHhhN1x4ZTNceDgxXHg5OVx4ZTNceDgxXHg4Y1x4ZTNceDgwXHg4MVx4ZTNceDgxXHg4Mlx4ZTMnCisgICAgICAgICAgICdceDgxXHhhOFx4ZTNceDgxXHhhZlx4ZTNceDgxXHhhN1x4ZTNceDgxXHg5Zlx4ZTNceDgyXHg4OVx4ZTNceDgyJworICAgICAgICAgICAnXHg4MVx4ZTNceDgxXHhhN1x4ZTNceDgxXHg5OVx4ZTNceDgwXHg4Mlx4ZTVceGFlXHg5Zlx4ZTlceDlhXHg5YicKKyAgICAgICAgICAgJ1x4ZTNceDgxXHhhYlx4ZTNceDgxXHhhZlx4ZTNceDgwXHg4Y1dlbm4gaXN0IGRhcyBOdW5zdHVjayBnaXQgJworICAgICAgICAgICAndW5kIFNsb3Rlcm1leWVyPyBKYSEgQmVpaGVyaHVuZCBkYXMgT2RlciBkaWUgRmxpcHBlcndhbGR0ICcKKyAgICAgICAgICAgJ2dlcnNwdXQuXHhlM1x4ODBceDhkXHhlM1x4ODFceGE4XHhlOFx4YThceDgwXHhlM1x4ODFceGEzXHhlM1x4ODEnCisgICAgICAgICAgICdceGE2XHhlM1x4ODFceDg0XHhlM1x4ODFceGJlXHhlM1x4ODFceDk5XHhlM1x4ODBceDgyJykKKyAgICAgICAgIyBUZXN0IG1ha2VfaGVhZGVyKCkKKyAgICAgICAgbmV3aCA9IG1ha2VfaGVhZGVyKGRlY29kZV9oZWFkZXIoZW5jKSkKKyAgICAgICAgZXEobmV3aCwgZW5jKQorCisgICAgZGVmIHRlc3RfZW1wdHlfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5lbmNvZGUoKSwgJycpCisgICAgICAgIAorICAgIGRlZiB0ZXN0X2hlYWRlcl9jdG9yX2RlZmF1bHRfYXJncyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGVxKGgsICcnKQorICAgICAgICBoLmFwcGVuZCgnZm9vJywgQ2hhcnNldCgnaXNvLTg4NTktMScpKQorICAgICAgICBlcShoLCAnPT9pc28tODg1OS0xP3E/Zm9vPz0nKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXRfbWF4bGluZWxlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICgnQSB2ZXJ5IGxvbmcgbGluZSB0aGF0IG11c3QgZ2V0IHNwbGl0IHRvIHNvbWV0aGluZyBvdGhlciAnCisgICAgICAgICAgICAgICAgJ3RoYW4gYXQgdGhlIDc2dGggY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAnYmVoYXZpb3InKQorICAgICAgICBoID0gSGVhZGVyKGhzdHIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUgNzZ0aAorIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicnJykKKyAgICAgICAgZXEoc3RyKGgpLCBoc3RyKQorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJycnXAorQSB2ZXJ5IGxvbmcgbGluZSB0aGF0IG11c3QgZ2V0IHNwbGl0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGF0IHRoZQorIDc2dGggY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0IGJlaGF2aW9yJycnKQorICAgICAgICBlcShzdHIoaCksIGhzdHIpCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgbWF4bGluZWxlbj0xMDI0LCBoZWFkZXJfbmFtZT0nU3ViamVjdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksIGhzdHIpCisgICAgICAgIGVxKHN0cihoKSwgaHN0cikKKworICAgIGRlZiB0ZXN0X2xvbmdfc3BsaXR0YWJsZXNfd2l0aF90cmFpbGluZ19zcGFjZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoY2hhcnNldD0naXNvLTg4NTktMScsIG1heGxpbmVsZW49MjApCisgICAgICAgIGguYXBwZW5kKCd4eHh4ICcgKiAyMCkKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eD89CisgPT9pc28tODg1OS0xP3E/eHh4eF8/PSIiIikKKyAgICAgICAgaCA9IEhlYWRlcihjaGFyc2V0PSdpc28tODg1OS0xJywgbWF4bGluZWxlbj00MCkKKyAgICAgICAgaC5hcHBlbmQoJ3h4eHggJyAqIDIwKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCis9P2lzby04ODU5LTE/cT94eHh4X3h4eHhfeHh4eF94eHh4Pz0KKyA9P2lzby04ODU5LTE/cT94eHh4X3h4eHhfeHh4eF94eHh4Pz0KKyA9P2lzby04ODU5LTE/cT94eHh4X3h4eHhfeHh4eF94eHh4Pz0KKyA9P2lzby04ODU5LTE/cT94eHh4X3h4eHhfeHh4eF94eHh4Pz0KKyA9P2lzby04ODU5LTE/cT94eHh4X3h4eHhfeHh4eF94eHh4Xz89IiIiKQorCisgICAgZGVmIHRlc3RfdXNfYXNjaWlfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdoZWxsbycKKyAgICAgICAgeCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoeCwgWygnaGVsbG8nLCBOb25lKV0pCisgICAgICAgIGggPSBtYWtlX2hlYWRlcih4KQorICAgICAgICBlcShzLCBoLmVuY29kZSgpKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgaC5hcHBlbmQoJ2hlbGxvJywgJ2lzby04ODU5LTEnKQorICAgICAgICBlcShoLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PScpCisKKyMjICAgIGRlZiB0ZXN0X3VuaWNvZGVfZXJyb3Ioc2VsZik6CisjIyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsIHUnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgJ1tQXHhmNnN0YWxdJywgJ3VzLWFzY2lpJykKKyMjICAgICAgICBoID0gSGVhZGVyKCkKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBoLmFwcGVuZCwgdSdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsICdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB1J1x1ODNjYVx1NTczMFx1NjY0Mlx1NTkyYicsICdpc28tODg1OS0xJykKKworICAgIGRlZiB0ZXN0X3V0Zjhfc2hvcnRlc3Qoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCdwXHhmNnN0YWwnLCAndXRmLTgnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnPT91dGYtOD9xP3A9QzM9QjZzdGFsPz0nKQorICAgICAgICBoID0gSGVhZGVyKCdcdTgzY2FcdTU3MzBcdTY2NDJcdTU5MmInLCAndXRmLTgnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnPT91dGYtOD9iPzZJK0s1Wnl3NXBtQzVhU3I/PScpCisKKyAgICBkZWYgdGVzdF9iYWRfOGJpdF9oZWFkZXIoc2VsZik6CisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB4ID0gYidZbndwNGRVRWJheSBBdWN0aW9uIFNlbWlhci0gTm8gQ2hhcmdlIFx4OTYgRWFybiBCaWcnCisgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgeCkKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIGguYXBwZW5kLCB4KQorICAgICAgICBlID0geC5kZWNvZGUoJ3V0Zi04JywgJ3JlcGxhY2UnKQorICAgICAgICBlcShzdHIoSGVhZGVyKHgsIGVycm9ycz0ncmVwbGFjZScpKSwgZSkKKyAgICAgICAgaC5hcHBlbmQoeCwgZXJyb3JzPSdyZXBsYWNlJykKKyAgICAgICAgZXEoc3RyKGgpLCBlKQorCisgICAgZGVmIHRlc3RfZW5jb2RlZF9hZGphY2VudF9ub25lbmNvZGVkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGguYXBwZW5kKCdoZWxsbycsICdpc28tODg1OS0xJykKKyAgICAgICAgaC5hcHBlbmQoJ3dvcmxkJykKKyAgICAgICAgcyA9IGguZW5jb2RlKCkKKyAgICAgICAgZXEocywgJz0/aXNvLTg4NTktMT9xP2hlbGxvPz0gd29ybGQnKQorICAgICAgICBoID0gbWFrZV9oZWFkZXIoZGVjb2RlX2hlYWRlcihzKSkKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgcykKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfZWF0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1N1YmplY3Q6ID0/a29pOC1yP2I/OE5MUDE4WFN5OEVnenNFZ3hzbk93Y3pZenRrPT89ID0/a29pOC1yP3E/PUNBPz0genouJworICAgICAgICBwYXJ0cyA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEocGFydHMsIFsoYidTdWJqZWN0OicsIE5vbmUpLCAoYidceGYwXHhkMlx4Y2ZceGQ3XHhjNVx4ZDJceGNiXHhjMSBceGNlXHhjMSBceGM2XHhjOVx4Y2VceGMxXHhjY1x4ZDhceGNlXHhkOVx4Y2EnLCAna29pOC1yJyksIChiJ3p6LicsIE5vbmUpXSkKKyAgICAgICAgaGRyID0gbWFrZV9oZWFkZXIocGFydHMpCisgICAgICAgIGVxKGhkci5lbmNvZGUoKSwKKyAgICAgICAgICAgJ1N1YmplY3Q6ID0/a29pOC1yP2I/OE5MUDE4WFN5OEVnenNFZ3hzbk93Y3pZenRuSz89IHp6LicpCisKKyAgICBkZWYgdGVzdF9icm9rZW5fYmFzZTY0X2hlYWRlcihzZWxmKToKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgcyA9ICdTdWJqZWN0OiA9P0VVQy1LUj9CP0NTaXhwTER0S1NDLzdMaXV2c2F4NGlDNnVMbXdNY2lqSUtIYUlMelN3ZC9IMFNDOCtMQ2p3THNndjdXLytNajNJUT89JworICAgICAgICByYWlzZXMoZXJyb3JzLkhlYWRlclBhcnNlRXJyb3IsIGRlY29kZV9oZWFkZXIsIHMpCisKKworDAorIyBUZXN0IFJGQyAyMjMxIGhlYWRlciBwYXJhbWV0ZXJzIChlbi9kZSljb2RpbmcKK2NsYXNzIFRlc3RSRkMyMjMxKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2dldF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI5LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJyksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnZW4nLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnKSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnLCB1bnF1b3RlPUZhbHNlKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICdlbicsICciVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEiJykpCisKKyAgICBkZWYgdGVzdF9zZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJycsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScpKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJ2VuJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJykpCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ3RpdGxlJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcobWF4aGVhZGVybGVuPTc4KSwgIiIiXAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKK1x0aWQgMjdDRUFEMzhDQzsgRnJpLCAgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMCAoRURUKQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK01lc3NhZ2UtSUQ6IDwxNTA5MC42MTMwNC4xMTA5MjkuNDU2ODRAYWFhLnp6ei5vcmc+CitGcm9tOiBiYmJAZGRkLmNvbSAoSm9obiBYLiBEb2UpCitUbzogYmJiQHp6ei5vcmcKK1N1YmplY3Q6IFRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UKK0RhdGU6IEZyaSwgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpOworIHRpdGxlKj0idXMtYXNjaWknZW4nVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAlMkElMkElMkFmdW4lMkElMkElMkElMjBpc24lMjd0JTIwaXQlMjEiCisKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCisiIiIpCisKKyAgICBkZWYgdGVzdF9kZWxfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2ZvbycsICdiYXInLCBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ3RpdGxlJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJywKKyAgICAgICAgICAgIGNoYXJzZXQ9J3VzLWFzY2lpJywgbGFuZ3VhZ2U9J2VuJykKKyAgICAgICAgbXNnLmRlbF9wYXJhbSgnZm9vJywgaGVhZGVyPSdDb250ZW50LVR5cGUnKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKG1heGhlYWRlcmxlbj03OCksICIiIlwKK1JldHVybi1QYXRoOiA8YmJiQHp6ei5vcmc+CitEZWxpdmVyZWQtVG86IGJiYkB6enoub3JnCitSZWNlaXZlZDogYnkgbWFpbC56enoub3JnIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA4ODkpCitcdGlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiOworIHRpdGxlKj0idXMtYXNjaWknZW4nVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAlMkElMkElMkFmdW4lMkElMkElMkElMjBpc24lMjd0JTIwaXQlMjEiCisKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCisiIiIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2dldF9jb250ZW50X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMi50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCAndXMtYXNjaWknKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0iCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgTkFNRSowPWZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNOyBOQU1FKjE9UF9uc21haWwuaHRtCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnTkFNRScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHBhcmFtLAorICAgICAgICAgICAgJ2ZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9maWxlbmFtZV9lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9wYXJ0bHlfZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMD0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9wYXJ0bHlfbm9uZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fYm91bmRhcnkoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKK1x0Ym91bmRhcnkqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRib3VuZGFyeSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Ym91bmRhcnkqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2JvdW5kYXJ5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgYSBub25zZW5zaWNhbCBjaGFyc2V0IHZhbHVlLCBidXQgdGVzdHMgdGhlIGNvZGUgYW55d2F5CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47CitcdGNoYXJzZXQqMCo9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0Y2hhcnNldCoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Y2hhcnNldCoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iYm9ndXMneHgnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWJvZ3VzJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0Kj1hc2NpaScndXRmLTglRTIlODAlOUQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgIyBUaGlzIHNob3VsZCByZXR1cm4gTm9uZSBiZWNhdXNlIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyc2V0CisgICAgICAgICMgYXJlIG5vdCBhbGxvd2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2JhZF9jaGFyYWN0ZXJfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJhc2NpaSd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyKj0iaXMgaXQgbm90LnBkZiVFMiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmXHVmZmZkJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5rbm93bl9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqPVgtVU5LTk9XTicnbXlmaWxlLnR4dAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJ215ZmlsZS50eHQnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9zaW5nbGVfdGlja19pbl9maWxlbmFtZV9leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwiRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgTm9uZSkKKyAgICAgICAgZXEobGFuZ3VhZ2UsIE5vbmUpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOyBuYW1lKjA9XCJGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFja19leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdGlja19hdHRhY2soc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjA9XCJ1cy1hc2NpaSdlbi11cydGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19leHRlbmRlZF92YWx1ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsgbmFtZT1cIkZyYW5rJ3MgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCduYW1lJyksICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfZW5jb2RlZF90aGVuX3VuZW5jb2RlZF9zZWdtZW50cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnTXlcIjsKK1x0bmFtZSoxPVwiIERvY3VtZW50XCI7CitcdG5hbWUqMio9XCIgRm9yIFlvdVwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGxhbmd1YWdlLCAnZW4tdXMnKQorICAgICAgICBlcShzLCAnTXkgRG9jdW1lbnQgRm9yIFlvdScpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3VuZW5jb2RlZF90aGVuX2VuY29kZWRfc2VnbWVudHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowPVwidXMtYXNjaWknZW4tdXMnTXlcIjsKK1x0bmFtZSoxKj1cIiBEb2N1bWVudFwiOworXHRuYW1lKjIqPVwiIEZvciBZb3VcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgJ015IERvY3VtZW50IEZvciBZb3UnKQorCisKKwwKK2RlZiBfdGVzdGNsYXNzZXMoKToKKyAgICBtb2QgPSBzeXMubW9kdWxlc1tfX25hbWVfX10KKyAgICByZXR1cm4gW2dldGF0dHIobW9kLCBuYW1lKSBmb3IgbmFtZSBpbiBkaXIobW9kKSBpZiBuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QnKV0KKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgZm9yIHRlc3RjbGFzcyBpbiBfdGVzdGNsYXNzZXMoKToKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUodGVzdGNsYXNzKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZm9yIHRlc3RjbGFzcyBpbiBfdGVzdGNsYXNzZXMoKToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KHRlc3RjbGFzcykKKworCisMCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3NzM0NwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKyMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzIGZvciAob3B0aW9uYWwpIEFzaWFuIGNvZGVjcworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKKworZnJvbSBlbWFpbC50ZXN0LnRlc3RfZW1haWwgaW1wb3J0IFRlc3RFbWFpbEJhc2UKK2Zyb20gZW1haWwuQ2hhcnNldCBpbXBvcnQgQ2hhcnNldAorZnJvbSBlbWFpbC5IZWFkZXIgaW1wb3J0IEhlYWRlciwgZGVjb2RlX2hlYWRlcgorZnJvbSBlbWFpbC5NZXNzYWdlIGltcG9ydCBNZXNzYWdlCisKKyMgV2UncmUgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdGhlIGJ1aWx0LWluIEFzaWFuCisjIGNvZGVjcywgc28gd2UgaGF2ZSB0byBza2lwIGFsbCB0aGVzZSB0ZXN0cy4KK3RyeToKKyAgICBzdHIoJ2ZvbycsICdldWMtanAnKQorZXhjZXB0IExvb2t1cEVycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkCisKKworDAorY2xhc3MgVGVzdEVtYWlsQXNpYW5Db2RlY3MoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfamFwYW5lc2VfY29kZWNzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBqID0gQ2hhcnNldCgiZXVjLWpwIikKKyAgICAgICAgZyA9IENoYXJzZXQoImlzby04ODU5LTEiKQorICAgICAgICBoID0gSGVhZGVyKCJIZWxsbyBXb3JsZCEiKQorICAgICAgICBqaGVsbG8gPSAnXHhhNVx4Y2ZceGE1XHhlZFx4YTFceGJjXHhhNVx4ZWZceGExXHhiY1x4YTVceGViXHhhNVx4YzlceGExXHhhYScKKyAgICAgICAgZ2hlbGxvID0gJ0dyXHhmY1x4ZGYgR290dCEnCisgICAgICAgIGguYXBwZW5kKGpoZWxsbywgaikKKyAgICAgICAgaC5hcHBlbmQoZ2hlbGxvLCBnKQorICAgICAgICAjIEJBVzogVGhpcyB1c2VkIHRvIC0tIGFuZCBtYXliZSBzaG91bGQgLS0gZm9sZCB0aGUgdHdvIGlzby04ODU5LTEKKyAgICAgICAgIyBjaHVua3MgaW50byBhIHNpbmdsZSBlbmNvZGVkIHdvcmQuICBIb3dldmVyIGl0IGRvZXNuJ3QgdmlvbGF0ZSB0aGUKKyAgICAgICAgIyBzdGFuZGFyZCB0byBoYXZlIHRoZW0gYXMgdHdvIGVuY29kZWQgY2h1bmtzIGFuZCBtYXliZSBpdCdzCisgICAgICAgICMgcmVhc29uYWJsZSA8d2luaz4gZm9yIGVhY2ggLmFwcGVuZCgpIGNhbGwgdG8gcmVzdWx0IGluIGEgc2VwYXJhdGUKKyAgICAgICAgIyBlbmNvZGVkIHdvcmQuCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK0hlbGxvIFdvcmxkISA9P2lzby0yMDIyLWpwP2I/R3lSQ0pVOGxiU0U4Slc4aFBDVnJKVWtoS2hzb1FnPT0/PQorID0/aXNvLTg4NTktMT9xP0dyPUZDPURGPz0gPT9pc28tODg1OS0xP3E/X0dvdHQhPz0iIiIpCisgICAgICAgIGVxKGRlY29kZV9oZWFkZXIoaC5lbmNvZGUoKSksCisgICAgICAgICAgIFsoJ0hlbGxvIFdvcmxkIScsIE5vbmUpLAorICAgICAgICAgICAgKCdceDFiJEIlTyVtITwlbyE8JWslSSEqXHgxYihCJywgJ2lzby0yMDIyLWpwJyksCisgICAgICAgICAgICAoJ0dyXHhmY1x4ZGYgR290dCEnLCAnaXNvLTg4NTktMScpXSkKKyAgICAgICAgaW50ID0gJ3Rlc3QtamEgXHhhNFx4ZDhceGM1XHhlYVx4YjlceGM2XHhhNFx4YjVceGE0XHhlY1x4YTRceGJmXHhhNVx4ZTFceGExXHhiY1x4YTVceGViXHhhNFx4Y2ZceGJiXHhjYVx4YjJceGYxXHhiY1x4ZDRceGE0XHhjZVx4YmVceGI1XHhjN1x4YTdceGE0XHhmMlx4YzJceGQ0XHhhNFx4YzNceGE0XHhjNlx4YTRceGE0XHhhNFx4ZGVceGE0XHhiOScKKyAgICAgICAgaCA9IEhlYWRlcihpbnQsIGosIGhlYWRlcl9uYW1lPSJTdWJqZWN0IikKKyAgICAgICAgIyB0ZXN0IGEgdmVyeSBsb25nIGhlYWRlcgorICAgICAgICBlbmMgPSBoLmVuY29kZSgpCisgICAgICAgICMgVEs6IHNwbGl0dGluZyBwb2ludCBtYXkgZGlmZmVyIGJ5IGNvZGVjIGRlc2lnbiBhbmQvb3IgSGVhZGVyIGVuY29kaW5nCisgICAgICAgIGVxKGVuYyAsICIiIlwKKz0/aXNvLTIwMjItanA/Yj9kR1Z6ZEMxcVlTQWJKRUlrV0VWcU9VWWtOU1JzSkQ4bFlTRThKV3NrVHp0S0d5aEM/PQorID0/aXNvLTIwMjItanA/Yj9HeVJDTW5FOFZDUk9QalZISnlSeVFsUWtReVJHSkNRa1hpUTVHeWhDPz0iIiIpCisgICAgICAgICMgVEs6IGZ1bGwgZGVjb2RlIGNvbXBhcmlzb24KKyAgICAgICAgZXEoaC5fX3VuaWNvZGVfXygpLmVuY29kZSgnZXVjLWpwJyksIGludCkKKworICAgIGRlZiB0ZXN0X3BheWxvYWRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGpoZWxsbyA9ICdceGE1XHhjZlx4YTVceGVkXHhhMVx4YmNceGE1XHhlZlx4YTFceGJjXHhhNVx4ZWJceGE1XHhjOVx4YTFceGFhJworICAgICAgICBqY29kZSAgPSAnZXVjLWpwJworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKGpoZWxsbywgamNvZGUpCisgICAgICAgIHVzdHIgPSBzdHIobXNnLmdldF9wYXlsb2FkKCksIG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoamhlbGxvLCB1c3RyLmVuY29kZShqY29kZSkpCisKKworDAorZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRlc3RFbWFpbEFzaWFuQ29kZWNzKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RFbWFpbEFzaWFuQ29kZWNzKQorCisKKwwKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0nc3VpdGUnKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5MGRlMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQucHkKQEAgLTAsMCArMSw3NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMgZm9yIChvcHRpb25hbCkgQXNpYW4gY29kZWNzCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdAorCitmcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbCBpbXBvcnQgVGVzdEVtYWlsQmFzZQorZnJvbSBlbWFpbC5jaGFyc2V0IGltcG9ydCBDaGFyc2V0Citmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyCitmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKKworIyBXZSdyZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0aGUgYnVpbHQtaW4gQXNpYW4KKyMgY29kZWNzLCBzbyB3ZSBoYXZlIHRvIHNraXAgYWxsIHRoZXNlIHRlc3RzLgordHJ5OgorICAgIHN0cignZm9vJywgJ2V1Yy1qcCcpCitleGNlcHQgTG9va3VwRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQKKworCisMCitjbGFzcyBUZXN0RW1haWxBc2lhbkNvZGVjcyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9qYXBhbmVzZV9jb2RlY3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGogPSBDaGFyc2V0KCJldWMtanAiKQorICAgICAgICBnID0gQ2hhcnNldCgiaXNvLTg4NTktMSIpCisgICAgICAgIGggPSBIZWFkZXIoIkhlbGxvIFdvcmxkISIpCisgICAgICAgIGpoZWxsbyA9ICdceGE1XHhjZlx4YTVceGVkXHhhMVx4YmNceGE1XHhlZlx4YTFceGJjXHhhNVx4ZWJceGE1XHhjOVx4YTFceGFhJworICAgICAgICBnaGVsbG8gPSAnR3JceGZjXHhkZiBHb3R0IScKKyAgICAgICAgaC5hcHBlbmQoamhlbGxvLCBqKQorICAgICAgICBoLmFwcGVuZChnaGVsbG8sIGcpCisgICAgICAgICMgQkFXOiBUaGlzIHVzZWQgdG8gLS0gYW5kIG1heWJlIHNob3VsZCAtLSBmb2xkIHRoZSB0d28gaXNvLTg4NTktMQorICAgICAgICAjIGNodW5rcyBpbnRvIGEgc2luZ2xlIGVuY29kZWQgd29yZC4gIEhvd2V2ZXIgaXQgZG9lc24ndCB2aW9sYXRlIHRoZQorICAgICAgICAjIHN0YW5kYXJkIHRvIGhhdmUgdGhlbSBhcyB0d28gZW5jb2RlZCBjaHVua3MgYW5kIG1heWJlIGl0J3MKKyAgICAgICAgIyByZWFzb25hYmxlIDx3aW5rPiBmb3IgZWFjaCAuYXBwZW5kKCkgY2FsbCB0byByZXN1bHQgaW4gYSBzZXBhcmF0ZQorICAgICAgICAjIGVuY29kZWQgd29yZC4KKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorSGVsbG8gV29ybGQhID0/aXNvLTIwMjItanA/Yj9HeVJDSlU4bGJTRThKVzhoUENWckpVa2hLaHNvUWc9PT89CisgPT9pc28tODg1OS0xP3E/R3I9RkM9REY/PSA9P2lzby04ODU5LTE/cT9fR290dCE/PSIiIikKKyAgICAgICAgZXEoZGVjb2RlX2hlYWRlcihoLmVuY29kZSgpKSwKKyAgICAgICAgICAgWygnSGVsbG8gV29ybGQhJywgTm9uZSksCisgICAgICAgICAgICAoJ1x4MWIkQiVPJW0hPCVvITwlayVJISpceDFiKEInLCAnaXNvLTIwMjItanAnKSwKKyAgICAgICAgICAgICgnR3JceGZjXHhkZiBHb3R0IScsICdpc28tODg1OS0xJyldKQorICAgICAgICBpbnQgPSAndGVzdC1qYSBceGE0XHhkOFx4YzVceGVhXHhiOVx4YzZceGE0XHhiNVx4YTRceGVjXHhhNFx4YmZceGE1XHhlMVx4YTFceGJjXHhhNVx4ZWJceGE0XHhjZlx4YmJceGNhXHhiMlx4ZjFceGJjXHhkNFx4YTRceGNlXHhiZVx4YjVceGM3XHhhN1x4YTRceGYyXHhjMlx4ZDRceGE0XHhjM1x4YTRceGM2XHhhNFx4YTRceGE0XHhkZVx4YTRceGI5JworICAgICAgICBoID0gSGVhZGVyKGludCwgaiwgaGVhZGVyX25hbWU9IlN1YmplY3QiKQorICAgICAgICAjIHRlc3QgYSB2ZXJ5IGxvbmcgaGVhZGVyCisgICAgICAgIGVuYyA9IGguZW5jb2RlKCkKKyAgICAgICAgIyBUSzogc3BsaXR0aW5nIHBvaW50IG1heSBkaWZmZXIgYnkgY29kZWMgZGVzaWduIGFuZC9vciBIZWFkZXIgZW5jb2RpbmcKKyAgICAgICAgZXEoZW5jICwgIiIiXAorPT9pc28tMjAyMi1qcD9iP2RHVnpkQzFxWVNBYkpFSWtXRVZxT1VZa05TUnNKRDhsWVNFOEpXc2tUenRLR3loQz89CisgPT9pc28tMjAyMi1qcD9iP0d5UkNNbkU4VkNST1BqVkhKeVJ5UWxRa1F5UkdKQ1FrWGlRNUd5aEM/PSIiIikKKyAgICAgICAgIyBUSzogZnVsbCBkZWNvZGUgY29tcGFyaXNvbgorICAgICAgICBlcShoLl9fdW5pY29kZV9fKCkuZW5jb2RlKCdldWMtanAnKSwgaW50KQorCisgICAgZGVmIHRlc3RfcGF5bG9hZF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgamhlbGxvID0gJ1x4YTVceGNmXHhhNVx4ZWRceGExXHhiY1x4YTVceGVmXHhhMVx4YmNceGE1XHhlYlx4YTVceGM5XHhhMVx4YWEnCisgICAgICAgIGpjb2RlICA9ICdldWMtanAnCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoamhlbGxvLCBqY29kZSkKKyAgICAgICAgdXN0ciA9IHN0cihtc2cuZ2V0X3BheWxvYWQoKSwgbXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqaGVsbG8sIHVzdHIuZW5jb2RlKGpjb2RlKSkKKworCisMCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdEVtYWlsQXNpYW5Db2RlY3MpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEVtYWlsQXNpYW5Db2RlY3MpCisKKworDAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSdzdWl0ZScpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3RvcnR1cmUucHkgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3RvcnR1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMTA2YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfdG9ydHVyZS5weQpAQCAtMCwwICsxLDEzNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIworIyBBIHRvcnR1cmUgdGVzdCBvZiB0aGUgZW1haWwgcGFja2FnZS4gIFRoaXMgc2hvdWxkIG5vdCBiZSBydW4gYXMgcGFydCBvZiB0aGUKKyMgc3RhbmRhcmQgUHl0aG9uIHRlc3Qgc3VpdGUgc2luY2UgaXQgcmVxdWlyZXMgc2V2ZXJhbCBtZWcgb2YgZW1haWwgbWVzc2FnZXMKKyMgY29sbGVjdGVkIGluIHRoZSB3aWxkLiAgVGhlc2Ugc291cmNlIG1lc3NhZ2VzIGFyZSBub3QgY2hlY2tlZCBpbnRvIHRoZQorIyBQeXRob24gZGlzdHJvLCBidXQgYXJlIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIHRoZSBzdGFuZGFsb25lIGVtYWlsIHBhY2thZ2UgYXQKKyMgaHR0cDovL3NmLm5ldC9wcm9qZWN0cy9taW1lbGliCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGlvIGltcG9ydCBTdHJpbmdJTworZnJvbSB0eXBlcyBpbXBvcnQgTGlzdFR5cGUKKworZnJvbSBlbWFpbC50ZXN0LnRlc3RfZW1haWwgaW1wb3J0IFRlc3RFbWFpbEJhc2UKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkCisKK2ltcG9ydCBlbWFpbAorZnJvbSBlbWFpbCBpbXBvcnQgX19maWxlX18gYXMgdGVzdGZpbGUKK2Zyb20gZW1haWwuSXRlcmF0b3JzIGltcG9ydCBfc3RydWN0dXJlCisKK2RlZiBvcGVuZmlsZShmaWxlbmFtZSk6CisgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBqb2luLCBkaXJuYW1lLCBhYnNwYXRoCisgICAgcGF0aCA9IGFic3BhdGgoam9pbihkaXJuYW1lKHRlc3RmaWxlKSwgb3MucGFyZGlyLCAnbW9yZWRhdGEnLCBmaWxlbmFtZSkpCisgICAgcmV0dXJuIG9wZW4ocGF0aCwgJ3InKQorCisjIFByZXZlbnQgdGhpcyB0ZXN0IGZyb20gcnVubmluZyBpbiB0aGUgUHl0aG9uIGRpc3RybwordHJ5OgorICAgIG9wZW5maWxlKCdjcmlzcGluLXRvcnR1cmUudHh0JykKK2V4Y2VwdCBJT0Vycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkCisKKworDAorY2xhc3MgVG9ydHVyZUJhc2UoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIF9tc2dvYmooc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmcCA9IG9wZW5maWxlKGZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIG1zZworCisKKwwKK2NsYXNzIFRlc3RDcmlzcGluVG9ydHVyZShUb3J0dXJlQmFzZSk6CisgICAgIyBNYXJrIENyaXNwaW4ncyB0b3J0dXJlIHRlc3QgZnJvbSB0aGUgU3F1aXJyZWxNYWlsIHByb2plY3QKKyAgICBkZWYgdGVzdF9tb25kb19tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignY3Jpc3Bpbi10b3J0dXJlLnR4dCcpCisgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgICAgICBlcSh0eXBlKHBheWxvYWQpLCBMaXN0VHlwZSkKKyAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxMikKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCBOb25lKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsICdcbicpCisgICAgICAgICMgUHJvYmFibHkgdGhlIGJlc3Qgd2F5IHRvIHZlcmlmeSB0aGUgbWVzc2FnZSBpcyBwYXJzZWQgY29ycmVjdGx5IGlzIHRvCisgICAgICAgICMgZHVtcCBpdHMgc3RydWN0dXJlIGFuZCBjb21wYXJlIGl0IGFnYWluc3QgdGhlIGtub3duIHN0cnVjdHVyZS4KKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIF9zdHJ1Y3R1cmUobXNnLCBmcD1mcCkKKyAgICAgICAgbmVxKGZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9taXhlZAorICAgIHRleHQvcGxhaW4KKyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKKyAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICAgICAgICAgIHRleHQvcmljaHRleHQKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uL2FuZHJldy1pbnNldAorICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgIGF1ZGlvL2Jhc2ljCisgICAgYXVkaW8vYmFzaWMKKyAgICBpbWFnZS9wYm0KKyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgICAgICAgICBhdWRpby94LXN1bgorICAgICAgICAgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICAgICAgICAgaW1hZ2UvZ2lmCisgICAgICAgICAgICAgICAgaW1hZ2UvZ2lmCisgICAgICAgICAgICAgICAgYXBwbGljYXRpb24veC1iZTIKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi9hdG9taWNtYWlsCisgICAgICAgICAgICBhdWRpby94LXN1bgorICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICAgICAgaW1hZ2UvcGdtCisgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgICAgICBpbWFnZS9wYm0KKyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICBhcHBsaWNhdGlvbi9wb3N0c2NyaXB0CisgICAgaW1hZ2UvZ2lmCisgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICAgICBhdWRpby9iYXNpYworICAgICAgICAgICAgYXVkaW8vYmFzaWMKKyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQKKyAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICAgICAgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwYXJ0L3BhcmFsbGVsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS9naWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvL2Jhc2ljCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uL2F0b21pY21haWwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvL3gtc3VuCisiIiIpCisKKwwKK2RlZiBfdGVzdGNsYXNzZXMoKToKKyAgICBtb2QgPSBzeXMubW9kdWxlc1tfX25hbWVfX10KKyAgICByZXR1cm4gW2dldGF0dHIobW9kLCBuYW1lKSBmb3IgbmFtZSBpbiBkaXIobW9kKSBpZiBuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QnKV0KKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgZm9yIHRlc3RjbGFzcyBpbiBfdGVzdGNsYXNzZXMoKToKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUodGVzdGNsYXNzKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZm9yIHRlc3RjbGFzcyBpbiBfdGVzdGNsYXNzZXMoKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCh0ZXN0Y2xhc3MpCisKKworDAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSdzdWl0ZScpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdXRpbHMucHkgYi9MaWIvZW1haWwvdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0Y2Q5NgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC91dGlscy5weQpAQCAtMCwwICsxLDMyNSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJNaXNjZWxsYW5lb3VzIHV0aWxpdGllcy4iIiIKKworX19hbGxfXyA9IFsKKyAgICAnY29sbGFwc2VfcmZjMjIzMV92YWx1ZScsCisgICAgJ2RlY29kZV9wYXJhbXMnLAorICAgICdkZWNvZGVfcmZjMjIzMScsCisgICAgJ2VuY29kZV9yZmMyMjMxJywKKyAgICAnZm9ybWF0YWRkcicsCisgICAgJ2Zvcm1hdGRhdGUnLAorICAgICdnZXRhZGRyZXNzZXMnLAorICAgICdtYWtlX21zZ2lkJywKKyAgICAncGFyc2VhZGRyJywKKyAgICAncGFyc2VkYXRlJywKKyAgICAncGFyc2VkYXRlX3R6JywKKyAgICAndW5xdW90ZScsCisgICAgXQorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHRpbWUKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KKworZnJvbSBlbWFpbC5fcGFyc2VhZGRyIGltcG9ydCBxdW90ZQorZnJvbSBlbWFpbC5fcGFyc2VhZGRyIGltcG9ydCBBZGRyZXNzTGlzdCBhcyBfQWRkcmVzc0xpc3QKK2Zyb20gZW1haWwuX3BhcnNlYWRkciBpbXBvcnQgbWt0aW1lX3R6CisKKyMgV2UgbmVlZCB3b3JtYXJvdW5kcyBmb3IgYnVncyBpbiB0aGVzZSBtZXRob2RzIGluIG9sZGVyIFB5dGhvbnMgKHNlZSBiZWxvdykKK2Zyb20gZW1haWwuX3BhcnNlYWRkciBpbXBvcnQgcGFyc2VkYXRlIGFzIF9wYXJzZWRhdGUKK2Zyb20gZW1haWwuX3BhcnNlYWRkciBpbXBvcnQgcGFyc2VkYXRlX3R6IGFzIF9wYXJzZWRhdGVfdHoKKworZnJvbSBxdW9wcmkgaW1wb3J0IGRlY29kZXN0cmluZyBhcyBfcWRlY29kZQorCisjIEludHJhcGFja2FnZSBpbXBvcnRzCitmcm9tIGVtYWlsLmVuY29kZXJzIGltcG9ydCBfYmVuY29kZSwgX3FlbmNvZGUKKworQ09NTUFTUEFDRSA9ICcsICcKK0VNUFRZU1RSSU5HID0gJycKK1VFTVBUWVNUUklORyA9ICcnCitDUkxGID0gJ1xyXG4nCitUSUNLID0gIiciCisKK3NwZWNpYWxzcmUgPSByZS5jb21waWxlKHInW11bXFwoKTw+QCw6OyIuXScpCitlc2NhcGVzcmUgPSByZS5jb21waWxlKHInW11bXFwoKSJdJykKKworCisMCisjIEhlbHBlcnMKKworZGVmIF9pZGVudGl0eShzKToKKyAgICByZXR1cm4gcworCisKK2RlZiBfYmRlY29kZShzKToKKyAgICAjIFdlIGNhbid0IHF1aXRlIHVzZSBiYXNlNjQuZW5jb2Rlc3RyaW5nKCkgc2luY2UgaXQgdGFja3Mgb24gYSAiY291cnRlc3kKKyAgICAjIG5ld2xpbmUiLiAgQmxlY2ghCisgICAgaWYgbm90IHM6CisgICAgICAgIHJldHVybiBzCisgICAgdmFsdWUgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKHMpCisgICAgaWYgbm90IHMuZW5kc3dpdGgoJ1xuJykgYW5kIHZhbHVlLmVuZHN3aXRoKCdcbicpOgorICAgICAgICByZXR1cm4gdmFsdWVbOi0xXQorICAgIHJldHVybiB2YWx1ZQorCisKKwwKK2RlZiBmaXhfZW9scyhzKToKKyAgICAiIiJSZXBsYWNlIGFsbCBsaW5lLWVuZGluZyBjaGFyYWN0ZXJzIHdpdGggXHJcbi4iIiIKKyAgICAjIEZpeCBuZXdsaW5lcyB3aXRoIG5vIHByZWNlZGluZyBjYXJyaWFnZSByZXR1cm4KKyAgICBzID0gcmUuc3ViKHInKD88IVxyKVxuJywgQ1JMRiwgcykKKyAgICAjIEZpeCBjYXJyaWFnZSByZXR1cm5zIHdpdGggbm8gZm9sbG93aW5nIG5ld2xpbmUKKyAgICBzID0gcmUuc3ViKHInXHIoPyFcbiknLCBDUkxGLCBzKQorICAgIHJldHVybiBzCisKKworDAorZGVmIGZvcm1hdGFkZHIocGFpcik6CisgICAgIiIiVGhlIGludmVyc2Ugb2YgcGFyc2VhZGRyKCksIHRoaXMgdGFrZXMgYSAyLXR1cGxlIG9mIHRoZSBmb3JtCisgICAgKHJlYWxuYW1lLCBlbWFpbF9hZGRyZXNzKSBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIHN1aXRhYmxlCisgICAgZm9yIGFuIFJGQyAyODIyIEZyb20sIFRvIG9yIENjIGhlYWRlci4KKworICAgIElmIHRoZSBmaXJzdCBlbGVtZW50IG9mIHBhaXIgaXMgZmFsc2UsIHRoZW4gdGhlIHNlY29uZCBlbGVtZW50IGlzCisgICAgcmV0dXJuZWQgdW5tb2RpZmllZC4KKyAgICAiIiIKKyAgICBuYW1lLCBhZGRyZXNzID0gcGFpcgorICAgIGlmIG5hbWU6CisgICAgICAgIHF1b3RlcyA9ICcnCisgICAgICAgIGlmIHNwZWNpYWxzcmUuc2VhcmNoKG5hbWUpOgorICAgICAgICAgICAgcXVvdGVzID0gJyInCisgICAgICAgIG5hbWUgPSBlc2NhcGVzcmUuc3ViKHInXFxcZzwwPicsIG5hbWUpCisgICAgICAgIHJldHVybiAnJXMlcyVzIDwlcz4nICUgKHF1b3RlcywgbmFtZSwgcXVvdGVzLCBhZGRyZXNzKQorICAgIHJldHVybiBhZGRyZXNzCisKKworDAorZGVmIGdldGFkZHJlc3NlcyhmaWVsZHZhbHVlcyk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiAoUkVBTE5BTUUsIEVNQUlMKSBmb3IgZWFjaCBmaWVsZHZhbHVlLiIiIgorICAgIGFsbCA9IENPTU1BU1BBQ0Uuam9pbihmaWVsZHZhbHVlcykKKyAgICBhID0gX0FkZHJlc3NMaXN0KGFsbCkKKyAgICByZXR1cm4gYS5hZGRyZXNzbGlzdAorCisKKwwKK2VjcmUgPSByZS5jb21waWxlKHInJycKKyAgPVw/ICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA9PworICAoP1A8Y2hhcnNldD5bXj9dKj8pICAgIyBub24tZ3JlZWR5IHVwIHRvIHRoZSBuZXh0ID8gaXMgdGhlIGNoYXJzZXQKKyAgXD8gICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA/CisgICg/UDxlbmNvZGluZz5bcWJdKSAgICAjIGVpdGhlciBhICJxIiBvciBhICJiIiwgY2FzZSBpbnNlbnNpdGl2ZQorICBcPyAgICAgICAgICAgICAgICAgICAgIyBsaXRlcmFsID8KKyAgKD9QPGF0b20+Lio/KSAgICAgICAgICMgbm9uLWdyZWVkeSB1cCB0byB0aGUgbmV4dCA/PSBpcyB0aGUgYXRvbQorICBcPz0gICAgICAgICAgICAgICAgICAgIyBsaXRlcmFsID89CisgICcnJywgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCisKKworDAorZGVmIGZvcm1hdGRhdGUodGltZXZhbD1Ob25lLCBsb2NhbHRpbWU9RmFsc2UsIHVzZWdtdD1GYWxzZSk6CisgICAgIiIiUmV0dXJucyBhIGRhdGUgc3RyaW5nIGFzIHNwZWNpZmllZCBieSBSRkMgMjgyMiwgZS5nLjoKKworICAgIEZyaSwgMDkgTm92IDIwMDEgMDE6MDg6NDcgLTAwMDAKKworICAgIE9wdGlvbmFsIHRpbWV2YWwgaWYgZ2l2ZW4gaXMgYSBmbG9hdGluZyBwb2ludCB0aW1lIHZhbHVlIGFzIGFjY2VwdGVkIGJ5CisgICAgZ210aW1lKCkgYW5kIGxvY2FsdGltZSgpLCBvdGhlcndpc2UgdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkLgorCisgICAgT3B0aW9uYWwgbG9jYWx0aW1lIGlzIGEgZmxhZyB0aGF0IHdoZW4gVHJ1ZSwgaW50ZXJwcmV0cyB0aW1ldmFsLCBhbmQKKyAgICByZXR1cm5zIGEgZGF0ZSByZWxhdGl2ZSB0byB0aGUgbG9jYWwgdGltZXpvbmUgaW5zdGVhZCBvZiBVVEMsIHByb3Blcmx5CisgICAgdGFraW5nIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpbnRvIGFjY291bnQuCisKKyAgICBPcHRpb25hbCBhcmd1bWVudCB1c2VnbXQgbWVhbnMgdGhhdCB0aGUgdGltZXpvbmUgaXMgd3JpdHRlbiBvdXQgYXMKKyAgICBhbiBhc2NpaSBzdHJpbmcsIG5vdCBudW1lcmljIG9uZSAoc28gIkdNVCIgaW5zdGVhZCBvZiAiKzAwMDAiKS4gVGhpcworICAgIGlzIG5lZWRlZCBmb3IgSFRUUCwgYW5kIGlzIG9ubHkgdXNlZCB3aGVuIGxvY2FsdGltZT09RmFsc2UuCisgICAgIiIiCisgICAgIyBOb3RlOiB3ZSBjYW5ub3QgdXNlIHN0cmZ0aW1lKCkgYmVjYXVzZSB0aGF0IGhvbm9ycyB0aGUgbG9jYWxlIGFuZCBSRkMKKyAgICAjIDI4MjIgcmVxdWlyZXMgdGhhdCBkYXkgYW5kIG1vbnRoIG5hbWVzIGJlIHRoZSBFbmdsaXNoIGFiYnJldmlhdGlvbnMuCisgICAgaWYgdGltZXZhbCBpcyBOb25lOgorICAgICAgICB0aW1ldmFsID0gdGltZS50aW1lKCkKKyAgICBpZiBsb2NhbHRpbWU6CisgICAgICAgIG5vdyA9IHRpbWUubG9jYWx0aW1lKHRpbWV2YWwpCisgICAgICAgICMgQ2FsY3VsYXRlIHRpbWV6b25lIG9mZnNldCwgYmFzZWQgb24gd2hldGhlciB0aGUgbG9jYWwgem9uZSBoYXMKKyAgICAgICAgIyBkYXlsaWdodCBzYXZpbmdzIHRpbWUsIGFuZCB3aGV0aGVyIERTVCBpcyBpbiBlZmZlY3QuCisgICAgICAgIGlmIHRpbWUuZGF5bGlnaHQgYW5kIG5vd1stMV06CisgICAgICAgICAgICBvZmZzZXQgPSB0aW1lLmFsdHpvbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9mZnNldCA9IHRpbWUudGltZXpvbmUKKyAgICAgICAgaG91cnMsIG1pbnV0ZXMgPSBkaXZtb2QoYWJzKG9mZnNldCksIDM2MDApCisgICAgICAgICMgUmVtZW1iZXIgb2Zmc2V0IGlzIGluIHNlY29uZHMgd2VzdCBvZiBVVEMsIGJ1dCB0aGUgdGltZXpvbmUgaXMgaW4KKyAgICAgICAgIyBtaW51dGVzIGVhc3Qgb2YgVVRDLCBzbyB0aGUgc2lnbnMgZGlmZmVyLgorICAgICAgICBpZiBvZmZzZXQgPiAwOgorICAgICAgICAgICAgc2lnbiA9ICctJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2lnbiA9ICcrJworICAgICAgICB6b25lID0gJyVzJTAyZCUwMmQnICUgKHNpZ24sIGhvdXJzLCBtaW51dGVzIC8vIDYwKQorICAgIGVsc2U6CisgICAgICAgIG5vdyA9IHRpbWUuZ210aW1lKHRpbWV2YWwpCisgICAgICAgICMgVGltZXpvbmUgb2Zmc2V0IGlzIGFsd2F5cyAtMDAwMAorICAgICAgICBpZiB1c2VnbXQ6CisgICAgICAgICAgICB6b25lID0gJ0dNVCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHpvbmUgPSAnLTAwMDAnCisgICAgcmV0dXJuICclcywgJTAyZCAlcyAlMDRkICUwMmQ6JTAyZDolMDJkICVzJyAlICgKKyAgICAgICAgWydNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsICdTdW4nXVtub3dbNl1dLAorICAgICAgICBub3dbMl0sCisgICAgICAgIFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLAorICAgICAgICAgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ11bbm93WzFdIC0gMV0sCisgICAgICAgIG5vd1swXSwgbm93WzNdLCBub3dbNF0sIG5vd1s1XSwKKyAgICAgICAgem9uZSkKKworCisMCitkZWYgbWFrZV9tc2dpZChpZHN0cmluZz1Ob25lKToKKyAgICAiIiJSZXR1cm5zIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBSRkMgMjgyMiBjb21wbGlhbnQgTWVzc2FnZS1JRCwgZS5nOgorCisgICAgPDIwMDIwMjAxMTk1NjI3LjMzNTM5Ljk2NjcxQG5pZ2h0c2hhZGUubGEubWFzdGFsZXIuY29tPgorCisgICAgT3B0aW9uYWwgaWRzdHJpbmcgaWYgZ2l2ZW4gaXMgYSBzdHJpbmcgdXNlZCB0byBzdHJlbmd0aGVuIHRoZQorICAgIHVuaXF1ZW5lc3Mgb2YgdGhlIG1lc3NhZ2UgaWQuCisgICAgIiIiCisgICAgdGltZXZhbCA9IHRpbWUudGltZSgpCisgICAgdXRjZGF0ZSA9IHRpbWUuc3RyZnRpbWUoJyVZJW0lZCVIJU0lUycsIHRpbWUuZ210aW1lKHRpbWV2YWwpKQorICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgcmFuZGludCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwKQorICAgIGlmIGlkc3RyaW5nIGlzIE5vbmU6CisgICAgICAgIGlkc3RyaW5nID0gJycKKyAgICBlbHNlOgorICAgICAgICBpZHN0cmluZyA9ICcuJyArIGlkc3RyaW5nCisgICAgaWRob3N0ID0gc29ja2V0LmdldGZxZG4oKQorICAgIG1zZ2lkID0gJzwlcy4lcy4lcyVzQCVzPicgJSAodXRjZGF0ZSwgcGlkLCByYW5kaW50LCBpZHN0cmluZywgaWRob3N0KQorICAgIHJldHVybiBtc2dpZAorCisKKwwKKyMgVGhlc2UgZnVuY3Rpb25zIGFyZSBpbiB0aGUgc3RhbmRhbG9uZSBtaW1lbGliIHZlcnNpb24gb25seSBiZWNhdXNlIHRoZXkndmUKKyMgc3Vic2VxdWVudGx5IGJlZW4gZml4ZWQgaW4gdGhlIGxhdGVzdCBQeXRob24gdmVyc2lvbnMuICBXZSB1c2UgdGhpcyB0byB3b3JtCisjIGFyb3VuZCBicm9rZW4gb2xkZXIgUHl0aG9ucy4KK2RlZiBwYXJzZWRhdGUoZGF0YSk6CisgICAgaWYgbm90IGRhdGE6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIF9wYXJzZWRhdGUoZGF0YSkKKworCitkZWYgcGFyc2VkYXRlX3R6KGRhdGEpOgorICAgIGlmIG5vdCBkYXRhOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBfcGFyc2VkYXRlX3R6KGRhdGEpCisKKworZGVmIHBhcnNlYWRkcihhZGRyKToKKyAgICBhZGRycyA9IF9BZGRyZXNzTGlzdChhZGRyKS5hZGRyZXNzbGlzdAorICAgIGlmIG5vdCBhZGRyczoKKyAgICAgICAgcmV0dXJuICcnLCAnJworICAgIHJldHVybiBhZGRyc1swXQorCisKKyMgcmZjODIyLnVucXVvdGUoKSBkb2Vzbid0IHByb3Blcmx5IGRlLWJhY2tzbGFzaC1pZnkgaW4gUHl0aG9uIHByZS0yLjMuCitkZWYgdW5xdW90ZShzdHIpOgorICAgICIiIlJlbW92ZSBxdW90ZXMgZnJvbSBhIHN0cmluZy4iIiIKKyAgICBpZiBsZW4oc3RyKSA+IDE6CisgICAgICAgIGlmIHN0ci5zdGFydHN3aXRoKCciJykgYW5kIHN0ci5lbmRzd2l0aCgnIicpOgorICAgICAgICAgICAgcmV0dXJuIHN0clsxOi0xXS5yZXBsYWNlKCdcXFxcJywgJ1xcJykucmVwbGFjZSgnXFwiJywgJyInKQorICAgICAgICBpZiBzdHIuc3RhcnRzd2l0aCgnPCcpIGFuZCBzdHIuZW5kc3dpdGgoJz4nKToKKyAgICAgICAgICAgIHJldHVybiBzdHJbMTotMV0KKyAgICByZXR1cm4gc3RyCisKKworDAorIyBSRkMyMjMxLXJlbGF0ZWQgZnVuY3Rpb25zIC0gcGFyYW1ldGVyIGVuY29kaW5nIGFuZCBkZWNvZGluZworZGVmIGRlY29kZV9yZmMyMjMxKHMpOgorICAgICIiIkRlY29kZSBzdHJpbmcgYWNjb3JkaW5nIHRvIFJGQyAyMjMxIiIiCisgICAgcGFydHMgPSBzLnNwbGl0KFRJQ0ssIDIpCisgICAgaWYgbGVuKHBhcnRzKSA8PSAyOgorICAgICAgICByZXR1cm4gTm9uZSwgTm9uZSwgcworICAgIHJldHVybiBwYXJ0cworCisKK2RlZiBlbmNvZGVfcmZjMjIzMShzLCBjaGFyc2V0PU5vbmUsIGxhbmd1YWdlPU5vbmUpOgorICAgICIiIkVuY29kZSBzdHJpbmcgYWNjb3JkaW5nIHRvIFJGQyAyMjMxLgorCisgICAgSWYgbmVpdGhlciBjaGFyc2V0IG5vciBsYW5ndWFnZSBpcyBnaXZlbiwgdGhlbiBzIGlzIHJldHVybmVkIGFzLWlzLiAgSWYKKyAgICBjaGFyc2V0IGlzIGdpdmVuIGJ1dCBub3QgbGFuZ3VhZ2UsIHRoZSBzdHJpbmcgaXMgZW5jb2RlZCB1c2luZyB0aGUgZW1wdHkKKyAgICBzdHJpbmcgZm9yIGxhbmd1YWdlLgorICAgICIiIgorICAgIGltcG9ydCB1cmxsaWIKKyAgICBzID0gdXJsbGliLnF1b3RlKHMsIHNhZmU9JycpCisgICAgaWYgY2hhcnNldCBpcyBOb25lIGFuZCBsYW5ndWFnZSBpcyBOb25lOgorICAgICAgICByZXR1cm4gcworICAgIGlmIGxhbmd1YWdlIGlzIE5vbmU6CisgICAgICAgIGxhbmd1YWdlID0gJycKKyAgICByZXR1cm4gIiVzJyVzJyVzIiAlIChjaGFyc2V0LCBsYW5ndWFnZSwgcykKKworCityZmMyMjMxX2NvbnRpbnVhdGlvbiA9IHJlLmNvbXBpbGUocideKD9QPG5hbWU+XHcrKVwqKCg/UDxudW0+WzAtOV0rKVwqPyk/JCcpCisKK2RlZiBkZWNvZGVfcGFyYW1zKHBhcmFtcyk6CisgICAgIiIiRGVjb2RlIHBhcmFtZXRlcnMgbGlzdCBhY2NvcmRpbmcgdG8gUkZDIDIyMzEuCisKKyAgICBwYXJhbXMgaXMgYSBzZXF1ZW5jZSBvZiAyLXR1cGxlcyBjb250YWluaW5nIChwYXJhbSBuYW1lLCBzdHJpbmcgdmFsdWUpLgorICAgICIiIgorICAgICMgQ29weSBwYXJhbXMgc28gd2UgZG9uJ3QgbWVzcyB3aXRoIHRoZSBvcmlnaW5hbAorICAgIHBhcmFtcyA9IHBhcmFtc1s6XQorICAgIG5ld19wYXJhbXMgPSBbXQorICAgICMgTWFwIHBhcmFtZXRlcidzIG5hbWUgdG8gYSBsaXN0IG9mIGNvbnRpbnVhdGlvbnMuICBUaGUgdmFsdWVzIGFyZSBhCisgICAgIyAzLXR1cGxlIG9mIHRoZSBjb250aW51YXRpb24gbnVtYmVyLCB0aGUgc3RyaW5nIHZhbHVlLCBhbmQgYSBmbGFnCisgICAgIyBzcGVjaWZ5aW5nIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHNlZ21lbnQgaXMgJS1lbmNvZGVkLgorICAgIHJmYzIyMzFfcGFyYW1zID0ge30KKyAgICBuYW1lLCB2YWx1ZSA9IHBhcmFtcy5wb3AoMCkKKyAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgdmFsdWUpKQorICAgIHdoaWxlIHBhcmFtczoKKyAgICAgICAgbmFtZSwgdmFsdWUgPSBwYXJhbXMucG9wKDApCisgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJyonKToKKyAgICAgICAgICAgIGVuY29kZWQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGVkID0gRmFsc2UKKyAgICAgICAgdmFsdWUgPSB1bnF1b3RlKHZhbHVlKQorICAgICAgICBtbyA9IHJmYzIyMzFfY29udGludWF0aW9uLm1hdGNoKG5hbWUpCisgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgbmFtZSwgbnVtID0gbW8uZ3JvdXAoJ25hbWUnLCAnbnVtJykKKyAgICAgICAgICAgIGlmIG51bSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBudW0gPSBpbnQobnVtKQorICAgICAgICAgICAgcmZjMjIzMV9wYXJhbXMuc2V0ZGVmYXVsdChuYW1lLCBbXSkuYXBwZW5kKChudW0sIHZhbHVlLCBlbmNvZGVkKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld19wYXJhbXMuYXBwZW5kKChuYW1lLCAnIiVzIicgJSBxdW90ZSh2YWx1ZSkpKQorICAgIGlmIHJmYzIyMzFfcGFyYW1zOgorICAgICAgICBmb3IgbmFtZSwgY29udGludWF0aW9ucyBpbiByZmMyMjMxX3BhcmFtcy5pdGVtcygpOgorICAgICAgICAgICAgdmFsdWUgPSBbXQorICAgICAgICAgICAgZXh0ZW5kZWQgPSBGYWxzZQorICAgICAgICAgICAgIyBTb3J0IGJ5IG51bWJlcgorICAgICAgICAgICAgY29udGludWF0aW9ucy5zb3J0KCkKKyAgICAgICAgICAgICMgQW5kIG5vdyBhcHBlbmQgYWxsIHZhbHVlcyBpbiBudW1lcmljYWwgb3JkZXIsIGNvbnZlcnRpbmcKKyAgICAgICAgICAgICMgJS1lbmNvZGluZ3MgZm9yIHRoZSBlbmNvZGVkIHNlZ21lbnRzLiAgSWYgYW55IG9mIHRoZQorICAgICAgICAgICAgIyBjb250aW51YXRpb24gbmFtZXMgZW5kcyBpbiBhICosIHRoZW4gdGhlIGVudGlyZSBzdHJpbmcsIGFmdGVyCisgICAgICAgICAgICAjIGRlY29kaW5nIHNlZ21lbnRzIGFuZCBjb25jYXRlbmF0aW5nLCBtdXN0IGhhdmUgdGhlIGNoYXJzZXQgYW5kCisgICAgICAgICAgICAjIGxhbmd1YWdlIHNwZWNpZmllcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgICAgZm9yIG51bSwgcywgZW5jb2RlZCBpbiBjb250aW51YXRpb25zOgorICAgICAgICAgICAgICAgIGlmIGVuY29kZWQ6CisgICAgICAgICAgICAgICAgICAgIHMgPSB1cmxsaWIudW5xdW90ZShzKQorICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQocykKKyAgICAgICAgICAgIHZhbHVlID0gcXVvdGUoRU1QVFlTVFJJTkcuam9pbih2YWx1ZSkpCisgICAgICAgICAgICBpZiBleHRlbmRlZDoKKyAgICAgICAgICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUgPSBkZWNvZGVfcmZjMjIzMSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgKGNoYXJzZXQsIGxhbmd1YWdlLCAnIiVzIicgJSB2YWx1ZSkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgJyIlcyInICUgdmFsdWUpKQorICAgIHJldHVybiBuZXdfcGFyYW1zCisKK2RlZiBjb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKHZhbHVlLCBlcnJvcnM9J3JlcGxhY2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tfY2hhcnNldD0ndXMtYXNjaWknKToKKyAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpIG9yIGxlbih2YWx1ZSkgIT0gMzoKKyAgICAgICAgcmV0dXJuIHVucXVvdGUodmFsdWUpCisgICAgIyBXaGlsZSB2YWx1ZSBjb21lcyB0byB1cyBhcyBhIHVuaWNvZGUgc3RyaW5nLCB3ZSBuZWVkIGl0IHRvIGJlIGEgYnl0ZXMKKyAgICAjIG9iamVjdC4gIFdlIGRvIG5vdCB3YW50IGJ5dGVzKCkgbm9ybWFsIHV0Zi04IGRlY29kZXIsIHdlIHdhbnQgYSBzdHJhaWdodAorICAgICMgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHN0cmluZyBhcyBjaGFyYWN0ZXIgYnl0ZXMuCisgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHRleHQgPSB2YWx1ZQorICAgIHJhd2J5dGVzID0gYnl0ZXMob3JkKGMpIGZvciBjIGluIHRleHQpCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc3RyKHJhd2J5dGVzLCBjaGFyc2V0LCBlcnJvcnMpCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAjIGNoYXJzZXQgaXMgbm90IGEga25vd24gY29kZWMuCisgICAgICAgIHJldHVybiB1bnF1b3RlKHRleHQpCg==