{
 "agent_version": "0.153.0",
 "files": [
  {
   "check": "bash",
   "content_b64": "IyEvYmluL2Jhc2gKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBmZWxob20tbWtmcy1ndWFyZGVkIOKAlCB0aGUgT05MWSBta2ZzIHBhdGggdGhlIGZlbGhvbS1hZ2VudCBzdWRvZXJzIHBlcm1pdHMgKEltcGwtMSBQYXJ0IEIsCiMgU1BJS0UtZHJpdmUtZW5yb2xsbWVudC0yMDI2LTA3LTAxIMKnU1EzKS4gRGVmZW5zZS1pbi1kZXB0aCBCRUxPVyB0aGUgYWdlbnQ6IGV2ZW4gYSBidWdneSBvcgojIGNvbXByb21pc2VkIGFnZW50IGNhbm5vdCBta2ZzIGEgY2F0YXN0cm9waGljIHRhcmdldCB0aHJvdWdoIHRoaXMg4oCUIGl0IHJlLWNoZWNrcywgYXMgcm9vdCwgdGhlCiMgY2hlYXAgY2F0YXN0cm9waGljIGNhc2VzIChPUy9zeXN0ZW0gZGlzaywgTFZNIHBoeXNpY2FsIHZvbHVtZSwgYSBmb3JlaWduIG1vdW50LCBhIHJlYWQtb25seQojIGRldmljZSwgYW5kIGFueSBMVk0vWkZTL21kcmFpZC9MVUtTL3N3YXAgbWVtYmVyIHNpZ25hdHVyZSDigJQgYXVkaXQgRDEpIGFuZCByZWZ1c2VzLgojCiMgVGhlIGFnZW50J3MgZnVsbCB1bmNsYWltZWQtZGlzayBmaWx0ZXIgKGludGVybmFsL3N0b3JhZ2UvY2xhaW0uZ28pIGlzIHRoZSBQUklNQVJZIGd1YXJkOyB0aGlzCiMgd3JhcHBlciBpcyBhIGRlbGliZXJhdGVseSBtaW5pbWFsLCBhdWRpdGFibGUgc2Vjb25kIGdhdGUuIEl0IGlzIE5PVCB0aGUgcGxhY2UgZm9yIHRoZSBmdWxsIGZpbHRlci4KIwojIFVzYWdlOiAgZmVsaG9tLW1rZnMtZ3VhcmRlZCA8ZGV2aWNlPiA8ZnN0eXBlOmV4dDR8eGZzPgojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpzZXQgLWV1byBwaXBlZmFpbAoKZGllKCkgeyBlY2hvICJmZWxob20tbWtmcy1ndWFyZGVkOiBSRUZVU0VEOiAkKiIgPiYyOyBleGl0IDE7IH0KCmRldj0iJHsxOi19IjsgZnN0eXBlPSIkezI6LX0iCltbIC1uICIkZGV2IiAmJiAtbiAiJGZzdHlwZSIgXV0gfHwgZGllICJ1c2FnZTogZmVsaG9tLW1rZnMtZ3VhcmRlZCA8ZGV2aWNlPiA8ZnN0eXBlPiIKCiMgVGhlIGRldmljZSBtdXN0IGJlIGEgUkVBTCBibG9jay1kZXZpY2Ugbm9kZSB1bmRlciAvZGV2IOKAlCBubyBzeW1saW5rIChlLmcuIC9kZXYvZGlzay9ieS0qKSwgbm8gdHJhdmVyc2FsLgpbWyAiJGRldiIgPT0gL2Rldi8qIF1dICB8fCBkaWUgImRldmljZSBtdXN0IGJlIHVuZGVyIC9kZXYgKCRkZXYpIgpbWyAiJGRldiIgIT0gKi4uKiBdXSAgICB8fCBkaWUgInBhdGggdHJhdmVyc2FsICgkZGV2KSIKW1sgLWIgIiRkZXYiIF1dICAgICAgICAgfHwgZGllICJub3QgYSBibG9jayBkZXZpY2UgKCRkZXYpIgpbWyAhIC1MICIkZGV2IiBdXSAgICAgICB8fCBkaWUgImRldmljZSBtdXN0IGJlIGEgcmVhbCBub2RlLCBub3QgYSBzeW1saW5rICgkZGV2KSIKCiMgV2hvbGUtZGlzayBvZiB0aGUgdGFyZ2V0IChhIHBhcnRpdGlvbidzIHBhcmVudCwgZWxzZSB0aGUgZGlzayBpdHNlbGYpLgpwaz0iJChsc2JsayAtbmRvIFBLTkFNRSAiJGRldiIgMj4vZGV2L251bGwgfHwgdHJ1ZSkiCndob2xlPSIkZGV2IjsgW1sgLW4gIiRwayIgXV0gJiYgd2hvbGU9Ii9kZXYvJHBrIgoKIyAxKSBPUy9zeXN0ZW0gZGlzayDigJQgZG9lcyB0aGUgdGFyZ2V0J3Mgd2hvbGUtZGlzayBiYWNrIC8sIC9ib290IG9yIC9ib290L2VmaT8Kd2hpbGUgcmVhZCAtciBzcmMgbW50IF9yZXN0OyBkbwogIGNhc2UgIiRtbnQiIGluCiAgICAvfC9ib290fC9ib290L2VmaSkKICAgICAgc3BrPSIkKGxzYmxrIC1uZG8gUEtOQU1FICIkc3JjIiAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICAgICAgc3dob2xlPSIkc3JjIjsgW1sgLW4gIiRzcGsiIF1dICYmIHN3aG9sZT0iL2Rldi8kc3BrIgogICAgICBbWyAiJHN3aG9sZSIgPT0gIiR3aG9sZSIgfHwgIiRzcmMiID09ICIkZGV2IiB8fCAiJHNyYyIgPT0gIiR3aG9sZSIgXV0gJiYgZGllICJzeXN0ZW0vT1MgZGlzayAoJGRldiBiYWNrcyAkbW50KSIKICAgICAgOzsKICBlc2FjCmRvbmUgPCAvcHJvYy9tb3VudHMKCiMgMikgTFZNIHBoeXNpY2FsIHZvbHVtZSBhbnl3aGVyZSBvbiB0aGUgdGFyZ2V0IGRpc2sgb3IgaXRzIHBhcnRpdGlvbnMuIHB2cyBpcyByZXNvbHZlZCBieSBBQlNPTFVURQojICAgIHBhdGggKGF1ZGl0IEQxOiBgY29tbWFuZCAtdiBwdnNgIHNpbGVudGx5IHNraXBwZWQgdGhpcyBjaGVjayB3aGVuIHB2cyB3YXNuJ3Qgb24gdGhlIGNhbGxlcidzCiMgICAgUEFUSCk7IGlmIG5laXRoZXIgY2FuZGlkYXRlIGV4aXN0cywgY2hlY2sgNSdzIExWTTJfbWVtYmVyIEZTVFlQRSBsb29wIHN0aWxsIGNhdGNoZXMgYSBQVgojICAgIGluZGVwZW5kZW50bHkg4oCUIHB2cy1hYnNlbnQgbmV2ZXIgc2lsZW50bHkgZHJvcHMgTFZNIGRldGVjdGlvbi4KcHZzYmluPSIiCmZvciBjIGluIC91c3Ivc2Jpbi9wdnMgL3NiaW4vcHZzOyBkbwogIFtbIC14ICIkYyIgXV0gJiYgeyBwdnNiaW49IiRjIjsgYnJlYWs7IH0KZG9uZQppZiBbWyAtbiAiJHB2c2JpbiIgXV07IHRoZW4KICB3aGlsZSByZWFkIC1yIHB2OyBkbwogICAgcHY9IiR7cHYvL1tbOnNwYWNlOl1dL30iOyBbWyAteiAiJHB2IiBdXSAmJiBjb250aW51ZQogICAgcHZwaz0iJChsc2JsayAtbmRvIFBLTkFNRSAiJHB2IiAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICAgIHB2d2hvbGU9IiRwdiI7IFtbIC1uICIkcHZwayIgXV0gJiYgcHZ3aG9sZT0iL2Rldi8kcHZwayIKICAgIFtbICIkcHZ3aG9sZSIgPT0gIiR3aG9sZSIgXV0gJiYgZGllICJkZXZpY2UgaG9sZHMgYW4gTFZNIHBoeXNpY2FsIHZvbHVtZSAoJHB2KSIKICBkb25lIDwgPCgiJHB2c2JpbiIgLS1ub2hlYWRpbmdzIC1vIHB2X25hbWUgMj4vZGV2L251bGwgfHwgdHJ1ZSkKZmkKCiMgMykgbW91bnRlZCBPVVRTSURFIEZlbGhvbSdzIG93biBkcml2ZSBhcmVhID0gYSBsaXZlIGZvcmVpZ24gZmlsZXN5c3RlbSDihpIgY2F0YXN0cm9waGljLiBNb3VudHMgdW5kZXIKIyAgICAvbW50L2ZlbGhvbS1kcml2ZXMgYXJlIG91ciBvd24gZHJpdmVzICh0aGUgYWdlbnQgZGV0YWNoZXMgYmVmb3JlIGEgcmUtaW5pdCkg4oaSIGFsbG93ZWQuCndoaWxlIHJlYWQgLXIgbXA7IGRvCiAgW1sgLXogIiRtcCIgXV0gJiYgY29udGludWUKICBjYXNlICIkbXAiIGluCiAgICAvbW50L2ZlbGhvbS1kcml2ZXN8L21udC9mZWxob20tZHJpdmVzLyopIDogOzsKICAgICopIGRpZSAiZGV2aWNlIChvciBhIHBhcnRpdGlvbikgaXMgbW91bnRlZCBhdCAkbXAgKCRkZXYpIiA7OwogIGVzYWMKZG9uZSA8IDwobHNibGsgLW5ybyBNT1VOVFBPSU5UICIkd2hvbGUiIDI+L2Rldi9udWxsIHx8IHRydWUpCgojIDQpIHJlYWQtb25seSBkZXZpY2UgKGF1ZGl0IEQxKTogYSBkZXZpY2UgdGhlIGtlcm5lbCBtYXJrcyBSTyBpcyBuZXZlciBhIGZvcm1hdHRhYmxlIGRhdGEgZGlzay4Kd2Jhc2U9IiR7d2hvbGUjL2Rldi99Igpyb2Y9Ii9zeXMvYmxvY2svJHdiYXNlL3JvIgppZiBbWyAtciAiJHJvZiIgXV07IHRoZW4KICBybz0iJChjYXQgIiRyb2YiIDI+L2Rldi9udWxsIHx8IHRydWUpIgogIFtbICIkcm8iID09ICIxIiBdXSAmJiBkaWUgInJlYWQtb25seSBkZXZpY2UgKCR3aG9sZSkiCmZpCgojIDUpIG1lbWJlci9hY3RpdmUgRlNUWVBFcyBhbnl3aGVyZSBvbiB0aGUgdGFyZ2V0IGRpc2sgb3IgaXRzIHBhcnRpdGlvbnMgKGF1ZGl0IEQxKS4gTWlycm9ycwojICAgIGNsYWltLmdvIG1lbWJlckZTVHlwZXMgZXhhY3RseTogYSBtZW1iZXIgb2YgTFZNL1pGUy9tZHJhaWQvTFVLUyBvciBhY3RpdmUtc3dhcCBzaWduYXR1cmUgaXMKIyAgICBhbHdheXMgYSBjbGFpbSwgbmV2ZXIgYSBwbGFpbiBmb3JtYXR0YWJsZSBkYXRhIGRpc2suIFRoaXMgYWxzbyBpbmRlcGVuZGVudGx5IGNhdGNoZXMgYW4gTFZNIFBWCiMgICAgd2hlbiBwdnMgaXMgbm90IGluc3RhbGxlZCAoY2hlY2sgMidzIGJlbHQtYW5kLXN1c3BlbmRlcnMpLgp3aGlsZSByZWFkIC1yIGZzdDsgZG8KICBbWyAteiAiJGZzdCIgXV0gJiYgY29udGludWUKICBjYXNlICIkZnN0IiBpbgogICAgTFZNMl9tZW1iZXJ8emZzX21lbWJlcnxsaW51eF9yYWlkX21lbWJlcnxjcnlwdG9fTFVLU3xzd2FwKQogICAgICBkaWUgImRldmljZSBob2xkcyBhICRmc3Qgc2lnbmF0dXJlICgkd2hvbGUpIiA7OwogIGVzYWMKZG9uZSA8IDwobHNibGsgLW5ybyBGU1RZUEUgIiR3aG9sZSIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKCiMgUGFzc2VkIHRoZSBjYXRhc3Ryb3BoaWMgY2hlY2tzIOKGkiBmb3JtYXQuIGV4ZWMgc28gdGhlIG1rZnMgZXhpdCBzdGF0dXMgaXMgdGhlIHdyYXBwZXIncy4KY2FzZSAiJGZzdHlwZSIgaW4KICBleHQ0KSBleGVjIC91c3Ivc2Jpbi9ta2ZzLmV4dDQgLUYgIiRkZXYiIDs7CiAgeGZzKSAgZXhlYyAvdXNyL3NiaW4vbWtmcy54ZnMgIC1mICIkZGV2IiA7OwogICopICAgIGRpZSAidW5zdXBwb3J0ZWQgZnN0eXBlICgkZnN0eXBlKSIgOzsKZXNhYwo=",
   "mode": "0o755",
   "path": "/usr/local/sbin/felhom-mkfs-guarded",
   "policy": "replace",
   "sha256": "fe24cacd90899bf9217f7e0cc8bb4e2cdfa1c15c4c9c13cc16861b45b5bb441c",
   "source": "configs/felhom-mkfs-guarded.sh"
  },
  {
   "check": "sh",
   "content_b64": "IyEvYmluL3NoCiMgZmVsaG9tLXNlbGZ1cGRhdGUtZ3VhcmRlZCDigJQgdGhlIFJPT1QgaGFsZiBvZiB0aGUgYWdlbnQncyBBL0Igc2VsZi11cGRhdGUgKFRBU0sgRDEpLgojCiMgSW5zdGFsbCBhcyAvdXNyL2xvY2FsL3NiaW4vZmVsaG9tLXNlbGZ1cGRhdGUtZ3VhcmRlZCAoMDc1NSByb290OnJvb3QpLiBUaGUgbm9uLXJvb3QgYWdlbnQgaW52b2tlcwojIGBhcHBseWAvYGNvbW1pdGAgdmlhIGBzdWRvIC1uYCAoRkVMSE9NX1NFTEZVUERBVEUgYWxpYXMpOyBgcm9sbGJhY2tgIGlzIEFMU08gdGhlIEV4ZWNTdGFydCBvZgojIGZlbGhvbS1hZ2VudC1yb2xsYmFjay5zZXJ2aWNlIOKAlCB0aGUgT25GYWlsdXJlPSB0YXJnZXQgdGhhdCBhdXRvLXJldmVydHMgYSBjcmFzaC1sb29waW5nIHVwZGF0ZS4KIwojIERlc2lnbiBwcm92ZW5hbmNlOiBTUElLRS1hZ2VudC1zZWxmdXBkYXRlLTIwMjYtMDctMDUgKGl0cyBTRi1maW5kaW5ncyBhcmUgY2l0ZWQgaW5saW5lKS4gVGhlIGNvcmUKIyBwcmluY2lwbGU6IHRoZSB0aGluZyB0aGF0IHBlcmZvcm1zIHJvbGxiYWNrIGlzIG5ldmVyIHRoZSB0aGluZyBiZWluZyB1cGRhdGVkIOKAlCB0aGlzIHdyYXBwZXIgKwojIHN5c3RlbWQgY2hhbmdlIGFsbW9zdCBuZXZlcjsgdGhlIGFnZW50IGJpbmFyeSBpcyB3aGF0IGZsaXBzLgojCiMgVHJ1c3QgbW9kZWw6IHRoZSBhZ2VudCB2ZXJpZmllcyB0aGUgZG93bmxvYWQgYWdhaW5zdCB0aGUgT1BFUkFUT1ItU0lHTkVEIHNoYSBiZWZvcmUgc3RhZ2luZzsgdGhpcwojIHdyYXBwZXIgUkUtdmVyaWZpZXMgdGhlIHNhbWUgc2hhIGFzIHJvb3QgKGRlZmVuc2UgaW4gZGVwdGgg4oCUIHRoZSBzdWRvZXJzIGFyZyBnbG9iIGlzIGNvYXJzZSwgdGhlCiMgc2hhIGNoZWNrIGhlcmUgaXMgdGhlIHJlYWwgZ2F0ZSkuIFBhdGggY29uZmluZW1lbnQ6IGFwcGx5IG9ubHkgZXZlciByZWFkcyBmcm9tIHRoZSBhZ2VudCdzIG93bgojIHN0YWdpbmcgZGlyIGFuZCBvbmx5IGV2ZXIgd3JpdGVzIHRoZSBmaXhlZCBsaXZlIHBhdGggKyBpdHMgc2libGluZ3MuIE5PIGVudi1vdmVycmlkYWJsZSBwYXRocyDigJQKIyBwYXRoLWZpeGVkbmVzcyBJUyB0aGUgc2VjdXJpdHkgcHJvcGVydHkgKGEgdGVzdC1tb2RlIG92ZXJyaWRlIHdvdWxkIGJlIGEgcm9vdCBlc2NhbGF0aW9uIGhvbGUpLgojCiMgVmVyYnM6CiMgICBhcHBseSA8c3RhZ2VkPiA8c2hhMjU2PiAgc3RhZ2UtdmVyaWZ5IOKGkiAucHJldiDihpIgYXRvbWljIGZsaXAg4oaSIHBlbmRpbmcgbWFya2VyIOKGkiBkZXRhY2hlZCByZXN0YXJ0CiMgICBjb21taXQgICAgICAgICAgICAgICAgICAgY2xlYXIgdGhlIHBlbmRpbmcgbWFya2VyIChpZGVtcG90ZW50OyAucHJldiByZXRhaW5lZCBhcyBhIG1hbnVhbCBuZXQpCiMgICByb2xsYmFjayAgICAgICAgICAgICAgICAgcGVuZGluZy1ndWFyZGVkIHJldmVydCB0byAucHJldiArIHJlc3RhcnQgKG5vIHBlbmRpbmcg4oaSIGV4aXQgMCBuby1vcCkKc2V0IC11CgpCSU49L3Vzci9sb2NhbC9iaW4vZmVsaG9tLWFnZW50ClBSRVY9JEJJTi5wcmV2ClNUQUdJTkc9L3Zhci9saWIvZmVsaG9tLWFnZW50L3NlbGZ1cGRhdGUKIyBSLTg2MSAoYWdlbnQgdjAuMTQ2LjEpOiBgYXBwbHlgIHRha2VzIE9OTFkgdGhlIHJvb3Qtb3duZWQgY29weSBmZWxob20tb3MtYXBwbHkgd3JpdGVzIGFmdGVyIGl0IGhhcyB2ZXJpZmllZCB0aGUKIyBvcGVyYXRvcidzIHNpZ25hdHVyZSBhbmQgaGFzaGVkIGV4YWN0bHkgdGhvc2UgYnl0ZXMgKG1vZGUgYWdlbnRfdXBkYXRlKS4gVGhlIGFnZW50IGNhbm5vdCBjYWxsIGBhcHBseWAgYW55IG1vcmUgKGl0CiMgbGVmdCB0aGUgc3Vkb2VycyksIGFuZCB0aGUgYWdlbnQncyBvd24gc3RhZ2luZyBkaXIgaXMgbm8gbG9uZ2VyIGFjY2VwdGVkOiBhIGZpbGUgaW4gYSBkaXJlY3RvcnkgdGhlIGFnZW50IG93bnMgY2FuIGJlCiMgc3dhcHBlZCBiZXR3ZWVuIHRoaXMgc2NyaXB0J3Mgc2hhIGNoZWNrIGFuZCBpdHMgY29weS4KUk9PVF9TVEFHSU5HPS92YXIvbGliL2ZlbGhvbS1vcy1hcHBseS9hZ2VudC11cGRhdGUKUEVORElORz0kU1RBR0lORy9wZW5kaW5nLmpzb24KVU5JVD1mZWxob20tYWdlbnQuc2VydmljZQoKIyBFdmVyeSByZWZ1c2FsL2RlY2lzaW9uIGdvZXMgdG8gc3RkZXJyIEFORCB0aGUgam91cm5hbCAoc3RyaWN0IHJ1bGUgMTApLgpsb2coKSB7IGVjaG8gImZlbGhvbS1zZWxmdXBkYXRlLWd1YXJkZWQ6ICQqIiA+JjI7IGxvZ2dlciAtdCBmZWxob20tc2VsZnVwZGF0ZS1ndWFyZGVkIC0tICIkKiIgMj4vZGV2L251bGwgfHwgdHJ1ZTsgfQoKY2FzZSAiJHsxOi19IiBpbgoKYXBwbHkpCiAgICBzdGFnZWQ9JHsyOi19OyB3YW50PSR7MzotfQogICAgIyBbU0YtN10gZW50cnkgc3dlZXA6IGEga2lsbCBiZXR3ZWVuIHN0YWdpbmctY29weSBhbmQgbXYgbGVhdmVzIGFuIG9ycGhhbmVkIHRlbXAg4oCUIGhhcm1sZXNzLAogICAgIyBidXQgc3dlZXAgaXQgc28gdGVtcHMgY2FuIG5ldmVyIGFjY3VtdWxhdGUuCiAgICBybSAtZiAiJEJJTiIubmV3LioKCiAgICBpZiBbIC16ICIkc3RhZ2VkIiBdIHx8IFsgLXogIiR3YW50IiBdOyB0aGVuCiAgICAgICAgbG9nICJyZWZ1c2luZyBhcHBseTogdXNhZ2U6IGFwcGx5IDxzdGFnZWQ+IDxzaGEyNTY+IgogICAgICAgIGV4aXQgMgogICAgZmkKICAgICMgUm9vdC1zaWRlIHBhdGggY29uZmluZW1lbnQ6IHRoZSBzdGFnZWQgYmluYXJ5IE1VU1QgYmUgZmVsaG9tLW9zLWFwcGx5J3Mgcm9vdC1vd25lZCBjb3B5IChSLTg2MSkuCiAgICBjYXNlICIkc3RhZ2VkIiBpbgogICAgICAgICIkUk9PVF9TVEFHSU5HIi8qKSA7OwogICAgICAgICopIGxvZyAicmVmdXNpbmcgYXBwbHk6IHN0YWdlZCBwYXRoIG91dHNpZGUgJFJPT1RfU1RBR0lORzogJHN0YWdlZCI7IGV4aXQgMSA7OwogICAgZXNhYwogICAgaWYgWyAtTCAiJHN0YWdlZCIgXSB8fCBbICIkKHN0YXQgLWMgJXUgIiRzdGFnZWQiIDI+L2Rldi9udWxsKSIgIT0gIjAiIF07IHRoZW4KICAgICAgICBsb2cgInJlZnVzaW5nIGFwcGx5OiAkc3RhZ2VkIGlzIGEgc3ltbGluayBvciBub3Qgcm9vdC1vd25lZCI7IGV4aXQgMQogICAgZmkKICAgIGNhc2UgIiRzdGFnZWQiIGluCiAgICAgICAgKi4uKikgbG9nICJyZWZ1c2luZyBhcHBseTogc3RhZ2VkIHBhdGggY29udGFpbnMgJy4uJyI7IGV4aXQgMSA7OwogICAgZXNhYwogICAgWyAtZiAiJHN0YWdlZCIgXSB8fCB7IGxvZyAicmVmdXNpbmcgYXBwbHk6IHN0YWdlZCBmaWxlIG1pc3Npbmc6ICRzdGFnZWQiOyBleGl0IDE7IH0KICAgICMgVGhlIHNoYSBtdXN0IGJlIDY0IGxvd2VyY2FzZSBoZXggY2hhcnMg4oCUIGFueXRoaW5nIGVsc2UgaXMgcmVmdXNlZCBiZWZvcmUgYW55IGhhc2hpbmcuCiAgICBjYXNlICIkd2FudCIgaW4KICAgICAgICAqWyEwLTlhLWZdKikgbG9nICJyZWZ1c2luZyBhcHBseTogc2hhMjU2IGlzIG5vdCBsb3dlcmNhc2UgaGV4IjsgZXhpdCAxIDs7CiAgICBlc2FjCiAgICBbICIkeyN3YW50fSIgLWVxIDY0IF0gfHwgeyBsb2cgInJlZnVzaW5nIGFwcGx5OiBzaGEyNTYgbXVzdCBiZSA2NCBoZXggY2hhcnMgKGdvdCAkeyN3YW50fSkiOyBleGl0IDE7IH0KCiAgICAjIFtTRi03XSBzaGEtdmVyaWZ5IEZJUlNUIOKAlCBiZWZvcmUgLnByZXYsIGJlZm9yZSBhbnkgbXV0YXRpb24gKHNwaWtlIFMzYSBjb21wYW5pb24gb3JkZXJpbmcpLgogICAgZ290PSQoc2hhMjU2c3VtICIkc3RhZ2VkIiB8IGF3ayAne3ByaW50ICQxfScpCiAgICBpZiBbICIkZ290IiAhPSAiJHdhbnQiIF07IHRoZW4KICAgICAgICBsb2cgInJlZnVzaW5nIGFwcGx5OiBzaGEgbWlzbWF0Y2ggKGdvdD0kZ290IHdhbnQ9JHdhbnQpIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICAjIFNhbWUtZnMgYXNzZXJ0ICjCpzgpOiB0aGUgYXRvbWljLXJlbmFtZSBndWFyYW50ZWUgb25seSBob2xkcyB3aXRoaW4gb25lIGZpbGVzeXN0ZW0uCiAgICBpZiBbICIkKHN0YXQgLWMgJWQgIiRzdGFnZWQiKSIgIT0gIiQoc3RhdCAtYyAlZCAvdXNyL2xvY2FsL2JpbikiIF07IHRoZW4KICAgICAgICBsb2cgInJlZnVzaW5nIGFwcGx5OiBzdGFnaW5nIGFuZCAvdXNyL2xvY2FsL2JpbiBhcmUgb24gZGlmZmVyZW50IGZpbGVzeXN0ZW1zIOKAlCBhdG9taWMgcmVuYW1lIGltcG9zc2libGUiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgIG9sZF92ZXI9JCgiJEJJTiIgLS12ZXJzaW9uIDI+L2Rldi9udWxsIHwgYXdrICd7cHJpbnQgJDJ9JykKICAgIFsgLW4gIiRvbGRfdmVyIiBdIHx8IG9sZF92ZXI9dW5rbm93bgogICAgIyBUaGUgc3RhZ2VkIGZpbGVuYW1lIGlzIGZlbGhvbS1hZ2VudC08dmVyc2lvbj4gKGV4ZWN1dG9yIGNvbnRyYWN0KSDigJQgdmVyc2lvbiB3aXRob3V0IGV4ZWN1dGluZy4KICAgIG5ld192ZXI9JChiYXNlbmFtZSAiJHN0YWdlZCIpOyBuZXdfdmVyPSR7bmV3X3ZlciNmZWxob20tYWdlbnQtfQoKICAgIGNwIC1wICIkQklOIiAiJFBSRVYiIHx8IHsgbG9nICJhcHBseSBmYWlsZWQ6IGNhbm5vdCBzbmFwc2hvdCBjdXJyZW50IGJpbmFyeSB0byAucHJldiI7IGV4aXQgMTsgfQogICAgIyBTdGFnZSBhIHJvb3Qtb3duZWQgMDc1NSBjb3B5IG5leHQgdG8gdGhlIGxpdmUgcGF0aCwgdGhlbiBBVE9NSUMgc2FtZS1mcyByZW5hbWUuCiAgICBpZiAhIGNwICIkc3RhZ2VkIiAiJEJJTi5uZXcuJCQiIHx8ICEgY2htb2QgMDc1NSAiJEJJTi5uZXcuJCQiIHx8ICEgY2hvd24gcm9vdDpyb290ICIkQklOLm5ldy4kJCI7IHRoZW4KICAgICAgICBybSAtZiAiJEJJTi5uZXcuJCQiOyBsb2cgImFwcGx5IGZhaWxlZDogc3RhZ2luZyBjb3B5IjsgZXhpdCAxCiAgICBmaQogICAgbXYgIiRCSU4ubmV3LiQkIiAiJEJJTiIgfHwgeyBybSAtZiAiJEJJTi5uZXcuJCQiOyBsb2cgImFwcGx5IGZhaWxlZDogYXRvbWljIHJlbmFtZSI7IGV4aXQgMTsgfQoKICAgICMgUGVuZGluZyBtYXJrZXI6IHdyaXR0ZW4gQUZURVIgdGhlIGZsaXAg4oCUIGl0cyBleGlzdGVuY2UgbWVhbnMgImFuIHVwZGF0ZSBpcyBhd2FpdGluZyBjb21taXQiLAogICAgIyB3aGljaCBpcyBleGFjdGx5IHRoZSByb2xsYmFjayB1bml0J3MgdHJpZ2dlciBjb25kaXRpb24uCiAgICBwcmludGYgJ3sib2xkX3ZlcnNpb24iOiIlcyIsIm5ld192ZXJzaW9uIjoiJXMiLCJzaGEyNTYiOiIlcyIsImFwcGxpZWRfYXQiOiIlcyJ9XG4nIFwKICAgICAgICAiJG9sZF92ZXIiICIkbmV3X3ZlciIgIiR3YW50IiAiJChkYXRlIC1JcykiID4gIiRQRU5ESU5HIiBcCiAgICAgICAgfHwgeyBsb2cgImFwcGx5IGZhaWxlZDogY2Fubm90IHdyaXRlIHBlbmRpbmcgbWFya2VyIjsgZXhpdCAxOyB9CgogICAgIyBbU0YtNC81XSBkZWxpYmVyYXRlIHJlc3RhcnRzIGNvbnN1bWUgc3RhcnQtbGltaXQgYnVkZ2V0IOKAlCBjbGVhciB0aGUgY291bnRlciBmaXJzdC4KICAgIHN5c3RlbWN0bCByZXNldC1mYWlsZWQgIiRVTklUIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAjIFtTRi02XSB0aGUgc3Bpa2UncyBTMmIgd2lubmVyLCB2ZXJiYXRpbTogZGV0YWNoZWQgdHJhbnNpZW50IHRpbWVyIE9VVFNJREUgdGhlIGFnZW50J3MgY2dyb3VwLAogICAgIyBzbyB0aGUgc3Vkby9hZ2VudCBjYWxsZXIgc3Vydml2ZXMgdG8gbG9nIHRoZSBoYW5kb2ZmIGFuZCB0aGUgcmVzdGFydCBjYW5ub3QgYmUgdG9ybiBkb3duCiAgICAjIGJ5IGl0cyBvd24gcmVxdWVzdGVyIGR5aW5nLgogICAgc3lzdGVtZC1ydW4gLS1vbi1hY3RpdmU9MnMgLS10aW1lci1wcm9wZXJ0eT1BY2N1cmFjeVNlYz0xMDBtcyBzeXN0ZW1jdGwgcmVzdGFydCAiJFVOSVQiIFwKICAgICAgICB8fCB7IGxvZyAiYXBwbHk6IGZsaXAgZG9uZSBidXQgZGV0YWNoZWQgcmVzdGFydCBzY2hlZHVsaW5nIEZBSUxFRCDigJQgcmVzdGFydCAkVU5JVCBtYW51YWxseSI7IGV4aXQgMTsgfQogICAgbG9nICJhcHBsaWVkICRuZXdfdmVyIChwcmV2ICRvbGRfdmVyLCBzaGEgJHdhbnQpOyBkZXRhY2hlZCByZXN0YXJ0IHNjaGVkdWxlZCIKICAgIDs7Cgpjb21taXQpCiAgICBpZiBbICEgLWYgIiRQRU5ESU5HIiBdOyB0aGVuCiAgICAgICAgbG9nICJjb21taXQ6IG5vIHBlbmRpbmcg4oCUIG5vLW9wIgogICAgICAgIGV4aXQgMAogICAgZmkKICAgICMgLnByZXYgaXMgZGVsaWJlcmF0ZWx5IFJFVEFJTkVEIChzcGlrZSBTM2QpIOKAlCBhIG1hbnVhbCBzYWZldHkgbmV0IHVudGlsIHRoZSBuZXh0IGFwcGx5LgogICAgcm0gLWYgIiRQRU5ESU5HIiB8fCB7IGxvZyAiY29tbWl0IGZhaWxlZDogY2Fubm90IHJlbW92ZSBwZW5kaW5nIG1hcmtlciI7IGV4aXQgMTsgfQogICAgbG9nICJjb21taXR0ZWQgKHBlbmRpbmcgY2xlYXJlZCwgLnByZXYgcmV0YWluZWQpIgogICAgOzsKCnJvbGxiYWNrKQogICAgIyBbU0YtMV0gT24gc3lzdGVtZCAyNTcgT25GYWlsdXJlPSBmaXJlcyBvbiBFVkVSWSBjcmFzaCwgc28gdGhpcyB2ZXJiIHJ1bnMgTUFOWSB0aW1lcyBwZXIKICAgICMgaW5jaWRlbnQg4oCUIHRoZSBwZW5kaW5nLWd1YXJkIG1ha2VzIGV2ZXJ5IGZpcmUgYWZ0ZXIgdGhlIGZpcnN0IGEgaGFybWxlc3Mgbm8tb3AsIGFuZCBtYWtlcyBhCiAgICAjIGNyYXNoIHdpdGggTk8gdXBkYXRlIGluIGZsaWdodCB0b3VjaCBub3RoaW5nIGF0IGFsbCAoc3Bpa2UgUzFkL1MzZSkuCiAgICBpZiBbICEgLWYgIiRQRU5ESU5HIiBdOyB0aGVuCiAgICAgICAgbG9nICJyb2xsYmFjazogbm8gcGVuZGluZyB1cGRhdGUg4oCUIG5vLW9wIgogICAgICAgIGV4aXQgMAogICAgZmkKICAgIFsgLWYgIiRQUkVWIiBdIHx8IHsgbG9nICJyb2xsYmFjayBGQUlMRUQ6IHBlbmRpbmcgZXhpc3RzIGJ1dCBubyAucHJldiBiaW5hcnkiOyBleGl0IDE7IH0KICAgIHJtIC1mICIkQklOIi5uZXcuKgogICAgaWYgISBjcCAiJFBSRVYiICIkQklOLm5ldy4kJCIgfHwgISBjaG1vZCAwNzU1ICIkQklOLm5ldy4kJCIgfHwgISBjaG93biByb290OnJvb3QgIiRCSU4ubmV3LiQkIjsgdGhlbgogICAgICAgIHJtIC1mICIkQklOLm5ldy4kJCI7IGxvZyAicm9sbGJhY2sgRkFJTEVEOiBzdGFnaW5nIGNvcHkiOyBleGl0IDEKICAgIGZpCiAgICBtdiAiJEJJTi5uZXcuJCQiICIkQklOIiB8fCB7IHJtIC1mICIkQklOLm5ldy4kJCI7IGxvZyAicm9sbGJhY2sgRkFJTEVEOiBhdG9taWMgcmVuYW1lIjsgZXhpdCAxOyB9CiAgICAjIENsZWFyIHBlbmRpbmcgQkVGT1JFIHRoZSByZXN0YXJ0OiBvbmNlIHRoZSBiaW5hcnkgaXMgcmV2ZXJ0ZWQsIGxhdGVyIE9uRmFpbHVyZSBmaXJlcyBtdXN0CiAgICAjIG5vLW9wICh0aGUgZ3VhcmQgYWJvdmUpIGluc3RlYWQgb2YgcmUtY29weWluZyAucHJldiBmb3JldmVyLgogICAgcm0gLWYgIiRQRU5ESU5HIgogICAgIyBbU0YtNC81XSB0aGUgY3Jhc2ggYnVyc3QgaGFzIGJlZW4gZWF0aW5nIHRoZSBzdGFydC1saW1pdCBidWRnZXQg4oCUIHJlc2V0IGJlZm9yZSBzdGFydGluZy4KICAgIHN5c3RlbWN0bCByZXNldC1mYWlsZWQgIiRVTklUIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAjIERpcmVjdCByZXN0YXJ0IGlzIGNvcnJlY3QgSEVSRTogdGhpcyBjYWxsZXIgaXMgdGhlIHJvbGxiYWNrIG9uZXNob3QsIE9VVFNJREUgdGhlIGFnZW50IGNncm91cC4KICAgIHN5c3RlbWN0bCByZXN0YXJ0ICIkVU5JVCIgfHwgeyBsb2cgInJvbGxiYWNrOiBiaW5hcnkgcmV2ZXJ0ZWQgYnV0IHJlc3RhcnQgRkFJTEVEIjsgZXhpdCAxOyB9CiAgICBsb2cgInJvbGxlZCBiYWNrIHRvIHByZXZpb3VzIGJpbmFyeSBhbmQgcmVzdGFydGVkICRVTklUIgogICAgOzsKCiopCiAgICBsb2cgInVzYWdlOiBmZWxob20tc2VsZnVwZGF0ZS1ndWFyZGVkIGFwcGx5IDxzdGFnZWQ+IDxzaGEyNTY+IHwgY29tbWl0IHwgcm9sbGJhY2siCiAgICBleGl0IDIKICAgIDs7CmVzYWMK",
   "mode": "0o755",
   "path": "/usr/local/sbin/felhom-selfupdate-guarded",
   "policy": "replace",
   "sha256": "a5a1bcf5e4219493929879bda5791c37de3053f261a4819dfe065415b8824ef9",
   "source": "configs/felhom-selfupdate-guarded"
  },
  {
   "check": "bash",
   "content_b64": "IyEvYmluL2Jhc2gKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBmZWxob20tcGJzLWFwcGx5IOKAlCB0aGUgT05MWSBzdG9yYWdlLWVudHJ5IHBhdGggdGhlIGZlbGhvbS1hZ2VudCBzdWRvZXJzIHBlcm1pdHMgZm9yIHRoZSBQQlMgRFIKIyB0aWVyIChzbGljZSAyOyBTUElLRS1wYnMtdGllci1wcm92aXNpb25pbmctMjAyNi0wNy0xMCDCpzJiKS4gVGhlIGd1YXJkZWQtbWtmcyBzaGFwZTogdGhlIGFnZW50J3MKIyBpbi1wcm9jZXNzIHZhbGlkYXRpb24gaXMgdGhlIFBSSU1BUlkgZ2F0ZSAoZGVzY3JpcHRvci1maWVsZCBjaGFyc2V0ICsgZXF1YWxpdHkgY2hlY2tzIEJFRk9SRQojIGV4ZWMpOyB0aGlzIHdyYXBwZXIgaXMgdGhlIG1pbmltYWwsIGF1ZGl0YWJsZSBzZWNvbmQgZ2F0ZSBhcyByb290LgojCiMgVEhFIFNFVC1PTkxZIExBVyAoc3Bpa2Ugwqc0LCBkYXRhLWxvc3MgY2xhc3MpOiBgcHZlc21gIGVudHJ5IGRlbGV0aW9uIERFU1RST1lTIHRoZSBjbGllbnQKIyBlbmNyeXB0aW9uIGtleSBmaWxlICg8aWQ+LmVuYyA9IEspIOKAlCB1bi1kZWNyeXB0YWJsZSBiYWNrdXBzLiBUaGlzIHdyYXBwZXIgdGhlcmVmb3JlIGNvbnRhaW5zCiMgTk8gZGVsZXRpb24gcGF0aCBvZiBhbnkga2luZCwgYW5kIGEgcmUtYXBwbHkgaXMgYHB2ZXNtIHNldGAtb25seS4gR3JlcC1hc3NlcnRhYmxlOyBkbyBub3QgYWRkCiMgYSAiY2xlYW51cCIgdmVyYiBoZXJlLCBldmVyLiBEZXByb3Zpc2lvbiBpcyBhIGRlbGliZXJhdGUgZnV0dXJlIG9wZXJhdG9yIG9wLCBub3QgdGhpcyB0b29sLgojCiMgU0VDUkVUIERJU0NJUExJTkUgKHNwaWtlIMKnMmIpOiBzdWRvIGxvZ3MgaXRzIGZ1bGwgYXJndiB0byBhdXRoLmxvZyDihpIgdGhlIFBCUyB0b2tlbiBzZWNyZXQKIyBhcnJpdmVzIG9uIFNURElOLCBuZXZlciBhcyBhbiBhcmd1bWVudCB0byB0aGlzIHdyYXBwZXIuIEluc2lkZSwgaXQgaXMgcGFzc2VkIHRvIHB2ZXNtJ3MKIyAtLXBhc3N3b3JkIChyb290LWxvY2FsLCB0cmFuc2llbnQgcHMgZXhwb3N1cmUg4oCUIHRoZSBhY2NlcHRlZCBzcGlrZSBwb3N0dXJlKTsgaXQgaXMgbmV2ZXIKIyBlY2hvZWQsIG5ldmVyIHdyaXR0ZW4gYW55d2hlcmUgZXhjZXB0IGJ5IHB2ZXNtIGl0c2VsZiAodGhlIDA2MDAgLnB3IHN0b3JlKS4KIwojIE9wcyAobm9uLXNlY3JldCBhcmdzIG9uIGFyZ3YpOgojICAgY3JlYXRlICAgIDxpZD4gPHNlcnZlcj4gPGRhdGFzdG9yZT4gPG5hbWVzcGFjZT4gPHRva2VuLWlkPiA8ZmluZ2VycHJpbnQ+IDxzZWNyZXQtZGlyPgojICAgICAgICAgICAgIHNlY3JldCBvbiBzdGRpbiAocmVxdWlyZWQpLiBDcmVhdGVzIHRoZSBwYnMgZW50cnkgd2l0aCAtLWVuY3J5cHRpb24ta2V5IGF1dG9nZW4KIyAgICAgICAgICAgICAoSyBib3JuIGF0IC9ldGMvcHZlL3ByaXYvc3RvcmFnZS88aWQ+LmVuYyksIHRoZW4gcGxhY2VzIC5wdy8uZW5jIGNvcGllcyBpbgojICAgICAgICAgICAgIDxzZWNyZXQtZGlyPiB3aGVuIGl0IGRpZmZlcnMgKHRoZSDCpzRiIFdBUk4tZml4IGRpcjsgZXNjcm93LWNyZWF0ZSdzIFBCU0VuY0tleVBhdGgKIyAgICAgICAgICAgICBtdXN0IGZpbmQgSyB0aGVyZSDigJQgc3Bpa2Ugwqc0IGZsYWcpLgojICAgcmVjb25jaWxlIDxpZD4gPHNlcnZlcj4gPG5hbWVzcGFjZT4gPHRva2VuLWlkPiA8ZmluZ2VycHJpbnQ+IDxzZWNyZXQtZGlyPgojICAgICAgICAgICAgIHNlY3JldCBvbiBzdGRpbiAob3B0aW9uYWw7IGVtcHR5ID0gbm8gY3JlZGVudGlhbCBjaGFuZ2UpLiBgcHZlc20gc2V0YCBPTkxZOgojICAgICAgICAgICAgIHNlcnZlci9maW5nZXJwcmludCAoKyAtLXBhc3N3b3JkIHdoZW4gYSBzZWNyZXQgaXMgZmVkLCBlLmcuIGFmdGVyIGEgaHViIHJlLWlzc3VlKS4KIyAgICAgICAgICAgICBOT1RFIGRhdGFzdG9yZSBpcyBkZWxpYmVyYXRlbHkgTk9UIHNldHRhYmxlLCBhbmQgbmFtZXNwYWNlL3Rva2VuLWlkIGFyZSBhY2NlcHRlZAojICAgICAgICAgICAgIGZvciB2YWxpZGF0aW9uIHBhcml0eSBidXQgTk9UIGFwcGxpZWQg4oCUIHRlbmFuY3kgaWRlbnRpdHkgaXMgYWRvcHQtb25seSAodGhlCiMgICAgICAgICAgICAgZGVtbydzIGxpdmUgZW50cnkgbXVzdCBuZXZlciBiZSByZXBvaW50ZWQgYXQgYSBkaWZmZXJlbnQgbmFtZXNwYWNlKS4KIyAgIHJlYWQgICAgICA8aWQ+IDxzZWNyZXQtZGlyPgojICAgICAgICAgICAgIFItMzkgbGVnIChiKTogcHJpbnQgdGhlIHN0b3JhZ2UncyB0b2tlbiBzZWNyZXQgdG8gU1RET1VUIGFuZCBub3RoaW5nIGVsc2UuCiMgICAgICAgICAgICAgVGhlIG5vbi1yb290IGFnZW50IFdSSVRFUyB0aGlzIGZpbGUgdGhyb3VnaCB0aGlzIHdyYXBwZXIgYnV0IGNvdWxkIG5ldmVyIHJlYWQgaXQKIyAgICAgICAgICAgICBiYWNrICgvZXRjL3B2ZS9wcml2IGlzIDA3MDAgcm9vdDp3d3ctZGF0YSBhbmQgdGhlcmUgaXMgbm8gcmVhZCB2ZXJiKSwgc28gaXRzCiMgICAgICAgICAgICAgMTUtbWludXRlIFBCUyB2ZXJpZnkgbG9vcCB3YXMgcGVybWFuZW50bHkgYmxpbmQgdG8gdGhlIG9uZSBmYWlsdXJlIGl0IGV4aXN0cyB0bwojICAgICAgICAgICAgIGNhdGNoIOKAlCBhbiBgYXBwbGllZGAgdGllciBhdXRoZW50aWNhdGluZyA0MDEuIFRoaXMgdmVyYiBpcyB0aGF0IG1pc3NpbmcgcmVhZC4KIyAgICAgICAgICAgICBJdCBpcyBkZWxpYmVyYXRlbHkgdGhlIG5hcnJvd2VzdCB0aGluZyB0aGF0IHdvcmtzOiBubyBuZXR3b3JrLCBubyBtdXRhdGlvbiwgbm8KIyAgICAgICAgICAgICBsb2dnaW5nIG9mIHRoZSB2YWx1ZSwgb25lIGZpbGUsIHByZWZpeC1hc3NlcnRlZCB1bmRlciB0aGUgZ2l2ZW4gc2VjcmV0IGRpci4KIwojICAgZ3JhbnQgICAgIDxpZD4KIyAgICAgICAgICAgICBUaGUgUGFydC0wLWV2aWRlbmNlZCBkdWFsLWdyYW50OiBGZWxob21BZ2VudFN0b3JlIG9uIC9zdG9yYWdlLzxpZD4gdG8gdGhlIGFnZW50CiMgICAgICAgICAgICAgdXNlciBBTkQgdG9rZW4gKHByaXZzZXAgaW50ZXJzZWN0aW9uKS4gRGF0YXN0b3JlLkF1ZGl0IHJlYWRzIHJpZGUgdGhlIGJhc2Ugcm9sZS4KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc2V0IC1ldW8gcGlwZWZhaWwKCmRpZSgpIHsgZWNobyAiZmVsaG9tLXBicy1hcHBseTogUkVGVVNFRDogJCoiID4mMjsgZXhpdCAxOyB9CgpvcD0iJHsxOi19IjsgaWQ9IiR7MjotfSIKW1sgLW4gIiRvcCIgJiYgLW4gIiRpZCIgXV0gfHwgZGllICJ1c2FnZTogZmVsaG9tLXBicy1hcHBseSA8Y3JlYXRlfHJlY29uY2lsZXxncmFudHxyZWFkPiA8c3RvcmFnZS1pZD4gLi4uIgoKIyBTdG9yYWdlIGlkOiBQVkUgZ3JhbW1hciwgY29uc2VydmF0aXZlLiBBbHNvIHRoZSBBQ0wgcGF0aCBjb21wb25lbnQg4oCUIG5vIHNsYXNoZXMgcG9zc2libGUuCltbICIkaWQiID1+IF5bQS1aYS16XVtBLVphLXowLTlfLi1dezAsMjd9JCBdXSB8fCBkaWUgImJhZCBzdG9yYWdlIGlkICgkaWQpIgoKU1RPUkVDRkc9L2V0Yy9wdmUvc3RvcmFnZS5jZmcKUFJJVkRJUj0vZXRjL3B2ZS9wcml2L3N0b3JhZ2UKCmVudHJ5X2V4aXN0cygpIHsgZ3JlcCAtRXEgIl5wYnM6ICR7aWR9XCQiICIkU1RPUkVDRkciOyB9Cgp2YWxfc2VydmVyKCkgICAgeyBbWyAiJDEiID1+IF5bQS1aYS16MC05XVtBLVphLXowLTkuLV17MCw2Mn0kIF1dIHx8IGRpZSAiYmFkIHNlcnZlciAoJDEpIjsgfQp2YWxfZGF0YXN0b3JlKCkgeyBbWyAiJDEiID1+IF5bQS1aYS16MC05XVtBLVphLXowLTlfLi1dezAsMzF9JCBdXSB8fCBkaWUgImJhZCBkYXRhc3RvcmUgKCQxKSI7IH0KdmFsX25zKCkgICAgICAgIHsgW1sgIiQxIiA9fiBeW0EtWmEtejAtOV1bQS1aYS16MC05Xy4tXXswLDMxfSQgXV0gfHwgZGllICJiYWQgbmFtZXNwYWNlICgkMSkiOyB9CnZhbF90b2soKSAgICAgICB7IFtbICIkMSIgPX4gXltBLVphLXowLTlfLi1dK0BbQS1aYS16MC05XSshW0EtWmEtejAtOV8uLV0rJCBdXSB8fCBkaWUgImJhZCB0b2tlbiBpZCAoJDEpIjsgfQp2YWxfZnAoKSAgICAgICAgeyBbWyAiJDEiID1+IF4oW0EtRmEtZjAtOV17Mn06KXszMX1bQS1GYS1mMC05XXsyfSQgXV0gfHwgZGllICJiYWQgZmluZ2VycHJpbnQiOyB9CnZhbF9zZGlyKCkgewogIGNhc2UgIiQxIiBpbgogICAgL2V0Yy9wdmUvcHJpdi9zdG9yYWdlKSA6IDs7CiAgICAvdmFyL2xpYi9mZWxob20tYWdlbnQvKikgW1sgIiQxIiAhPSAqLi4qIF1dIHx8IGRpZSAic2VjcmV0LWRpciB0cmF2ZXJzYWwiIDs7CiAgICAqKSBkaWUgInNlY3JldC1kaXIgbXVzdCBiZSAkUFJJVkRJUiBvciB1bmRlciAvdmFyL2xpYi9mZWxob20tYWdlbnQgKCQxKSIgOzsKICBlc2FjCn0KCnJlYWRfc2VjcmV0KCkgeyAjIOKGkiBTRUNSRVQgKG1heSBiZSBlbXB0eSB3aGVuIG9wdGlvbmFsKQogIGxvY2FsIHMKICBzPSQoaGVhZCAtYyAyNTYgfHwgdHJ1ZSkKICBzPSIke3MlJCdcbid9Ijsgcz0iJHtzJSQnXHInfSIKICBwcmludGYgJyVzJyAiJHMiCn0KCnBsYWNlX2NvcGllcygpIHsgIyBzZWNyZXQtZGlyIOKAlCB0aGUgwqc0YiBXQVJOLWZpeCBwbGFjZW1lbnQgKG5vbi1yb290IGFnZW50IGNhbid0IHJlYWQgL2V0Yy9wdmUvcHJpdikKICBsb2NhbCBzZGlyPSIkMSIKICBbWyAiJHNkaXIiID09ICIkUFJJVkRJUiIgXV0gJiYgcmV0dXJuIDAKICBpbnN0YWxsIC1kIC1vIGZlbGhvbS1hZ2VudCAtZyBmZWxob20tYWdlbnQgLW0gMDcwMCAiJHNkaXIiCiAgW1sgLWYgIiRQUklWRElSLyRpZC5wdyIgXV0gJiYgaW5zdGFsbCAtbyBmZWxob20tYWdlbnQgLWcgZmVsaG9tLWFnZW50IC1tIDA2MDAgIiRQUklWRElSLyRpZC5wdyIgIiRzZGlyLyRpZC5wdyIKICAjIEsncyBjb3B5OiBlc2Nyb3ctY3JlYXRlIHN0YXRzIFBCU0VuY0tleVBhdGgoPHNlY3JldC1kaXI+LzxpZD4uZW5jKSDigJQgdGhlIHNwaWtlIMKnNCBmbGFnLgogIFtbIC1mICIkUFJJVkRJUi8kaWQuZW5jIiBdXSAmJiBpbnN0YWxsIC1vIHJvb3QgLWcgZmVsaG9tLWFnZW50IC1tIDA2NDAgIiRQUklWRElSLyRpZC5lbmMiICIkc2Rpci8kaWQuZW5jIgogIHJldHVybiAwCn0KCmNhc2UgIiRvcCIgaW4KY3JlYXRlKQogIFtbICQjIC1lcSA4IF1dIHx8IGRpZSAiY3JlYXRlIG5lZWRzIDcgYXJnczogPGlkPiA8c2VydmVyPiA8ZGF0YXN0b3JlPiA8bmFtZXNwYWNlPiA8dG9rZW4taWQ+IDxmaW5nZXJwcmludD4gPHNlY3JldC1kaXI+IgogIHNlcnZlcj0iJDMiOyBkYXRhc3RvcmU9IiQ0IjsgbnM9IiQ1IjsgdG9rPSIkNiI7IGZwPSIkNyI7IHNkaXI9IiQ4IgogIHZhbF9zZXJ2ZXIgIiRzZXJ2ZXIiOyB2YWxfZGF0YXN0b3JlICIkZGF0YXN0b3JlIjsgdmFsX25zICIkbnMiOyB2YWxfdG9rICIkdG9rIjsgdmFsX2ZwICIkZnAiOyB2YWxfc2RpciAiJHNkaXIiCiAgZW50cnlfZXhpc3RzICYmIGRpZSAiZW50cnkgJGlkIGFscmVhZHkgZXhpc3RzIChyZWNvbmNpbGUgaXMgdGhlIHJlLWFwcGx5IHBhdGgg4oCUIHNldC1vbmx5IGxhdykiCiAgU0VDUkVUPSQocmVhZF9zZWNyZXQpCiAgW1sgLW4gIiRTRUNSRVQiIF1dIHx8IGRpZSAiY3JlYXRlIHJlcXVpcmVzIHRoZSB0b2tlbiBzZWNyZXQgb24gc3RkaW4iCiAgcHZlc20gYWRkIHBicyAiJGlkIiBcCiAgICAtLXNlcnZlciAiJHNlcnZlciIgLS1kYXRhc3RvcmUgIiRkYXRhc3RvcmUiIC0tbmFtZXNwYWNlICIkbnMiIFwKICAgIC0tdXNlcm5hbWUgIiR0b2siIC0tcGFzc3dvcmQgIiRTRUNSRVQiIC0tZmluZ2VycHJpbnQgIiRmcCIgXAogICAgLS1jb250ZW50IGJhY2t1cCAtLWVuY3J5cHRpb24ta2V5IGF1dG9nZW4gPiYyCiAgW1sgLWYgIiRQUklWRElSLyRpZC5lbmMiIF1dIHx8IGRpZSAicHZlc20gYWRkIHN1Y2NlZWRlZCBidXQgSyAoJFBSSVZESVIvJGlkLmVuYykgd2FzIG5vdCBib3JuIgogIHBsYWNlX2NvcGllcyAiJHNkaXIiCiAgZWNobyAiZmVsaG9tLXBicy1hcHBseTogY3JlYXRlZCAkaWQgKEsgYm9ybjsgZW5jcnlwdGlvbi1rZXkgYXV0b2dlbikiID4mMgogIDs7CnJlY29uY2lsZSkKICBbWyAkIyAtZXEgNyBdXSB8fCBkaWUgInJlY29uY2lsZSBuZWVkcyA2IGFyZ3M6IDxpZD4gPHNlcnZlcj4gPG5hbWVzcGFjZT4gPHRva2VuLWlkPiA8ZmluZ2VycHJpbnQ+IDxzZWNyZXQtZGlyPiIKICBzZXJ2ZXI9IiQzIjsgbnM9IiQ0IjsgdG9rPSIkNSI7IGZwPSIkNiI7IHNkaXI9IiQ3IgogIHZhbF9zZXJ2ZXIgIiRzZXJ2ZXIiOyB2YWxfbnMgIiRucyI7IHZhbF90b2sgIiR0b2siOyB2YWxfZnAgIiRmcCI7IHZhbF9zZGlyICIkc2RpciIKICBlbnRyeV9leGlzdHMgfHwgZGllICJlbnRyeSAkaWQgZG9lcyBub3QgZXhpc3QgKGNyZWF0ZSBpcyB0aGUgZnJlc2ggcGF0aCkiCiAgU0VDUkVUPSQocmVhZF9zZWNyZXQpCiAgIyBSLTM5ICgyMDI2LTA3LTE4KTogTkVWRVIgcGFzcyAtLXNlcnZlciB0byBgcHZlc20gc2V0YC4gUFZFIHRyZWF0cyBgc2VydmVyYCBhcyBhIENSRUFURS1PTkxZCiAgIyBwYXJhbWV0ZXIgYW5kIHJlamVjdHMgdGhlIEVOVElSRSBjYWxsIOKAlCAiY2FuJ3QgY2hhbmdlIHZhbHVlIG9mIGZpeGVkIHBhcmFtZXRlciAnc2VydmVyJyIg4oCUCiAgIyBldmVuIHdoZW4gdGhlIHZhbHVlIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBzdG9yZWQgb25lLiBUaGF0IG1hZGUgZXZlcnkgcmVjb25jaWxlIGV4aXQgMjU1LAogICMgc28gZWFjaCBodWItcmUtaXNzdWVkIG9uZS10aW1lIHNlY3JldCB3YXMgY29uc3VtZWQtdGhlbi1idXJuZWQgYW5kIHRoZSB0aWVyIHN0YXllZCBwaW5uZWQgdG8KICAjIGEgcmV2b2tlZCBjcmVkZW50aWFsICg0MDEgZm9yZXZlcikuIFByb3ZlbiBsaXZlIG9uIHRoZSBOMTAwIGRlbW8gaG9zdDogYHB2ZXNtIHNldCA8aWQ+CiAgIyAtLXNlcnZlciA8c2FtZT4gLS1maW5nZXJwcmludCA8c2FtZT5gIC0+IHJlamVjdGVkOyB0aGUgc2FtZSBjYWxsIHdpdGhvdXQgLS1zZXJ2ZXIgLT4gcmMgMC4KICAjIFRoZSBzZXJ2ZXIgYWRkcmVzcyBpcyBpbW11dGFibGUgYnkgY29uc3RydWN0aW9uIChyZWxvY2F0aW5nIGEgUEJTIGVuZHBvaW50IG5lZWRzIGEgZnJlc2gKICAjIGNyZWF0ZSksIHNvIHRoZXJlIGlzIG5vdGhpbmcgaGVyZSB0byByZWNvbmNpbGUuIEd1YXJkZWQgYnkKICAjIFRlc3RSZWNvbmNpbGVOZXZlclBhc3Nlc1NlcnZlclRvUHZlc21TZXQuCiAgYXJncz0oLS1maW5nZXJwcmludCAiJGZwIikKICBbWyAtbiAiJFNFQ1JFVCIgXV0gJiYgYXJncys9KC0tcGFzc3dvcmQgIiRTRUNSRVQiKQogIHB2ZXNtIHNldCAiJGlkIiAiJHthcmdzW0BdfSIgPiYyCiAgcGxhY2VfY29waWVzICIkc2RpciIKICBlY2hvICJmZWxob20tcGJzLWFwcGx5OiByZWNvbmNpbGVkICRpZCAoc2V0LW9ubHk7IHRlbmFuY3kgaWRlbnRpdHkgdW50b3VjaGVkKSIgPiYyCiAgOzsKcmVhZCkKICAjIFItMzkoYik6IHRoZSBtaXNzaW5nIHJlYWQgcGF0aC4gUHJpbnRzIHRoZSBzZWNyZXQgdG8gU1RET1VULCBub3RoaW5nIGVsc2Ug4oCUIG5vIHN0ZGVyciBub3RlIChpdAogICMgd291bGQgYmUgdGhlIG9ubHkgdmVyYiB3aG9zZSBzdWNjZXNzIGxpbmUgY291bGQgYmUgY29uZnVzZWQgd2l0aCB0aGUgdmFsdWUpLCBubyBtdXRhdGlvbi4KICAjCiAgIyBUcmF2ZXJzYWwgaXMgcmVmdXNlZCB0aHJlZSB0aW1lcyBvdmVyLCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9uZSB2ZXJiIHRoYXQgRVhGSUxUUkFURVMgYSBmaWxlIGFuZAogICMgaXRzIGFyZ3YgaXMgYXR0YWNrZXItc2hhcGVkIGlmIHRoZSBhZ2VudCBpcyBldmVyIGNvbXByb21pc2VkOgogICMgICAxLiBgaWRgIGFscmVhZHkgbWF0Y2hlZCBeW0EtWmEtel1bQS1aYS16MC05Xy4tXXswLDI3fSQgYXQgdGhlIHRvcCDigJQgaXQgY2Fubm90IHN0YXJ0IHdpdGggYSBkb3QKICAjICAgICAgYW5kIGNhbm5vdCBjb250YWluIGEgc2xhc2gsIHNvICIuLi8uLi9ldGMvc2hhZG93IiBuZXZlciByZWFjaGVzIGhlcmU7CiAgIyAgIDIuIHZhbF9zZGlyIHBpbnMgdGhlIGRpcmVjdG9yeSB0byBQUklWRElSIG9yIHVuZGVyIC92YXIvbGliL2ZlbGhvbS1hZ2VudCwgcmVqZWN0aW5nICIuLiI7CiAgIyAgIDMuIHRoZSBSRVNPTFZFRCBwYXRoIGlzIHByZWZpeC1hc3NlcnRlZCB1bmRlciB0aGF0IGRpcmVjdG9yeSBiZWxvdywgc28gZXZlbiBhIGZ1dHVyZSBjaGFuZ2UgdG8KICAjICAgICAgZWl0aGVyIGdyYW1tYXIgY2Fubm90IHdhbGsgb3V0LgogIFtbICQjIC1lcSAzIF1dIHx8IGRpZSAicmVhZCBuZWVkcyAyIGFyZ3M6IDxpZD4gPHNlY3JldC1kaXI+IgogIHNkaXI9IiQzIgogIHZhbF9zZGlyICIkc2RpciIKICB0YXJnZXQ9IiRzZGlyLyRpZC5wdyIKICAjIEJlbHQ6IHJlc29sdmUgYW5kIHJlLWNoZWNrIHRoZSBwcmVmaXggKGd1YXJkcyBhIHN5bWxpbmtlZCA8aWQ+LnB3IHBvaW50aW5nIG91dHNpZGUgdGhlIGRpcikuCiAgcmVzb2x2ZWQ9JChyZWFkbGluayAtZiAtLSAiJHRhcmdldCIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBbWyAtbiAiJHJlc29sdmVkIiBdXSB8fCBkaWUgInNlY3JldCBmaWxlIG5vdCBmb3VuZCAoJHRhcmdldCkiCiAgY2FzZSAiJHJlc29sdmVkIiBpbgogICAgIiRzZGlyIi8qKSA6IDs7CiAgICAqKSBkaWUgInJlc29sdmVkIHNlY3JldCBwYXRoIGVzY2FwZXMgdGhlIHNlY3JldCBkaXIiIDs7CiAgZXNhYwogIFtbIC1mICIkcmVzb2x2ZWQiIF1dIHx8IGRpZSAic2VjcmV0IGZpbGUgbm90IGZvdW5kICgkdGFyZ2V0KSIKICBjYXQgLS0gIiRyZXNvbHZlZCIKICA7OwpncmFudCkKICBbWyAkIyAtZXEgMiBdXSB8fCBkaWUgImdyYW50IHRha2VzIG9ubHkgPGlkPiIKICBwdmV1bSBhY2wgbW9kaWZ5ICIvc3RvcmFnZS8kaWQiIC0tdXNlcnMgZmVsaG9tLWFnZW50QHB2ZSAtLXJvbGVzIEZlbGhvbUFnZW50U3RvcmUgPiYyCiAgcHZldW0gYWNsIG1vZGlmeSAiL3N0b3JhZ2UvJGlkIiAtLXRva2VucyAnZmVsaG9tLWFnZW50QHB2ZSFhZ2VudCcgLS1yb2xlcyBGZWxob21BZ2VudFN0b3JlID4mMgogIGVjaG8gImZlbGhvbS1wYnMtYXBwbHk6IGdyYW50ZWQgRmVsaG9tQWdlbnRTdG9yZSBvbiAvc3RvcmFnZS8kaWQgKHVzZXIgKyB0b2tlbikiID4mMgogIDs7CiopCiAgZGllICJ1bmtub3duIG9wICgkb3ApIgogIDs7CmVzYWMK",
   "mode": "0o755",
   "path": "/usr/local/sbin/felhom-pbs-apply",
   "policy": "replace",
   "sha256": "104db0a4401f65bbc476e82bfb1796433bcb36f8f8cce69efb3bb5c40fcb16b3",
   "source": "configs/felhom-pbs-apply"
  },
  {
   "check": "bash",
   "content_b64": "IyEvYmluL2Jhc2gKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBmZWxob20tYmFja3VwLXRhcmdldC1hcHBseSDigJQgdGhlIE9OTFkgcGF0aCB0aGUgZmVsaG9tLWFnZW50IHN1ZG9lcnMgcGVybWl0cyBmb3IgY3JlYXRpbmcgdGhlCiMgd2hvbGUtZ3Vlc3QgYmFja3VwIFRBUkdFVCBzdG9yYWdlIGFuZCBncmFudGluZyB0aGUgYWdlbnQgYWNjZXNzIHRvIGl0IChFLTJhKS4KIwojIFdIWSBBIFdSQVBQRVIgQVQgQUxMLiBDcmVhdGluZyBhIFBWRSBzdG9yYWdlIG5lZWRzIGBEYXRhc3RvcmUuQWxsb2NhdGVgIGF0IGAvc3RvcmFnZWAsIGFuZCB0aGUgQUNMCiMgZ3JhbnQgbmVlZHMgYFBlcm1pc3Npb25zLk1vZGlmeWAuIFRoZSBhZ2VudCBob2xkcyBORUlUSEVSIGJ5IGRlc2lnbiDigJQgaXRzIHRva2VuIGlzIHNjb3BlZCBwZXIKIyBzdG9yYWdlIHBhdGggZm9yIGJsYXN0LXJhZGl1cyBjb250YWlubWVudCwgYW5kIGBQZXJtaXNzaW9ucy5Nb2RpZnlgIHdvdWxkIGxldCBpdCByZXdyaXRlIGl0cyBvd24KIyBhdXRob3JpdHkuIFdpZGVuaW5nIHRoZSBQVkUgcm9sZSB0byBtYWtlIHRoZSBtb3ZlIHBvc3NpYmxlIHdvdWxkIHRyYWRlIHRoZSBlbnRpcmUgY29udGFpbm1lbnQgbW9kZWwKIyBmb3Igb25lIGZlYXR1cmUuIFNvIHRoZSBwcml2aWxlZ2VkIGhhbGYgbGl2ZXMgaGVyZTogYSBtaW5pbWFsLCBhdWRpdGFibGUgcm9vdCBzaGltIHdpdGggYSBmaXhlZAojIHZvY2FidWxhcnksIGV4YWN0bHkgbGlrZSBmZWxob20tbWtmcy1ndWFyZGVkIGFuZCBmZWxob20tcGJzLWFwcGx5LgojCiMgVEhFIE5PLURFTEVURSBMQVcgKGluaGVyaXRlZCBmcm9tIGZlbGhvbS1wYnMtYXBwbHksIHNhbWUgcmVhc29uaW5nIGNsYXNzKS4gVGhpcyB3cmFwcGVyIGNvbnRhaW5zIE5PCiMgc3RvcmFnZS1yZW1vdmFsIHBhdGggb2YgYW55IGtpbmQuIGBwdmVzbSByZW1vdmVgIG9uIGEgZGlyIHN0b3JhZ2UgZG9lcyBub3QgZGVsZXRlIHRoZSBhcmNoaXZlcywgYnV0CiMgaXQgRE9FUyBzaWxlbnRseSBvcnBoYW4gYSBjb25maWd1cmVkIGJhY2t1cCB0aWVyLCBhbmQgYSAiY2xlYW51cCIgdmVyYiBoZXJlIHdvdWxkIGJlIHJlYWNoYWJsZSBieQojIGFueSBidWcgaW4gdGhlIGFnZW50LiBSZXRpcmluZyBhIHRhcmdldCBpcyBhIGRlbGliZXJhdGUgb3BlcmF0b3Igb3AsIG5vdCB0aGlzIHRvb2wuIEdyZXAtYXNzZXJ0YWJsZTsKIyBkbyBub3QgYWRkIG9uZS4KIwojIFRIRSBUV08gTEFXUyBFLTEgUEFJRCBGT1IgT04gTElWRSBIQVJEV0FSRSwgYm90aCBlbmZvcmNlZCBoZXJlIHJhdGhlciB0aGFuIHRydXN0ZWQgdG8gdGhlIGNhbGxlcjoKIwojICAgRi0xICB0aGUgc3RvcmFnZSBwYXRoIG11c3QgQkUgdGhlIGRyaXZlJ3Mgb3duIG1vdW50cG9pbnQuIEEgc3ViZGlyZWN0b3J5IGZhaWxzIHRoZSBhZ2VudCdzCiMgICAgICAgIGV4YWN0TW91bnQgY2hlY2ssIHNvIHRoZSB0YXJnZXQgcmVwb3J0cyBgZGlzY29ubmVjdGVkYCBGT1JFVkVSIGFuZCBpdHMgZHVyYWJsZSBpZCBkZWdyYWRlcwojICAgICAgICBvZmYgdGhlIGZpbGVzeXN0ZW0gVVVJRC4gRW5mb3JjZWQ6IGBtb3VudHBvaW50IC1xYCBtdXN0IHBhc3Mgb24gdGhlIGV4YWN0IHBhdGggZ2l2ZW4uCiMKIyAgIEYtMiAgLS1pc19tb3VudHBvaW50IDEgaXMgbm90IG9wdGlvbmFsLiBXaXRob3V0IGl0LCBhbiB1bnBsdWdnZWQgb3IgbGF0ZS1tb3VudGluZyBkcml2ZSBsZWF2ZXMgYQojICAgICAgICBiYXJlIGRpcmVjdG9yeSBvbiB0aGUgUk9PVCBmaWxlc3lzdGVtIGFuZCB2emR1bXAgd3JpdGVzIHRoZSB3aG9sZS1ndWVzdCBiYWNrdXAgb250byB0aGUKIyAgICAgICAgc3lzdGVtIGRyaXZlIOKAlCB0aGUgZXhhY3QgZGV2aWNlIHRoZSB3aG9sZSBjaGFuZ2UgZXhpc3RzIHRvIGVzY2FwZSDigJQgd2hpbGUgUFZFIHJlcG9ydHMgdGhlCiMgICAgICAgIHN0b3JhZ2UgYGFjdGl2ZWAgYW5kIGFkdmVydGlzZXMgdGhlIHJvb3QgZmlsZXN5c3RlbSdzIGZyZWUgc3BhY2UuIFByb3ZlbiBsaXZlOiB0aGUgdW5ndWFyZGVkCiMgICAgICAgIGZvcm0gaGFkIGFscmVhZHkgY3JlYXRlZCBkdW1wLyBvbiBwdmUtcm9vdC4gSGFyZGNvZGVkIGJlbG93OyBub3QgYSBjYWxsZXItc3VwcGxpZWQgZmxhZy4KIwojIE9wcyAoYWxsIG5vbi1zZWNyZXQ7IG5vdGhpbmcgaGVyZSB0b3VjaGVzIGEgY3JlZGVudGlhbCwgc28gbm90aGluZyBhcnJpdmVzIG9uIHN0ZGluKToKIyAgIGNyZWF0ZSA8aWQ+IDxtb3VudHBvaW50PgojICAgICAgICAgICBDcmVhdGUgYSBgZGlyYCBzdG9yYWdlIHdpdGggY29udGVudD1iYWNrdXAgYXQgPG1vdW50cG9pbnQ+LCBpc19tb3VudHBvaW50IDEuCiMgICAgICAgICAgIElERU1QT1RFTlQ6IGFuIGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIFNBTUUgcGF0aCBpcyBhY2NlcHRlZCAocmUtcnVuIHNhZmUsIGFuZCB0aGUKIyAgICAgICAgICAgaW5zdGFsbGVyIHJlLXJ1biBwYXRoIGRlcGVuZHMgb24gaXQpLiBBbiBleGlzdGluZyBlbnRyeSB3aXRoIGEgRElGRkVSRU5UIHBhdGggaXMgUkVGVVNFRAojICAgICAgICAgICDigJQgc2lsZW50bHkgcmVwb2ludGluZyBhIGxpdmUgYmFja3VwIHRhcmdldCBpcyB0aGUgZmFpbHVyZSB0aGlzIHdob2xlIGFyYyBjbG9zZXMuCiMgICBncmFudCAgPGlkPgojICAgICAgICAgICBUaGUgZHVhbCBncmFudDogRmVsaG9tQWdlbnRTdG9yZSBvbiAvc3RvcmFnZS88aWQ+IHRvIHRoZSBhZ2VudCB1c2VyIEFORCB0b2tlbiAocHJpdnNlcAojICAgICAgICAgICBpbnRlcnNlY3Rpb24g4oCUIGEgdG9rZW4ncyByaWdodHMgYXJlIHRoZSBpbnRlcnNlY3Rpb24sIHNvIGdyYW50aW5nIG9uZSBpcyBncmFudGluZyBuZWl0aGVyKS4KIyAgICAgICAgICAgV2l0aG91dCBpdCBldmVyeSBiYWNrdXAgNDAzcyBvbiBmaXJzdCBydW4gKEUtMSBmaW5kaW5nIEYtMywgZm91bmQgYnkgdGhlIGZpcnN0IHJlYWwgYmFja3VwKS4KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc2V0IC1ldW8gcGlwZWZhaWwKCmRpZSgpIHsgZWNobyAiZmVsaG9tLWJhY2t1cC10YXJnZXQtYXBwbHk6IFJFRlVTRUQ6ICQqIiA+JjI7IGV4aXQgMTsgfQoKb3A9IiR7MTotfSI7IGlkPSIkezI6LX0iCltbIC1uICIkb3AiICYmIC1uICIkaWQiIF1dIHx8IGRpZSAidXNhZ2U6IGZlbGhvbS1iYWNrdXAtdGFyZ2V0LWFwcGx5IDxjcmVhdGV8Z3JhbnQ+IDxzdG9yYWdlLWlkPiBbbW91bnRwb2ludF0iCgojIFN0b3JhZ2UgaWQ6IFBWRSBncmFtbWFyLCBjb25zZXJ2YXRpdmUuIEFsc28gdGhlIEFDTCBwYXRoIGNvbXBvbmVudCDigJQgbm8gc2xhc2hlcyBwb3NzaWJsZS4KW1sgIiRpZCIgPX4gXltBLVphLXpdW0EtWmEtejAtOV8uLV17MCwyN30kIF1dIHx8IGRpZSAiYmFkIHN0b3JhZ2UgaWQgKCRpZCkiCgpTVE9SRUNGRz0vZXRjL3B2ZS9zdG9yYWdlLmNmZwoKIyBjdXJyZW50X3BhdGhfb2YgPGlkPiDigJQgdGhlIGNvbmZpZ3VyZWQgYHBhdGhgIG9mIGRpciBzdG9yYWdlIDxpZD4sIG9yICIiIHdoZW4gYWJzZW50L25vdC1hLWRpci4KY3VycmVudF9wYXRoX29mKCkgewogIGF3ayAtdiB3YW50PSJkaXI6ICQxIiAnCiAgICAkMCA9PSB3YW50IHsgZm91bmQ9MTsgbmV4dCB9CiAgICBmb3VuZCAmJiAvXlthLXpdKzogLyB7IGV4aXQgfQogICAgZm91bmQgJiYgJDEgPT0gInBhdGgiIHsgcHJpbnQgJDI7IGV4aXQgfQogICcgIiRTVE9SRUNGRyIgMj4vZGV2L251bGwgfHwgdHJ1ZQp9CgpjYXNlICIkb3AiIGluCmNyZWF0ZSkKICBbWyAkIyAtZXEgMyBdXSB8fCBkaWUgImNyZWF0ZSB0YWtlcyA8aWQ+IDxtb3VudHBvaW50PiIKICBtcD0iJDMiCiAgIyBBYnNvbHV0ZSwgbm9ybWFsaXplZCwgbm8gdHJhdmVyc2FsLCBubyBzaGVsbCBtZXRhY2hhcmFjdGVycy4gVGhlIHZhbHVlIHJlYWNoZXMgcHZlc20gYW5kIHRoZQogICMgZmlsZXN5c3RlbSwgc28gaXQgaXMgdmFsaWRhdGVkIGhlcmUgcmF0aGVyIHRoYW4gYXNzdW1lZCB3ZWxsLWZvcm1lZC4KICBbWyAiJG1wIiA9IC8qIF1dICAgICAgICAgICAgfHwgZGllICJtb3VudHBvaW50IG11c3QgYmUgYWJzb2x1dGUgKCRtcCkiCiAgW1sgIiRtcCIgIT0gKiIuLiIqIF1dICAgICAgIHx8IGRpZSAibW91bnRwb2ludCBtdXN0IG5vdCBjb250YWluIC4uICgkbXApIgogIFtbICIkbXAiID1+IF5bQS1aYS16MC05L18uLV0rJCBdXSB8fCBkaWUgIm1vdW50cG9pbnQgaGFzIHVuZXhwZWN0ZWQgY2hhcmFjdGVycyAoJG1wKSIKICBbWyAiJG1wIiAhPSAiLyIgXV0gICAgICAgICAgfHwgZGllICJyZWZ1c2luZyAvIGFzIGEgYmFja3VwIHRhcmdldCIKCiAgIyBGLTEgKyBGLTIsIGNoZWNrZWQgYXMgb25lOiB0aGUgcGF0aCBtdXN0IEJFIGEgbW91bnRwb2ludCByaWdodCBub3cuIEEgYmFyZSBkaXJlY3RvcnkgaGVyZSBpcwogICMgcHJlY2lzZWx5IHRoZSBzaWxlbnQtcmV0YXJnZXQgc2hhcGUsIGFuZCBpc19tb3VudHBvaW50IHdvdWxkIG1ha2UgUFZFIHJlZnVzZSBpdCBsYXRlciBhbnl3YXkg4oCUCiAgIyBiZXR0ZXIgdG8gcmVmdXNlIG5vdywgd2l0aCBhIHJlYXNvbiwgdGhhbiB0byBjcmVhdGUgYSBzdG9yYWdlIHRoYXQgY2FuIG5ldmVyIGFjdGl2YXRlLgogIG1vdW50cG9pbnQgLXEgIiRtcCIgfHwgZGllICIkbXAgaXMgbm90IGEgbW91bnRwb2ludCDigJQgdGhlIGJhY2t1cCB0YXJnZXQgbXVzdCBiZSB0aGUgZHJpdmUncyBPV04gbW91bnRwb2ludCAoRi0xKSwgYW5kIGFuIHVubW91bnRlZCBwYXRoIHdvdWxkIHNpbGVudGx5IHJldGFyZ2V0IG9udG8gdGhlIHN5c3RlbSBkcml2ZSAoRi0yKSIKCiAgIyBOZXZlciB0aGUgc3lzdGVtIGRpc2s6IGEgdGFyZ2V0IG9uIHRoZSByb290IGZpbGVzeXN0ZW0gaXMgbm90IGRyaXZlLWxvc3MgcHJvdGVjdGlvbiwgaXQgaXMgdGhlCiAgIyB0aGluZyB3ZSBhcmUgZXNjYXBpbmcuIFRoZSByb290IGRldmljZSBhbmQgdGhlIGNhbmRpZGF0ZSdzIGRldmljZSBhcmUgY29tcGFyZWQsIG5vdCB0aGVpciBwYXRocy4KICByb290X2Rldj0iJChmaW5kbW50IC1ubyBTT1VSQ0UgLyAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICBtcF9kZXY9IiQoZmluZG1udCAtbm8gU09VUkNFICIkbXAiIDI+L2Rldi9udWxsIHx8IHRydWUpIgogIFtbIC1uICIkbXBfZGV2IiBdXSB8fCBkaWUgImNvdWxkIG5vdCByZXNvbHZlIHRoZSBiYWNraW5nIGRldmljZSBvZiAkbXAiCiAgW1sgIiRtcF9kZXYiICE9ICIkcm9vdF9kZXYiIF1dIHx8IGRpZSAiJG1wIGlzIGJhY2tlZCBieSB0aGUgUk9PVCBkZXZpY2UgKCRyb290X2Rldikg4oCUIGEgYmFja3VwIHRhcmdldCB0aGVyZSBwcm90ZWN0cyBhZ2FpbnN0IGNvcnJ1cHRpb24gb25seSwgbmV2ZXIgZHJpdmUgbG9zcyIKCiAgZXhpc3Rpbmc9IiQoY3VycmVudF9wYXRoX29mICIkaWQiKSIKICBpZiBbWyAtbiAiJGV4aXN0aW5nIiBdXTsgdGhlbgogICAgaWYgW1sgIiRleGlzdGluZyIgPT0gIiRtcCIgXV07IHRoZW4KICAgICAgZWNobyAiZmVsaG9tLWJhY2t1cC10YXJnZXQtYXBwbHk6IHN0b3JhZ2UgJGlkIGFscmVhZHkgZXhpc3RzIGF0ICRtcCDigJQgbm90aGluZyB0byBkbyAoaWRlbXBvdGVudCkiID4mMgogICAgICBleGl0IDAKICAgIGZpCiAgICBkaWUgInN0b3JhZ2UgJGlkIGFscmVhZHkgZXhpc3RzIGF0ICRleGlzdGluZyDigJQgcmVmdXNpbmcgdG8gcmVwb2ludCBpdCBhdCAkbXAgKGEgbGl2ZSBiYWNrdXAgdGFyZ2V0IGlzIG5ldmVyIHNpbGVudGx5IG1vdmVkKSIKICBmaQoKICAjIGlzX21vdW50cG9pbnQgMSBpcyBIQVJEQ09ERUQgKEYtMikuIGNvbnRlbnQ9YmFja3VwIG9ubHk6IHRoaXMgc3RvcmFnZSBleGlzdHMgZm9yIHZ6ZHVtcCBhcmNoaXZlcwogICMgYW5kIG11c3QgbmV2ZXIgYmVjb21lIGEgcGxhY2UgZ3Vlc3RzIGFyZSBhbGxvY2F0ZWQgb24uCiAgcHZlc20gYWRkIGRpciAiJGlkIiAtLXBhdGggIiRtcCIgLS1jb250ZW50IGJhY2t1cCAtLWlzX21vdW50cG9pbnQgMSA+JjIKICBlY2hvICJmZWxob20tYmFja3VwLXRhcmdldC1hcHBseTogY3JlYXRlZCBkaXIgc3RvcmFnZSAkaWQgYXQgJG1wIChjb250ZW50PWJhY2t1cCwgaXNfbW91bnRwb2ludCAxKSIgPiYyCiAgOzsKZ3JhbnQpCiAgW1sgJCMgLWVxIDIgXV0gfHwgZGllICJncmFudCB0YWtlcyBvbmx5IDxpZD4iCiAgIyBCT1RILCBhbHdheXMuIEEgcHJpdnNlcCB0b2tlbidzIHJpZ2h0cyBhcmUgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdXNlcidzIGFuZCB0aGUgdG9rZW4ncyBBQ0xzLAogICMgc28gZ3JhbnRpbmcgb25lIG9mIHRoZSB0d28gZ3JhbnRzIG5vdGhpbmcgdXNhYmxlLgogIHB2ZXVtIGFjbCBtb2RpZnkgIi9zdG9yYWdlLyRpZCIgLS11c2VycyBmZWxob20tYWdlbnRAcHZlIC0tcm9sZXMgRmVsaG9tQWdlbnRTdG9yZSA+JjIKICBwdmV1bSBhY2wgbW9kaWZ5ICIvc3RvcmFnZS8kaWQiIC0tdG9rZW5zICdmZWxob20tYWdlbnRAcHZlIWFnZW50JyAtLXJvbGVzIEZlbGhvbUFnZW50U3RvcmUgPiYyCiAgZWNobyAiZmVsaG9tLWJhY2t1cC10YXJnZXQtYXBwbHk6IGdyYW50ZWQgRmVsaG9tQWdlbnRTdG9yZSBvbiAvc3RvcmFnZS8kaWQgKHVzZXIgKyB0b2tlbikiID4mMgogIDs7CiopCiAgZGllICJ1bmtub3duIG9wICgkb3ApIgogIDs7CmVzYWMK",
   "mode": "0o755",
   "path": "/usr/local/sbin/felhom-backup-target-apply",
   "policy": "replace",
   "sha256": "b71d869871efae6d13e8dc0809b7ce112d2c0051333e55af0af35d5a4fee506e",
   "source": "configs/felhom-backup-target-apply"
  },
  {
   "check": "python",
   "content_b64": "IyEvdXNyL2Jpbi9weXRob24zCiMgZmVsaG9tLW9zLWFwcGx5IOKAlCB0aGUgUk9PVCBoYWxmIG9mIHRoZSBhZ2VudCdzIG9wZXJhdGluZy1zeXN0ZW0gdXBkYXRlIGxlZyAoYDExLW9zLXVwZGF0ZXMubWRgIMKnNS40LjEsIMKnOC4x4oCTOC4yKS4KIwojIEluc3RhbGwgYXMgL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1vcy1hcHBseSAoMDc1NSByb290OnJvb3QpLiBUaGUgbm9uLXJvb3QgYWdlbnQgaW52b2tlcyBpdCB2aWEgYHN1ZG8gLW5gCiMgKEZFTEhPTV9PU0FQUExZIGFsaWFzKSB3aXRoIEVYQUNUTFk6ICAgZmVsaG9tLW9zLWFwcGx5IC0tcGxhbiAvdmFyL2xpYi9mZWxob20tYWdlbnQvb3MvcGxhbi08aWQ+Lmpzb24KIyBOb3RoaW5nIGVsc2Ugb24gdGhlIGNvbW1hbmQgbGluZSBpcyBhY2NlcHRlZC4gUHl0aG9uIDMsIHN0YW5kYXJkIGxpYnJhcnkgb25seSAoYSBKU09OIHBsYW4gY2Fubm90IGJlIHBhcnNlZAojIHNhZmVseSBpbiBzaCkuIFRlc3RzOiBjb25maWdzL3Rlc3RfZmVsaG9tX29zX2FwcGx5LnB5IChhIGZha2UgcnVubmVyOyBub3RoaW5nIHJlYWwgaXMgZXhlY3V0ZWQpLgojCiMgVEhFIFRSVVNUIE1PREVMLiBUaGUgcGxhbiBpcyB3cml0dGVuIGJ5IHRoZSBhZ2VudCwgc28gYSBicm9rZW4taW50byBhZ2VudCB3cml0ZXMgd2hhdGV2ZXIgcGxhbiBpdCBsaWtlcy4gVGhlCiMgcHJvdGVjdGlvbiBpcyB0aGVyZWZvcmUgd2hhdCB0aGlzIGZpbGUgUkVGVVNFUywgbm90IHdoZXJlIHRoZSBwbGFuIGNhbWUgZnJvbTogbm8gcmVtb3ZhbCwgbm8gZG93bmdyYWRlLCBubyBuZXcKIyBwYWNrYWdlLCBubyBwYWNrYWdlIG91dHNpZGUgdGhlIHBsYW4sIG9ubHkgRGViaWFuIG9yaWdpbiBpbiB0aGUgZmFzdCBsYW5lLCBubyBrZXJuZWwgLyBib290IHBhY2thZ2Ugb24gdGhlIGhvc3QsCiMgb25seSB0aGUgYm94J3Mgb3duIGN1c3RvbWVyIGd1ZXN0LCBhbmQgdGhlIGhvc3QgbGF5ZXIgb25seSBvbiBhIGJveCB3aG9zZSBST09ULU9XTkVEIGluc3RhbGwgcmVjb3JkIHNheXMKIyAiYXBwbGlhbmNlIiAoYSBCWU8gaG9zdCBiZWxvbmdzIHRvIGl0cyBvd25lciwgYDExYCDCpzEpLiBQYWNrYWdlIHNpZ25hdHVyZXMgc3RheSBEZWJpYW4nczogYXB0IGNoZWNrcyBldmVyeSBSZWxlYXNlCiMgZmlsZSwgaW5jbHVkaW5nIHRoZSBzbmFwc2hvdC5kZWJpYW4ub3JnIGZhbGxiYWNrIChkZWNpc2lvbiA3OSkuIE5vdGhpbmcgaGVyZSBpcyBvdmVycmlkYWJsZSBmcm9tIHRoZSBlbnZpcm9ubWVudC4KIwojIExBWUVSUyAoYWdlbnQgdjAuMTQxLjApOiAiZ3Vlc3QiICh0aGUgY3VzdG9tZXIgTFhDLCBlbnRlcmVkIHdpdGggYHBjdCBleGVjYCkgYW5kICJob3N0IiAodGhpcyBQcm94bW94IGhvc3QsIHJ1bgojIGRpcmVjdGx5KS4gTEFORTogImZhc3QiIGZvciB0aG9zZSB0d28uIEFnZW50IHYwLjE0Mi4wIGFkZHMgdGhlIGxheWVyICJkb2NrZXIiICh0aGUgZ3Vlc3QncyBEb2NrZXIgZW5naW5lIHNldCwgYDExYAojIMKnNS44KSwgd2hpY2ggaXMgdGhlIFNMT1cgbGFuZTogbGFuZSAic2xvdyIgb25seSwgdGhlIHNpeCBEb2NrZXIgcGFja2FnZXMgb25seSwgb3JpZ2luICJEb2NrZXIgQ0UiIG9ubHksIGFuZCBvbmx5CiMgd2l0aCBhbiBhdXRob3JpdHkgdGhpcyBmaWxlIGNoZWNrcyBJVFNFTEYgKFIzKTogYSBzaWduZWQgb3BlcmF0b3Igam9iIHZlcmlmaWVkIHdpdGggYHNzaC1rZXlnZW4gLVkgdmVyaWZ5YCBhZ2FpbnN0CiMgdGhlIFJPT1QtT1dORUQgc2lnbmVycyBmaWxlIChUUlVTVF9TSUdORVJTKSwgYm91bmQgdG8gdGhpcyBob3N0IChUUlVTVF9GSUxFIGhvc3RfaWQpLCB1bmV4cGlyZWQgYW5kIG5ldmVyIHJlcGxheWVkOwojIG9yLCBmb3IgYW4gdW5zaWduZWQgcmluZy0wIHN0ZXAsIHRoZSByb290LW93bmVkIFRSVVNUX0ZJTEUgc2F5aW5nIGAicmluZzBfc2xvd19sYW5lIjogdHJ1ZWAgKHNldCBieSBoYW5kIG9uIHRoZSBkZW1vCiMgYm94ZXMgb25seSkuIFRoZSBhZ2VudCdzIG93biBjb25maWcgaXMgTk9UIHRydXN0ZWQgZm9yIGVpdGhlcjogdGhlIGFnZW50IGNhbiB3cml0ZSBpdC4gQSBEb2NrZXIgc3RlcCBhbHNvIG5lZWRzCiMgYGxpdmUtcmVzdG9yZWAgT04gKFIxNSkg4oCUIHdpdGhvdXQgaXQgZXZlcnkgY29udGFpbmVyIHJlc3RhcnRzLgojIEFnZW50IHYwLjE1MS4wIChSLTgxMiBvcHRpb24gQSwgYDA5YCDCpzMgZGVjaXNpb24gMTYzKSBhZGRzIHRoZSBsYXllciAicHZlIjogdGhlIEhPU1QncyBQcm94bW94IFVTRVJTUEFDRSBwYWNrYWdlcywKIyBsYW5lICJzbG93IiBvbmx5LCBvcmlnaW4gIlByb3htb3ggRGViaWFuIFJlcG9zaXRvcnkiIG9ubHksIG5ldmVyIGEga2VybmVsIC8gYm9vdCAvIGZpcm13YXJlIC8gbWljcm9jb2RlIG5hbWUgKFIxNCDigJQKIyB0aGUga2VybmVsIGlzIFItODM2J3MgbGFuZSksIG5vIHJlbW92YWwsIG5vIHVuZG8sIGEgTkVXIHBhY2thZ2Ugb25seSBmcm9tIFBWRV9ORVdfQUxMT1csIGFuIGFwcGxpYW5jZSBvbmx5IChSMTIpLCBhbmQKIyB0aGUgc2FtZSBhdXRob3JpdHkgYXMgdGhlIERvY2tlciBzdGVwIChSMzogYSBzaWduZWQgYG9zX3B2ZV9zdGVwYCwgb3IgdGhlIHJvb3Qtb3duZWQgcmluZy0wIG1hcmspLiBTZWxlY3QKIyAicGVuZGluZy1wdmUiIChyaW5nIDApOiBldmVyeSBpbnN0YWxsZWQgUHJveG1veC1vcmlnaW4gcGFja2FnZSB3aXRoIGEgcGVuZGluZyB1cGdyYWRlLCBtaW51cyBIT1NUX1NMT1dfUkUuCiMKIyBNb2RlcyAocGxhbiBmaWVsZCAibW9kZSIpOgojICAgaW52ZW50b3J5ICAgYGFwdC1nZXQgdXBkYXRlYCwgdGhlbiByZXBvcnQgd2hhdCBpcyBpbnN0YWxsZWQgKHdpdGggb3JpZ2luKSwgd2hhdCBpcyBwZW5kaW5nLCBhbmQgaGVhbHRoLgojICAgYXBwbHkgICAgICAgcmVwYWlyIGZpcnN0LCBwaWNrIHRoZSBwYWNrYWdlcyAoc2VsZWN0ICJsaXN0ZWQiOiB0aGUgcGxhbidzIG5hbWU9dmVyc2lvbiBsaXN0OyAicGVuZGluZy1mYXN0IjogZXZlcnkKIyAgICAgICAgICAgICAgIHBlbmRpbmcgRGViaWFuIC8gRGViaWFuLVNlY3VyaXR5IHVwZ3JhZGUsIGZvciByaW5nIDApLCBjaGVjayBldmVyeSByZWZ1c2FsIG9uIGFuIGBhcHQtZ2V0IC1zYAojICAgICAgICAgICAgICAgc2ltdWxhdGlvbiBvZiBFWEFDVExZIG5hbWU9dmVyc2lvbiwgaW5zdGFsbCwgY2xlYW4sIHNjYW4gZm9yIHJlc3RhcnQtbmVlZGVkLCByZXBvcnQgYXMgaW52ZW50b3J5LgojICAgaGVhbHRoICAgICAgcmVwb3J0IGhlYWx0aCBvbmx5ICh0aGUgYWdlbnQgcG9sbHMgaXQgYWZ0ZXIgYSBydW4pLgojICAgZmFjdHMgICAgICAgKHYwLjE0Mi4wKSByZWFkLW9ubHkgdmVyc2lvbnMgZm9yIHRoZSBodWIncyBTeXN0ZW0gcGFnZTogaG9zdCBEZWJpYW4sIHJ1bm5pbmcgYW5kIG5leHQtYm9vdCBrZXJuZWwsCiMgICAgICAgICAgICAgICBoZWxkIHBhY2thZ2VzLCBrZXJuZWwgdGFpbnQsIHRoZSBjcmFzaCBndWFyZDsgZ3Vlc3QgRGViaWFuLCBEb2NrZXIgZW5naW5lLCBjb250YWluZXJkLCBsaXZlLXJlc3RvcmUuCiMgICBsaXZlLXJlc3RvcmUtb24gICh2MC4xNDIuMCwgbGF5ZXIgZ3Vlc3QpIHRoZSBPTkUtVElNRSBzdGVwIG9mIGAwOWAgZGVjaXNpb24gODc6IG1lcmdlIGAibGl2ZS1yZXN0b3JlIjogdHJ1ZWAKIyAgICAgICAgICAgICAgIGludG8gdGhlIGd1ZXN0J3MgL2V0Yy9kb2NrZXIvZGFlbW9uLmpzb24gYW5kIGBzeXN0ZW1jdGwgcmVsb2FkIGRvY2tlcmAuIE5FVkVSIGEgcmVzdGFydCAoUi04MzUpLgojICAgb29tLWNoZWNrICAgKFItNTI4LCBgMDlgIGRlY2lzaW9uIDE1NzsgbGF5ZXIgZG9ja2VyLCBsYW5lIHNsb3cpIE9OTFkgdGhlIG1lbW9yeS1raWxsIGNoZWNrIGJlbG93OiBubyBhcHQsIG5vIGVuZ2luZQojICAgICAgICAgICAgICAgY2hhbmdlLCBubyBhdXRob3JpdHkgbmVlZGVkLiBXcmFwcGVyLW9ubHkg4oCUIHRoZSBhZ2VudCBuZXZlciB3cml0ZXMgdGhpcyBwbGFuOyBydW4gaXQgYnkgaGFuZCBhcyByb290LgojIFItNTI4IChgMDlgIGRlY2lzaW9uIDE1Nyk6IGEgZG9ja2VyLWxheWVyIEFQUExZIGFsc28gcnVucyBgb29tX2NoZWNrKClgIGFmdGVyIGhlYWx0aF9hZnRlciBhbmQgcmVwb3J0cyBpdCBhcwojICAgIm9vbV9jaGVjayI6IHsicmVzdWx0IjogInBhc3MifCJmYWlsInwiZXJyb3IiLCAib29tX2tpbGxlZCI6IGJvb2wsICJvb21fZXZlbnQiOiBib29sLCAiZXhpdF9jb2RlIjogaW50fG51bGwsCiMgICAgICAgICAgICAgICAgICJpbWFnZSI6IHN0cnxudWxsLCAiZGV0YWlsIjogc3RyfQojICAg4oCUIG9uZSB0aHJvd2F3YXkgY29udGFpbmVyICh0aGUgY29udHJvbGxlcidzIG93biBpbWFnZSwgbm8gbmV0d29yayAvIHZvbHVtZSAvIHBvcnQsIDY0IE1CIGNhcCkgaXMgbWFkZSB0byBleGNlZWQgaXRzCiMgICBtZW1vcnk7ICJwYXNzIiBvbmx5IHdoZW4gdGhlIGVuZ2luZSBzYXlzIE9PTUtpbGxlZD10cnVlIEFORCBlbWl0cyB0aGUgYG9vbWAgZXZlbnQuIEl0IG5ldmVyIGNoYW5nZXMgdGhlIHN0ZXAncwojICAgb3V0Y29tZSBvciBoZWFsdGg6IHRoZSBodWIgZGVjaWRlcyB3aGV0aGVyIHRoZSBlbmdpbmUgc2V0IGNhbiBiZSBhcHByb3ZlZC4gUGlubmVkIGJ5IHRoZSBPT01DaGVjayB0ZXN0cy4KIyBPdXRwdXQ6IGxvZyBsaW5lcyBvbiBzdGRlcnIgYW5kIHRoZSBqb3VybmFsICh0YWcgZmVsaG9tLW9zLWFwcGx5KTsgdGhlIExBU1Qgc3Rkb3V0IGxpbmUgaXMKIyAgIE9TQVBQTFktUkVQT1JUIDxvbmUgSlNPTiBvYmplY3Q+CiMgd2hpY2ggaXMgd2hhdCB0aGUgYWdlbnQgcGFyc2VzLiBFeGl0IDAgPSBkb25lOyAyID0gcmVmdXNlZCAobm90aGluZyBjaGFuZ2VkKTsgMyA9IGZhaWxlZCBkdXJpbmcgaW5zdGFsbC4KIwojIFNQRUVEIChSLTg0NSwgYWdlbnQgdjAuMTQxLjApLiBFdmVyeSBgcGN0IGV4ZWNgIGNvc3RzIH4wLjkgcyAobWVhc3VyZWQgb24gZGVtby1ocCksIGFuZCB2MC4xNDAuMCBtYWRlIG9uZSBwZXIKIyBwYWNrYWdlIGZvciB2ZXJzaW9uIGNvbXBhcmlzb25zIOKAlCAyNzIgcGFja2FnZXMg4omIIDQgbWludXRlcy4gVmVyc2lvbnMgYXJlIG5vdyBjb21wYXJlZCB3aXRoIHRoZSBIT1NUJ3MgZHBrZyAodGhlIHNhbWUKIyBEZWJpYW4gYWxnb3JpdGhtKSwgbWFkaXNvbi9wb2xpY3kgcnVuIG9uY2UgcGVyIHBhc3MgZm9yIGFsbCBwYWNrYWdlcywgdGhlIHJlc3RhcnQgc2NhbiBydW5zIG9ubHkgYWZ0ZXIgYW4gaW5zdGFsbCwKIyBhbmQgb25lIHdyYXBwZXIgY2FsbCBkb2VzIHRoZSB3aG9sZSBwYXNzIChubyBzZXBhcmF0ZSBpbnZlbnRvcnkgY2FsbCBiZWZvcmUgYW4gYXBwbHkpLgppbXBvcnQgY2FsZW5kYXIKaW1wb3J0IGpzb24KaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3RhdAppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgc3lzCmltcG9ydCB0aW1lCgpQTEFOX0RJUiA9ICIvdmFyL2xpYi9mZWxob20tYWdlbnQvb3MiClBMQU5fUkUgPSByZS5jb21waWxlKHIiXnBsYW4tW0EtWmEtejAtOS5fLV17MSw4MH1cLmpzb24kIikKQUdFTlRfVVNFUiA9ICJmZWxob20tYWdlbnQiCkZBU1RfT1JJR0lOUyA9ICgiRGViaWFuIiwgIkRlYmlhbi1TZWN1cml0eSIpCiMgRGViaWFuIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvbiBncmFtbWFyIChEZWJpYW4gcG9saWN5IMKnNS42LjEsIMKnNS42LjEyKS4KTkFNRV9SRSA9IHJlLmNvbXBpbGUociJeW2EtejAtOV1bYS16MC05Ky4tXSskIikKVkVSU0lPTl9SRSA9IHJlLmNvbXBpbGUociJeKD86WzAtOV0rOik/WzAtOV1bQS1aYS16MC05Lit+LV0qJCIpClNOQVBfUkUgPSByZS5jb21waWxlKHIiXlswLTldezh9VFswLTldezZ9WiQiKQpSRVNFUlZFRF9WTUlEUyA9IHNldChyYW5nZSg5OTAwMDAsIDk5MDAxMCkpIHwgezk5OTl9CkRSSVZFU19QQVJFTlQgPSAiL21udC9mZWxob20tZHJpdmVzIgpTTkFQU0hPVF9MSVNUID0gIi9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2ZlbGhvbS1vcy1zbmFwc2hvdC5saXN0IgpBUFRfRU5WID0gWyJlbnYiLCAiREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIiwgIkFQVF9MSVNUQ0hBTkdFU19GUk9OVEVORD1ub25lIiwgIk5FRURSRVNUQVJUX01PREU9bCIsICJMQ19BTEw9QyJdCkRQS0dfT1BUUyA9IFsiLW8iLCAiRHBrZzo6T3B0aW9uczo6PS0tZm9yY2UtY29uZm9sZCIsICItbyIsICJEcGtnOjpPcHRpb25zOjo9LS1mb3JjZS1jb25mZGVmIl0KTUlOX0ZSRUUgPSA1MDAgKiAxMDI0ICogMTAyNAojIFItODc2OiBkcGtnJ3Mgc3RhdGUgaW4gT05FIGNhbGwg4oCUIGAtLWF1ZGl0YCwgYSBtYXJrZXIgbGluZSwgdGhlbiB0aGUgdXBkYXRlIGpvdXJuYWwncyBmaWxlIG5hbWVzLgpKT1VSTkFMX01BUksgPSAiQEBGRUxIT00tRFBLRy1KT1VSTkFMQEAiCkRQS0dfU1RBVEVfU0NSSVBUID0gImRwa2cgLS1hdWRpdDsgZWNobyAiICsgSk9VUk5BTF9NQVJLICsgIjsgbHMgLUEgL3Zhci9saWIvZHBrZy91cGRhdGVzIDI+L2Rldi9udWxsOyB0cnVlIgojIFRoZSBpbnN0YWxsZXIncyBST09ULU9XTkVEIHJlY29yZCAoZmVsaG9tLWhvc3QtaW5zdGFsbC5zaCBgc3RhdGVfc2V0IG1vZGVgKTsgdGhlIGFnZW50IGNhbm5vdCB3cml0ZSBpdC4KSU5TVEFMTF9TVEFURSA9ICIvdmFyL2xpYi9mZWxob20taW5zdGFsbC9zdGF0ZS5qc29uIgojIFItNTI4OiB0aGUgbWVtb3J5LWtpbGwgY2hlY2sgKG9vbV9jaGVjaykuIE9uZSAyMDAgTUIgYmxvY2sgdW5kZXIgYSA2NCBNQiBjYXA6IG1lYXN1cmVkIG9uIERvY2tlciAyOS44LjIgdG8gYmUKIyBPT00ta2lsbGVkIHdpdGggT09NS2lsbGVkPXRydWUgYW5kIGFuIGBvb21gIGV2ZW50LiBFdmVyeSBjYWxsIGlzIGJvdW5kZWQ6IHRpbWVvdXRzICh0aGUgY2xvY2sgcmVhZCB0d2ljZSkgKyB0aGUKIyBzZXR0bGUgd2FpdCBzdGF5IHdpdGhpbiA5MCBzLgpPT01DSEVDS19QUkVGSVggPSAiZmVsaG9tLW9vbWNoZWNrLSIKT09NQ0hFQ0tfU0NSSVBUID0gImRkIGlmPS9kZXYvemVybyBvZj0vZGV2L251bGwgYnM9MjAwTSBjb3VudD0xIgpPT01DSEVDS19USU1FT1VUUyA9IHsiaW1hZ2UiOiAxMCwgImNsb2NrIjogNSwgInJ1biI6IDMwLCAiaW5zcGVjdCI6IDEwLCAiZXZlbnRzIjogMTAsICJybSI6IDE1fQojIE1lYXN1cmVkIG9uIGRlbW8taHAgOTIwMSAoRG9ja2VyIDI5LjguMiwgMjAyNi0xMC0wNiwgYXVkaXRzL3JlYWRiYWNrLTIwMjYtMTAtMDcvRi9GMSwgRjIpOiBhbiBgLS11bnRpbGAgdGFrZW4gcmlnaHQKIyBhZnRlciB0aGUgcnVuIE1JU1NFRCB0aGUgb29tIGV2ZW50IGFsdGhvdWdoIE9PTUtpbGxlZD10cnVlOyBhZnRlciBhIDIgcyB3YWl0IGFuZCBgLS11bnRpbGAgPSBndWVzdCBlcG9jaCArIDEgaXQgaXMKIyBzZWVuLiBQaW5uZWQgYnkgdGVzdF9ldmVudHNfd2luZG93X2VuZHNfYWZ0ZXJfdGhlX3NldHRsZV93YWl0LgpPT01DSEVDS19TRVRUTEUgPSAyCiMgS2VybmVsLCBib290IGFuZCBmaXJtd2FyZSBwYWNrYWdlcyBhcmUgdGhlIFNMT1cgbGFuZSBvbiB0aGUgaG9zdCB3aGF0ZXZlciB0aGVpciBvcmlnaW4gKGAxMWAgQzMsIMKnNS4yKTogYSBob3N0CiMgcmVib290IGlzIG5lZWRlZCBmb3IgdGhlbSB0byB0YWtlIGVmZmVjdCwgYW5kIGEgYmFkIG9uZSBjYW4gc3RvcCB0aGUgYm94IGZyb20gYm9vdGluZy4KSE9TVF9TTE9XX1JFID0gcmUuY29tcGlsZShyIl4obGludXgtKGltYWdlfGhlYWRlcnN8a2J1aWxkfG1vZHVsZXN8YmFzZSl8cHJveG1veC1rZXJuZWx8cHJveG1veC1kZWZhdWx0LWtlcm5lbHxwdmUta2VybmVsfCIKICAgICAgICAgICAgICAgICAgICAgICAgICByInB2ZS1maXJtd2FyZXxmaXJtd2FyZS18Z3J1YnxzaGltfHN5c3RlbWQtYm9vdHxpbnRlbC1taWNyb2NvZGV8YW1kNjQtbWljcm9jb2RlfGVmaWJvb3RtZ3IpIikKIyByZXN0YXJ0X25lZWRlZCgpIGxlYXZlcyBvdXQgcHJvY2Vzc2VzIHdob3NlIGNncm91cCBsaW5lIG1hdGNoZXMgKGdyZXAgYmFzaWMgcmVnZXgpLiBIb3N0OiB0aGUgTFhDIGd1ZXN0cycgb3duCiMgcHJvY2Vzc2VzIChgMDo6L2x4Yy88dm1pZD4vLi4uYCkgLS0gTk9UIGx4Yy1zdGFydCBpdHNlbGYsIHdob3NlIGNncm91cCBpcyBgMDo6L2x4Yy5tb25pdG9yLzx2bWlkPmAgKG1lYXN1cmVkCiMgMjAyNi0xMC0wNCBvbiBkZW1vLWZlbGhvbTogdGhlIG9sZCBwYXR0ZXJuICJseGMiIGhpZCBseGMtc3RhcnQgd2l0aCAyMCBkZWxldGVkIG1hcHMsIHNvICJyZWJvb3QgbmVlZGVkIiBzdGF5ZWQgZmFsc2UKIyBhZnRlciBhIGxpYmM2IHVwZGF0ZSkuIFBpbm5lZCBieSB0ZXN0X3Jlc3RhcnRfc2tpcF9wYXR0ZXJuc19hZ2FpbnN0X3JlYWxfY2dyb3Vwcy4KUkVTVEFSVF9TS0lQX0NHUk9VUCA9IHsiZ3Vlc3QiOiAiZG9ja2VyIiwgImhvc3QiOiAiOi9seGMvIn0KSE9TVF9TRVJWSUNFUyA9IFsicHZlcHJveHkiLCAicHZlZGFlbW9uIiwgInB2ZXN0YXRkIiwgInB2ZS1jbHVzdGVyIiwgImZlbGhvbS1hZ2VudCJdCiMgVGhlIERvY2tlciBlbmdpbmUgc2V0IChgMTFgIMKnNS44KTogdGhlIG9ubHkgbmFtZXMgdGhlIGRvY2tlciBsYXllciBtYXkgdG91Y2gsIGZyb20gdGhlIG9ubHkgb3JpZ2luIGl0IG1heSB1c2UuCkRPQ0tFUl9OQU1FUyA9ICgiY29udGFpbmVyZC5pbyIsICJkb2NrZXItYnVpbGR4LXBsdWdpbiIsICJkb2NrZXItY2UiLCAiZG9ja2VyLWNlLWNsaSIsICJkb2NrZXItY2Utcm9vdGxlc3MtZXh0cmFzIiwKICAgICAgICAgICAgICAgICJkb2NrZXItY29tcG9zZS1wbHVnaW4iKQpET0NLRVJfT1JJR0lOID0gIkRvY2tlciBDRSIKIyBUaGUgUHJveG1veCBwYWNrYWdlIGxhbmUgKFItODEyIG9wdGlvbiBBKTogdGhlIG9yaWdpbiBhcHQgcHJpbnRzIGZvciBkb3dubG9hZC5wcm94bW94LmNvbSwgYW5kIHRoZSBPTkxZIG5ldyBwYWNrYWdlcwojIGEgcHZlIHN0ZXAgbWF5IGFkZCAobWVhc3VyZWQgb24gZGVtby1mZWxob20gMjAyNi0xMC0wNzogYSBmdWxsIHVwZ3JhZGUgYWRkcyBwcm94bW94LWZpcmV3YWxsLWRhdGEgYW5kIHRoZSBrZXJuZWw7CiMgdGhlIGtlcm5lbCBpcyByZWZ1c2VkIGJ5IFIxNCB3aGF0ZXZlciB0aGlzIGxpc3Qgc2F5cykuClBWRV9PUklHSU4gPSAiUHJveG1veCBEZWJpYW4gUmVwb3NpdG9yeSIKUFZFX05FV19BTExPVyA9ICgicHJveG1veC1maXJld2FsbC1kYXRhIiwpClBWRV9TSUdORURfT1AgPSAib3NfcHZlX3N0ZXAiCiMgUk9PVC1PV05FRCB0cnVzdCBhbmNob3JzICh0aGUgaW5zdGFsbGVyIHdyaXRlcyB0aGVtOyB0aGUgZGVtbyBib3hlcyBnb3QgdGhlbSBieSBoYW5kLCBSLTg0MCkuIE5ldmVyIHRoZSBhZ2VudCdzIGNvbmZpZy4KVFJVU1RfRklMRSA9ICIvZXRjL2ZlbGhvbS9vcy10cnVzdC5qc29uIiAgICAgICAgICAjIHsiaG9zdF9pZCI6ICIuLi4iLCAicmluZzBfc2xvd19sYW5lIjogZmFsc2V9ClRSVVNUX1NJR05FUlMgPSAiL2V0Yy9mZWxob20vb3BlcmF0b3Itc2lnbmVycyIgICAgIyBzc2ggYWxsb3dlZF9zaWduZXJzOiA8a2V5X2lkPiBuYW1lc3BhY2VzPSJmZWxob20tb3AtdjEiIDxrZXk+ClNJR19OQU1FU1BBQ0UgPSAiZmVsaG9tLW9wLXYxIgpTSUdORURfT1AgPSAib3NfZG9ja2VyX3N0ZXAiCk5PTkNFX0ZJTEUgPSAiL3Zhci9saWIvZmVsaG9tLW9zLWFwcGx5L25vbmNlcy5qc29uIgpEQUVNT05fSlNPTiA9ICIvZXRjL2RvY2tlci9kYWVtb24uanNvbiIKIyBSLTg1OCAodjAuMTQyLjEpOiBhIERvY2tlciBlbmdpbmUgc3RlcCByZXN0YXJ0cyBkb2NrZXJkLCB3aGljaCBSRUNSRUFURVMgdGhlIHNvY2tldCBmaWxlLiBXaXRoIGxpdmUtcmVzdG9yZSB0aGUKIyBjb250YWluZXJzIGtlZXAgcnVubmluZyDigJQgYW5kIG9uZSB0aGF0IGJpbmQtbW91bnRzIHRoZSBzb2NrZXQgRklMRSBrZWVwcyB0aGUgZGVsZXRlZCBpbm9kZTogbWVhc3VyZWQgMjAyNi0xMC0wNCBvbgojIGRlbW8tZmVsaG9tLCB0aGUgY29udHJvbGxlciBhbmQgdHJhZWZpayB3ZXJlIGJsaW5kIHRvIERvY2tlciBmb3IgMWg0NG0uIEFmdGVyIGEgc3RlcCB0aGF0IGluc3RhbGxlZCBzb21ldGhpbmcsIHRoZQojIHdyYXBwZXIgcmVzdGFydHMgZXhhY3RseSB0aGUgY29udGFpbmVycyB0aGF0IG1vdW50IG9uZSBvZiB0aGVzZSBwYXRocyAobmV2ZXIgdGhlIGFwcHMsIG5ldmVyIHRoZSBlbmdpbmUpLgpET0NLRVJfU09DS0VUUyA9ICgiL3Zhci9ydW4vZG9ja2VyLnNvY2siLCAiL3J1bi9kb2NrZXIuc29jayIpCkNSQVNIX0dVQVJEX1NUQVRFID0gIi92YXIvbGliL2ZlbGhvbS1jcmFzaC1ndWFyZC9zdGF0ZS5qc29uIgojIC0tLS0tLS0tLS0gdGhlIGtlcm5lbCBsYW5lIChSLTgzNiwgYDA5YCDCpzMgZGVjaXNpb25zIDE2NCArIDE3MiwgYDExYCDCpzUuMTEpIC0tLS0tLS0tLS0KIyBBIG5ldyBrZXJuZWwgYm9vdHMgT05DRSB0aHJvdWdoIGEgZmxhZyBpbiBhIEdSVUIgZW52aXJvbm1lbnQgYmxvY2sgb24gdGhlIEVTUCAodmZhdCDigJQgR1JVQiBjYW4gcmV3cml0ZSBpdCB0aGVyZTsgb24KIyB0aGUgTFZNIC9ib290IGl0IGNhbm5vdCwgUi04MzYpLiBUaGUgYnVuZGxlJ3MgdHdvIEdSVUIgZ2VuZXJhdG9ycyByZWFkIGFuZCBjbGVhciB0aGUgZmxhZyAoMDFfZmVsaG9tX29uZXNob3QpIGFuZAojIGdpdmUgZWFjaCBpbnN0YWxsZWQga2VybmVsIGEgb25lLXNob3QgZW50cnkgd2l0aCB0aGUgbG9ja3VwLXRvLXBhbmljIG9wdGlvbnMgKDQyX2ZlbGhvbV9vbmVzaG90LCBvcHRpb24gQykuIFRoZSBHUlVCCiMgZGVmYXVsdCBpcyB0aGUga2VybmVsIHRoZSBib3ggUlVOUywgcGlubmVkIGluIEtFUk5FTF9ERUZBVUxUX0NGRzsgb25seSAia2VybmVsLWdvb2QiIChhZnRlciBhIGhlYWx0aHkgb25lLXNob3QgYm9vdCkKIyBtb3ZlcyBpdCB0byB0aGUgbmV3IGtlcm5lbC4gTWVhc3VyZWQgaW4gdGhlIHNwaWtlIG9uIHRoZSBUZXN0ZXIgMSBWTSwgZGVtby1mZWxob20gYW5kIGRlbW8taHAgKFNlY3VyZSBCb290IG9uKToKIyBgYXVkaXRzL2tlcm5lbC1zcGlrZS0yMDI2LTEwLTA3L2AuCktFUk5FTF9PUCA9ICJvc19rZXJuZWxfc3RlcCIKS0VSTkVMX1NUQVRFID0gIi92YXIvbGliL2ZlbGhvbS1rZXJuZWwvc3RhdGUuanNvbiIgICAgICAgICAgIyAwNjQ0IHJvb3Q6IHRoZSBzdGVwJ3MgcGhhc2UgKHRoZSBhZ2VudCByZWFkcyBpdCkKS0VSTkVMX0RFRkFVTFRfQ0ZHID0gIi9ldGMvZGVmYXVsdC9ncnViLmQvenotZmVsaG9tLWtlcm5lbC1kZWZhdWx0LmNmZyIgICMgc291cmNlZCBsYXN0OiBHUlVCX0RFRkFVTFQgPSB0aGlzIGtlcm5lbApPTkVTSE9UX1NOSVBQRVQgPSAiL2V0Yy9ncnViLmQvMDFfZmVsaG9tX29uZXNob3QiICAgICAgICAgICAjIGJ1bmRsZS1vd25lZDogcmVhZCArIGNsZWFyIHRoZSBmbGFnLCBwaWNrIHRoZSBlbnRyeQpPTkVTSE9UX0VOVFJJRVMgPSAiL2V0Yy9ncnViLmQvNDJfZmVsaG9tX29uZXNob3QiICAgICAgICAgICAjIGJ1bmRsZS1vd25lZDogdGhlIG9uZS1zaG90IGVudHJpZXMgKG9wdGlvbiBDIG9wdGlvbnMpCkdSVUJfQ0ZHID0gIi9ib290L2dydWIvZ3J1Yi5jZmciCkVTUF9NT1VOVCA9ICIvYm9vdC9lZmkiCk9ORVNIT1RfRU5WID0gRVNQX01PVU5UICsgIi9FRkkvZmVsaG9tL29uZXNob3QuZW52IgpPTkVTSE9UX0FSR1MgPSAic29mdGxvY2t1cF9wYW5pYz0xIGhhcmRsb2NrdXBfcGFuaWM9MSBodW5nX3Rhc2tfcGFuaWM9MSBwYW5pYz0xMCIKS0VSTkVMX1BJTl9GSUxFID0gIi9ldGMva2VybmVsL3Byb3htb3gtYm9vdC1waW4iICAgICAgICAgICAgIyBhbiBvcGVyYXRvcidzIGBwcm94bW94LWJvb3QtdG9vbCBrZXJuZWwgcGluYCDigJQgbmV2ZXIgZm91Z2h0CktWRVJfUkUgPSByZS5jb21waWxlKHIiXlswLTldK1wuWzAtOV0rXC5bMC05XSstWzAtOV0rLXB2ZSQiKQpLRVJORUxfSU1BR0VfUkUgPSByZS5jb21waWxlKHIiXnByb3htb3gta2VybmVsLShbMC05XStcLlswLTldK1wuWzAtOV0rLVswLTldKy1wdmUpKC1zaWduZWQpPyQiKQojIHRoZSBwYWNrYWdlcyBhIGtlcm5lbCBzdGVwIG1heSBVUEdSQURFIChuZXZlciBhZGQpOiB0aGUga2VybmVsIHNlcmllcyBtZXRhLXBhY2thZ2UsIHRoZSBkZWZhdWx0LWtlcm5lbCBtZXRhLCB0aGUgYm9vdAojIGhlbHBlciBhbmQgdGhlIGZpcm13YXJlIHRoZSBrZXJuZWwgbG9hZHMuIEV2ZXJ5dGhpbmcgZWxzZSBpbiBIT1NUX1NMT1dfUkUgKGdydWIsIHNoaW0sIG1pY3JvY29kZSwgZWZpYm9vdG1ncikgc3RheXMgb3V0LgpLRVJORUxfVVBHUkFERV9SRSA9IHJlLmNvbXBpbGUociJeKHByb3htb3gtZGVmYXVsdC1rZXJuZWx8cHJveG1veC1rZXJuZWwtWzAtOV0rXC5bMC05XSt8cHJveG1veC1rZXJuZWwtaGVscGVyfHB2ZS1maXJtd2FyZSkkIikKS0VSTkVMX01JTl9HQVAgPSAyMCAqIDM2MDAgICAgICMgbmV2ZXIgdHdvIGtlcm5lbCBzdGVwcyBpbiBvbmUgbmlnaHQKS0VSTkVMX01PREVTID0gKCJrZXJuZWwtc3RhdHVzIiwgImtlcm5lbC1yZWJvb3QiLCAia2VybmVsLWJvb3QiLCAia2VybmVsLWdvb2QiLCAia2VybmVsLXJldmVydCIsICJrZXJuZWwtY2FuY2VsIikKIyBwaGFzZXM6IHN0YWdlZCDihpIgb25lc2hvdCDihpIganVkZ2luZyDihpIgZ29vZCB8IHJldmVydGluZyDihpIgc2VsZl9yZXZlcnRlZCB8IHJldmVydF9mYWlsZWQ7IG9uZXNob3Qg4oaSIGZlbGxfYmFjazsgc3RhZ2VkIOKGkiBjYW5jZWxsZWQKS0VSTkVMX0FDVElWRSA9ICgic3RhZ2VkIiwgIm9uZXNob3QiLCAianVkZ2luZyIsICJyZXZlcnRpbmciKQoKIyAtLS0tLS0tLS0tIHRoZSBjb25maWcgYnVuZGxlIChSLTg0MCwgYWdlbnQgdjAuMTQzLjAsIGAxMWAgwqc1LjQuMikgLS0tLS0tLS0tLQojIEEgc2lnbmVkIGBhZ2VudF9jb25maWdfdXBkYXRlYCBqb2IgY2FycmllcyB7YWdlbnRfdmVyc2lvbiwgYnVuZGxlX3NoYTI1Nn07IHRoZSBidW5kbGUgaXMgT05FIEpTT04gZmlsZSBidWlsdCBmcm9tIHRoaXMKIyByZXBvJ3MgY29uZmlncy8gYXQgdGhlIGFnZW50IHRhZyAoc2NyaXB0cy9idWlsZC1jb25maWctYnVuZGxlLnB5KSBhbmQgcHVibGlzaGVkIGJlc2lkZSB0aGUgYmluYXJ5LiBUaGUgaW5zdGFsbGVyCiMgaW5zdGFsbHMgdGhlIFNBTUUgYnVuZGxlIHRocm91Z2ggdGhpcyBzYW1lIGNvZGUgKC0taW5zdGFsbC1idW5kbGUsIHJvb3Qgb25seSwgbmV2ZXIgcmVhY2hhYmxlIHRocm91Z2ggc3VkbyksIHNvIGEgbmV3CiMgYm94IGFuZCBhbiB1cGRhdGVkIGJveCBjYW5ub3QgZHJpZnQuIFRoaXMgdGFibGUgaXMgdGhlIE9OTFkgc2V0IG9mIHBhdGhzIGEgYnVuZGxlIG1heSB3cml0ZSDigJQgYSBzaWduZWQgYnVuZGxlIG5hbWluZwojIGFueSBvdGhlciBwYXRoIGlzIHJlZnVzZWQgKFIxNikg4oCUIGFuZCBpdCBpcyBhbHNvIHRoZSBidWlsZGVyJ3MgbGlzdCAob25lIHRhYmxlKS4gRWFjaCBlbnRyeToKIyAgIGRlc3Q6IChzb3VyY2UgZmlsZSB1bmRlciBjb25maWdzLywgbW9kZSwgY2hlY2ssIHBvbGljeSkKIyBjaGVjazogIHRoZSBjb250ZW50IGNoZWNrIEJFRk9SRSBhbnl0aGluZyBpcyB3cml0dGVuIChSMTgpOiBzdWRvZXJzIOKGkiB2aXN1ZG8gLWNmOyBzaCAvIGJhc2gg4oaSIC1uOyBweXRob24g4oaSIGNvbXBpbGU7CiMgICAgICAgICB1bml0IOKGkiBhIFtVbml0XS9bU2VydmljZV0vW1RpbWVyXSBzZWN0aW9uOyB1bml0LW5vcnQg4oaSIHRoYXQsIGFuZCBuZXZlciBSdW50aW1lRGlyZWN0b3J5PSAodGhlIEcxIGluY2lkZW50KTsKIyAgICAgICAgIGFnZW50LXVuaXQg4oaSIFVzZXI9ZmVsaG9tLWFnZW50OyBkcm9waW4g4oaSIGEgW1VuaXRdIHNlY3Rpb24gKFNGLTMpOyBuZnQg4oaSIG5mdCAtYyAtZjsgcGxhaW4g4oaSIG5vbmUuCiMgcG9saWN5OiByZXBsYWNlIOKGkiBhbHdheXMgd3JpdHRlbiB3aGVuIGl0IGRpZmZlcnM7IGlmLWFic2VudCDihpIgb25seSB3aGVuIHRoZSBib3ggaGFzIG5vbmUgKGEgc2V0dGluZyB0aGUgb3BlcmF0b3IgbWF5CiMgICAgICAgICBoYXZlIHR1bmVkKTsgb29iIOKGkiBvbmx5IG9uIGEgYm94IHdpdGggdGhlIE9PQiBiZWx0ICgvZXRjL2ZlbGhvbS1zc2hkIGV4aXN0cyDigJQgdGhlIGluc3RhbGxlcidzIC0tbm8tb29iIGxlYXZlcyBub25lKS4KIyBPcmRlciBtYXR0ZXJzOiB0aGUgc3Vkb2VycyBmaWxlcyBjb21lIExBU1QsIHNvIGEgcmVmZXJlbmNlZCB3cmFwcGVyIGlzIGluIHBsYWNlIGJlZm9yZSB0aGUgbGluZSB0aGF0IGFsbG93cyBpdC4KIyBSLTg2MSAoYWdlbnQgdjAuMTQ2LjApOiB0aGUgc2lnbmVkIGFnZW50IHVwZGF0ZSwgdmVyaWZpZWQgaGVyZSAobW9kZSBhZ2VudF91cGRhdGUpLCB0aGVuIHRoZSBBL0IgZmxpcC4KU0VMRlVQREFURV9PUCA9ICJhZ2VudF91cGRhdGUiClNFTEZVUERBVEVfRElSID0gIi92YXIvbGliL2ZlbGhvbS1hZ2VudC9zZWxmdXBkYXRlIgpTRUxGVVBEQVRFX1dSQVBQRVIgPSAiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1zZWxmdXBkYXRlLWd1YXJkZWQiCiMgVGhlIHZlcmlmaWVkIGJ5dGVzIGFyZSB3cml0dGVuIEhFUkUgKGEgcm9vdC1vd25lZCBkaXJlY3RvcnkgdGhlIGFnZW50IGNhbm5vdCB3cml0ZSkgYW5kIG9ubHkgdGhpcyBjb3B5IHJlYWNoZXMgdGhlIEEvQiB3cmFwcGVyIOKAlCBuZXZlciB0aGUgYWdlbnQncyBmaWxlLgpTRUxGVVBEQVRFX1JPT1RfRElSID0gIi92YXIvbGliL2ZlbGhvbS1vcy1hcHBseS9hZ2VudC11cGRhdGUiClNFTEZVUERBVEVfTUFYX0JZVEVTID0gMjU2ICogMTAyNCAqIDEwMjQKQlVORExFX0ZPUk1BVCA9IDEKQlVORExFX09QID0gImFnZW50X2NvbmZpZ191cGRhdGUiCkJVTkRMRV9SRUNPUkQgPSAiL2V0Yy9mZWxob20vY29uZmlnLWJ1bmRsZS5qc29uIiAgICAgIyB3aGF0IHRoZSBib3ggcnVucyAoMDY0NCByb290OyB0aGUgbm9uLXJvb3QgYWdlbnQgcmVwb3J0cyBpdCkKQlVORExFX1BSRVZfRElSID0gIi92YXIvbGliL2ZlbGhvbS1vcy1hcHBseS9idW5kbGUtcHJldiIgICMgdGhlIHByZXZpb3VzIGNvcGllcyBvZiBldmVyeSBmaWxlIGEgYnVuZGxlIHJlcGxhY2VkCkJVTkRMRV9LRUVQID0gMwpCVU5ETEVfTUFYX0JZVEVTID0gNCAqIDEwMjQgKiAxMDI0CkJVTkRMRV9SRSA9IHJlLmNvbXBpbGUociJeYnVuZGxlLVswLTldK1wuWzAtOV0rXC5bMC05XSsoLVswLTlBLVphLXouXSspP1wuanNvbiQiKQpPT0JfRElSID0gIi9ldGMvZmVsaG9tLXNzaGQiCkJVTkRMRV9GSUxFUyA9IFsKICAgICgiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1ta2ZzLWd1YXJkZWQiLCAiZmVsaG9tLW1rZnMtZ3VhcmRlZC5zaCIsIDBvNzU1LCAiYmFzaCIsICJyZXBsYWNlIiksCiAgICAoIi91c3IvbG9jYWwvc2Jpbi9mZWxob20tc2VsZnVwZGF0ZS1ndWFyZGVkIiwgImZlbGhvbS1zZWxmdXBkYXRlLWd1YXJkZWQiLCAwbzc1NSwgInNoIiwgInJlcGxhY2UiKSwKICAgICgiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1wYnMtYXBwbHkiLCAiZmVsaG9tLXBicy1hcHBseSIsIDBvNzU1LCAiYmFzaCIsICJyZXBsYWNlIiksCiAgICAoIi91c3IvbG9jYWwvc2Jpbi9mZWxob20tYmFja3VwLXRhcmdldC1hcHBseSIsICJmZWxob20tYmFja3VwLXRhcmdldC1hcHBseSIsIDBvNzU1LCAiYmFzaCIsICJyZXBsYWNlIiksCiAgICAoIi91c3IvbG9jYWwvc2Jpbi9mZWxob20tb3MtYXBwbHkiLCAiZmVsaG9tLW9zLWFwcGx5IiwgMG83NTUsICJweXRob24iLCAicmVwbGFjZSIpLAogICAgKCIvdXNyL2xvY2FsL3NiaW4vZmVsaG9tLWNyYXNoLWd1YXJkIiwgImZlbGhvbS1jcmFzaC1ndWFyZCIsIDBvNzU1LCAicHl0aG9uIiwgInJlcGxhY2UiKSwKICAgICMgUi04NjEgKGFnZW50IHYwLjE0Ni4wKTogdGhlIGNvbnRlbnQgY2hlY2tlciBmb3IgZXZlcnkgYWdlbnQtc3RhZ2VkIGZpbGUgYSByb290IHByb2dyYW0gcmVhZHMsIGFuZCB0aGUgdHdvIEZJWEVECiAgICAjIGZpbGVzIHRoZSBhZ2VudCB1c2VkIHRvIGluc3RhbGwgaXRzZWxmIGZyb20gL3RtcCAodGhlIGd1ZXN0IHByZS1zdGFydCBob29rIGFuZCB0aGUgc2hhcmVkIGRyaXZlIHBhcmVudCkuCiAgICAoIi91c3IvbG9jYWwvc2Jpbi9mZWxob20tcHJpdi1hcHBseSIsICJmZWxob20tcHJpdi1hcHBseSIsIDBvNzU1LCAicHl0aG9uIiwgInJlcGxhY2UiKSwKICAgICgiL3Zhci9saWIvdnovc25pcHBldHMvZmVsaG9tLWd1ZXN0LWhvb2suc2giLCAiZmVsaG9tLWd1ZXN0LWhvb2suc2giLCAwbzc1NSwgInNoIiwgInJlcGxhY2UiKSwKICAgICgiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1zaGFyZWQtcGFyZW50LnNoIiwgImZlbGhvbS1zaGFyZWQtcGFyZW50LnNoIiwgMG83NTUsICJzaCIsICJyZXBsYWNlIiksCiAgICAoIi9ldGMvc3lzdGVtZC9zeXN0ZW0vZmVsaG9tLXNoYXJlZC1wYXJlbnQuc2VydmljZSIsICJmZWxob20tc2hhcmVkLXBhcmVudC5zZXJ2aWNlIiwgMG82NDQsICJ1bml0IiwgInJlcGxhY2UiKSwKICAgICgiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9mZWxob20tY3Jhc2gtZ3VhcmQuc2VydmljZSIsICJmZWxob20tY3Jhc2gtZ3VhcmQuc2VydmljZSIsIDBvNjQ0LCAidW5pdCIsICJyZXBsYWNlIiksCiAgICAoIi9ldGMvc3lzdGVtZC9zeXN0ZW0vZmVsaG9tLWNyYXNoLWd1YXJkLWNoZWNrLnNlcnZpY2UiLCAiZmVsaG9tLWNyYXNoLWd1YXJkLWNoZWNrLnNlcnZpY2UiLCAwbzY0NCwgInVuaXQiLCAicmVwbGFjZSIpLAogICAgKCIvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1jcmFzaC1ndWFyZC1jaGVjay50aW1lciIsICJmZWxob20tY3Jhc2gtZ3VhcmQtY2hlY2sudGltZXIiLCAwbzY0NCwgInVuaXQiLCAicmVwbGFjZSIpLAogICAgKCIvZXRjL2ZlbGhvbS9jcmFzaC1ndWFyZC5jb25mIiwgImNyYXNoLWd1YXJkLmNvbmYiLCAwbzY0NCwgInBsYWluIiwgImlmLWFic2VudCIpLAogICAgIyB0aGUga2VybmVsIGxhbmUncyB0d28gR1JVQiBnZW5lcmF0b3JzIChSLTgzNiwgYDExYCDCpzUuMTEpOiB0aGV5IHRha2UgZWZmZWN0IGF0IHRoZSBuZXh0IHVwZGF0ZS1ncnViLCB3aGljaCB0aGUKICAgICMgZmlyc3Qga2VybmVsIHN0ZXAgcnVucyBpdHNlbGY7IHdpdGggbm8gZmxhZyBvbiB0aGUgRVNQIHRoZXkgY2hhbmdlIG5vdGhpbmcgYWJvdXQgaG93IHRoZSBib3ggYm9vdHMuCiAgICAoIi9ldGMvZ3J1Yi5kLzAxX2ZlbGhvbV9vbmVzaG90IiwgImZlbGhvbS1ncnViLW9uZXNob3Quc2giLCAwbzc1NSwgInNoIiwgInJlcGxhY2UiKSwKICAgICgiL2V0Yy9ncnViLmQvNDJfZmVsaG9tX29uZXNob3QiLCAiZmVsaG9tLWdydWItb25lc2hvdC1lbnRyaWVzLnNoIiwgMG83NTUsICJzaCIsICJyZXBsYWNlIiksCiAgICAoIi9ldGMvc3lzdGVtZC9zeXN0ZW0vZmVsaG9tLWFnZW50LnNlcnZpY2UiLCAiZmVsaG9tLWFnZW50LnNlcnZpY2UiLCAwbzY0NCwgImFnZW50LXVuaXQiLCAicmVwbGFjZSIpLAogICAgKCIvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1hZ2VudC1yb2xsYmFjay5zZXJ2aWNlIiwgImZlbGhvbS1hZ2VudC1yb2xsYmFjay5zZXJ2aWNlIiwgMG82NDQsICJ1bml0IiwgInJlcGxhY2UiKSwKICAgICgiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9mZWxob20tYWdlbnQuc2VydmljZS5kL2ZlbGhvbS1hZ2VudC1saW1pdHMuY29uZiIsICJmZWxob20tYWdlbnQtbGltaXRzLmNvbmYiLCAwbzY0NCwgImRyb3BpbiIsICJyZXBsYWNlIiksCiAgICAoIi91c3IvbG9jYWwvc2Jpbi9mZWxob20tbWdtdC13YXRjaGRvZyIsICJmZWxob20tbWdtdC13YXRjaGRvZy5zaCIsIDBvNzU1LCAic2giLCAicmVwbGFjZSIpLAogICAgKCIvZXRjL3RtcGZpbGVzLmQvZmVsaG9tLXByaXZzZXAuY29uZiIsICJmZWxob20tcHJpdnNlcC50bXBmaWxlcyIsIDBvNjQ0LCAicGxhaW4iLCAicmVwbGFjZSIpLAogICAgKCIvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1tZ210LXdhdGNoZG9nLnNlcnZpY2UiLCAiZmVsaG9tLW1nbXQtd2F0Y2hkb2cuc2VydmljZSIsIDBvNjQ0LCAidW5pdC1ub3J0IiwgInJlcGxhY2UiKSwKICAgICgiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9mZWxob20tbWdtdC13YXRjaGRvZy50aW1lciIsICJmZWxob20tbWdtdC13YXRjaGRvZy50aW1lciIsIDBvNjQ0LCAidW5pdC1ub3J0IiwgInJlcGxhY2UiKSwKICAgICgiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9mZWxob20tc3NoZC5zZXJ2aWNlIiwgImZlbGhvbS1zc2hkLnNlcnZpY2UiLCAwbzY0NCwgInVuaXQtbm9ydCIsICJvb2IiKSwKICAgICgiL2V0Yy9mZWxob20tb29iLm5mdCIsICJmZWxob20tb29iLm5mdCIsIDBvNjQ0LCAibmZ0IiwgIm9vYiIpLAogICAgKCIvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1vb2ItbmZ0LnNlcnZpY2UiLCAiZmVsaG9tLW9vYi1uZnQuc2VydmljZSIsIDBvNjQ0LCAidW5pdCIsICJvb2IiKSwKICAgICgiL2V0Yy9zdWRvZXJzLmQvZmVsaG9tLW9wIiwgImZlbGhvbS1vcC5zdWRvZXJzIiwgMG80NDAsICJzdWRvZXJzIiwgIm9vYiIpLAogICAgKCIvZXRjL3N1ZG9lcnMuZC9mZWxob20tYWdlbnQiLCAiZmVsaG9tLWFnZW50LnN1ZG9lcnMiLCAwbzQ0MCwgInN1ZG9lcnMiLCAicmVwbGFjZSIpLApdCkJVTkRMRV9ERVNUUyA9IHtlWzBdOiBlIGZvciBlIGluIEJVTkRMRV9GSUxFU30KIyBUaGUgdHJ1c3Qgcm9vdCBpcyBuZXZlciBhIGJ1bmRsZSdzIHRvIGNoYW5nZSAoUjE3KTogd2hvIG1heSBzaWduIGlzIGRlY2lkZWQgYnkgdGhlc2UgZmlsZXMsIHNvIG5vIGJ1bmRsZSBtYXkgY2FycnkgdGhlbS4KVFJVU1RfUEFUSFMgPSAoVFJVU1RfRklMRSwgVFJVU1RfU0lHTkVSUywgQlVORExFX1JFQ09SRCkKIyBXaGVuIC9ldGMvZmVsaG9tL29wZXJhdG9yLXNpZ25lcnMgaXMgTUlTU0lORyAoYSBib3ggaW5zdGFsbGVkIGJlZm9yZSBpbnN0YWxsZXIgMS4zMC4wKSwgdGhlIGpvYiBpcyB2ZXJpZmllZCBhZ2FpbnN0IOKAlAojIGFuZCB0aGUgZmlsZSBpcyBjcmVhdGVkIHdpdGgg4oCUIGV4YWN0bHkgdGhpcyBrZXk6IHRoZSBvcGVyYXRpb25hbCBrZXkgZmVsaG9tLWhvc3QtaW5zdGFsbC5zaCBwaW5zCiMgKE9QRVJBVE9SX0tFWV9PUEVSQVRJT05BTF8qKS4gTmV2ZXIgYW55IG90aGVyLiBQaW5uZWQgZXF1YWwgdG8gdGhlIGluc3RhbGxlciBieQojIHRlc3RfcGlubmVkX29wZXJhdG9yX2tleV9lcXVhbHNfdGhlX2luc3RhbGxlcnMuIFNpZ25lciByb3RhdGlvbiBpcyBhIHNlcGFyYXRlLCBsYXRlciBhY3QgKGAwNGAgwqczKS4KUElOTkVEX09QRVJBVE9SX0tFWV9JRCA9ICJmZWxob20tb3AtMSIKUElOTkVEX09QRVJBVE9SX0tFWV9MSU5FID0gKCJzc2gtZWQyNTUxOSBBQUFBQzNOemFDMWxaREkxTlRFNUFBQUFJTDh6MHFDTmdBM3gyeHhBQjBRajVybzh3YUZqR1o4VGEvc1dCNjN0bEx3KyBmZWxob20tb3AtMSIpCiMgVGhlIHNlbGYtY2hlY2sgKGFmdGVyIGluc3RhbGwsIGJlZm9yZSB0aGUgcmVjb3JkKTogdGhlIHJvdXRlIGl0c2VsZiBtdXN0IHN1cnZpdmUg4oCUIGEgYnVuZGxlIHdob3NlIHN1ZG9lcnMgbm8gbG9uZ2VyCiMgbGV0cyB0aGUgYWdlbnQgY2FsbCB0aGlzIHdyYXBwZXIgd291bGQgY3V0IHRoZSBib3ggb2ZmIGZyb20gZXZlcnkgbGF0ZXIgYnVuZGxlLgpTRUxGX0NIRUNLX1NVRE9fTElORSA9ICIvdXNyL2xvY2FsL3NiaW4vZmVsaG9tLW9zLWFwcGx5IC0tcGxhbiAvdmFyL2xpYi9mZWxob20tYWdlbnQvb3MvcGxhbi0qLmpzb24iClBJTk5FRF9TSUdORVJTID0gIjxwaW5uZWQgb3BlcmF0b3Iga2V5PiIgICAjIHZlcmlmeV9zaWc6IGNoZWNrIGFnYWluc3QgdGhlIHBpbm5lZCBrZXksIG5vdCBhIGZpbGUgb24gdGhlIGJveAoKCmRlZiBwaW5uZWRfc2lnbmVyc19saW5lKCk6CiAgICAiIiJUaGUgc3NoIGFsbG93ZWRfc2lnbmVycyBsaW5lIHRoZSBpbnN0YWxsZXIgd3JpdGVzIChmZWxob20taG9zdC1pbnN0YWxsLnNoIF93cml0ZV9zbG93X2xhbmVfdHJ1c3QpLCBieXRlIGZvciBieXRlLiIiIgogICAgcmV0dXJuIGYne1BJTk5FRF9PUEVSQVRPUl9LRVlfSUR9IG5hbWVzcGFjZXM9IntTSUdfTkFNRVNQQUNFfSIge1BJTk5FRF9PUEVSQVRPUl9LRVlfTElORX1cbicKCgpkZWYgc2hhMjU2X2hleChkYXRhKToKICAgIGltcG9ydCBoYXNobGliCiAgICByZXR1cm4gaGFzaGxpYi5zaGEyNTYoZGF0YSkuaGV4ZGlnZXN0KCkKCgpjbGFzcyBSZWZ1c2VkKEV4Y2VwdGlvbik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSwgcmVhc29uKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKGYie2NvZGV9IHtyZWFzb259IikKICAgICAgICBzZWxmLmNvZGUsIHNlbGYucmVhc29uID0gY29kZSwgcmVhc29uCgoKY2xhc3MgUnVubmVyOgogICAgIiIiUnVucyBjb21tYW5kcyBmb3IgcmVhbC4gVGVzdHMgcmVwbGFjZSBpdCB3aXRoIGEgZmFrZS4gYGd1ZXN0YCBydW5zIGluc2lkZSB0aGUgY29udGFpbmVyIHZpYSBwY3QgZXhlYy4iIiIKCiAgICBkZWYgaG9zdChzZWxmLCBhcmd2LCB0aW1lb3V0PTYwMCwgc3RkaW49Tm9uZSk6CiAgICAgICAgcCA9IHN1YnByb2Nlc3MucnVuKGFyZ3YsIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSwgdGltZW91dD10aW1lb3V0LCBpbnB1dD1zdGRpbikKICAgICAgICByZXR1cm4gcC5yZXR1cm5jb2RlLCBwLnN0ZG91dCwgcC5zdGRlcnIKCiAgICBkZWYgZ3Vlc3Qoc2VsZiwgdm1pZCwgYXJndiwgdGltZW91dD0xODAwKToKICAgICAgICByZXR1cm4gc2VsZi5ob3N0KFsiL3Vzci9zYmluL3BjdCIsICJleGVjIiwgc3RyKHZtaWQpLCAiLS0iXSArIGFyZ3YsIHRpbWVvdXQpCgogICAgZGVmIHJlYWRfZmlsZShzZWxmLCBwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCkgYXMgZjoKICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCgogICAgZGVmIHN0YXQoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLmxzdGF0KHBhdGgpCgogICAgZGVmIGFnZW50X3VpZChzZWxmKToKICAgICAgICBpbXBvcnQgcHdkCiAgICAgICAgcmV0dXJuIHB3ZC5nZXRwd25hbShBR0VOVF9VU0VSKS5wd191aWQKCiAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCBsYXllciwgdm1pZCwgcGF0aCwgYm9keSk6CiAgICAgICAgIiIiV3JpdGUgYSBzbWFsbCB0ZXh0IGZpbGUgaW4gdGhlIHRhcmdldCBsYXllciDigJQgbmV2ZXIgdmlhIGEgc2hlbGwgc3RyaW5nLiIiIgogICAgICAgIGlmIGxheWVyID09ICJob3N0IjoKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3IikgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoYm9keSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcmMsIF8sIF8gPSBzZWxmLmhvc3QoWyIvdXNyL3NiaW4vcGN0IiwgImV4ZWMiLCBzdHIodm1pZCksICItLSIsICJ0ZWUiLCBwYXRoXSwgNjAsIHN0ZGluPWJvZHkpCiAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjciLCBmImNvdWxkIG5vdCB3cml0ZSB7cGF0aH0gaW4gdGhlIGd1ZXN0IikKCiAgICBkZWYgc2F2ZV9yZXBvcnQoc2VsZiwgcGxhbl9wYXRoLCByZXBvcnQpOgogICAgICAgICIiIlItODY4OiBrZWVwIGFuIGFwcGx5IHBhc3MncyByZXBvcnQgb24gZGlzayB1bnRpbCB0aGUgYWdlbnQgaGFzIHNlbnQgaXQgKHRoZSBhZ2VudCBkZWxldGVzIGl0KS4gV3JpdHRlbgogICAgICAgIElOVE8gdGhlIGFnZW50J3Mgb3duIHBsYW4gZGlyIGFzIHJvb3QsIHNvOiB0aGUgZGlyIGlzIG9wZW5lZCB3aXRoIE9fTk9GT0xMT1cgYW5kIG11c3QgYmUgYSByZWFsIGRpcmVjdG9yeQogICAgICAgIG93bmVkIGJ5IHRoZSBhZ2VudCAoYSBzeW1saW5rIHN3YXBwZWQgaW4gZm9yIGl0IGlzIHJlZnVzZWQpOyB0aGUgZmlsZSBpcyBjcmVhdGVkIE9fRVhDTHxPX05PRk9MTE9XIGFmdGVyCiAgICAgICAgcmVtb3ZpbmcgYW4gb2xkIG9uZSwgdGhlbiBoYW5kZWQgdG8gdGhlIGFnZW50ICgwNjAwKS4gQW55IGZhaWx1cmUgb25seSBsb3NlcyB0aGUgY29weSDigJQgbmV2ZXIgdGhlIHJ1bi4iIiIKICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZShwbGFuX3BhdGgpCiAgICAgICAgbmFtZSA9ICJyZXBvcnQtIiArIGJhc2VbbGVuKCJwbGFuLSIpOl0KICAgICAgICBkZmQgPSBvcy5vcGVuKFBMQU5fRElSLCBvcy5PX1JET05MWSB8IG9zLk9fRElSRUNUT1JZIHwgb3MuT19OT0ZPTExPVykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0ID0gb3MuZnN0YXQoZGZkKQogICAgICAgICAgICBpZiBub3Qgc3RhdC5TX0lTRElSKHN0LnN0X21vZGUpIG9yIHN0LnN0X3VpZCAhPSBzZWxmLmFnZW50X3VpZCgpOgogICAgICAgICAgICAgICAgcmFpc2UgT1NFcnJvcihmIntQTEFOX0RJUn0gaXMgbm90IHRoZSBhZ2VudCdzIG93biBkaXJlY3RvcnkiKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSwgZGlyX2ZkPWRmZCkKICAgICAgICAgICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBmZCA9IG9zLm9wZW4obmFtZSwgb3MuT19XUk9OTFkgfCBvcy5PX0NSRUFUIHwgb3MuT19FWENMIHwgb3MuT19OT0ZPTExPVywgMG82MDAsIGRpcl9mZD1kZmQpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLndyaXRlKGZkLCAoanNvbi5kdW1wcyhyZXBvcnQsIHNvcnRfa2V5cz1UcnVlKSArICJcbiIpLmVuY29kZSgpKQogICAgICAgICAgICAgICAgb3MuZmNob3duKGZkLCBzZWxmLmFnZW50X3VpZCgpLCAtMSkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLmNsb3NlKGRmZCkKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKFBMQU5fRElSLCBuYW1lKQoKICAgIGRlZiBub3coc2VsZik6CiAgICAgICAgcmV0dXJuIHRpbWUudGltZSgpCgogICAgZGVmIHNsZWVwKHNlbGYsIHMpOgogICAgICAgIHRpbWUuc2xlZXAocykKCiAgICBkZWYgdmVyaWZ5X3NpZyhzZWxmLCBzaWduZXJzLCBrZXlfaWQsIG5hbWVzcGFjZSwgYmxvYiwgc2lnKToKICAgICAgICAiIiJgc3NoLWtleWdlbiAtWSB2ZXJpZnlgIG92ZXIgdGhlIEVYQUNUIHNpZ25lZCBieXRlcy4gRmlsZXMgaW4gYSByb290LW9ubHkgdGVtcCBkaXI7IG5vdGhpbmcgdmlhIGEgc2hlbGwuIiIiCiAgICAgICAgaW1wb3J0IHRlbXBmaWxlCiAgICAgICAgd2l0aCB0ZW1wZmlsZS5UZW1wb3JhcnlEaXJlY3RvcnkocHJlZml4PSJmZWxob20tb3MtYXBwbHktIikgYXMgZDoKICAgICAgICAgICAgc3AgPSBvcy5wYXRoLmpvaW4oZCwgInNpZyIpCiAgICAgICAgICAgIHdpdGggb3BlbihzcCwgInciKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShzaWcpCiAgICAgICAgICAgIGlmIHNpZ25lcnMgPT0gUElOTkVEX1NJR05FUlM6CiAgICAgICAgICAgICAgICBzaWduZXJzID0gb3MucGF0aC5qb2luKGQsICJhbGxvd2VkX3NpZ25lcnMiKQogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNpZ25lcnMsICJ3IikgYXMgZjoKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKHBpbm5lZF9zaWduZXJzX2xpbmUoKSkKICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MucnVuKFsic3NoLWtleWdlbiIsICItWSIsICJ2ZXJpZnkiLCAiLWYiLCBzaWduZXJzLCAiLUkiLCBrZXlfaWQsICItbiIsIG5hbWVzcGFjZSwgIi1zIiwgc3BdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ9YmxvYiwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgdGltZW91dD0zMCkKICAgICAgICAgICAgcmV0dXJuIHAucmV0dXJuY29kZQoKICAgIGRlZiByZWFkX25vbmNlcyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihOT05DRV9GSUxFKSBhcyBmOgogICAgICAgICAgICAgICAgZCA9IGpzb24ubG9hZChmKQogICAgICAgICAgICByZXR1cm4gZCBpZiBpc2luc3RhbmNlKGQsIGRpY3QpIGVsc2Uge30KICAgICAgICBleGNlcHQgKE9TRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICBkZWYgd3JpdGVfbm9uY2VzKHNlbGYsIGQpOgogICAgICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShOT05DRV9GSUxFKSwgbW9kZT0wbzcwMCwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICB0bXAgPSBOT05DRV9GSUxFICsgIi50bXAiCiAgICAgICAgd2l0aCBvcGVuKHRtcCwgInciKSBhcyBmOgogICAgICAgICAgICBqc29uLmR1bXAoZCwgZikKICAgICAgICBvcy5yZXBsYWNlKHRtcCwgTk9OQ0VfRklMRSkKCiAgICBkZWYgbG9nKHNlbGYsIGxpbmUpOgogICAgICAgICMgUi04NjggKHYwLjE0NC4xKTogdGhlIGFnZW50IHRoYXQgcmVhZHMgc3RkZXJyIG1heSBiZSBHT05FIChraWxsZWQgbWlkLXBhc3MsIG1lYXN1cmVkIGxpdmUgb24gZGVtby1ocAogICAgICAgICMgMjAyNi0xMC0wNSk6IHRoZSB3cml0ZSB0aGVuIHJhaXNlcyBCcm9rZW5QaXBlRXJyb3IsIGFuZCB2MC4xNDQuMCBkaWVkIHJpZ2h0IHRoZXJlIOKAlCBhZnRlciBhcHQgaGFkIGluc3RhbGxlZAogICAgICAgICMgZXZlcnl0aGluZywgYmVmb3JlIHRoZSByZXBvcnQgY29weSB3YXMgc2F2ZWQuIEEgZGVhZCByZWFkZXIgbXVzdCBuZXZlciBzdG9wIHRoZSBwYXNzOyB0aGUgam91cm5hbCBzdGlsbAogICAgICAgICMgZ2V0cyBldmVyeSBsaW5lLiBQaW5uZWQgYnkgQWdlbnREaWVzTWlkUGFzcy4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHByaW50KGxpbmUsIGZpbGU9c3lzLnN0ZGVyciwgZmx1c2g9VHJ1ZSkKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHRyeToKICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWyJsb2dnZXIiLCAiLXQiLCAiZmVsaG9tLW9zLWFwcGx5IiwgbGluZV0sIHRpbWVvdXQ9MTApCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiByZWFkX3N0YWdlZF9vbmNlKHNlbGYsIHBhdGgsIG93bmVyX3VpZCwgbGltaXQpOgogICAgICAgICIiIlItODYxOiByZWFkIGEgZmlsZSB0aGUgQUdFTlQgc3RhZ2VkIE9OQ0UsIGFzIHJvb3QsIHNhZmVseTogT19OT0ZPTExPVyAodGhlIGxhc3QgY29tcG9uZW50IG1heSBub3QgYmUgYQogICAgICAgIHN5bWxpbmspLCBmc3RhdCBvbiB0aGUgb3BlbmVkIGZkIChhIHJlZ3VsYXIgZmlsZSBvd25lZCBieSBvd25lcl91aWQpLCBhdCBtb3N0IGBsaW1pdGAgYnl0ZXMuIFRoZSBjYWxsZXIgaGFzaGVzCiAgICAgICAgYW5kIHVzZXMgZXhhY3RseSB0aGVzZSBieXRlcyDigJQgbmV2ZXIgdGhlIHBhdGggYWdhaW4gKHRoZSBhZ2VudCBvd25zIHRoZSBkaXJlY3RvcnkgYW5kIGNvdWxkIHN3YXAgdGhlIGZpbGUpLiIiIgogICAgICAgIGZkID0gb3Mub3BlbihwYXRoLCBvcy5PX1JET05MWSB8IG9zLk9fTk9GT0xMT1cgfCBvcy5PX0NMT0VYRUMpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdCA9IG9zLmZzdGF0KGZkKQogICAgICAgICAgICBpZiBub3Qgc3RhdC5TX0lTUkVHKHN0LnN0X21vZGUpIG9yIHN0LnN0X3VpZCAhPSBvd25lcl91aWQ6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTkiLCBmIntwYXRofSBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3duZWQgYnkge0FHRU5UX1VTRVJ9IikKICAgICAgICAgICAgaWYgc3Quc3Rfc2l6ZSA+IGxpbWl0OgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE5IiwgZiJ7cGF0aH0gaXMgbGFyZ2VyIHRoYW4ge2xpbWl0fSBieXRlcyIpCiAgICAgICAgICAgIGNodW5rcywgbiA9IFtdLCAwCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBiID0gb3MucmVhZChmZCwgMSA8PCAyMCkKICAgICAgICAgICAgICAgIGlmIG5vdCBiOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKGIpCiAgICAgICAgICAgICAgICBuICs9IGxlbihiKQogICAgICAgICAgICAgICAgaWYgbiA+IGxpbWl0OgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxOSIsIGYie3BhdGh9IGdyZXcgcGFzdCB7bGltaXR9IGJ5dGVzIHdoaWxlIGl0IHdhcyByZWFkIikKICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGNodW5rcykKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy5jbG9zZShmZCkKCiAgICAjIC0tLS0tLS0tLS0gaG9zdCBmaWxlcywgZm9yIHRoZSBjb25maWcgYnVuZGxlIChSLTg0MCkuIFRlc3RzIHJlcGxhY2UgdGhlc2Ugd2l0aCBhbiBpbi1tZW1vcnkgdHJlZS4gLS0tLS0tLS0tLQogICAgZGVmIHJlYWRfYnl0ZXMoc2VsZiwgcGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGY6CiAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQoKICAgIGRlZiBsZXhpc3RzKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmxleGlzdHMocGF0aCkKCiAgICBkZWYgaXNkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNkaXIocGF0aCkKCiAgICBkZWYgcHV0X2ZpbGUoc2VsZiwgcGF0aCwgZGF0YSwgbW9kZSk6CiAgICAgICAgIiIiQXRvbWljOiBhIHJvb3Qtb3duZWQgdGVtcCBmaWxlIGJlc2lkZSB0aGUgdGFyZ2V0IChzYW1lIGZpbGVzeXN0ZW0pLCBmc3luYywgdGhlbiByZW5hbWUgb3ZlciBpdC4iIiIKICAgICAgICBkID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICAgICAgb3MubWFrZWRpcnMoZCwgbW9kZT0wbzc1NSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICB0bXAgPSBvcy5wYXRoLmpvaW4oZCwgZiIue29zLnBhdGguYmFzZW5hbWUocGF0aCl9LmZlbGhvbS1uZXcue29zLmdldHBpZCgpfSIpCiAgICAgICAgZmQgPSBvcy5vcGVuKHRtcCwgb3MuT19XUk9OTFkgfCBvcy5PX0NSRUFUIHwgb3MuT19FWENMLCAwbzYwMCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3MuZmRvcGVuKGZkLCAid2IiKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQogICAgICAgICAgICAgICAgZi5mbHVzaCgpCiAgICAgICAgICAgICAgICBvcy5mY2hvd24oZi5maWxlbm8oKSwgMCwgMCkKICAgICAgICAgICAgICAgIG9zLmZjaG1vZChmLmZpbGVubygpLCBtb2RlKQogICAgICAgICAgICAgICAgb3MuZnN5bmMoZi5maWxlbm8oKSkKICAgICAgICAgICAgb3MucmVwbGFjZSh0bXAsIHBhdGgpCiAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0bXApCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICByYWlzZQoKICAgIGRlZiByZW1vdmUoc2VsZiwgcGF0aCk6CiAgICAgICAgb3MucmVtb3ZlKHBhdGgpCgogICAgZGVmIGxpc3RfZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChvcy5saXN0ZGlyKHBhdGgpKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgcm10cmVlKHNlbGYsIHBhdGgpOgogICAgICAgIGltcG9ydCBzaHV0aWwKICAgICAgICBzaHV0aWwucm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKCiAgICBkZWYgY2hlY2tfY29udGVudChzZWxmLCBraW5kLCBkYXRhKToKICAgICAgICAiIiJSdW4gYW4gZXh0ZXJuYWwgc3ludGF4IGNoZWNrIG9uIGEgcm9vdC1vbmx5IHRlbXAgY29weS4gUmV0dXJucyAocmMsIG1lc3NhZ2UpLiIiIgogICAgICAgIGltcG9ydCB0ZW1wZmlsZQogICAgICAgIGNtZCA9IHsic3Vkb2VycyI6IFsidmlzdWRvIiwgIi1jZiJdLCAic2giOiBbInNoIiwgIi1uIl0sICJiYXNoIjogWyJiYXNoIiwgIi1uIl0sICJuZnQiOiBbIm5mdCIsICItYyIsICItZiJdfVtraW5kXQogICAgICAgIHdpdGggdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KHByZWZpeD0iZmVsaG9tLWJ1bmRsZS0iKSBhcyBkOgogICAgICAgICAgICBwID0gb3MucGF0aC5qb2luKGQsICJmIikKICAgICAgICAgICAgd2l0aCBvcGVuKHAsICJ3YiIpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgIHIgPSBzdWJwcm9jZXNzLnJ1bihjbWQgKyBbcF0sIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSwgdGltZW91dD02MCkKICAgICAgICAgICAgcmV0dXJuIHIucmV0dXJuY29kZSwgKHIuc3Rkb3V0ICsgci5zdGRlcnIpLnN0cmlwKClbLTMwMDpdCgoKY2xhc3MgQXBwbHk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcnVubmVyLCBwbGFuX3BhdGgpOgogICAgICAgIHNlbGYuciA9IHJ1bm5lcgogICAgICAgIHNlbGYucGxhbl9wYXRoID0gcGxhbl9wYXRoCiAgICAgICAgc2VsZi5yZXBvcnQgPSB7InJlZnVzZWQiOiBOb25lLCAibW9kZSI6IE5vbmV9CgogICAgIyAtLS0tLS0tLS0tIGNoZWNrcyAtLS0tLS0tLS0tCiAgICBkZWYgbG9hZF9wbGFuKHNlbGYpOgogICAgICAgIHAgPSBzZWxmLnBsYW5fcGF0aAogICAgICAgIGQsIGJhc2UgPSBvcy5wYXRoLmRpcm5hbWUocCksIG9zLnBhdGguYmFzZW5hbWUocCkKICAgICAgICBpZiBkICE9IFBMQU5fRElSIG9yIG5vdCBQTEFOX1JFLm1hdGNoKGJhc2UpIG9yICIuLiIgaW4gcDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjEiLCBmInRoZSBwbGFuIG11c3QgYmUge1BMQU5fRElSfS9wbGFuLTxpZD4uanNvbiwgZ290IHtwIXJ9IikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0ID0gc2VsZi5yLnN0YXQocCkKICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMSIsIGYiY2Fubm90IHN0YXQgdGhlIHBsYW46IHtlfSIpCiAgICAgICAgaWYgbm90IHN0YXQuU19JU1JFRyhzdC5zdF9tb2RlKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjEiLCAidGhlIHBsYW4gaXMgbm90IGEgcmVndWxhciBmaWxlIChhIHN5bWxpbmsgb3IgYSBkZXZpY2UgaXMgcmVmdXNlZCkiKQogICAgICAgIGlmIHN0LnN0X3VpZCAhPSBzZWxmLnIuYWdlbnRfdWlkKCk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxIiwgZiJ0aGUgcGxhbiBpcyBub3Qgb3duZWQgYnkge0FHRU5UX1VTRVJ9IikKICAgICAgICBpZiBzdC5zdF9zaXplID4gMiAqIDEwMjQgKiAxMDI0OgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMSIsICJ0aGUgcGxhbiBpcyBsYXJnZXIgdGhhbiAyIE1CIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBsYW4gPSBqc29uLmxvYWRzKHNlbGYuci5yZWFkX2ZpbGUocCkpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yKSBhcyBlOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMSIsIGYidGhlIHBsYW4gaXMgbm90IHZhbGlkIEpTT046IHtlfSIpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGxhbiwgZGljdCk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxIiwgInRoZSBwbGFuIGlzIG5vdCBhIEpTT04gb2JqZWN0IikKICAgICAgICByZXR1cm4gcGxhbgoKICAgIGRlZiBjaGVja19wbGFuKHNlbGYsIHBsYW4pOgogICAgICAgIG1vZGUgPSBwbGFuLmdldCgibW9kZSIsICJhcHBseSIpCiAgICAgICAgaWYgbW9kZSBub3QgaW4gKCJhcHBseSIsICJpbnZlbnRvcnkiLCAiaGVhbHRoIiwgImZhY3RzIiwgImxpdmUtcmVzdG9yZS1vbiIsICJidW5kbGUiLCAiYWdlbnRfdXBkYXRlIiwgIm9vbS1jaGVjayIpIFwKICAgICAgICAgICAgICAgICsgS0VSTkVMX01PREVTOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTEiLCBmInVua25vd24gbW9kZSB7bW9kZSFyfSIpCiAgICAgICAgaWYgbW9kZSA9PSAiYWdlbnRfdXBkYXRlIjoKICAgICAgICAgICAgaWYgcGxhbi5nZXQoImxheWVyIikgIT0gImhvc3QiOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgImFnZW50X3VwZGF0ZSBpcyBhIGhvc3QtbGF5ZXIgbW9kZSIpCiAgICAgICAgICAgIHJldHVybiBtb2RlLCAiaG9zdCIsIDAsICJhZ2VudF91cGRhdGUiCiAgICAgICAgaWYgbW9kZSA9PSAiYnVuZGxlIjoKICAgICAgICAgICAgaWYgcGxhbi5nZXQoImxheWVyIikgIT0gImhvc3QiOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgImJ1bmRsZSBpcyBhIGhvc3QtbGF5ZXIgbW9kZSIpCiAgICAgICAgICAgIHJldHVybiBtb2RlLCAiaG9zdCIsIDAsICJidW5kbGUiCiAgICAgICAgbGF5ZXIgPSBwbGFuLmdldCgibGF5ZXIiKQogICAgICAgIGlmIGxheWVyIG5vdCBpbiAoImd1ZXN0IiwgImhvc3QiLCAiZG9ja2VyIiwgInB2ZSIsICJrZXJuZWwiKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjEyIiwgZiJsYXllciB7bGF5ZXIhcn0gaXMgbm90IGd1ZXN0LCBob3N0LCBkb2NrZXIsIHB2ZSBvciBrZXJuZWwiKQogICAgICAgIGlmIChtb2RlIGluIEtFUk5FTF9NT0RFUykgIT0gKGxheWVyID09ICJrZXJuZWwiIGFuZCBtb2RlIG5vdCBpbiAoImFwcGx5IiwgImhlYWx0aCIpKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgZiJtb2RlIHttb2RlIXJ9IGRvZXMgbm90IGZpdCBsYXllciB7bGF5ZXIhcn0iKQogICAgICAgIGxhbmUgPSBwbGFuLmdldCgibGFuZSIsICJmYXN0IikKICAgICAgICBpZiBsYXllciA9PSAiZG9ja2VyIiBhbmQgbGFuZSAhPSAic2xvdyI6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIzIiwgInRoZSBEb2NrZXIgZW5naW5lIGlzIHRoZSBzbG93IGxhbmUgKGAxMWAgwqc1LjgpOyBhIGZhc3QtbGFuZSBEb2NrZXIgcGxhbiBpcyByZWZ1c2VkIikKICAgICAgICBpZiBsYXllciA9PSAicHZlIiBhbmQgbGFuZSAhPSAic2xvdyI6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIzIiwgInRoZSBQcm94bW94IHBhY2thZ2VzIGFyZSB0aGUgc2xvdyBsYW5lIChgMTFgIMKnNS4xMCk7IGEgZmFzdC1sYW5lIHB2ZSBwbGFuIGlzIHJlZnVzZWQiKQogICAgICAgIGlmIGxheWVyID09ICJrZXJuZWwiIGFuZCBsYW5lICE9ICJzbG93IjoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCAidGhlIGtlcm5lbCBpcyB0aGUgc2xvdyBsYW5lIChgMTFgIMKnNS4xMSk7IGEgZmFzdC1sYW5lIGtlcm5lbCBwbGFuIGlzIHJlZnVzZWQiKQogICAgICAgIGlmIGxheWVyIG5vdCBpbiAoImRvY2tlciIsICJwdmUiLCAia2VybmVsIikgYW5kIGxhbmUgIT0gImZhc3QiOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMyIsIGYidGhlIHtsYXllcn0gbGF5ZXIgaGFzIG5vIHNsb3cgbGFuZSBpbiB0aGlzIHJlbGVhc2UgKGtlcm5lbCwgUHJveG1veDogYDExYCDCpzggc3RlcCA2KSIpCiAgICAgICAgaWYgbW9kZSA9PSAiZmFjdHMiIGFuZCBsYXllciAhPSAiaG9zdCI6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMSIsICJmYWN0cyBpcyBhIGhvc3QtbGF5ZXIgbW9kZSAoaXQgcmVhZHMgdGhlIGhvc3QgYW5kIHRoZSBndWVzdCkiKQogICAgICAgIGlmIG1vZGUgPT0gImxpdmUtcmVzdG9yZS1vbiIgYW5kIGxheWVyICE9ICJndWVzdCI6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMSIsICJsaXZlLXJlc3RvcmUtb24gaXMgYSBndWVzdC1sYXllciBtb2RlIikKICAgICAgICBpZiBtb2RlID09ICJvb20tY2hlY2siIGFuZCBsYXllciAhPSAiZG9ja2VyIjoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgIm9vbS1jaGVjayBpcyBhIGRvY2tlci1sYXllciBtb2RlIChpdCBjaGVja3MgdGhlIGd1ZXN0J3MgRG9ja2VyIGVuZ2luZSkiKQogICAgICAgIGlmIHBsYW4uZ2V0KCJ1bmRvIikgYW5kIGxheWVyICE9ICJkb2NrZXIiOiAgIyB0aGUgcHZlIGxheWVyIGhhcyBubyB1bmRvIGluIHRoaXMgcmVsZWFzZSAoUi04MTIgb3B0aW9uIEEpCiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI1IiwgImFuIHVuZG8gKGRvd25ncmFkZSkgZXhpc3RzIG9ubHkgZm9yIHRoZSBEb2NrZXIgbGF5ZXIsIGluc2lkZSBhIHNpZ25lZCBqb2IiKQogICAgICAgIHZtaWQgPSBwbGFuLmdldCgidm1pZCIpCiAgICAgICAgaWYgbGF5ZXIgPT0gImtlcm5lbCIgYW5kIG1vZGUgaW4gS0VSTkVMX01PREVTIGFuZCBtb2RlICE9ICJrZXJuZWwtcmVib290IiBhbmQgdm1pZCA9PSAwOgogICAgICAgICAgICBwYXNzICAjIGFmdGVyIGEgYm9vdCB0aGUgZ3Vlc3QgbWF5IG5vdCBydW4gKHRoYXQgaXMgd2hhdCBpcyBqdWRnZWQpOyB0aGVzZSBtb2RlcyBuZXZlciB0b3VjaCBpdAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uodm1pZCwgaW50KSBvciBpc2luc3RhbmNlKHZtaWQsIGJvb2wpIG9yIHZtaWQgPD0gMDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgZiJ2bWlkIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBnb3Qge3ZtaWQhcn0iKQogICAgICAgIHJpZCA9IHBsYW4uZ2V0KCJyZWxlYXNlX2lkIiwgIiIpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocmlkLCBzdHIpIG9yIG5vdCByZS5tYXRjaChyIl5bQS1aYS16MC05Ll86LV17MSw4MH0kIiwgcmlkKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgZiJyZWxlYXNlX2lkIHtyaWQhcn0gaXMgbm90IGEgcGxhaW4gaWQiKQogICAgICAgIGlmIHBsYW4uZ2V0KCJhbGxvd19uZXciKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjYiLCAiYWxsb3dfbmV3IGlzIGEgc2xvdy1sYW5lIGZpZWxkOyB0aGUgZmFzdCBsYW5lIG5ldmVyIGFkZHMgYSBwYWNrYWdlIikKICAgICAgICBzZWxlY3QgPSBwbGFuLmdldCgic2VsZWN0IiwgImxpc3RlZCIpCiAgICAgICAgaWYgc2VsZWN0IG5vdCBpbiAoImxpc3RlZCIsICJwZW5kaW5nLWZhc3QiLCAicGVuZGluZy1kb2NrZXIiLCAicGVuZGluZy1wdmUiLCAicGVuZGluZy1rZXJuZWwiKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgZiJ1bmtub3duIHNlbGVjdCB7c2VsZWN0IXJ9IikKICAgICAgICBpZiAoc2VsZWN0ID09ICJwZW5kaW5nLWRvY2tlciIpICE9IChsYXllciA9PSAiZG9ja2VyIiBhbmQgc2VsZWN0ICE9ICJsaXN0ZWQiKToKICAgICAgICAgICAgaWYgc2VsZWN0ID09ICJwZW5kaW5nLWRvY2tlciIgb3IgbGF5ZXIgPT0gImRvY2tlciI6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTEiLCBmInNlbGVjdCB7c2VsZWN0IXJ9IGRvZXMgbm90IGZpdCBsYXllciB7bGF5ZXIhcn0iKQogICAgICAgIGlmIChzZWxlY3QgPT0gInBlbmRpbmctcHZlIikgIT0gKGxheWVyID09ICJwdmUiIGFuZCBzZWxlY3QgIT0gImxpc3RlZCIpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTEiLCBmInNlbGVjdCB7c2VsZWN0IXJ9IGRvZXMgbm90IGZpdCBsYXllciB7bGF5ZXIhcn0iKQogICAgICAgIGlmIChzZWxlY3QgPT0gInBlbmRpbmcta2VybmVsIikgIT0gKGxheWVyID09ICJrZXJuZWwiIGFuZCBzZWxlY3QgIT0gImxpc3RlZCIpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTEiLCBmInNlbGVjdCB7c2VsZWN0IXJ9IGRvZXMgbm90IGZpdCBsYXllciB7bGF5ZXIhcn0iKQogICAgICAgIGVrID0gcGxhbi5nZXQoImV4cGVjdF9rdmVyIikKICAgICAgICBpZiBlayBpcyBub3QgTm9uZSBhbmQgKGxheWVyICE9ICJrZXJuZWwiIG9yIG5vdCBpc2luc3RhbmNlKGVrLCBzdHIpIG9yIG5vdCBLVkVSX1JFLm1hdGNoKGVrKSk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMSIsIGYiZXhwZWN0X2t2ZXIge2VrIXJ9IGlzIG5vdCBhIGtlcm5lbCB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwgbGF5ZXIiKQogICAgICAgIHBrID0gcGxhbi5nZXQoInBhY2thZ2VzIiwgW10pCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGssIGxpc3QpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTEiLCAicGFja2FnZXMgbXVzdCBiZSBhIGxpc3QiKQogICAgICAgIGlmIG1vZGUgPT0gImFwcGx5IiBhbmQgc2VsZWN0ID09ICJsaXN0ZWQiIGFuZCBub3QgcGs6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMSIsICJwYWNrYWdlcyBtdXN0IGJlIGEgbm9uLWVtcHR5IGxpc3QgaW4gYXBwbHkgbW9kZSAoc2VsZWN0IGxpc3RlZCkiKQogICAgICAgIGlmIHNlbGVjdCBpbiAoInBlbmRpbmctZmFzdCIsICJwZW5kaW5nLWRvY2tlciIsICJwZW5kaW5nLXB2ZSIsICJwZW5kaW5nLWtlcm5lbCIpIGFuZCBwazoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgZiJzZWxlY3Qge3NlbGVjdH0gdGFrZXMgbm8gcGFja2FnZSBsaXN0IikKICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBmb3IgZSBpbiBwazoKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZSwgZGljdCk6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTEiLCAiZXZlcnkgcGFja2FnZSBlbnRyeSBtdXN0IGJlIGFuIG9iamVjdCIpCiAgICAgICAgICAgIG4sIHYsIG8gPSBlLmdldCgibmFtZSIpLCBlLmdldCgidmVyc2lvbiIpLCBlLmdldCgib3JpZ2luIikKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobiwgc3RyKSBvciBub3QgTkFNRV9SRS5tYXRjaChuKToKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMSIsIGYicGFja2FnZSBuYW1lIHtuIXJ9IGlzIG5vdCBhIERlYmlhbiBwYWNrYWdlIG5hbWUiKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBzdHIpIG9yIG5vdCBWRVJTSU9OX1JFLm1hdGNoKHYpOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgZiJ2ZXJzaW9uIHt2IXJ9IG9mIHtufSBpcyBub3QgYSBEZWJpYW4gdmVyc2lvbiBzdHJpbmciKQogICAgICAgICAgICBpZiBuIGluIHNlZW46CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTEiLCBmInBhY2thZ2Uge259IGlzIG5hbWVkIHR3aWNlIikKICAgICAgICAgICAgc2Vlbi5hZGQobikKICAgICAgICAgICAgaWYgbGF5ZXIgPT0gImRvY2tlciI6CiAgICAgICAgICAgICAgICBpZiBuIG5vdCBpbiBET0NLRVJfTkFNRVMgb3IgbyAhPSBET0NLRVJfT1JJR0lOOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIyIiwgZiJ7bn0gKHtvIXJ9KSBpcyBub3Qgb25lIG9mIHRoZSBzaXggRG9ja2VyIHBhY2thZ2VzIGZyb20ge0RPQ0tFUl9PUklHSU4hcn0iKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbiBpbiBET0NLRVJfTkFNRVM6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMiIsIGYie259IGlzIGEgRG9ja2VyIHBhY2thZ2Ug4oCUIHRoZSBzbG93IGxhbmUgKGAxMWAgwqc1LjgpLCBuZXZlciBpbiBhIHtsYXllcn0gcGxhbiIpCiAgICAgICAgICAgIGlmIGxheWVyID09ICJrZXJuZWwiOgogICAgICAgICAgICAgICAgaWYgbyAhPSBQVkVfT1JJR0lOOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIyIiwgZiJ7bn06IG9yaWdpbiB7byFyfSBpcyBub3Qge1BWRV9PUklHSU4hcn0gKHRoZSBrZXJuZWwgbGF5ZXIpIikKICAgICAgICAgICAgICAgIGlmIG5vdCAoS0VSTkVMX1VQR1JBREVfUkUubWF0Y2gobikgb3IgS0VSTkVMX0lNQUdFX1JFLm1hdGNoKG4pKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjMiLCBmIntufSBpcyBub3QgYSBrZXJuZWwgcGFja2FnZSAoYSBrZXJuZWwgaW1hZ2UsIHRoZSBrZXJuZWwgbWV0YS1wYWNrYWdlcywgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYicHJveG1veC1rZXJuZWwtaGVscGVyIG9yIHB2ZS1maXJtd2FyZSkiKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbGF5ZXIgPT0gInB2ZSI6CiAgICAgICAgICAgICAgICBpZiBvICE9IFBWRV9PUklHSU46CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIiLCBmIntufTogb3JpZ2luIHtvIXJ9IGlzIG5vdCB7UFZFX09SSUdJTiFyfSAodGhlIHB2ZSBsYXllcikiKQogICAgICAgICAgICAgICAgaWYgSE9TVF9TTE9XX1JFLm1hdGNoKG4pOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxNCIsIGYie259IGlzIGEga2VybmVsIC8gYm9vdCAvIGZpcm13YXJlIHBhY2thZ2Ug4oCUIG5ldmVyIHRoZSBwdmUgbGFuZSAoUi04MzYpIikKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG8gbm90IGluIEZBU1RfT1JJR0lOUzoKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIyIiwgZiJ7bn06IG9yaWdpbiB7byFyfSBpcyBub3QgRGViaWFuIC8gRGViaWFuLVNlY3VyaXR5ICh0aGUgZmFzdCBsYW5lLCBgMTFgIEMzKSIpCiAgICAgICAgICAgIGlmIGxheWVyID09ICJob3N0IiBhbmQgSE9TVF9TTE9XX1JFLm1hdGNoKG4pOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE0IiwgZiJ7bn0gaXMgYSBrZXJuZWwgLyBib290IC8gZmlybXdhcmUgcGFja2FnZSDigJQgdGhlIGhvc3QncyBzbG93IGxhbmUiKQogICAgICAgIHNuYXAgPSBwbGFuLmdldCgic25hcHNob3QiLCAiIikKICAgICAgICBpZiBzbmFwIGFuZCBub3QgU05BUF9SRS5tYXRjaChzbmFwKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjExIiwgZiJzbmFwc2hvdCB7c25hcCFyfSBpcyBub3QgWVlZWU1NRERUSEhNTVNTWiIpCiAgICAgICAgcmV0dXJuIG1vZGUsIGxheWVyLCB2bWlkLCBzZWxlY3QKCiAgICBkZWYgY2hlY2tfYXBwbGlhbmNlKHNlbGYpOgogICAgICAgICIiIlIxMjogdGhlIGhvc3QgbGF5ZXIgb25seSBvbiBhIGJveCB3aG9zZSBST09ULU9XTkVEIGluc3RhbGwgcmVjb3JkIHNheXMgYXBwbGlhbmNlIChgMTFgIMKnMTogbmV2ZXIgQllPKS4iIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0ID0gc2VsZi5yLnN0YXQoSU5TVEFMTF9TVEFURSkKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjEyIiwgZiJubyBpbnN0YWxsIHJlY29yZCAoe0lOU1RBTExfU1RBVEV9KSDigJQgdGhpcyBib3ggY2Fubm90IHByb3ZlIGl0IGlzIGFuIGFwcGxpYW5jZSIpCiAgICAgICAgaWYgc3Quc3RfdWlkICE9IDAgb3IgKHN0LnN0X21vZGUgJiAwbzAyMik6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMiIsIGYie0lOU1RBTExfU1RBVEV9IGlzIG5vdCByb290LW93bmVkIGFuZCByb290LW9ubHktd3JpdGFibGUg4oCUIGl0IHByb3ZlcyBub3RoaW5nIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1vZGUgPSBqc29uLmxvYWRzKHNlbGYuci5yZWFkX2ZpbGUoSU5TVEFMTF9TVEFURSkpLmdldCgibW9kZSIpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMiIsIGYie0lOU1RBTExfU1RBVEV9IGlzIHVucmVhZGFibGUg4oCUIHRoaXMgYm94IGNhbm5vdCBwcm92ZSBpdCBpcyBhbiBhcHBsaWFuY2UiKQogICAgICAgIGlmIG1vZGUgIT0gImFwcGxpYW5jZSI6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMiIsIGYidGhpcyBib3ggd2FzIGluc3RhbGxlZCBhcyB7bW9kZSFyfSwgbm90IGFwcGxpYW5jZSDigJQgaXRzIGhvc3QgYmVsb25ncyB0byBpdHMgb3duZXIiKQoKICAgIGRlZiBsb2FkX3RydXN0KHNlbGYpOgogICAgICAgICIiIlRoZSBST09ULU9XTkVEIHRydXN0IHJlY29yZC4gQWJzZW50IG9yIGFnZW50LXdyaXRhYmxlIOKGkiBubyBzbG93LWxhbmUgYXV0aG9yaXR5IGF0IGFsbCAoUjMpLiIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc3QgPSBzZWxmLnIuc3RhdChUUlVTVF9GSUxFKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMyIsIGYibm8ge1RSVVNUX0ZJTEV9IOKAlCB0aGlzIGJveCBoYXMgbm8gc2xvdy1sYW5lIHRydXN0IGFuY2hvciIpCiAgICAgICAgaWYgc3Quc3RfdWlkICE9IDAgb3IgKHN0LnN0X21vZGUgJiAwbzAyMik6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIzIiwgZiJ7VFJVU1RfRklMRX0gaXMgbm90IHJvb3Qtb3duZWQgYW5kIHJvb3Qtb25seS13cml0YWJsZSDigJQgaXQgcHJvdmVzIG5vdGhpbmciKQogICAgICAgIHRyeToKICAgICAgICAgICAgdCA9IGpzb24ubG9hZHMoc2VsZi5yLnJlYWRfZmlsZShUUlVTVF9GSUxFKSkKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMyIsIGYie1RSVVNUX0ZJTEV9IGlzIHVucmVhZGFibGUiKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHQsIGRpY3QpIG9yIG5vdCBpc2luc3RhbmNlKHQuZ2V0KCJob3N0X2lkIiksIHN0cikgb3Igbm90IHRbImhvc3RfaWQiXToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCBmIntUUlVTVF9GSUxFfSBuYW1lcyBubyBob3N0X2lkIikKICAgICAgICByZXR1cm4gdAoKICAgIGRlZiB2ZXJpZnlfc2lnbmVkKHNlbGYsIHNpZ25lZCwgdHJ1c3QsIG9wX25hbWU9U0lHTkVEX09QLCBzaWduZXJzPU5vbmUsIGJ1cm49VHJ1ZSk6CiAgICAgICAgIiIiUjM6IGFuIG9wZXJhdG9yLXNpZ25lZCBqb2IsIGNoZWNrZWQgSEVSRSAobm90IGJ5IHRoZSBhZ2VudCk6IHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSByb290LW93bmVkIHNpZ25lcnMgZmlsZSAob3IsCiAgICAgICAgZm9yIGEgYnVuZGxlIG9uIGEgYm94IHRoYXQgaGFzIG5vbmUsIHRoZSBQSU5ORUQga2V5IOKAlCBgc2lnbmVyc2AgbmFtZXMgdGhhdCB0ZW1wIGZpbGUpLCBvcCwgaG9zdCBiaW5kaW5nLCB0aW1lCiAgICAgICAgd2luZG93LCBhbmQgYSByb290LW93bmVkIG5vbmNlIHJlY29yZCAobm8gcmVwbGF5KS4gYnVybj1GYWxzZSBsZWF2ZXMgdGhlIG5vbmNlIGZvciB0aGUgY2FsbGVyIHRvIGJ1cm4gYWZ0ZXIgaXRzCiAgICAgICAgb3duIGNoZWNrcyAoYSBidW5kbGUgcmVmdXNlZCBmb3IgYSB3cm9uZyBzaGEga2VlcHMgaXRzIGpvYiB1c2FibGUg4oCUIHRoZSBvcGVyYXRvciBmaXhlcyB0aGUgc2hhLCBub3QgdGhlIGtleSkuCiAgICAgICAgUmV0dXJucyB0aGUgcGFyYW1zOyB3aXRoIGJ1cm49RmFsc2UsIChwYXJhbXMsIG5vbmNlLCBleHBpcnkpLiIiIgogICAgICAgIGltcG9ydCBiYXNlNjQKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzaWduZWQsIGRpY3QpIG9yIG5vdCBpc2luc3RhbmNlKHNpZ25lZC5nZXQoImJsb2JfYjY0IiksIHN0cikgb3Igbm90IGlzaW5zdGFuY2Uoc2lnbmVkLmdldCgic2lnIiksIHN0cik6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIzIiwgInRoZSBzaWduZWQgam9iIGlzIG1hbGZvcm1lZCIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBibG9iID0gYmFzZTY0LmI2NGRlY29kZShzaWduZWRbImJsb2JfYjY0Il0sIHZhbGlkYXRlPVRydWUpCiAgICAgICAgICAgIG9wID0ganNvbi5sb2FkcyhibG9iKQogICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCAidGhlIHNpZ25lZCBibG9iIGlzIG5vdCBiYXNlNjQgSlNPTiIpCiAgICAgICAga2V5X2lkID0gb3AuZ2V0KCJrZXlfaWQiLCAiIikKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrZXlfaWQsIHN0cikgb3Igbm90IHJlLm1hdGNoKHIiXltBLVphLXowLTkuXy1dezEsNjR9JCIsIGtleV9pZCk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIzIiwgInRoZSBzaWduZWQgYmxvYiBuYW1lcyBubyBwbGFpbiBrZXlfaWQiKQogICAgICAgIGlmIHNpZ25lcnMgaXMgTm9uZToKICAgICAgICAgICAgc2lnbmVycyA9IFRSVVNUX1NJR05FUlMKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc3QgPSBzZWxmLnIuc3RhdChUUlVTVF9TSUdORVJTKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIzIiwgZiJubyB7VFJVU1RfU0lHTkVSU30g4oCUIG5vIG9wZXJhdG9yIGtleSB0byBjaGVjayBhIHNpZ25lZCBqb2IgYWdhaW5zdCIpCiAgICAgICAgICAgIGlmIHN0LnN0X3VpZCAhPSAwIG9yIChzdC5zdF9tb2RlICYgMG8wMjIpOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCBmIntUUlVTVF9TSUdORVJTfSBpcyBub3Qgcm9vdC1vd25lZCBhbmQgcm9vdC1vbmx5LXdyaXRhYmxlIikKICAgICAgICByYyA9IHNlbGYuci52ZXJpZnlfc2lnKHNpZ25lcnMsIGtleV9pZCwgU0lHX05BTUVTUEFDRSwgYmxvYiwgc2lnbmVkWyJzaWciXSkKICAgICAgICBpZiByYyAhPSAwOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMyIsIGYidGhlIG9wZXJhdG9yIHNpZ25hdHVyZSBkb2VzIG5vdCB2ZXJpZnkgKHNzaC1rZXlnZW4gcmM9e3JjfSkiKQogICAgICAgIGlmIG9wLmdldCgib3AiKSAhPSBvcF9uYW1lOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMyIsIGYidGhlIHNpZ25lZCBvcCBpcyB7b3AuZ2V0KCdvcCcpIXJ9LCBub3Qge29wX25hbWV9IikKICAgICAgICBpZiAob3AuZ2V0KCJ0YXJnZXQiKSBvciB7fSkuZ2V0KCJob3N0X2lkIikgIT0gdHJ1c3RbImhvc3RfaWQiXToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCAidGhlIHNpZ25lZCBqb2IgaXMgZm9yIGFub3RoZXIgaG9zdCIpCiAgICAgICAgbm93ID0gc2VsZi5yLm5vdygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBleHAgPSBjYWxlbmRhci50aW1lZ20odGltZS5zdHJwdGltZShvcFsiZXhwaXJlc19hdCJdLCAiJVktJW0tJWRUJUg6JU06JVNaIikpCiAgICAgICAgICAgIGlzcyA9IGNhbGVuZGFyLnRpbWVnbSh0aW1lLnN0cnB0aW1lKG9wWyJpc3N1ZWRfYXQiXSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIpKQogICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsIFZhbHVlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIzIiwgInRoZSBzaWduZWQgam9iIGhhcyBubyByZWFkYWJsZSB0aW1lIHdpbmRvdyIpCiAgICAgICAgaWYgbm93ID4gZXhwIG9yIG5vdyA8IGlzcyAtIDEyMDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCAidGhlIHNpZ25lZCBqb2IgaXMgZXhwaXJlZCBvciBub3QgeWV0IHZhbGlkIikKICAgICAgICBub25jZSA9IG9wLmdldCgibm9uY2UiKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vbmNlLCBzdHIpIG9yIG5vdCBub25jZToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCAidGhlIHNpZ25lZCBqb2IgaGFzIG5vIG5vbmNlIikKICAgICAgICBpZiBub25jZSBpbiBzZWxmLnIucmVhZF9ub25jZXMoKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCAidGhlIHNpZ25lZCBqb2Igd2FzIGFscmVhZHkgdXNlZCAocmVwbGF5KSIpCiAgICAgICAgaWYgbm90IGJ1cm46CiAgICAgICAgICAgIHJldHVybiBvcC5nZXQoInBhcmFtcyIpIG9yIHt9LCBub25jZSwgZXhwCiAgICAgICAgc2VsZi5idXJuX25vbmNlKG5vbmNlLCBleHApCiAgICAgICAgcmV0dXJuIG9wLmdldCgicGFyYW1zIikgb3Ige30KCiAgICBkZWYgYWdlbnRfdXBkYXRlKHNlbGYsIHBsYW4pOgogICAgICAgICIiIlItODYxIChhZ2VudCB2MC4xNDYuMCk6IHRoZSBhZ2VudCBiaW5hcnkgaXMgcmVwbGFjZWQgT05MWSBieSBhbiBvcGVyYXRvci1zaWduZWQgYWdlbnRfdXBkYXRlLCBjaGVja2VkIEhFUkUgYXMKICAgICAgICByb290IOKAlCBzaWduYXR1cmUgYWdhaW5zdCB0aGUgcm9vdC1vd25lZCBzaWduZXJzIGZpbGUsIG9wLCB0aGlzIGhvc3QsIHRoZSB0aW1lIHdpbmRvdywgdGhlIG5vbmNlIOKAlCBhbmQgb25seSB0aGUKICAgICAgICBzdGFnZWQgZmlsZSB3aG9zZSBzaGEyNTYgdGhlIFNJR05FRCBwYXJhbXMgcGluLCBhdCB0aGUgb25lIHN0YWdpbmcgcGF0aC4gQmVmb3JlIHYwLjE0Ni4wIHRoZSBhZ2VudCBoYW5kZWQgdGhlCiAgICAgICAgc2hhIHRvIGBmZWxob20tc2VsZnVwZGF0ZS1ndWFyZGVkIGFwcGx5YCBpdHNlbGYsIHNvIGEgY29tcHJvbWlzZWQgYWdlbnQgY291bGQgaW5zdGFsbCBhbnkgYmluYXJ5IOKAlCBhbmQgdGhlCiAgICAgICAgYmluYXJ5IGlzIHdoYXQgRkVMSE9NX0VTQ1JPVyBhbmQgdGhlIGd1ZXN0IGhvb2sgcnVuIGFzIHJvb3QuIFRoZSBub25jZSBpcyBidXJuZWQgb25seSBhZnRlciB0aGUgZmxpcC4iIiIKICAgICAgICB0cnVzdCA9IHNlbGYubG9hZF90cnVzdCgpCiAgICAgICAgcGFyYW1zLCBub25jZSwgZXhwID0gc2VsZi52ZXJpZnlfc2lnbmVkKHBsYW4uZ2V0KCJzaWduZWQiKSwgdHJ1c3QsIG9wX25hbWU9U0VMRlVQREFURV9PUCwgYnVybj1GYWxzZSkKICAgICAgICB2ZXIsIHNoYSA9IHBhcmFtcy5nZXQoInZlcnNpb24iKSwgcGFyYW1zLmdldCgic2hhMjU2IikKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXIsIHN0cikgb3Igbm90IHJlLm1hdGNoKHIiXlswLTldK1wuWzAtOV0rXC5bMC05XSskIiwgdmVyKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE5IiwgZiJ0aGUgc2lnbmVkIHZlcnNpb24ge3ZlciFyfSBpcyBub3QgYmFyZSBzZW12ZXIiKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNoYSwgc3RyKSBvciBub3QgcmUubWF0Y2gociJeWzAtOWEtZl17NjR9JCIsIHNoYSk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxOSIsICJ0aGUgc2lnbmVkIHNoYTI1NiBpcyBub3QgNjQgbG93ZXJjYXNlIGhleCIpCiAgICAgICAgc3RhZ2VkID0gb3MucGF0aC5qb2luKFNFTEZVUERBVEVfRElSLCAiZmVsaG9tLWFnZW50LSIgKyB2ZXIpCiAgICAgICAgaWYgcGxhbi5nZXQoInN0YWdlZCIpICE9IHN0YWdlZDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE5IiwgZiJ0aGUgc3RhZ2VkIGJpbmFyeSBtdXN0IGJlIHtzdGFnZWR9LCBnb3Qge3BsYW4uZ2V0KCdzdGFnZWQnKSFyfSIpCiAgICAgICAgIyBPTkUgcmVhZCwgdGhlbiBuZXZlciB0aGUgYWdlbnQncyBwYXRoIGFnYWluOiBoYXNoIGV4YWN0bHkgdGhlc2UgYnl0ZXMgYW5kIGhhbmQgdGhlIEEvQiB3cmFwcGVyIGEgUk9PVC1PV05FRAogICAgICAgICMgY29weSBvZiB0aGVtLiBIYXNoaW5nIHRoZSBhZ2VudCdzIGZpbGUgYW5kIHRoZW4gbGV0dGluZyB0aGUgd3JhcHBlciBjb3B5IGl0IGJ5IHBhdGggd2FzIGEgcmFjZSDigJQgdGhlIGFnZW50IG93bnMKICAgICAgICAjIHRoYXQgZGlyZWN0b3J5IGFuZCBjb3VsZCBzd2FwIHRoZSBmaWxlIGJldHdlZW4gdGhlIGNoZWNrIGFuZCB0aGUgY29weSAoZm91bmQgYnkgcmV2aWV3IDIwMjYtMTAtMDUpLgogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IHNlbGYuci5yZWFkX3N0YWdlZF9vbmNlKHN0YWdlZCwgc2VsZi5yLmFnZW50X3VpZCgpLCBTRUxGVVBEQVRFX01BWF9CWVRFUykKICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTkiLCBmImNhbm5vdCByZWFkIHRoZSBzdGFnZWQgYmluYXJ5OiB7ZX0iKQogICAgICAgIGdvdCA9IHNoYTI1Nl9oZXgoZGF0YSkKICAgICAgICBpZiBnb3QgIT0gc2hhOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTkiLCBmInRoZSBzdGFnZWQgYmluYXJ5J3Mgc2hhMjU2IHtnb3RbOjE2XX3igKYgaXMgbm90IHRoZSBzaWduZWQge3NoYVs6MTZdfeKApiIpCiAgICAgICAgcm9vdF9jb3B5ID0gb3MucGF0aC5qb2luKFNFTEZVUERBVEVfUk9PVF9ESVIsICJmZWxob20tYWdlbnQtIiArIHZlcikKICAgICAgICBzZWxmLnIucHV0X2ZpbGUocm9vdF9jb3B5LCBkYXRhLCAwbzc1NSkKICAgICAgICBzZWxmLnIubG9nKGYib3MtYXBwbHk6IEFHRU5ULVVQREFURSBzaWduZWQgYnkgdGhlIG9wZXJhdG9yOiB2ZXJzaW9uPXt2ZXJ9IHNoYT17c2hhWzoxNl19IOKAlCBoYW5kaW5nIHRoZSByb290IGNvcHkgdG8gdGhlIEEvQiB3cmFwcGVyIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJjLCBvdXQsIGVyciA9IHNlbGYuci5ob3N0KFtTRUxGVVBEQVRFX1dSQVBQRVIsICJhcHBseSIsIHJvb3RfY29weSwgc2hhXSwgMTIwKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuci5yZW1vdmUocm9vdF9jb3B5KQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBzZWxmLnJlcG9ydFsiYWdlbnRfdXBkYXRlIl0gPSB7InZlcnNpb24iOiB2ZXIsICJzaGEyNTYiOiBzaGEsICJ3cmFwcGVyX3JjIjogcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cmFwcGVyIjogKG91dCArIGVycikuc3RyaXAoKVstMzAwOl19CiAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgc2VsZi5yZXBvcnRbImZhaWxlZCJdID0geyJyYyI6IHJjLCAic3RlcCI6ICJhZ2VudF91cGRhdGUiLCAicmVhc29uIjogKG91dCArIGVycikuc3RyaXAoKVstMzAwOl19CiAgICAgICAgICAgIHJldHVybiAzCiAgICAgICAgc2VsZi5idXJuX25vbmNlKG5vbmNlLCBleHApCiAgICAgICAgcmV0dXJuIDAKCiAgICBkZWYgYnVybl9ub25jZShzZWxmLCBub25jZSwgZXhwKToKICAgICAgICBzZWVuID0gc2VsZi5yLnJlYWRfbm9uY2VzKCkKICAgICAgICBpZiBub25jZSBpbiBzZWVuOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMyIsICJ0aGUgc2lnbmVkIGpvYiB3YXMgYWxyZWFkeSB1c2VkIChyZXBsYXkpIikKICAgICAgICBzZWVuW25vbmNlXSA9IGV4cAogICAgICAgIG5vdyA9IHNlbGYuci5ub3coKQogICAgICAgIHNlbGYuci53cml0ZV9ub25jZXMoe2s6IHYgZm9yIGssIHYgaW4gc2Vlbi5pdGVtcygpIGlmIHYgPiBub3d9KQoKICAgIGRlZiBkb2NrZXJfYXV0aG9yaXR5KHNlbGYsIHBsYW4sIG9wX25hbWU9U0lHTkVEX09QKToKICAgICAgICAiIiJSMyBmb3IgdGhlIGRvY2tlciAoYW5kLCBvcF9uYW1lIG9zX3B2ZV9zdGVwLCB0aGUgcHZlKSBsYXllcjogcmV0dXJucyAod2hvLCB1bmRvKS4gQSBzaWduZWQgam9iIGJpbmRzIHRoZSBFWEFDVAogICAgICAgIHBhY2thZ2UgbGlzdCBhbmQgdGhlIHVuZG8gZmxhZy4iIiIKICAgICAgICB0cnVzdCA9IHNlbGYubG9hZF90cnVzdCgpCiAgICAgICAgc2lnbmVkID0gcGxhbi5nZXQoInNpZ25lZCIpCiAgICAgICAgaWYgc2lnbmVkOgogICAgICAgICAgICBwYXJhbXMgPSBzZWxmLnZlcmlmeV9zaWduZWQoc2lnbmVkLCB0cnVzdCwgb3BfbmFtZT1vcF9uYW1lKQogICAgICAgICAgICB3YW50ID0gc29ydGVkKGYie2UuZ2V0KCduYW1lJyl9PXtlLmdldCgndmVyc2lvbicpfSIgZm9yIGUgaW4gcGFyYW1zLmdldCgicGFja2FnZXMiKSBvciBbXSkKICAgICAgICAgICAgZ290ID0gc29ydGVkKGYie2VbJ25hbWUnXX09e2VbJ3ZlcnNpb24nXX0iIGZvciBlIGluIHBsYW4uZ2V0KCJwYWNrYWdlcyIsIFtdKSkKICAgICAgICAgICAgaWYgbm90IHdhbnQgb3Igd2FudCAhPSBnb3Q6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMyIsICJ0aGUgcGxhbidzIHBhY2thZ2VzIGFyZSBub3QgZXhhY3RseSB0aGUgc2lnbmVkIGpvYidzIHBhY2thZ2VzIikKICAgICAgICAgICAgaWYgYm9vbChwYXJhbXMuZ2V0KCJ1bmRvIikpICE9IGJvb2wocGxhbi5nZXQoInVuZG8iKSk6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMyIsICJ0aGUgcGxhbidzIHVuZG8gZmxhZyBpcyBub3QgdGhlIHNpZ25lZCBqb2IncyIpCiAgICAgICAgICAgIGlmIHBhcmFtcy5nZXQoInZtaWQiKSBub3QgaW4gKE5vbmUsIHNlbGYudm1pZCk6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMyIsICJ0aGUgc2lnbmVkIGpvYiBuYW1lcyBhbm90aGVyIGd1ZXN0IikKICAgICAgICAgICAgcmV0dXJuICJzaWduZWQiLCBib29sKHBsYW4uZ2V0KCJ1bmRvIikpCiAgICAgICAgaWYgcGxhbi5nZXQoInVuZG8iKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCAiYW4gdW5kbyAoZG93bmdyYWRlKSBuZWVkcyBhIHNpZ25lZCBvcGVyYXRvciBqb2IiKQogICAgICAgIGlmIHRydXN0LmdldCgicmluZzBfc2xvd19sYW5lIikgaXMgVHJ1ZToKICAgICAgICAgICAgcmV0dXJuICJyaW5nMCIsIEZhbHNlCiAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCBmImEge3NlbGYubGF5ZXJ9IHNsb3ctbGFuZSBzdGVwIG5lZWRzIGEgc2lnbmVkIG9wZXJhdG9yIGpvYiAocmluZyAxKSBvciB0aGlzIGJveCdzIHJvb3Qtb3duZWQgcmluZy0wIG1hcmsiKQoKICAgIGRlZiBsaXZlX3Jlc3RvcmUoc2VsZik6CiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYuZyhbImRvY2tlciIsICJpbmZvIiwgIi0tZm9ybWF0IiwgInt7LkxpdmVSZXN0b3JlRW5hYmxlZH19Il0sIHRpbWVvdXQ9NjApCiAgICAgICAgcmV0dXJuIG91dC5zdHJpcCgpIGlmIHJjID09IDAgYW5kIG91dC5zdHJpcCgpIGluICgidHJ1ZSIsICJmYWxzZSIpIGVsc2UgInVua25vd24iCgogICAgZGVmIGNvbnRhaW5lcl9pZHMoc2VsZik6CiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYuZyhbImRvY2tlciIsICJwcyIsICItcSIsICItLW5vLXRydW5jIl0sIHRpbWVvdXQ9NjApCiAgICAgICAgcmV0dXJuIHNvcnRlZChvdXQuc3BsaXQoKSkgaWYgcmMgPT0gMCBlbHNlIE5vbmUKCiAgICBkZWYgbGl2ZV9yZXN0b3JlX29uKHNlbGYpOgogICAgICAgICIiImAwOWAgZGVjaXNpb24gODc6IG1lcmdlIGxpdmUtcmVzdG9yZSBpbnRvIGRhZW1vbi5qc29uIGFuZCBSRUxPQUQgKEM1OiBhIHJlbG9hZCB0dXJucyBpdCBvbiwgbm8gcmVzdGFydCkuIiIiCiAgICAgICAgbG9nID0gc2VsZi5yLmxvZwogICAgICAgIGlmIHNlbGYubGl2ZV9yZXN0b3JlKCkgPT0gInRydWUiOgogICAgICAgICAgICBzZWxmLnJlcG9ydFsibGl2ZV9yZXN0b3JlIl0gPSB7InJlc3VsdCI6ICJhbHJlYWR5IG9uIn0KICAgICAgICAgICAgbG9nKCJvcy1hcHBseTogTElWRS1SRVNUT1JFIGFscmVhZHkgb24iKQogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIHJjLCBjdXIsIF8gPSBzZWxmLmcoWyJjYXQiLCBEQUVNT05fSlNPTl0sIHRpbWVvdXQ9MzApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25mID0ganNvbi5sb2FkcyhjdXIpIGlmIHJjID09IDAgYW5kIGN1ci5zdHJpcCgpIGVsc2Uge30KICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE2IiwgZiJ7REFFTU9OX0pTT059IGluIHRoZSBndWVzdCBpcyBub3QgdmFsaWQgSlNPTiDigJQgbm90IHRvdWNoZWQiKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvbmYsIGRpY3QpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTYiLCBmIntEQUVNT05fSlNPTn0gaXMgbm90IGEgSlNPTiBvYmplY3Qg4oCUIG5vdCB0b3VjaGVkIikKICAgICAgICBiZWZvcmUgPSBzZWxmLmNvbnRhaW5lcl9pZHMoKQogICAgICAgIGNvbmZbImxpdmUtcmVzdG9yZSJdID0gVHJ1ZQogICAgICAgIHNlbGYuci53cml0ZV9maWxlKCJndWVzdCIsIHNlbGYudm1pZCwgREFFTU9OX0pTT04sIGpzb24uZHVtcHMoY29uZiwgaW5kZW50PTIsIHNvcnRfa2V5cz1UcnVlKSArICJcbiIpCiAgICAgICAgcnJjLCBfLCByZXJyID0gc2VsZi5nKFsic3lzdGVtY3RsIiwgInJlbG9hZCIsICJkb2NrZXIiXSwgdGltZW91dD0xMjApCiAgICAgICAgc3RhdGUgPSAidW5rbm93biIKICAgICAgICBmb3IgXyBpbiByYW5nZSgxMCk6CiAgICAgICAgICAgIHN0YXRlID0gc2VsZi5saXZlX3Jlc3RvcmUoKQogICAgICAgICAgICBpZiBzdGF0ZSA9PSAidHJ1ZSI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBzZWxmLnIuc2xlZXAoMSkKICAgICAgICBhZnRlciA9IHNlbGYuY29udGFpbmVyX2lkcygpCiAgICAgICAgc2FtZSA9IGJlZm9yZSBpcyBub3QgTm9uZSBhbmQgYmVmb3JlID09IGFmdGVyCiAgICAgICAgc2VsZi5yZXBvcnRbImxpdmVfcmVzdG9yZSJdID0geyJyZXN1bHQiOiAib24iIGlmIHN0YXRlID09ICJ0cnVlIiBlbHNlICJmYWlsZWQiLCAicmVsb2FkX3JjIjogcnJjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyc19iZWZvcmUiOiBsZW4oYmVmb3JlIG9yIFtdKSwgInNhbWVfaWRzIjogc2FtZX0KICAgICAgICBsb2coZiJvcy1hcHBseTogTElWRS1SRVNUT1JFIHJlbG9hZF9yYz17cnJjfSBzdGF0ZT17c3RhdGV9IGNvbnRhaW5lcnM9e2xlbihiZWZvcmUgb3IgW10pfSBzYW1lLWlkcz17J3llcycgaWYgc2FtZSBlbHNlICdOTyd9IikKICAgICAgICBpZiBzdGF0ZSAhPSAidHJ1ZSI6CiAgICAgICAgICAgICMgcHV0IHRoZSBvbGQgZmlsZSBiYWNrIChhbmQgcmVsb2FkIGFnYWluKSDigJQgc3RpbGwgbmV2ZXIgYSByZXN0YXJ0CiAgICAgICAgICAgIHNlbGYuci53cml0ZV9maWxlKCJndWVzdCIsIHNlbGYudm1pZCwgREFFTU9OX0pTT04sIGN1ciBpZiByYyA9PSAwIGVsc2UgInt9XG4iKQogICAgICAgICAgICBzZWxmLmcoWyJzeXN0ZW1jdGwiLCAicmVsb2FkIiwgImRvY2tlciJdLCB0aW1lb3V0PTEyMCkKICAgICAgICAgICAgc2VsZi5yZXBvcnRbImZhaWxlZCJdID0geyJyYyI6IDMsICJzdGVwIjogImxpdmUtcmVzdG9yZSIsICJyZWFzb24iOiAocmVyciBvciAiIikuc3RyaXAoKVstMjAwOl19CiAgICAgICAgICAgIHJldHVybiAzCiAgICAgICAgcmV0dXJuIDAKCiAgICBkZWYga2VybmVsX25leHRfYm9vdChzZWxmKToKICAgICAgICAiIiJXaGljaCBrZXJuZWwgR1JVQiBib290cyBuZXh0LCByZWFkIHdpdGhvdXQgcm9vdC1vbmx5IGZpbGVzIChncnViZW52ICsgL2V0Yy9kZWZhdWx0L2dydWIgKyAvYm9vdCkuIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZmx0ID0gcmUuc2VhcmNoKHInXkdSVUJfREVGQVVMVD1bIlwnXT8oW14iXCdcbl0qKScsIHNlbGYuci5yZWFkX2ZpbGUoIi9ldGMvZGVmYXVsdC9ncnViIiksIHJlLk0pCiAgICAgICAgICAgIGRmbHQgPSBkZmx0Lmdyb3VwKDEpIGlmIGRmbHQgZWxzZSAiMCIKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgZGZsdCA9ICIwIgogICAgICAgIGVudiA9IHt9CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3IgbCBpbiBzZWxmLnIucmVhZF9maWxlKCIvYm9vdC9ncnViL2dydWJlbnYiKS5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgICAgICBpZiAiPSIgaW4gbCBhbmQgbm90IGwuc3RhcnRzd2l0aCgiIyIpOgogICAgICAgICAgICAgICAgICAgIGssIHYgPSBsLnNwbGl0KCI9IiwgMSkKICAgICAgICAgICAgICAgICAgICBlbnZba10gPSB2CiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHZlcihlbnRyeSk6CiAgICAgICAgICAgIG0gPSByZS5zZWFyY2gociJnbnVsaW51eC0oWzAtOV1bXj5cc10qPy1wdmUpLSg/OmFkdmFuY2VkfHJlY292ZXJ5KSIsIGVudHJ5KQogICAgICAgICAgICByZXR1cm4gbS5ncm91cCgxKSBpZiBtIGVsc2UgInVua25vd24iCiAgICAgICAgaWYgZW52LmdldCgibmV4dF9lbnRyeSIpOgogICAgICAgICAgICByZXR1cm4gdmVyKGVudlsibmV4dF9lbnRyeSJdKSwgIm5leHRfZW50cnkgKGEgb25lLXNob3QgR1JVQiBjYW5ub3QgY2xlYXIgb24gTFZNIC9ib290KSIKICAgICAgICBpZiBkZmx0ID09ICJzYXZlZCI6CiAgICAgICAgICAgIHJldHVybiAodmVyKGVudlsic2F2ZWRfZW50cnkiXSksICJzYXZlZCBkZWZhdWx0IikgaWYgZW52LmdldCgic2F2ZWRfZW50cnkiKSBlbHNlICgidW5rbm93biIsICJzYXZlZCBkZWZhdWx0IHVuc2V0IikKICAgICAgICBpZiBkZmx0ID09ICIwIjoKICAgICAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYuci5ob3N0KFsic2giLCAiLWMiLCAibHMgL2Jvb3Qvdm1saW51ei0qIDI+L2Rldi9udWxsIl0sIDMwKQogICAgICAgICAgICB2ZXJzID0gW2wuc3BsaXQoInZtbGludXotIiwgMSlbMV0gZm9yIGwgaW4gb3V0LnNwbGl0KCkgaWYgInZtbGludXotIiBpbiBsXQogICAgICAgICAgICBiZXN0ID0gTm9uZQogICAgICAgICAgICBmb3IgdiBpbiB2ZXJzOgogICAgICAgICAgICAgICAgaWYgYmVzdCBpcyBOb25lIG9yIHNlbGYuZHBrZ19jbXAodiwgImd0IiwgYmVzdCk6CiAgICAgICAgICAgICAgICAgICAgYmVzdCA9IHYKICAgICAgICAgICAgcmV0dXJuIChiZXN0IG9yICJ1bmtub3duIiksICJHUlVCX0RFRkFVTFQ9MCAodGhlIG5ld2VzdCBpbnN0YWxsZWQpIgogICAgICAgIHJldHVybiAidW5rbm93biIsIGYiR1JVQl9ERUZBVUxUPXtkZmx0fSIKCiAgICBkZWYgZmFjdHMoc2VsZik6CiAgICAgICAgIiIiUmVhZC1vbmx5IHZlcnNpb25zIGZvciB0aGUgaHViJ3MgU3lzdGVtIHBhZ2UgKFItODUyKS4gQSB2YWx1ZSB0aGF0IGNhbm5vdCBiZSByZWFkIGlzICJ1bmtub3duIi4iIiIKICAgICAgICBkZWYgZmlyc3QoY21kLCB0aW1lb3V0PTMwKToKICAgICAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYuci5ob3N0KGNtZCwgdGltZW91dCkKICAgICAgICAgICAgdiA9IG91dC5zdHJpcCgpLnNwbGl0bGluZXMoKVswXS5zdHJpcCgpIGlmIHJjID09IDAgYW5kIG91dC5zdHJpcCgpIGVsc2UgIiIKICAgICAgICAgICAgcmV0dXJuIHYgb3IgInVua25vd24iCiAgICAgICAgaCA9IHsiZGViaWFuIjogZmlyc3QoWyJjYXQiLCAiL2V0Yy9kZWJpYW5fdmVyc2lvbiJdKSwgImtlcm5lbF9ydW5uaW5nIjogZmlyc3QoWyJ1bmFtZSIsICItciJdKX0KICAgICAgICBoWyJrZXJuZWxfbmV4dF9ib290Il0sIGhbImtlcm5lbF9uZXh0X2Jvb3Rfc291cmNlIl0gPSBzZWxmLmtlcm5lbF9uZXh0X2Jvb3QoKQogICAgICAgIHRyeToKICAgICAgICAgICAgIyB0aGUga2VybmVsIGxhbmUgKFItODM2KTogdGhlIGRlZmF1bHQgYW5kIHRoZSBvbmUtc2hvdCBmbGFnLCByZWFkIGZyb20gZ3J1Yi5jZmcgYW5kIHRoZSBFU1AgdGhlbXNlbHZlcwogICAgICAgICAgICBrdiA9IEtlcm5lbChzZWxmLCB7fSkudmlldygpCiAgICAgICAgICAgIGt2WyJzZXR1cF9wcm9ibGVtcyJdID0gS2VybmVsKHNlbGYsIHt9KS5zZXR1cF9wcm9ibGVtcygpCiAgICAgICAgICAgIGhbImtlcm5lbF9sYW5lIl0gPSBrdgogICAgICAgICAgICBpZiBrdi5nZXQoImZsYWciKToKICAgICAgICAgICAgICAgIGhbImtlcm5lbF9uZXh0X2Jvb3QiXSwgaFsia2VybmVsX25leHRfYm9vdF9zb3VyY2UiXSA9IGt2WyJmbGFnIl0sICJmZWxob20gb25lLXNob3QgZmxhZyAob25jZTsgdGhlbiB0aGUgZGVmYXVsdCkiCiAgICAgICAgICAgIGVsaWYga3YuZ2V0KCJkZWZhdWx0Iikgbm90IGluIChOb25lLCAidW5rbm93biIpOgogICAgICAgICAgICAgICAgaFsia2VybmVsX25leHRfYm9vdCJdLCBoWyJrZXJuZWxfbmV4dF9ib290X3NvdXJjZSJdID0ga3ZbImRlZmF1bHQiXSwgImdydWIuY2ZnIGRlZmF1bHQiCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAgIyBuZXZlciBjb3N0IHRoZSBTeXN0ZW0gcGFnZSBpdHMgb3RoZXIgZmFjdHMKICAgICAgICAgICAgaFsia2VybmVsX2xhbmUiXSA9IHsiZXJyb3IiOiBzdHIoZSlbOjIwMF19CiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYuci5ob3N0KFsiYXB0LW1hcmsiLCAic2hvd2hvbGQiXSwgNjApCiAgICAgICAgaFsiaGVsZCJdID0gc29ydGVkKG91dC5zcGxpdCgpKSBpZiByYyA9PSAwIGVsc2UgTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgdCA9IGludChzZWxmLnIucmVhZF9maWxlKCIvcHJvYy9zeXMva2VybmVsL3RhaW50ZWQiKS5zdHJpcCgpKQogICAgICAgICAgICBoWyJ0YWludGVkIl0sIGhbIm9vcHNfdGhpc19ib290Il0sIGhbIndhcm5fdGhpc19ib290Il0gPSB0LCBib29sKHQgJiAxMjgpLCBib29sKHQgJiA1MTIpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgaFsidGFpbnRlZCJdLCBoWyJvb3BzX3RoaXNfYm9vdCJdLCBoWyJ3YXJuX3RoaXNfYm9vdCJdID0gTm9uZSwgTm9uZSwgTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgaFsia2VybmVsX3BhbmljIl0gPSBpbnQoc2VsZi5yLnJlYWRfZmlsZSgiL3Byb2Mvc3lzL2tlcm5lbC9wYW5pYyIpLnN0cmlwKCkpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgaFsia2VybmVsX3BhbmljIl0gPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBoWyJjcmFzaF9ndWFyZCJdID0ganNvbi5sb2FkcyhzZWxmLnIucmVhZF9maWxlKENSQVNIX0dVQVJEX1NUQVRFKSkKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICBoWyJjcmFzaF9ndWFyZCJdID0gTm9uZQogICAgICAgIGcgPSB7ImRlYmlhbiI6ICJ1bmtub3duIiwgImRvY2tlcl9lbmdpbmUiOiAidW5rbm93biIsICJjb250YWluZXJkIjogInVua25vd24iLCAibGl2ZV9yZXN0b3JlIjogInVua25vd24ifQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jaGVja19ndWVzdChzZWxmLnZtaWQpCiAgICAgICAgICAgIHJ1bm5pbmcgPSBUcnVlCiAgICAgICAgZXhjZXB0IFJlZnVzZWQgYXMgZToKICAgICAgICAgICAgcnVubmluZywgZ1sidW5rbm93bl9yZWFzb24iXSA9IEZhbHNlLCBmIntlLmNvZGV9IHtlLnJlYXNvbn0iCiAgICAgICAgaWYgcnVubmluZzoKICAgICAgICAgICAgc2NyaXB0ID0gKCdlY2hvICJkZWJpYW49JChjYXQgL2V0Yy9kZWJpYW5fdmVyc2lvbiAyPi9kZXYvbnVsbCkiOyAnCiAgICAgICAgICAgICAgICAgICAgICAnZWNobyAiZW5naW5lPSQoZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgXCd7ey5TZXJ2ZXIuVmVyc2lvbn19XCcgMj4vZGV2L251bGwpIjsgJwogICAgICAgICAgICAgICAgICAgICAgJ2VjaG8gImNvbnRhaW5lcmQ9JChkcGtnLXF1ZXJ5IC1XIC1mIFwnJHtWZXJzaW9ufVwnIGNvbnRhaW5lcmQuaW8gMj4vZGV2L251bGwpIjsgJwogICAgICAgICAgICAgICAgICAgICAgJ2VjaG8gImxpdmU9JChkb2NrZXIgaW5mbyAtLWZvcm1hdCBcJ3t7LkxpdmVSZXN0b3JlRW5hYmxlZH19XCcgMj4vZGV2L251bGwpIicpCiAgICAgICAgICAgIHJjLCBvdXQsIF8gPSBzZWxmLmcoWyJzaCIsICItYyIsIHNjcmlwdF0sIHRpbWVvdXQ9NjApCiAgICAgICAgICAgIGt2ID0gZGljdChsLnNwbGl0KCI9IiwgMSkgZm9yIGwgaW4gb3V0LnNwbGl0bGluZXMoKSBpZiAiPSIgaW4gbCkKICAgICAgICAgICAgZm9yIGssIHNyYyBpbiAoKCJkZWJpYW4iLCAiZGViaWFuIiksICgiZG9ja2VyX2VuZ2luZSIsICJlbmdpbmUiKSwgKCJjb250YWluZXJkIiwgImNvbnRhaW5lcmQiKSk6CiAgICAgICAgICAgICAgICBnW2tdID0ga3YuZ2V0KHNyYywgIiIpLnN0cmlwKCkgb3IgInVua25vd24iCiAgICAgICAgICAgIGdbImxpdmVfcmVzdG9yZSJdID0geyJ0cnVlIjogIm9uIiwgImZhbHNlIjogIm9mZiJ9LmdldChrdi5nZXQoImxpdmUiLCAiIikuc3RyaXAoKSwgInVua25vd24iKQogICAgICAgIHRyeToKICAgICAgICAgICAgaFsiY29uZmlnX2J1bmRsZSJdID0gQnVuZGxlKHNlbGYpLnN0YXRlKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIGEgcmVhZCBwcm9ibGVtIG11c3QgbmV2ZXIgY29zdCB0aGUgU3lzdGVtIHBhZ2UgaXRzIG90aGVyIGZhY3RzCiAgICAgICAgICAgIGhbImNvbmZpZ19idW5kbGUiXSA9IHsidmVyc2lvbiI6ICJ1bmtub3duIiwgImVycm9yIjogc3RyKGUpWzoyMDBdfQogICAgICAgIHNlbGYucmVwb3J0WyJmYWN0cyJdID0geyJob3N0IjogaCwgImd1ZXN0IjogZ30KICAgICAgICByZXR1cm4gMAoKICAgIGRlZiBjaGVja19ndWVzdChzZWxmLCB2bWlkKToKICAgICAgICBpZiB2bWlkIGluIFJFU0VSVkVEX1ZNSURTOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTAiLCBmInZtaWQge3ZtaWR9IGlzIGEgcmVzZXJ2ZWQgc2NyYXRjaCB2bWlkIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbmYgPSBzZWxmLnIucmVhZF9maWxlKGYiL2V0Yy9wdmUvbHhjL3t2bWlkfS5jb25mIikKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjEwIiwgZiJ2bWlkIHt2bWlkfSBpcyBub3QgYSBjb250YWluZXIgb24gdGhpcyBob3N0IikKICAgICAgICBjdXIgPSBjb25mLnNwbGl0KCJcblsiLCAxKVswXSAgIyB0aGUgY3VycmVudCBjb25maWcsIG5vdCBhIHNuYXBzaG90IHNlY3Rpb24KICAgICAgICBiaW5kcyA9IFtsIGZvciBsIGluIGN1ci5zcGxpdGxpbmVzKCkgaWYgcmUubWF0Y2gociJebXBbMC05XSs6ICIgKyByZS5lc2NhcGUoRFJJVkVTX1BBUkVOVCkgKyByIiwiLCBsKV0KICAgICAgICBpZiBub3QgYmluZHM6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMCIsIGYidm1pZCB7dm1pZH0gZG9lcyBub3QgYmluZCB7RFJJVkVTX1BBUkVOVH0g4oCUIGl0IGlzIG5vdCB0aGlzIGJveCdzIGN1c3RvbWVyIGd1ZXN0IikKICAgICAgICBsb2NrID0gW2wgZm9yIGwgaW4gY3VyLnNwbGl0bGluZXMoKSBpZiBsLnN0YXJ0c3dpdGgoImxvY2s6IildCiAgICAgICAgaWYgbG9jazoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjkiLCBmInZtaWQge3ZtaWR9IGlzIGxvY2tlZCAoe2xvY2tbMF0uc3BsaXQoJzonLCAxKVsxXS5zdHJpcCgpfSkg4oCUIGEgYmFja3VwIG9yIHJlc3RvcmUgaXMgcnVubmluZyIpCiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYuci5ob3N0KFsiL3Vzci9zYmluL3BjdCIsICJzdGF0dXMiLCBzdHIodm1pZCldKQogICAgICAgIGlmIHJjICE9IDAgb3IgInJ1bm5pbmciIG5vdCBpbiBvdXQ6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMCIsIGYidm1pZCB7dm1pZH0gaXMgbm90IHJ1bm5pbmciKQoKICAgICMgLS0tLS0tLS0tLSB0YXJnZXQgaGVscGVycyAtLS0tLS0tLS0tCiAgICBkZWYgeChzZWxmLCBhcmd2LCB0aW1lb3V0PTE4MDApOgogICAgICAgICIiIlJ1biBpbiB0aGUgVEFSR0VUIGxheWVyOiB0aGUgZ3Vlc3QgdmlhIHBjdCBleGVjLCBvciB0aGUgaG9zdCBkaXJlY3RseSAoaG9zdCwgcHZlIGFuZCBrZXJuZWwpLiIiIgogICAgICAgIGlmIHNlbGYubGF5ZXIgaW4gKCJob3N0IiwgInB2ZSIsICJrZXJuZWwiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuci5ob3N0KGFyZ3YsIHRpbWVvdXQpCiAgICAgICAgcmV0dXJuIHNlbGYuci5ndWVzdChzZWxmLnZtaWQsIGFyZ3YsIHRpbWVvdXQpICAjIGd1ZXN0IGFuZCBkb2NrZXIgYm90aCBsaXZlIGluIHRoZSBjdXN0b21lciBndWVzdAoKICAgIGRlZiBnKHNlbGYsIGFyZ3YsIHRpbWVvdXQ9MTgwMCk6CiAgICAgICAgIiIiUnVuIGluIHRoZSBjdXN0b21lciBHVUVTVCB3aGF0ZXZlciB0aGUgbGF5ZXIgKGl0cyBoZWFsdGgpLiIiIgogICAgICAgIHJldHVybiBzZWxmLnIuZ3Vlc3Qoc2VsZi52bWlkLCBhcmd2LCB0aW1lb3V0KQoKICAgIGRlZiBkcGtnX2NtcChzZWxmLCBhLCBvcCwgYik6CiAgICAgICAgIyBUaGUgSE9TVCdzIGRwa2c6IHRoZSBzYW1lIERlYmlhbiB2ZXJzaW9uIGFsZ29yaXRobSwgYW5kIG5vIGBwY3QgZXhlY2AgKDAuOSBzKSBwZXIgY29tcGFyaXNvbiAoUi04NDUpLgogICAgICAgIHJjLCBfLCBfID0gc2VsZi5yLmhvc3QoWyJkcGtnIiwgIi0tY29tcGFyZS12ZXJzaW9ucyIsIGEsIG9wLCBiXSwgMzApCiAgICAgICAgcmV0dXJuIHJjID09IDAKCiAgICBkZWYgaW5zdGFsbGVkKHNlbGYpOgogICAgICAgIHJjLCBvdXQsIF8gPSBzZWxmLngoWyJkcGtnLXF1ZXJ5IiwgIi1XIiwgIi1mIiwgIiR7UGFja2FnZX1cdCR7VmVyc2lvbn1cdCR7ZGI6U3RhdHVzLUFiYnJldn1cbiJdKQogICAgICAgIHJlcyA9IHt9CiAgICAgICAgZm9yIGwgaW4gb3V0LnNwbGl0bGluZXMoKToKICAgICAgICAgICAgcGFydHMgPSBsLnNwbGl0KCJcdCIpCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMyBhbmQgcGFydHNbMl0uc3RhcnRzd2l0aCgiaWkiKToKICAgICAgICAgICAgICAgIHJlc1twYXJ0c1swXV0gPSBwYXJ0c1sxXQogICAgICAgIHJldHVybiByZXMKCiAgICBkZWYgbWFkaXNvbl9hbGwoc2VsZiwgbmFtZXMpOgogICAgICAgICIiIm5hbWUgLT4gc2V0IG9mIGRvd25sb2FkYWJsZSB2ZXJzaW9ucywgT05FIGNhbGwgZm9yIGFsbCBuYW1lcy4iIiIKICAgICAgICByZXMgPSB7bjogc2V0KCkgZm9yIG4gaW4gbmFtZXN9CiAgICAgICAgaWYgbm90IG5hbWVzOgogICAgICAgICAgICByZXR1cm4gcmVzCiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYueChbImFwdC1jYWNoZSIsICJtYWRpc29uIl0gKyBzb3J0ZWQobmFtZXMpKQogICAgICAgIGZvciBsIGluIG91dC5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIGYgPSBbeC5zdHJpcCgpIGZvciB4IGluIGwuc3BsaXQoInwiKV0KICAgICAgICAgICAgaWYgbGVuKGYpID49IDMgYW5kIGZbMF0gaW4gcmVzOgogICAgICAgICAgICAgICAgcmVzW2ZbMF1dLmFkZChmWzFdKQogICAgICAgIHJldHVybiByZXMKCiAgICBkZWYgc2ltdWxhdGUoc2VsZiwgYXJncyk6CiAgICAgICAgcmMsIG91dCwgZXJyID0gc2VsZi54KEFQVF9FTlYgKyBbImFwdC1nZXQiLCAiLXMiLCAiLXEiXSArIGFyZ3MpCiAgICAgICAgaW5zdCwgcmVtdiA9IFtdLCBbXQogICAgICAgIGZvciBsIGluIG91dC5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIG0gPSByZS5tYXRjaChyIl5JbnN0IChcUyspICg/OlxbKFteXV0qKVxdICk/XCgoXFMrKSAoLio/KSBcW1thLXowLTldK1xdXCkiLCBsKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgaW5zdC5hcHBlbmQoeyJuYW1lIjogbS5ncm91cCgxKSwgImZyb20iOiBtLmdyb3VwKDIpLCAidG8iOiBtLmdyb3VwKDMpLCAib3JpZ2luIjogbS5ncm91cCg0KX0pCiAgICAgICAgICAgIG0gPSByZS5tYXRjaChyIl5SZW12IChcUyspIiwgbCkKICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgIHJlbXYuYXBwZW5kKG0uZ3JvdXAoMSkpCiAgICAgICAgcmV0dXJuIHJjLCBpbnN0LCByZW12LCBvdXQgKyBlcnIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgb3JpZ2luX25hbWUob3JpZ2luKToKICAgICAgICAjICJEZWJpYW46MTMuNy9zdGFibGUsIERlYmlhbi1TZWN1cml0eToxMy9zdGFibGUtc2VjdXJpdHkiIC0+IHsiRGViaWFuIiwgIkRlYmlhbi1TZWN1cml0eSJ9CiAgICAgICAgcmV0dXJuIHtvLnN0cmlwKCkuc3BsaXQoIjoiKVswXSBmb3IgbyBpbiBvcmlnaW4uc3BsaXQoIiwiKSBpZiBvLnN0cmlwKCl9CgogICAgZGVmIGZyZWVfYnl0ZXMoc2VsZik6CiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYueChbImRmIiwgIi1CMSIsICItLW91dHB1dD1hdmFpbCIsICIvIl0pCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gaW50KG91dC5zdHJpcCgpLnNwbGl0bGluZXMoKVstMV0pCiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbmRleEVycm9yKToKICAgICAgICAgICAgcmV0dXJuIC0xCgogICAgZGVmIGFwdF9sb2NrX2hlbGQoc2VsZik6CiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYueChbImZ1c2VyIiwgIi92YXIvbGliL2Rwa2cvbG9jay1mcm9udGVuZCIsICIvdmFyL2xpYi9kcGtnL2xvY2siXSkKICAgICAgICByZXR1cm4gcmMgPT0gMCBhbmQgb3V0LnN0cmlwKCkgIT0gIiIKCiAgICBkZWYgZ3Vlc3RfaGVhbHRoKHNlbGYpOgogICAgICAgICIiIlRoZSBndWVzdCdzIHNpZ25hbHM6IGV2ZXJ5IGNvbnRhaW5lcidzIHN0YXRlICsgaGVhbHRoLCB0aGUgY29udHJvbGxlcidzIG93biBoZWFsdGgsIHRoZSBuZXR3b3JrLiIiIgogICAgICAgIHJjLCBvdXQsIF8gPSBzZWxmLmcoWyJkb2NrZXIiLCAicHMiLCAiLWEiLCAiLS1uby10cnVuYyIsICItLWZvcm1hdCIsICJ7ey5OYW1lc319XHR7ey5TdGF0ZX19XHR7ey5TdGF0dXN9fVx0e3suSUR9fSJdLCB0aW1lb3V0PTYwKQogICAgICAgIGNvbnQgPSB7fQogICAgICAgIGZvciBsIGluIG91dC5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIHAgPSBsLnNwbGl0KCJcdCIpCiAgICAgICAgICAgIGlmIGxlbihwKSA+PSAzOgogICAgICAgICAgICAgICAgaCA9ICJoZWFsdGh5IiBpZiAiKGhlYWx0aHkpIiBpbiBwWzJdIGVsc2UgInVuaGVhbHRoeSIgaWYgIih1bmhlYWx0aHkpIiBpbiBwWzJdIGVsc2UgXAogICAgICAgICAgICAgICAgICAgICJzdGFydGluZyIgaWYgIihoZWFsdGg6IHN0YXJ0aW5nKSIgaW4gcFsyXSBlbHNlICJub25lIgogICAgICAgICAgICAgICAgY29udFtwWzBdXSA9IHsic3RhdGUiOiBwWzFdLCAiaGVhbHRoIjogaH0KICAgICAgICAgICAgICAgIGlmIGxlbihwKSA+PSA0IGFuZCBwWzNdOgogICAgICAgICAgICAgICAgICAgIGNvbnRbcFswXV1bImlkIl0gPSBwWzNdCiAgICAgICAgbnJjLCBfLCBfID0gc2VsZi5nKFsiZ2V0ZW50IiwgImhvc3RzIiwgImRlYi5kZWJpYW4ub3JnIl0sIHRpbWVvdXQ9MzApCiAgICAgICAgIyBSLTg1ODogdGhlIGNvbnRyb2xsZXIncyBvd24gaGVhbHRoIGNoZWNrIHN0YXllZCAiaGVhbHRoeSIgd2hpbGUgaXQgY291bGQgbm90IHJlYWNoIERvY2tlciBhdCBhbGwg4oCUIHNvIGFzawogICAgICAgICMgdGhlIGNvbnNlcXVlbmNlIGRpcmVjdGx5OiBjYW4gdGhlIGNvbnRyb2xsZXIgdGFsayB0byB0aGUgZW5naW5lIGZyb20gaW5zaWRlIGl0cyBjb250YWluZXI/CiAgICAgICAgY3JjLCBfLCBfID0gc2VsZi5nKFsiZG9ja2VyIiwgImV4ZWMiLCAiZmVsaG9tLWNvbnRyb2xsZXIiLCAiZG9ja2VyIiwgInZlcnNpb24iLCAiLS1mb3JtYXQiLCAie3suU2VydmVyLlZlcnNpb259fSJdLCB0aW1lb3V0PTYwKQogICAgICAgIHJldHVybiB7ImRvY2tlcl9vayI6IHJjID09IDAsICJjb250YWluZXJzIjogY29udCwgImNvbnRyb2xsZXJfZG9ja2VyX29rIjogY3JjID09IDAsCiAgICAgICAgICAgICAgICAiY29udHJvbGxlciI6IGNvbnQuZ2V0KCJmZWxob20tY29udHJvbGxlciIsIHt9KS5nZXQoImhlYWx0aCIsICJhYnNlbnQiKSwKICAgICAgICAgICAgICAgICJuZXR3b3JrX29rIjogbnJjID09IDB9CgogICAgZGVmIGhlYWx0aChzZWxmKToKICAgICAgICBpZiBzZWxmLmxheWVyIGluICgiZ3Vlc3QiLCAiZG9ja2VyIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmd1ZXN0X2hlYWx0aCgpCiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYuci5ob3N0KFsic3lzdGVtY3RsIiwgImlzLWFjdGl2ZSJdICsgSE9TVF9TRVJWSUNFUywgMzApCiAgICAgICAgc3RhdGVzID0gb3V0LnNwbGl0KCkKICAgICAgICBzdmMgPSB7czogKHN0YXRlc1tpXSBpZiBpIDwgbGVuKHN0YXRlcykgZWxzZSAidW5rbm93biIpIGZvciBpLCBzIGluIGVudW1lcmF0ZShIT1NUX1NFUlZJQ0VTKX0KICAgICAgICBzcmMsIHNvdXQsIF8gPSBzZWxmLnIuaG9zdChbIi91c3Ivc2Jpbi9wY3QiLCAic3RhdHVzIiwgc3RyKHNlbGYudm1pZCldLCAzMCkKICAgICAgICBydW5uaW5nID0gc3JjID09IDAgYW5kICJydW5uaW5nIiBpbiBzb3V0CiAgICAgICAgcmV0dXJuIHsiaG9zdF9zZXJ2aWNlcyI6IHN2YywgImd1ZXN0X3J1bm5pbmciOiBydW5uaW5nLCAiZ3Vlc3QiOiBzZWxmLmd1ZXN0X2hlYWx0aCgpIGlmIHJ1bm5pbmcgZWxzZSBOb25lfQoKICAgIGRlZiByZXN0YXJ0X25lZWRlZChzZWxmKToKICAgICAgICAiIiJQcm9jZXNzZXMgc3RpbGwgbWFwcGluZyBkZWxldGVkIGZpbGVzLCBPVVRTSURFIGNvbnRhaW5lcnMgKEMxMSkuIEd1ZXN0OiBvdXRzaWRlIGRvY2tlcjsgaG9zdDogb3V0c2lkZSB0aGUKICAgICAgICBMWEMgZ3Vlc3RzICh0aGUgaG9zdCdzIC9wcm9jIHNob3dzIGd1ZXN0IHByb2Nlc3NlcyB0b28pLiIiIgogICAgICAgIHNraXAgPSBSRVNUQVJUX1NLSVBfQ0dST1VQWyJob3N0IiBpZiBzZWxmLmxheWVyIGluICgiaG9zdCIsICJwdmUiLCAia2VybmVsIikgZWxzZSAiZ3Vlc3QiXQogICAgICAgIHNjcmlwdCA9ICgnZm9yIHAgaW4gL3Byb2MvWzAtOV0qOyBkbyBncmVwIC1xICIoZGVsZXRlZCkiICRwL21hcHMgMj4vZGV2L251bGwgfHwgY29udGludWU7ICcKICAgICAgICAgICAgICAgICAgJ2dyZXAgLXEgIiVzIiAkcC9jZ3JvdXAgMj4vZGV2L251bGwgJiYgY29udGludWU7IGVjaG8gIiR7cCMvcHJvYy99ICQoY2F0ICRwL2NvbW0gMj4vZGV2L251bGwpIjsgZG9uZScgJSBza2lwKQogICAgICAgIHJjLCBvdXQsIF8gPSBzZWxmLngoWyJzaCIsICItYyIsIHNjcmlwdF0sIHRpbWVvdXQ9MTIwKQogICAgICAgIGxpbmVzID0gW2wgZm9yIGwgaW4gb3V0LnNwbGl0bGluZXMoKSBpZiAiICIgaW4gbF0KICAgICAgICBwcm9jcyA9IHNvcnRlZCh7bC5zcGxpdCgiICIsIDEpWzFdIGZvciBsIGluIGxpbmVzfSkKICAgICAgICBwaWQxID0gYW55KGwuc3BsaXQoIiAiLCAxKVswXSA9PSAiMSIgZm9yIGwgaW4gbGluZXMpCiAgICAgICAgcmV0dXJuIHByb2NzLCBwaWQxIG9yICJseGMtc3RhcnQiIGluIHByb2NzCgogICAgZGVmIGludmVudG9yeShzZWxmLCBpbnN0PU5vbmUpOgogICAgICAgIGluc3QgPSBpbnN0IGlmIGluc3QgaXMgbm90IE5vbmUgZWxzZSBzZWxmLmluc3RhbGxlZCgpCiAgICAgICAgbmFtZXMgPSBzb3J0ZWQoaW5zdCkKICAgICAgICBvcmlnaW5zID0ge30KICAgICAgICBpZiBuYW1lczoKICAgICAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYueChbImFwdC1jYWNoZSIsICJwb2xpY3kiXSArIG5hbWVzKSAgIyBPTkUgY2FsbCAoUi04NDUpCiAgICAgICAgICAgIGN1ciwgc3RhciA9IE5vbmUsIEZhbHNlCiAgICAgICAgICAgIGZvciBsIGluIG91dC5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgICAgICBpZiBub3QgbC5zdGFydHN3aXRoKCIgIik6CiAgICAgICAgICAgICAgICAgICAgY3VyLCBzdGFyID0gbC5yc3RyaXAoIjoiKSwgRmFsc2UKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcyA9IGwuc3RyaXAoKQogICAgICAgICAgICAgICAgaWYgcy5zdGFydHN3aXRoKCIqKiogIik6CiAgICAgICAgICAgICAgICAgICAgc3RhciA9IFRydWUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgc3RhciBhbmQgY3VyIGFuZCByZS5tYXRjaChyIl5bMC05LV0rICIsIHMpOgogICAgICAgICAgICAgICAgICAgIGlmICIvdmFyL2xpYi9kcGtnL3N0YXR1cyIgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2lucy5zZXRkZWZhdWx0KGN1ciwgImxvY2FsIikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5zW2N1cl0gPSBzCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHN0YXIgYW5kIG5vdCByZS5tYXRjaChyIl5bMC05LV0rICIsIHMpOgogICAgICAgICAgICAgICAgICAgIHN0YXIgPSBGYWxzZQoKICAgICAgICBkZWYgb25hbWUoc3JjKToKICAgICAgICAgICAgaWYgc3JjIGluIChOb25lLCAibG9jYWwiKToKICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biIKICAgICAgICAgICAgaWYgInByb3htb3giIGluIHNyYzoKICAgICAgICAgICAgICAgIHJldHVybiAiUHJveG1veCIKICAgICAgICAgICAgaWYgInNlY3VyaXR5IiBpbiBzcmMgYW5kICJkZWJpYW4iIGluIHNyYzoKICAgICAgICAgICAgICAgIHJldHVybiAiRGViaWFuLVNlY3VyaXR5IgogICAgICAgICAgICBpZiAiZG9ja2VyLmNvbSIgaW4gc3JjOgogICAgICAgICAgICAgICAgcmV0dXJuICJEb2NrZXIiCiAgICAgICAgICAgIGlmICJkZWJpYW4iIGluIHNyYzoKICAgICAgICAgICAgICAgIHJldHVybiAiRGViaWFuIgogICAgICAgICAgICByZXR1cm4gIm90aGVyIgogICAgICAgIHJjLCBwZW5kLCByZW12LCBfID0gc2VsZi5zaW11bGF0ZShbImRpc3QtdXBncmFkZSJdKQogICAgICAgIHNlbGYuX3BlbmRpbmcgPSBwZW5kCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgImluc3RhbGxlZCI6IFt7Im5hbWUiOiBuLCAidmVyc2lvbiI6IGluc3Rbbl0sICJvcmlnaW4iOiBvbmFtZShvcmlnaW5zLmdldChuKSl9IGZvciBuIGluIG5hbWVzXSwKICAgICAgICAgICAgInBlbmRpbmciOiBbeyJuYW1lIjogcFsibmFtZSJdLCAiZnJvbSI6IHBbImZyb20iXSwgInRvIjogcFsidG8iXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJvcmlnaW4iOiBzb3J0ZWQoc2VsZi5vcmlnaW5fbmFtZShwWyJvcmlnaW4iXSkpfSBmb3IgcCBpbiBwZW5kXSwKICAgICAgICB9CgogICAgIyAtLS0tLS0tLS0tIHRoZSBydW4gLS0tLS0tLS0tLQogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBwbGFuID0gc2VsZi5sb2FkX3BsYW4oKQogICAgICAgIHNlbGYubW9kZSwgc2VsZi5sYXllciwgc2VsZi52bWlkLCBzZWxmLnNlbGVjdCA9IHNlbGYuY2hlY2tfcGxhbihwbGFuKQogICAgICAgIHNlbGYucmVwb3J0LnVwZGF0ZShtb2RlPXNlbGYubW9kZSwgbGF5ZXI9c2VsZi5sYXllciwgcmVsZWFzZV9pZD1wbGFuLmdldCgicmVsZWFzZV9pZCIpLCB2bWlkPXNlbGYudm1pZCkKICAgICAgICAjIFItODY4ICh2MC4xNDQuMCk6IHRoZSBhZ2VudCdzIHJ1biBpZCwgdHJpZ2dlciBhbmQgcmluZyB0cmF2ZWwgaW4gdGhlIHJlcG9ydCwgc28gYSByZXBvcnQgdGhlIGFnZW50IG5ldmVyCiAgICAgICAgIyByZWNlaXZlZCAoaXQgd2FzIGtpbGxlZCBtaWQtcGFzcykgY2FuIGJlIHNlbnQgbGF0ZXIgZnJvbSB0aGUgc2F2ZWQgY29weS4gUGxhaW4gaWRzIG9ubHk7IGFueXRoaW5nIGVsc2UKICAgICAgICAjIGlzIGRyb3BwZWQsIG5ldmVyIHJlZnVzZWQgKHRoZSBwbGFuJ3Mgb3RoZXIgY2hlY2tzIGRlY2lkZSkuCiAgICAgICAgcmlkLCB0cmlnLCByaW5nID0gcGxhbi5nZXQoInJ1bl9pZCIpLCBwbGFuLmdldCgidHJpZ2dlciIpLCBwbGFuLmdldCgicmluZyIpCiAgICAgICAgaWYgaXNpbnN0YW5jZShyaWQsIHN0cikgYW5kIHJlLm1hdGNoKHIiXltBLVphLXowLTkuXy1dezEsODB9JCIsIHJpZCk6CiAgICAgICAgICAgIHNlbGYucmVwb3J0WyJydW5faWQiXSA9IHJpZAogICAgICAgIGlmIGlzaW5zdGFuY2UodHJpZywgc3RyKSBhbmQgcmUubWF0Y2gociJeW2EtejAtOV8tXXsxLDIwfSQiLCB0cmlnKToKICAgICAgICAgICAgc2VsZi5yZXBvcnRbInRyaWdnZXIiXSA9IHRyaWcKICAgICAgICBpZiByaW5nIGluICgwLCAxKSBhbmQgbm90IGlzaW5zdGFuY2UocmluZywgYm9vbCk6CiAgICAgICAgICAgIHNlbGYucmVwb3J0WyJyaW5nIl0gPSByaW5nCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJmYWN0cyI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZhY3RzKCkKICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImJ1bmRsZSI6CiAgICAgICAgICAgIHJldHVybiBCdW5kbGUoc2VsZikuZnJvbV9wbGFuKHBsYW4pCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJhZ2VudF91cGRhdGUiOgogICAgICAgICAgICByZXR1cm4gc2VsZi5hZ2VudF91cGRhdGUocGxhbikKICAgICAgICBpZiBzZWxmLmxheWVyIGluICgiaG9zdCIsICJwdmUiLCAia2VybmVsIik6CiAgICAgICAgICAgIHNlbGYuY2hlY2tfYXBwbGlhbmNlKCkKICAgICAgICBpZiBzZWxmLmxheWVyID09ICJrZXJuZWwiIGFuZCBzZWxmLm1vZGUgIT0gImhlYWx0aCI6CiAgICAgICAgICAgICMgdGhlIGtlcm5lbCBsYW5lJ3Mgb3duIG1vZGVzIChSLTgzNik6IG1vc3Qgb2YgdGhlbSBydW4gd2hpbGUgdGhlIGd1ZXN0IGlzIHN0aWxsIHN0YXJ0aW5nIGFmdGVyIGEgYm9vdCwgc28KICAgICAgICAgICAgIyB0aGUgZ3Vlc3QgY2hlY2sgaXMgdGhlIHN0YWdlJ3MgYW5kIHRoZSByZWJvb3QncyBvd24gKEtlcm5lbC5ydW4pLCBub3QgZXZlcnkgbW9kZSdzCiAgICAgICAgICAgIHJldHVybiBLZXJuZWwoc2VsZiwgcGxhbikucnVuKCkKICAgICAgICBzZWxmLmNoZWNrX2d1ZXN0KHNlbGYudm1pZCkKICAgICAgICBsb2cgPSBzZWxmLnIubG9nCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJsaXZlLXJlc3RvcmUtb24iOgogICAgICAgICAgICByZXR1cm4gc2VsZi5saXZlX3Jlc3RvcmVfb24oKQogICAgICAgIGlmIHNlbGYubW9kZSA9PSAib29tLWNoZWNrIjoKICAgICAgICAgICAgIyBSLTUyODogdGhlIGNoZWNrIGFsb25lIOKAlCBubyBhcHQsIG5vIGVuZ2luZSBjaGFuZ2U7IGNoZWNrX2d1ZXN0IGFib3ZlIHN0aWxsIGFwcGxpZXMuCiAgICAgICAgICAgIHNlbGYucmVwb3J0WyJvb21fY2hlY2siXSA9IHNlbGYub29tX2NoZWNrKCkKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBzZWxmLndobywgc2VsZi5hbGxvd19kb3duZ3JhZGUgPSAoImZhc3QiLCBGYWxzZSkKICAgICAgICBpZiBzZWxmLmxheWVyID09ICJwdmUiIGFuZCBzZWxmLm1vZGUgPT0gImFwcGx5IjoKICAgICAgICAgICAgc2VsZi53aG8sIHNlbGYuYWxsb3dfZG93bmdyYWRlID0gc2VsZi5kb2NrZXJfYXV0aG9yaXR5KHBsYW4sIG9wX25hbWU9UFZFX1NJR05FRF9PUCkKICAgICAgICAgICAgc2VsZi5yZXBvcnRbImF1dGhvcml0eSJdID0gc2VsZi53aG8KICAgICAgICBpZiBzZWxmLmxheWVyID09ICJkb2NrZXIiIGFuZCBzZWxmLm1vZGUgPT0gImFwcGx5IjoKICAgICAgICAgICAgc2VsZi53aG8sIHNlbGYuYWxsb3dfZG93bmdyYWRlID0gc2VsZi5kb2NrZXJfYXV0aG9yaXR5KHBsYW4pCiAgICAgICAgICAgIGlmIHNlbGYubGl2ZV9yZXN0b3JlKCkgIT0gInRydWUiOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE1IiwgImxpdmUtcmVzdG9yZSBpcyBub3QgT04gaW4gdGhlIGd1ZXN0IOKAlCBhIERvY2tlciBzdGVwIHdvdWxkIHJlc3RhcnQgZXZlcnkgY29udGFpbmVyIikKICAgICAgICAgICAgc2VsZi5yZXBvcnRbImF1dGhvcml0eSJdID0gc2VsZi53aG8KICAgICAgICAgICAgc2VsZi5yZXBvcnRbInVuZG8iXSA9IHNlbGYuYWxsb3dfZG93bmdyYWRlCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJoZWFsdGgiOgogICAgICAgICAgICBzZWxmLnJlcG9ydFsiaGVhbHRoIl0gPSBzZWxmLmhlYWx0aCgpCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgbG9nKGYib3MtYXBwbHk6IFNUQVJUIHJlbGVhc2U9e3BsYW4uZ2V0KCdyZWxlYXNlX2lkJyl9IGxheWVyPXtzZWxmLmxheWVyfSIgKwogICAgICAgICAgICAoZiI6e3NlbGYudm1pZH0iIGlmIHNlbGYubGF5ZXIgIT0gImhvc3QiIGVsc2UgIiIpICsKICAgICAgICAgICAgZiIgbGFuZT17cGxhbi5nZXQoJ2xhbmUnLCAnZmFzdCcpfSBtb2RlPXtzZWxmLm1vZGV9IHNlbGVjdD17c2VsZi5zZWxlY3R9IHBhY2thZ2VzPXtsZW4ocGxhbi5nZXQoJ3BhY2thZ2VzJywgW10pKX0iICsKICAgICAgICAgICAgKGYiIGF1dGhvcml0eT17c2VsZi53aG99eycgVU5ETycgaWYgc2VsZi5hbGxvd19kb3duZ3JhZGUgZWxzZSAnJ30iIGlmIHNlbGYubGF5ZXIgaW4gKCJkb2NrZXIiLCAicHZlIikgZWxzZSAiIikpCiAgICAgICAgaWYgc2VsZi5hcHRfbG9ja19oZWxkKCk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI5IiwgZiJhbm90aGVyIGFwdC9kcGtnIGhvbGRzIHRoZSBsb2NrIG9uIHRoZSB7c2VsZi5sYXllcn0iKQogICAgICAgIHNlbGYucmVwb3J0WyJoZWFsdGhfYmVmb3JlIl0gPSBzZWxmLmhlYWx0aCgpCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJhcHBseSI6CiAgICAgICAgICAgIHNlbGYucmVwYWlyKCkKICAgICAgICByYywgb3V0LCBlcnIgPSBzZWxmLngoQVBUX0VOViArIFsiYXB0LWdldCIsICItcSIsICJ1cGRhdGUiXSwgdGltZW91dD02MDApCiAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjciLCBmImFwdC1nZXQgdXBkYXRlIGZhaWxlZCBvbiB0aGUge3NlbGYubGF5ZXJ9OiB7KG91dCArIGVycikuc3RyaXAoKS5zcGxpdGxpbmVzKClbLTE6XX0iKQogICAgICAgIGluc3RhbGxlZF9hZnRlciA9IE5vbmUKICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImFwcGx5IjoKICAgICAgICAgICAgcmMsIGluc3RhbGxlZF9hZnRlciA9IHNlbGYuYXBwbHkocGxhbikKICAgICAgICAgICAgaWYgcmM6CiAgICAgICAgICAgICAgICByZXR1cm4gcmMKICAgICAgICBzZWxmLnJlcG9ydC51cGRhdGUoc2VsZi5pbnZlbnRvcnkoaW5zdGFsbGVkX2FmdGVyKSkKICAgICAgICBpZiAicmVib290X25lZWRlZCIgbm90IGluIHNlbGYucmVwb3J0OgogICAgICAgICAgICAjIEVWRVJZIGxheWVyIGlzIHNjYW5uZWQgb24gRVZFUlkgcGFzczogYSByZWJvb3QgKGhvc3QpIG9yIGEgcmVzdGFydCAoZ3Vlc3QpIG11c3QgQ0xFQVIgInJlc3RhcnQgbmVlZGVkIiwKICAgICAgICAgICAgIyBvciB0aGUgZmxlZXQgdmlldyBrZWVwcyBhIHN0YWxlIGRhdGUgKFItODQ5LCB2MC4xNDIuMDsgdGhlIGhvc3Qgc2luY2UgdjAuMTQxLjEpLiBPbmUgcGN0IGV4ZWMsIH4xIHMuCiAgICAgICAgICAgICMgUGlubmVkIGJ5IHRlc3RfZXZlcnlfbGF5ZXJfc2NhbnNfZXZlcnlfcGFzcy4KICAgICAgICAgICAgc2VsZi5yZXBvcnRbInJlc3RhcnRfbmVlZGVkIl0sIHNlbGYucmVwb3J0WyJyZWJvb3RfbmVlZGVkIl0gPSBzZWxmLnJlc3RhcnRfbmVlZGVkKCkKICAgICAgICAgICAgc2VsZi5yZXBvcnRbImRvY2tlcl9yZXN0YXJ0X25lZWRlZCJdID0gYW55KHAgaW4gKCJkb2NrZXJkIiwgImNvbnRhaW5lcmQiKSBmb3IgcCBpbiBzZWxmLnJlcG9ydFsicmVzdGFydF9uZWVkZWQiXSkKICAgICAgICBpZiBzZWxmLmxheWVyID09ICJkb2NrZXIiOgogICAgICAgICAgICByY192LCBvdXRfdiwgXyA9IHNlbGYuZyhbImRvY2tlciIsICJ2ZXJzaW9uIiwgIi0tZm9ybWF0IiwgInt7LlNlcnZlci5WZXJzaW9ufX0iXSwgdGltZW91dD02MCkKICAgICAgICAgICAgc2VsZi5yZXBvcnRbImRvY2tlcl9lbmdpbmUiXSA9IG91dF92LnN0cmlwKCkgaWYgcmNfdiA9PSAwIGFuZCBvdXRfdi5zdHJpcCgpIGVsc2UgInVua25vd24iCiAgICAgICAgaWYgc2VsZi5sYXllciA9PSAicHZlIjoKICAgICAgICAgICAgc2VsZi5yZXBvcnRbInB2ZV9tYW5hZ2VyIl0gPSBzZWxmLnB2ZV9tYW5hZ2VyKCkKICAgICAgICBzZWxmLnJlcG9ydFsicmVib290X3NjYW5uZWQiXSA9ICJyZWJvb3RfbmVlZGVkIiBpbiBzZWxmLnJlcG9ydAogICAgICAgIHNlbGYucmVwb3J0WyJoZWFsdGhfYWZ0ZXIiXSA9IHNlbGYuaGVhbHRoKCkKICAgICAgICBpZiBzZWxmLmxheWVyID09ICJkb2NrZXIiIGFuZCBzZWxmLm1vZGUgPT0gImFwcGx5IjoKICAgICAgICAgICAgIyBSLTUyOCAoYDA5YCBkZWNpc2lvbiAxNTcpOiBkb2VzIHRoZSBlbmdpbmUgcmVwb3J0IGEgbWVtb3J5IGtpbGw/IFJlcG9ydGVkIG9ubHkg4oCUIG5ldmVyIHRoZSBvdXRjb21lLgogICAgICAgICAgICBzZWxmLnJlcG9ydFsib29tX2NoZWNrIl0gPSBzZWxmLm9vbV9jaGVjaygpCiAgICAgICAgcmV0dXJuIDAKCiAgICAjIC0tLS0tLS0tLS0gUi01Mjg6IHRoZSBtZW1vcnkta2lsbCBjaGVjayAtLS0tLS0tLS0tCiAgICBkZWYgb29tX2NoZWNrKHNlbGYpOgogICAgICAgICIiIlJ1biBvbmUgdGhyb3dhd2F5IGNvbnRhaW5lciBvdmVyIGl0cyBtZW1vcnkgY2FwIGluIHRoZSBndWVzdCBhbmQgcmVhZCB3aGF0IHRoZSBlbmdpbmUgc2F5cyBhYm91dCBpdC4KICAgICAgICBOZXZlciByYWlzZXM6IGFueSBmYWlsdXJlIGJlY29tZXMgcmVzdWx0ICJlcnJvciIuIFRoZSBjb250YWluZXIgaXMgQUxXQVlTIHJlbW92ZWQgKGZpbmFsbHkpLCBhbmQgYSBmYWlsZWQKICAgICAgICByZW1vdmFsIGlzIG5hbWVkIGluIHRoZSBkZXRhaWwuIiIiCiAgICAgICAgdCA9IE9PTUNIRUNLX1RJTUVPVVRTCiAgICAgICAgcmVzID0geyJyZXN1bHQiOiAiZXJyb3IiLCAib29tX2tpbGxlZCI6IEZhbHNlLCAib29tX2V2ZW50IjogRmFsc2UsICJleGl0X2NvZGUiOiBOb25lLCAiaW1hZ2UiOiBOb25lLCAiZGV0YWlsIjogIiJ9CiAgICAgICAgbG9nID0gc2VsZi5yLmxvZwogICAgICAgIHRyeToKICAgICAgICAgICAgcmMsIG91dCwgZXJyID0gc2VsZi5nKFsiZG9ja2VyIiwgImluc3BlY3QiLCAiLWYiLCAie3suQ29uZmlnLkltYWdlfX0iLCAiZmVsaG9tLWNvbnRyb2xsZXIiXSwgdGltZW91dD10WyJpbWFnZSJdKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmMsIG91dCwgZXJyID0gLTEsICIiLCBzdHIoZSkKICAgICAgICBpbWcgPSBvdXQuc3RyaXAoKSBpZiByYyA9PSAwIGVsc2UgIiIKICAgICAgICBpZiBub3QgaW1nIG9yIGFueShjLmlzc3BhY2UoKSBmb3IgYyBpbiBpbWcpOgogICAgICAgICAgICByZXNbImRldGFpbCJdID0gZiJ0aGUgY29udHJvbGxlcidzIGltYWdlIGNvdWxkIG5vdCBiZSByZWFkIChyYz17cmN9KTogeyhlcnIgb3Igb3V0KS5zdHJpcCgpWzoyMDBdfSIKICAgICAgICAgICAgbG9nKGYib3MtYXBwbHk6IE9PTS1DSEVDSyBlcnJvciDigJQge3Jlc1snZGV0YWlsJ119IikKICAgICAgICAgICAgcmV0dXJuIHJlcwogICAgICAgIHJlc1siaW1hZ2UiXSA9IGltZwogICAgICAgIG5hbWUgPSBmIntPT01DSEVDS19QUkVGSVh9e29zLmdldHBpZCgpfS17b3MudXJhbmRvbSg0KS5oZXgoKX0iCiAgICAgICAgbm90ZXMgPSBbXQogICAgICAgIHRyeToKICAgICAgICAgICAgdDAgPSBzZWxmLmd1ZXN0X2Vwb2NoKCkKICAgICAgICAgICAgaWYgdDAgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigidGhlIGd1ZXN0IGNsb2NrIGNvdWxkIG5vdCBiZSByZWFkIikKICAgICAgICAgICAgcnJjLCByb3V0LCByZXJyID0gc2VsZi5nKFsiZG9ja2VyIiwgInJ1biIsICItLW5hbWUiLCBuYW1lLCAiLS1wdWxsIiwgIm5ldmVyIiwgIi0tbmV0d29yayIsICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1tZW1vcnkiLCAiNjRtIiwgIi0tbWVtb3J5LXN3YXAiLCAiNjRtIiwgIi0tbGFiZWwiLCAiZmVsaG9tLm9vbWNoZWNrPTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWVudHJ5cG9pbnQiLCAic2giLCBpbWcsICItYyIsIE9PTUNIRUNLX1NDUklQVF0sIHRpbWVvdXQ9dFsicnVuIl0pCiAgICAgICAgICAgIHNlbGYuci5zbGVlcChPT01DSEVDS19TRVRUTEUpICAjIHRoZSBlbmdpbmUgcHVibGlzaGVzIHRoZSBvb20gZXZlbnQgYSBtb21lbnQgYWZ0ZXIgdGhlIHJ1biByZXR1cm5zIChGMS9GMikKICAgICAgICAgICAgdDEgPSBzZWxmLmd1ZXN0X2Vwb2NoKCkKICAgICAgICAgICAgaWYgdDEgaXMgTm9uZToKICAgICAgICAgICAgICAgIHQxID0gdDAgKyB0WyJydW4iXSArIE9PTUNIRUNLX1NFVFRMRSArIDEKICAgICAgICAgICAgaXJjLCBpb3V0LCBpZXJyID0gc2VsZi5nKFsiZG9ja2VyIiwgImluc3BlY3QiLCAiLWYiLCAie3suU3RhdGUuT09NS2lsbGVkfX0ge3suU3RhdGUuRXhpdENvZGV9fSIsIG5hbWVdLCB0aW1lb3V0PXRbImluc3BlY3QiXSkKICAgICAgICAgICAgaWYgaXJjICE9IDA6CiAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoZiJ0aGUgY2hlY2sgY29udGFpbmVyIGNvdWxkIG5vdCBiZSBpbnNwZWN0ZWQgKHJ1biByYz17cnJjfTogeyhyZXJyIG9yIHJvdXQpLnN0cmlwKClbOjEyMF19OyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiJpbnNwZWN0IHJjPXtpcmN9OiB7KGllcnIgb3IgaW91dCkuc3RyaXAoKVs6MTIwXX0pIikKICAgICAgICAgICAgZiA9IGlvdXQuc3BsaXQoKQogICAgICAgICAgICByZXNbIm9vbV9raWxsZWQiXSA9IGJvb2woZikgYW5kIGZbMF0gPT0gInRydWUiCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc1siZXhpdF9jb2RlIl0gPSBpbnQoZlsxXSkgaWYgbGVuKGYpID4gMSBlbHNlIE5vbmUKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICByZXNbImV4aXRfY29kZSJdID0gTm9uZQogICAgICAgICAgICBlcmMsIGVvdXQsIGVlcnIgPSBzZWxmLmcoWyJkb2NrZXIiLCAiZXZlbnRzIiwgIi0tc2luY2UiLCBzdHIodDAgLSAxKSwgIi0tdW50aWwiLCBzdHIodDEgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1maWx0ZXIiLCBmImNvbnRhaW5lcj17bmFtZX0iLCAiLS1maWx0ZXIiLCAiZXZlbnQ9b29tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1mb3JtYXQiLCAie3suQWN0aW9ufX0iXSwgdGltZW91dD10WyJldmVudHMiXSkKICAgICAgICAgICAgaWYgZXJjICE9IDA6CiAgICAgICAgICAgICAgICBub3Rlcy5hcHBlbmQoZiJ0aGUgZXZlbnQgcmVhZCBmYWlsZWQgKHJjPXtlcmN9KTogeyhlZXJyIG9yIGVvdXQpLnN0cmlwKClbOjEyMF19IikKICAgICAgICAgICAgcmVzWyJvb21fZXZlbnQiXSA9IGVyYyA9PSAwIGFuZCBhbnkobC5zdHJpcCgpID09ICJvb20iIGZvciBsIGluIGVvdXQuc3BsaXRsaW5lcygpKQogICAgICAgICAgICBpZiByZXNbIm9vbV9raWxsZWQiXSBhbmQgcmVzWyJvb21fZXZlbnQiXToKICAgICAgICAgICAgICAgIHJlc1sicmVzdWx0Il0gPSAicGFzcyIKICAgICAgICAgICAgICAgIG5vdGVzLmluc2VydCgwLCAidGhlIGVuZ2luZSByZXBvcnRlZCB0aGUgbWVtb3J5IGtpbGw6IE9PTUtpbGxlZD10cnVlIGFuZCB0aGUgb29tIGV2ZW50IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc1sicmVzdWx0Il0gPSAiZmFpbCIKICAgICAgICAgICAgICAgIG1pc3MgPSBbdyBmb3Igdywgb2sgaW4gKCgiT09NS2lsbGVkPXRydWUiLCByZXNbIm9vbV9raWxsZWQiXSksICgidGhlIG9vbSBldmVudCIsIHJlc1sib29tX2V2ZW50Il0pKSBpZiBub3Qgb2tdCiAgICAgICAgICAgICAgICBub3Rlcy5pbnNlcnQoMCwgZiJ0aGUgZW5naW5lIGRpZCBub3QgcmVwb3J0IHRoZSBtZW1vcnkga2lsbDogbWlzc2luZyB7JyBhbmQgJy5qb2luKG1pc3MpfSAoZXhpdCBjb2RlIHtyZXNbJ2V4aXRfY29kZSddfSkiKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmVzWyJyZXN1bHQiXSA9ICJlcnJvciIKICAgICAgICAgICAgbm90ZXMuaW5zZXJ0KDAsIGYidGhlIGNoZWNrIGNvdWxkIG5vdCBmaW5pc2g6IHt0eXBlKGUpLl9fbmFtZV9ffToge3N0cihlKVs6MjAwXX0iKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG1yYywgbW91dCwgbWVyciA9IHNlbGYuZyhbImRvY2tlciIsICJybSIsICItZiIsIG5hbWVdLCB0aW1lb3V0PXRbInJtIl0pCiAgICAgICAgICAgICAgICBpZiBtcmMgIT0gMCBhbmQgIm5vIHN1Y2ggY29udGFpbmVyIiBub3QgaW4gKG1lcnIgKyBtb3V0KS5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgIG5vdGVzLmFwcGVuZChmInRoZSBjaGVjayBjb250YWluZXIge25hbWV9IGNvdWxkIG5vdCBiZSByZW1vdmVkIChyYz17bXJjfSk6IHsobWVyciBvciBtb3V0KS5zdHJpcCgpWzoxMjBdfSIpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIG5vdGVzLmFwcGVuZChmInRoZSBjaGVjayBjb250YWluZXIge25hbWV9IGNvdWxkIG5vdCBiZSByZW1vdmVkOiB7dHlwZShlKS5fX25hbWVfX306IHtzdHIoZSlbOjEyMF19IikKICAgICAgICByZXNbImRldGFpbCJdID0gIjsgIi5qb2luKG5vdGVzKQogICAgICAgIGxvZyhmIm9zLWFwcGx5OiBPT00tQ0hFQ0sgcmVzdWx0PXtyZXNbJ3Jlc3VsdCddfSBvb21fa2lsbGVkPXtyZXNbJ29vbV9raWxsZWQnXX0gb29tX2V2ZW50PXtyZXNbJ29vbV9ldmVudCddfSAiCiAgICAgICAgICAgIGYiZXhpdD17cmVzWydleGl0X2NvZGUnXX0gaW1hZ2U9e2ltZ30g4oCUIHtyZXNbJ2RldGFpbCddfSIpCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIGRlZiBndWVzdF9lcG9jaChzZWxmKToKICAgICAgICByYywgb3V0LCBfID0gc2VsZi5nKFsiZGF0ZSIsICIrJXMiXSwgdGltZW91dD1PT01DSEVDS19USU1FT1VUU1siY2xvY2siXSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBpbnQob3V0LnN0cmlwKCkpIGlmIHJjID09IDAgZWxzZSBOb25lCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGRwa2dfc3RhdGUoc2VsZik6CiAgICAgICAgIiIiYGRwa2cgLS1hdWRpdGAgQU5EIGRwa2cncyB1cGRhdGUgam91cm5hbCwgaW4gT05FIGNhbGwgKFItODc2LCBhZ2VudCB2MC4xNDUuMCkuIEEgY3Jhc2ggaW4gdGhlIG1pZGRsZSBvZiBhbgogICAgICAgIGluc3RhbGwgY2FuIGxlYXZlIGAvdmFyL2xpYi9kcGtnL3VwZGF0ZXMvYCBub24tZW1wdHkgd2hpbGUgYC0tYXVkaXRgIHJlYWRzIGNsZWFuIOKAlCBtZWFzdXJlZCBvbiBkZW1vLWhwCiAgICAgICAgMjAyNi0xMC0wNSDigJQgYW5kIHRoYXQgam91cm5hbCBpcyBleGFjdGx5IHdoYXQgYXB0IHJlZnVzZXMgb24gKCJkcGtnIHdhcyBpbnRlcnJ1cHRlZCIpLiBPbmUgYHNoIC1jYCB3aXRoIGEKICAgICAgICBjb25zdGFudCBzY3JpcHQga2VlcHMgUi04NDUncyBzcGVlZDogYSBjbGVhbiBwYXNzIHN0aWxsIGNvc3RzIG9uZSBjYWxsIGhlcmUsIGFzIGJlZm9yZS4iIiIKICAgICAgICByYywgb3V0LCBfID0gc2VsZi54KFsic2giLCAiLWMiLCBEUEtHX1NUQVRFX1NDUklQVF0pCiAgICAgICAgYXVkaXQsIF8sIGpvdXJuYWwgPSBvdXQucGFydGl0aW9uKEpPVVJOQUxfTUFSSyArICJcbiIpCiAgICAgICAgcmV0dXJuIGF1ZGl0LCBbbCBmb3IgbCBpbiBqb3VybmFsLnNwbGl0KCkgaWYgbF0KCiAgICBkZWYgcmVwYWlyKHNlbGYsIGZvcmNlPUZhbHNlKToKICAgICAgICBiZWZvcmUsIGpvdXJuYWwgPSBzZWxmLmRwa2dfc3RhdGUoKQogICAgICAgIGNvbmZpZ3VyZWQgPSBsZW4oW2wgZm9yIGwgaW4gYmVmb3JlLnNwbGl0bGluZXMoKSBpZiBsLnN0YXJ0c3dpdGgoIiAiKV0pCiAgICAgICAgZml4ZWQgPSAwCiAgICAgICAgYWZ0ZXIsIGpvdXJuYWxfYWZ0ZXIgPSAiIiwgW10KICAgICAgICAjIG5vdGhpbmcgaGFsZi1kb25lIGFuZCBubyB1cGRhdGUgam91cm5hbCDihpIgbm90aGluZyB0byBydW4gKFItODQ1OiB0d28gY2FsbHMgc2F2ZWQgb24gZXZlcnkgY2xlYW4gcGFzcykuCiAgICAgICAgIyBSLTg3NjogdGhlIEpPVVJOQUwgY291bnRzIHRvbywgYW5kIGBmb3JjZWAgKGFwdCBzYWlkICJkcGtnIHdhcyBpbnRlcnJ1cHRlZCIpIGFsd2F5cyByZXBhaXJzLgogICAgICAgIGlmIGJlZm9yZS5zdHJpcCgpIG9yIGpvdXJuYWwgb3IgZm9yY2U6CiAgICAgICAgICAgIHNlbGYueChBUFRfRU5WICsgWyJkcGtnIiwgIi0tY29uZmlndXJlIiwgIi1hIiwgIi0tZm9yY2UtY29uZm9sZCJdKQogICAgICAgICAgICByYzIsIG91dCwgZXJyID0gc2VsZi54KEFQVF9FTlYgKyBbImFwdC1nZXQiLCAiLWYiLCAiaW5zdGFsbCIsICIteSIsICItcSJdICsgRFBLR19PUFRTKQogICAgICAgICAgICBhZnRlciwgam91cm5hbF9hZnRlciA9IHNlbGYuZHBrZ19zdGF0ZSgpCiAgICAgICAgICAgIGZpeGVkID0gbGVuKHJlLmZpbmRhbGwociJeU2V0dGluZyB1cCAiLCBvdXQsIHJlLk0pKQogICAgICAgIHNlbGYucmVwb3J0WyJyZXBhaXIiXSA9IHsiaGFsZl9jb25maWd1cmVkX2JlZm9yZSI6IGNvbmZpZ3VyZWQsICJqb3VybmFsX2JlZm9yZSI6IGxlbihqb3VybmFsKSwgImZpeGVkIjogZml4ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhbl9hZnRlciI6IGFmdGVyLnN0cmlwKCkgPT0gIiIgYW5kIG5vdCBqb3VybmFsX2FmdGVyfQogICAgICAgIHNlbGYuci5sb2coZiJvcy1hcHBseTogUkVQQUlSIGNvbmZpZ3VyZWQ9e2NvbmZpZ3VyZWR9IGpvdXJuYWw9e2xlbihqb3VybmFsKX0gZml4ZWQ9e2ZpeGVkfSIgKyAoIiBmb3JjZWQiIGlmIGZvcmNlIGVsc2UgIiIpKQogICAgICAgIGlmIGFmdGVyLnN0cmlwKCk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxMyIsICJkcGtnIGlzIHN0aWxsIGJyb2tlbiBhZnRlciB0aGUgcmVwYWlyOiAiICsgYWZ0ZXIuc3RyaXAoKS5zcGxpdGxpbmVzKClbMF0pCiAgICAgICAgaWYgam91cm5hbF9hZnRlcjoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjEzIiwgZiJkcGtnJ3MgdXBkYXRlIGpvdXJuYWwgaXMgc3RpbGwgbm90IGVtcHR5IGFmdGVyIHRoZSByZXBhaXIgKHtsZW4oam91cm5hbF9hZnRlcil9IGZpbGUocykpIikKCiAgICBkZWYgcGVuZGluZ19mYXN0KHNlbGYpOgogICAgICAgICIiIlJpbmcgMCAoc2VsZWN0IHBlbmRpbmctZmFzdCk6IGV2ZXJ5IHBlbmRpbmcgdXBncmFkZSBvZiBhbiBJTlNUQUxMRUQgcGFja2FnZSB3aG9zZSBldmVyeSBvcmlnaW4gaXMgRGViaWFuIC8KICAgICAgICBEZWJpYW4tU2VjdXJpdHkg4oCUIGFuZCwgb24gdGhlIGhvc3QsIG5vdCBhIGtlcm5lbCAvIGJvb3QgLyBmaXJtd2FyZSBwYWNrYWdlLiIiIgogICAgICAgIHJjLCBwZW5kLCByZW12LCBfID0gc2VsZi5zaW11bGF0ZShbImRpc3QtdXBncmFkZSJdKQogICAgICAgIG91dCA9IFtdCiAgICAgICAgZm9yIHAgaW4gcGVuZDoKICAgICAgICAgICAgbyA9IHNlbGYub3JpZ2luX25hbWUocFsib3JpZ2luIl0pCiAgICAgICAgICAgIGlmIHBbImZyb20iXSBpcyBOb25lIG9yIG5vdCBvIG9yIG5vdCBvIDw9IHNldChGQVNUX09SSUdJTlMpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgc2VsZi5sYXllciA9PSAiaG9zdCIgYW5kIEhPU1RfU0xPV19SRS5tYXRjaChwWyJuYW1lIl0pOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgb3V0LmFwcGVuZCh7Im5hbWUiOiBwWyJuYW1lIl0sICJ2ZXJzaW9uIjogcFsidG8iXSwgIm9yaWdpbiI6ICJEZWJpYW4tU2VjdXJpdHkiIGlmICJEZWJpYW4tU2VjdXJpdHkiIGluIG8gZWxzZSAiRGViaWFuIn0pCiAgICAgICAgcmV0dXJuIG91dAoKICAgIGRlZiByZXN0YXJ0X3NvY2tldF91c2VycyhzZWxmKToKICAgICAgICAiIiJSLTg1ODogcmVzdGFydCBPTkxZIHRoZSBjb250YWluZXJzIHRoYXQgYmluZC1tb3VudCB0aGUgRG9ja2VyIHNvY2tldCwgc28gdGhleSBhdHRhY2ggdG8gdGhlIG5ldyBvbmUuIiIiCiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYuZyhbImRvY2tlciIsICJwcyIsICItcSIsICItLW5vLXRydW5jIl0sIHRpbWVvdXQ9NjApCiAgICAgICAgdXNlcnMgPSBbXQogICAgICAgIGZvciBjaWQgaW4gb3V0LnNwbGl0KCk6CiAgICAgICAgICAgIGlyYywgaW91dCwgXyA9IHNlbGYuZyhbImRvY2tlciIsICJpbnNwZWN0IiwgIi1mIiwgInt7Lk5hbWV9fXx7e3JhbmdlIC5Nb3VudHN9fXt7LkRlc3RpbmF0aW9ufX07e3tlbmR9fSIsIGNpZF0sIHRpbWVvdXQ9NjApCiAgICAgICAgICAgIGlmIGlyYyAhPSAwIG9yICJ8IiBub3QgaW4gaW91dDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIG5hbWUsIG1vdW50cyA9IGlvdXQuc3RyaXAoKS5zcGxpdCgifCIsIDEpCiAgICAgICAgICAgIGlmIGFueShtIGluIERPQ0tFUl9TT0NLRVRTIGZvciBtIGluIG1vdW50cy5zcGxpdCgiOyIpKToKICAgICAgICAgICAgICAgIHVzZXJzLmFwcGVuZChuYW1lLmxzdHJpcCgiLyIpKQogICAgICAgIHVzZXJzLnNvcnQoKQogICAgICAgIGlmIHVzZXJzOgogICAgICAgICAgICBycmMsIF8sIHJlcnIgPSBzZWxmLmcoWyJkb2NrZXIiLCAicmVzdGFydCJdICsgdXNlcnMsIHRpbWVvdXQ9MzAwKQogICAgICAgICAgICBzZWxmLnIubG9nKGYib3MtYXBwbHk6IFNPQ0tFVC1VU0VSUyByZXN0YXJ0ZWQ9eycsJy5qb2luKHVzZXJzKX0gcmM9e3JyY30gKFItODU4OiB0aGV5IGhlbGQgdGhlIG9sZCBkb2NrZXIgc29ja2V0KSIpCiAgICAgICAgcmV0dXJuIHVzZXJzCgogICAgZGVmIHBlbmRpbmdfZG9ja2VyKHNlbGYpOgogICAgICAgICIiIlJpbmcgMCAoc2VsZWN0IHBlbmRpbmctZG9ja2VyKTogdGhlIG5ld2VzdCBwZW5kaW5nIHZlcnNpb24gb2YgZWFjaCBJTlNUQUxMRUQgRG9ja2VyIHBhY2thZ2UsIERvY2tlciBvcmlnaW4uIiIiCiAgICAgICAgcmMsIHBlbmQsIHJlbXYsIF8gPSBzZWxmLnNpbXVsYXRlKFsiZGlzdC11cGdyYWRlIl0pCiAgICAgICAgcmV0dXJuIFt7Im5hbWUiOiBwWyJuYW1lIl0sICJ2ZXJzaW9uIjogcFsidG8iXSwgIm9yaWdpbiI6IERPQ0tFUl9PUklHSU59IGZvciBwIGluIHBlbmQKICAgICAgICAgICAgICAgIGlmIHBbImZyb20iXSBpcyBub3QgTm9uZSBhbmQgcFsibmFtZSJdIGluIERPQ0tFUl9OQU1FUyBhbmQgc2VsZi5vcmlnaW5fbmFtZShwWyJvcmlnaW4iXSkgPT0ge0RPQ0tFUl9PUklHSU59XQoKICAgIGRlZiBwZW5kaW5nX3B2ZShzZWxmKToKICAgICAgICAiIiJSaW5nIDAgKHNlbGVjdCBwZW5kaW5nLXB2ZSk6IHRoZSBuZXdlc3QgcGVuZGluZyB2ZXJzaW9uIG9mIGVhY2ggSU5TVEFMTEVEIFByb3htb3gtb3JpZ2luIHBhY2thZ2UsIG5ldmVyIGEKICAgICAgICBrZXJuZWwgLyBib290IC8gZmlybXdhcmUgLyBtaWNyb2NvZGUgbmFtZSAoSE9TVF9TTE9XX1JFLCBSLTgzNidzIGxhbmUpLCBuZXZlciBhbm90aGVyIG9yaWdpbi4iIiIKICAgICAgICByYywgcGVuZCwgcmVtdiwgXyA9IHNlbGYuc2ltdWxhdGUoWyJkaXN0LXVwZ3JhZGUiXSkKICAgICAgICByZXR1cm4gW3sibmFtZSI6IHBbIm5hbWUiXSwgInZlcnNpb24iOiBwWyJ0byJdLCAib3JpZ2luIjogUFZFX09SSUdJTn0gZm9yIHAgaW4gcGVuZAogICAgICAgICAgICAgICAgaWYgcFsiZnJvbSJdIGlzIG5vdCBOb25lIGFuZCBub3QgSE9TVF9TTE9XX1JFLm1hdGNoKHBbIm5hbWUiXSkgYW5kIHBbIm5hbWUiXSBub3QgaW4gRE9DS0VSX05BTUVTCiAgICAgICAgICAgICAgICBhbmQgc2VsZi5vcmlnaW5fbmFtZShwWyJvcmlnaW4iXSkgPT0ge1BWRV9PUklHSU59XQoKICAgIGRlZiBwdmVfbWFuYWdlcihzZWxmKToKICAgICAgICAiIiJwdmV2ZXJzaW9uJ3MgcHZlLW1hbmFnZXIgdmVyc2lvbiAoInVua25vd24iIHdoZW4gaXQgY2Fubm90IGJlIHJlYWQpLiIiIgogICAgICAgIHJjLCBvdXQsIF8gPSBzZWxmLnIuaG9zdChbInB2ZXZlcnNpb24iXSwgNjApCiAgICAgICAgbSA9IHJlLm1hdGNoKHIiXnB2ZS1tYW5hZ2VyLyhbXi9cc10rKSIsIG91dC5zdHJpcCgpKSBpZiByYyA9PSAwIGVsc2UgTm9uZQogICAgICAgIHJldHVybiBtLmdyb3VwKDEpIGlmIG0gZWxzZSAidW5rbm93biIKCiAgICBkZWYgb3JpZ2luX29rKHNlbGYsIG9yaWdpbik6CiAgICAgICAgbyA9IHNlbGYub3JpZ2luX25hbWUob3JpZ2luKQogICAgICAgIGlmIHNlbGYubGF5ZXIgPT0gImRvY2tlciI6CiAgICAgICAgICAgIHJldHVybiBvID09IHtET0NLRVJfT1JJR0lOfQogICAgICAgIGlmIHNlbGYubGF5ZXIgPT0gInB2ZSI6CiAgICAgICAgICAgIHJldHVybiBvID09IHtQVkVfT1JJR0lOfQogICAgICAgIHJldHVybiBib29sKG8gJiBzZXQoRkFTVF9PUklHSU5TKSkKCiAgICBkZWYgYXBwbHkoc2VsZiwgcGxhbik6CiAgICAgICAgbG9nID0gc2VsZi5yLmxvZwogICAgICAgIGlmIHNlbGYuc2VsZWN0ID09ICJsaXN0ZWQiOgogICAgICAgICAgICBwYWNrYWdlcyA9IHBsYW5bInBhY2thZ2VzIl0KICAgICAgICBlbGlmIHNlbGYuc2VsZWN0ID09ICJwZW5kaW5nLWRvY2tlciI6CiAgICAgICAgICAgIHBhY2thZ2VzID0gc2VsZi5wZW5kaW5nX2RvY2tlcigpCiAgICAgICAgZWxpZiBzZWxmLnNlbGVjdCA9PSAicGVuZGluZy1wdmUiOgogICAgICAgICAgICBwYWNrYWdlcyA9IHNlbGYucGVuZGluZ19wdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhY2thZ2VzID0gc2VsZi5wZW5kaW5nX2Zhc3QoKQogICAgICAgIGNtcF9vcCA9ICJuZSIgaWYgc2VsZi5hbGxvd19kb3duZ3JhZGUgZWxzZSAiZ3QiCiAgICAgICAgaW5zdCA9IHNlbGYuaW5zdGFsbGVkKCkKICAgICAgICB1cGdyYWRlLCBhbHJlYWR5LCBub3RpbnN0ID0gW10sIDAsIDAKICAgICAgICBmb3IgZSBpbiBwYWNrYWdlczoKICAgICAgICAgICAgbiwgdiA9IGVbIm5hbWUiXSwgZVsidmVyc2lvbiJdCiAgICAgICAgICAgIGlmIG4gbm90IGluIGluc3Q6CiAgICAgICAgICAgICAgICBub3RpbnN0ICs9IDEKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRwa2dfY21wKHYsIGNtcF9vcCwgaW5zdFtuXSk6CiAgICAgICAgICAgICAgICBhbHJlYWR5ICs9IDEKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHVwZ3JhZGUuYXBwZW5kKChuLCB2KSkKICAgICAgICBmcm9tX3NuYXAgPSAwCiAgICAgICAgaWYgdXBncmFkZToKICAgICAgICAgICAgYXZhaWwgPSBzZWxmLm1hZGlzb25fYWxsKFtuIGZvciBuLCBfIGluIHVwZ3JhZGVdKQogICAgICAgICAgICBtaXNzaW5nID0gWyhuLCB2KSBmb3IgbiwgdiBpbiB1cGdyYWRlIGlmIHYgbm90IGluIGF2YWlsW25dXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1pc3NpbmcgPSBbXQogICAgICAgIGlmIG1pc3Npbmc6CiAgICAgICAgICAgIHNuYXAgPSBwbGFuLmdldCgic25hcHNob3QiLCAiIikKICAgICAgICAgICAgaWYgbm90IHNuYXA6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSNyIsIGYie21pc3NpbmdbMF1bMF19PXttaXNzaW5nWzBdWzFdfSBpcyBub3QgZG93bmxvYWRhYmxlIGFuZCB0aGUgcGxhbiBuYW1lcyBubyBzbmFwc2hvdCIpCiAgICAgICAgICAgIHNlbGYuYWRkX3NuYXBzaG90X3NvdXJjZXMoc25hcCkKICAgICAgICAgICAgYXZhaWwgPSBzZWxmLm1hZGlzb25fYWxsKFtuIGZvciBuLCBfIGluIG1pc3NpbmddKQogICAgICAgICAgICBzdGlsbCA9IFsobiwgdikgZm9yIG4sIHYgaW4gbWlzc2luZyBpZiB2IG5vdCBpbiBhdmFpbFtuXV0KICAgICAgICAgICAgaWYgc3RpbGw6CiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZV9zbmFwc2hvdF9zb3VyY2VzKCkKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI3IiwgZiJ7c3RpbGxbMF1bMF19PXtzdGlsbFswXVsxXX0gaXMgbm90IGRvd25sb2FkYWJsZSwgbm90IGV2ZW4gZnJvbSBzbmFwc2hvdCB7c25hcH0iKQogICAgICAgICAgICBmcm9tX3NuYXAgPSBsZW4obWlzc2luZykKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxvZyhmIm9zLWFwcGx5OiBQTEFOIHVwZ3JhZGU9e2xlbih1cGdyYWRlKX0gYWxyZWFkeT17YWxyZWFkeX0gbm90LWluc3RhbGxlZD17bm90aW5zdH0gZnJvbS1zbmFwc2hvdD17ZnJvbV9zbmFwfSIpCiAgICAgICAgICAgIHNlbGYucmVwb3J0WyJwbGFuIl0gPSB7InVwZ3JhZGUiOiBsZW4odXBncmFkZSksICJhbHJlYWR5IjogYWxyZWFkeSwgIm5vdF9pbnN0YWxsZWQiOiBub3RpbnN0LCAiZnJvbV9zbmFwc2hvdCI6IGZyb21fc25hcH0KICAgICAgICAgICAgaWYgbm90IHVwZ3JhZGU6CiAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydFsidXBncmFkZWQiXSA9IFtdCiAgICAgICAgICAgICAgICBsb2coIm9zLWFwcGx5OiBET05FIHJjPTAgc2Vjb25kcz0wIHVwZ3JhZGVkPTAgKG5vdGhpbmcgdG8gZG8pIikKICAgICAgICAgICAgICAgIHJldHVybiAwLCBpbnN0CiAgICAgICAgICAgIGFyZ3MgPSBbImluc3RhbGwiLCAiLS1vbmx5LXVwZ3JhZGUiLCAiLS1uby1pbnN0YWxsLXJlY29tbWVuZHMiXSArIFwKICAgICAgICAgICAgICAgIChbIi0tYWxsb3ctZG93bmdyYWRlcyJdIGlmIHNlbGYuYWxsb3dfZG93bmdyYWRlIGVsc2UgW10pICsgW2Yie259PXt2fSIgZm9yIG4sIHYgaW4gdXBncmFkZV0KICAgICAgICAgICAgcmMsIHNpbSwgcmVtdiwgdGV4dCA9IHNlbGYuc2ltdWxhdGUoYXJncykKICAgICAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgICAgIHRhaWwgPSB0ZXh0LnN0cmlwKCkuc3BsaXRsaW5lcygpWy0xXSBpZiB0ZXh0LnN0cmlwKCkgZWxzZSAiIgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjciLCAidGhlIHNpbXVsYXRpb24gZmFpbGVkOiAiICsgdGFpbCkKICAgICAgICAgICAgaWYgcmVtdjoKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI0IiwgZiJ0aGUgcGxhbiB3b3VsZCByZW1vdmUgeycsICcuam9pbihyZW12Wzo1XSl9IikKICAgICAgICAgICAgd2FudCA9IGRpY3QodXBncmFkZSkKICAgICAgICAgICAgZm9yIHAgaW4gc2ltOgogICAgICAgICAgICAgICAgaWYgcFsiZnJvbSJdIGlzIE5vbmUgYW5kIHNlbGYubGF5ZXIgPT0gInB2ZSIgYW5kIHBbIm5hbWUiXSBpbiBQVkVfTkVXX0FMTE9XIGFuZCBzZWxmLm9yaWdpbl9vayhwWyJvcmlnaW4iXSkgXAogICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IEhPU1RfU0xPV19SRS5tYXRjaChwWyJuYW1lIl0pOgogICAgICAgICAgICAgICAgICAgIHNlbGYuci5sb2coZiJvcy1hcHBseTogTkVXIHtwWyduYW1lJ119PXtwWyd0byddfSAob24gdGhlIHB2ZSBsYW5lJ3MgYWxsb3ctbGlzdCkiKQogICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LnNldGRlZmF1bHQoImFkZGVkIiwgW10pLmFwcGVuZCh7Im5hbWUiOiBwWyJuYW1lIl0sICJ2ZXJzaW9uIjogcFsidG8iXX0pCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHBbImZyb20iXSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI2IiwgZiJ0aGUgcGxhbiB3b3VsZCBhZGQgYSBwYWNrYWdlIHRoYXQgaXMgbm90IGluc3RhbGxlZDoge3BbJ25hbWUnXX0iKQogICAgICAgICAgICAgICAgaWYgcFsibmFtZSJdIG5vdCBpbiB3YW50OgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI2IiwgZiJ0aGUgcGxhbiB3b3VsZCB0b3VjaCB7cFsnbmFtZSddfSwgd2hpY2ggaXMgbm90IGluIHRoZSBwbGFuIikKICAgICAgICAgICAgICAgIGlmIHBbInRvIl0gIT0gd2FudFtwWyJuYW1lIl1dOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI2IiwgZiJ7cFsnbmFtZSddfSB3b3VsZCBnbyB0byB7cFsndG8nXX0sIG5vdCB0aGUgYXBwcm92ZWQge3dhbnRbcFsnbmFtZSddXX0iKQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuYWxsb3dfZG93bmdyYWRlIGFuZCBub3Qgc2VsZi5kcGtnX2NtcChwWyJ0byJdLCAiZ3QiLCBwWyJmcm9tIl0pOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI1IiwgZiJ7cFsnbmFtZSddfSB3b3VsZCBiZSBkb3duZ3JhZGVkIHtwWydmcm9tJ119IC0+IHtwWyd0byddfSIpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5vcmlnaW5fb2socFsib3JpZ2luIl0pOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIyIiwgZiJ7cFsnbmFtZSddfSB3b3VsZCBjb21lIGZyb20ge3BbJ29yaWdpbiddfSwgbm90IHRoZSB7c2VsZi5sYXllcn0gbGF5ZXIncyBvcmlnaW4iKQogICAgICAgICAgICAgICAgaWYgc2VsZi5sYXllciBpbiAoImhvc3QiLCAicHZlIikgYW5kIEhPU1RfU0xPV19SRS5tYXRjaChwWyJuYW1lIl0pOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxNCIsIGYie3BbJ25hbWUnXX0gaXMgYSBrZXJuZWwgLyBib290IC8gZmlybXdhcmUgcGFja2FnZSDigJQgdGhlIGhvc3QncyBzbG93IGxhbmUiKQogICAgICAgICAgICBuZWVkID0gc2VsZi5kb3dubG9hZF9ieXRlcyhhcmdzKQogICAgICAgICAgICBmcmVlID0gc2VsZi5mcmVlX2J5dGVzKCkKICAgICAgICAgICAgaWYgZnJlZSA+PSAwIGFuZCBmcmVlIDwgbWF4KE1JTl9GUkVFLCAzICogbmVlZCk6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSOCIsIGYiZnJlZSBzcGFjZSB7ZnJlZX0gQiBpcyBiZWxvdyBtYXgoNTAwIE1CLCAzIHggZG93bmxvYWQge25lZWR9IEIpIikKICAgICAgICAgICAgdDAgPSB0aW1lLnRpbWUoKQogICAgICAgICAgICByYywgb3V0LCBlcnIgPSBzZWxmLngoQVBUX0VOViArIFsiYXB0LWdldCIsICIteSIsICItcSJdICsgRFBLR19PUFRTICsgYXJncykKICAgICAgICAgICAgaWYgcmMgIT0gMCBhbmQgImRwa2cgd2FzIGludGVycnVwdGVkIiBpbiAob3V0ICsgZXJyKToKICAgICAgICAgICAgICAgICMgUi04NzYgKGJlbHQpOiBhcHQgc2F5cyBkcGtnIHdhcyBpbnRlcnJ1cHRlZCBhbHRob3VnaCB0aGUgcmVwYWlyIGZvdW5kIG5vdGhpbmcg4oCUIHJlcGFpciBhbmQKICAgICAgICAgICAgICAgICMgcmV0cnkgT05DRS4gTmV2ZXIgYSBsb29wLgogICAgICAgICAgICAgICAgc2VsZi5yLmxvZygib3MtYXBwbHk6IElOVEVSUlVQVEVEIGFwdCBzYXlzIGRwa2cgd2FzIGludGVycnVwdGVkIOKAlCByZXBhaXJpbmcgYW5kIHJldHJ5aW5nIG9uY2UiKQogICAgICAgICAgICAgICAgc2VsZi5yZXBhaXIoZm9yY2U9VHJ1ZSkKICAgICAgICAgICAgICAgIHJjLCBvdXQsIGVyciA9IHNlbGYueChBUFRfRU5WICsgWyJhcHQtZ2V0IiwgIi15IiwgIi1xIl0gKyBEUEtHX09QVFMgKyBhcmdzKQogICAgICAgICAgICBzZWNzID0gdGltZS50aW1lKCkgLSB0MAogICAgICAgICAgICAjIGRwa2cgc2F5cyAiSW5zdGFsbGluZyBuZXcgdmVyc2lvbiBvZiBjb25maWcgZmlsZSBYIiB3aGVuIFggd2FzIE5PVCBjaGFuZ2VkIGxvY2FsbHkgKHRoZSBwYWNrYWdlJ3MgbmV3CiAgICAgICAgICAgICMgdmVyc2lvbiBpcyB0YWtlbiksIGFuZCAiQ29uZmlndXJhdGlvbiBmaWxlICdYJyIgKyAiS2VlcGluZyBvbGQgY29uZmlnIGZpbGUiIHdoZW4gaXQgd2FzICgtLWZvcmNlLWNvbmZvbGQKICAgICAgICAgICAgIyBrZWVwcyB0aGUgbG9jYWwgb25lOyB0aGUgcGFja2FnZSdzIHZlcnNpb24gbGFuZHMgYXMgWC5kcGtnLWRpc3QpLiBNZWFzdXJlZCBsaXZlIDIwMjYtMTAtMDQgKGRlYmlhbl92ZXJzaW9uKS4KICAgICAgICAgICAgY29uZmxpY3QgPSBOb25lCiAgICAgICAgICAgIGZvciBsIGluIChvdXQgKyBlcnIpLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2gociJJbnN0YWxsaW5nIG5ldyB2ZXJzaW9uIG9mIGNvbmZpZyBmaWxlIChcUys/KVxzKlwuXC5cLiIsIGwpCiAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgIGxvZyhmIm9zLWFwcGx5OiBDT05GRklMRSB1cGRhdGVkIHttLmdyb3VwKDEpfSAoaXQgd2FzIG5vdCBjaGFuZ2VkIGxvY2FsbHkpIikKICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2gociJDb25maWd1cmF0aW9uIGZpbGUgJyhbXiddKyknIiwgbCkKICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3QgPSBtLmdyb3VwKDEpCiAgICAgICAgICAgICAgICBpZiBjb25mbGljdCBhbmQgIktlZXBpbmcgb2xkIGNvbmZpZyBmaWxlIiBpbiBsOgogICAgICAgICAgICAgICAgICAgIGxvZyhmIm9zLWFwcGx5OiBDT05GRklMRSBrZXB0IHtjb25mbGljdH0gKGNoYW5nZWQgbG9jYWxseTsgdGhlIHBhY2thZ2UncyB2ZXJzaW9uIGlzIHtjb25mbGljdH0uZHBrZy1kaXN0KSIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuc2V0ZGVmYXVsdCgiY29uZmZpbGVzX2tlcHQiLCBbXSkuYXBwZW5kKGNvbmZsaWN0KQogICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0ID0gTm9uZQogICAgICAgICAgICBzZWxmLngoWyJhcHQtZ2V0IiwgImNsZWFuIl0pCiAgICAgICAgICAgIGlmIHJjICE9IDA6CiAgICAgICAgICAgICAgICBfLCBhdWQsIF8gPSBzZWxmLngoWyJkcGtnIiwgIi0tYXVkaXQiXSkKICAgICAgICAgICAgICAgIGZpcnN0ID0gYXVkLnN0cmlwKCkuc3BsaXRsaW5lcygpWzBdIGlmIGF1ZC5zdHJpcCgpIGVsc2UgImNsZWFuIgogICAgICAgICAgICAgICAgbG9nKGYib3MtYXBwbHk6IEZBSUxFRCByYz17cmN9IHN0ZXA9aW5zdGFsbCDigJQgZHBrZyBzdGF0ZToge2ZpcnN0fSIpCiAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydFsiZmFpbGVkIl0gPSB7InJjIjogcmMsICJkcGtnX2F1ZGl0IjogZmlyc3QsICJ0YWlsIjogKG91dCArIGVycikuc3RyaXAoKS5zcGxpdGxpbmVzKClbLTM6XX0KICAgICAgICAgICAgICAgIHJldHVybiAzLCBOb25lCiAgICAgICAgICAgIHNlbGYucmVwb3J0WyJ1cGdyYWRlZCJdID0gW3sibmFtZSI6IG4sICJ2ZXJzaW9uIjogdn0gZm9yIG4sIHYgaW4gdXBncmFkZV0KICAgICAgICAgICAgc2VsZi5yZXBvcnRbInNlY29uZHMiXSA9IHJvdW5kKHNlY3MsIDEpCiAgICAgICAgICAgIGlmIHNlbGYubGF5ZXIgPT0gImRvY2tlciI6CiAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydFsic29ja2V0X3Jlc3RhcnRlZCJdID0gc2VsZi5yZXN0YXJ0X3NvY2tldF91c2VycygpCiAgICAgICAgICAgIHByb2NzLCByZWJvb3QgPSBzZWxmLnJlc3RhcnRfbmVlZGVkKCkKICAgICAgICAgICAgc2VsZi5yZXBvcnRbInJlc3RhcnRfbmVlZGVkIl0gPSBwcm9jcwogICAgICAgICAgICBzZWxmLnJlcG9ydFsiZG9ja2VyX3Jlc3RhcnRfbmVlZGVkIl0gPSBhbnkocCBpbiAoImRvY2tlcmQiLCAiY29udGFpbmVyZCIpIGZvciBwIGluIHByb2NzKQogICAgICAgICAgICBzZWxmLnJlcG9ydFsicmVib290X25lZWRlZCJdID0gcmVib290CiAgICAgICAgICAgIGxvZyhmIm9zLWFwcGx5OiBET05FIHJjPTAgc2Vjb25kcz17c2VjczouMWZ9IHVwZ3JhZGVkPXtsZW4odXBncmFkZSl9IHJlc3RhcnQtbmVlZGVkPXsnLCcuam9pbihwcm9jcykgb3IgJy0nfSByZWJvb3QtbmVlZGVkPXsneWVzJyBpZiByZWJvb3QgZWxzZSAnbm8nfSIpCiAgICAgICAgICAgIHJldHVybiAwLCBOb25lCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgZnJvbV9zbmFwOgogICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVfc25hcHNob3Rfc291cmNlcygpCgogICAgZGVmIGRvd25sb2FkX2J5dGVzKHNlbGYsIGFyZ3MpOgogICAgICAgICMgUi04NjUgKHYwLjE0NC4wKTogTk8gYC1zYC4gV2l0aCBgLXNgIGFwdCBwcmludHMgdGhlIHNpbXVsYXRpb24gKCJJbnN0IOKApiIpIGFuZCBubyBVUkkgbGlzdCwgc28gdGhpcyBzdW1tZWQKICAgICAgICAjIDAgQiBhbmQgUjggb25seSBldmVyIGFwcGxpZWQgaXRzIDUwMCBNQiBmbG9vciAobWVhc3VyZWQgMjAyNi0xMC0wNDogMCBVUklzIHdpdGggLXMsIDMgVVJJcyB3aXRob3V0KS4KICAgICAgICAjIGAtLXByaW50LXVyaXNgIGFsb25lIGRvd25sb2FkcyBub3RoaW5nIOKAlCBtZWFzdXJlZCBvbiA5MjAyIDIwMjYtMTAtMDU6IHRoZSBhcmNoaXZlIGNhY2hlIGFuZCB0aGUgdmVyc2lvbnMKICAgICAgICAjIHVuY2hhbmdlZC4gUGlubmVkIGJ5IHRlc3RfUjhfY291bnRzX3RoZV9yZWFsX2Rvd25sb2FkIC8gdGVzdF9kb3dubG9hZF9ieXRlc19uZXZlcl9zaW11bGF0ZXMuCiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYueChBUFRfRU5WICsgWyJhcHQtZ2V0IiwgIi1vIiwgIkRlYnVnOjpOb0xvY2tpbmc9MSIsICItLXByaW50LXVyaXMiLCAiLXEiXSArIGFyZ3MpCiAgICAgICAgdG90YWwgPSAwCiAgICAgICAgZm9yIGwgaW4gb3V0LnNwbGl0bGluZXMoKToKICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHIiXidbXiddKycgXFMrIChbMC05XSspICIsIGwpCiAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICB0b3RhbCArPSBpbnQobS5ncm91cCgxKSkKICAgICAgICByZXR1cm4gdG90YWwKCiAgICBkZWYgYWRkX3NuYXBzaG90X3NvdXJjZXMoc2VsZiwgc25hcCk6CiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYueChbInNoIiwgIi1jIiwgIi4gL2V0Yy9vcy1yZWxlYXNlICYmIGVjaG8gJFZFUlNJT05fQ09ERU5BTUUiXSkKICAgICAgICBjb2RlID0gb3V0LnN0cmlwKCkKICAgICAgICBpZiBub3QgcmUubWF0Y2gociJeW2Etel0rJCIsIGNvZGUpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSNyIsIGYiY2Fubm90IHJlYWQgdGhlIHtzZWxmLmxheWVyfSdzIERlYmlhbiBjb2RlbmFtZSAoe2NvZGUhcn0pIikKICAgICAgICBib2R5ID0gKGYiZGViIFtjaGVjay12YWxpZC11bnRpbD1ub10gaHR0cDovL3NuYXBzaG90LmRlYmlhbi5vcmcvYXJjaGl2ZS9kZWJpYW4ve3NuYXB9IHtjb2RlfSBtYWluXG4iCiAgICAgICAgICAgICAgICBmImRlYiBbY2hlY2stdmFsaWQtdW50aWw9bm9dIGh0dHA6Ly9zbmFwc2hvdC5kZWJpYW4ub3JnL2FyY2hpdmUvZGViaWFuLXNlY3VyaXR5L3tzbmFwfSB7Y29kZX0tc2VjdXJpdHkgbWFpblxuIikKICAgICAgICBzZWxmLnIud3JpdGVfZmlsZShzZWxmLmxheWVyLCBzZWxmLnZtaWQsIFNOQVBTSE9UX0xJU1QsIGJvZHkpCiAgICAgICAgc2VsZi5yLmxvZyhmIm9zLWFwcGx5OiBTTkFQU0hPVCB1c2luZyBzbmFwc2hvdC5kZWJpYW4ub3JnL3tzbmFwfSBmb3IgdmVyc2lvbnMgbm8gbG9uZ2VyIHB1Ymxpc2hlZCAoZGVjaXNpb24gNzkpIikKICAgICAgICByYywgb3V0LCBlcnIgPSBzZWxmLngoQVBUX0VOViArIFsiYXB0LWdldCIsICItcSIsICJ1cGRhdGUiXSwgdGltZW91dD02MDApCiAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgc2VsZi5yZW1vdmVfc25hcHNob3Rfc291cmNlcygpCiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI3IiwgImFwdC1nZXQgdXBkYXRlIGFnYWluc3Qgc25hcHNob3QuZGViaWFuLm9yZyBmYWlsZWQiKQoKICAgIGRlZiByZW1vdmVfc25hcHNob3Rfc291cmNlcyhzZWxmKToKICAgICAgICBzZWxmLngoWyJybSIsICItZiIsIFNOQVBTSE9UX0xJU1RdKQogICAgICAgIHNlbGYueChBUFRfRU5WICsgWyJhcHQtZ2V0IiwgIi1xIiwgInVwZGF0ZSJdLCB0aW1lb3V0PTYwMCkKCgpkZWYgX2lzbyh0KToKICAgIHJldHVybiB0aW1lLnN0cmZ0aW1lKCIlWS0lbS0lZFQlSDolTTolU1oiLCB0aW1lLmdtdGltZSh0KSkKCgpkZWYgX3BhcnNlX2lzbyhzKToKICAgIHRyeToKICAgICAgICByZXR1cm4gY2FsZW5kYXIudGltZWdtKHRpbWUuc3RycHRpbWUocywgIiVZLSVtLSVkVCVIOiVNOiVTWiIpKQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgIHJldHVybiBOb25lCgoKY2xhc3MgS2VybmVsOgogICAgIiIiVGhlIGtlcm5lbCBsYW5lIChSLTgzNiwgYDA5YCDCpzMgZGVjaXNpb25zIDE2NCArIDE3MiwgYDExYCDCpzUuMTEpLiBSZWZ1c2FsIGNvZGVzOiBSMyAoYXV0aG9yaXR5KSwgUjQgKHJlbW92YWwpLAogICAgUjYgKGEgcGFja2FnZSBvdXRzaWRlIHRoZSBzdGVwKSwgUjggKHNwYWNlKSwgUjkgKGxvY2tzKSwgUjEyIChhcHBsaWFuY2UpLCBSMjAgKHRoZSBib3gncyBib290IHNldHVwIGNhbm5vdCBkbyBhCiAgICBvbmUtc2hvdCksIFIyMSAodGhlIGNyYXNoIGd1YXJkIGlzIHRyaXBwZWQgb3Igc2F3IGFuIHVuY2xlYW4gYm9vdCB3aXRoaW4gaXRzIHdpbmRvdyksIFIyMiAodGhlIHN0ZXAncyBwaGFzZSBkb2VzIG5vdAogICAgYWxsb3cgdGhpcyBtb2RlKSwgUjIzICh0aGUga2VybmVsIHNldCBpcyBub3Qgb25lIGV4YWN0IG5ldyBrZXJuZWwpLgoKICAgIE1vZGVzIChwbGFuICJtb2RlIiwgbGF5ZXIgImtlcm5lbCIsIGxhbmUgInNsb3ciKToKICAgICAgYXBwbHkgICAgICAgICAgU1RBR0U6IGluc3RhbGwgdGhlIGtlcm5lbCBzZXQsIGtlZXAgdGhlIEdSVUIgZGVmYXVsdCBvbiB0aGUga2VybmVsIHRoZSBib3ggcnVucywgd3JpdGUgdGhlIGZsYWcuCiAgICAgICAgICAgICAgICAgICAgIE5ldmVyIHJlYm9vdHMuIHNlbGVjdCAicGVuZGluZy1rZXJuZWwiIChyaW5nIDAsIHRoZSByb290LW93bmVkIG1hcmspIG9yICJsaXN0ZWQiIChhIHNpZ25lZAogICAgICAgICAgICAgICAgICAgICBvc19rZXJuZWxfc3RlcCkuIGV4cGVjdF9rdmVyOiB0aGUga2VybmVsIHRoZSBodWIgdG9sZCB0aGUgaG91c2Vob2xkIGFib3V0IOKAlCBhbnkgb3RoZXIgaXMgUjIzLgogICAgICBrZXJuZWwtcmVib290ICBhIFNUQUdFRCBzdGVwJ3MgcmVib290ICh0aGUgbmlnaHQgbGVnLCBhZnRlciB0aGUgaG91c2Vob2xkIHdhcyB0b2xkKTogcGhhc2Ugb25lc2hvdCwgdGhlbiByZWJvb3QuCiAgICAgIGtlcm5lbC1ib290ICAgIGFmdGVyIGEgYm9vdDogd2hhdCBiZWNhbWUgb2YgdGhlIHN0ZXAgKGp1ZGdpbmcgfCBmZWxsX2JhY2sgfCBzZWxmX3JldmVydGVkIHwgcmV2ZXJ0X2ZhaWxlZCkuCiAgICAgIGtlcm5lbC1nb29kICAgIHRoZSBvbmUtc2hvdCBib290IHdhcyBoZWFsdGh5OiB0aGUgbmV3IGtlcm5lbCBiZWNvbWVzIHRoZSBHUlVCIGRlZmF1bHQuCiAgICAgIGtlcm5lbC1yZXZlcnQgIHRoZSBvbmUtc2hvdCBib290IHdhcyBOT1QgaGVhbHRoeTogcmVib290IE9OQ0UgaW50byB0aGUgb2xkIGtlcm5lbCAoc3RpbGwgdGhlIGRlZmF1bHQpLgogICAgICBrZXJuZWwtY2FuY2VsICBkcm9wIGEgc3RhZ2VkIHN0ZXA6IGNsZWFyIHRoZSBmbGFnICh0aGUgcGFja2FnZSBzdGF5cyBpbnN0YWxsZWQsIHRoZSBkZWZhdWx0IG5ldmVyIG1vdmVkKS4KICAgICAga2VybmVsLXN0YXR1cyAgcmVhZCBvbmx5LiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcHBseSwgcGxhbik6CiAgICAgICAgc2VsZi5hLCBzZWxmLnIsIHNlbGYucGxhbiA9IGFwcGx5LCBhcHBseS5yLCBwbGFuCiAgICAgICAgc2VsZi5yZXBvcnQgPSBhcHBseS5yZXBvcnQKICAgICAgICBzZWxmLmxvZyA9IGFwcGx5LnIubG9nCgogICAgIyAtLS0tLS0tLS0tIHJlYWRpbmcgdGhlIGJveCAtLS0tLS0tLS0tCiAgICBkZWYgcnVubmluZyhzZWxmKToKICAgICAgICByYywgb3V0LCBfID0gc2VsZi5yLmhvc3QoWyJ1bmFtZSIsICItciJdLCAzMCkKICAgICAgICB2ID0gb3V0LnN0cmlwKCkgaWYgcmMgPT0gMCBlbHNlICIiCiAgICAgICAgcmV0dXJuIHYgaWYgS1ZFUl9SRS5tYXRjaCh2KSBlbHNlICIiCgogICAgZGVmIHN0YXRlKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcyA9IGpzb24ubG9hZHMoc2VsZi5yLnJlYWRfZmlsZShLRVJORUxfU1RBVEUpKQogICAgICAgICAgICByZXR1cm4gcyBpZiBpc2luc3RhbmNlKHMsIGRpY3QpIGVsc2Uge30KICAgICAgICBleGNlcHQgKE9TRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICBkZWYgc2F2ZV9zdGF0ZShzZWxmLCBzKToKICAgICAgICBzWyJ1cGRhdGVkX2F0Il0gPSBfaXNvKHNlbGYuci5ub3coKSkKICAgICAgICBzZWxmLnIucHV0X2ZpbGUoS0VSTkVMX1NUQVRFLCAoanNvbi5kdW1wcyhzLCBpbmRlbnQ9Miwgc29ydF9rZXlzPVRydWUpICsgIlxuIikuZW5jb2RlKCksIDBvNjQ0KQoKICAgIGRlZiBmbGFnKHNlbGYpOgogICAgICAgICIiIlRoZSBvbmUtc2hvdCBmbGFnOiB0aGUga2VybmVsIG5hbWVkLCAiIiB3aGVuIHRoZSBlbnYgYmxvY2sgaG9sZHMgbm9uZSwgTm9uZSB3aGVuIHRoZXJlIGlzIG5vIGVudiBibG9jay4iIiIKICAgICAgICByYywgb3V0LCBfID0gc2VsZi5yLmhvc3QoWyJncnViLWVkaXRlbnYiLCBPTkVTSE9UX0VOViwgImxpc3QiXSwgMzApCiAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBmb3IgbCBpbiBvdXQuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBpZiBsLnN0YXJ0c3dpdGgoImZlbGhvbV9uZXh0PSIpOgogICAgICAgICAgICAgICAgcmV0dXJuIGwuc3BsaXQoIj0iLCAxKVsxXS5zdHJpcCgpCiAgICAgICAgcmV0dXJuICIiCgogICAgZGVmIGdydWJfY2ZnKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuci5yZWFkX2ZpbGUoR1JVQl9DRkcpCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIHJldHVybiAiIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBkZWZhdWx0X2t2ZXIoY2ZnKToKICAgICAgICAiIiJUaGUga2VybmVsIGdydWIuY2ZnIGJvb3RzIGJ5IGRlZmF1bHQgKDAwX2hlYWRlcidzIGBzZXQgZGVmYXVsdD1gKSwgb3IgInVua25vd24iLiIiIgogICAgICAgIG0gPSByZS5zZWFyY2gocideXHMqc2V0IGRlZmF1bHQ9Iig/OmdudWxpbnV4LWFkdmFuY2VkLVtePiJdKj4pP2dudWxpbnV4LShbMC05XVteIl0qPy1wdmUpLWFkdmFuY2VkLVteIl0qIicsIGNmZywgcmUuTSkKICAgICAgICByZXR1cm4gbS5ncm91cCgxKSBpZiBtIGVsc2UgInVua25vd24iCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGVudHJ5X2lkKGNmZywga3Zlcik6CiAgICAgICAgIiIiVGhlIEdSVUJfREVGQVVMVCB2YWx1ZSB0aGF0IG5hbWVzIGt2ZXIncyBub3JtYWwgZW50cnksIHJlYWQgZnJvbSBncnViLmNmZyBpdHNlbGYgKDEwX2xpbnV4J3MgaWRzKS4iIiIKICAgICAgICBzdWIgPSByZS5zZWFyY2gociJcJG1lbnVlbnRyeV9pZF9vcHRpb24gJyhnbnVsaW51eC1hZHZhbmNlZC1bXiddKyknIiwgY2ZnKQogICAgICAgIG0gPSByZS5zZWFyY2gociJcJG1lbnVlbnRyeV9pZF9vcHRpb24gJyhnbnVsaW51eC0iICsgcmUuZXNjYXBlKGt2ZXIpICsgciItYWR2YW5jZWQtW14nXSspJyIsIGNmZykKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gZiJ7c3ViLmdyb3VwKDEpfT57bS5ncm91cCgxKX0iIGlmIHN1YiBlbHNlIG0uZ3JvdXAoMSkKCiAgICBkZWYgc2V0dXBfcHJvYmxlbXMoc2VsZik6CiAgICAgICAgIiIiUjIwOiB3aHkgdGhpcyBib3ggY2Fubm90IGRvIGEgb25lLXNob3QgYm9vdCAoZW1wdHkgPSBpdCBjYW4pLiBNZWFzdXJlZCBzaGFwZTogVUVGSSwgYSB2ZmF0IEVTUCBhdCAvYm9vdC9lZmksCiAgICAgICAgL2Jvb3Qgb24gdGhlIHJvb3QgZmlsZXN5c3RlbSwgR1JVQiB3aXRoIGZhdCArIGxvYWRlbnYsIHRoZSBidW5kbGUncyB0d28gZ2VuZXJhdG9ycywgbm8gaGFuZCBwaW4uIiIiCiAgICAgICAgd2h5ID0gW10KICAgICAgICBpZiBub3Qgc2VsZi5yLmxleGlzdHMoIi9zeXMvZmlybXdhcmUvZWZpIik6CiAgICAgICAgICAgIHdoeS5hcHBlbmQoInRoZSBib3ggZG9lcyBub3QgYm9vdCBVRUZJIikKICAgICAgICByYywgb3V0LCBfID0gc2VsZi5yLmhvc3QoWyJmaW5kbW50IiwgIi1uIiwgIi1vIiwgIkZTVFlQRSIsIEVTUF9NT1VOVF0sIDMwKQogICAgICAgIGlmIHJjICE9IDAgb3Igb3V0LnN0cmlwKCkgIT0gInZmYXQiOgogICAgICAgICAgICB3aHkuYXBwZW5kKGYie0VTUF9NT1VOVH0gaXMgbm90IGEgbW91bnRlZCB2ZmF0IEVTUCAoe291dC5zdHJpcCgpIG9yICdub3QgbW91bnRlZCd9KSIpCiAgICAgICAgcmMsIG91dCwgXyA9IHNlbGYuci5ob3N0KFsiZmluZG1udCIsICItbiIsICItbyIsICJUQVJHRVQiLCAiL2Jvb3QiXSwgMzApCiAgICAgICAgaWYgcmMgPT0gMCBhbmQgb3V0LnN0cmlwKCk6CiAgICAgICAgICAgIHdoeS5hcHBlbmQoIi9ib290IGlzIGEgc2VwYXJhdGUgZmlsZXN5c3RlbSAodGhlIG9uZS1zaG90IGVudHJpZXMgYXNzdW1lIC9ib290IG9uIHRoZSByb290IGZpbGVzeXN0ZW0pIikKICAgICAgICBmb3IgbSBpbiAoImZhdCIsICJsb2FkZW52Iik6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnIubGV4aXN0cyhmIi91c3IvbGliL2dydWIveDg2XzY0LWVmaS97bX0ubW9kIik6CiAgICAgICAgICAgICAgICB3aHkuYXBwZW5kKGYiR1JVQiBoYXMgbm8ge219IG1vZHVsZSIpCiAgICAgICAgZm9yIHAgaW4gKE9ORVNIT1RfU05JUFBFVCwgT05FU0hPVF9FTlRSSUVTKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuci5sZXhpc3RzKHApOgogICAgICAgICAgICAgICAgd2h5LmFwcGVuZChmIntwfSBpcyBtaXNzaW5nICh0aGUgY29uZmlnIGJ1bmRsZSBpbnN0YWxscyBpdCkiKQogICAgICAgIGlmIHNlbGYuci5sZXhpc3RzKEtFUk5FTF9QSU5fRklMRSk6CiAgICAgICAgICAgIHdoeS5hcHBlbmQoImEga2VybmVsIGlzIHBpbm5lZCBieSBoYW5kIChwcm94bW94LWJvb3QtdG9vbCBrZXJuZWwgcGluKSDigJQgdGhlIGxhbmUgbmV2ZXIgZmlnaHRzIGl0IikKICAgICAgICByZXR1cm4gd2h5CgogICAgZGVmIGd1YXJkKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoc2VsZi5yLnJlYWRfZmlsZShDUkFTSF9HVUFSRF9TVEFURSkpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgY2hlY2tfZ3VhcmQoc2VsZik6CiAgICAgICAgIiIiUjIxOiBhIGtlcm5lbCBzdGVwIG9ubHkgb24gYSBib3ggd2hvc2UgY3Jhc2ggZ3VhcmQgaXMgYXJtZWQgYW5kIHNhdyBubyB1bmNsZWFuIGJvb3Qgd2l0aGluIGl0cyB3aW5kb3cg4oCUIHNvCiAgICAgICAgdGhlIHN0ZXAncyBvd24gcmVib290cyAoY2xlYW4pLCBvbmUgY3Jhc2ggYW5kIG9uZSBzZWxmLXJldmVydCAoY2xlYW4pIGNhbiBuZXZlciByZWFjaCB0aGUgM3JkIHVuY2xlYW4gYm9vdCB0aGF0CiAgICAgICAgbGVhdmVzIHRoZSBib3ggb2ZmIChgMTFgIMKnNS45KS4gUGlubmVkIGJ5IHRlc3RfZmVsaG9tX2NyYXNoX2d1YXJkIEtlcm5lbFN0ZXBDYW5ub3RMZWF2ZVRoZUJveE9mZi4iIiIKICAgICAgICBnID0gc2VsZi5ndWFyZCgpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZywgZGljdCk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIyMSIsIGYibm8gY3Jhc2ggZ3VhcmQgc3RhdGUgKHtDUkFTSF9HVUFSRF9TVEFURX0pIOKAlCBhIGtlcm5lbCBzdGVwIG5lZWRzIHRoZSBndWFyZCIpCiAgICAgICAgaWYgZy5nZXQoInRyaXBwZWQiKSBvciBub3QgZy5nZXQoImFybWVkIik6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIyMSIsICJ0aGUgY3Jhc2ggZ3VhcmQgaXMgdHJpcHBlZCDigJQgbm8ga2VybmVsIHN0ZXAgdW50aWwgaXQgcmUtYXJtcyIpCiAgICAgICAgaWYgKGcuZ2V0KCJ1bmNsZWFuX2Jvb3RzX2luX3dpbmRvdyIpIG9yIDApID4gMDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIxIiwgZiJ7Zy5nZXQoJ3VuY2xlYW5fYm9vdHNfaW5fd2luZG93Jyl9IHVuY2xlYW4gYm9vdChzKSB3aXRoaW4gdGhlIGd1YXJkJ3Mgd2luZG93IOKAlCB3YWl0IikKCiAgICBkZWYgdmlldyhzZWxmLCBzdD1Ob25lLCBjZmc9Tm9uZSk6CiAgICAgICAgc3QgPSBzZWxmLnN0YXRlKCkgaWYgc3QgaXMgTm9uZSBlbHNlIHN0CiAgICAgICAgY2ZnID0gc2VsZi5ncnViX2NmZygpIGlmIGNmZyBpcyBOb25lIGVsc2UgY2ZnCiAgICAgICAgcmV0dXJuIHsicnVubmluZyI6IHNlbGYucnVubmluZygpIG9yICJ1bmtub3duIiwgImRlZmF1bHQiOiBzZWxmLmRlZmF1bHRfa3ZlcihjZmcpLCAiZmxhZyI6IHNlbGYuZmxhZygpLAogICAgICAgICAgICAgICAgInBoYXNlIjogc3QuZ2V0KCJwaGFzZSIsICJub25lIiksICJmcm9tIjogc3QuZ2V0KCJmcm9tIiksICJ0byI6IHN0LmdldCgidG8iKSwKICAgICAgICAgICAgICAgICJzdGVwX2lkIjogc3QuZ2V0KCJzdGVwX2lkIiksICJzZWxmX3JldmVydF91c2VkIjogYm9vbChzdC5nZXQoInNlbGZfcmV2ZXJ0X3VzZWQiKSksICJ2bWlkIjogc3QuZ2V0KCJ2bWlkIiksCiAgICAgICAgICAgICAgICAic3RhZ2VkX2F0Ijogc3QuZ2V0KCJzdGFnZWRfYXQiKSwgInJlYm9vdGVkX2F0Ijogc3QuZ2V0KCJyZWJvb3RlZF9hdCIpLAogICAgICAgICAgICAgICAgInJlc3VsdF9hdCI6IHN0LmdldCgicmVzdWx0X2F0IiksICJyZWFzb24iOiBzdC5nZXQoInJlYXNvbiIpfQoKICAgICMgLS0tLS0tLS0tLSB3cml0aW5nIHRoZSBib3ggLS0tLS0tLS0tLQogICAgZGVmIHdyaXRlX2RlZmF1bHQoc2VsZiwga3Zlcik6CiAgICAgICAgIiIiUGluIHRoZSBHUlVCIGRlZmF1bHQgdG8ga3ZlcidzIG5vcm1hbCBlbnRyeSwgcmVnZW5lcmF0ZSBncnViLmNmZywgYW5kIFBST1ZFIGl0ICh0aGUgZGVmYXVsdCByZWFkIGJhY2spLiIiIgogICAgICAgIGNmZyA9IHNlbGYuZ3J1Yl9jZmcoKQogICAgICAgIGVpZCA9IHNlbGYuZW50cnlfaWQoY2ZnLCBrdmVyKQogICAgICAgIGlmIG5vdCBlaWQ6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIyMCIsIGYiZ3J1Yi5jZmcgaGFzIG5vIG5vcm1hbCBlbnRyeSBmb3Ige2t2ZXJ9IikKICAgICAgICBib2R5ID0gKCIjIGZlbGhvbSBrZXJuZWwgbGFuZSAoUi04MzYsIGAxMWAgwqc1LjExKSDigJQgd3JpdHRlbiBieSBmZWxob20tb3MtYXBwbHk7IHRoZSBrZXJuZWwgdGhhdCBib290ZWQgaGVhbHRoaWx5XG4iCiAgICAgICAgICAgICAgICBmJ0dSVUJfREVGQVVMVD0ie2VpZH0iXG4nKQogICAgICAgIHNlbGYuci5wdXRfZmlsZShLRVJORUxfREVGQVVMVF9DRkcsIGJvZHkuZW5jb2RlKCksIDBvNjQ0KQogICAgICAgIHJjLCBvdXQsIGVyciA9IHNlbGYuci5ob3N0KFsidXBkYXRlLWdydWIiXSwgMzAwKQogICAgICAgIGdvdCA9IHNlbGYuZGVmYXVsdF9rdmVyKHNlbGYuZ3J1Yl9jZmcoKSkKICAgICAgICBpZiByYyAhPSAwIG9yIGdvdCAhPSBrdmVyOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjAiLCBmInVwZGF0ZS1ncnViIHJjPXtyY306IHRoZSBkZWZhdWx0IHJlYWRzIHtnb3R9LCBub3Qge2t2ZXJ9OiB7KG91dCArIGVycikuc3RyaXAoKVstMjAwOl19IikKICAgICAgICBzZWxmLmxvZyhmIm9zLWFwcGx5OiBLRVJORUwgZGVmYXVsdCA9IHtrdmVyfSAocHJvdmVkIGZyb20gZ3J1Yi5jZmcpIikKCiAgICBkZWYgc2V0X2ZsYWcoc2VsZiwga3Zlcik6CiAgICAgICAgc2VsZi5yLmhvc3QoWyJta2RpciIsICItcCIsIG9zLnBhdGguZGlybmFtZShPTkVTSE9UX0VOVildLCAzMCkKICAgICAgICBpZiBzZWxmLmZsYWcoKSBpcyBOb25lOgogICAgICAgICAgICByYywgb3V0LCBlcnIgPSBzZWxmLnIuaG9zdChbImdydWItZWRpdGVudiIsIE9ORVNIT1RfRU5WLCAiY3JlYXRlIl0sIDMwKQogICAgICAgICAgICBpZiByYyAhPSAwOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIwIiwgZiJjYW5ub3QgY3JlYXRlIHRoZSBvbmUtc2hvdCBlbnYgYmxvY2sgb24gdGhlIEVTUDogeyhvdXQgKyBlcnIpLnN0cmlwKClbLTIwMDpdfSIpCiAgICAgICAgcmMsIG91dCwgZXJyID0gc2VsZi5yLmhvc3QoWyJncnViLWVkaXRlbnYiLCBPTkVTSE9UX0VOViwgInNldCIsIGYiZmVsaG9tX25leHQ9e2t2ZXJ9Il0sIDMwKQogICAgICAgIGlmIHJjICE9IDAgb3Igc2VsZi5mbGFnKCkgIT0ga3ZlcjoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIwIiwgZiJ0aGUgb25lLXNob3QgZmxhZyBkaWQgbm90IHJlYWQgYmFjayBhcyB7a3Zlcn06IHsob3V0ICsgZXJyKS5zdHJpcCgpWy0yMDA6XX0iKQoKICAgIGRlZiBjbGVhcl9mbGFnKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZmxhZygpOgogICAgICAgICAgICBzZWxmLnIuaG9zdChbImdydWItZWRpdGVudiIsIE9ORVNIT1RfRU5WLCAidW5zZXQiLCAiZmVsaG9tX25leHQiXSwgMzApCgogICAgZGVmIHJlYm9vdChzZWxmLCB3aHkpOgogICAgICAgIHNlbGYubG9nKGYib3MtYXBwbHk6IEtFUk5FTCBSRUJPT1Qg4oCUIHt3aHl9IikKICAgICAgICByYywgb3V0LCBlcnIgPSBzZWxmLnIuaG9zdChbInN5c3RlbWN0bCIsICJyZWJvb3QiXSwgNjApCiAgICAgICAgc2VsZi5yZXBvcnRbInJlYm9vdF9yYyJdID0gcmMKICAgICAgICBpZiByYyAhPSAwOgogICAgICAgICAgICBzZWxmLnJlcG9ydFsiZmFpbGVkIl0gPSB7InJjIjogMywgInN0ZXAiOiAicmVib290IiwgInJlYXNvbiI6IChvdXQgKyBlcnIpLnN0cmlwKClbLTIwMDpdfQogICAgICAgICAgICByZXR1cm4gMwogICAgICAgIHJldHVybiAwCgogICAgIyAtLS0tLS0tLS0tIHRoZSBtb2RlcyAtLS0tLS0tLS0tCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIG1vZGUgPSBzZWxmLmEubW9kZQogICAgICAgIHNlbGYucmVwb3J0WyJrZXJuZWxfbW9kZSJdID0gbW9kZQogICAgICAgIGlmIG1vZGUgPT0gImtlcm5lbC1zdGF0dXMiOgogICAgICAgICAgICB2ID0gc2VsZi52aWV3KCkKICAgICAgICAgICAgdlsic2V0dXBfcHJvYmxlbXMiXSA9IHNlbGYuc2V0dXBfcHJvYmxlbXMoKQogICAgICAgICAgICBzZWxmLnJlcG9ydFsia2VybmVsIl0gPSB2CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZm4gPSB7ImFwcGx5Ijogc2VsZi5zdGFnZSwgImtlcm5lbC1yZWJvb3QiOiBzZWxmLnJlYm9vdF9zdGFnZWQsICJrZXJuZWwtYm9vdCI6IHNlbGYuYWZ0ZXJfYm9vdCwKICAgICAgICAgICAgICAia2VybmVsLWdvb2QiOiBzZWxmLmdvb2QsICJrZXJuZWwtcmV2ZXJ0Ijogc2VsZi5yZXZlcnQsICJrZXJuZWwtY2FuY2VsIjogc2VsZi5jYW5jZWx9W21vZGVdCiAgICAgICAgcmMgPSBmbigpCiAgICAgICAgc2VsZi5yZXBvcnRbImtlcm5lbCJdID0gc2VsZi52aWV3KCkKICAgICAgICByZXR1cm4gcmMKCiAgICBkZWYgcGhhc2VfaXMoc2VsZiwgc3QsICpwaGFzZXMpOgogICAgICAgIGlmIHN0LmdldCgicGhhc2UiKSBub3QgaW4gcGhhc2VzOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjIiLCBmInRoZSBrZXJuZWwgc3RlcCBpcyB7c3QuZ2V0KCdwaGFzZScsICdub25lJykhcn0sIG5vdCB7JyBvciAnLmpvaW4ocGhhc2VzKX0g4oCUICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiJ7c2VsZi5hLm1vZGV9IGRvZXMgbm90IGFwcGx5IikKCiAgICBkZWYgc3RhZ2Uoc2VsZik6CiAgICAgICAgYSA9IHNlbGYuYQogICAgICAgIHN0ID0gc2VsZi5zdGF0ZSgpCiAgICAgICAgaWYgc3QuZ2V0KCJwaGFzZSIpIGluIEtFUk5FTF9BQ1RJVkU6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIyMiIsIGYiYSBrZXJuZWwgc3RlcCBpcyBhbHJlYWR5IHtzdFsncGhhc2UnXX0gKHtzdC5nZXQoJ2Zyb20nKX0gLT4ge3N0LmdldCgndG8nKX0pIikKICAgICAgICBsYXN0ID0gX3BhcnNlX2lzbyhzdC5nZXQoInN0YWdlZF9hdCIpKQogICAgICAgIGlmIGxhc3QgaXMgbm90IE5vbmUgYW5kIHNlbGYuci5ub3coKSAtIGxhc3QgPCBLRVJORUxfTUlOX0dBUDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIyIiwgImEga2VybmVsIHN0ZXAgd2FzIHN0YWdlZCB3aXRoaW4gdGhlIGxhc3QgMjAgaG91cnMg4oCUIG5ldmVyIHR3byBpbiBvbmUgbmlnaHQiKQogICAgICAgIHdoeSA9IHNlbGYuc2V0dXBfcHJvYmxlbXMoKQogICAgICAgIGlmIHdoeToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIwIiwgIjsgIi5qb2luKHdoeSkpCiAgICAgICAgc2VsZi5jaGVja19ndWFyZCgpCiAgICAgICAgYS5jaGVja19ndWVzdChhLnZtaWQpCiAgICAgICAgd2hvLCBfID0gYS5kb2NrZXJfYXV0aG9yaXR5KHNlbGYucGxhbiwgb3BfbmFtZT1LRVJORUxfT1ApCiAgICAgICAgc2VsZi5yZXBvcnRbImF1dGhvcml0eSJdID0gd2hvCiAgICAgICAgb2xkID0gc2VsZi5ydW5uaW5nKCkKICAgICAgICBpZiBub3Qgb2xkOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjAiLCAidGhlIHJ1bm5pbmcga2VybmVsIGlzIG5vdCBhIFByb3htb3gga2VybmVsIHZlcnNpb24iKQogICAgICAgIHNlbGYubG9nKGYib3MtYXBwbHk6IFNUQVJUIHJlbGVhc2U9e3NlbGYucGxhbi5nZXQoJ3JlbGVhc2VfaWQnKX0gbGF5ZXI9a2VybmVsIGxhbmU9c2xvdyBtb2RlPWFwcGx5ICIKICAgICAgICAgICAgICAgICBmInNlbGVjdD17YS5zZWxlY3R9IGF1dGhvcml0eT17d2hvfSBydW5uaW5nPXtvbGR9IikKICAgICAgICBpZiBhLmFwdF9sb2NrX2hlbGQoKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjkiLCAiYW5vdGhlciBhcHQvZHBrZyBob2xkcyB0aGUgbG9jayBvbiB0aGUgaG9zdCIpCiAgICAgICAgc2VsZi5yZXBvcnRbImhlYWx0aF9iZWZvcmUiXSA9IGEuaGVhbHRoKCkKICAgICAgICBhLnJlcGFpcigpCiAgICAgICAgcmMsIG91dCwgZXJyID0gYS54KEFQVF9FTlYgKyBbImFwdC1nZXQiLCAiLXEiLCAidXBkYXRlIl0sIHRpbWVvdXQ9NjAwKQogICAgICAgIGlmIHJjICE9IDA6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI3IiwgZiJhcHQtZ2V0IHVwZGF0ZSBmYWlsZWQgb24gdGhlIGhvc3Q6IHsob3V0ICsgZXJyKS5zdHJpcCgpLnNwbGl0bGluZXMoKVstMTpdfSIpCiAgICAgICAgaW5zdCA9IGEuaW5zdGFsbGVkKCkKICAgICAgICBpZiBhLnNlbGVjdCA9PSAicGVuZGluZy1rZXJuZWwiOgogICAgICAgICAgICBfLCBwZW5kLCBfLCBfID0gYS5zaW11bGF0ZShbImRpc3QtdXBncmFkZSJdKQogICAgICAgICAgICB3YW50ID0gWyhwWyJuYW1lIl0sIHBbInRvIl0pIGZvciBwIGluIHBlbmQgaWYgcFsiZnJvbSJdIGlzIG5vdCBOb25lIGFuZCBLRVJORUxfVVBHUkFERV9SRS5tYXRjaChwWyJuYW1lIl0pCiAgICAgICAgICAgICAgICAgICAgYW5kIGEub3JpZ2luX25hbWUocFsib3JpZ2luIl0pID09IHtQVkVfT1JJR0lOfV0KICAgICAgICBlbHNlOgogICAgICAgICAgICB3YW50ID0gWyhlWyJuYW1lIl0sIGVbInZlcnNpb24iXSkgZm9yIGUgaW4gc2VsZi5wbGFuWyJwYWNrYWdlcyJdXQogICAgICAgICMgdXBncmFkZXMgb2YgaW5zdGFsbGVkIG5hbWVzIChuZXZlciBhIGRvd25ncmFkZSksIGFuZCBhdCBtb3N0IHRoZSBsaXN0ZWQgbmV3IGtlcm5lbCBpbWFnZQogICAgICAgIGFyZ3MsIHVwZyA9IFtdLCB7fQogICAgICAgIGZvciBuLCB2IGluIHdhbnQ6CiAgICAgICAgICAgIGlmIG4gaW4gaW5zdDoKICAgICAgICAgICAgICAgIGlmIGEuZHBrZ19jbXAodiwgImd0IiwgaW5zdFtuXSk6CiAgICAgICAgICAgICAgICAgICAgdXBnW25dID0gdgogICAgICAgICAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGYie259PXt2fSIpCiAgICAgICAgICAgIGVsaWYgS0VSTkVMX0lNQUdFX1JFLm1hdGNoKG4pOgogICAgICAgICAgICAgICAgYXJncy5hcHBlbmQoZiJ7bn09e3Z9IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI2IiwgZiJ7bn0gaXMgbm90IGluc3RhbGxlZCBhbmQgaXMgbm90IGEga2VybmVsIGltYWdlIikKICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgc2VsZi5yZXBvcnRbInVwZ3JhZGVkIl0sIHNlbGYucmVwb3J0WyJvdXRjb21lX2hpbnQiXSA9IFtdLCAibm90aGluZyIKICAgICAgICAgICAgc2VsZi5sb2coIm9zLWFwcGx5OiBET05FIHJjPTAgdXBncmFkZWQ9MCAobm8gcGVuZGluZyBrZXJuZWwpIikKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICByYywgc2ltLCByZW12LCB0ZXh0ID0gYS5zaW11bGF0ZShbImluc3RhbGwiLCAiLS1uby1pbnN0YWxsLXJlY29tbWVuZHMiXSArIGFyZ3MpCiAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjciLCAidGhlIHNpbXVsYXRpb24gZmFpbGVkOiAiICsgKHRleHQuc3RyaXAoKS5zcGxpdGxpbmVzKClbLTFdIGlmIHRleHQuc3RyaXAoKSBlbHNlICIiKSkKICAgICAgICBpZiByZW12OgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSNCIsIGYidGhlIGtlcm5lbCBzdGVwIHdvdWxkIHJlbW92ZSB7JywgJy5qb2luKHJlbXZbOjVdKX0iKQogICAgICAgIGltYWdlcyA9IFtdCiAgICAgICAgbGlzdGVkID0gZGljdCh3YW50KQogICAgICAgIGZvciBwIGluIHNpbToKICAgICAgICAgICAgaWYgYS5vcmlnaW5fbmFtZShwWyJvcmlnaW4iXSkgIT0ge1BWRV9PUklHSU59OgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIiLCBmIntwWyduYW1lJ119IHdvdWxkIGNvbWUgZnJvbSB7cFsnb3JpZ2luJ119LCBub3Qge1BWRV9PUklHSU4hcn0iKQogICAgICAgICAgICBtID0gS0VSTkVMX0lNQUdFX1JFLm1hdGNoKHBbIm5hbWUiXSkKICAgICAgICAgICAgaWYgcFsiZnJvbSJdIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSNiIsIGYidGhlIGtlcm5lbCBzdGVwIHdvdWxkIGFkZCB7cFsnbmFtZSddfSwgd2hpY2ggaXMgbm90IGEga2VybmVsIGltYWdlIikKICAgICAgICAgICAgICAgIGlmIGEuc2VsZWN0ID09ICJsaXN0ZWQiIGFuZCBsaXN0ZWQuZ2V0KHBbIm5hbWUiXSkgIT0gcFsidG8iXToKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjMiLCBmInRoZSBrZXJuZWwgc3RlcCB3b3VsZCBhZGQge3BbJ25hbWUnXX09e3BbJ3RvJ119LCBub3QgdGhlIHNpZ25lZCBzZXQiKQogICAgICAgICAgICAgICAgaW1hZ2VzLmFwcGVuZCgobS5ncm91cCgxKSwgcFsidG8iXSkpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBwWyJuYW1lIl0gbm90IGluIHVwZyBvciBwWyJ0byJdICE9IHVwZ1twWyJuYW1lIl1dOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjYiLCBmInRoZSBrZXJuZWwgc3RlcCB3b3VsZCB0b3VjaCB7cFsnbmFtZSddfSAoe3BbJ3RvJ119KSwgd2hpY2ggaXMgbm90IGluIHRoZSBzdGVwIikKICAgICAgICAgICAgaWYgbm90IGEuZHBrZ19jbXAocFsidG8iXSwgImd0IiwgcFsiZnJvbSJdKToKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlI1IiwgZiJ7cFsnbmFtZSddfSB3b3VsZCBiZSBkb3duZ3JhZGVkIHtwWydmcm9tJ119IC0+IHtwWyd0byddfSIpCiAgICAgICAgaWYgbGVuKGltYWdlcykgPiAxOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjMiLCBmInRoZSBrZXJuZWwgc3RlcCB3b3VsZCBhZGQge2xlbihpbWFnZXMpfSBrZXJuZWxzIOKAlCBvbmUgYXQgYSB0aW1lIikKICAgICAgICAjIHRoZSB0YXJnZXQga2VybmVsOiB0aGUgbmV3IGltYWdlLCBlbHNlIHRoZSBzZXJpZXMgbWV0YS1wYWNrYWdlJ3MgdmVyc2lvbiAoaXRzIGltYWdlIGlzIGFscmVhZHkgaW5zdGFsbGVkKQogICAgICAgIGlmIGltYWdlczoKICAgICAgICAgICAgbmV3ID0gaW1hZ2VzWzBdWzBdCiAgICAgICAgICAgIGlmIGltYWdlc1swXVsxXSArICItcHZlIiAhPSBuZXc6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjMiLCBmInRoZSBpbWFnZSB2ZXJzaW9uIHtpbWFnZXNbMF1bMV19IGRvZXMgbm90IG5hbWUgdGhlIGtlcm5lbCB7bmV3fSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YXMgPSBbKG4sIHYpIGZvciBuLCB2IGluIHVwZy5pdGVtcygpIGlmIHJlLm1hdGNoKHIiXnByb3htb3gta2VybmVsLVswLTldK1wuWzAtOV0rJCIsIG4pXQogICAgICAgICAgICBpZiBsZW4obWV0YXMpICE9IDE6CiAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydFsidXBncmFkZWQiXSwgc2VsZi5yZXBvcnRbIm91dGNvbWVfaGludCJdID0gW10sICJub3RoaW5nIgogICAgICAgICAgICAgICAgc2VsZi5sb2coIm9zLWFwcGx5OiBET05FIHJjPTAgdXBncmFkZWQ9MCAodGhlIHBlbmRpbmcgc2V0IG5hbWVzIG5vIGtlcm5lbCB0byBib290KSIpCiAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICBuZXcgPSBtZXRhc1swXVsxXSArICItcHZlIgogICAgICAgIGlmIG5vdCBLVkVSX1JFLm1hdGNoKG5ldykgb3Igbm90IGEuZHBrZ19jbXAobmV3WzotNF0sICJndCIsIG9sZFs6LTRdKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIzIiwgZiJ0aGUga2VybmVsIHtuZXd9IGlzIG5vdCBuZXdlciB0aGFuIHRoZSBydW5uaW5nIHtvbGR9IikKICAgICAgICBlayA9IHNlbGYucGxhbi5nZXQoImV4cGVjdF9rdmVyIikKICAgICAgICBpZiBlayBhbmQgZWsgIT0gbmV3OgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjMiLCBmInRoZSBzdGVwIHdvdWxkIGJvb3Qge25ld30sIGJ1dCB0aGUgaG91c2Vob2xkIHdhcyB0b2xkIGFib3V0IHtla30iKQogICAgICAgIG5lZWQgPSBhLmRvd25sb2FkX2J5dGVzKFsiaW5zdGFsbCIsICItLW5vLWluc3RhbGwtcmVjb21tZW5kcyJdICsgYXJncykKICAgICAgICBmcmVlID0gYS5mcmVlX2J5dGVzKCkKICAgICAgICBpZiBmcmVlID49IDAgYW5kIGZyZWUgPCBtYXgoTUlOX0ZSRUUsIDMgKiBuZWVkKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjgiLCBmImZyZWUgc3BhY2Uge2ZyZWV9IEIgaXMgYmVsb3cgbWF4KDUwMCBNQiwgMyB4IGRvd25sb2FkIHtuZWVkfSBCKSIpCiAgICAgICAgIyAxLiB0aGUgZGVmYXVsdCA9IHRoZSBrZXJuZWwgdGhlIGJveCBSVU5TIChpdCBib290ZWQgaGVhbHRoaWx5KSwgcHJvdmVkIGZyb20gZ3J1Yi5jZmcgQkVGT1JFIHRoZSBpbnN0YWxsCiAgICAgICAgZGVmYXVsdF9iZWZvcmUgPSBzZWxmLmRlZmF1bHRfa3ZlcihzZWxmLmdydWJfY2ZnKCkpCiAgICAgICAgc2VsZi53cml0ZV9kZWZhdWx0KG9sZCkKICAgICAgICAjIDIuIGluc3RhbGwgKHRoZSBrZXJuZWwncyBvd24gcG9zdGluc3QgcnVucyB1cGRhdGUtZ3J1Yjsgb3VyIGRlZmF1bHQgZmlsZSBrZWVwcyB0aGUgZGVmYXVsdCBvbiBgb2xkYCkKICAgICAgICB0MCA9IHRpbWUudGltZSgpCiAgICAgICAgcmMsIG91dCwgZXJyID0gYS54KEFQVF9FTlYgKyBbImFwdC1nZXQiLCAiLXkiLCAiLXEiXSArIERQS0dfT1BUUyArIFsiaW5zdGFsbCIsICItLW5vLWluc3RhbGwtcmVjb21tZW5kcyJdICsgYXJncykKICAgICAgICBhLngoWyJhcHQtZ2V0IiwgImNsZWFuIl0pCiAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgXywgYXVkLCBfID0gYS54KFsiZHBrZyIsICItLWF1ZGl0Il0pCiAgICAgICAgICAgIHNlbGYucmVwb3J0WyJmYWlsZWQiXSA9IHsicmMiOiByYywgInN0ZXAiOiAiaW5zdGFsbCIsICJkcGtnX2F1ZGl0IjogKGF1ZC5zdHJpcCgpLnNwbGl0bGluZXMoKSBvciBbImNsZWFuIl0pWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhaWwiOiAob3V0ICsgZXJyKS5zdHJpcCgpLnNwbGl0bGluZXMoKVstMzpdfQogICAgICAgICAgICBzZWxmLmxvZyhmIm9zLWFwcGx5OiBGQUlMRUQgcmM9e3JjfSBzdGVwPWluc3RhbGwgKHRoZSBkZWZhdWx0IHN0YXlzIHtvbGR9OyBubyBmbGFnIHdyaXR0ZW4pIikKICAgICAgICAgICAgcmV0dXJuIDMKICAgICAgICBzZWxmLnJlcG9ydFsidXBncmFkZWQiXSA9IFt7Im5hbWUiOiB4LnNwbGl0KCI9IiwgMSlbMF0sICJ2ZXJzaW9uIjogeC5zcGxpdCgiPSIsIDEpWzFdfSBmb3IgeCBpbiBhcmdzXQogICAgICAgIHNlbGYucmVwb3J0WyJzZWNvbmRzIl0gPSByb3VuZCh0aW1lLnRpbWUoKSAtIHQwLCAxKQogICAgICAgICMgMy4gcHJvdmU6IHRoZSBpbWFnZSBpcyB0aGVyZSwgdGhlIGRlZmF1bHQgaXMgc3RpbGwgYG9sZGAsIHRoZSBvbmUtc2hvdCBlbnRyeSBmb3IgYG5ld2AgZXhpc3RzCiAgICAgICAgY2ZnID0gc2VsZi5ncnViX2NmZygpCiAgICAgICAgaWYgZiJmZWxob20tb25lc2hvdC17bmV3fSIgbm90IGluIGNmZyBvciBzZWxmLmRlZmF1bHRfa3ZlcihjZmcpICE9IG9sZDoKICAgICAgICAgICAgc2VsZi5yLmhvc3QoWyJ1cGRhdGUtZ3J1YiJdLCAzMDApCiAgICAgICAgICAgIGNmZyA9IHNlbGYuZ3J1Yl9jZmcoKQogICAgICAgIGZvciBmIGluIChmIi9ib290L3ZtbGludXote25ld30iLCBmIi9ib290L2luaXRyZC5pbWcte25ld30iKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuci5sZXhpc3RzKGYpOgogICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRbImZhaWxlZCJdID0geyJyYyI6IDMsICJzdGVwIjogInZlcmlmeSIsICJyZWFzb24iOiBmIntmfSBpcyBtaXNzaW5nIGFmdGVyIHRoZSBpbnN0YWxsIn0KICAgICAgICAgICAgICAgIHJldHVybiAzCiAgICAgICAgaWYgZiJmZWxob20tb25lc2hvdC17bmV3fSIgbm90IGluIGNmZyBvciAiZmVsaG9tX25leHQiIG5vdCBpbiBjZmc6CiAgICAgICAgICAgIHNlbGYucmVwb3J0WyJmYWlsZWQiXSA9IHsicmMiOiAzLCAic3RlcCI6ICJ2ZXJpZnkiLCAicmVhc29uIjogZiJncnViLmNmZyBoYXMgbm8gb25lLXNob3QgZW50cnkgZm9yIHtuZXd9In0KICAgICAgICAgICAgcmV0dXJuIDMKICAgICAgICBpZiBzZWxmLmRlZmF1bHRfa3ZlcihjZmcpICE9IG9sZDoKICAgICAgICAgICAgc2VsZi5yZXBvcnRbImZhaWxlZCJdID0geyJyYyI6IDMsICJzdGVwIjogInZlcmlmeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhc29uIjogZiJ0aGUgaW5zdGFsbCBtb3ZlZCB0aGUgZGVmYXVsdCB0byB7c2VsZi5kZWZhdWx0X2t2ZXIoY2ZnKX0g4oCUIG5vIGZsYWcgd3JpdHRlbiJ9CiAgICAgICAgICAgIHJldHVybiAzCiAgICAgICAgIyA0LiB0aGUgZmxhZyDigJQgdGhlIE9OTFkgdGhpbmcgdGhhdCBtYWtlcyB0aGUgbmV4dCBib290IHVzZSBgbmV3YCwgYW5kIG9ubHkgb25jZQogICAgICAgIHNlbGYuc2V0X2ZsYWcobmV3KQogICAgICAgIHNlbGYuc2F2ZV9zdGF0ZSh7InBoYXNlIjogInN0YWdlZCIsICJzdGVwX2lkIjogc2VsZi5wbGFuLmdldCgicmVsZWFzZV9pZCIpLCAiZnJvbSI6IG9sZCwgInRvIjogbmV3LCAidm1pZCI6IGEudm1pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZWRfYXQiOiBfaXNvKHNlbGYuci5ub3coKSksICJhdXRob3JpdHkiOiB3aG8sICJkZWZhdWx0X2JlZm9yZSI6IGRlZmF1bHRfYmVmb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2VzIjogc2VsZi5yZXBvcnRbInVwZ3JhZGVkIl0sICJzZWxmX3JldmVydF91c2VkIjogRmFsc2V9KQogICAgICAgIHNlbGYucmVwb3J0WyJyZWJvb3RfbmVlZGVkIl0gPSBUcnVlCiAgICAgICAgc2VsZi5sb2coZiJvcy1hcHBseTogS0VSTkVMIFNUQUdFRCB7b2xkfSAtPiB7bmV3fSAoZGVmYXVsdCB7b2xkfSwgb25lLXNob3QgZmxhZyB7bmV3fSk7IHVwZ3JhZGVkPXtsZW4oYXJncyl9ICIKICAgICAgICAgICAgICAgICBmInNlY29uZHM9e3NlbGYucmVwb3J0WydzZWNvbmRzJ119IikKICAgICAgICByZXR1cm4gMAoKICAgIGRlZiByZWJvb3Rfc3RhZ2VkKHNlbGYpOgogICAgICAgIHN0ID0gc2VsZi5zdGF0ZSgpCiAgICAgICAgc2VsZi5waGFzZV9pcyhzdCwgInN0YWdlZCIpCiAgICAgICAgaWYgc2VsZi5mbGFnKCkgIT0gc3QuZ2V0KCJ0byIpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjIiLCBmInRoZSBvbmUtc2hvdCBmbGFnIHJlYWRzIHtzZWxmLmZsYWcoKSFyfSwgbm90IHtzdC5nZXQoJ3RvJykhcn0iKQogICAgICAgIGlmIHNlbGYucnVubmluZygpICE9IHN0LmdldCgiZnJvbSIpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjIiLCBmInRoZSBib3ggcnVucyB7c2VsZi5ydW5uaW5nKCkhcn0sIG5vdCB0aGUgc3RlcCdzIG9sZCBrZXJuZWwge3N0LmdldCgnZnJvbScpIXJ9IikKICAgICAgICBjZmcgPSBzZWxmLmdydWJfY2ZnKCkKICAgICAgICBpZiBzZWxmLmRlZmF1bHRfa3ZlcihjZmcpICE9IHN0WyJmcm9tIl0gb3IgZiJmZWxob20tb25lc2hvdC17c3RbJ3RvJ119IiBub3QgaW4gY2ZnOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjAiLCAiZ3J1Yi5jZmcgbm8gbG9uZ2VyIGtlZXBzIHRoZSBvbGQgZGVmYXVsdCB3aXRoIGEgb25lLXNob3QgZW50cnkgZm9yIHRoZSBuZXcga2VybmVsIikKICAgICAgICBpZiBzZWxmLnNldHVwX3Byb2JsZW1zKCk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIyMCIsICI7ICIuam9pbihzZWxmLnNldHVwX3Byb2JsZW1zKCkpKQogICAgICAgIHNlbGYuY2hlY2tfZ3VhcmQoKQogICAgICAgIHNlbGYuYS5jaGVja19ndWVzdChzZWxmLmEudm1pZCkKICAgICAgICBzdFsiaGVhbHRoX2JlZm9yZSJdID0gc2VsZi5hLmhlYWx0aCgpCiAgICAgICAgc3RbInBoYXNlIl0sIHN0WyJyZWJvb3RlZF9hdCJdID0gIm9uZXNob3QiLCBfaXNvKHNlbGYuci5ub3coKSkKICAgICAgICBzZWxmLnNhdmVfc3RhdGUoc3QpCiAgICAgICAgcmV0dXJuIHNlbGYucmVib290KGYib25lLXNob3QgYm9vdCBvZiB7c3RbJ3RvJ119ICh0aGUgZGVmYXVsdCBzdGF5cyB7c3RbJ2Zyb20nXX0pIikKCiAgICBkZWYgYWZ0ZXJfYm9vdChzZWxmKToKICAgICAgICBzdCA9IHNlbGYuc3RhdGUoKQogICAgICAgIHBoLCBydW4gPSBzdC5nZXQoInBoYXNlIiksIHNlbGYucnVubmluZygpCiAgICAgICAgb2xkLCBuZXcgPSBzdC5nZXQoImZyb20iKSwgc3QuZ2V0KCJ0byIpCiAgICAgICAgZXZlbnQgPSAibm9uZSIKICAgICAgICBpZiBwaCBpbiAoIm9uZXNob3QiLCAic3RhZ2VkIiwgImp1ZGdpbmciKSBhbmQgcnVuID09IG5ldyBhbmQgbmV3OgogICAgICAgICAgICBpZiBwaCAhPSAianVkZ2luZyI6CiAgICAgICAgICAgICAgICBzdFsicGhhc2UiXSwgc3RbImp1ZGdpbmdfc2luY2UiXSwgZXZlbnQgPSAianVkZ2luZyIsIF9pc28oc2VsZi5yLm5vdygpKSwgImp1ZGdpbmciCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBldmVudCA9ICJqdWRnaW5nIgogICAgICAgIGVsaWYgcGggaW4gKCJvbmVzaG90IiwgImp1ZGdpbmciKSBhbmQgcnVuID09IG9sZDoKICAgICAgICAgICAgIyB0aGUgbmV3IGtlcm5lbCBkaWQgbm90IGNvbWUgdXAsIG9yIGNyYXNoZWQ6IEdSVUIgYWxyZWFkeSBib290ZWQgdGhlIGRlZmF1bHQgKHRoZSBvbGQga2VybmVsKQogICAgICAgICAgICBzZWxmLmNsZWFyX2ZsYWcoKQogICAgICAgICAgICBzdFsicGhhc2UiXSwgc3RbInJlc3VsdF9hdCJdLCBldmVudCA9ICJmZWxsX2JhY2siLCBfaXNvKHNlbGYuci5ub3coKSksICJmZWxsX2JhY2siCiAgICAgICAgICAgIHN0WyJyZWFzb24iXSA9ICJ0aGUgYm94IGNhbWUgYmFjayBvbiB0aGUgb2xkIGtlcm5lbCBieSBpdHNlbGYgKHRoZSBuZXcgb25lIGRpZCBub3QgYm9vdCwgb3IgY3Jhc2hlZCkiCiAgICAgICAgZWxpZiBwaCA9PSAicmV2ZXJ0aW5nIiBhbmQgcnVuID09IG9sZDoKICAgICAgICAgICAgc3RbInBoYXNlIl0sIHN0WyJyZXN1bHRfYXQiXSwgZXZlbnQgPSAic2VsZl9yZXZlcnRlZCIsIF9pc28oc2VsZi5yLm5vdygpKSwgInNlbGZfcmV2ZXJ0ZWQiCiAgICAgICAgZWxpZiBwaCA9PSAicmV2ZXJ0aW5nIiBhbmQgcnVuID09IG5ldzoKICAgICAgICAgICAgc3RbInBoYXNlIl0sIHN0WyJyZXN1bHRfYXQiXSwgZXZlbnQgPSAicmV2ZXJ0X2ZhaWxlZCIsIF9pc28oc2VsZi5yLm5vdygpKSwgInJldmVydF9mYWlsZWQiCiAgICAgICAgICAgIHN0WyJyZWFzb24iXSA9ICJ0aGUgc2VsZi1yZXZlcnQgY2FtZSBiYWNrIG9uIHRoZSBORVcga2VybmVsIOKAlCBuZXZlciByZXRyaWVkIChvbmUgc2VsZi1yZXZlcnQgcGVyIHN0ZXApIgogICAgICAgIGlmIGV2ZW50IG5vdCBpbiAoIm5vbmUiLCkgYW5kIHN0LmdldCgicGhhc2UiKSAhPSBwaDoKICAgICAgICAgICAgc2VsZi5zYXZlX3N0YXRlKHN0KQogICAgICAgICAgICBzZWxmLmxvZyhmIm9zLWFwcGx5OiBLRVJORUwgQUZURVItQk9PVCB7cGh9IC0+IHtzdFsncGhhc2UnXX0gcnVubmluZz17cnVufSAoe29sZH0gLT4ge25ld30pIikKICAgICAgICBzZWxmLnJlcG9ydFsia2VybmVsX2V2ZW50Il0gPSBldmVudAogICAgICAgIGlmIGV2ZW50ID09ICJqdWRnaW5nIjoKICAgICAgICAgICAgc2VsZi5yZXBvcnRbImhlYWx0aF9iZWZvcmUiXSA9IHN0LmdldCgiaGVhbHRoX2JlZm9yZSIpICAjIHRoZSBhZ2VudCBqdWRnZXMgdGhlIGJvb3QgYWdhaW5zdCBpdAogICAgICAgIHJldHVybiAwCgogICAgZGVmIGdvb2Qoc2VsZik6CiAgICAgICAgc3QgPSBzZWxmLnN0YXRlKCkKICAgICAgICBzZWxmLnBoYXNlX2lzKHN0LCAianVkZ2luZyIpCiAgICAgICAgaWYgc2VsZi5ydW5uaW5nKCkgIT0gc3QuZ2V0KCJ0byIpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjIiLCBmInRoZSBib3ggcnVucyB7c2VsZi5ydW5uaW5nKCkhcn0sIG5vdCB0aGUgbmV3IGtlcm5lbCB7c3QuZ2V0KCd0bycpIXJ9IikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfZGVmYXVsdChzdFsidG8iXSkKICAgICAgICBleGNlcHQgUmVmdXNlZDoKICAgICAgICAgICAgIyBwdXQgdGhlIG9sZCBkZWZhdWx0IGJhY2sg4oCUIHRoZSBib3ggbXVzdCBuZXZlciBiZSBsZWZ0IHdpdGhvdXQgYSBwcm92ZWQgZGVmYXVsdAogICAgICAgICAgICBzZWxmLndyaXRlX2RlZmF1bHQoc3RbImZyb20iXSkKICAgICAgICAgICAgcmFpc2UKICAgICAgICBzZWxmLmNsZWFyX2ZsYWcoKQogICAgICAgIHN0WyJwaGFzZSJdLCBzdFsicmVzdWx0X2F0Il0gPSAiZ29vZCIsIF9pc28oc2VsZi5yLm5vdygpKQogICAgICAgIHNlbGYuc2F2ZV9zdGF0ZShzdCkKICAgICAgICBzZWxmLmxvZyhmIm9zLWFwcGx5OiBLRVJORUwgR09PRCB7c3RbJ3RvJ119IGlzIHRoZSBkZWZhdWx0IG5vdyAod2FzIHtzdFsnZnJvbSddfSkiKQogICAgICAgIHJldHVybiAwCgogICAgZGVmIHJldmVydChzZWxmKToKICAgICAgICBzdCA9IHNlbGYuc3RhdGUoKQogICAgICAgIHNlbGYucGhhc2VfaXMoc3QsICJqdWRnaW5nIikKICAgICAgICBpZiBzdC5nZXQoInNlbGZfcmV2ZXJ0X3VzZWQiKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIyIiwgInRoaXMga2VybmVsIHN0ZXAgYWxyZWFkeSB1c2VkIGl0cyBvbmUgc2VsZi1yZXZlcnQiKQogICAgICAgIGlmIHNlbGYucnVubmluZygpICE9IHN0LmdldCgidG8iKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjIyIiwgZiJ0aGUgYm94IHJ1bnMge3NlbGYucnVubmluZygpIXJ9LCBub3QgdGhlIG5ldyBrZXJuZWwge3N0LmdldCgndG8nKSFyfSIpCiAgICAgICAgc2VsZi5jbGVhcl9mbGFnKCkKICAgICAgICBjZmcgPSBzZWxmLmdydWJfY2ZnKCkKICAgICAgICBpZiBzZWxmLmRlZmF1bHRfa3ZlcihjZmcpICE9IHN0LmdldCgiZnJvbSIpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMjAiLCBmInRoZSBHUlVCIGRlZmF1bHQgcmVhZHMge3NlbGYuZGVmYXVsdF9rdmVyKGNmZyl9LCBub3QgdGhlIG9sZCB7c3QuZ2V0KCdmcm9tJyl9IOKAlCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYibm8gc2VsZi1yZXZlcnQgaW50byBhbiB1bmtub3duIGtlcm5lbCIpCiAgICAgICAgcmVhc29uID0gc2VsZi5wbGFuLmdldCgicmVhc29uIikKICAgICAgICBzdFsicmVhc29uIl0gPSByZWFzb25bOjMwMF0gaWYgaXNpbnN0YW5jZShyZWFzb24sIHN0cikgZWxzZSAidGhlIG9uZS1zaG90IGJvb3Qgd2FzIG5vdCBoZWFsdGh5IgogICAgICAgIHN0WyJzZWxmX3JldmVydF91c2VkIl0sIHN0WyJwaGFzZSJdLCBzdFsicmV2ZXJ0ZWRfYXQiXSA9IFRydWUsICJyZXZlcnRpbmciLCBfaXNvKHNlbGYuci5ub3coKSkKICAgICAgICBzZWxmLnNhdmVfc3RhdGUoc3QpCiAgICAgICAgcmV0dXJuIHNlbGYucmVib290KGYic2VsZi1yZXZlcnQgdG8ge3N0Wydmcm9tJ119OiB7c3RbJ3JlYXNvbiddfSIpCgogICAgZGVmIGNhbmNlbChzZWxmKToKICAgICAgICBzdCA9IHNlbGYuc3RhdGUoKQogICAgICAgIHNlbGYucGhhc2VfaXMoc3QsICJzdGFnZWQiKQogICAgICAgIHNlbGYuY2xlYXJfZmxhZygpCiAgICAgICAgc3RbInBoYXNlIl0sIHN0WyJyZXN1bHRfYXQiXSwgc3RbInJlYXNvbiJdID0gImNhbmNlbGxlZCIsIF9pc28oc2VsZi5yLm5vdygpKSwgImNhbmNlbGxlZCBiZWZvcmUgdGhlIHJlYm9vdCIKICAgICAgICBzZWxmLnNhdmVfc3RhdGUoc3QpCiAgICAgICAgc2VsZi5sb2coZiJvcy1hcHBseTogS0VSTkVMIENBTkNFTExFRCB7c3QuZ2V0KCd0bycpfSAoaW5zdGFsbGVkLCBuZXZlciB0aGUgZGVmYXVsdDsgZmxhZyBjbGVhcmVkKSIpCiAgICAgICAgcmV0dXJuIDAKCgpjbGFzcyBCdW5kbGU6CiAgICAiIiJUaGUgY29uZmlnIGJ1bmRsZSAoUi04NDAsIGAxMWAgwqc1LjQuMik6IGV2ZXJ5IHJvb3Qtb3duZWQgZmlsZSB0aGUgaW5zdGFsbGVyJ3Mgc3RlcCA1IHdyaXRlcywgaW5zdGFsbGVkIGFzIE9ORQogICAgc2lnbmVkIHVuaXQuIEV2ZXJ5IGNoZWNrIHJ1bnMgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZTsgYSBmYWlsZWQgd3JpdGUgb3IgYSBmYWlsZWQgc2VsZi1jaGVjayBwdXRzIGV2ZXJ5IHByZXZpb3VzCiAgICBjb3B5IGJhY2suIFJlZnVzYWwgY29kZXM6IFIxICh0aGUgYnVuZGxlIGZpbGUpLCBSMyAoYXV0aG9yaXR5KSwgUjE2IChhIHBhdGggb3V0c2lkZSBCVU5ETEVfRklMRVMpLCBSMTcgKGEgdHJ1c3QKICAgIGZpbGUpLCBSMTggKGEgY29udGVudCBjaGVjayBvciBhIHdyb25nIHNoYSkuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFwcGx5KToKICAgICAgICBzZWxmLmEsIHNlbGYuciA9IGFwcGx5LCBhcHBseS5yCiAgICAgICAgc2VsZi5yZXBvcnQgPSBhcHBseS5yZXBvcnQKCiAgICAjIC0tLS0tLS0tLS0gcmVhZGluZyBhbmQgY2hlY2tpbmcgLS0tLS0tLS0tLQogICAgZGVmIGxvYWRfZmlsZShzZWxmLCBwYXRoKToKICAgICAgICBkLCBiYXNlID0gb3MucGF0aC5kaXJuYW1lKHBhdGggb3IgIiIpLCBvcy5wYXRoLmJhc2VuYW1lKHBhdGggb3IgIiIpCiAgICAgICAgaWYgZCAhPSBQTEFOX0RJUiBvciBub3QgQlVORExFX1JFLm1hdGNoKGJhc2UpIG9yICIuLiIgaW4gcGF0aDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjEiLCBmInRoZSBidW5kbGUgbXVzdCBiZSB7UExBTl9ESVJ9L2J1bmRsZS08dmVyc2lvbj4uanNvbiwgZ290IHtwYXRoIXJ9IikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0ID0gc2VsZi5yLnN0YXQocGF0aCkKICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMSIsIGYiY2Fubm90IHN0YXQgdGhlIGJ1bmRsZToge2V9IikKICAgICAgICBpZiBub3Qgc3RhdC5TX0lTUkVHKHN0LnN0X21vZGUpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMSIsICJ0aGUgYnVuZGxlIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSIpCiAgICAgICAgaWYgc3Quc3RfdWlkICE9IHNlbGYuci5hZ2VudF91aWQoKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjEiLCBmInRoZSBidW5kbGUgaXMgbm90IG93bmVkIGJ5IHtBR0VOVF9VU0VSfSIpCiAgICAgICAgaWYgc3Quc3Rfc2l6ZSA+IEJVTkRMRV9NQVhfQllURVM6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxIiwgInRoZSBidW5kbGUgaXMgbGFyZ2VyIHRoYW4gNCBNQiIpCiAgICAgICAgcmV0dXJuIHNlbGYuci5yZWFkX2J5dGVzKHBhdGgpCgogICAgZGVmIHBhcnNlKHNlbGYsIGRhdGEsIHdhbnRfc2hhLCB3YW50X3ZlcnNpb249Tm9uZSk6CiAgICAgICAgIiIiVGhlIGJ1bmRsZSBieXRlcyDihpIgWyhkZXN0LCBjb250ZW50LCBtb2RlLCBjaGVjaywgcG9saWN5KV0sIGV2ZXJ5IGNvbnRlbnQgY2hlY2sgcGFzc2VkLiBOb3RoaW5nIGlzIHdyaXR0ZW4uIiIiCiAgICAgICAgaW1wb3J0IGJhc2U2NAogICAgICAgIGdvdCA9IHNoYTI1Nl9oZXgoZGF0YSkKICAgICAgICBpZiBnb3QgIT0gd2FudF9zaGE6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxOCIsIGYidGhlIGJ1bmRsZSdzIHNoYTI1NiBpcyB7Z290fSwgbm90IHRoZSBwaW5uZWQge3dhbnRfc2hhfSIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBiID0ganNvbi5sb2FkcyhkYXRhKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxOCIsIGYidGhlIGJ1bmRsZSBpcyBub3QgSlNPTjoge2V9IikKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShiLCBkaWN0KSBvciBiLmdldCgiZm9ybWF0IikgIT0gQlVORExFX0ZPUk1BVDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ0aGUgYnVuZGxlIGZvcm1hdCBpcyBub3Qge0JVTkRMRV9GT1JNQVR9IikKICAgICAgICB2ZXIgPSBiLmdldCgiYWdlbnRfdmVyc2lvbiIpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyLCBzdHIpIG9yIG5vdCByZS5tYXRjaChyIl5bMC05XStcLlswLTldK1wuWzAtOV0rKC1bMC05QS1aYS16Ll0rKT8kIiwgdmVyKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ0aGUgYnVuZGxlIG5hbWVzIG5vIGFnZW50IHZlcnNpb24gKHt2ZXIhcn0pIikKICAgICAgICBpZiB3YW50X3ZlcnNpb24gaXMgbm90IE5vbmUgYW5kIHZlciAhPSB3YW50X3ZlcnNpb246CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxOCIsIGYidGhlIGJ1bmRsZSBpcyBmb3IgYWdlbnQge3Zlcn0sIHRoZSBzaWduZWQgam9iIHBpbnMge3dhbnRfdmVyc2lvbn0iKQogICAgICAgIGZpbGVzID0gYi5nZXQoImZpbGVzIikKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmaWxlcywgbGlzdCkgb3Igbm90IGZpbGVzOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTgiLCAidGhlIGJ1bmRsZSBsaXN0cyBubyBmaWxlcyIpCiAgICAgICAgb3V0LCBzZWVuID0gW10sIHNldCgpCiAgICAgICAgZm9yIGUgaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGUsIGRpY3QpIG9yIG5vdCBpc2luc3RhbmNlKGUuZ2V0KCJwYXRoIiksIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTgiLCAiYSBidW5kbGUgZW50cnkgaGFzIG5vIHBhdGgiKQogICAgICAgICAgICBkZXN0ID0gZVsicGF0aCJdCiAgICAgICAgICAgIGlmIGRlc3QgaW4gVFJVU1RfUEFUSFM6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTciLCBmIntkZXN0fSBpcyB0aGUgdHJ1c3Qgcm9vdCDigJQgbm8gYnVuZGxlIG1heSBhZGQsIHJlbW92ZSBvciBjaGFuZ2UgYSBzaWduZXIiKQogICAgICAgICAgICBpZiBkZXN0IG5vdCBpbiBCVU5ETEVfREVTVFM6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTYiLCBmIntkZXN0fSBpcyBub3QgYSBwYXRoIGEgYnVuZGxlIG1heSB3cml0ZSIpCiAgICAgICAgICAgIGlmIGRlc3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxOCIsIGYie2Rlc3R9IGlzIG5hbWVkIHR3aWNlIikKICAgICAgICAgICAgc2Vlbi5hZGQoZGVzdCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29udGVudCA9IGJhc2U2NC5iNjRkZWNvZGUoZS5nZXQoImNvbnRlbnRfYjY0IiwgIiIpLCB2YWxpZGF0ZT1UcnVlKQogICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTgiLCBmIntkZXN0fTogdGhlIGNvbnRlbnQgaXMgbm90IGJhc2U2NCIpCiAgICAgICAgICAgIGlmIHNoYTI1Nl9oZXgoY29udGVudCkgIT0gZS5nZXQoInNoYTI1NiIpOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ7ZGVzdH06IHRoZSBjb250ZW50IGRvZXMgbm90IG1hdGNoIGl0cyBzaGEyNTYiKQogICAgICAgICAgICBfLCBfLCBtb2RlLCBjaGVjaywgcG9saWN5ID0gQlVORExFX0RFU1RTW2Rlc3RdCiAgICAgICAgICAgIHNlbGYuY2hlY2tfY29udGVudChkZXN0LCBjaGVjaywgY29udGVudCkKICAgICAgICAgICAgb3V0LmFwcGVuZCgoZGVzdCwgY29udGVudCwgbW9kZSwgY2hlY2ssIHBvbGljeSkpCiAgICAgICAgb3JkZXIgPSBbeFswXSBmb3IgeCBpbiBCVU5ETEVfRklMRVNdCiAgICAgICAgb3V0LnNvcnQoa2V5PWxhbWJkYSB4OiBvcmRlci5pbmRleCh4WzBdKSkgICMgdGhlIHRhYmxlJ3Mgb3JkZXI6IHRoZSBzdWRvZXJzIGZpbGVzIGxhc3QKICAgICAgICByZXR1cm4gdmVyLCBvdXQKCiAgICBkZWYgY2hlY2tfY29udGVudChzZWxmLCBkZXN0LCBjaGVjaywgY29udGVudCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB0ZXh0ID0gY29udGVudC5kZWNvZGUoInV0Zi04IikKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTgiLCBmIntkZXN0fSBpcyBub3QgVVRGLTggdGV4dCIpCiAgICAgICAgaWYgY2hlY2sgaW4gKCJzdWRvZXJzIiwgInNoIiwgImJhc2giLCAibmZ0Iik6CiAgICAgICAgICAgIHJjLCBtc2cgPSBzZWxmLnIuY2hlY2tfY29udGVudChjaGVjaywgY29udGVudCkKICAgICAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxOCIsIGYie2Rlc3R9IGZhaWxzIGl0cyB7Y2hlY2t9IGNoZWNrOiB7bXNnfSIpCiAgICAgICAgZWxpZiBjaGVjayA9PSAicHl0aG9uIjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29tcGlsZSh0ZXh0LCBkZXN0LCAiZXhlYyIpCiAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ7ZGVzdH0gaXMgbm90IHZhbGlkIFB5dGhvbjoge2V9IikKICAgICAgICBlbGlmIGNoZWNrIGluICgidW5pdCIsICJ1bml0LW5vcnQiLCAiYWdlbnQtdW5pdCIsICJkcm9waW4iKToKICAgICAgICAgICAgaWYgbm90IHJlLnNlYXJjaChyIl5cWyhVbml0fFNlcnZpY2V8VGltZXIpXF1ccyokIiwgdGV4dCwgcmUuTSk6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTgiLCBmIntkZXN0fSBoYXMgbm8gW1VuaXRdL1tTZXJ2aWNlXS9bVGltZXJdIHNlY3Rpb24iKQogICAgICAgICAgICBpZiBjaGVjayA9PSAidW5pdC1ub3J0IiBhbmQgcmUuc2VhcmNoKHIiXlxzKlJ1bnRpbWVEaXJlY3Rvcnlccyo9IiwgdGV4dCwgcmUuTSB8IHJlLkkpOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ7ZGVzdH0gZGVjbGFyZXMgUnVudGltZURpcmVjdG9yeT0g4oCUIHRoZSBHMSBpbmNpZGVudDsgcmVmdXNlZCIpCiAgICAgICAgICAgIGlmIGNoZWNrID09ICJhZ2VudC11bml0IiBhbmQgbm90IHJlLnNlYXJjaChyIl5Vc2VyPSIgKyBBR0VOVF9VU0VSICsgciJccyokIiwgdGV4dCwgcmUuTSk6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTgiLCBmIntkZXN0fSBkb2VzIG5vdCBydW4gdGhlIGFnZW50IGFzIHtBR0VOVF9VU0VSfSIpCiAgICAgICAgICAgIGlmIGNoZWNrID09ICJkcm9waW4iIGFuZCBub3QgcmUuc2VhcmNoKHIiXlxbVW5pdFxdXHMqJCIsIHRleHQsIHJlLk0pOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ7ZGVzdH0gbXVzdCBrZWVwIGl0cyBzdGFydCBsaW1pdHMgaW4gW1VuaXRdIChTRi0zKSIpCiAgICAgICAgIyBUaGUgcm91dGUgbXVzdCBzdXJ2aXZlIHRoZSBidW5kbGU6IGEgc3Vkb2VycyB3aXRob3V0IHRoaXMgd3JhcHBlcidzIGxpbmUsIG9yIGEgd3JhcHBlciB3aXRob3V0IHRoZSBidW5kbGUKICAgICAgICAjIG1vZGUsIHdvdWxkIGN1dCB0aGUgYm94IG9mZiBmcm9tIGV2ZXJ5IGxhdGVyIGJ1bmRsZS4KICAgICAgICBpZiBkZXN0ID09ICIvZXRjL3N1ZG9lcnMuZC9mZWxob20tYWdlbnQiIGFuZCBTRUxGX0NIRUNLX1NVRE9fTElORSBub3QgaW4gdGV4dDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgInRoZSBuZXcgc3Vkb2VycyBubyBsb25nZXIgbGV0cyB0aGUgYWdlbnQgY2FsbCBmZWxob20tb3MtYXBwbHkg4oCUIHRoZSBidW5kbGUgcm91dGUgd291bGQgZW5kIikKICAgICAgICBpZiBkZXN0ID09ICIvdXNyL2xvY2FsL3NiaW4vZmVsaG9tLW9zLWFwcGx5IiBhbmQgZidCVU5ETEVfT1AgPSAie0JVTkRMRV9PUH0iJyBub3QgaW4gdGV4dDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgInRoZSBuZXcgZmVsaG9tLW9zLWFwcGx5IGhhcyBubyBidW5kbGUgbW9kZSDigJQgdGhlIGJ1bmRsZSByb3V0ZSB3b3VsZCBlbmQiKQoKICAgIGRlZiBsaXZlKHNlbGYsIGRlc3QpOgogICAgICAgICIiIihieXRlcyBvciBOb25lLCBtb2RlIG9yIE5vbmUsIHVpZCBvciBOb25lKSBvZiB3aGF0IHRoZSBib3ggaGFzIG5vdy4iIiIKICAgICAgICBpZiBub3Qgc2VsZi5yLmxleGlzdHMoZGVzdCk6CiAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lLCBOb25lCiAgICAgICAgc3QgPSBzZWxmLnIuc3RhdChkZXN0KQogICAgICAgIGlmIG5vdCBzdGF0LlNfSVNSRUcoc3Quc3RfbW9kZSk6CiAgICAgICAgICAgIHJldHVybiBiIiIsIE5vbmUsIE5vbmUgICMgYSBzeW1saW5rIG9yIGEgZGlyZWN0b3J5OiBhbHdheXMgcmVwbGFjZWQgYnkgdGhlIHJlYWwgZmlsZQogICAgICAgIHJldHVybiBzZWxmLnIucmVhZF9ieXRlcyhkZXN0KSwgc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpLCBzdC5zdF91aWQKCiAgICBkZWYgcGxhbl93cml0ZXMoc2VsZiwgZmlsZXMpOgogICAgICAgICIiIkRlY2lkZSBwZXIgZmlsZTogd3JpdGUgLyBzYW1lIC8ga2VwdCAoaWYtYWJzZW50IGFuZCBwcmVzZW50KSAvIHNraXBwZWQgKG9vYiBvbiBhIGJveCB3aXRob3V0IHRoZSBiZWx0KS4iIiIKICAgICAgICBvb2IgPSBzZWxmLnIuaXNkaXIoT09CX0RJUikKICAgICAgICBwbGFuID0gW10KICAgICAgICBmb3IgZGVzdCwgY29udGVudCwgbW9kZSwgY2hlY2ssIHBvbGljeSBpbiBmaWxlczoKICAgICAgICAgICAgaWYgcG9saWN5ID09ICJvb2IiIGFuZCBub3Qgb29iOgogICAgICAgICAgICAgICAgcGxhbi5hcHBlbmQoKGRlc3QsIGNvbnRlbnQsIG1vZGUsICJza2lwcGVkIiwgTm9uZSwgTm9uZSkpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBvbGQsIG9sZF9tb2RlLCBvbGRfdWlkID0gc2VsZi5saXZlKGRlc3QpCiAgICAgICAgICAgIGlmIHBvbGljeSA9PSAiaWYtYWJzZW50IiBhbmQgb2xkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcGxhbi5hcHBlbmQoKGRlc3QsIGNvbnRlbnQsIG1vZGUsICJrZXB0Iiwgb2xkLCBvbGRfbW9kZSkpCiAgICAgICAgICAgIGVsaWYgb2xkID09IGNvbnRlbnQgYW5kIG9sZF9tb2RlID09IG1vZGUgYW5kIG9sZF91aWQgPT0gMDoKICAgICAgICAgICAgICAgIHBsYW4uYXBwZW5kKChkZXN0LCBjb250ZW50LCBtb2RlLCAic2FtZSIsIG9sZCwgb2xkX21vZGUpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGxhbi5hcHBlbmQoKGRlc3QsIGNvbnRlbnQsIG1vZGUsICJ3cml0ZSIsIG9sZCwgb2xkX21vZGUpKQogICAgICAgIHJldHVybiBwbGFuCgogICAgIyAtLS0tLS0tLS0tIHRoZSB0d28gZW50cmllcyAtLS0tLS0tLS0tCiAgICBkZWYgZnJvbV9wbGFuKHNlbGYsIHBsYW4pOgogICAgICAgICIiIkEgc2lnbmVkIGFnZW50X2NvbmZpZ191cGRhdGUsIGZyb20gdGhlIGFnZW50IChzdWRvLCB0aGUgLS1wbGFuIGxpbmUpLiIiIgogICAgICAgIGRhdGEgPSBzZWxmLmxvYWRfZmlsZShwbGFuLmdldCgiYnVuZGxlIikpCiAgICAgICAgdHJ1c3QgPSBzZWxmLmEubG9hZF90cnVzdCgpCiAgICAgICAgc2lnbmVycywgYm9vdHN0cmFwID0gVFJVU1RfU0lHTkVSUywgRmFsc2UKICAgICAgICBpZiBub3Qgc2VsZi5yLmxleGlzdHMoVFJVU1RfU0lHTkVSUyk6CiAgICAgICAgICAgIHNpZ25lcnMsIGJvb3RzdHJhcCA9IFBJTk5FRF9TSUdORVJTLCBUcnVlCiAgICAgICAgICAgIHNlbGYuci5sb2coZiJvcy1hcHBseTogQlVORExFIHtUUlVTVF9TSUdORVJTfSBpcyBtaXNzaW5nIOKAlCB2ZXJpZnlpbmcgYWdhaW5zdCB0aGUgaW5zdGFsbGVyJ3MgcGlubmVkIGtleSAiCiAgICAgICAgICAgICAgICAgICAgICAgZiJ7UElOTkVEX09QRVJBVE9SX0tFWV9JRH0gb25seSIpCiAgICAgICAgcGFyYW1zLCBub25jZSwgZXhwID0gc2VsZi5hLnZlcmlmeV9zaWduZWQocGxhbi5nZXQoInNpZ25lZCIpLCB0cnVzdCwgb3BfbmFtZT1CVU5ETEVfT1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVycz1Ob25lIGlmIG5vdCBib290c3RyYXAgZWxzZSBzaWduZXJzLCBidXJuPUZhbHNlKQogICAgICAgIHNoYSwgdmVyID0gcGFyYW1zLmdldCgiYnVuZGxlX3NoYTI1NiIpLCBwYXJhbXMuZ2V0KCJhZ2VudF92ZXJzaW9uIikKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzaGEsIHN0cikgb3Igbm90IHJlLm1hdGNoKHIiXlswLTlhLWZdezY0fSQiLCBzaGEpIG9yIG5vdCBpc2luc3RhbmNlKHZlciwgc3RyKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjMiLCAidGhlIHNpZ25lZCBqb2IgZG9lcyBub3QgcGluIGFnZW50X3ZlcnNpb24gYW5kIGJ1bmRsZV9zaGEyNTYiKQogICAgICAgIHZlciwgZmlsZXMgPSBzZWxmLnBhcnNlKGRhdGEsIHNoYSwgdmVyKQogICAgICAgIHNlbGYuYS5idXJuX25vbmNlKG5vbmNlLCBleHApCiAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbCh2ZXIsIHNoYSwgZmlsZXMsICJzaWduZWQiLCBib290c3RyYXApCgogICAgZGVmIGZyb21faW5zdGFsbGVyKHNlbGYsIHBhdGgsIHNoYSk6CiAgICAgICAgIiIiVGhlIGluc3RhbGxlciAocm9vdCwgbmV2ZXIgdGhyb3VnaCBzdWRvKTogdGhlIGh1YiBtYW5pZmVzdCBwaW5uZWQgdGhlIHNoYTsgbm8gc2lnbmF0dXJlLiIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IHNlbGYuci5yZWFkX2J5dGVzKHBhdGgpCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjEiLCBmImNhbm5vdCByZWFkIHRoZSBidW5kbGU6IHtlfSIpCiAgICAgICAgdmVyLCBmaWxlcyA9IHNlbGYucGFyc2UoZGF0YSwgc2hhKQogICAgICAgIHJldHVybiBzZWxmLmluc3RhbGwodmVyLCBzaGEsIGZpbGVzLCAiaW5zdGFsbGVyIiwgRmFsc2UpCgogICAgIyAtLS0tLS0tLS0tIGluc3RhbGwsIHNlbGYtY2hlY2ssIHVuZG8gLS0tLS0tLS0tLQogICAgZGVmIGluc3RhbGwoc2VsZiwgdmVyLCBzaGEsIGZpbGVzLCBhdXRob3JpdHksIGJvb3RzdHJhcCk6CiAgICAgICAgbG9nID0gc2VsZi5yLmxvZwogICAgICAgIHBsYW4gPSBzZWxmLnBsYW5fd3JpdGVzKGZpbGVzKQogICAgICAgIGNvdW50cyA9IHtrOiBzdW0oMSBmb3IgcCBpbiBwbGFuIGlmIHBbM10gPT0gaykgZm9yIGsgaW4gKCJ3cml0ZSIsICJzYW1lIiwgImtlcHQiLCAic2tpcHBlZCIpfQogICAgICAgIGxvZyhmIm9zLWFwcGx5OiBCVU5ETEUgU1RBUlQgYWdlbnQ9e3Zlcn0gc2hhPXtzaGFbOjE2XX0gYXV0aG9yaXR5PXthdXRob3JpdHl9IGZpbGVzPXtsZW4ocGxhbil9ICIKICAgICAgICAgICAgZiJ3cml0ZT17Y291bnRzWyd3cml0ZSddfSBzYW1lPXtjb3VudHNbJ3NhbWUnXX0ga2VwdD17Y291bnRzWydrZXB0J119IHNraXBwZWQ9e2NvdW50c1snc2tpcHBlZCddfSIpCiAgICAgICAgc3RhbXAgPSB0aW1lLnN0cmZ0aW1lKCIlWSVtJWRUJUglTSVTWiIsIHRpbWUuZ210aW1lKHNlbGYuci5ub3coKSkpCiAgICAgICAgcHJldiA9IG9zLnBhdGguam9pbihCVU5ETEVfUFJFVl9ESVIsIGYie3N0YW1wfS1iZWZvcmUte3Zlcn0iKQogICAgICAgIGRvbmUgPSBbXSAgIyAoZGVzdCwgb2xkIGJ5dGVzIG9yIE5vbmUsIG9sZCBtb2RlKQogICAgICAgIHJlcCA9IHsiYWdlbnRfdmVyc2lvbiI6IHZlciwgInNoYTI1NiI6IHNoYSwgImF1dGhvcml0eSI6IGF1dGhvcml0eSwgInByZXZfZGlyIjogcHJldiwKICAgICAgICAgICAgICAgIndyaXR0ZW4iOiBbcFswXSBmb3IgcCBpbiBwbGFuIGlmIHBbM10gPT0gIndyaXRlIl0sICJrZXB0IjogW3BbMF0gZm9yIHAgaW4gcGxhbiBpZiBwWzNdID09ICJrZXB0Il0sCiAgICAgICAgICAgICAgICJza2lwcGVkIjogW3BbMF0gZm9yIHAgaW4gcGxhbiBpZiBwWzNdID09ICJza2lwcGVkIl0sICJzYW1lIjogY291bnRzWyJzYW1lIl19CiAgICAgICAgc2VsZi5yZXBvcnRbImJ1bmRsZSJdID0gcmVwCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3IgZGVzdCwgY29udGVudCwgbW9kZSwgYWN0aW9uLCBvbGQsIG9sZF9tb2RlIGluIHBsYW46CiAgICAgICAgICAgICAgICBpZiBhY3Rpb24gIT0gIndyaXRlIjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgb2xkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuci5wdXRfZmlsZShwcmV2ICsgZGVzdCwgb2xkLCAwbzYwMCkKICAgICAgICAgICAgICAgIGRvbmUuYXBwZW5kKChkZXN0LCBvbGQsIG9sZF9tb2RlKSkKICAgICAgICAgICAgICAgIHNlbGYuci5wdXRfZmlsZShkZXN0LCBjb250ZW50LCBtb2RlKQogICAgICAgICAgICAgICAgbG9nKGYib3MtYXBwbHk6IEJVTkRMRSBXUk9URSB7ZGVzdH0gKHsncmVwbGFjZWQnIGlmIG9sZCBpcyBub3QgTm9uZSBlbHNlICduZXcnfSkiKQogICAgICAgICAgICBzZWxmLmFmdGVyX2luc3RhbGwocGxhbikKICAgICAgICAgICAgcmVwWyJzZWxmX2NoZWNrIl0gPSBzZWxmLnNlbGZfY2hlY2socGxhbikKICAgICAgICBleGNlcHQgKFJlZnVzZWQsIE9TRXJyb3IsIHN1YnByb2Nlc3MuU3VicHJvY2Vzc0Vycm9yKSBhcyBlOgogICAgICAgICAgICByZWFzb24gPSBlLnJlYXNvbiBpZiBpc2luc3RhbmNlKGUsIFJlZnVzZWQpIGVsc2Ugc3RyKGUpCiAgICAgICAgICAgIGxvZyhmIm9zLWFwcGx5OiBCVU5ETEUgRkFJTEVEIOKAlCB7cmVhc29ufTsgcHV0dGluZyB7bGVuKGRvbmUpfSBwcmV2aW91cyBmaWxlKHMpIGJhY2siKQogICAgICAgICAgICByZXBbInJvbGxlZF9iYWNrIl0gPSBzZWxmLnVuZG8oZG9uZSkKICAgICAgICAgICAgcmVwWyJmYWlsZWQiXSA9IHJlYXNvbls6MzAwXQogICAgICAgICAgICBzZWxmLnJlcG9ydFsiZmFpbGVkIl0gPSB7InJjIjogMywgInN0ZXAiOiAiYnVuZGxlIiwgInJlYXNvbiI6IHJlYXNvbls6MzAwXX0KICAgICAgICAgICAgcmV0dXJuIDMKICAgICAgICByZXBbInNpZ25lcnNfY3JlYXRlZCJdID0gRmFsc2UKICAgICAgICBpZiBib290c3RyYXAgYW5kIG5vdCBzZWxmLnIubGV4aXN0cyhUUlVTVF9TSUdORVJTKToKICAgICAgICAgICAgc2VsZi5yLnB1dF9maWxlKFRSVVNUX1NJR05FUlMsIHBpbm5lZF9zaWduZXJzX2xpbmUoKS5lbmNvZGUoKSwgMG82NDQpCiAgICAgICAgICAgIHJlcFsic2lnbmVyc19jcmVhdGVkIl0gPSBUcnVlCiAgICAgICAgICAgIGxvZyhmIm9zLWFwcGx5OiBCVU5ETEUgY3JlYXRlZCB7VFJVU1RfU0lHTkVSU30gd2l0aCBleGFjdGx5IHRoZSBwaW5uZWQga2V5IHtQSU5ORURfT1BFUkFUT1JfS0VZX0lEfSIpCiAgICAgICAgcmVjb3JkID0geyJmb3JtYXQiOiBCVU5ETEVfRk9STUFULCAiYWdlbnRfdmVyc2lvbiI6IHZlciwgImJ1bmRsZV9zaGEyNTYiOiBzaGEsICJhdXRob3JpdHkiOiBhdXRob3JpdHksCiAgICAgICAgICAgICAgICAgICJpbnN0YWxsZWRfYXQiOiB0aW1lLnN0cmZ0aW1lKCIlWS0lbS0lZFQlSDolTTolU1oiLCB0aW1lLmdtdGltZShzZWxmLnIubm93KCkpKSwKICAgICAgICAgICAgICAgICAgImZpbGVzIjoge3BbMF06IChzaGEyNTZfaGV4KHBbMV0pIGlmIHBbM10gaW4gKCJ3cml0ZSIsICJzYW1lIikgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaGEyNTZfaGV4KHBbNF0pIGlmIHBbM10gPT0gImtlcHQiIGVsc2UgInNraXBwZWQiKSkgZm9yIHAgaW4gcGxhbn19CiAgICAgICAgc2VsZi5yLnB1dF9maWxlKEJVTkRMRV9SRUNPUkQsIChqc29uLmR1bXBzKHJlY29yZCwgaW5kZW50PTIsIHNvcnRfa2V5cz1UcnVlKSArICJcbiIpLmVuY29kZSgpLCAwbzY0NCkKICAgICAgICBzZWxmLnBydW5lKCkKICAgICAgICBsb2coZiJvcy1hcHBseTogQlVORExFIERPTkUgYWdlbnQ9e3Zlcn0gd3JpdHRlbj17Y291bnRzWyd3cml0ZSddfSBzYW1lPXtjb3VudHNbJ3NhbWUnXX0gIgogICAgICAgICAgICBmInNlbGYtY2hlY2s9b2sgc2lnbmVycy1jcmVhdGVkPXtyZXBbJ3NpZ25lcnNfY3JlYXRlZCddfSIpCiAgICAgICAgcmV0dXJuIDAKCiAgICBkZWYgYWZ0ZXJfaW5zdGFsbChzZWxmLCBwbGFuKToKICAgICAgICB3cml0dGVuID0ge3BbMF0gZm9yIHAgaW4gcGxhbiBpZiBwWzNdID09ICJ3cml0ZSJ9CiAgICAgICAgZGVzdHMgPSB7cFswXSBmb3IgcCBpbiBwbGFuIGlmIHBbM10gIT0gInNraXBwZWQifQogICAgICAgIGlmIGFueShkLnN0YXJ0c3dpdGgoIi9ldGMvc3lzdGVtZC9zeXN0ZW0vIikgZm9yIGQgaW4gd3JpdHRlbik6CiAgICAgICAgICAgIHNlbGYubXVzdChbInN5c3RlbWN0bCIsICJkYWVtb24tcmVsb2FkIl0sICJzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZCIpCiAgICAgICAgaWYgIi9ldGMvdG1wZmlsZXMuZC9mZWxob20tcHJpdnNlcC5jb25mIiBpbiB3cml0dGVuOgogICAgICAgICAgICBzZWxmLm11c3QoWyJzeXN0ZW1kLXRtcGZpbGVzIiwgIi0tY3JlYXRlIiwgIi9ldGMvdG1wZmlsZXMuZC9mZWxob20tcHJpdnNlcC5jb25mIl0sICJzeXN0ZW1kLXRtcGZpbGVzIikKICAgICAgICAjIGBlbmFibGUgLS1ub3dgIHN0YXJ0cyBhIHVuaXQgdGhhdCBpcyBub3QgcnVubmluZyBhbmQgbGVhdmVzIGEgcnVubmluZyBvbmUgYWxvbmUgKG5vIHJlc3RhcnQpLiBGb3IgdGhlIGNyYXNoCiAgICAgICAgIyBndWFyZCB0aGF0IHJ1bnMgaXRzIGJvb3Qgc3RlcCBvbmNlIG9uIGEgYm94IHRoYXQgbmV2ZXIgaGFkIGl0OiBrZXJuZWwucGFuaWMgZm9yIFRISVMgYm9vdCwgYXMgdGhlIGJvb3QgdW5pdAogICAgICAgICMgd291bGQgc2V0IGl0IChgMTFgIMKnNS45KTsgd2l0aCBubyBlYXJsaWVyIHN0YXRlIGl0IGlzIHRoZSAiZmlyc3QiIGJvb3QsIG5ldmVyIGNvdW50ZWQgYXMgYW4gdW5jbGVhbiBvbmUuCiAgICAgICAgaWYgIi9ldGMvc3lzdGVtZC9zeXN0ZW0vZmVsaG9tLWNyYXNoLWd1YXJkLnNlcnZpY2UiIGluIGRlc3RzOgogICAgICAgICAgICBzZWxmLm11c3QoWyJzeXN0ZW1jdGwiLCAiZW5hYmxlIiwgIi0tbm93IiwgImZlbGhvbS1jcmFzaC1ndWFyZC5zZXJ2aWNlIiwgImZlbGhvbS1jcmFzaC1ndWFyZC1jaGVjay50aW1lciJdLAogICAgICAgICAgICAgICAgICAgICAgImVuYWJsZSB0aGUgY3Jhc2ggZ3VhcmQiKQogICAgICAgIGlmICIvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1tZ210LXdhdGNoZG9nLnRpbWVyIiBpbiBkZXN0czoKICAgICAgICAgICAgc2VsZi5tdXN0KFsic3lzdGVtY3RsIiwgImVuYWJsZSIsICItLW5vdyIsICJmZWxob20tbWdtdC13YXRjaGRvZy50aW1lciJdLCAiZW5hYmxlIHRoZSBtZ210IHdhdGNoZG9nIHRpbWVyIikKCiAgICBkZWYgbXVzdChzZWxmLCBhcmd2LCB3aGF0KToKICAgICAgICByYywgb3V0LCBlcnIgPSBzZWxmLnIuaG9zdChhcmd2LCAxMjApCiAgICAgICAgaWYgcmMgIT0gMDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ7d2hhdH0gZmFpbGVkIChyYz17cmN9KTogeyhvdXQgKyBlcnIpLnN0cmlwKClbLTIwMDpdfSIpCgogICAgZGVmIHNlbGZfY2hlY2soc2VsZiwgcGxhbik6CiAgICAgICAgIiIiQWZ0ZXIgdGhlIGluc3RhbGwsIGJlZm9yZSB0aGUgcmVjb3JkOiB0aGUgYm94IHN0aWxsIGhhcyBhIHdvcmtpbmcgcm91dGUgYW5kIHdvcmtpbmcgd3JhcHBlcnMuIiIiCiAgICAgICAgc2MgPSB7fQogICAgICAgIHNlbGYubXVzdChbInZpc3VkbyIsICItYyJdLCAidmlzdWRvIC1jICh0aGUgd2hvbGUgc3Vkb2VycykiKQogICAgICAgIHNjWyJ2aXN1ZG8iXSA9ICJvayIKICAgICAgICByYywgb3V0LCBlcnIgPSBzZWxmLnIuaG9zdChbInN1ZG8iLCAiLW4iLCAiLWwiLCAiLVUiLCBBR0VOVF9VU0VSXSwgNjApCiAgICAgICAgaWYgcmMgIT0gMCBvciAiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1vcy1hcHBseSAtLXBsYW4iIG5vdCBpbiBvdXQ6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxOCIsIGYic3VkbyAtbCBmb3Ige0FHRU5UX1VTRVJ9IG5vIGxvbmdlciBsaXN0cyBmZWxob20tb3MtYXBwbHkgKHJjPXtyY30pIikKICAgICAgICBzY1sic3Vkb19sIl0gPSAiZmVsaG9tLW9zLWFwcGx5IGxpc3RlZCIKICAgICAgICByYywgb3V0LCBlcnIgPSBzZWxmLnIuaG9zdChbIi91c3IvYmluL3B5dGhvbjMiLCAiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1vcy1hcHBseSIsICItLXNlbGYtY2hlY2siXSwgNjApCiAgICAgICAgaWYgcmMgIT0gMCBvciBmImJ1bmRsZS1mb3JtYXQ9e0JVTkRMRV9GT1JNQVR9IiBub3QgaW4gb3V0OgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJSMTgiLCBmInRoZSBpbnN0YWxsZWQgZmVsaG9tLW9zLWFwcGx5IGRvZXMgbm90IGFuc3dlciBpdHMgc2VsZi1jaGVjayAocmM9e3JjfSkiKQogICAgICAgIHNjWyJvc19hcHBseSJdID0gb3V0LnN0cmlwKClbOjEyMF0KICAgICAgICByYywgb3V0LCBlcnIgPSBzZWxmLnIuaG9zdChbIi9iaW4vc2giLCAiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1zZWxmdXBkYXRlLWd1YXJkZWQiXSwgNjApCiAgICAgICAgaWYgcmMgIT0gMiBvciAidXNhZ2UiIG5vdCBpbiAob3V0ICsgZXJyKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ0aGUgaW5zdGFsbGVkIGZlbGhvbS1zZWxmdXBkYXRlLWd1YXJkZWQgZG9lcyBub3QgYW5zd2VyIHdpdGggaXRzIHVzYWdlIChyYz17cmN9KSIpCiAgICAgICAgc2NbInNlbGZ1cGRhdGUiXSA9ICJ1c2FnZSBvayIKICAgICAgICBpZiAiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1wcml2LWFwcGx5IiBpbiB7cFswXSBmb3IgcCBpbiBwbGFuIGlmIHBbM10gIT0gInNraXBwZWQifToKICAgICAgICAgICAgcmMsIG91dCwgZXJyID0gc2VsZi5yLmhvc3QoWyIvdXNyL2Jpbi9weXRob24zIiwgIi91c3IvbG9jYWwvc2Jpbi9mZWxob20tcHJpdi1hcHBseSIsICItLXNlbGYtY2hlY2siXSwgNjApCiAgICAgICAgICAgIGlmIHJjICE9IDAgb3IgImZlbGhvbS1wcml2LWFwcGx5IG9rIiBub3QgaW4gb3V0OgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ0aGUgaW5zdGFsbGVkIGZlbGhvbS1wcml2LWFwcGx5IGRvZXMgbm90IGFuc3dlciBpdHMgc2VsZi1jaGVjayAocmM9e3JjfSkiKQogICAgICAgICAgICBzY1sicHJpdl9hcHBseSJdID0gb3V0LnN0cmlwKClbOjgwXQogICAgICAgIGRlc3RzID0ge3BbMF0gZm9yIHAgaW4gcGxhbiBpZiBwWzNdICE9ICJza2lwcGVkIn0KICAgICAgICBpZiAiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1jcmFzaC1ndWFyZCIgaW4gZGVzdHM6CiAgICAgICAgICAgIHJjLCBvdXQsIGVyciA9IHNlbGYuci5ob3N0KFsiL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1jcmFzaC1ndWFyZCIsICJzdGF0dXMiXSwgNjApCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHN0ID0ganNvbi5sb2FkcyhvdXQpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgc3QgPSBOb25lCiAgICAgICAgICAgIGlmIHJjICE9IDAgb3Igbm90IGlzaW5zdGFuY2Uoc3QsIGRpY3QpOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUjE4IiwgZiJ0aGUgY3Jhc2ggZ3VhcmQgZG9lcyBub3QgYW5zd2VyIGl0cyBzdGF0dXMgKHJjPXtyY30pIikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGFuaWMgPSBpbnQoc2VsZi5yLnJlYWRfZmlsZSgiL3Byb2Mvc3lzL2tlcm5lbC9wYW5pYyIpLnN0cmlwKCkpCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICAgICAgICBwYW5pYyA9IE5vbmUKICAgICAgICAgICAgaWYgcGFuaWMgIT0gc3QuZ2V0KCJrZXJuZWxfcGFuaWMiKToKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlIxOCIsIGYia2VybmVsLnBhbmljIGlzIHtwYW5pY30sIHRoZSBjcmFzaCBndWFyZCBzZXQge3N0LmdldCgna2VybmVsX3BhbmljJyl9IikKICAgICAgICAgICAgc2NbImNyYXNoX2d1YXJkIl0gPSB7ImFybWVkIjogc3QuZ2V0KCJhcm1lZCIpLCAia2VybmVsX3BhbmljIjogcGFuaWN9CiAgICAgICAgcmV0dXJuIHNjCgogICAgZGVmIHVuZG8oc2VsZiwgZG9uZSk6CiAgICAgICAgIiIiUHV0IGV2ZXJ5IHByZXZpb3VzIGNvcHkgYmFjayAobmV3ZXN0IHdyaXRlIGZpcnN0KTsgcmVtb3ZlIGZpbGVzIHRoZSBidW5kbGUgY3JlYXRlZC4iIiIKICAgICAgICBiYWNrID0gW10KICAgICAgICBmb3IgZGVzdCwgb2xkLCBvbGRfbW9kZSBpbiByZXZlcnNlZChkb25lKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgb2xkIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yLnJlbW92ZShkZXN0KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnIucHV0X2ZpbGUoZGVzdCwgb2xkLCBvbGRfbW9kZSBpZiBvbGRfbW9kZSBpcyBub3QgTm9uZSBlbHNlIDBvNjQ0KQogICAgICAgICAgICAgICAgYmFjay5hcHBlbmQoZGVzdCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuci5sb2coZiJvcy1hcHBseTogQlVORExFIFVORE8gY291bGQgbm90IHJlc3RvcmUge2Rlc3R9OiB7ZX0iKQogICAgICAgIGlmIGFueShkLnN0YXJ0c3dpdGgoIi9ldGMvc3lzdGVtZC9zeXN0ZW0vIikgZm9yIGQgaW4gYmFjayk6CiAgICAgICAgICAgIHNlbGYuci5ob3N0KFsic3lzdGVtY3RsIiwgImRhZW1vbi1yZWxvYWQiXSwgMTIwKQogICAgICAgIHJjLCBfLCBfID0gc2VsZi5yLmhvc3QoWyJ2aXN1ZG8iLCAiLWMiXSwgNjApCiAgICAgICAgc2VsZi5yLmxvZyhmIm9zLWFwcGx5OiBCVU5ETEUgVU5ETyByZXN0b3JlZD17bGVuKGJhY2spfSB2aXN1ZG8tYWZ0ZXI9eydvaycgaWYgcmMgPT0gMCBlbHNlICdGQUlMRUQnfSIpCiAgICAgICAgcmV0dXJuIGJhY2sKCiAgICBkZWYgcHJ1bmUoc2VsZik6CiAgICAgICAgbmFtZXMgPSBbbiBmb3IgbiBpbiBzZWxmLnIubGlzdF9kaXIoQlVORExFX1BSRVZfRElSKV0KICAgICAgICBmb3IgbiBpbiBuYW1lc1s6LUJVTkRMRV9LRUVQXToKICAgICAgICAgICAgc2VsZi5yLnJtdHJlZShvcy5wYXRoLmpvaW4oQlVORExFX1BSRVZfRElSLCBuKSkKCiAgICAjIC0tLS0tLS0tLS0gdGhlIGZhY3RzIG1vZGUncyB2aWV3IC0tLS0tLS0tLS0KICAgIGRlZiBzdGF0ZShzZWxmKToKICAgICAgICAiIiJXaGF0IHRoZSBib3ggcnVuczogdGhlIHJlY29yZCwgYW5kIGV2ZXJ5IGJ1bmRsZSBwYXRoJ3MgbGl2ZSBzaGEyNTYgYWdhaW5zdCBpdCAoZHJpZnQgPSBjaGFuZ2VkIGJ5IGhhbmQpLiIiIgogICAgICAgIHJlYyA9IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlYyA9IGpzb24ubG9hZHMoc2VsZi5yLnJlYWRfZmlsZShCVU5ETEVfUkVDT1JEKSkKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICByZWMgPSBOb25lCiAgICAgICAgbGl2ZSA9IHt9CiAgICAgICAgZm9yIGRlc3QsICpfIGluIEJVTkRMRV9GSUxFUzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGF0YSwgXywgXyA9IHNlbGYubGl2ZShkZXN0KQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIGRhdGEgPSBOb25lCiAgICAgICAgICAgIGxpdmVbZGVzdF0gPSBzaGEyNTZfaGV4KGRhdGEpIGlmIGRhdGEgaXMgbm90IE5vbmUgZWxzZSAiYWJzZW50IgogICAgICAgIG91dCA9IHsidmVyc2lvbiI6IChyZWMgb3Ige30pLmdldCgiYWdlbnRfdmVyc2lvbiIsICJub25lIiksICJsaXZlIjogbGl2ZX0KICAgICAgICBpZiByZWM6CiAgICAgICAgICAgIG91dFsiaW5zdGFsbGVkX2F0Il0gPSByZWMuZ2V0KCJpbnN0YWxsZWRfYXQiKQogICAgICAgICAgICBvdXRbImJ1bmRsZV9zaGEyNTYiXSA9IHJlYy5nZXQoImJ1bmRsZV9zaGEyNTYiKQogICAgICAgICAgICB3YW50ID0gcmVjLmdldCgiZmlsZXMiKSBvciB7fQogICAgICAgICAgICBvdXRbImRyaWZ0Il0gPSBzb3J0ZWQoZCBmb3IgZCwgaCBpbiB3YW50Lml0ZW1zKCkgaWYgaCAhPSAic2tpcHBlZCIgYW5kIGxpdmUuZ2V0KGQpICE9IGgpCiAgICAgICAgb3V0WyJzaWduZXJzX3ByZXNlbnQiXSA9IHNlbGYuci5sZXhpc3RzKFRSVVNUX1NJR05FUlMpCiAgICAgICAgcmV0dXJuIG91dAoKCmRlZiBtYWluKGFyZ3YsIHJ1bm5lcj1Ob25lLCBlbnZpcm9uPU5vbmUpOgogICAgciA9IHJ1bm5lciBvciBSdW5uZXIoKQogICAgZW52ID0gb3MuZW52aXJvbiBpZiBlbnZpcm9uIGlzIE5vbmUgZWxzZSBlbnZpcm9uCiAgICBpZiBhcmd2WzE6XSA9PSBbIi0tc2VsZi1jaGVjayJdOgogICAgICAgICMgVGhlIGJ1bmRsZSdzIHNlbGYtY2hlY2sgcnVucyB0aGUgTkVXIHdyYXBwZXIgdGhpcyB3YXk6IGl0IHBhcnNlcyBhbmQgc3RhcnRzLiBSZWFkcyBub3RoaW5nLCBjaGFuZ2VzIG5vdGhpbmcuCiAgICAgICAgcHJpbnQoZiJmZWxob20tb3MtYXBwbHkgb2sgYnVuZGxlLWZvcm1hdD17QlVORExFX0ZPUk1BVH0gZmlsZXM9e2xlbihCVU5ETEVfRklMRVMpfSIpCiAgICAgICAgcmV0dXJuIDAKICAgIGlmIGxlbihhcmd2KSA9PSA1IGFuZCBhcmd2WzFdID09ICItLWluc3RhbGwtYnVuZGxlIiBhbmQgYXJndlszXSA9PSAiLS1zaGEyNTYiOgogICAgICAgICMgVGhlIElOU1RBTExFUidzIGVudHJ5IChyb290LCBhIGZyZXNoIGJveCkuIFVucmVhY2hhYmxlIHRocm91Z2ggc3VkbzogdGhlIHN1ZG9lcnMgbGluZSBwaW5zIGFyZ3ZbMV0gdG8gLS1wbGFuLAogICAgICAgICMgYW5kIGEgc3VkbyBjYWxsZXIgaXMgcmVmdXNlZCBoZXJlIGFzIHdlbGwgKHN1ZG8gYWx3YXlzIHNldHMgU1VET19VSUQpLgogICAgICAgIGEgPSBBcHBseShyLCAiIikKICAgICAgICBpZiAiU1VET19VSUQiIGluIGVudjoKICAgICAgICAgICAgci5sb2coIm9zLWFwcGx5OiBSRUZVU0VEOiBSMSAtLWluc3RhbGwtYnVuZGxlIGlzIHRoZSBpbnN0YWxsZXIncyBlbnRyeSwgbmV2ZXIgdGhyb3VnaCBzdWRvIikKICAgICAgICAgICAgcHJpbnQoIk9TQVBQTFktUkVQT1JUICIgKyBqc29uLmR1bXBzKHsicmVmdXNlZCI6IHsiY29kZSI6ICJSMSIsICJyZWFzb24iOiAiaW5zdGFsbC1idW5kbGUgdmlhIHN1ZG8ifX0pKQogICAgICAgICAgICByZXR1cm4gMgogICAgICAgIHNoYSA9IGFyZ3ZbNF0KICAgICAgICBpZiBub3QgcmUubWF0Y2gociJeWzAtOWEtZl17NjR9JCIsIHNoYSk6CiAgICAgICAgICAgIHByaW50KCJPU0FQUExZLVJFUE9SVCAiICsganNvbi5kdW1wcyh7InJlZnVzZWQiOiB7ImNvZGUiOiAiUjE4IiwgInJlYXNvbiI6ICJzaGEyNTYgaXMgbm90IDY0IGxvd2VyY2FzZSBoZXgifX0pKQogICAgICAgICAgICByZXR1cm4gMgogICAgICAgIGEucmVwb3J0WyJtb2RlIl0gPSAiYnVuZGxlIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmMgPSBCdW5kbGUoYSkuZnJvbV9pbnN0YWxsZXIoYXJndlsyXSwgc2hhKQogICAgICAgIGV4Y2VwdCBSZWZ1c2VkIGFzIGU6CiAgICAgICAgICAgIHIubG9nKGYib3MtYXBwbHk6IFJFRlVTRUQ6IHtlLmNvZGV9IHtlLnJlYXNvbn0iKQogICAgICAgICAgICBhLnJlcG9ydFsicmVmdXNlZCJdID0geyJjb2RlIjogZS5jb2RlLCAicmVhc29uIjogZS5yZWFzb259CiAgICAgICAgICAgIHJjID0gMgogICAgICAgIHByaW50KCJPU0FQUExZLVJFUE9SVCAiICsganNvbi5kdW1wcyhhLnJlcG9ydCwgc29ydF9rZXlzPVRydWUpKQogICAgICAgIHJldHVybiByYwogICAgaWYgbGVuKGFyZ3YpICE9IDMgb3IgYXJndlsxXSAhPSAiLS1wbGFuIjoKICAgICAgICByLmxvZygib3MtYXBwbHk6IFJFRlVTRUQ6IFIxIHVzYWdlOiBmZWxob20tb3MtYXBwbHkgLS1wbGFuIC92YXIvbGliL2ZlbGhvbS1hZ2VudC9vcy9wbGFuLTxpZD4uanNvbiIpCiAgICAgICAgcHJpbnQoIk9TQVBQTFktUkVQT1JUICIgKyBqc29uLmR1bXBzKHsicmVmdXNlZCI6IHsiY29kZSI6ICJSMSIsICJyZWFzb24iOiAidXNhZ2UifX0pKQogICAgICAgIHJldHVybiAyCiAgICBhID0gQXBwbHkociwgYXJndlsyXSkKICAgIHQwID0gdGltZS50aW1lKCkKICAgIHRyeToKICAgICAgICByYyA9IGEucnVuKCkKICAgIGV4Y2VwdCBSZWZ1c2VkIGFzIGU6CiAgICAgICAgci5sb2coZiJvcy1hcHBseTogUkVGVVNFRDoge2UuY29kZX0ge2UucmVhc29ufSIpCiAgICAgICAgYS5yZXBvcnRbInJlZnVzZWQiXSA9IHsiY29kZSI6IGUuY29kZSwgInJlYXNvbiI6IGUucmVhc29ufQogICAgICAgIHJjID0gMgogICAgZXhjZXB0IHN1YnByb2Nlc3MuVGltZW91dEV4cGlyZWQgYXMgZToKICAgICAgICByLmxvZyhmIm9zLWFwcGx5OiBGQUlMRUQgcmM9MTI0IHN0ZXA9dGltZW91dCDigJQge2UuY21kfSIpCiAgICAgICAgYS5yZXBvcnRbImZhaWxlZCJdID0geyJyYyI6IDEyNCwgInRpbWVvdXQiOiBzdHIoZS5jbWQpWzoyMDBdfQogICAgICAgIHJjID0gMwogICAgYS5yZXBvcnRbInBhc3Nfc2Vjb25kcyJdID0gcm91bmQodGltZS50aW1lKCkgLSB0MCwgMSkKICAgIGlmIGEucmVwb3J0LmdldCgibW9kZSIpID09ICJhcHBseSI6CiAgICAgICAgIyBSLTg2ODogQkVGT1JFIHRoZSBzdGRvdXQgbGluZSDigJQgYSBraWxsZWQgYWdlbnQgbmV2ZXIgcmVhZHMgc3Rkb3V0LCBhbmQgdGhpcyBjb3B5IGlzIGhvdyBpdHMgcmVwb3J0IHN0aWxsCiAgICAgICAgIyByZWFjaGVzIHRoZSBodWIgKHRoZSBhZ2VudCBzZW5kcyBhbiB1bnNlbnQgY29weSB3aGVuIGl0IHN0YXJ0cywgYW5kIGRlbGV0ZXMgaXQgb25jZSBzZW50KS4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHIuc2F2ZV9yZXBvcnQoYXJndlsyXSwgYS5yZXBvcnQpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByLmxvZyhmIm9zLWFwcGx5OiB0aGUgcmVwb3J0IGNvcHkgY291bGQgbm90IGJlIHNhdmVkICh0aGUgcnVuIGlzIHVuYWZmZWN0ZWQpOiB7ZX0iKQogICAgdHJ5OgogICAgICAgIHByaW50KCJPU0FQUExZLVJFUE9SVCAiICsganNvbi5kdW1wcyhhLnJlcG9ydCwgc29ydF9rZXlzPVRydWUpLCBmbHVzaD1UcnVlKQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgIyBSLTg2ODogbm9ib2R5IHJlYWRzIHN0ZG91dCBhbnkgbW9yZSAodGhlIGFnZW50IHdhcyBraWxsZWQpOyB0aGUgY29weSBhYm92ZSBjYXJyaWVzIHRoZSByZXBvcnQuCiAgICAgICAgc3lzLnN0ZG91dCA9IG9wZW4ob3MuZGV2bnVsbCwgInciKQogICAgcmV0dXJuIHJjCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGlmIG9zLmdldGV1aWQoKSAhPSAwOgogICAgICAgIHByaW50KCJmZWxob20tb3MtYXBwbHk6IG11c3QgcnVuIGFzIHJvb3QgKHZpYSBzdWRvKSIsIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICBzeXMuZXhpdCgyKQogICAgc3lzLmV4aXQobWFpbihzeXMuYXJndikpCg==",
   "mode": "0o755",
   "path": "/usr/local/sbin/felhom-os-apply",
   "policy": "replace",
   "sha256": "43b41bed79fa09e0226dc13414c84ff7f79f93b72995038df1216eb683b982d7",
   "source": "configs/felhom-os-apply"
  },
  {
   "check": "python",
   "content_b64": "IyEvdXNyL2Jpbi9weXRob24zCiMgZmVsaG9tLWNyYXNoLWd1YXJkIOKAlCBhIGNyYXNoZWQgaG9zdCByZXN0YXJ0cyBieSBpdHNlbGYsIGJ1dCBub3QgZm9yZXZlciAoYDA5YCBkZWNpc2lvbiA4OCwgUi04NTEsIGAxMWAgwqc1LjkpLgojCiMgSW5zdGFsbCBhcyAvdXNyL2xvY2FsL3NiaW4vZmVsaG9tLWNyYXNoLWd1YXJkICgwNzU1IHJvb3Q6cm9vdCksIHdpdGggZmVsaG9tLWNyYXNoLWd1YXJkLnNlcnZpY2UgKGJvb3QgLyBjbGVhbi1zdG9wKQojIGFuZCBmZWxob20tY3Jhc2gtZ3VhcmQtY2hlY2sudGltZXIgKGhvdXJseSByZS1hcm0gY2hlY2spLiBQeXRob24gMywgc3RhbmRhcmQgbGlicmFyeSBvbmx5LgojIFRlc3RzOiBjb25maWdzL3Rlc3RfZmVsaG9tX2NyYXNoX2d1YXJkLnB5ICh0ZW1wIGRpcnM7IG5vdGhpbmcgcmVhbCBpcyB0b3VjaGVkKS4KIwojIFdIQVQgSVQgRE9FUwojICAgYm9vdCAgICAgICAgZWFybHkgYXQgZXZlcnkgYm9vdC4gV2FzIHRoZSBwcmV2aW91cyBib290IGVuZGVkIENMRUFOTFk/ICh0aGUgY2xlYW4tc3RvcCBtYXJrZXIgZXhpc3RzKS4gSWYgbm90LCB0aGlzCiMgICAgICAgICAgICAgICBib290IGZvbGxvd3MgYW4gVU5DTEVBTiBzdG9wIOKAlCBhIGtlcm5lbCBjcmFzaCwgYSBwb3dlciBjdXQgb3IgYSBoYXJkIHJlc2V0ICh0aGV5IGNhbm5vdCBiZSB0b2xkIGFwYXJ0CiMgICAgICAgICAgICAgICBvbiB0aGVzZSBib3hlczogbWVhc3VyZWQgMjAyNi0xMC0wNCBvbiBkZW1vLWhwLCBlZmlfcHN0b3JlIGlzIG9uIHlldCBzYXZlZCBOT1RISU5HIGZvciBhIHJlYWwgcGFuaWM7CiMgICAgICAgICAgICAgICB0aGUgam91cm5hbCBhbmQgYGxhc3RgIHNob3cgb25seSAibm8gc2h1dGRvd24iKS4gSXQgcmVjb3JkcyB0aGUgdW5jbGVhbiBib290LCBjb3VudHMgdGhvc2UgaW4gdGhlIGxhc3QKIyAgICAgICAgICAgICAgIFdJTkRPV19NSU5VVEVTLCBhbmQgc2V0cyBrZXJuZWwucGFuaWM6CiMgICAgICAgICAgICAgICAgIC0gZmV3ZXIgdGhhbiBMSU1JVC0xIHJlY2VudCB1bmNsZWFuIGJvb3RzIOKGkiBrZXJuZWwucGFuaWMgPSBQQU5JQ19TRUNPTkRTIChhIGNyYXNoIHJlc3RhcnRzIHRoZSBib3gpOwojICAgICAgICAgICAgICAgICAtIExJTUlULTEgb3IgbW9yZSDihpIgdGhlIGd1YXJkIFRSSVBTOiBrZXJuZWwucGFuaWMgPSAwLCBzbyB0aGUgTElNSVQtdGggY3Jhc2ggd2l0aGluIHRoZSB3aW5kb3cKIyAgICAgICAgICAgICAgICAgICBsZWF2ZXMgdGhlIGJveCBPRkYgKG9wZXJhdG9yJ3Mgb3duIHdvcmRzOiAiaWYgaXQgY3Jhc2hlcyAzIHRpbWVzIHdpdGhpbiBvbmUgaG91ciwgaXQgc3RheXMgb2ZmIikuCiMgICAgICAgICAgICAgICBBIHRyaXBwZWQgZ3VhcmQgc3RheXMgdHJpcHBlZCBhY3Jvc3MgZnVydGhlciBib290cyB1bnRpbCBpdCByZS1hcm1zLgojICAgY2xlYW4tc3RvcCAgRXhlY1N0b3Agb2YgdGhlIHNlcnZpY2U6IHdyaXRlcyB0aGUgY2xlYW4tc3RvcCBtYXJrZXIgZHVyaW5nIGFuIG9yZGVybHkgc2h1dGRvd24gb3IgcmVib290LgojICAgY2hlY2sgICAgICAgaG91cmx5OiBhIHRyaXBwZWQgZ3VhcmQgcmUtYXJtcyBhZnRlciBSRUFSTV9IT1VSUyBvZiBub3JtYWwgcnVubmluZyAoc2luY2UgdGhlIHRyaXAgQU5EIHNpbmNlIGJvb3QpLgojICAgcmVhcm0gICAgICAgdGhlIG9wZXJhdG9yIHJlLWFybXMgYnkgaGFuZCAoYGZlbGhvbS1jcmFzaC1ndWFyZCByZWFybWApLgojICAgc3RhdHVzICAgICAgcHJpbnRzIHRoZSBzdGF0ZS4KIyBUaGUgc3RhdGUgaXMgL3Zhci9saWIvZmVsaG9tLWNyYXNoLWd1YXJkL3N0YXRlLmpzb24gKDA2NDQ6IHRoZSBub24tcm9vdCBhZ2VudCByZWFkcyBpdCBpbnRvIGl0cyBob3N0IHJlcG9ydCkuCiMgQmVmb3JlIHRoZSBzZXJ2aWNlIHJ1bnMgKHZlcnkgZWFybHkgYm9vdCkgdGhlIGtlcm5lbCBkZWZhdWx0IGtlcm5lbC5wYW5pYyA9IDAgYXBwbGllcywgc28gYSBjcmFzaCBUSEFUIGVhcmx5IGxlYXZlcwojIHRoZSBib3ggb2ZmIOKAlCB0aGUgc2FmZSBzaWRlOiBhIGJveCB0aGF0IGNhbm5vdCByZWFjaCB1c2Vyc3BhY2UgbXVzdCBub3QgbG9vcC4KaW1wb3J0IGpzb24KaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHRpbWUKCkNPTkYgPSAiL2V0Yy9mZWxob20vY3Jhc2gtZ3VhcmQuY29uZiIKU1RBVEVfRElSID0gIi92YXIvbGliL2ZlbGhvbS1jcmFzaC1ndWFyZCIKREVGQVVMVFMgPSB7IkxJTUlUIjogMywgIldJTkRPV19NSU5VVEVTIjogNjAsICJQQU5JQ19TRUNPTkRTIjogMTAsICJSRUFSTV9IT1VSUyI6IDI0fQoKCmNsYXNzIEVudjoKICAgICIiIlBhdGhzIGFuZCBjbG9jazsgdGVzdHMgcmVwbGFjZSB0aGVtLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25mPUNPTkYsIHN0YXRlX2Rpcj1TVEFURV9ESVIsIHBhbmljX3BhdGg9Ii9wcm9jL3N5cy9rZXJuZWwvcGFuaWMiLAogICAgICAgICAgICAgICAgIHVwdGltZV9wYXRoPSIvcHJvYy91cHRpbWUiLCBib290X2lkX3BhdGg9Ii9wcm9jL3N5cy9rZXJuZWwvcmFuZG9tL2Jvb3RfaWQiKToKICAgICAgICBzZWxmLmNvbmYsIHNlbGYuc3RhdGVfZGlyID0gY29uZiwgc3RhdGVfZGlyCiAgICAgICAgc2VsZi5wYW5pY19wYXRoLCBzZWxmLnVwdGltZV9wYXRoLCBzZWxmLmJvb3RfaWRfcGF0aCA9IHBhbmljX3BhdGgsIHVwdGltZV9wYXRoLCBib290X2lkX3BhdGgKCiAgICBkZWYgbm93KHNlbGYpOgogICAgICAgIHJldHVybiB0aW1lLnRpbWUoKQoKICAgIGRlZiBsb2coc2VsZiwgbGluZSk6CiAgICAgICAgcHJpbnQobGluZSwgZmlsZT1zeXMuc3RkZXJyLCBmbHVzaD1UcnVlKQogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWyJsb2dnZXIiLCAiLXQiLCAiZmVsaG9tLWNyYXNoLWd1YXJkIiwgbGluZV0sIHRpbWVvdXQ9MTApCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKCmRlZiBpc28odCk6CiAgICByZXR1cm4gdGltZS5zdHJmdGltZSgiJVktJW0tJWRUJUg6JU06JVNaIiwgdGltZS5nbXRpbWUodCkpCgoKZGVmIHBhcnNlX2lzbyhzKToKICAgIGltcG9ydCBjYWxlbmRhcgogICAgcmV0dXJuIGNhbGVuZGFyLnRpbWVnbSh0aW1lLnN0cnB0aW1lKHMsICIlWS0lbS0lZFQlSDolTTolU1oiKSkKCgpkZWYgbG9hZF9jb25mKGVudik6CiAgICBjID0gZGljdChERUZBVUxUUykKICAgIHRyeToKICAgICAgICBmb3IgbGluZSBpbiBvcGVuKGVudi5jb25mKToKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgbGluZSBvciBsaW5lLnN0YXJ0c3dpdGgoIiMiKSBvciAiPSIgbm90IGluIGxpbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBrLCB2ID0gKHguc3RyaXAoKSBmb3IgeCBpbiBsaW5lLnNwbGl0KCI9IiwgMSkpCiAgICAgICAgICAgIGlmIGsgaW4gYyBhbmQgdi5pc2RpZ2l0KCkgYW5kIGludCh2KSA+PSAoMSBpZiBrICE9ICJQQU5JQ19TRUNPTkRTIiBlbHNlIDEpOgogICAgICAgICAgICAgICAgY1trXSA9IGludCh2KQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgcGFzcwogICAgcmV0dXJuIGMKCgpkZWYgc3RhdGVfcGF0aChlbnYpOgogICAgcmV0dXJuIG9zLnBhdGguam9pbihlbnYuc3RhdGVfZGlyLCAic3RhdGUuanNvbiIpCgoKZGVmIG1hcmtlcl9wYXRoKGVudik6CiAgICByZXR1cm4gb3MucGF0aC5qb2luKGVudi5zdGF0ZV9kaXIsICJjbGVhbi1zdG9wIikKCgpkZWYgbG9hZF9zdGF0ZShlbnYpOgogICAgdHJ5OgogICAgICAgIHdpdGggb3BlbihzdGF0ZV9wYXRoKGVudikpIGFzIGY6CiAgICAgICAgICAgIHMgPSBqc29uLmxvYWQoZikKICAgICAgICByZXR1cm4gcyBpZiBpc2luc3RhbmNlKHMsIGRpY3QpIGVsc2UgTm9uZQogICAgZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBzYXZlX3N0YXRlKGVudiwgcyk6CiAgICBvcy5tYWtlZGlycyhlbnYuc3RhdGVfZGlyLCBtb2RlPTBvNzU1LCBleGlzdF9vaz1UcnVlKQogICAgdG1wID0gc3RhdGVfcGF0aChlbnYpICsgIi50bXAiCiAgICB3aXRoIG9wZW4odG1wLCAidyIpIGFzIGY6CiAgICAgICAganNvbi5kdW1wKHMsIGYsIGluZGVudD0yLCBzb3J0X2tleXM9VHJ1ZSkKICAgICAgICBmLndyaXRlKCJcbiIpCiAgICBvcy5jaG1vZCh0bXAsIDBvNjQ0KQogICAgb3MucmVwbGFjZSh0bXAsIHN0YXRlX3BhdGgoZW52KSkKCgpkZWYgc2V0X3BhbmljKGVudiwgc2Vjb25kcyk6CiAgICB3aXRoIG9wZW4oZW52LnBhbmljX3BhdGgsICJ3IikgYXMgZjoKICAgICAgICBmLndyaXRlKGYie3NlY29uZHN9XG4iKQoKCmRlZiByZWFkKHBhdGgsIGRlZmF1bHQ9IiIpOgogICAgdHJ5OgogICAgICAgIHdpdGggb3BlbihwYXRoKSBhcyBmOgogICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkuc3RyaXAoKQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgcmV0dXJuIGRlZmF1bHQKCgpkZWYgc3VtbWFyaXplKHMsIGMsIG5vdyk6CiAgICB3aW5kb3cgPSBjWyJXSU5ET1dfTUlOVVRFUyJdICogNjAKICAgIHRpbWVzID0gW3BhcnNlX2lzbyh0KSBmb3IgdCBpbiBzLmdldCgidW5jbGVhbl9ib290cyIsIFtdKV0KICAgIGFmdGVyID0gcGFyc2VfaXNvKHNbInJlYXJtZWRfYXQiXSkgaWYgcy5nZXQoInJlYXJtZWRfYXQiKSBlbHNlIDAKICAgICMgYSByZS1hcm0gc3RhcnRzIGEgZnJlc2ggd2luZG93IChvciB0aGUgbmV4dCB1bmNsZWFuIGJvb3Qgd291bGQgdHJpcCBhZ2FpbiBhdCBvbmNlKTsgdGhlIGhpc3Rvcnkgc3RheXMKICAgIHNbInVuY2xlYW5fYm9vdHNfaW5fd2luZG93Il0gPSBzdW0oMSBmb3IgdCBpbiB0aW1lcyBpZiBub3cgLSB0IDw9IHdpbmRvdyBhbmQgdCA+IGFmdGVyKQogICAgc1sidW5jbGVhbl9ib290c18yNGgiXSA9IHN1bSgxIGZvciB0IGluIHRpbWVzIGlmIG5vdyAtIHQgPD0gODY0MDApCiAgICBzWyJjb25maWciXSA9IGMKICAgIHNbInVwZGF0ZWRfYXQiXSA9IGlzbyhub3cpCgoKZGVmIGJvb3QoZW52KToKICAgIGMgPSBsb2FkX2NvbmYoZW52KQogICAgbm93ID0gZW52Lm5vdygpCiAgICB0cnk6CiAgICAgICAgdXAgPSBmbG9hdChyZWFkKGVudi51cHRpbWVfcGF0aCwgIjAiKS5zcGxpdCgpWzBdKQogICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbmRleEVycm9yKToKICAgICAgICB1cCA9IDAuMAogICAgYm9vdF9hdCA9IG5vdyAtIHVwCiAgICBwcmV2ID0gbG9hZF9zdGF0ZShlbnYpCiAgICBmaXJzdCA9IHByZXYgaXMgTm9uZQogICAgcyA9IHByZXYgb3IgeyJ2ZXJzaW9uIjogMSwgInVuY2xlYW5fYm9vdHMiOiBbXSwgInRyaXBwZWQiOiBGYWxzZX0KICAgIGNsZWFuID0gb3MucGF0aC5leGlzdHMobWFya2VyX3BhdGgoZW52KSkKICAgIHVuY2xlYW4gPSAobm90IGZpcnN0KSBhbmQgKG5vdCBjbGVhbikKICAgIHRyeToKICAgICAgICBvcy5yZW1vdmUobWFya2VyX3BhdGgoZW52KSkKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgIHBhc3MKICAgICMga2VlcCA3IGRheXMgb2YgaGlzdG9yeSAodGhlIDI0IGggZmlndXJlIGFuZCB0aGUgb3BlcmF0b3IncyB2aWV3KSwgZHJvcCBvbGRlcgogICAgc1sidW5jbGVhbl9ib290cyJdID0gW3QgZm9yIHQgaW4gcy5nZXQoInVuY2xlYW5fYm9vdHMiLCBbXSkgaWYgbm93IC0gcGFyc2VfaXNvKHQpIDw9IDcgKiA4NjQwMF0KICAgIGlmIHVuY2xlYW46CiAgICAgICAgc1sidW5jbGVhbl9ib290cyJdLmFwcGVuZChpc28oYm9vdF9hdCkpCiAgICBzWyJsYXN0X2Jvb3RfYXQiXSA9IGlzbyhib290X2F0KQogICAgc1sibGFzdF9ib290X3VuY2xlYW4iXSA9IHVuY2xlYW4KICAgIHNbImJvb3RfaWQiXSA9IHJlYWQoZW52LmJvb3RfaWRfcGF0aCwgInVua25vd24iKQogICAgc3VtbWFyaXplKHMsIGMsIG5vdykKICAgIGlmIG5vdCBzLmdldCgidHJpcHBlZCIpIGFuZCBzWyJ1bmNsZWFuX2Jvb3RzX2luX3dpbmRvdyJdID49IGNbIkxJTUlUIl0gLSAxOgogICAgICAgIHNbInRyaXBwZWQiXSwgc1sidHJpcHBlZF9hdCJdID0gVHJ1ZSwgaXNvKG5vdykKICAgICAgICBzWyJ0cmlwcGVkX3JlYXNvbiJdID0gKGYie3NbJ3VuY2xlYW5fYm9vdHNfaW5fd2luZG93J119IHVuY2xlYW4gYm9vdHMgd2l0aGluIHtjWydXSU5ET1dfTUlOVVRFUyddfSBtaW51dGVzIOKAlCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmInRoZSBuZXh0IGNyYXNoIGxlYXZlcyB0aGUgYm94IG9mZiAobGltaXQge2NbJ0xJTUlUJ119KSIpCiAgICAgICAgZW52LmxvZyhmImNyYXNoLWd1YXJkOiBUUklQUEVEOiB7c1sndHJpcHBlZF9yZWFzb24nXX0iKQogICAgcGFuaWMgPSAwIGlmIHMuZ2V0KCJ0cmlwcGVkIikgZWxzZSBjWyJQQU5JQ19TRUNPTkRTIl0KICAgIHNldF9wYW5pYyhlbnYsIHBhbmljKQogICAgc1sia2VybmVsX3BhbmljIl0gPSBwYW5pYwogICAgc1siYXJtZWQiXSA9IG5vdCBzLmdldCgidHJpcHBlZCIpCiAgICBzYXZlX3N0YXRlKGVudiwgcykKICAgIGVudi5sb2coZiJjcmFzaC1ndWFyZDogYm9vdCBmaXJzdD17Zmlyc3R9IHVuY2xlYW49e3VuY2xlYW59IGluLXdpbmRvdz17c1sndW5jbGVhbl9ib290c19pbl93aW5kb3cnXX0gIgogICAgICAgICAgICBmInRyaXBwZWQ9e3MuZ2V0KCd0cmlwcGVkJyl9IGtlcm5lbC5wYW5pYz17cGFuaWN9IikKICAgIHJldHVybiAwCgoKZGVmIGNsZWFuX3N0b3AoZW52KToKICAgIG9zLm1ha2VkaXJzKGVudi5zdGF0ZV9kaXIsIG1vZGU9MG83NTUsIGV4aXN0X29rPVRydWUpCiAgICB3aXRoIG9wZW4obWFya2VyX3BhdGgoZW52KSwgInciKSBhcyBmOgogICAgICAgIGYud3JpdGUoaXNvKGVudi5ub3coKSkgKyAiXG4iKQogICAgZW52LmxvZygiY3Jhc2gtZ3VhcmQ6IGNsZWFuIHN0b3AgcmVjb3JkZWQiKQogICAgcmV0dXJuIDAKCgpkZWYgcmVhcm0oZW52LCBieSk6CiAgICBjID0gbG9hZF9jb25mKGVudikKICAgIG5vdyA9IGVudi5ub3coKQogICAgcyA9IGxvYWRfc3RhdGUoZW52KSBvciB7InZlcnNpb24iOiAxLCAidW5jbGVhbl9ib290cyI6IFtdfQogICAgd2FzID0gYm9vbChzLmdldCgidHJpcHBlZCIpKQogICAgc1sidHJpcHBlZCJdID0gRmFsc2UKICAgIHNbImFybWVkIl0gPSBUcnVlCiAgICBzWyJyZWFybWVkX2F0Il0sIHNbInJlYXJtZWRfYnkiXSA9IGlzbyhub3cpLCBieQogICAgaWYgd2FzOgogICAgICAgIHNbImxhc3RfdHJpcCJdID0geyJhdCI6IHMuZ2V0KCJ0cmlwcGVkX2F0IiksICJyZWFzb24iOiBzLmdldCgidHJpcHBlZF9yZWFzb24iKX0KICAgIHMucG9wKCJ0cmlwcGVkX2F0IiwgTm9uZSkKICAgIHMucG9wKCJ0cmlwcGVkX3JlYXNvbiIsIE5vbmUpCiAgICBzdW1tYXJpemUocywgYywgbm93KQogICAgc2V0X3BhbmljKGVudiwgY1siUEFOSUNfU0VDT05EUyJdKQogICAgc1sia2VybmVsX3BhbmljIl0gPSBjWyJQQU5JQ19TRUNPTkRTIl0KICAgIHNhdmVfc3RhdGUoZW52LCBzKQogICAgZW52LmxvZyhmImNyYXNoLWd1YXJkOiBSRS1BUk1FRCBieSB7Ynl9ICh3YXMgdHJpcHBlZDoge3dhc30pOyBrZXJuZWwucGFuaWM9e2NbJ1BBTklDX1NFQ09ORFMnXX0iKQogICAgcmV0dXJuIDAKCgpkZWYgY2hlY2soZW52KToKICAgIGMgPSBsb2FkX2NvbmYoZW52KQogICAgbm93ID0gZW52Lm5vdygpCiAgICBzID0gbG9hZF9zdGF0ZShlbnYpCiAgICBpZiBub3QgczoKICAgICAgICByZXR1cm4gMAogICAgaWYgcy5nZXQoInRyaXBwZWQiKToKICAgICAgICBzaW5jZSA9IG1heChwYXJzZV9pc28oc1sidHJpcHBlZF9hdCJdKSwgcGFyc2VfaXNvKHMuZ2V0KCJsYXN0X2Jvb3RfYXQiLCBzWyJ0cmlwcGVkX2F0Il0pKSkKICAgICAgICBpZiBub3cgLSBzaW5jZSA+PSBjWyJSRUFSTV9IT1VSUyJdICogMzYwMDoKICAgICAgICAgICAgcmV0dXJuIHJlYXJtKGVudiwgZiJ0aW1lciAoe2NbJ1JFQVJNX0hPVVJTJ119IGggb2Ygbm9ybWFsIHJ1bm5pbmcpIikKICAgIHN1bW1hcml6ZShzLCBjLCBub3cpCiAgICBzYXZlX3N0YXRlKGVudiwgcykKICAgIHJldHVybiAwCgoKZGVmIG1haW4oYXJndiwgZW52PU5vbmUpOgogICAgZW52ID0gZW52IG9yIEVudigpCiAgICBjbWQgPSBhcmd2WzFdIGlmIGxlbihhcmd2KSA9PSAyIGVsc2UgIiIKICAgIGlmIGNtZCA9PSAiYm9vdCI6CiAgICAgICAgcmV0dXJuIGJvb3QoZW52KQogICAgaWYgY21kID09ICJjbGVhbi1zdG9wIjoKICAgICAgICByZXR1cm4gY2xlYW5fc3RvcChlbnYpCiAgICBpZiBjbWQgPT0gImNoZWNrIjoKICAgICAgICByZXR1cm4gY2hlY2soZW52KQogICAgaWYgY21kID09ICJyZWFybSI6CiAgICAgICAgcmV0dXJuIHJlYXJtKGVudiwgIm9wZXJhdG9yIikKICAgIGlmIGNtZCA9PSAic3RhdHVzIjoKICAgICAgICBwcmludChqc29uLmR1bXBzKGxvYWRfc3RhdGUoZW52KSwgaW5kZW50PTIsIHNvcnRfa2V5cz1UcnVlKSkKICAgICAgICByZXR1cm4gMAogICAgcHJpbnQoInVzYWdlOiBmZWxob20tY3Jhc2gtZ3VhcmQgYm9vdHxjbGVhbi1zdG9wfGNoZWNrfHJlYXJtfHN0YXR1cyIsIGZpbGU9c3lzLnN0ZGVycikKICAgIHJldHVybiAyCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGlmIG9zLmdldGV1aWQoKSAhPSAwOgogICAgICAgIHByaW50KCJmZWxob20tY3Jhc2gtZ3VhcmQ6IG11c3QgcnVuIGFzIHJvb3QiLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgc3lzLmV4aXQoMikKICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQo=",
   "mode": "0o755",
   "path": "/usr/local/sbin/felhom-crash-guard",
   "policy": "replace",
   "sha256": "f45b99817fe8ff50ca3e1e3d9f9c250002348ddeede7e05847b1b1c04e88c638",
   "source": "configs/felhom-crash-guard"
  },
  {
   "check": "python",
   "content_b64": "IyEvdXNyL2Jpbi9weXRob24zCiIiImZlbGhvbS1wcml2LWFwcGx5IOKAlCB0aGUgUk9PVCBoYWxmIG9mIGV2ZXJ5IGZpbGUgdGhlIGFnZW50IHdyaXRlcyBpbnRvIGEgcm9vdC1yZWFkIHBsYWNlIChSLTg2MSwgYDAzYCDCpzMuMSkuCgpJbnN0YWxsIGFzIC91c3IvbG9jYWwvc2Jpbi9mZWxob20tcHJpdi1hcHBseSAoMDc1NSByb290OnJvb3QpIOKAlCBpdCByaWRlcyB0aGUgc2lnbmVkIGNvbmZpZyBidW5kbGUgKFItODQwKS4KCldIWSBJVCBFWElTVFMuIFVudGlsIGFnZW50IHYwLjE0Ni4wIHRoZSBhZ2VudCdzIHN1ZG9lcnMgbGV0IGl0IGBpbnN0YWxsYCBhIGZpbGUgaXQgaGFkIHdyaXR0ZW4gaXRzZWxmIGludG8gYSBwbGFjZSBhCnJvb3QgcHJvZ3JhbSByZWFkczogYSBzeXN0ZW1kIC5tb3VudCB1bml0IChhIGJpbmQgbW91bnQgb2YgYW4gYWdlbnQtb3duZWQgZGlyZWN0b3J5IG92ZXIgL2V0Yy9zdWRvZXJzLmQgaXMgYSByb290CnNoZWxsKSwgYSBkbnNtYXNxIGRyb3AtaW4gKGBkaGNwLXNjcmlwdD1gIHJ1bnMgYXMgcm9vdCksIHRoZSBXaXJlR3VhcmQgY29uZmlnIChgUG9zdFVwPWAgcnVucyBhcyByb290KSBhbmQgdGhlIE9PQgpzc2hkIGNvbmZpZyAoYEF1dGhvcml6ZWRLZXlzRmlsZWAgKyBgU3RyaWN0TW9kZXMgbm9gKS4gQSBjb21wcm9taXNlZCBhZ2VudCBQUk9DRVNTIHdhcyB0aGVyZWZvcmUgcm9vdCBvbiBpdHMgaG9zdC4KTm93IHRoZSBhZ2VudCBzdGFnZXMgdGhlIGZpbGUgYW5kIHRoaXMgd3JhcHBlciDigJQgcm9vdC1vd25lZCwgZGVsaXZlcmVkIG9ubHkgYnkgYW4gb3BlcmF0b3Itc2lnbmVkIGJ1bmRsZSDigJQgY2hlY2tzCnRoZSBDT05URU5UIGFnYWluc3QgdGhlIGV4YWN0IGdyYW1tYXIgdGhlIGFnZW50J3Mgb3duIHJlbmRlcmVycyBwcm9kdWNlLCBhbmQgcmVmdXNlcyBhbnl0aGluZyBlbHNlLiBUaGUgYWdlbnQgY2FuIG5vCmxvbmdlciBuYW1lIHRoZSBkZXN0aW5hdGlvbjogZWFjaCB2ZXJiIGhhcyBhIGZpeGVkIHNvdXJjZSBhbmQgYSBmaXhlZCAob3Igc3RyaWN0bHkgbmFtZWQpIGRlc3RpbmF0aW9uLgoKVmVyYnMgKGVhY2ggb25lIHN1ZG9lcnMgbGluZSwgZXhhY3QtbWF0Y2ggcGF0dGVybik6CiAgdW5pdCA8bmFtZT4gICAgICAgICAgICAgIC92YXIvbGliL2ZlbGhvbS1hZ2VudC91bml0cy88bmFtZT4gLT4gL2V0Yy9zeXN0ZW1kL3N5c3RlbS88bmFtZT4gICAoLm1vdW50IHwgLmF1dG9tb3VudCkKICBkbnNtYXNxIDx0bXA+IDxuYW1lPiAgICAgL3RtcC9mZWxob20tcmVzb2x2ZXItPGRpZ2l0cz4uY29uZiAtPiAvZXRjL2Ruc21hc3EuZC9mZWxob20tPC4uLj4uY29uZgogIHdnICAgICAgICAgICAgICAgICAgICAgICAvdmFyL2xpYi9mZWxob20tYWdlbnQvd2cvd2ctZmVsaG9tLmNvbmYgLT4gL2V0Yy93aXJlZ3VhcmQvd2ctZmVsaG9tLmNvbmYgKDA2MDApCiAgc3NoZC1jb25maWcgICAgICAgICAgICAgIC92YXIvbGliL2ZlbGhvbS1hZ2VudC9mZWxob20tc3NoZC9zc2hkX2NvbmZpZyAtPiAvZXRjL2ZlbGhvbS1zc2hkL3NzaGRfY29uZmlnCiAgc3NoZC1rZXkgICAgICAgICAgICAgICAgIC92YXIvbGliL2ZlbGhvbS1hZ2VudC9mZWxob20tc3NoZC9hdXRob3JpemVkX2tleXMuZmVsaG9tLW9wIC0+IC9ldGMvZmVsaG9tLXNzaGQvYXV0aG9yaXplZF9rZXlzL2ZlbGhvbS1vcAogIGNvbnRyb2xsZXItaW1hZ2UgPHZtaWQ+ICB0aGUgcmVmIG9uIFNURElOIC0+IC9ldGMvZmVsaG9tLWNvbnRyb2xsZXItaW1hZ2UgSU5TSURFIGd1ZXN0IDx2bWlkPiAoUi04NjEgKGEpIEExKTogb25seQogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXIgcmVnaXN0cnkgKyBvdXIgcmVwb3NpdG9yeSArIGFuIHgueS56IHRhZzsgdGhlIGFnZW50IG5vIGxvbmdlciBoYXMgYSBgdGVlYCBncmFudAogIC0tc2VsZi1jaGVjayAgICAgICAgICAgICBwcmludHMgImZlbGhvbS1wcml2LWFwcGx5IG9rIHZlcmJzPS4uLiIgKHRoZSBidW5kbGUncyBzZWxmLWNoZWNrKQoKRXhpdCBjb2RlczogMCBpbnN0YWxsZWQgKG9yIGFscmVhZHkgaWRlbnRpY2FsKSwgMiB1c2FnZSwgMyByZWZ1c2VkIChjb250ZW50IG9yIHNvdXJjZSksIDQgaW5zdGFsbCBmYWlsZWQuCkV2ZXJ5IHJlZnVzYWwgaXMgbG9nZ2VkIHRvIHRoZSBqb3VybmFsICh0YWcgZmVsaG9tLXByaXYtYXBwbHkpIHdpdGggaXRzIHJ1bGU7IGZpbGUgQ09OVEVOVCBpcyBuZXZlciBsb2dnZWQuClBpbm5lZCBieSBjb25maWdzL3Rlc3RfZmVsaG9tX3ByaXZfYXBwbHkucHkgKG9uZSB0ZXN0IHBlciBydWxlLCByZWQtcHJvb2ZzIGluIHRoZSBSLTg2MSBhdWRpdCkuCiIiIgppbXBvcnQgaXBhZGRyZXNzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN0YXQKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwoKQUdFTlRfVVNFUiA9ICJmZWxob20tYWdlbnQiClNUQVRFID0gIi92YXIvbGliL2ZlbGhvbS1hZ2VudCIKVU5JVFNfU1JDID0gU1RBVEUgKyAiL3VuaXRzIgpVTklUX0RJUiA9ICIvZXRjL3N5c3RlbWQvc3lzdGVtIgpETlNNQVNRX0RJUiA9ICIvZXRjL2Ruc21hc3EuZCIKV0dfU1JDLCBXR19ERVNUID0gU1RBVEUgKyAiL3dnL3dnLWZlbGhvbS5jb25mIiwgIi9ldGMvd2lyZWd1YXJkL3dnLWZlbGhvbS5jb25mIgpTU0hEX1NSQywgU1NIRF9ERVNUID0gU1RBVEUgKyAiL2ZlbGhvbS1zc2hkL3NzaGRfY29uZmlnIiwgIi9ldGMvZmVsaG9tLXNzaGQvc3NoZF9jb25maWciCktFWV9TUkMsIEtFWV9ERVNUID0gU1RBVEUgKyAiL2ZlbGhvbS1zc2hkL2F1dGhvcml6ZWRfa2V5cy5mZWxob20tb3AiLCAiL2V0Yy9mZWxob20tc3NoZC9hdXRob3JpemVkX2tleXMvZmVsaG9tLW9wIgpNQVhfQllURVMgPSA2NCAqIDEwMjQKVkVSQlMgPSAoInVuaXQiLCAiZG5zbWFzcSIsICJ3ZyIsICJzc2hkLWNvbmZpZyIsICJzc2hkLWtleSIsICJjb250cm9sbGVyLWltYWdlIikKIyBSLTg2MSAoYSkgQTEgKGAwOWAgwqczIGRlY2lzaW9uIDE2NSk6IHRoZSBTQU1FIHBhdHRlcm4gYXMgdGhlIGFnZW50J3MgY29udHJvbGxlckltYWdlUmUgKGludGVybmFsL2xvY2FsYXBpLwojIGNvbnRyb2xsZXJzd2FwLmdvKSDigJQgYSBjb21wcm9taXNlZCBhZ2VudCBjYW5ub3QgaGFuZCB0aGUgZ3Vlc3QncyBib290c3RyYXAgYW55IG90aGVyIGltYWdlLiBQaW5uZWQgYnkKIyBjb25maWdzL3Rlc3RfZmVsaG9tX3ByaXZfYXBwbHkucHkgQ29udHJvbGxlckltYWdlLgpDT05UUk9MTEVSX0lNQUdFX1JFID0gcmUuY29tcGlsZShyIl5naXRlYVwuZG9vcGxleFwuaHUvYWRtaW4vZmVsaG9tLWNvbnRyb2xsZXI6WzAtOV0rXC5bMC05XStcLlswLTldKyQiKQpDT05UUk9MTEVSX0lNQUdFX0ZJTEUgPSAiL2V0Yy9mZWxob20tY29udHJvbGxlci1pbWFnZSIKQ09OVFJPTExFUl9JTUFHRV9NQVggPSAyNTYKVk1JRF9SRSA9IHJlLmNvbXBpbGUociJeWzAtOV17MSw5fSQiKQoKVU5JVF9OQU1FX1JFID0gcmUuY29tcGlsZShyIl5tbnQtW0EtWmEtejAtOV8uXFwtXStcLihtb3VudHxhdXRvbW91bnQpJCIpCkROU01BU1FfVE1QX1JFID0gcmUuY29tcGlsZShyIl4vdG1wL2ZlbGhvbS1yZXNvbHZlci1bMC05XStcLmNvbmYkIikKRE5TTUFTUV9OQU1FX1JFID0gcmUuY29tcGlsZShyIl5mZWxob20tW2EtejAtOV1bYS16MC05Ll8tXSpcLmNvbmYkIikKU0VHID0gciJbQS1aYS16MC05Xy1dW0EtWmEtejAtOV8uLV0qIgpXSEVSRV9SRSA9IHJlLmNvbXBpbGUociJeL21udC8oZmVsaG9tLWRyaXZlcy8pPyIgKyBTRUcgKyByIiQiKQpVVUlEX1JFID0gcmUuY29tcGlsZShyIl5bQS1GYS1mMC05XXs0LH0oLVtBLUZhLWYwLTldKyl7MCw0fSQiKQpIT1NUX1JFID0gcmUuY29tcGlsZShyIl5bQS1aYS16MC05Ll86LV17MSwyNTV9JCIpCk5FVF9QQVRIX1JFID0gcmUuY29tcGlsZShyIl5bQS1aYS16MC05Ll8vQCstXXsxLDUxMn0kIikKT1BUX1JFID0gcmUuY29tcGlsZShyIl5bQS1aYS16MC05Xy46L0ArLV0rKD1bQS1aYS16MC05Xy46L0ArLV0rKT8kIikKTE9DQUxfVFlQRVMgPSB7ImV4dDQiLCAieGZzIiwgImJ0cmZzIiwgImV4ZmF0IiwgInZmYXQiLCAibnRmczMiLCAibnRmcyJ9Ck5FVF9UWVBFUyA9IHsibmZzIiwgIm5mczQiLCAiY2lmcyJ9CiMgT3B0aW9ucyB0aGF0IHR1cm4gYSBkZXZpY2UgbW91bnQgaW50byBzb21ldGhpbmcgZWxzZSwgb3IgbGV0IHNldC11aWQvZGV2aWNlIGZpbGVzIGFjdCBvbiB0aGUgaG9zdC4KRk9SQklEREVOX09QVFMgPSB7ImJpbmQiLCAicmJpbmQiLCAibW92ZSIsICJybW92ZSIsICJyZW1vdW50IiwgInN1aWQiLCAiZGV2IiwgInVzZXIiLCAidXNlcnMiLCAib3duZXIiLCAiZ3JvdXAiLAogICAgICAgICAgICAgICAgICAieC1tb3VudC5ta2RpciIsICJoZWxwZXIifQpERVNDX1JFID0gcmUuY29tcGlsZShyIl5bXlx4MDAtXHgxZlx4N2ZdezAsMjAwfSQiKQpXR19LRVlfUkUgPSByZS5jb21waWxlKHIiXltBLVphLXowLTkrL117NDJ9W0FFSU1RVVljZ2tvc3c0ODBdPSQiKQpLRVlfTElORV9SRSA9IHJlLmNvbXBpbGUociJeKHNzaC1lZDI1NTE5fHNzaC1yc2F8ZWNkc2Etc2hhMi1uaXN0cCgyNTZ8Mzg0fDUyMSl8c2stc3NoLWVkMjU1MTlAb3BlbnNzaFwuY29tKSAiCiAgICAgICAgICAgICAgICAgICAgICAgICByIltBLVphLXowLTkrL10rPXswLDN9KCBbIC1+XXswLDIwMH0pPyQiKQoKCmNsYXNzIFJlZnVzZWQoRXhjZXB0aW9uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBydWxlLCByZWFzb24pOgogICAgICAgIHN1cGVyKCkuX19pbml0X18ocmVhc29uKQogICAgICAgIHNlbGYucnVsZSwgc2VsZi5yZWFzb24gPSBydWxlLCByZWFzb24KCgpjbGFzcyBIb3N0OgogICAgIiIiRXZlcnkgZmlsZXN5c3RlbSAvIHByb2Nlc3MgZWZmZWN0LCBzbyB0aGUgdGVzdHMgY2FuIHBsYXkgdGhlIGJveCBpbiBtZW1vcnkuIiIiCgogICAgZGVmIGFnZW50X3VpZChzZWxmKToKICAgICAgICBpbXBvcnQgcHdkCiAgICAgICAgcmV0dXJuIHB3ZC5nZXRwd25hbShBR0VOVF9VU0VSKS5wd191aWQKCiAgICBkZWYgcmVhZF9zb3VyY2Uoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiVGhlIHN0YWdlZCBmaWxlOiBhIFJFR1VMQVIgZmlsZSBvd25lZCBieSB0aGUgYWdlbnQsIG5ldmVyIGEgc3ltbGluaywgYXQgbW9zdCBNQVhfQllURVMuIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZCA9IG9zLm9wZW4ocGF0aCwgb3MuT19SRE9OTFkgfCBvcy5PX05PRk9MTE9XIHwgb3MuT19DTE9FWEVDKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlAxIiwgZiJjYW5ub3Qgb3BlbiB0aGUgc3RhZ2VkIGZpbGUge3BhdGh9OiB7ZS5zdHJlcnJvcn0iKQogICAgICAgIHRyeToKICAgICAgICAgICAgc3QgPSBvcy5mc3RhdChmZCkKICAgICAgICAgICAgaWYgbm90IHN0YXQuU19JU1JFRyhzdC5zdF9tb2RlKToKICAgICAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlAxIiwgZiJ7cGF0aH0gaXMgbm90IGEgcmVndWxhciBmaWxlIikKICAgICAgICAgICAgaWYgc3Quc3RfdWlkICE9IHNlbGYuYWdlbnRfdWlkKCk6CiAgICAgICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJQMSIsIGYie3BhdGh9IGlzIG5vdCBvd25lZCBieSB7QUdFTlRfVVNFUn0iKQogICAgICAgICAgICBpZiBzdC5zdF9zaXplID4gTUFYX0JZVEVTOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiUDEiLCBmIntwYXRofSBpcyBsYXJnZXIgdGhhbiB7TUFYX0JZVEVTfSBieXRlcyIpCiAgICAgICAgICAgIHdpdGggb3MuZmRvcGVuKGZkLCAicmIiKSBhcyBmOgogICAgICAgICAgICAgICAgZmQgPSAtMQogICAgICAgICAgICAgICAgcmV0dXJuIGYucmVhZChNQVhfQllURVMgKyAxKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIGZkID49IDA6CiAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKCiAgICBkZWYgcmVhZF9kZXN0KHNlbGYsIHBhdGgpOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGY6CiAgICAgICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBkZXN0LCBkYXRhLCBtb2RlKToKICAgICAgICAiIiJBdG9taWMsIHJvb3Qtb3duZWQ6IGEgdGVtcCBmaWxlIGJlc2lkZSB0aGUgZGVzdGluYXRpb24sIGZzeW5jLCByZW5hbWUuIiIiCiAgICAgICAgZCA9IG9zLnBhdGguZGlybmFtZShkZXN0KQogICAgICAgIG9zLm1ha2VkaXJzKGQsIG1vZGU9MG83NTUsIGV4aXN0X29rPVRydWUpCiAgICAgICAgdG1wID0gb3MucGF0aC5qb2luKGQsIGYiLntvcy5wYXRoLmJhc2VuYW1lKGRlc3QpfS5mZWxob20tbmV3Lntvcy5nZXRwaWQoKX0iKQogICAgICAgIGZkID0gb3Mub3Blbih0bXAsIG9zLk9fV1JPTkxZIHwgb3MuT19DUkVBVCB8IG9zLk9fRVhDTCB8IG9zLk9fTk9GT0xMT1csIDBvNjAwKQogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcy5mZG9wZW4oZmQsICJ3YiIpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgICAgICBmLmZsdXNoKCkKICAgICAgICAgICAgICAgIG9zLmZjaG93bihmLmZpbGVubygpLCAwLCAwKQogICAgICAgICAgICAgICAgb3MuZmNobW9kKGYuZmlsZW5vKCksIG1vZGUpCiAgICAgICAgICAgICAgICBvcy5mc3luYyhmLmZpbGVubygpKQogICAgICAgICAgICBvcy5yZXBsYWNlKHRtcCwgZGVzdCkKICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRtcCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIHJlYWRfc3RkaW4oc2VsZiwgbGltaXQpOgogICAgICAgIHJldHVybiBzeXMuc3RkaW4uYnVmZmVyLnJlYWQobGltaXQgKyAxKQoKICAgIGRlZiB3cml0ZV9ndWVzdF9pbWFnZShzZWxmLCB2bWlkLCBkYXRhKToKICAgICAgICAiIiJBcyByb290OiBgcGN0IGV4ZWMgPHZtaWQ+IC0tIHRlZSA8dGhlIGZpeGVkIGZpbGU+YCB3aXRoIHRoZSBjaGVja2VkIHJlZiBvbiBzdGRpbiAobm8gc2hlbGwpLiIiIgogICAgICAgIHIgPSBzdWJwcm9jZXNzLnJ1bihbIi91c3Ivc2Jpbi9wY3QiLCAiZXhlYyIsIHN0cih2bWlkKSwgIi0tIiwgInRlZSIsIENPTlRST0xMRVJfSU1BR0VfRklMRV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0PWRhdGEsIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIHRpbWVvdXQ9NjApCiAgICAgICAgaWYgci5yZXR1cm5jb2RlICE9IDA6CiAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoZiJwY3QgZXhlYyB7dm1pZH0gdGVlIGV4aXRlZCB7ci5yZXR1cm5jb2RlfToge3Iuc3RkZXJyLmRlY29kZShlcnJvcnM9J3JlcGxhY2UnKS5zdHJpcCgpWzoyMDBdfSIpCgogICAgZGVmIGxvZyhzZWxmLCBsaW5lKToKICAgICAgICBwcmludChsaW5lLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bihbImxvZ2dlciIsICItdCIsICJmZWxob20tcHJpdi1hcHBseSIsICItLSIsIGxpbmVdLCB0aW1lb3V0PTEwLCBjaGVjaz1GYWxzZSkKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIHN1YnByb2Nlc3MuU3VicHJvY2Vzc0Vycm9yKToKICAgICAgICAgICAgcGFzcwoKCmRlZiBzeXN0ZW1kX2VzY2FwZV9wYXRoKHBhdGgpOgogICAgIiIiYHN5c3RlbWQtZXNjYXBlIC0tcGF0aGA6IHN0cmlwIHRoZSBzbGFzaGVzIGF0IGJvdGggZW5kcywgYC9gIC0+IGAtYCwgZXZlcnkgYnl0ZSBvdXRzaWRlIFtBLVphLXowLTk6Xy5dIChhbmQgYQogICAgbGVhZGluZyBgLmApIC0+IGBcXHhOTmAuIiIiCiAgICBwID0gcGF0aC5zdHJpcCgiLyIpCiAgICBvdXQgPSBbXQogICAgZm9yIGksIGNoIGluIGVudW1lcmF0ZShwKToKICAgICAgICBpZiBjaCA9PSAiLyI6CiAgICAgICAgICAgIG91dC5hcHBlbmQoIi0iKQogICAgICAgIGVsaWYgKGNoLmlzYXNjaWkoKSBhbmQgKGNoLmlzYWxudW0oKSBvciBjaCBpbiAiOl8uIikpIGFuZCBub3QgKGkgPT0gMCBhbmQgY2ggPT0gIi4iKToKICAgICAgICAgICAgb3V0LmFwcGVuZChjaCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBvdXQuZXh0ZW5kKCJcXHglMDJ4IiAlIGIgZm9yIGIgaW4gY2guZW5jb2RlKCkpCiAgICByZXR1cm4gIiIuam9pbihvdXQpCgoKZGVmIHRleHRfb2YoZGF0YSwgd2hhdCk6CiAgICBpZiBsZW4oZGF0YSkgPiBNQVhfQllURVM6CiAgICAgICAgcmFpc2UgUmVmdXNlZCgiUDEiLCBmInt3aGF0fSBpcyB0b28gbGFyZ2UiKQogICAgdHJ5OgogICAgICAgIHRleHQgPSBkYXRhLmRlY29kZSgidXRmLTgiKQogICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICByYWlzZSBSZWZ1c2VkKCJQMiIsIGYie3doYXR9IGlzIG5vdCBVVEYtOCB0ZXh0IikKICAgIGlmICJceDAwIiBpbiB0ZXh0IG9yICJcciIgaW4gdGV4dDoKICAgICAgICByYWlzZSBSZWZ1c2VkKCJQMiIsIGYie3doYXR9IGNhcnJpZXMgYSBOVUwgb3IgQ1IgYnl0ZSIpCiAgICByZXR1cm4gdGV4dAoKCmRlZiBwYXJzZV9pbmkodGV4dCwgd2hhdCk6CiAgICAiIiJbU2VjdGlvbl0gLyBLZXk9VmFsdWUgLyBjb21tZW50cyAvIGJsYW5rIGxpbmVzLiBBIGtleSBvdXRzaWRlIGEgc2VjdGlvbiBvciBhIHJlcGVhdGVkIGtleSBpcyByZWZ1c2VkLiIiIgogICAgc2VjdGlvbnMsIGN1ciA9IHt9LCBOb25lCiAgICBmb3IgbiwgcmF3IGluIGVudW1lcmF0ZSh0ZXh0LnNwbGl0KCJcbiIpLCAxKToKICAgICAgICBsaW5lID0gcmF3LnN0cmlwKCkKICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJcXCIpOgogICAgICAgICAgICAjIHN5c3RlbWQgam9pbnMgYSBsaW5lIGVuZGluZyBpbiBhIGJhY2tzbGFzaCB3aXRoIHRoZSBuZXh0IG9uZTsgdGhpcyBwYXJzZXIgZG9lcyBub3QuIFJlZnVzZWQsIHNvIHRoZSB0d28KICAgICAgICAgICAgIyBjYW4gbmV2ZXIgcmVhZCB0aGUgc2FtZSBieXRlcyBkaWZmZXJlbnRseSAocmV2aWV3IDIwMjYtMTAtMDUpLgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJVMiIsIGYie3doYXR9OiBsaW5lIHtufSBlbmRzIHdpdGggYSBiYWNrc2xhc2ggKGEgY29udGludWF0aW9uKSIpCiAgICAgICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCIjIikgb3IgbGluZS5zdGFydHN3aXRoKCI7Iik6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbSA9IHJlLm1hdGNoKHIiXlxbKFtBLVphLXpdKylcXSQiLCBsaW5lKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIGN1ciA9IG0uZ3JvdXAoMSkKICAgICAgICAgICAgaWYgY3VyIGluIHNlY3Rpb25zOgogICAgICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTIiLCBmInt3aGF0fTogc2VjdGlvbiBbe2N1cn1dIHR3aWNlIikKICAgICAgICAgICAgc2VjdGlvbnNbY3VyXSA9IHt9CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgY3VyIGlzIE5vbmUgb3IgIj0iIG5vdCBpbiBsaW5lOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJVMiIsIGYie3doYXR9OiBsaW5lIHtufSBpcyBub3QgS2V5PVZhbHVlIGluc2lkZSBhIHNlY3Rpb24iKQogICAgICAgIGssIHYgPSBsaW5lLnNwbGl0KCI9IiwgMSkKICAgICAgICBrLCB2ID0gay5zdHJpcCgpLCB2LnN0cmlwKCkKICAgICAgICBpZiBrIGluIHNlY3Rpb25zW2N1cl06CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlUyIiwgZiJ7d2hhdH06IHtjdXJ9LntrfSBnaXZlbiB0d2ljZSIpCiAgICAgICAgc2VjdGlvbnNbY3VyXVtrXSA9IHYKICAgIHJldHVybiBzZWN0aW9ucwoKCiMgLS0tLS0tLS0tLSB0aGUgdW5pdCB2ZXJiIC0tLS0tLS0tLS0KZGVmIGNoZWNrX3VuaXQobmFtZSwgdGV4dCk6CiAgICBpZiBub3QgVU5JVF9OQU1FX1JFLm1hdGNoKG5hbWUpIG9yICIvIiBpbiBuYW1lOgogICAgICAgIHJhaXNlIFJlZnVzZWQoIlUxIiwgZiJ1bml0IG5hbWUge25hbWUhcn0gaXMgbm90IG1udC08ZXNjYXBlZCBwYXRoPi5tb3VudHwuYXV0b21vdW50IikKICAgIGtpbmQgPSAiYXV0b21vdW50IiBpZiBuYW1lLmVuZHN3aXRoKCIuYXV0b21vdW50IikgZWxzZSAibW91bnQiCiAgICBzID0gcGFyc2VfaW5pKHRleHQsIG5hbWUpCiAgICBib2R5ID0gIkF1dG9tb3VudCIgaWYga2luZCA9PSAiYXV0b21vdW50IiBlbHNlICJNb3VudCIKICAgICMgW1VuaXRdIGhvbGRzIE9OTFkgd2hhdCB0aGUgcmVuZGVyZXJzIHdyaXRlOiBEZXNjcmlwdGlvbiwgYW5kIEFmdGVyPWxvY2FsLWZzLXByZS50YXJnZXQgb24gYSBsb2NhbCBtb3VudC4gQQogICAgIyBXYW50cz0vUmVxdWlyZXM9L0JlZm9yZT0gbmFtaW5nIGFueSB1bml0IHdvdWxkIHN0YXJ0IGl0IHdpdGggdGhlIG1vdW50IChXYW50cz1yZWJvb3QudGFyZ2V0IOKAlCBmb3VuZCBieSByZXZpZXcKICAgICMgMjAyNi0xMC0wNSksIHNvIG5vbmUgb2YgdGhlbSBpcyBhY2NlcHRlZC4KICAgIGFsbG93ZWQgPSB7IlVuaXQiOiB7IkRlc2NyaXB0aW9uIiwgIkFmdGVyIn0sCiAgICAgICAgICAgICAgIGJvZHk6IHsiV2hlcmUiLCAiVGltZW91dElkbGVTZWMifSBpZiBraW5kID09ICJhdXRvbW91bnQiIGVsc2UgeyJXaGF0IiwgIldoZXJlIiwgIlR5cGUiLCAiT3B0aW9ucyJ9LAogICAgICAgICAgICAgICAiSW5zdGFsbCI6IHsiV2FudGVkQnkifX0KICAgIGZvciBzZWMsIGtleXMgaW4gcy5pdGVtcygpOgogICAgICAgIGlmIHNlYyBub3QgaW4gYWxsb3dlZDoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTIiLCBmIntuYW1lfTogc2VjdGlvbiBbe3NlY31dIGlzIG5vdCBhbGxvd2VkIikKICAgICAgICBiYWQgPSBzZXQoa2V5cykgLSBhbGxvd2VkW3NlY10KICAgICAgICBpZiBiYWQ6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlUyIiwgZiJ7bmFtZX06IFt7c2VjfV0ga2V5KHMpIHtzb3J0ZWQoYmFkKX0gbm90IGFsbG93ZWQiKQogICAgdSA9IHMuZ2V0KCJVbml0Iiwge30pCiAgICBpZiBub3QgREVTQ19SRS5tYXRjaCh1LmdldCgiRGVzY3JpcHRpb24iLCAiIikpOgogICAgICAgIHJhaXNlIFJlZnVzZWQoIlUyIiwgZiJ7bmFtZX06IERlc2NyaXB0aW9uIGhhcyBjb250cm9sIGNoYXJhY3RlcnMiKQogICAgaWYgIkFmdGVyIiBpbiB1IGFuZCB1WyJBZnRlciJdICE9ICJsb2NhbC1mcy1wcmUudGFyZ2V0IjoKICAgICAgICByYWlzZSBSZWZ1c2VkKCJVMiIsIGYie25hbWV9OiBBZnRlcj0gbWF5IG9ubHkgYmUgbG9jYWwtZnMtcHJlLnRhcmdldCIpCiAgICBpbnN0ID0gcy5nZXQoIkluc3RhbGwiLCB7fSkKICAgIGlmIGluc3QgYW5kIGluc3QuZ2V0KCJXYW50ZWRCeSIpICE9ICJtdWx0aS11c2VyLnRhcmdldCI6CiAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTIiLCBmIntuYW1lfTogV2FudGVkQnkgbXVzdCBiZSBtdWx0aS11c2VyLnRhcmdldCIpCiAgICBtID0gcy5nZXQoYm9keSkKICAgIGlmIG5vdCBtIG9yICJXaGVyZSIgbm90IGluIG06CiAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTMiLCBmIntuYW1lfTogbm8gW3tib2R5fV0gV2hlcmU9IikKICAgIHdoZXJlID0gbVsiV2hlcmUiXQogICAgaWYgbm90IFdIRVJFX1JFLm1hdGNoKHdoZXJlKToKICAgICAgICByYWlzZSBSZWZ1c2VkKCJVMyIsIGYie25hbWV9OiBXaGVyZT17d2hlcmV9IGlzIG5vdCAvbW50LzxuYW1lPiBvciAvbW50L2ZlbGhvbS1kcml2ZXMvPG5hbWU+IikKICAgIGlmIHN5c3RlbWRfZXNjYXBlX3BhdGgod2hlcmUpICsgIi4iICsga2luZCAhPSBuYW1lOgogICAgICAgIHJhaXNlIFJlZnVzZWQoIlUzIiwgZiJ7bmFtZX06IHRoZSB1bml0IG5hbWUgZG9lcyBub3QgbWF0Y2ggV2hlcmU9e3doZXJlfSIpCiAgICBpZiBraW5kID09ICJhdXRvbW91bnQiOgogICAgICAgIHQgPSBtLmdldCgiVGltZW91dElkbGVTZWMiLCAiIikKICAgICAgICBpZiB0IGFuZCBub3QgcmUubWF0Y2gociJeWzAtOV17MSw2fSQiLCB0KToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTIiLCBmIntuYW1lfTogVGltZW91dElkbGVTZWMgbXVzdCBiZSBzZWNvbmRzIikKICAgICAgICByZXR1cm4KICAgIHdoYXQsIHR5cCA9IG0uZ2V0KCJXaGF0IiwgIiIpLCBtLmdldCgiVHlwZSIsICIiKQogICAgb3B0cyA9IFtvIGZvciBvIGluIG0uZ2V0KCJPcHRpb25zIiwgIiIpLnNwbGl0KCIsIikgaWYgb10KICAgIG5ldCA9IEZhbHNlCiAgICBtdSA9IHJlLm1hdGNoKHIiXi9kZXYvZGlzay9ieS11dWlkLyguKykkIiwgd2hhdCkKICAgIGlmIG11OgogICAgICAgIGlmIG5vdCBVVUlEX1JFLm1hdGNoKG11Lmdyb3VwKDEpKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTQiLCBmIntuYW1lfTogV2hhdD0gaXMgbm90IGEgZmlsZXN5c3RlbSBVVUlEIikKICAgICAgICBpZiB0eXAgYW5kIHR5cCBub3QgaW4gTE9DQUxfVFlQRVM6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlU0IiwgZiJ7bmFtZX06IFR5cGU9e3R5cH0gaXMgbm90IGEgbG9jYWwgZmlsZXN5c3RlbSIpCiAgICBlbHNlOgogICAgICAgIG5ldCA9IFRydWUKICAgICAgICBpZiB0eXAgbm90IGluIE5FVF9UWVBFUzoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTQiLCBmIntuYW1lfTogV2hhdD0gaXMgbmVpdGhlciAvZGV2L2Rpc2svYnktdXVpZC88dXVpZD4gbm9yIGEgbmV0d29yayBzb3VyY2Ugd2l0aCBUeXBlPW5mcy9uZnM0L2NpZnMiKQogICAgICAgIGlmIHR5cCA9PSAiY2lmcyI6CiAgICAgICAgICAgIG1tID0gcmUubWF0Y2gociJeLy8oW14vXSspLyguKykkIiwgd2hhdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtbSA9IHJlLm1hdGNoKHIiXihbXi86XVteOl0qKTooLy4qKSQiLCB3aGF0KQogICAgICAgIGlmIG5vdCBtbSBvciBub3QgSE9TVF9SRS5tYXRjaChtbS5ncm91cCgxKSkgb3Igbm90IE5FVF9QQVRIX1JFLm1hdGNoKG1tLmdyb3VwKDIpKSBvciAiLi4iIGluIG1tLmdyb3VwKDIpLnNwbGl0KCIvIik6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIlU0IiwgZiJ7bmFtZX06IFdoYXQ9IGlzIG5vdCBhIGNsZWFuIHt0eXB9IHNvdXJjZSIpCiAgICAgICAgaWYgbm90IHdoZXJlLnN0YXJ0c3dpdGgoIi9tbnQvZmVsaG9tLWRyaXZlcy8iKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTMiLCBmIntuYW1lfTogYSBuZXR3b3JrIHNoYXJlIG1vdW50cyBvbmx5IHVuZGVyIC9tbnQvZmVsaG9tLWRyaXZlcy8iKQogICAgZm9yIG8gaW4gb3B0czoKICAgICAgICBpZiBub3QgT1BUX1JFLm1hdGNoKG8pOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJVNSIsIGYie25hbWV9OiBtb3VudCBvcHRpb24ge28hcn0gaGFzIGNoYXJhY3RlcnMgYSBtb3VudCBvcHRpb24gbmV2ZXIgbmVlZHMiKQogICAgICAgIGlmIG8uc3BsaXQoIj0iLCAxKVswXS5sb3dlcigpIGluIEZPUkJJRERFTl9PUFRTIG9yIG8ubG93ZXIoKS5zdGFydHN3aXRoKCJ4LW1vdW50LiIpOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJVNSIsIGYie25hbWV9OiBtb3VudCBvcHRpb24ge28uc3BsaXQoJz0nLCAxKVswXSFyfSBpcyBub3QgYWxsb3dlZCIpCiAgICBpZiBuZXQgYW5kIG5vdCB7Im5vc3VpZCIsICJub2RldiJ9IDw9IHNldChvcHRzKToKICAgICAgICAjIEEgbmV0d29yayBzZXJ2ZXIgaXMgb3V0c2lkZSB0aGUgYm94OiBhIHNldC11aWQgZmlsZSBvbiBpdCBtdXN0IG5ldmVyIHJ1biBhcyByb290IGhlcmUuCiAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTUiLCBmIntuYW1lfTogYSBuZXR3b3JrIHNoYXJlIG11c3QgY2Fycnkgbm9zdWlkLG5vZGV2IikKCgojIC0tLS0tLS0tLS0gZG5zbWFzcSAtLS0tLS0tLS0tCmRlZiBfaXAodiwgdjY9VHJ1ZSk6CiAgICB0cnk6CiAgICAgICAgYSA9IGlwYWRkcmVzcy5pcF9hZGRyZXNzKHYpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiB2NiBvciBhLnZlcnNpb24gPT0gNAoKCkRPTUFJTl9SRSA9IHJlLmNvbXBpbGUociJeW0EtWmEtejAtOV0oW0EtWmEtejAtOS1dezAsNjJ9KShcLltBLVphLXowLTldKFtBLVphLXowLTktXXswLDYyfSkpKiQiKQoKCmRlZiBjaGVja19kbnNtYXNxKHRleHQpOgogICAgZm9yIG4sIHJhdyBpbiBlbnVtZXJhdGUodGV4dC5zcGxpdCgiXG4iKSwgMSk6CiAgICAgICAgbGluZSA9IHJhdy5zdHJpcCgpCiAgICAgICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCIjIik6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgbGluZSBpbiAoImJpbmQtaW50ZXJmYWNlcyIsICJuby1yZXNvbHYiKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBrLCBfLCB2ID0gbGluZS5wYXJ0aXRpb24oIj0iKQogICAgICAgIGlmIGsgPT0gImxpc3Rlbi1hZGRyZXNzIiBhbmQgX2lwKHYsIHY2PUZhbHNlKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBrID09ICJzZXJ2ZXIiIGFuZCAoX2lwKHYpIG9yICh2LmNvdW50KCIjIikgPT0gMSBhbmQgX2lwKHYuc3BsaXQoIiMiKVswXSkgYW5kIHYuc3BsaXQoIiMiKVsxXS5pc2RpZ2l0KCkpKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBtID0gcmUubWF0Y2gociJeLyhbXi9dKykvJCIsIHYpCiAgICAgICAgaWYgayA9PSAibG9jYWwiIGFuZCBtIGFuZCBET01BSU5fUkUubWF0Y2gobS5ncm91cCgxKSk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbSA9IHJlLm1hdGNoKHIiXi8oW14vXSspLyhbXi9dKykkIiwgdikKICAgICAgICBpZiBrID09ICJhZGRyZXNzIiBhbmQgbSBhbmQgRE9NQUlOX1JFLm1hdGNoKG0uZ3JvdXAoMSkpIGFuZCBfaXAobS5ncm91cCgyKSwgdjY9RmFsc2UpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHJhaXNlIFJlZnVzZWQoIkQxIiwgZiJkbnNtYXNxIGxpbmUge259ICh7ayBvciBsaW5lWzoyMF0hcn0pIGlzIG5vdCBvbmUgdGhlIHJlc29sdmVyIHdyaXRlcyIpCgoKIyAtLS0tLS0tLS0tIFdpcmVHdWFyZCAtLS0tLS0tLS0tCmRlZiBjaGVja193Zyh0ZXh0KToKICAgIHMgPSBwYXJzZV9pbmkodGV4dCwgIndnLWZlbGhvbS5jb25mIikKICAgIGlmIHNldChzKSAhPSB7IkludGVyZmFjZSIsICJQZWVyIn06CiAgICAgICAgcmFpc2UgUmVmdXNlZCgiVzEiLCAid2ctZmVsaG9tLmNvbmYgbXVzdCBob2xkIGV4YWN0bHkgW0ludGVyZmFjZV0gYW5kIFtQZWVyXSIpCiAgICBpLCBwID0gc1siSW50ZXJmYWNlIl0sIHNbIlBlZXIiXQogICAgaWYgc2V0KGkpIC0geyJQcml2YXRlS2V5IiwgIkFkZHJlc3MiLCAiTVRVIn0gb3Igc2V0KHApIC0geyJQdWJsaWNLZXkiLCAiRW5kcG9pbnQiLCAiQWxsb3dlZElQcyIsICJQZXJzaXN0ZW50S2VlcGFsaXZlIn06CiAgICAgICAgcmFpc2UgUmVmdXNlZCgiVzEiLCAid2ctZmVsaG9tLmNvbmYgY2FycmllcyBhIGtleSB0aGUgYWdlbnQgbmV2ZXIgd3JpdGVzIChQb3N0VXAvUHJlVXAvLi4uIHJ1biBhcyByb290KSIpCiAgICBpZiBub3QgV0dfS0VZX1JFLm1hdGNoKGkuZ2V0KCJQcml2YXRlS2V5IiwgIiIpKSBvciBub3QgV0dfS0VZX1JFLm1hdGNoKHAuZ2V0KCJQdWJsaWNLZXkiLCAiIikpOgogICAgICAgIHJhaXNlIFJlZnVzZWQoIlcyIiwgImEgV2lyZUd1YXJkIGtleSBpcyBub3QgMzIgYnl0ZXMgb2YgYmFzZTY0IikKICAgIHRyeToKICAgICAgICBhID0gaXBhZGRyZXNzLmlwX25ldHdvcmsoaS5nZXQoIkFkZHJlc3MiLCAiIiksIHN0cmljdD1GYWxzZSkKICAgICAgICBpZiBhLnZlcnNpb24gIT0gNCBvciBhLnByZWZpeGxlbiAhPSAzMjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgIGlmIG5vdCAoMTI4MCA8PSBpbnQoaS5nZXQoIk1UVSIsICIxMjgwIikpIDw9IDE1MDApOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgaG9zdCwgXywgcG9ydCA9IHAuZ2V0KCJFbmRwb2ludCIsICIiKS5ycGFydGl0aW9uKCI6IikKICAgICAgICBpZiBpcGFkZHJlc3MuaXBfYWRkcmVzcyhob3N0KS52ZXJzaW9uICE9IDQgb3Igbm90ICgxIDw9IGludChwb3J0KSA8PSA2NTUzNSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICBmb3IgbiBpbiBwLmdldCgiQWxsb3dlZElQcyIsICIiKS5zcGxpdCgiLCIpOgogICAgICAgICAgICBpZiBpcGFkZHJlc3MuaXBfbmV0d29yayhuLnN0cmlwKCksIHN0cmljdD1UcnVlKS5wcmVmaXhsZW4gIT0gMzI6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgaWYgbm90ICgwIDw9IGludChwLmdldCgiUGVyc2lzdGVudEtlZXBhbGl2ZSIsICIyNSIpKSA8PSAzNjAwKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmFpc2UgUmVmdXNlZCgiVzIiLCAiYW4gQWRkcmVzcy9NVFUvRW5kcG9pbnQvQWxsb3dlZElQcy9QZXJzaXN0ZW50S2VlcGFsaXZlIHZhbHVlIGlzIG5vdCB3aGF0IHRoZSBhZ2VudCByZW5kZXJzIikKCgojIC0tLS0tLS0tLS0gT09CIHNzaGQgLS0tLS0tLS0tLQpkZWYgcmVuZGVyX3NzaGQocG9ydCk6CiAgICAiIiJCeXRlLWlkZW50aWNhbCB0byBmZWxob21zc2hkLnJlbmRlckNvbmZpZyAoaW50ZXJuYWwvZmVsaG9tc3NoZC9jb25maWcuZ28pIOKAlCBwaW5uZWQgYnkgYSBHbyB0ZXN0LiIiIgogICAgcmV0dXJuICgiIyBmZWxob20gT09CIHNzaGQg4oCUIGFnZW50LW1hbmFnZWQgKEgxKTsgRE8gTk9UIEVESVRcbiIKICAgICAgICAgICAgZiJQb3J0IHtwb3J0fVxuIgogICAgICAgICAgICAiTGlzdGVuQWRkcmVzcyAwLjAuMC4wXG4iCiAgICAgICAgICAgICJMaXN0ZW5BZGRyZXNzIDo6XG4iCiAgICAgICAgICAgICJIb3N0S2V5IC9ldGMvZmVsaG9tLXNzaGQvc3NoX2hvc3RfZWQyNTUxOV9rZXlcbiIKICAgICAgICAgICAgIlBpZEZpbGUgL3J1bi9mZWxob20tc3NoZC5waWRcbiIKICAgICAgICAgICAgIkF1dGhvcml6ZWRLZXlzRmlsZSAvZXRjL2ZlbGhvbS1zc2hkL2F1dGhvcml6ZWRfa2V5cy8ldVxuIgogICAgICAgICAgICAiUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBub1xuIgogICAgICAgICAgICAiUGVybWl0Um9vdExvZ2luIHByb2hpYml0LXBhc3N3b3JkXG4iCiAgICAgICAgICAgICJQdWJrZXlBdXRoZW50aWNhdGlvbiB5ZXNcbiIKICAgICAgICAgICAgIktiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24gbm9cbiIKICAgICAgICAgICAgIlVzZVBBTSB5ZXNcbiIKICAgICAgICAgICAgIkFsbG93VXNlcnMgcm9vdCBmZWxob20tb3BcbiIKICAgICAgICAgICAgIlgxMUZvcndhcmRpbmcgbm9cbiIKICAgICAgICAgICAgIlN1YnN5c3RlbSBzZnRwIGludGVybmFsLXNmdHBcbiIpCgoKZGVmIGNoZWNrX3NzaGQodGV4dCk6CiAgICBtID0gcmUuc2VhcmNoKHIiXlBvcnQgKFswLTldezEsNX0pJCIsIHRleHQsIHJlLk0pCiAgICBpZiBub3QgbSBvciBub3QgKDEgPD0gaW50KG0uZ3JvdXAoMSkpIDw9IDY1NTM1KSBvciBpbnQobS5ncm91cCgxKSkgPT0gMjI6CiAgICAgICAgcmFpc2UgUmVmdXNlZCgiUzEiLCAic3NoZF9jb25maWcgaGFzIG5vIFBvcnQgKG9yIGNsYWltcyA6MjIsIHRoZSBob3VzZWhvbGQncyBzc2hkKSIpCiAgICBpZiB0ZXh0ICE9IHJlbmRlcl9zc2hkKGludChtLmdyb3VwKDEpKSk6CiAgICAgICAgcmFpc2UgUmVmdXNlZCgiUzEiLCAic3NoZF9jb25maWcgZGlmZmVycyBmcm9tIHRoZSBvbmUgZml4ZWQgdGVtcGxhdGUgKG9ubHkgdGhlIFBvcnQgbWF5IHZhcnkpIikKCgpkZWYgY2hlY2tfa2V5KHRleHQpOgogICAgbGluZXMgPSBbbCBmb3IgbCBpbiB0ZXh0LnNwbGl0KCJcbiIpIGlmIGwuc3RyaXAoKV0KICAgIGlmIGxlbihsaW5lcykgPiAxOgogICAgICAgIHJhaXNlIFJlZnVzZWQoIlMyIiwgImZlbGhvbS1vcCdzIGF1dGhvcml6ZWRfa2V5cyBob2xkcyBtb3JlIHRoYW4gb25lIGtleSIpCiAgICBpZiBsaW5lcyBhbmQgbm90IEtFWV9MSU5FX1JFLm1hdGNoKGxpbmVzWzBdKToKICAgICAgICByYWlzZSBSZWZ1c2VkKCJTMiIsICJ0aGUga2V5IGxpbmUgaXMgbm90IGEgcGxhaW4gcHVibGljIGtleSAobm8gb3B0aW9ucyBzdWNoIGFzIGNvbW1hbmQ9IG9yIGZyb209KSIpCgoKIyAtLS0tLS0tLS0tIG1haW4gLS0tLS0tLS0tLQpkZWYgcGxhbihhcmd2KToKICAgICIiIih2ZXJiLCBzb3VyY2UsIGRlc3QsIG1vZGUsIGNoZWNrZXIpIGZvciBhbiBhcmd2LCBvciBSZWZ1c2VkKCJBMSIpLiIiIgogICAgaWYgbm90IGFyZ3Ygb3IgYXJndlswXSBub3QgaW4gVkVSQlM6CiAgICAgICAgcmFpc2UgUmVmdXNlZCgiQTEiLCAidXNhZ2U6IGZlbGhvbS1wcml2LWFwcGx5IHVuaXQgPG5hbWU+IHwgZG5zbWFzcSA8dG1wPiA8bmFtZT4gfCB3ZyB8IHNzaGQtY29uZmlnIHwgc3NoZC1rZXkiKQogICAgdiwgcmVzdCA9IGFyZ3ZbMF0sIGFyZ3ZbMTpdCiAgICBpZiB2ID09ICJ1bml0IiBhbmQgbGVuKHJlc3QpID09IDE6CiAgICAgICAgaWYgbm90IFVOSVRfTkFNRV9SRS5tYXRjaChyZXN0WzBdKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiVTEiLCBmInVuaXQgbmFtZSB7cmVzdFswXSFyfSBpcyBub3QgbW50LTxlc2NhcGVkIHBhdGg+Lm1vdW50fC5hdXRvbW91bnQiKQogICAgICAgIHJldHVybiB2LCBvcy5wYXRoLmpvaW4oVU5JVFNfU1JDLCByZXN0WzBdKSwgb3MucGF0aC5qb2luKFVOSVRfRElSLCByZXN0WzBdKSwgMG82NDQsIGxhbWJkYSB0OiBjaGVja191bml0KHJlc3RbMF0sIHQpCiAgICBpZiB2ID09ICJkbnNtYXNxIiBhbmQgbGVuKHJlc3QpID09IDI6CiAgICAgICAgaWYgbm90IEROU01BU1FfVE1QX1JFLm1hdGNoKHJlc3RbMF0pIG9yIG5vdCBETlNNQVNRX05BTUVfUkUubWF0Y2gocmVzdFsxXSk6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIkQyIiwgImRuc21hc3Egd2FudHMgL3RtcC9mZWxob20tcmVzb2x2ZXItPGRpZ2l0cz4uY29uZiBhbmQgZmVsaG9tLTxuYW1lPi5jb25mIikKICAgICAgICByZXR1cm4gdiwgcmVzdFswXSwgb3MucGF0aC5qb2luKEROU01BU1FfRElSLCByZXN0WzFdKSwgMG82NDQsIGNoZWNrX2Ruc21hc3EKICAgIGlmIHYgPT0gIndnIiBhbmQgbm90IHJlc3Q6CiAgICAgICAgcmV0dXJuIHYsIFdHX1NSQywgV0dfREVTVCwgMG82MDAsIGNoZWNrX3dnCiAgICBpZiB2ID09ICJzc2hkLWNvbmZpZyIgYW5kIG5vdCByZXN0OgogICAgICAgIHJldHVybiB2LCBTU0hEX1NSQywgU1NIRF9ERVNULCAwbzY0NCwgY2hlY2tfc3NoZAogICAgaWYgdiA9PSAic3NoZC1rZXkiIGFuZCBub3QgcmVzdDoKICAgICAgICByZXR1cm4gdiwgS0VZX1NSQywgS0VZX0RFU1QsIDBvNjQ0LCBjaGVja19rZXkKICAgIHJhaXNlIFJlZnVzZWQoIkExIiwgZiJ3cm9uZyBhcmd1bWVudHMgZm9yIHt2fSIpCgoKZGVmIGNvbnRyb2xsZXJfaW1hZ2UocmVzdCwgaG9zdCk6CiAgICAiIiJSLTg2MSAoYSkgQTE6IHJlYWQgdGhlIHJlZiBvbiBzdGRpbiwgY2hlY2sgaXQsIHdyaXRlIGl0IElOU0lERSB0aGUgZ3Vlc3QgYXMgcm9vdC4iIiIKICAgIHRyeToKICAgICAgICBpZiBsZW4ocmVzdCkgIT0gMSBvciBub3QgVk1JRF9SRS5tYXRjaChyZXN0WzBdKToKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiQTEiLCAidXNhZ2U6IGZlbGhvbS1wcml2LWFwcGx5IGNvbnRyb2xsZXItaW1hZ2UgPHZtaWQ+ICAodGhlIHJlZiBvbiBzdGRpbikiKQogICAgICAgIHJhdyA9IGhvc3QucmVhZF9zdGRpbihDT05UUk9MTEVSX0lNQUdFX01BWCkKICAgICAgICBpZiBsZW4ocmF3KSA+IENPTlRST0xMRVJfSU1BR0VfTUFYOgogICAgICAgICAgICByYWlzZSBSZWZ1c2VkKCJJMSIsIGYidGhlIGltYWdlIHJlZiBpcyBsb25nZXIgdGhhbiB7Q09OVFJPTExFUl9JTUFHRV9NQVh9IGJ5dGVzIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRleHQgPSByYXcuZGVjb2RlKCJhc2NpaSIpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgUmVmdXNlZCgiSTEiLCAidGhlIGltYWdlIHJlZiBpcyBub3QgQVNDSUkiKQogICAgICAgIHJlZiA9IHRleHRbOi0xXSBpZiB0ZXh0LmVuZHN3aXRoKCJcbiIpIGVsc2UgdGV4dAogICAgICAgIGlmIG5vdCBDT05UUk9MTEVSX0lNQUdFX1JFLm1hdGNoKHJlZikgb3IgIlxuIiBpbiByZWY6CiAgICAgICAgICAgIHJhaXNlIFJlZnVzZWQoIkkxIiwgInRoZSBpbWFnZSByZWYgaXMgbm90IGdpdGVhLmRvb3BsZXguaHUvYWRtaW4vZmVsaG9tLWNvbnRyb2xsZXI6PHgueS56PiIpCiAgICBleGNlcHQgUmVmdXNlZCBhcyBlOgogICAgICAgIGhvc3QubG9nKGYiZmVsaG9tLXByaXYtYXBwbHk6IFJFRlVTRUQgW3tlLnJ1bGV9XSBjb250cm9sbGVyLWltYWdlIHsnICcuam9pbihyZXN0KVs6NDBdfToge2UucmVhc29ufSIpCiAgICAgICAgcmV0dXJuIDIgaWYgZS5ydWxlID09ICJBMSIgZWxzZSAzCiAgICB2bWlkID0gaW50KHJlc3RbMF0pCiAgICB0cnk6CiAgICAgICAgaG9zdC53cml0ZV9ndWVzdF9pbWFnZSh2bWlkLCAocmVmICsgIlxuIikuZW5jb2RlKCkpCiAgICBleGNlcHQgKE9TRXJyb3IsIHN1YnByb2Nlc3MuU3VicHJvY2Vzc0Vycm9yKSBhcyBlOgogICAgICAgIGhvc3QubG9nKGYiZmVsaG9tLXByaXYtYXBwbHk6IEZBSUxFRCBjb250cm9sbGVyLWltYWdlIHt2bWlkfToge2V9IikKICAgICAgICByZXR1cm4gNAogICAgaG9zdC5sb2coZiJmZWxob20tcHJpdi1hcHBseTogV1JPVEUgY29udHJvbGxlci1pbWFnZSB7dm1pZH0ge3JlZn0iKQogICAgcmV0dXJuIDAKCgpkZWYgbWFpbihhcmd2LCBob3N0PU5vbmUpOgogICAgaG9zdCA9IGhvc3Qgb3IgSG9zdCgpCiAgICBpZiBhcmd2ID09IFsiLS1zZWxmLWNoZWNrIl06CiAgICAgICAgcHJpbnQoImZlbGhvbS1wcml2LWFwcGx5IG9rIHZlcmJzPSIgKyAiLCIuam9pbihWRVJCUykpCiAgICAgICAgcmV0dXJuIDAKICAgIGlmIGxlbihhcmd2KSA+PSAzIGFuZCBhcmd2WzBdID09ICItLWNoZWNrIjoKICAgICAgICAjIENIRUNLIE9OTFkgKHRlc3RzIGFuZCB0aGUgR28gY29udHJhY3QgdGVzdHMpOiBgLS1jaGVjayA8dmVyYj4gWzxuYW1lPl0gPGZpbGU+YCB2YWxpZGF0ZXMgPGZpbGU+IGFzIHRoYXQKICAgICAgICAjIHZlcmIgd291bGQgYW5kIGluc3RhbGxzIG5vdGhpbmcuIE5vdCBpbiBzdWRvZXJzLiBQcmludHMgT0sgb3IgdGhlIHJ1bGU7IG5ldmVyIHRoZSBjb250ZW50LgogICAgICAgIHZlcmIsIGZpbGUgPSBhcmd2WzFdLCBhcmd2Wy0xXQogICAgICAgIHRyeToKICAgICAgICAgICAgXywgXywgXywgXywgY2hlY2tlciA9IHBsYW4oW3ZlcmJdICsgYXJndlsyOi0xXSBpZiB2ZXJiICE9ICJkbnNtYXNxIiBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2ZXJiLCAiL3RtcC9mZWxob20tcmVzb2x2ZXItMS5jb25mIiwgYXJndlsyXV0pCiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlLCAicmIiKSBhcyBmOgogICAgICAgICAgICAgICAgY2hlY2tlcih0ZXh0X29mKGYucmVhZCgpLCBmaWxlKSkKICAgICAgICBleGNlcHQgUmVmdXNlZCBhcyBlOgogICAgICAgICAgICBwcmludChmIlJFRlVTRUQgW3tlLnJ1bGV9XSB7ZS5yZWFzb259IikKICAgICAgICAgICAgcmV0dXJuIDMKICAgICAgICBwcmludCgiT0siKQogICAgICAgIHJldHVybiAwCiAgICBpZiBhcmd2IGFuZCBhcmd2WzBdID09ICJjb250cm9sbGVyLWltYWdlIjoKICAgICAgICByZXR1cm4gY29udHJvbGxlcl9pbWFnZShhcmd2WzE6XSwgaG9zdCkKICAgIHRyeToKICAgICAgICB2ZXJiLCBzcmMsIGRlc3QsIG1vZGUsIGNoZWNrZXIgPSBwbGFuKGFyZ3YpCiAgICAgICAgZGF0YSA9IGhvc3QucmVhZF9zb3VyY2Uoc3JjKQogICAgICAgIGNoZWNrZXIodGV4dF9vZihkYXRhLCBzcmMpKQogICAgZXhjZXB0IFJlZnVzZWQgYXMgZToKICAgICAgICBob3N0LmxvZyhmImZlbGhvbS1wcml2LWFwcGx5OiBSRUZVU0VEIFt7ZS5ydWxlfV0geycgJy5qb2luKGFyZ3YpWzoxNjBdfToge2UucmVhc29ufSIpCiAgICAgICAgcmV0dXJuIDIgaWYgZS5ydWxlID09ICJBMSIgZWxzZSAzCiAgICBpZiBob3N0LnJlYWRfZGVzdChkZXN0KSA9PSBkYXRhOgogICAgICAgIGhvc3QubG9nKGYiZmVsaG9tLXByaXYtYXBwbHk6IFNBTUUge3ZlcmJ9IHtkZXN0fSIpCiAgICAgICAgcmV0dXJuIDAKICAgIHRyeToKICAgICAgICBob3N0Lmluc3RhbGwoZGVzdCwgZGF0YSwgbW9kZSkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgaG9zdC5sb2coZiJmZWxob20tcHJpdi1hcHBseTogRkFJTEVEIHt2ZXJifSB7ZGVzdH06IHtlfSIpCiAgICAgICAgcmV0dXJuIDQKICAgIGhvc3QubG9nKGYiZmVsaG9tLXByaXYtYXBwbHk6IElOU1RBTExFRCB7dmVyYn0ge2Rlc3R9ICh7bGVuKGRhdGEpfSBieXRlcykiKQogICAgcmV0dXJuIDAKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQo=",
   "mode": "0o755",
   "path": "/usr/local/sbin/felhom-priv-apply",
   "policy": "replace",
   "sha256": "be2312f0864c3fb75af53d54de3d9ef0c585a44f60604abf09c85bfd9ae49274",
   "source": "configs/felhom-priv-apply"
  },
  {
   "check": "sh",
   "content_b64": "IyEvYmluL3NoCiMgZmVsaG9tLWFnZW50IGd1ZXN0IHByZS1zdGFydCBzZWxmLWhlYWwgaG9vayAoQzEgbmV0KS4gUFZFIGNhbGxzOiA8c2NyaXB0PiA8dm1pZD4gPHBoYXNlPi4KL3Vzci9sb2NhbC9iaW4vZmVsaG9tLWFnZW50IGd1ZXN0LWhvb2sgIiQxIiAiJDIiIHx8IHRydWUKZXhpdCAwCg==",
   "mode": "0o755",
   "path": "/var/lib/vz/snippets/felhom-guest-hook.sh",
   "policy": "replace",
   "sha256": "3e62c612385622221a64ae98fa1f4cfc1eaf2037e721390fdbd5122191d0405b",
   "source": "configs/felhom-guest-hook.sh"
  },
  {
   "check": "sh",
   "content_b64": "IyEvYmluL3NoCiMgZmVsaG9tIHN0YWJsZSBkcml2ZSBwYXJlbnQ6IGEgU0hBUkVEIGJpbmQgc28gdGhlIGFnZW50IGNhbiBzd2FwIGJhY2tpbmcgZHJpdmVzIHVuZGVybmVhdGggaXQgYW5kIHRoZQojIGd1ZXN0IHNlZXMgdGhlIGNoYW5nZSBsaXZlIChubyByZXN0YXJ0KS4gTVVTVCBydW4gYmVmb3JlIHB2ZS1ndWVzdHMgc28gdGhlIGd1ZXN0J3MgcGFyZW50IGJpbmQgaW5oZXJpdHMKIyB0aGUgc2hhcmVkIHBlZXIgZ3JvdXAgKHNsYXZlKS4gSW5zdGFsbGVkICsgZW5hYmxlZCBieSBmZWxob20tYWdlbnQuIElkZW1wb3RlbnQuCnNldCAtZQpta2RpciAtcCAvbW50L2ZlbGhvbS1kcml2ZXMKIyBJc29sYXRlICsgc2hhcmUgT05MWSB3aGVuIGZpcnN0IGNyZWF0aW5nIHRoZSBzZWxmLWJpbmQgKGEgZnJlc2ggYm9vdCkuIFRoZSBzZWxmLWJpbmQgaW5oZXJpdHMgdGhlIHJvb3QKIyBtb3VudCdzIHNoYXJlZCBwZWVyIGdyb3VwLCBzbyBtYWtlLXByaXZhdGUgZGV0YWNoZXMgaXQgKGVsc2UgYmluZHMgdW5kZXIgaXQgRE9VQkxFIHZpYSB0aGUgcm9vdCBwZWVyKSwKIyB0aGVuIG1ha2Utc2hhcmVkIGdpdmVzIGl0IGl0cyBvd24gZ3JvdXAgd2hvc2Ugb25seSBzbGF2ZSBpcyB0aGUgZ3Vlc3QncyBwYXJlbnQgYmluZC4gUmUtcnVubmluZyB0aGlzIG9uCiMgYW4gZXhpc3RpbmcgcGFyZW50IHdvdWxkIGNodXJuIHRoZSBwZWVyLWdyb3VwIGlkIGFuZCBvcnBoYW4gdGhlIGd1ZXN0J3Mgc2xhdmUg4oCUIHNvIGd1YXJkIG9uIG1vdW50cG9pbnQuCmlmICEgbW91bnRwb2ludCAtcSAvbW50L2ZlbGhvbS1kcml2ZXM7IHRoZW4KICBtb3VudCAtLWJpbmQgL21udC9mZWxob20tZHJpdmVzIC9tbnQvZmVsaG9tLWRyaXZlcwogIG1vdW50IC0tbWFrZS1wcml2YXRlIC9tbnQvZmVsaG9tLWRyaXZlcwogIG1vdW50IC0tbWFrZS1zaGFyZWQgL21udC9mZWxob20tZHJpdmVzCmZpCg==",
   "mode": "0o755",
   "path": "/usr/local/sbin/felhom-shared-parent.sh",
   "policy": "replace",
   "sha256": "3517a6f813d7177a6ab1ad8fefb7f8770b4902f17860913ed1986551ee65bf66",
   "source": "configs/felhom-shared-parent.sh"
  },
  {
   "check": "unit",
   "content_b64": "W1VuaXRdCkRlc2NyaXB0aW9uPUZlbGhvbSBzdGFibGUgZHJpdmUgcGFyZW50IChzaGFyZWQgYmluZCBmb3IgbGl2ZSBkcml2ZSBob3Qtc3dhcCkKQWZ0ZXI9bG9jYWwtZnMudGFyZ2V0CkJlZm9yZT1wdmUtZ3Vlc3RzLnNlcnZpY2UKQ29uZGl0aW9uUGF0aEV4aXN0cz0vdXNyL2xvY2FsL3NiaW4vZmVsaG9tLXNoYXJlZC1wYXJlbnQuc2gKCltTZXJ2aWNlXQpUeXBlPW9uZXNob3QKUmVtYWluQWZ0ZXJFeGl0PXllcwpFeGVjU3RhcnQ9L3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1zaGFyZWQtcGFyZW50LnNoCgpbSW5zdGFsbF0KV2FudGVkQnk9cHZlLWd1ZXN0cy5zZXJ2aWNlIG11bHRpLXVzZXIudGFyZ2V0Cg==",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-shared-parent.service",
   "policy": "replace",
   "sha256": "22ba4b3d98228f15e833e2b0f4410ea615d19353f504f2130ce3387434a3ebf1",
   "source": "configs/felhom-shared-parent.service"
  },
  {
   "check": "unit",
   "content_b64": "IyBmZWxob20tY3Jhc2gtZ3VhcmQg4oCUIGEgY3Jhc2hlZCBob3N0IHJlc3RhcnRzIGJ5IGl0c2VsZiwgd2l0aCBhIGxpbWl0IChgMDlgIGRlY2lzaW9uIDg4LCBSLTg1MSwgYDExYCDCpzUuOSkuCiMgU3RhcnRzIGVhcmx5IGF0IGJvb3QgKHNldHMga2VybmVsLnBhbmljIGZvciBUSElTIGJvb3QpOyBpdHMgRXhlY1N0b3Agd3JpdGVzIHRoZSBjbGVhbi1zdG9wIG1hcmtlciBkdXJpbmcgYW4gb3JkZXJseQojIHNodXRkb3duIG9yIHJlYm9vdC4gQSBib290IHRoYXQgZmluZHMgbm8gbWFya2VyIGZvbGxvd2VkIGEgY3Jhc2gsIGEgcG93ZXIgY3V0IG9yIGEgaGFyZCByZXNldC4KW1VuaXRdCkRlc2NyaXB0aW9uPUZlbGhvbSBjcmFzaCBndWFyZCAocmVzdGFydCBhZnRlciBhIGtlcm5lbCBjcmFzaCwgd2l0aCBhIGxpbWl0KQpEZWZhdWx0RGVwZW5kZW5jaWVzPW5vCkFmdGVyPWxvY2FsLWZzLnRhcmdldApCZWZvcmU9c3lzaW5pdC50YXJnZXQgc2h1dGRvd24udGFyZ2V0CkNvbmZsaWN0cz1zaHV0ZG93bi50YXJnZXQKUmVxdWlyZXNNb3VudHNGb3I9L3Zhci9saWIKCltTZXJ2aWNlXQpUeXBlPW9uZXNob3QKUmVtYWluQWZ0ZXJFeGl0PXllcwpFeGVjU3RhcnQ9L3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1jcmFzaC1ndWFyZCBib290CkV4ZWNTdG9wPS91c3IvbG9jYWwvc2Jpbi9mZWxob20tY3Jhc2gtZ3VhcmQgY2xlYW4tc3RvcAoKW0luc3RhbGxdCldhbnRlZEJ5PXN5c2luaXQudGFyZ2V0Cg==",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-crash-guard.service",
   "policy": "replace",
   "sha256": "5580ad6cdd51990be2fadc5dd476aa4a77c1988c5fd63e5b8b423e4cb5975c06",
   "source": "configs/felhom-crash-guard.service"
  },
  {
   "check": "unit",
   "content_b64": "IyBIb3VybHk6IGEgdHJpcHBlZCBjcmFzaCBndWFyZCByZS1hcm1zIGFmdGVyIFJFQVJNX0hPVVJTIG9mIG5vcm1hbCBydW5uaW5nIChmZWxob20tY3Jhc2gtZ3VhcmQgY2hlY2spLgpbVW5pdF0KRGVzY3JpcHRpb249RmVsaG9tIGNyYXNoIGd1YXJkIHJlLWFybSBjaGVjawoKW1NlcnZpY2VdClR5cGU9b25lc2hvdApFeGVjU3RhcnQ9L3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1jcmFzaC1ndWFyZCBjaGVjawo=",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-crash-guard-check.service",
   "policy": "replace",
   "sha256": "93d2c4749fe63ab12425b5344a0f04151a8ad2b1b01d4d23c93fbc644310926e",
   "source": "configs/felhom-crash-guard-check.service"
  },
  {
   "check": "unit",
   "content_b64": "W1VuaXRdCkRlc2NyaXB0aW9uPUZlbGhvbSBjcmFzaCBndWFyZCByZS1hcm0gY2hlY2sgKGhvdXJseSkKCltUaW1lcl0KT25Cb290U2VjPTE1bWluCk9uVW5pdEFjdGl2ZVNlYz0xaAoKW0luc3RhbGxdCldhbnRlZEJ5PXRpbWVycy50YXJnZXQK",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-crash-guard-check.timer",
   "policy": "replace",
   "sha256": "b214e79e483c339f92ddc9571b6db0fd096c4de6cfe683281121134d451f7c5e",
   "source": "configs/felhom-crash-guard-check.timer"
  },
  {
   "check": "plain",
   "content_b64": "IyAvZXRjL2ZlbGhvbS9jcmFzaC1ndWFyZC5jb25mIOKAlCByZWFkIGJ5IC91c3IvbG9jYWwvc2Jpbi9mZWxob20tY3Jhc2gtZ3VhcmQgKGAxMWAgwqc1LjkpLgojIFRoZSBMSU1JVC10aCB1bmNsZWFuIHN0b3Agd2l0aGluIFdJTkRPV19NSU5VVEVTIGxlYXZlcyB0aGUgYm94IG9mZi4gRGVjaWRlZCBieSBDQyB1bmF0dGVuZGVkIOKAlCBvcGVyYXRvciBtYXkgcmV2ZXJzZS4KTElNSVQ9MwpXSU5ET1dfTUlOVVRFUz02MAojIGtlcm5lbC5wYW5pYyB3aGlsZSBhcm1lZDogc2Vjb25kcyBhZnRlciBhIGNyYXNoIGJlZm9yZSB0aGUga2VybmVsIHJlc3RhcnRzIHRoZSBib3guClBBTklDX1NFQ09ORFM9MTAKIyBBIHRyaXBwZWQgZ3VhcmQgcmUtYXJtcyBhZnRlciB0aGlzIG1hbnkgaG91cnMgb2Ygbm9ybWFsIHJ1bm5pbmcgKG9yIGBmZWxob20tY3Jhc2gtZ3VhcmQgcmVhcm1gKS4KUkVBUk1fSE9VUlM9MjQK",
   "mode": "0o644",
   "path": "/etc/felhom/crash-guard.conf",
   "policy": "if-absent",
   "sha256": "9b9d305b421f81d223f2ccc4594e67d41618239779d983a2f72c191a8b3b65f7",
   "source": "configs/crash-guard.conf"
  },
  {
   "check": "sh",
   "content_b64": "IyEvYmluL3NoCiMgL2V0Yy9ncnViLmQvMDFfZmVsaG9tX29uZXNob3Qg4oCUIHRoZSBrZXJuZWwgbGFuZSdzIE9ORS1TSE9UIGJvb3QgKFItODM2LCBgMDlgIMKnMyBkZWNpc2lvbnMgMTY0ICsgMTcyLCBgMTFgIMKnNS4xMSkuCiMgSW5zdGFsbGVkIGJ5IHRoZSBjb25maWcgYnVuZGxlIChmZWxob20tb3MtYXBwbHkgQlVORExFX0ZJTEVTKSwgMDc1NSByb290LiB1cGRhdGUtZ3J1YiBydW5zIGl0OyBpdCBwcmludHMgR1JVQiBzY3JpcHQuCiMKIyBBdCBib290LCBHUlVCIHJlYWRzIGBmZWxob21fbmV4dGAgZnJvbSBhbiBlbnZpcm9ubWVudCBibG9jayBvbiB0aGUgRVNQICh2ZmF0IOKAlCBHUlVCIGNhbiByZXdyaXRlIGEgZmlsZSB0aGVyZTsgaXQKIyBjYW5ub3Qgb24gdGhlIExWTSAvYm9vdCwgUi04MzYpLCBDTEVBUlMgaXQsIGFuZCDigJQgb25seSBpZiBpdCBuYW1lcyBhbiBpbnN0YWxsZWQga2VybmVsIOKAlCBib290cyB0aGF0IGtlcm5lbCdzIG9uZS1zaG90CiMgZW50cnkgKDQyX2ZlbGhvbV9vbmVzaG90KSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0LiBUaGUgbmV4dCBib290IHVzZXMgdGhlIGRlZmF1bHQgYWdhaW4gd2hhdGV2ZXIgaGFwcGVuczogYSBuZXcga2VybmVsCiMgdGhhdCBwYW5pY3MgY29tZXMgYmFjayBvbiB0aGUgb2xkIG9uZSBieSBpdHNlbGYuIGZlbGhvbS1vcy1hcHBseSB3cml0ZXMgdGhlIGZsYWcgKG1vZGUgYXBwbHkpIGFuZCBuZXZlciB0aGUgZGVmYXVsdAojIGZvciBhIG5ldyBrZXJuZWwuIE1lYXN1cmVkIG9uIHRoZSBUZXN0ZXIgMSBWTSwgZGVtby1mZWxob20gYW5kIGRlbW8taHAgKFNlY3VyZSBCb290IG9uKToKIyBgYXVkaXRzL2tlcm5lbC1zcGlrZS0yMDI2LTEwLTA3L2AgKGNhbmRpZGF0ZSAyKS4KIwojIE5vIHZmYXQgRVNQIGF0IC9ib290L2VmaSwgb3Igbm8gUHJveG1veCBrZXJuZWwg4oaSIHByaW50cyBub3RoaW5nICh0aGUgYm94IGJvb3RzIGV4YWN0bHkgYXMgYmVmb3JlKS4Kc2V0IC1lCmVzcF91dWlkPSQoZmluZG1udCAtbiAtbyBVVUlELEZTVFlQRSAvYm9vdC9lZmkgMj4vZGV2L251bGwgfCBhd2sgJyQyID09ICJ2ZmF0IiB7IHByaW50ICQxIH0nKQpbIC1uICIkZXNwX3V1aWQiIF0gfHwgZXhpdCAwCmtlcm5lbHM9JChscyAvYm9vdC92bWxpbnV6LSotcHZlIDI+L2Rldi9udWxsIHwgc2VkICdzI14vYm9vdC92bWxpbnV6LSMjJyB8IGdyZXAgLUUgJ15bMC05XStcLlswLTldK1wuWzAtOV0rLVswLTldKy1wdmUkJyB8fCB0cnVlKQpbIC1uICIka2VybmVscyIgXSB8fCBleGl0IDAKY2F0IDw8RU9GCiMgZmVsaG9tIGtlcm5lbCBsYW5lOiBhIG9uZS1zaG90IGtlcm5lbCBuYW1lZCBvbiB0aGUgRVNQLCByZWFkIGFuZCBjbGVhcmVkIGJlZm9yZSB0aGUgbWVudQppbnNtb2QgcGFydF9ncHQKaW5zbW9kIGZhdApzZWFyY2ggLS1uby1mbG9wcHkgLS1mcy11dWlkIC0tc2V0PWZlbGhvbV9lc3AgJGVzcF91dWlkCmlmIFsgLWYgKFwkZmVsaG9tX2VzcCkvRUZJL2ZlbGhvbS9vbmVzaG90LmVudiBdOyB0aGVuCiAgbG9hZF9lbnYgLWYgKFwkZmVsaG9tX2VzcCkvRUZJL2ZlbGhvbS9vbmVzaG90LmVudiBmZWxob21fbmV4dAogIGlmIFsgIlwke2ZlbGhvbV9uZXh0fSIgXTsgdGhlbgogICAgc2V0IGZlbGhvbV9ib290PSJcJHtmZWxob21fbmV4dH0iCiAgICBzZXQgZmVsaG9tX25leHQ9CiAgICBzYXZlX2VudiAtZiAoXCRmZWxob21fZXNwKS9FRkkvZmVsaG9tL29uZXNob3QuZW52IGZlbGhvbV9uZXh0CkVPRgpmb3IgayBpbiAka2VybmVsczsgZG8KICAgIHByaW50ZiAnICAgIGlmIFsgIiR7ZmVsaG9tX2Jvb3R9IiA9ICIlcyIgXTsgdGhlbiBzZXQgZGVmYXVsdD0iZmVsaG9tLW9uZXNob3QtJXMiOyBmaVxuJyAiJGsiICIkayIKZG9uZQpjYXQgPDxFT0YKICBmaQpmaQpFT0YK",
   "mode": "0o755",
   "path": "/etc/grub.d/01_felhom_oneshot",
   "policy": "replace",
   "sha256": "f2f56d59c6356067279baa457e84bba7ffcf46ac341b7d482845e5a5cf9cc27b",
   "source": "configs/felhom-grub-oneshot.sh"
  },
  {
   "check": "sh",
   "content_b64": "IyEvYmluL3NoCiMgL2V0Yy9ncnViLmQvNDJfZmVsaG9tX29uZXNob3Qg4oCUIHRoZSBrZXJuZWwgbGFuZSdzIG9uZS1zaG90IEVOVFJJRVMgKFItODM2LCBgMDlgIMKnMyBkZWNpc2lvbiAxNzIsIGAxMWAgwqc1LjExKS4KIyBJbnN0YWxsZWQgYnkgdGhlIGNvbmZpZyBidW5kbGUgKGZlbGhvbS1vcy1hcHBseSBCVU5ETEVfRklMRVMpLCAwNzU1IHJvb3QuIHVwZGF0ZS1ncnViIHJ1bnMgaXQuCiMKIyBPbmUgbWVudSBlbnRyeSBwZXIgaW5zdGFsbGVkIFByb3htb3gga2VybmVsLCBpZCBgZmVsaG9tLW9uZXNob3QtPHZlcnNpb24+YCwgYm9vdGVkIE9OTFkgd2hlbiAwMV9mZWxob21fb25lc2hvdCBmb3VuZAojIHRoZSBmbGFnIG5hbWluZyBpdC4gSXQgaXMgdGhlIG5vcm1hbCBlbnRyeSBwbHVzIG9wdGlvbiBDIChkZWNpc2lvbiAxNzIpOiBzb2Z0bG9ja3VwX3BhbmljPTEgaGFyZGxvY2t1cF9wYW5pYz0xCiMgaHVuZ190YXNrX3BhbmljPTEgcGFuaWM9MTAg4oCUIGEgbG9ja3VwIHRoZSBrZXJuZWwgY2FuIGRldGVjdCBiZWNvbWVzIGEgcGFuaWMsIGFuZCBhIHBhbmljIHJlc3RhcnRzIHRoZSBib3ggaW4gMTAgcyBpbnRvCiMgdGhlIGRlZmF1bHQgKHRoZSBvbGQga2VybmVsKS4gQSB0cnVlIGRlYWQgZnJlZXplIHN0aWxsIG5lZWRzIGEgcGVyc29uIChzcGlrZSBjYW5kaWRhdGUgMyBmYWlsZWQgb24gYWxsIHRocmVlIGJveGVzKS4KIyBJdCBzb3J0cyBBRlRFUiAxMF9saW51eCwgc28gaXQgaXMgbmV2ZXIgZW50cnkgMCBhbmQgbmV2ZXIgdGhlIGRlZmF1bHQuCiMKIyBObyB2ZmF0IEVTUCBhdCAvYm9vdC9lZmkg4oaSIHByaW50cyBub3RoaW5nIChubyBmbGFnIGNhbiBuYW1lIHRoZXNlIGVudHJpZXMpLgpzZXQgLWUKcHJlZml4PSIvdXNyIgpleGVjX3ByZWZpeD0iL3VzciIKZGF0YXJvb3RkaXI9Ii91c3Ivc2hhcmUiCi4gIiRkYXRhcm9vdGRpci9ncnViL2dydWItbWtjb25maWdfbGliIgplc3BfdXVpZD0kKGZpbmRtbnQgLW4gLW8gVVVJRCxGU1RZUEUgL2Jvb3QvZWZpIDI+L2Rldi9udWxsIHwgYXdrICckMiA9PSAidmZhdCIgeyBwcmludCAkMSB9JykKWyAtbiAiJGVzcF91dWlkIiBdIHx8IGV4aXQgMAprZXJuZWxzPSQobHMgL2Jvb3Qvdm1saW51ei0qLXB2ZSAyPi9kZXYvbnVsbCB8IHNlZCAncyNeL2Jvb3Qvdm1saW51ei0jIycgfCBncmVwIC1FICdeWzAtOV0rXC5bMC05XStcLlswLTldKy1bMC05XSstcHZlJCcgfHwgdHJ1ZSkKWyAtbiAiJGtlcm5lbHMiIF0gfHwgZXhpdCAwCmNhc2UgIiR7R1JVQl9ERVZJQ0V9IiBpbgogICAgL2Rldi9tYXBwZXIvKnwvZGV2L2RtLSp8IiIpIHJvb3RfYXJnPSJyb290PSR7R1JVQl9ERVZJQ0V9IiA7OwogICAgKikgaWYgWyAtbiAiJHtHUlVCX0RFVklDRV9VVUlEfSIgXTsgdGhlbiByb290X2FyZz0icm9vdD1VVUlEPSR7R1JVQl9ERVZJQ0VfVVVJRH0iOyBlbHNlIHJvb3RfYXJnPSJyb290PSR7R1JVQl9ERVZJQ0V9IjsgZmkgOzsKZXNhYwpbIC1uICIke0dSVUJfREVWSUNFfSIgXSB8fCByb290X2FyZz0icm9vdD0kKGZpbmRtbnQgLW4gLW8gU09VUkNFIC8pIgpyZWw9JChtYWtlX3N5c3RlbV9wYXRoX3JlbGF0aXZlX3RvX2l0c19yb290IC9ib290KQpwcmVwPSQocHJlcGFyZV9ncnViX3RvX2FjY2Vzc19kZXZpY2UgIiQoJHtncnViX3Byb2JlOi1ncnViLXByb2JlfSAtLXRhcmdldD1kZXZpY2UgL2Jvb3QpIiB8IHNlZCAncy9eLyAgLycpCmZvciBrIGluICRrZXJuZWxzOyBkbwogICAgWyAtZiAiL2Jvb3QvaW5pdHJkLmltZy0kayIgXSB8fCBjb250aW51ZQogICAgY2F0IDw8RU9GCm1lbnVlbnRyeSAnRmVsaG9tIG9uZS1zaG90OiAkaycgLS1jbGFzcyBwcm94bW94IC0taWQgZmVsaG9tLW9uZXNob3QtJGsgewogIGluc21vZCBnemlvCiRwcmVwCiAgZWNobyAnTG9hZGluZyBMaW51eCAkayAoZmVsaG9tIG9uZS1zaG90KSAuLi4nCiAgbGludXggJHJlbC92bWxpbnV6LSRrICRyb290X2FyZyBybyAke0dSVUJfQ01ETElORV9MSU5VWH0gJHtHUlVCX0NNRExJTkVfTElOVVhfREVGQVVMVH0gc29mdGxvY2t1cF9wYW5pYz0xIGhhcmRsb2NrdXBfcGFuaWM9MSBodW5nX3Rhc2tfcGFuaWM9MSBwYW5pYz0xMAogIGluaXRyZCAkcmVsL2luaXRyZC5pbWctJGsKfQpFT0YKZG9uZQo=",
   "mode": "0o755",
   "path": "/etc/grub.d/42_felhom_oneshot",
   "policy": "replace",
   "sha256": "c34907ce68599873889179be333e848e02aa1c594b7370116b95af31b41b7fe6",
   "source": "configs/felhom-grub-oneshot-entries.sh"
  },
  {
   "check": "agent-unit",
   "content_b64": "IyBmZWxob20tYWdlbnQuc2VydmljZSDigJQgY2Fub25pY2FsIHN5c3RlbWQgdW5pdCBmb3IgdGhlIEZlbGhvbSBob3N0IGFnZW50LgojCiMgSW5zdGFsbCBhcyAvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1hZ2VudC5zZXJ2aWNlICh0aGUgaG9zdC1ib290c3RyYXAgc2NyaXB0IGluc3RhbGxzIHRoaXMgZnJvbQojIHRoZSBHaXRlYS1wdWJsaXNoZWQgYmluYXJ5OyBwcmV2aW91c2x5IHRoaXMgdW5pdCB3YXMgaGFuZC1tYWRlIG9uIGVhY2ggaG9zdCkuIFRoZSBhZ2VudCBydW5zIGFzIHRoZQojIE5PTi1yb290IGBmZWxob20tYWdlbnRgIHNlcnZpY2UgdXNlciAodGhlIGRvY3VtZW50ZWQgcHJvZHVjdGlvbiBtb2RlbCDigJQgUkVBRE1FICJQcm9jZXNzIG1vZGVsIjsKIyBgcHJpdmlsZWdlZC5tb2RlOiAic3VkbyJgKSBhbmQgc2hlbGxzIHRoZSBmZXcgaG9zdC1yb290IG9wcyBvdXQgdmlhIGBzdWRvIC1uYCBhZ2FpbnN0IHRoZSBmaXhlZC1hcmcKIyBhbGxvd2xpc3QgaW4gL2V0Yy9zdWRvZXJzLmQvZmVsaG9tLWFnZW50IChjb25maWdzL2ZlbGhvbS1hZ2VudC5zdWRvZXJzKS4gVGhlIFVzZXI9IGhlcmUgYW5kIHRoZQojIHN1ZG9lcnMgYGZlbGhvbS1hZ2VudCBBTEw9KHJvb3QpIE5PUEFTU1dEOiDigKZgIE1VU1QgbmFtZSB0aGUgU0FNRSB1c2VyLgojCiMgUGF0aHMgTVVTVCBtYXRjaCB3aGF0IHRoZSBzdWRvZXJzIC8gaG9zdC1pbnN0YWxsIHNjcmlwdCBleHBlY3Q6CiMgICBiaW5hcnkgIC91c3IvbG9jYWwvYmluL2ZlbGhvbS1hZ2VudAojICAgY29uZmlnICAvZXRjL2ZlbGhvbS1hZ2VudC9hZ2VudC5qc29uICAgKDA2MDAgZmVsaG9tLWFnZW50OmZlbGhvbS1hZ2VudCDigJQgc2VjcmV0cyBsaXZlIGhlcmUpCiMgICBzdGF0ZSAgIC92YXIvbGliL2ZlbGhvbS1hZ2VudCAgICAgICAgICAobm9uY2VzLCBsb2NhbC1hcGkgY2VydC9rZXkvdG9rZW5zLCBzdGFnZWQgdW5pdHMsIGd1ZXN0cykKIwojID09PSBERUxJQkVSQVRFTFkgTk8gU0FOREJPWElORyDigJQgcmVhZCBiZWZvcmUgYWRkaW5nIGFueSBoYXJkZW5pbmcgZGlyZWN0aXZlID09PQojCiMgMS4gTm9OZXdQcml2aWxlZ2VzIGlzIE5PVCBzZXQuIEl0IGlzIElOQ09NUEFUSUJMRSB3aXRoIHRoZSBhZ2VudCdzIHByaXZpbGVnZSBtb2RlbDogaXQgYmxvY2tzIHRoZQojICAgIHNldHVpZCBgc3Vkb2AgdGhlIGFnZW50IHJlbGllcyBvbiBmb3IgRVZFUlkgaG9zdC1yb290IG9wIChtb3VudCwgZm9ybWF0LCBwY3QsIGRuc21hc3Eg4oCmKSwgc28gdGhlCiMgICAgYWdlbnQgd291bGQgc2lsZW50bHkgbG9zZSBhbGwgcHJpdmlsZWdlZCBjYXBhYmlsaXR5LiBUaGUgbmFycm93IHN1cmZhY2UgY29tZXMgZnJvbSB0aGUgc3Vkb2VycwojICAgIGZpeGVkLWFyZyBhbGxvd2xpc3QgKyB0aGUgYWdlbnQncyBpbi1wcm9jZXNzIGZpbmUgdmFsaWRhdGlvbiAoaW50ZXJuYWwvc3RvcmFnZS92YWxpZGF0ZS5nbyksIE5PVAojICAgIGZyb20gTm9OZXdQcml2aWxlZ2VzLiBEbyBub3QgYWRkIGl0LgojCiMgMi4gTk8gbW91bnQtbmFtZXNwYWNpbmcgaGFyZGVuaW5nIChQcm90ZWN0SG9tZSwgUHJvdGVjdFN5c3RlbSwgUHJpdmF0ZVRtcCwgUmVhZE9ubHlQYXRocywKIyAgICBQcm90ZWN0Q29udHJvbEdyb3Vwcywg4oCmKS4gQW55IG9mIHRoZXNlIGdpdmUgdGhlIHVuaXQgYSBQUklWQVRFIG1vdW50IG5hbWVzcGFjZSDigJQgYW5kIHRoZSBhZ2VudCdzCiMgICAgaW50ZXJtZWRpYXJ5LW1vdW50IGRyaXZlIG1vZGVsIGRvZXMgYG1vdW50IC0tbWFrZS1zaGFyZWQgL21udC9mZWxob20tZHJpdmVzYCArIGBtb3VudCAtLWJpbmRgIGFuZAojICAgIHJlbGllcyBvbiB0aG9zZSBwcm9wYWdhdGluZyBpbnRvIHRoZSBSVU5OSU5HIGN1c3RvbWVyIGd1ZXN0LiBJbiBhIHByaXZhdGUgbmFtZXNwYWNlIHRoZSBiaW5kcwojICAgIHdvdWxkIGJlIGludmlzaWJsZSB0byB0aGUgaG9zdC9ndWVzdCBhbmQgZXZlcnkgZXh0ZXJuYWwtZHJpdmUgZW5yb2xsbWVudCB3b3VsZCBzaWxlbnRseSBicmVhay4KIyAgICBUaGUgYWdlbnQgTVVTVCBzaGFyZSB0aGUgaG9zdCBtb3VudCBuYW1lc3BhY2UuIFRoZSBzZWN1cml0eSBib3VuZGFyeSBpcyB0aGUgc3Vkb2VycyBhbGxvd2xpc3QuCgpbVW5pdF0KRGVzY3JpcHRpb249RmVsaG9tIGhvc3QgYWdlbnQgKFByb3htb3ggaG9zdCB0aWVyOyBodWIgY29udHJvbCBsb29wICsgUEJTIHZlcmlmeSArIHN0b3JhZ2Ugd2F0Y2hkb2cpCkRvY3VtZW50YXRpb249aHR0cHM6Ly9naXRlYS5kb29wbGV4Lmh1L2FkbWluL2ZlbGhvbS1hZ2VudApBZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXQgcHZlLWNsdXN0ZXIuc2VydmljZSBwdmVwcm94eS5zZXJ2aWNlCldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldAoKW1NlcnZpY2VdClR5cGU9c2ltcGxlClVzZXI9ZmVsaG9tLWFnZW50Ckdyb3VwPWZlbGhvbS1hZ2VudApFeGVjU3RhcnQ9L3Vzci9sb2NhbC9iaW4vZmVsaG9tLWFnZW50IC0tY29uZmlnIC9ldGMvZmVsaG9tLWFnZW50L2FnZW50Lmpzb24KUmVzdGFydD1vbi1mYWlsdXJlClJlc3RhcnRTZWM9NXMKCiMgU3RhdGUgZGlyOiBjcmVhdGVkIDA3NTAgZmVsaG9tLWFnZW50OmZlbGhvbS1hZ2VudCBvbiBzdGFydCBpZiBhYnNlbnQgKGxvY2FsLWFwaSBjZXJ0L2tleS90b2tlbnMsCiMgbm9uY2VzLCBzdGFnZWQgLm1vdW50IHVuaXRzLCBwZXItZ3Vlc3QgYm9vdHN0cmFwIGRpcnMgYWxsIGxpdmUgaGVyZSkuClN0YXRlRGlyZWN0b3J5PWZlbGhvbS1hZ2VudApTdGF0ZURpcmVjdG9yeU1vZGU9MDc1MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0Cg==",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-agent.service",
   "policy": "replace",
   "sha256": "bf74aa0acf75e645f51f3d28b7c8760c96fd44bf72435f6c4246c7bb3f8f82c4",
   "source": "configs/felhom-agent.service"
  },
  {
   "check": "unit",
   "content_b64": "IyBmZWxob20tYWdlbnQtcm9sbGJhY2suc2VydmljZSDigJQgdGhlIE9uRmFpbHVyZT0gdGFyZ2V0IHRoYXQgYXV0by1yZXZlcnRzIGEgY3Jhc2gtbG9vcGluZyBhZ2VudAojIHNlbGYtdXBkYXRlIChUQVNLIEQxOyBTUElLRS1hZ2VudC1zZWxmdXBkYXRlLTIwMjYtMDctMDUpLgojCiMgSW5zdGFsbCBhcyAvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1hZ2VudC1yb2xsYmFjay5zZXJ2aWNlLiBJdCBpcyByZWZlcmVuY2VkIGJ5IHRoZQojIGZlbGhvbS1hZ2VudC1saW1pdHMuY29uZiBkcm9wLWluJ3MgT25GYWlsdXJlPSBsaW5lLgojCiMgVEhFIFBFUi1DUkFTSC1GSVJJTkcgUkVBTElUWSBbU0YtMV06IG9uIHN5c3RlbWQgMjU3LCBPbkZhaWx1cmU9IGZpcmVzIG9uIEVWRVJZIGNyYXNoIG9mIHRoZSBtYWluCiMgdW5pdCDigJQgZXZlbiB3aGlsZSBpdCBpcyBtZXJlbHkgYGFjdGl2YXRpbmcgKGF1dG8tcmVzdGFydClgLCBsb25nIGJlZm9yZSAoYW5kIHJlZ2FyZGxlc3Mgb2YpIHRoZQojIHRlcm1pbmFsIHN0YXJ0LWxpbWl0IGBmYWlsZWRgIHN0YXRlLiBEdXJpbmcgb25lIGNyYXNoIGluY2lkZW50IHRoaXMgdW5pdCB0aGVyZWZvcmUgcnVucyBNQU5ZCiMgdGltZXMuIFRoYXQgaXMgc2FmZSBCWSBERVNJR046IHRoZSB3cmFwcGVyJ3Mgcm9sbGJhY2sgdmVyYiBpcyBwZW5kaW5nLW1hcmtlci1ndWFyZGVkIOKAlCB0aGUgZmlyc3QKIyBmaXJlIGFmdGVyIGEgYmFkIHVwZGF0ZSByZXZlcnRzIHRoZSBiaW5hcnkgYW5kIGNsZWFycyB0aGUgbWFya2VyOyBldmVyeSBsYXRlciBmaXJlIChhbmQgYW55IGZpcmUKIyB3aXRoIG5vIHVwZGF0ZSBpbiBmbGlnaHQgYXQgYWxsKSBpcyBhIGxvZ2dlZCBuby1vcCB0aGF0IHRvdWNoZXMgbm90aGluZy4gQ29uc2VxdWVuY2U6IGEgYmFkCiMgdXBkYXRlIGlzIHJvbGxlZCBiYWNrIGF0IHRoZSBGSVJTVCBjcmFzaCAofnNlY29uZHMpLCBub3QgYWZ0ZXIgdGhlIHN0YXJ0LWxpbWl0IGJ1cnN0IOKAlCB0aGUgdHVuZWQKIyBzdGFydC1saW1pdCBpbiB0aGUgZHJvcC1pbiBpcyB0aGUgdGVybWluYWwgQkFDS1NUT1AgKGUuZy4gYW4gZW52aXJvbm1lbnRhbCBjcmFzaCBsb29wIG9mIHRoZQojIGtub3duLWdvb2QgYmluYXJ5KSwgbm90IHRoZSByb2xsYmFjayB0cmlnZ2VyLgpbVW5pdF0KRGVzY3JpcHRpb249RmVsaG9tIGFnZW50IHNlbGYtdXBkYXRlIGF1dG8tcm9sbGJhY2sgKHBlbmRpbmctZ3VhcmRlZDsgZmlyZXMgcGVyIGNyYXNoLCBuby1vcHMgd2l0aG91dCBhIHBlbmRpbmcgdXBkYXRlKQoKW1NlcnZpY2VdClR5cGU9b25lc2hvdApFeGVjU3RhcnQ9L3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1zZWxmdXBkYXRlLWd1YXJkZWQgcm9sbGJhY2sK",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-agent-rollback.service",
   "policy": "replace",
   "sha256": "4d143099c0a305c2603b78dc7bf88d24b12d048a11a9209e5aaf252e7952c5ca",
   "source": "configs/felhom-agent-rollback.service"
  },
  {
   "check": "dropin",
   "content_b64": "IyBmZWxob20tYWdlbnQtbGltaXRzLmNvbmYg4oCUIHN0YXJ0LWxpbWl0ICsgcm9sbGJhY2stdHJpZ2dlciBkcm9wLWluIGZvciBmZWxob20tYWdlbnQuc2VydmljZQojIChUQVNLIEQxKS4gSW5zdGFsbCBhcyAvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1hZ2VudC5zZXJ2aWNlLmQvZmVsaG9tLWFnZW50LWxpbWl0cy5jb25mCiMgYW5kIGBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZGAuCiMKIyBWYWx1ZXMgYXJlIHRoZSBTUElLRS1hZ2VudC1zZWxmdXBkYXRlLTIwMjYtMDctMDUgdHVuZWQgc2V0LCB2ZXJiYXRpbSBbU0YtMl06IHdpdGggdGhlIHVuaXQncwojIFJlc3RhcnQ9b24tZmFpbHVyZSArIFJlc3RhcnRTZWM9NXMgYW5kIHN5c3RlbWQgMjU3J3MgY29tcGlsZWQgZGVmYXVsdHMgKDEwcy81KSwgYSBjcmFzaC1sb29waW5nCiMgYmluYXJ5IE5FVkVSIHRyaXBzIHRoZSBzdGFydCBsaW1pdCBhbmQgbG9vcHMgZm9yZXZlciAoMzUgc3RhcnRzLzE4MHMgbWVhc3VyZWQpLiAxMjBzLzQgZ2l2ZXMgYQojIHRlcm1pbmFsIGBmYWlsZWRgIOKJiDIwcyBhZnRlciB0aGUgZmlyc3QgY3Jhc2guCiMKIyBQTEFDRU1FTlQgVFJBUCBbU0YtM106IHRoZXNlIGtleXMgTVVTVCBiZSBpbiBbVW5pdF0uIE9uIHN5c3RlbWQgMjU3IGEgW1NlcnZpY2VdIHBsYWNlbWVudCBpcwojIEhBTEYtQVBQTElFRCDigJQgU3RhcnRMaW1pdEJ1cnN0IGlzIGFjY2VwdGVkIHdoaWxlIFN0YXJ0TGltaXRJbnRlcnZhbFNlYyBpcyBzaWxlbnRseSBpZ25vcmVkCiMgKGpvdXJuYWwgd2FybmluZyBvbmx5KS4gTmV2ZXIgc3BsaXQgdGhlbTsgbmV2ZXIgcHV0IHRoZW0gaW4gW1NlcnZpY2VdLgojCiMgT25GYWlsdXJlIGZpcmVzIG9uIEVWRVJZIGNyYXNoIG9uIHN5c3RlbWQgMjU3IFtTRi0xXSDigJQgc2VlIHRoZSBjb21tZW50IGJsb2NrIGluCiMgZmVsaG9tLWFnZW50LXJvbGxiYWNrLnNlcnZpY2UgZm9yIHdoeSB0aGF0IGlzIHNhZmUgKHBlbmRpbmctbWFya2VyIGd1YXJkKS4KW1VuaXRdClN0YXJ0TGltaXRJbnRlcnZhbFNlYz0xMjAKU3RhcnRMaW1pdEJ1cnN0PTQKT25GYWlsdXJlPWZlbGhvbS1hZ2VudC1yb2xsYmFjay5zZXJ2aWNlCg==",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-agent.service.d/felhom-agent-limits.conf",
   "policy": "replace",
   "sha256": "4f1560893b80f0f35a12d415dfa9f8338b7cd9ac66240f8303aea04a61554610",
   "source": "configs/felhom-agent-limits.conf"
  },
  {
   "check": "sh",
   "content_b64": "IyEvYmluL3NoCiMgZmVsaG9tLW1nbXQtd2F0Y2hkb2cg4oCUIHRoZSBEVU1CLCBhZ2VudC1JTkRFUEVOREVOVCBtYW5hZ2VtZW50LXBsYW5lIGhlYWxlciAoVEFTSyBHMSkuCiMKIyBXSFkgVEhJUyBFWElTVFM6IC9ydW4vc3NoZCBpcyBPcGVuU1NIJ3MgY29tcGlsZWQtaW4gcHJpdmlsZWdlLXNlcGFyYXRpb24gZGlyZWN0b3J5LCBTSEFSRUQgYnkKIyBldmVyeSBzc2hkIG9uIHRoZSBob3N0LiBJZiBpdCBnb2VzIG1pc3NpbmcsIHNzaGQncyBsaXN0ZW5lciBzdGF5cyB1cCBidXQgZXZlcnkgbmV3IHNlc3Npb24gUkVTRVRTCiMgcmlnaHQgYWZ0ZXIgU1NIMl9NU0dfS0VYSU5JVCDigJQgYSBtYW5hZ2VtZW50LXBsYW5lIGxvY2tvdXQgb24gYW4gb3RoZXJ3aXNlLWhlYWx0aHkgYm94CiMgKFNQSUtFLWZlbGhvbS1zc2hkLTIwMjYtMDctMDUgwqc4LCBjYXVzZWQgbGl2ZSBieSBhIHNlY29uZCB1bml0J3MgYFJ1bnRpbWVEaXJlY3Rvcnk9c3NoZGAgY2xlYW51cCkuCiMgVGhlIHRtcGZpbGVzLmQgZW50cnkgKGZlbGhvbS1wcml2c2VwLnRtcGZpbGVzKSBQUkVWRU5UUyB0aGUga25vd24gY2F1c2U7IHRoaXMgc2NyaXB0IEFVVE8tSEVBTFMgYW55CiMgbm92ZWwgY2F1c2Ugd2l0aCBaRVJPIGxvZ2luIGFuZCBaRVJPIGRlcGVuZGVuY3kgb24gdGhlIGZlbGhvbS1hZ2VudCBiaW5hcnkgKHNvIGl0IHNlbGYtY29ycmVjdHMgZXZlbgojIHdoZW4gdGhlIGFnZW50IGlzIGRvd24g4oCUIHRoZSB3aG9sZSBwb2ludCkuIEl0IGlzIHJ1biBieSBmZWxob20tbWdtdC13YXRjaGRvZy50aW1lciBldmVyeSB+NjBzLgojCiMgQ09OVFJBQ1QgKGFsbCBmb3VyIGFyZSBsb2FkLWJlYXJpbmcpOgojICAgMS4gU1RBVC1GSVJTVCAvIElERU1QT1RFTlQg4oCUIGEgSEVBTFRIWSAvcnVuL3NzaGQgaXMgTkVWRVIgdG91Y2hlZCAobm8gbWtkaXIvY2htb2QvY2hvd24gY2FsbCksIHNvCiMgICAgICBzdGVhZHkgc3RhdGUgaXMgemVybyBtdXRhdGlvbiBhbmQgdGhlIGRpcidzIG10aW1lIGlzIHByZXNlcnZlZC4gT25seSBhIE1JU1NJTkcgb3IKIyAgICAgIHdyb25nLW1vZGUvb3duZXIgZGlyIGlzIGNvcnJlY3RlZC4KIyAgIDIuIHJlc2V0LWZhaWxlZCB0aGUgU1RPQ0sgc3NoZCBPTkxZIHdoZW4gaXQgaXMgaW4gdGhlIGBmYWlsZWRgIHN0YXRlIChhIHN0YXJ0LWxpbWl0IGxvY2tvdXQpIOKAlAojICAgICAgbmV2ZXIgb3RoZXJ3aXNlLCBhbmQgTkVWRVIgYHJlc3RhcnRgIGl0IChta2RpciBhbG9uZSByZXN0b3JlcyBpdDsgUElEIHN0YXlzLCBzcGlrZS1wcm92ZW4pLgojICAgMy4gSEVBTCBNQVJLRVIg4oCUIHdyaXRlcyBhbiBSRkMzMzM5IFVUQyB0aW1lc3RhbXAgdG8gJE1BUktFUiBvbmx5IG9uIGEgcmVhbCBoZWFsLCBzbyB0aGUgYWdlbnQgY2FuCiMgICAgICBSRVBPUlQgdGhlIGNvbmRpdGlvbiB0byB0aGUgaHViIChhIHJlY3VycmluZyBjbG9iYmVyIG11c3Qgc3VyZmFjZSBCRUZPUkUgaXQgYmVjb21lcyBhIGxvY2tvdXQpLgojICAgNC4gTk8gYFJ1bnRpbWVEaXJlY3Rvcnk9YCBhbnl3aGVyZSBpbiB0aGlzIGZlYXR1cmUgKHRoYXQgSVMgdGhlIGluY2lkZW50IGNhdXNlKSDigJQgdGhlIHVuaXQgdGhhdAojICAgICAgcnVucyB0aGlzIHNjcmlwdCBtdXN0IG5vdCBkZWNsYXJlIG9uZSBlaXRoZXIuCiMKIyBUb3VjaGVzIGhvc3QgL3J1biArIHRoZSBzdG9jayBzc2hkIHVuaXQgT05MWSDigJQgbm8gZ3Vlc3RzIChwb29sLXNjb3BpbmcgaXMgbW9vdCBoZXJlKS4gRmFpbC1zYWZlOgojIGFueSBzaW5nbGUgc3RlcCBmYWlsaW5nIGlzIGxvZ2dlZCBhbmQgZG9lcyBub3QgYWJvcnQgdGhlIG90aGVycyAoYHx8IHRydWVgKTsgdGhlIG5leHQgdGljayByZXRyaWVzLgoKc2V0IC11CgpQUklWU0VQPS9ydW4vc3NoZApNQVJLRVI9L3J1bi9mZWxob20tbWdtdC13YXRjaGRvZy5oZWFsZWQKU1NIRF9VTklUPXNzaC5zZXJ2aWNlICAgIyBEZWJpYW4vUFZFIHN0b2NrIHNzaGQgdW5pdCBuYW1lIChzc2hkLnNlcnZpY2UgaXMgYW4gYWxpYXMpCmhlYWxlZD0wCgpsb2coKSB7IGxvZ2dlciAtdCBmZWxob20tbWdtdC13YXRjaGRvZyAiJCoiIDI+L2Rldi9udWxsIHx8IHRydWU7IH0KCiMgMS4gUHJpdnNlcCBkaXIg4oCUIHN0YXQtZmlyc3Q6IGNyZWF0ZSBvbmx5IHdoZW4gbWlzc2luZzsgY29ycmVjdCBtb2RlL293bmVyIG9ubHkgd2hlbiB3cm9uZy4KaWYgWyAhIC1kICIkUFJJVlNFUCIgXTsgdGhlbgoJaWYgbWtkaXIgLXAgIiRQUklWU0VQIiAmJiBjaG93biByb290OnJvb3QgIiRQUklWU0VQIiAmJiBjaG1vZCAwNzU1ICIkUFJJVlNFUCI7IHRoZW4KCQloZWFsZWQ9MQoJCWxvZyAicmVjcmVhdGVkIG1pc3NpbmcgcHJpdnNlcCBkaXIgJFBSSVZTRVAgKDA3NTUgcm9vdDpyb290KSIKCWVsc2UKCQlsb2cgIkVSUk9SOiBmYWlsZWQgdG8gcmVjcmVhdGUgJFBSSVZTRVAiCglmaQplbHNlCgltb2RlPSQoc3RhdCAtYyAlYSAiJFBSSVZTRVAiIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCglvd25lcj0kKHN0YXQgLWMgJVU6JUcgIiRQUklWU0VQIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQoJaWYgWyAiJG1vZGUiICE9ICI3NTUiIF07IHRoZW4KCQljaG1vZCAwNzU1ICIkUFJJVlNFUCIgJiYgaGVhbGVkPTEgJiYgbG9nICJjb3JyZWN0ZWQgJFBSSVZTRVAgbW9kZSAoJG1vZGUgLT4gNzU1KSIKCWZpCglpZiBbICIkb3duZXIiICE9ICJyb290OnJvb3QiIF07IHRoZW4KCQljaG93biByb290OnJvb3QgIiRQUklWU0VQIiAmJiBoZWFsZWQ9MSAmJiBsb2cgImNvcnJlY3RlZCAkUFJJVlNFUCBvd25lciAoJG93bmVyIC0+IHJvb3Q6cm9vdCkiCglmaQpmaQoKIyAyLiBTdG9jayBzc2hkIOKAlCBjbGVhciBhIHN0YXJ0LWxpbWl0IGxvY2tvdXQgT05MWSB3aGVuIHRoZSB1bml0IGlzIGdlbnVpbmVseSBgZmFpbGVkYC4gTmV2ZXIgcmVzdGFydAojICAgIGl0ICh1bm5lY2Vzc2FyeSDigJQgYSByZWNyZWF0ZWQgcHJpdnNlcCBkaXIgaXMgcGlja2VkIHVwIGJ5IHRoZSBuZXh0IGZvcms7IHRoZSBsaXN0ZW5lciBuZXZlciBkaWVkKS4KaWYgc3lzdGVtY3RsIGlzLWZhaWxlZCAtLXF1aWV0ICIkU1NIRF9VTklUIiAyPi9kZXYvbnVsbDsgdGhlbgoJaWYgc3lzdGVtY3RsIHJlc2V0LWZhaWxlZCAiJFNTSERfVU5JVCIgMj4vZGV2L251bGw7IHRoZW4KCQloZWFsZWQ9MQoJCWxvZyAicmVzZXQtZmFpbGVkICRTU0hEX1VOSVQgKHdhcyBpbiB0aGUgZmFpbGVkIHN0YXRlKSIKCWZpCmZpCgojIDMuIEhlYWwgbWFya2VyIOKAlCBvbmx5IG9uIGEgcmVhbCBoZWFsLCBzbyB0aGUgYWdlbnQgcmVwb3J0cyB0aGUgY29uZGl0aW9uIChodWIgcmFpc2VzIGEgd2FybmluZykuCmlmIFsgIiRoZWFsZWQiID0gIjEiIF07IHRoZW4KCWRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWiA+ICIkTUFSS0VSIiAyPi9kZXYvbnVsbCB8fCB0cnVlCmZpCgpleGl0IDAK",
   "mode": "0o755",
   "path": "/usr/local/sbin/felhom-mgmt-watchdog",
   "policy": "replace",
   "sha256": "efeeb56b74d7c1874fe2dff54004d521e70e83ddb234ab1360f4cf4a1b0fa082",
   "source": "configs/felhom-mgmt-watchdog.sh"
  },
  {
   "check": "plain",
   "content_b64": "IyBmZWxob20gcHJpdnNlcC1kaXIgcGVyc2lzdGVuY2UgKFRBU0sgRzEpIOKAlCBpbnN0YWxsIGFzIC9ldGMvdG1wZmlsZXMuZC9mZWxob20tcHJpdnNlcC5jb25mLgojCiMgTEFZRVIgMSAocHJldmVudCk6IG1ha2UgT3BlblNTSCdzIHNoYXJlZCBwcml2aWxlZ2Utc2VwYXJhdGlvbiBkaXJlY3RvcnkgL3J1bi9zc2hkIGJvb3QtcGVyc2lzdGVudAojIGFuZCBvd25lZCBieSBOTyBzeXN0ZW1kIHVuaXQncyBsaWZlY3ljbGUuIFRoaXMgY2xvc2VzIHRoZSBleGFjdCBpbmNpZGVudCBjYXVzZSBmcm9tCiMgU1BJS0UtZmVsaG9tLXNzaGQtMjAyNi0wNy0wNSDCpzg6IGEgc2Vjb25kIHNzaGQgdW5pdCBkZWNsYXJpbmcgYFJ1bnRpbWVEaXJlY3Rvcnk9c3NoZGAgaGFkIHN5c3RlbWQKIyBSRU1PVkUgdGhlIHNoYXJlZCAvcnVuL3NzaGQgb24gdGhhdCB1bml0J3Mgc3RvcC9mYWlsdXJlLCB0YWtpbmcgdGhlIHN0b2NrIHNzaGQgb24gOjIyIGRvd24gd2l0aCBpdAojIChzZXNzaW9ucyByZXNldCByaWdodCBhZnRlciBTU0gyX01TR19LRVhJTklUKS4gQSB0bXBmaWxlcy5kIGVudHJ5IHJlY3JlYXRlcyB0aGUgZGlyIGF0IGV2ZXJ5IGJvb3QKIyBpbmRlcGVuZGVudGx5IG9mIGFueSB1bml0LCBzbyBubyB1bml0J3MgUnVudGltZURpcmVjdG9yeSBjbGVhbnVwIGNhbiBiZSB0aGUgc29sZSBvd25lci4KIwojIHN5c3RlbWQtdG1wZmlsZXMgaXMgaWRlbXBvdGVudDogYHN5c3RlbWQtdG1wZmlsZXMgLS1jcmVhdGVgIHJlLXJ1biBpcyBhIG5vLW9wIG9uIGFuIGV4aXN0aW5nLAojIGNvcnJlY3QgZGlyIChpdCBvbmx5IGNyZWF0ZXMvZml4ZXMsIG5ldmVyIGNodXJucykuIENvbXBsZW1lbnRlZCBhdCBydW50aW1lIGJ5IHRoZQojIGZlbGhvbS1tZ210LXdhdGNoZG9nIHRpbWVyIChsYXllciAyKSwgd2hpY2ggcmUtaGVhbHMgYSBkaXIgcmVtb3ZlZCBBRlRFUiBib290LgojCiMgVHlwZSBkID0gY3JlYXRlIHRoZSBkaXJlY3RvcnkgaWYgYWJzZW50IChsZWF2ZXMgYW4gZXhpc3Rpbmcgb25lLCBvbmx5IGZpeGluZyBtb2RlL293bmVyKS4KZCAvcnVuL3NzaGQgMDc1NSByb290IHJvb3QgLQo=",
   "mode": "0o644",
   "path": "/etc/tmpfiles.d/felhom-privsep.conf",
   "policy": "replace",
   "sha256": "9161a36662b06ba8cb0f8e1a68e6be0d3a1dd74403be7836be6178e8d664639d",
   "source": "configs/felhom-privsep.tmpfiles"
  },
  {
   "check": "unit-nort",
   "content_b64": "IyBmZWxob20tbWdtdC13YXRjaGRvZy5zZXJ2aWNlIChUQVNLIEcxKSDigJQgaW5zdGFsbCBhcyAvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1tZ210LXdhdGNoZG9nLnNlcnZpY2UuCiMKIyBMQVlFUiAyIChhdXRvLWhlYWwgd2l0aG91dCBsb2dpbik6IGEgRFVNQiBvbmVzaG90IHRoYXQgcnVucyAvdXNyL2xvY2FsL3NiaW4vZmVsaG9tLW1nbXQtd2F0Y2hkb2csCiMgdHJpZ2dlcmVkIGV2ZXJ5IH42MHMgYnkgZmVsaG9tLW1nbXQtd2F0Y2hkb2cudGltZXIuIEl0IHJlY3JlYXRlcyBhIG1pc3NpbmcgL3J1bi9zc2hkIGFuZCBjbGVhcnMgYQojIHN0YXJ0LWxpbWl0ZWQgc3RvY2sgc3NoZCDigJQgc28gYSBtYW5hZ2VtZW50LXBsYW5lIGxvY2tvdXQgc2VsZi1jb3JyZWN0cyBpbiDiiaQxIHRpY2sgd2l0aCBOT0JPRFkgbG9nZ2VkCiMgaW4gYW5kIFdJVEhPVVQgdGhlIGZlbGhvbS1hZ2VudCBiaW5hcnkgcnVubmluZyAodGhlIGFnZW50IG9ubHkgT0JTRVJWRVMvcmVwb3J0czsgdGhlIGhlYWwgbXVzdCBub3QKIyBkZXBlbmQgb24gaXQg4oCUIFNQSUtFLWZlbGhvbS1zc2hkLTIwMjYtMDctMDUgZmluZGluZyAjOSAvIFRBU0sgRzEgdHJhcCAxKS4KIwojIENSSVRJQ0FMOiB0aGlzIHVuaXQgTVVTVCBOT1QgZGVjbGFyZSBgUnVudGltZURpcmVjdG9yeT1gIOKAlCB0aGF0IGRpcmVjdGl2ZSAod2l0aCB2YWx1ZSBgc3NoZGApIGlzIHRoZQojIGluY2lkZW50IGl0IGV4aXN0cyB0byBmaXguIEl0IHdyaXRlcyBvbmx5IHRvIC9ydW4gKGRpciArIGhlYWwgbWFya2VyKSBhcyByb290OyBubyBzdGF0ZSBkaXIgbmVlZGVkLgpbVW5pdF0KRGVzY3JpcHRpb249RmVsaG9tIG1hbmFnZW1lbnQtcGxhbmUgd2F0Y2hkb2cgKHByaXZzZXAtZGlyIGF1dG8taGVhbDsgYWdlbnQtaW5kZXBlbmRlbnQpCiMgT3JkZXJpbmcgb25seSDigJQgdGhlIHRpbWVyIGRyaXZlcyBjYWRlbmNlOyBubyBoYXJkIGRlcGVuZGVuY3kgc28gaXQgcnVucyBldmVuIGluIGRlZ3JhZGVkIGJvb3RzLgpBZnRlcj1zeXN0ZW1kLXRtcGZpbGVzLXNldHVwLnNlcnZpY2UKCltTZXJ2aWNlXQpUeXBlPW9uZXNob3QKRXhlY1N0YXJ0PS91c3IvbG9jYWwvc2Jpbi9mZWxob20tbWdtdC13YXRjaGRvZwojIERlbGliZXJhdGVseSBOTyBSdW50aW1lRGlyZWN0b3J5PSwgTk8gUHJpdmF0ZVRtcCwgTk8gc2FuZGJveGluZyB0aGF0IHdvdWxkIGhpZGUgL3J1bi9zc2hkIGZyb20gaXQuCg==",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-mgmt-watchdog.service",
   "policy": "replace",
   "sha256": "7a2ada10d9b2ff3db317fa7a9a797460df84e238b4abec79430b399e8a30d5d3",
   "source": "configs/felhom-mgmt-watchdog.service"
  },
  {
   "check": "unit-nort",
   "content_b64": "IyBmZWxob20tbWdtdC13YXRjaGRvZy50aW1lciAoVEFTSyBHMSkg4oCUIGluc3RhbGwgYXMgL2V0Yy9zeXN0ZW1kL3N5c3RlbS9mZWxob20tbWdtdC13YXRjaGRvZy50aW1lci4KIwojIERyaXZlcyBmZWxob20tbWdtdC13YXRjaGRvZy5zZXJ2aWNlIG9uIGEgfjYwcyBjYWRlbmNlICh0aGUgYXV0by1oZWFsIHRpY2spLiBPbkJvb3RTZWMgZmlyZXMgc2hvcnRseQojIGFmdGVyIGJvb3QgKGJlbHQtYW5kLXN1c3BlbmRlcnMgd2l0aCB0aGUgdG1wZmlsZXMgbGF5ZXIpOyBPblVuaXRBY3RpdmVTZWM9NjBzIGdpdmVzIHRoZSDiiaQxLXRpY2sKIyBoZWFsIGJ1ZGdldCB0aGUgRzEgYWNjZXB0YW5jZSBkcmlsbCBtZWFzdXJlcy4gUGVyc2lzdGVudD10cnVlIHJ1bnMgYSBtaXNzZWQgdGljayBpbW1lZGlhdGVseSBhZnRlciBhCiMgcmVzdW1lL2xhdGUgYm9vdC4gVGhlIG9uZXNob3QgaXMgaWRlbXBvdGVudCwgc28gYSBmYXN0IGNhZGVuY2UgbmV2ZXIgY2h1cm5zIGEgaGVhbHRoeSBob3N0LgpbVW5pdF0KRGVzY3JpcHRpb249RmVsaG9tIG1hbmFnZW1lbnQtcGxhbmUgd2F0Y2hkb2cgdGltZXIgKH42MHMgcHJpdnNlcC1kaXIgYXV0by1oZWFsIHRpY2spCgpbVGltZXJdCk9uQm9vdFNlYz0zMHMKT25Vbml0QWN0aXZlU2VjPTYwcwpBY2N1cmFjeVNlYz01cwpQZXJzaXN0ZW50PXRydWUKVW5pdD1mZWxob20tbWdtdC13YXRjaGRvZy5zZXJ2aWNlCgpbSW5zdGFsbF0KV2FudGVkQnk9dGltZXJzLnRhcmdldAo=",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-mgmt-watchdog.timer",
   "policy": "replace",
   "sha256": "876e4f8b04a9d58f981216fedcd4c746959856c05f4f6fa8b4de99013a65a9ca",
   "source": "configs/felhom-mgmt-watchdog.timer"
  },
  {
   "check": "unit-nort",
   "content_b64": "IyBmZWxob20tc3NoZC5zZXJ2aWNlIChUQVNLIEgxKSDigJQgaW5zdGFsbCBhcyAvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1zc2hkLnNlcnZpY2UuCiMKIyBUaGUgZGVkaWNhdGVkIE9PQiBzc2hkIGluc3RhbmNlOiBhIFNFQ09ORCBzc2hkIG9uIGEgY2xhaW1lZCBub24tMjIgcG9ydCwgQ09FWElTVElORyB3aXRoIHRoZQojIGN1c3RvbWVyJ3Mvc3RvY2sgc3NoZCBvbiA6MjIgKG5ldmVyIHRvdWNoZWQpLiBDb25maWcgaXMgQUdFTlQtUkVOREVSRUQgYXQgL2V0Yy9mZWxob20tc3NoZC9zc2hkX2NvbmZpZwojIChQb3J0IGZyb20gdGhlIGFnZW50J3MgY2xhaW0pOyB0aGUgYWdlbnQgcmVsb2FkcyBvbiBjaGFuZ2UgKG5ldmVyIHJlc3RhcnQtb24tY2hhbmdlIFtTRi0yXSkuCiMKIyBDUklUSUNBTCBbU0YtMV06IHRoaXMgdW5pdCBNVVNUIE5PVCBkZWNsYXJlIGBSdW50aW1lRGlyZWN0b3J5PWAg4oCUIHRoYXQgZGlyZWN0aXZlICh2YWx1ZSBgc3NoZGApCiMgcmVtb3ZlZCB0aGUgU0hBUkVEIC9ydW4vc3NoZCBhbmQgYnJva2UgdGhlIHN0b2NrIHNzaGQgbGl2ZSAoU1BJS0UtZmVsaG9tLXNzaGQgwqc4KS4gL3J1bi9zc2hkIGlzCiMgZ3VhcmFudGVlZCBieSBHMSAodG1wZmlsZXMgKyB3YXRjaGRvZyk7IHRoZSBFeGVjU3RhcnRQcmUgbWtkaXIgaXMgYSBoYXJtbGVzcyBleHRyYSBndWFyYW50ZWUuIFRoZQojIGhvc3QtaW5zdGFsbCBSdW50aW1lRGlyZWN0b3J5IGd1YXJkIHdpbGwgUkVKRUNUIHRoaXMgdW5pdCBpZiB0aGUgZGlyZWN0aXZlIGlzIGV2ZXIgYWRkZWQuCltVbml0XQpEZXNjcmlwdGlvbj1GZWxob20gT09CIHNzaGQgKGRlZGljYXRlZCBpbnN0YW5jZSwgYWdlbnQtbWFuYWdlZDsgSDEpCkFmdGVyPW5ldHdvcmsudGFyZ2V0CgpbU2VydmljZV0KVHlwZT1ub3RpZnkKRXhlY1N0YXJ0UHJlPS0vdXNyL2Jpbi9ta2RpciAtcCAvcnVuL3NzaGQKRXhlY1N0YXJ0UHJlPS91c3Ivc2Jpbi9zc2hkIC10IC1mIC9ldGMvZmVsaG9tLXNzaGQvc3NoZF9jb25maWcKRXhlY1N0YXJ0PS91c3Ivc2Jpbi9zc2hkIC1EIC1mIC9ldGMvZmVsaG9tLXNzaGQvc3NoZF9jb25maWcKIyBDb25maWctY2hhbmdlIHBhdGg6IHZhbGlkYXRlIHRoZW4gSFVQIOKAlCBhIGJhZCByZWxvYWQgaXMgUkVGVVNFRCBhbmQgdGhlIHJ1bm5pbmcgZGFlbW9uIFNVUlZJVkVTCiMgW1NGLTJdLiBUaGUgYWdlbnQgYWx3YXlzIHdyaXRlc+KGknNzaGQgLXTihpJyZWxvYWQ7IGl0IG5ldmVyIGByZXN0YXJ0YHMgb24gYSBjb25maWcgY2hhbmdlLgpFeGVjUmVsb2FkPS91c3Ivc2Jpbi9zc2hkIC10IC1mIC9ldGMvZmVsaG9tLXNzaGQvc3NoZF9jb25maWcKRXhlY1JlbG9hZD0vYmluL2tpbGwgLUhVUCAkTUFJTlBJRApLaWxsTW9kZT1wcm9jZXNzClJlc3RhcnQ9b24tZmFpbHVyZQoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0Cg==",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-sshd.service",
   "policy": "oob",
   "sha256": "7d9177f356338532a93e7fc0ef8e5fdca64802cd3128ef8545e57420bc032fb8",
   "source": "configs/felhom-sshd.service"
  },
  {
   "check": "nft",
   "content_b64": "IyEvdXNyL3NiaW4vbmZ0IC1mCiMgZmVsaG9tIE9PQiBiZWx0IOKAlCBTVEFUSUMgdGFibGUgKFRBU0sgSDEpLiBJbnN0YWxsZWQgYnkgaG9zdC1pbnN0YWxsOyBsb2FkZWQgb24gYm9vdCBieQojIGZlbGhvbS1vb2ItbmZ0LnNlcnZpY2UuIFRoZSBhZ2VudCBtdXRhdGVzIE9OTFkgdGhlIHR3byBTRVRTIChAb3BlcmF0b3JfaXBzLCBAc3NoX3BvcnQpIHZpYSB0aGUKIyBuYXJyb3cgRkVMSE9NX09PQiBzdWRvZXJzIOKAlCBpdCBORVZFUiB0b3VjaGVzIHRoZSBydWxlcyBbdHJhcCA0XSwgc28gdGhlIGVuZm9yY2VtZW50IHNlbWFudGljcyBhcmUKIyBmaXhlZCBoZXJlIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCBieSB0aGUgYWdlbnQuCiMKIyBFbmZvcmNlbWVudCAoc2NvcGVkIHRvIGlpZm5hbWUgIndnLWZlbGhvbSIg4oCUIHRoZSBvZmZzaXRlIHR1bm5lbCDigJQgc28gOjIyIGFuZCBldmVyeSBvdGhlciBpbnRlcmZhY2UKIyBhcmUgVU5UT1VDSEVEIFtTRi0zL09GLTVdKToKIyAgIC0gRVNUQUJMSVNIRUQsUkVMQVRFRCByZXBsaWVzIGFsd2F5cyBwYXNzIChjb3ZlcnMgdGhlIFBCUyBwYXRoICsgcmVwbHkgdHJhZmZpYzsgUE1UVS1zYWZlKS4KIyAgIC0gZmVsaG9tLXNzaGQncyBwb3J0IGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBvcGVyYXRvciAvMzIgKGluIEBvcGVyYXRvcl9pcHMpIG92ZXIgdGhlIHR1bm5lbCBPTkxZLgojICAgLSBhbnkgb3RoZXIgdHVubmVsIHNvdXJjZSB0byB0aGF0IHBvcnQgaXMgRFJPUFBFRCBhdCB0aGUgaG9zdCAoZGVmZW5zZS1pbi1kZXB0aCB2cyB0aGUgZW5kcG9pbnQpLgojICAgLSB0aGUgcG9ydCBpcyB1bnJlYWNoYWJsZSBPRkYgdGhlIHR1bm5lbCBlbnRpcmVseS4KIyBFbXB0eSBzZXRzIChiZWZvcmUgdGhlIGFnZW50J3MgZmlyc3Qgc3luYykgPSB0aGUgcG9ydCBydWxlcyBtYXRjaCBub3RoaW5nID0gbm8gZW5mb3JjZW1lbnQgeWV0CiMgKGZlbGhvbS1zc2hkIGlzIG5vdCBzdGFydGVkIHVudGlsIHRoZSBhZ2VudCByZW5kZXJzIGl0cyBjb25maWcgZWl0aGVyKS4gcHJpb3JpdHkgLTUgc2l0cyBqdXN0IGFib3ZlCiMgdGhlIGRlZmF1bHQ7IHBvbGljeSBhY2NlcHQgc28gdGhpcyB0YWJsZSBvbmx5IGV2ZXIgQUREUyBkcm9wcyBmb3IgdGhlIGZlbGhvbS1zc2hkIHBvcnQuCiMKIyBJZGVtcG90ZW50IGxvYWQ6IGNyZWF0ZS10aGVuLWRlbGV0ZS10aGVuLWRlZmluZSAoYSByZS1ydW4vYm9vdCB5aWVsZHMgYSBjbGVhbiB0YWJsZSB3aXRoIEVNUFRZIHNldHM7CiMgdGhlIGFnZW50IHJlZmlsbHMgdGhlbSB3aXRoaW4gb25lIHRpY2spLgoKdGFibGUgaW5ldCBmZWxob21fb29iCmRlbGV0ZSB0YWJsZSBpbmV0IGZlbGhvbV9vb2IKCnRhYmxlIGluZXQgZmVsaG9tX29vYiB7CglzZXQgb3BlcmF0b3JfaXBzIHsKCQl0eXBlIGlwdjRfYWRkcgoJfQoJc2V0IHNzaF9wb3J0IHsKCQl0eXBlIGluZXRfc2VydmljZQoJfQoJY2hhaW4gaW5wdXQgewoJCXR5cGUgZmlsdGVyIGhvb2sgaW5wdXQgcHJpb3JpdHkgLTU7IHBvbGljeSBhY2NlcHQ7CgkJY3Qgc3RhdGUgZXN0YWJsaXNoZWQscmVsYXRlZCBhY2NlcHQKCQlpaWZuYW1lICJ3Zy1mZWxob20iIHRjcCBkcG9ydCBAc3NoX3BvcnQgaXAgc2FkZHIgQG9wZXJhdG9yX2lwcyBhY2NlcHQKCQlpaWZuYW1lICJ3Zy1mZWxob20iIHRjcCBkcG9ydCBAc3NoX3BvcnQgZHJvcAoJCXRjcCBkcG9ydCBAc3NoX3BvcnQgaWlmbmFtZSAhPSAid2ctZmVsaG9tIiBkcm9wCgl9Cn0K",
   "mode": "0o644",
   "path": "/etc/felhom-oob.nft",
   "policy": "oob",
   "sha256": "2c2b9cca89a439ac44efd353f4ea1936b3609ca43491b4c1853483e8321f238f",
   "source": "configs/felhom-oob.nft"
  },
  {
   "check": "unit",
   "content_b64": "IyBmZWxob20tb29iLW5mdC5zZXJ2aWNlIChUQVNLIEgxKSDigJQgaW5zdGFsbCBhcyAvZXRjL3N5c3RlbWQvc3lzdGVtL2ZlbGhvbS1vb2ItbmZ0LnNlcnZpY2UuCiMKIyBMb2FkcyB0aGUgU1RBVElDIGZlbGhvbV9vb2IgYmVsdCB0YWJsZSBvbiBib290ICh0aGUgYWdlbnQgdGhlbiBmaWxscyBpdHMgc2V0cyBlYWNoIHRpY2spLiBPbmVzaG90ICsKIyBSZW1haW5BZnRlckV4aXQgc28gYHN5c3RlbWN0bCBzdGF0dXNgIHJlZmxlY3RzICJsb2FkZWQiLiBJbmRlcGVuZGVudCBvZiBwdmUtZmlyZXdhbGwvbmZ0YWJsZXMuc2VydmljZQojICh0aGUgdGFibGUgaXMgYSBzZWxmLWNvbnRhaW5lZCBgaW5ldCBmZWxob21fb29iYCwgYWRkaXRpdmUg4oCUIGl0IG5ldmVyIGZsdXNoZXMgdGhlIHJ1bGVzZXQpLgpbVW5pdF0KRGVzY3JpcHRpb249RmVsaG9tIE9PQiBiZWx0IOKAlCBsb2FkIHRoZSBzdGF0aWMgZmVsaG9tX29vYiBuZnQgdGFibGUgKEgxKQpBZnRlcj1uZXR3b3JrLXByZS50YXJnZXQKQmVmb3JlPW5ldHdvcmsudGFyZ2V0IGZlbGhvbS1hZ2VudC5zZXJ2aWNlCgpbU2VydmljZV0KVHlwZT1vbmVzaG90ClJlbWFpbkFmdGVyRXhpdD15ZXMKRXhlY1N0YXJ0PS91c3Ivc2Jpbi9uZnQgLWYgL2V0Yy9mZWxob20tb29iLm5mdAojIE9uIHN0b3AsIHJlbW92ZSB0aGUgdGFibGUgKGJlc3QtZWZmb3J0KSBzbyBhbiB1bmluc3RhbGwvZGlzYWJsZSBsZWF2ZXMgbmZ0IGNsZWFuLgpFeGVjU3RvcD0tL3Vzci9zYmluL25mdCBkZWxldGUgdGFibGUgaW5ldCBmZWxob21fb29iCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQK",
   "mode": "0o644",
   "path": "/etc/systemd/system/felhom-oob-nft.service",
   "policy": "oob",
   "sha256": "01583efa67a88740389de58f885726929b34aac470e61678f75b8078b1089441",
   "source": "configs/felhom-oob-nft.service"
  },
  {
   "check": "sudoers",
   "content_b64": "IyBmZWxob20tb3Agb3BlcmF0b3Igc3Vkb2VycyAoVEFTSyBIMSkg4oCUIGluc3RhbGwgYXMgL2V0Yy9zdWRvZXJzLmQvZmVsaG9tLW9wICgwNDQwIHJvb3Q6cm9vdCkuCiMKIyBUaGUgREVGQVVMVCBvcGVyYXRvciBpZGVudGl0eSAobG9naW4gdmlhIGZlbGhvbS1zc2hkIG9ubHk7IGtleSBpbiAvZXRjL2ZlbGhvbS1zc2hkL2F1dGhvcml6ZWRfa2V5cy8KIyBmZWxob20tb3AsIG91dHNpZGUgfi8uc3NoLCBzbyB0aGUgY3VzdG9tZXIncyBzc2hkIG5ldmVyIGhvbm91cnMgaXQgW1NGLTNdKS4gZmVsaG9tLW9wIGlzIGEgbm9ybWFsCiMgbG9naW4gdXNlciB3aXRoIE5PIGFtYmllbnQgcHJpdmlsZWdlIOKAlCBpdCBlc2NhbGF0ZXMgT05MWSB0aHJvdWdoIHRoZXNlIGV4cGxpY2l0IHJlcGFpciB2ZXJicywgc28gYQojIGxlYWtlZCBvcGVyYXRvciBrZXkncyBibGFzdCByYWRpdXMgaXMgdGhpcyB2ZXJiIHNldCwgbm90IHRoZSBib3ggKGxvY2tlZCBkZWNpc2lvbiDCpzYpLiBEZWVwIHJlcGFpcnMKIyB0aGF0IGdlbnVpbmVseSBuZWVkIHJvb3QgKHBjdCwgZGVlcGVyIHN5c3RlbWN0bCkgcmVtYWluIGF2YWlsYWJsZSB2aWEgYHJvb3RgIGFzIGEgdHVubmVsLWdhdGVkCiMgYnJlYWstZ2xhc3MgYWNjb3VudCAoUGVybWl0Um9vdExvZ2luIHByb2hpYml0LXBhc3N3b3JkIG9uIGZlbGhvbS1zc2hkKSwgYnV0IHRoZSBkYXktdG8tZGF5IGlkZW50aXR5CiMgaXMgZmVsaG9tLW9wLgpDbW5kX0FsaWFzIEZFTEhPTV9PUF9SRVBBSVIgPSBcCiAgL3Vzci9iaW4vbWtkaXIgLXAgL3J1bi9zc2hkLCBcCiAgL3Vzci9iaW4vc3lzdGVtY3RsIHJlc2V0LWZhaWxlZCB3Zy1xdWlja0B3Zy1mZWxob20sIFwKICAvdXNyL2Jpbi9zeXN0ZW1jdGwgcmVzdGFydCB3Zy1xdWlja0B3Zy1mZWxob20sIFwKICAvdXNyL2Jpbi9zeXN0ZW1jdGwgc3RhcnQgZmVsaG9tLWFnZW50LCBcCiAgL3Vzci9iaW4vc3lzdGVtY3RsIHJlc3RhcnQgZmVsaG9tLWFnZW50LCBcCiAgL3Vzci9iaW4vc3lzdGVtY3RsIHJlc2V0LWZhaWxlZCBmZWxob20tc3NoZCwgXAogIC91c3IvYmluL3N5c3RlbWN0bCByZXN0YXJ0IGZlbGhvbS1zc2hkLCBcCiAgL3Vzci9zYmluL3BjdCBsaXN0LCBcCiAgL3Vzci9zYmluL3BjdCBec3RhcnQgWzAtOV0rJCwgXAogIC91c3Ivc2Jpbi9wY3QgXnN0b3AgWzAtOV0rJCwgXAogIC91c3Ivc2Jpbi9wY3QgXnVubG9jayBbMC05XSskCgojIFItODYxIChiKSBCMiAoYDA5YCDCpzMgZGVjaXNpb24gMTY1LCBoeWdpZW5lKTogb25lIG51bWVyaWMgdm1pZCBwZXIgcGN0IHZlcmIsIGFuY2hvcmVkIOKAlCB0aGUgb2xkIGdsb2IgYFswLTldKmAgYWxzbwojIG1hdGNoZWQgc3BhY2VzLCBzbyBgcGN0IHN0b3AgOTIwMSAtLXNraXBsb2NrIDFgIHBhc3NlZC4gUGlubmVkIGJ5IFRlc3RGZWxob21PcFN1ZG9lcnNQY3RJc0V4YWN0LgpmZWxob20tb3AgQUxMPShyb290KSBOT1BBU1NXRDogRkVMSE9NX09QX1JFUEFJUgo=",
   "mode": "0o440",
   "path": "/etc/sudoers.d/felhom-op",
   "policy": "oob",
   "sha256": "7dd505edba61a2843356de4c5de1ea643364d5915fcf4ece5f940fcb03295548",
   "source": "configs/felhom-op.sudoers"
  },
  {
   "check": "sudoers",
   "content_b64": "IyBmZWxob20tYWdlbnQgc3Vkb2VycyBhbGxvd2xpc3Qg4oCUIHRoZSBOQVJST1cgaG9zdC1yb290IHN1cmZhY2UgKHNsaWNlIDUgUGhhc2UgQiwgZG9jIDAzIMKnMy/Cpzc7IG5hcnJvd2VkIFItODYxKS4KIwojIEluc3RhbGwgYXMgYSBkcm9wLWluOiAvZXRjL3N1ZG9lcnMuZC9mZWxob20tYWdlbnQgKG1vZGUgMDQ0MCwgcm9vdDpyb290KSwgdmFsaWRhdGVkIHdpdGggYHZpc3VkbyAtY2ZgLiBJdCByaWRlcyB0aGUKIyBzaWduZWQgY29uZmlnIGJ1bmRsZSAoUi04NDApLiBUaGUgYWdlbnQgcnVucyBhcyB0aGUgbm9uLXJvb3QgYGZlbGhvbS1hZ2VudGAgdXNlciBhbmQgc2hlbGxzIG91dCB2aWEgYHN1ZG8gLW5gIHdpdGgKIyBGSVhFRCBhcmd1bWVudCB2ZWN0b3JzIChubyBzaGVsbCkuCiMKIyBSLTg2MSAoYWdlbnQgdjAuMTQ2LjApIOKAlCBFWEFDVCBQQVRURVJOUywgTk9UIEdMT0JTLiBBIHN1ZG9lcnMgYCpgIGluIHRoZSBBUkdVTUVOVFMgYWxzbyBtYXRjaGVzIHNwYWNlcywgc28KIyBgcGN0IHNldCBbMC05XSogLW9uYm9vdCAxYCBtYXRjaGVkIGBwY3Qgc2V0IDEwMCAtLWRldjAgL2Rldi9zZGEgLW9uYm9vdCAxYCAoYSByYXcgaG9zdCBkaXNrIGZvciB0aGUgZ3Vlc3QpLCBhbmQKIyBgbW91bnQgLS1iaW5kIC9tbnQvKi9mZWxob20tZGF0YSAvbW50L2ZlbGhvbS1kcml2ZXMvKmAgbWF0Y2hlZCBhIGAuLmAgcGF0aCBvbnRvIC9ldGMuIEV2ZXJ5IGFyZ3VtZW50IGxpc3QgdGhhdCB2YXJpZXMKIyBpcyBub3cgYSBzdWRvIHJlZ3VsYXIgZXhwcmVzc2lvbiAoYF4uLi4kYCwgc3VkbyA+PSAxLjkuMTA7IERlYmlhbiAxMyAvIFBWRSA5IHNoaXAgMS45LjE2KTogb25lIHZhbHVlIHBlciBzbG90LCBhCiMgZml4ZWQgY2hhcmFjdGVyIHNldCwgbm8gYC4uYCwgbm8gZXh0cmEgYXJndW1lbnQuIExpbmVzIHdpdGggbm8gdmFyaWFibGUgcGFydCBzdGF5IGxpdGVyYWwuIFRoZSBwYXR0ZXJucyBhcmUgcGlubmVkCiMgYnkgdGhlIGNhcGFiaWxpdHkgbWFuaWZlc3QgKGV2ZXJ5IHJlYWwgY2FsbCBtdXN0IG1hdGNoOiBUZXN0TWFuaWZlc3RDb3ZlcmVkQnlTdWRvZXJzKSBhbmQgYnkgaW5qZWN0aW9uIGNhc2VzIHRoYXQKIyBtdXN0IE5PVCBtYXRjaCAoY29uZmlncy90ZXN0X3N1ZG9lcnNfcGF0dGVybnMucHksIGFuZCBsaXZlIHdpdGggYHN1ZG8gLWwgLVUgZmVsaG9tLWFnZW50YCBvbiB0aGUgZGVtbyBib3hlcykuCiMKIyBSLTg2MSDigJQgTk8gRklMRSBUSEUgQUdFTlQgV1JPVEUgSVMgSU5TVEFMTEVEIFdIRVJFIFJPT1QgUkVBRFMgSVQuIFRoZSBgaW5zdGFsbGAgbGluZXMgYXJlIGdvbmU6IGEgbW91bnQgdW5pdCwgYQojIGRuc21hc3EgZHJvcC1pbiwgdGhlIFdpcmVHdWFyZCBjb25maWcgYW5kIHRoZSBPT0Igc3NoZCBjb25maWcgKyBrZXkgZ28gdGhyb3VnaCBgZmVsaG9tLXByaXYtYXBwbHlgLCBhIHJvb3Qgd3JhcHBlcgojIGZyb20gdGhlIGJ1bmRsZSB0aGF0IGNoZWNrcyB0aGUgQ09OVEVOVCBhZ2FpbnN0IHRoZSBhZ2VudCdzIG93biByZW5kZXJlcnM7IHRoZSBndWVzdCBwcmUtc3RhcnQgaG9vayBhbmQgdGhlIHNoYXJlZAojIGRyaXZlIHBhcmVudCBhcmUgRklYRUQgZmlsZXMgdGhhdCBjb21lIHdpdGggdGhlIGJ1bmRsZSBpdHNlbGY7IHRoZSBhZ2VudCBiaW5hcnkgaXMgcmVwbGFjZWQgb25seSBieSBhbgojIG9wZXJhdG9yLXNpZ25lZCBhZ2VudF91cGRhdGUgdGhhdCBgZmVsaG9tLW9zLWFwcGx5YCB2ZXJpZmllcyBhcyByb290IChgZmVsaG9tLXNlbGZ1cGRhdGUtZ3VhcmRlZCBhcHBseWAgaXMgbm8gbG9uZ2VyCiMgaGVyZSkuIFRoZSB0d28gcmVtYWluaW5nIHJvb3QgcnVucyBvZiBhZ2VudCBjb2RlIChGRUxIT01fRVNDUk9XLCB0aGUgZ3Vlc3QgaG9vaykgdGhlcmVmb3JlIHJ1biBvbmx5IGEgc2lnbmVkIGJpbmFyeS4KIwojIEJpbmFyeSBwYXRocyBNVVNUIG1hdGNoIHRoZSBhZ2VudCBjb25maWcgKHByaXZpbGVnZWQuc3lzdGVtY3RsL2luc3RhbGwvc21hcnRjdGwvbHZzKS4gQSBtaXNzaW5nL2RlY2xpbmVkIGVudHJ5CiMgZGVncmFkZXMgdGhlIGFnZW50IHdpdGggYSB3YXJuaW5nIChTTUFSVOKGklVOS05PV04sIG1vdW504oaSbG9nZ2VkIGVycm9yKSwgaXQgZG9lcyBub3QgY3Jhc2g7IHRoZSBjYXBhYmlsaXR5IHByb2JlCiMgcmVwb3J0cyBpdCB0byB0aGUgaHViLgoKQ21uZF9BbGlhcyBGRUxIT01fTU9VTlQgPSBcCiAgL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1wcml2LWFwcGx5IF51bml0IG1udC1bQS1aYS16MC05Xy5cXC1dK1wuKG1vdW50fGF1dG9tb3VudCkkLCBcCiAgL3Vzci9iaW4vc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQsIFwKICAvdXNyL2Jpbi9zeXN0ZW1jdGwgXmVuYWJsZSAtLW5vdyAtLSBtbnQtW0EtWmEtejAtOV8uXFwtXStcLm1vdW50JCwgXAogIC91c3IvYmluL3N5c3RlbWN0bCBeZGlzYWJsZSAtLSBtbnQtW0EtWmEtejAtOV8uXFwtXStcLm1vdW50JCwgXAogIC91c3IvYmluL3N5c3RlbWN0bCBec3RvcCAtLSBtbnQtW0EtWmEtejAtOV8uXFwtXStcLm1vdW50JAoKQ21uZF9BbGlhcyBGRUxIT01fRElTSyA9IFwKICAvdXNyL3NiaW4vc21hcnRjdGwgXi1hIC1qIC9kZXYvKHNkW2Etel0rfG52bWVbMC05XStuWzAtOV0rfHZkW2Etel0rfGhkW2Etel0rKSQsIFwKICAvdXNyL3NiaW4vbHZzIF4tLXJlcG9ydGZvcm1hdCBqc29uIC0tdW5pdHMgYiAtbyBsdl9uYW1lXCxkYXRhX3BlcmNlbnRcLG1ldGFkYXRhX3BlcmNlbnQgLS0gW0EtWmEtejAtOV8uKy1dKygvW0EtWmEtejAtOV8uKy1dKyk/JCwgXAogIC91c3Ivc2Jpbi9wdnMgLS1yZXBvcnRmb3JtYXQganNvbiAtLW5vaGVhZGluZ3MgLW8gcHZfbmFtZSwgXAogIC91c3Ivc2Jpbi96cG9vbCBzdGF0dXMgLVAKCiMgUHJvdmlzaW9uaW5nIGJhY2staGFsZiAoc2xpY2UgOEEsIGRvYyAwMyDCpzYpOiBwb3B1bGF0ZSBhIGd1ZXN0J3MgYm9vdHN0cmFwIGNvbmZpZyBtb3VudAojIGhvc3Qtc2lkZSAoaW50ZXJuYWwvcHJvdmlzaW9uKS4gVGhlc2UgYXJlIGhvc3Qtcm9vdCBvcHMgdGhlIEFQSSB0b2tlbiBjYW5ub3QgZG8g4oCUIGEgYmluZCBtb3VudAojIGlzIHJvb3RAcGFtLW9ubHksIGFuZCB0aGUgY2hvd24gbWFwcyB0aGUgMDYwMCBib290c3RyYXAuanNvbiB0byB0aGUgdW5wcml2aWxlZ2VkLUxYQyBndWVzdC1yb290CiMgKHVpZC9naWQgMTAwMDAwLCBzcGlrZSBnb3RjaGEgMSkuIFRoZSBob3N0IGRpciBpcyBBR0VOVC1PV05FRCBzdGF0ZSB1bmRlciAvdmFyL2xpYi9mZWxob20tYWdlbnQvCiMgKHRoZSB3aWxkY2FyZCBvbmx5IGV2ZXIgbmFtZXMgYSBwYXRoIHRoZSBhZ2VudCBpdHNlbGYgY3JlYXRlZCksIGFuZCB0aGUgYm9vdHN0cmFwIGZpbGUgdGhlIGFnZW50CiMgd3JpdGVzIHRoZXJlIGlzIHRoZSBvbmx5IHRoaW5nIHRoZXNlIHRvdWNoLiAnOicgaXMgZXNjYXBlZCBwZXIgc3Vkb2VycyBncmFtbWFyLgpDbW5kX0FsaWFzIEZFTEhPTV9QUk9WSVNJT04gPSBcCiAgL3Vzci9iaW4vY2hvd24gXi1SIDEwMDAwMFw6MTAwMDAwIC92YXIvbGliL2ZlbGhvbS1hZ2VudC9ndWVzdHMvWzAtOV0rKC9ib290c3RyYXApPyQsIFwKICAvdXNyL3NiaW4vcGN0IF5zZXQgWzAtOV0rIC1tcFswLTldKyAvdmFyL2xpYi9mZWxob20tYWdlbnQvZ3Vlc3RzL1swLTldKy9ib290c3RyYXBcLG1wXD0vW0EtWmEtejAtOS9fLi1dKyhcLHJvXD0xKT8kLCBcCiAgL3Vzci9zYmluL3BjdCBec2V0IFswLTldKyAtb25ib290IDEkCgojIERpc2sgaW5zcGVjdGlvbiArIGZvcm1hdCAoc2xpY2UgOEMgKyBJbXBsLTEpLiBibGtpZC9sc2JsayByZWFkIHRoZSBkZXZpY2UncyBkYXRhLWJlYXJpbmcgZXZpZGVuY2UKIyAodGhlIGFnZW50IGRlY2lkZXMgZGF0YS1iZWFyaW5nLW5lc3MgZnJvbSBUSElTLCBuZXZlciB0aGUgY2FsbGVyJ3MgY2xhaW0pLiBGb3JtYXQgZ29lcyBPTkxZIHRocm91Z2gKIyBmZWxob20tbWtmcy1ndWFyZGVkIChJbXBsLTEgUGFydCBCKTogcmF3IG1rZnMuKiBpcyBOTyBMT05HRVIgYWxsb3dsaXN0ZWQsIHNvIGV2ZW4gYSBiYWQgYWdlbnQgY2Fubm90CiMgbWtmcyB0aGUgT1MgZGlzayDigJQgdGhlIHdyYXBwZXIgcmUtY2hlY2tzIHRoZSBjYXRhc3Ryb3BoaWMgY2FzZXMgKHN5c3RlbSBkaXNrIC8gTFZNIFBWIC8gZm9yZWlnbiBtb3VudCkKIyBhcyByb290IGFuZCByZWZ1c2VzLCBhbmQgdGhlIGFnZW50J3MgdW5jbGFpbWVkLWRpc2sgZmlsdGVyIChjbGFpbS5nbykgaXMgdGhlIHByaW1hcnkgZ3VhcmQgYWJvdmUgaXQuCkNtbmRfQWxpYXMgRkVMSE9NX0ZPUk1BVCA9IFwKICAvdXNyL3NiaW4vYmxraWQgXi1wIC1vIGV4cG9ydCAvZGV2L1teIF0rJCwgXAogIC91c3IvYmluL2xzYmxrIF4tSiAtbyBOQU1FXCxGU1RZUEVcLFBUVFlQRVwsTU9VTlRQT0lOVCAvZGV2L1teIF0rJCwgXAogIC91c3IvbG9jYWwvc2Jpbi9mZWxob20tbWtmcy1ndWFyZGVkIF4vZGV2L1teIF0rIChleHQ0fHhmcykkCgojIExBTiBzcGxpdC1ob3Jpem9uIHJlc29sdmVyIChpbnRlcm5hbC9sYW5yZXNvbHZlcik6IHRoZSBhZ2VudCBtYW5hZ2VzIGEgaG9zdC1zaWRlIGRuc21hc3EgdGhhdAojIGFuc3dlcnMgKi48Y3VzdG9tZXItZG9tYWluPiB3aXRoIGVhY2ggZ3Vlc3QncyBsaXZlIExBTiBJUC4gQSBmZWxob20tKi5jb25mIGRyb3AtaW4gcmVhY2hlcyAvZXRjL2Ruc21hc3EuZAojIG9ubHkgdGhyb3VnaCBmZWxob20tcHJpdi1hcHBseSwgd2hpY2ggYWxsb3dzIGV4YWN0bHkgdGhlIGxpbmVzIHRoZSByZXNvbHZlciByZW5kZXJzIChSLTg2MTogYSBgZGhjcC1zY3JpcHQ9YCB3b3VsZAojIHJ1biBhcyByb290KTsgdGhlIHR3byBgcGN0IGV4ZWNgIHJlYWRzIGFyZSBGSVhFRCBjb21tYW5kIHZlY3RvcnMKIyAodGhlIGd1ZXN0J3MgZXRoMCBJUHY0ICsgdGhlIGNvbnRyb2xsZXIncyBwdWxsZWQgY29udHJvbGxlci55YW1sIGZvciB0aGUgZG9tYWluKSDigJQgTk9UIGEgZ2VuZXJhbAojIGBwY3QgZXhlY2AuIHN5c3RlbWN0bCBpcyBzY29wZWQgdG8gdGhlIGRuc21hc3EgdW5pdCBvbmx5LiBUaGUgYWdlbnQgbmV2ZXIgZWRpdHMgL2V0Yy9yZXNvbHYuY29uZi4KQ21uZF9BbGlhcyBGRUxIT01fRE5TTUFTUSA9IFwKICAvdXNyL2Jpbi9hcHQtZ2V0IGluc3RhbGwgLXkgLXEgZG5zbWFzcSwgXAogIC91c3IvbG9jYWwvc2Jpbi9mZWxob20tcHJpdi1hcHBseSBeZG5zbWFzcSAvdG1wL2ZlbGhvbS1yZXNvbHZlci1bMC05XStcLmNvbmYgZmVsaG9tLVthLXowLTldW2EtejAtOS5fLV0qXC5jb25mJCwgXAogIC91c3IvYmluL3N5c3RlbWN0bCBlbmFibGUgLS1ub3cgZG5zbWFzcSwgXAogIC91c3IvYmluL3N5c3RlbWN0bCByZWxvYWQgZG5zbWFzcSwgXAogIC91c3IvYmluL3N5c3RlbWN0bCByZXN0YXJ0IGRuc21hc3EsIFwKICAvdXNyL2Jpbi9ybSBeLWYgL2V0Yy9kbnNtYXNxXC5kL2ZlbGhvbS1bYS16MC05XVthLXowLTkuXy1dKlwuY29uZiQsIFwKICAvdXNyL3NiaW4vcGN0IF5leGVjIFswLTldKyAtLSBpcCAtNCAtbyBhZGRyIHNob3cgZGV2IGV0aDAkLCBcCiAgL3Vzci9zYmluL3BjdCBeZXhlYyBbMC05XSsgLS0gZG9ja2VyIGV4ZWMgZmVsaG9tLWNvbnRyb2xsZXIgY2F0IC9vcHQvZG9ja2VyL2ZlbGhvbS1jb250cm9sbGVyL2NvbnRyb2xsZXJcLnlhbWwkCgojIEd1ZXN0IG1vdW50cG9pbnQgbGlmZWN5Y2xlIChpbnRlcm1lZGlhcnktbW91bnQgcmUtYXJjaGl0ZWN0dXJlICsgQzEgbmV0KS4gVGhlIHByZS1zdGFydCBzZWxmLWhlYWwgaG9vayBpcyBhIEZJWEVEIGZpbGUKIyBmcm9tIHRoZSBjb25maWcgYnVuZGxlICgvdmFyL2xpYi92ei9zbmlwcGV0cy9mZWxob20tZ3Vlc3QtaG9vay5zaCDigJQgUi04NjE6IHRoZSBhZ2VudCBubyBsb25nZXIgaW5zdGFsbHMgaXQgZnJvbSAvdG1wOwojIFByb3htb3ggcnVucyBpdCBhcyByb290IGF0IGV2ZXJ5IGd1ZXN0IHN0YXJ0KS4gVGhlIGFnZW50IG9ubHkgcmVnaXN0ZXJzIGl0IHBlciBndWVzdCwgZGVsZXRlcyBhIGRlYWQgbW91bnRwb2ludCBzbG90CiMgKHRoZSBCMyBDMSBmaXgpIGFuZCByZWJvb3RzIGEgZ3Vlc3QgdG8gYWN0aXZhdGUgYmluZHMg4oCUIGVhY2ggd2l0aCBhbiBleGFjdCB2bWlkIC8gc2xvdC4KQ21uZF9BbGlhcyBGRUxIT01fR1VFU1RIT09LID0gXAogIC91c3Ivc2Jpbi9wY3QgXnNldCBbMC05XSsgLS1ob29rc2NyaXB0IGxvY2FsXDpzbmlwcGV0cy9mZWxob20tZ3Vlc3QtaG9va1wuc2gkLCBcCiAgL3Vzci9zYmluL3BjdCBec2V0IFswLTldKyAtLWRlbGV0ZSBtcFswLTldKyQsIFwKICAvdXNyL3NiaW4vcGN0IF5yZWJvb3QgWzAtOV0rJAoKIyBJbnRlcm1lZGlhcnkgbW91bnQgbW9kZWwgKHRoZSBkcml2ZSBob3Qtc3dhcCByZS1hcmNoaXRlY3R1cmUpLiBUaGUgYWdlbnQga2VlcHMgYSBTSEFSRUQgaG9zdCBwYXJlbnQKIyAvbW50L2ZlbGhvbS1kcml2ZXMgKHNlbGYtYmluZCArIG1ha2Utc2hhcmVkKSBhbmQgYmluZHMvdW5iaW5kcyBlYWNoIGRyaXZlJ3MgZmVsaG9tLWRhdGEgbmFtZXNwYWNlIFVOREVSTkVBVEggaXQgc28gdGhlCiMgY2hhbmdlIHByb3BhZ2F0ZXMgaW50byB0aGUgcnVubmluZyBndWVzdCBsaXZlLiBUaGUgYm9vdC1wZXJzaXN0ZW5jZSBzY3JpcHQgKyB1bml0IGFyZSBGSVhFRCBmaWxlcyBmcm9tIHRoZSBjb25maWcKIyBidW5kbGUgKFItODYxOiB0aGUgYWdlbnQgbm8gbG9uZ2VyIGluc3RhbGxzIHRoZW0gZnJvbSAvdG1wKTsgdGhlIGFnZW50IG9ubHkgZW5hYmxlcyB0aGUgdW5pdC4gQSBkcml2ZSBuYW1lIGlzIG9uZQojIHBhdGggc2VnbWVudCB0aGF0IGNhbm5vdCBzdGFydCB3aXRoIGEgZG90IChubyBgLi5gKTsgYGx4Yy1pbmZvIC1uIDx2bWlkPiAtcCAtSGAgcmVzb2x2ZXMgdGhlIGd1ZXN0IGluaXQgUElEIGZvciB0aGUKIyBHdWVzdFNlZXNNb3VudCBjaGVjazsgYG1ha2UtcHJpdmF0ZWAgaXNvbGF0ZXMgdGhlIHBhcmVudCdzIHBlZXIgZ3JvdXAgb24gRklSU1Qgc2V0dXAgb25seS4KQ21uZF9BbGlhcyBGRUxIT01fSU5URVJNRURJQVJZID0gXAogIC91c3IvYmluL21rZGlyIC1wIC9tbnQvZmVsaG9tLWRyaXZlcywgXAogIC91c3IvYmluL21rZGlyIF4tcCAvbW50L2ZlbGhvbS1kcml2ZXMvW0EtWmEtejAtOV8tXVtBLVphLXowLTlfLi1dKiQsIFwKICAvdXNyL2Jpbi9ta2RpciBeLXAgL21udC9bQS1aYS16MC05Xy1dW0EtWmEtejAtOV8uLV0qL2ZlbGhvbS1kYXRhJCwgXAogIC91c3IvYmluL2Nob3duIF4xMDAwMDBcOjEwMDAwMCAvbW50L1tBLVphLXowLTlfLV1bQS1aYS16MC05Xy4tXSovZmVsaG9tLWRhdGEkLCBcCiAgL3Vzci9iaW4vbW91bnQgLS1iaW5kIC9tbnQvZmVsaG9tLWRyaXZlcyAvbW50L2ZlbGhvbS1kcml2ZXMsIFwKICAvdXNyL2Jpbi9tb3VudCAtLW1ha2Utc2hhcmVkIC9tbnQvZmVsaG9tLWRyaXZlcywgXAogIC91c3IvYmluL21vdW50IC0tbWFrZS1wcml2YXRlIC9tbnQvZmVsaG9tLWRyaXZlcywgXAogIC91c3IvYmluL21vdW50IF4tLWJpbmQgL21udC9bQS1aYS16MC05Xy1dW0EtWmEtejAtOV8uLV0qL2ZlbGhvbS1kYXRhIC9tbnQvZmVsaG9tLWRyaXZlcy9bQS1aYS16MC05Xy1dW0EtWmEtejAtOV8uLV0qJCwgXAogIC91c3IvYmluL3Vtb3VudCBeL21udC9mZWxob20tZHJpdmVzL1tBLVphLXowLTlfLV1bQS1aYS16MC05Xy4tXSokLCBcCiAgL3Vzci9iaW4vc3lzdGVtY3RsIGVuYWJsZSBmZWxob20tc2hhcmVkLXBhcmVudC5zZXJ2aWNlLCBcCiAgL3Vzci9iaW4vbHhjLWluZm8gXi1uIFswLTldKyAtcCAtSCQsIFwKICAvdXNyL3NiaW4vcGN0IF5zZXQgWzAtOV0rIC1tcDggL21udC9mZWxob20tZHJpdmVzXCxtcFw9L21udC9mZWxob20tZHJpdmVzJAoKIyBDb250cm9sbGVyLXN3YXAgLyBtYW5hZ2VkIGF1dG8tdXBkYXRlIChPcHRpb24gQSwgbm9uLXJvb3QpLiBUaGUgYWdlbnQgb3ducyB0aGUgaW4tZ3Vlc3QgY29udHJvbGxlcgojIGltYWdlIFNXQVAgKGl0IHN1cnZpdmVzIHRoZSBjb250cm9sbGVyIGJlaW5nIGtpbGxlZCBtaWQtc3dhcCk6IHJlYWQgdGhlIGJha2VkIGltYWdlIHJlZiwgY2hlY2sgdGhlCiMgcHJlLXB1bGxlZCB0YXJnZXQgaXMgcHJlc2VudCwgcmV3cml0ZSAvZXRjL2ZlbGhvbS1jb250cm9sbGVyLWltYWdlLCByZXN0YXJ0IHRoZSBib290c3RyYXAgdW5pdCwKIyBoZWFsdGgtY2hlY2ssIHJvbGwgYmFjayBvbiBmYWlsdXJlLiBFYWNoIGdyYW50IGlzIGJvdW5kZWQg4oCUIE5PIGdlbmVyYWwgYHBjdCBleGVjYCBhbmQgTk8gYGJhc2ggLWNgOgojICAgY2F0IDxmaXhlZCBmaWxlPiAgICAgICAgICAgIOKAlCByZWFkIHRoZSBjdXJyZW50IGltYWdlIHJlZiAocmVhZC1vbmx5KQojICAgZG9ja2VyIGltYWdlIGluc3BlY3QgKiAgICAgIOKAlCBpcyB0aGUgcHJlLXB1bGxlZCB0YXJnZXQgcHJlc2VudD8gKHJlYWQtb25seSkKIyAgIGRvY2tlciBpbnNwZWN0IC1mICogICAgICAgICDigJQgY29udGFpbmVyIHJ1bm5pbmcvaGVhbHRoL2ltYWdlIChyZWFkLW9ubHk7IGAqYCBzcGFucyB0aGUgLWYgdGVtcGxhdGUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udGFpbmVyIGFjcm9zcyBzcGFjZXMsIHNwaWtlLWNvbmZpcm1lZCkKIyAgIHN5c3RlbWN0bCByZXN0YXJ0IDxmaXhlZCB1bml0PiDigJQgcmUtcnVuIHRoZSBnb2xkZW4ncyBib290c3RyYXAgKHRoZSBvbmx5IHN0YXRlIGNoYW5nZSkKIyAgIGZlbGhvbS1wcml2LWFwcGx5IGNvbnRyb2xsZXItaW1hZ2UgPHZtaWQ+IOKAlCBXUklURSB0aGUgcmVmIChSLTg2MSAoYSkgQTEsIGAwOWAgwqczIGRlY2lzaW9uIDE2NSk6IHRoZSByZWYgZ29lcyBvbgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RESU4gdG8gdGhlIFJPT1Qgd3JhcHBlciwgd2hpY2ggcmVxdWlyZXMgb3VyIHJlZ2lzdHJ5ICsgcmVwb3NpdG9yeSArIGFuIHgueS56IHRhZwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdyaXRlcyB0aGUgZ3Vlc3QgZmlsZSBpdHNlbGYuIFRoZSBhZ2VudCdzIG93biBgdGVlYCBncmFudCBpcyBHT05FOiBiZWZvcmUsIGEKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByb21pc2VkIGFnZW50IGNvdWxkIGhhbmQgdGhlIGd1ZXN0J3MgYm9vdHN0cmFwIEFOWSBpbWFnZSAoc3VkbyBjYW5ub3Qgc2VlIHN0ZGluKS4KIyBWYWxpZGF0ZWQgR086IGZlbGhvbS5ldS9kb2N1bWVudGF0aW9uL2F1ZGl0cy9TUElLRS1jb250cm9sbGVyc3dhcC1uYXJyb3ctZ3JhbnRzLTIwMjYtMDYtMjkubWQuCkNtbmRfQWxpYXMgRkVMSE9NX0NPTlRST0xMRVJTV0FQID0gXAogIC91c3Ivc2Jpbi9wY3QgXmV4ZWMgWzAtOV0rIC0tIGNhdCAvZXRjL2ZlbGhvbS1jb250cm9sbGVyLWltYWdlJCwgXAogIC91c3Ivc2Jpbi9wY3QgXmV4ZWMgWzAtOV0rIC0tIGRvY2tlciBpbWFnZSBpbnNwZWN0IGdpdGVhXC5kb29wbGV4XC5odS9hZG1pbi9mZWxob20tY29udHJvbGxlclw6WzAtOV0rXC5bMC05XStcLlswLTldKyQsIFwKICAvdXNyL3NiaW4vcGN0IF5leGVjIFswLTldKyAtLSBkb2NrZXIgaW5zcGVjdCAtZiAuKyAoZmVsaG9tLWNvbnRyb2xsZXJ8Y2xvdWRmbGFyZWQpJCwgXAogIC91c3Ivc2Jpbi9wY3QgXmV4ZWMgWzAtOV0rIC0tIHN5c3RlbWN0bCByZXN0YXJ0IGZlbGhvbS1jb250cm9sbGVyLWJvb3RzdHJhcFwuc2VydmljZSQsIFwKICAvdXNyL2xvY2FsL3NiaW4vZmVsaG9tLXByaXYtYXBwbHkgXmNvbnRyb2xsZXItaW1hZ2UgWzAtOV0rJAoKIyBTdGFsZS1sb2NrIHJlY292ZXJ5IChGMi1iLCB2MC40OS4wKS4gQSBob3N0IHJlYm9vdCBEVVJJTkcgYSB2emR1bXAgYmFja3VwIGxlYXZlcyB0aGUgZ3Vlc3Qgd2l0aCBhCiMgYHNuYXBzaG90LWRlbGV0ZWAvYGJhY2t1cGAgbG9jayArIGBvbmJvb3Q6MWAgdGhlbiBjYW4ndCBzdGFydCBpdCDihpIgdGhlIGN1c3RvbWVyIGJveCBzdGF5cyBET1dOLiBUaGUKIyBhZ2VudCBjbGVhcnMgdGhlIFNUQUxFIGxvY2sgYXQgc3RhcnR1cCAob25seSB3aGVuIG5vIHZ6ZHVtcCBpcyBpbi1mbGlnaHQpLiBgcGN0IHVubG9ja2AgaXMgdGhlIG9uZSBvcAojIHdpdGggbm8gQVBJIGVxdWl2YWxlbnQgKHNuYXBzaG90LWRlbGV0ZSArIHN0YXJ0IGdvIHRocm91Z2ggdGhlIEFQSSB0b2tlbik7IHRoZSBhZ2VudCBmaW5lLXZhbGlkYXRlcyB0aGUKIyB2bWlkIChudW1lcmljKSBiZWZvcmUgZXhlYyDigJQgdGhlIGBbMC05XSpgIGlzIHRoZSBjb2Fyc2UgYWxsb3dsaXN0LgpDbW5kX0FsaWFzIEZFTEhPTV9TVEFMRUxPQ0sgPSBcCiAgL3Vzci9zYmluL3BjdCBedW5sb2NrIFswLTldKyQKCiMgV2Vla2x5IGd1ZXN0IGRpc2sgdHJpbSAoUi00NDQsIG9wZXJhdG9yIHJ1bGluZyBgMDlgIMKnMyBkZWNpc2lvbiAxMzkpLiBBIHRoaW4gcG9vbCBvbmx5IGV2ZXIgZ3Jvd3MgZnJvbSBibG9ja3MgdGhlCiMgZ3Vlc3QgaGFzIEZSRUVEOiBgZnN0cmltYCBpbnNpZGUgdGhlIHVucHJpdmlsZWdlZCBjb250YWluZXIgaXMgcmVmdXNlZCAoRklUUklNOiBPcGVyYXRpb24gbm90IHBlcm1pdHRlZCksIHNvIHRoZSBob3N0CiMgdHJpbXMgdGhlIGd1ZXN0J3MgbW91bnRzLiBNZWFzdXJlZCBvbiBkZW1vLWhwIDIwMjYtMTAtMDY6IGBwY3QgZnN0cmltIDkyMDFgIHJjIDAgaW4gMjQuNCBzLCBwb29sIDY1LjUzICUgLT4gMzMuNDAgJSwKIyBhcHBzIGtlcHQgYW5zd2VyaW5nLiBPTkUgZXhhY3QgcGF0dGVybjogYSB2bWlkIGFuZCBub3RoaW5nIGVsc2Ug4oCUIG5vIGAtLWlnbm9yZS1tb3VudHBvaW50c2AsIG5vIHNlY29uZCBhcmd1bWVudAojIChwaW5uZWQ6IFRlc3RTdWRvZXJzRnN0cmltUnVsZUlzRXhhY3QpLiBUaGUgYWdlbnQgcnVucyBpdCBvbiBhIHdlZWtseSBkYXl0aW1lIHRpbWVyIHVuZGVyIHRoZSBoZWF2eS1vcCBnYXRlLgpDbW5kX0FsaWFzIEZFTEhPTV9GU1RSSU0gPSBcCiAgL3Vzci9zYmluL3BjdCBeZnN0cmltIFswLTldKyQKCiMgUmVzdG9yZS10ZXN0IHNjcmF0Y2ggdGVhcmRvd24gKEYtTEVBSywgQ2FtcGFpZ24gOCwgdjAuMTEwLjApLiBBIHJlc3RvcmUtdGVzdCB3aG9zZSByZXN0b3JlIEZBSUxTCiMgbGVhdmVzIGEgc2NyYXRjaCBndWVzdCB0aGUgQVBJIHRva2VuIENBTk5PVCBkZXN0cm95OiBgRmVsaG9tQWdlbnRHdWVzdGAgaXMgZ3JhbnRlZCBhdCAvcG9vbC9mZWxob20gYW5kCiMgYSBndWVzdCBqb2lucyB0aGF0IHBvb2wgb25seSB3aGVuIGl0cyByZXN0b3JlIENPTVBMRVRFUywgc28gYSBmYWlsZWQgcmVzdG9yZSBsZWF2ZXMgYSBwb29sLWxlc3MgZ3Vlc3QKIyBvdXQgb2YgcmVhY2ggKDQwMyBWTS5BbGxvY2F0ZSkgaG9sZGluZyBpdHMgZGlza3MgdW50aWwgYSBodW1hbiByZW1vdmVzIGl0LgojCiMgVFdPIEFQSS1TSURFIEZJWEVTIFdFUkUgVFJJRUQgQU5EIEJPVEggUkVGVVRFRCBMSVZFIG9uIDIwMjYtMDctMjgsIHdoaWNoIGlzIHdoeSB0aGlzIGdyYW50IGV4aXN0czoKIyAgIDEuIEFkb3B0IHRoZSBzdHJhbmRlZCBndWVzdCBpbnRvIHRoZSBwb29sLCB0aGVuIHJldHJ5LiBgUFVUIC9wb29scy97cG9vbH1gIEFMU08gcmVxdWlyZXMKIyAgICAgIFZNLkFsbG9jYXRlIG9uIHRoZSBWTSBiZWluZyBhZGRlZCDigJQgcG9vbCBtZW1iZXJzaGlwIGNhbm5vdCBib290c3RyYXAgaXRzIG93biBhdXRob3JpdHkuCiMgICAyLiBHcmFudCBGZWxob21BZ2VudEd1ZXN0IHBlci1wYXRoIGF0IC92bXMvOTkwMDAwLi45OTAwMDkuIER1cmFibGUgZm9yIGV4YWN0bHkgb25lIHVzZSBwZXIgc2xvdDoKIyAgICAgIFBWRSdzIG93biBkZXN0cm95IHBhdGggY2FsbHMgYEFjY2Vzc0NvbnRyb2w6OnJlbW92ZV92bV9hY2Nlc3MoJHZtaWQpYCAoTFhDLnBtOjkwNiksIHdoaWNoIERFTEVURVMKIyAgICAgIGV2ZXJ5IEFDTCBhdCAvdm1zLzx2bWlkPiAoQWNjZXNzQ29udHJvbC5wbToxODk4KS4gVGhlIGdyYW50IGlzIGNvbnN1bWVkIGJ5IHRoZSBvcGVyYXRpb24gaXQKIyAgICAgIGF1dGhvcmlzZXMsIHNvIGFmdGVyIHRlbiB0ZWFyZG93bnMgdGhlIGJhbmQgaXMgdW5ncmFudGVkIGFuZCB0aGUgZGVmZWN0IHJldHVybnMuCiMKIyBXSFkgVEhJUyBJUyBUSEUgVElHSFRFU1QgQVZBSUxBQkxFIEZFTkNFLCBub3QgYSB3aWRlbmluZzogc3VkbyBtYXRjaGVzIHRoZSB2bWlkIExJVEVSQUxMWSwgc28KIyBgOTkwMDBbMC05XWAgaXMgZXhhY3RseSB0aGUgdGVuLXNsb3Qgc2NyYXRjaCBiYW5kIHRoZSByZXN0b3JlLXRlc3QgcGlja3MgZnJvbSDigJQgbm90aGluZyBlbHNlLiBUaGVyZSBpcwojIG5vIGBbMC05XSpgIGNvYXJzZSBhbGxvd2xpc3QgaGVyZSBvbiBwdXJwb3NlOiB1bmxpa2UgYHBjdCB1bmxvY2tgLCB0aGlzIG9wIERFU1RST1lTLCBzbyB0aGUgYmFuZCBtdXN0CiMgYmUgaW4gdGhlIHBvbGljeSBhbmQgbm90IG1lcmVseSB2YWxpZGF0ZWQgaW4gdGhlIGFnZW50LiBFdmVuIGEgY29tcHJvbWlzZWQgYWdlbnQgYXNraW5nIGZvcgojIGBwY3QgZGVzdHJveSA5MjAxYCBpcyByZWZ1c2VkIGJ5IHN1ZG8gaXRzZWxmLiBVbmxpa2UgYW4gQUNMLCBhIHN1ZG9lcnMgcnVsZSBpcyBub3QgY29uc3VtZWQgYnkgdXNlLgojIFRoZSBhZ2VudCByZS1jaGVja3MgdGhlIGJhbmQgaW4gY29kZSBiZWZvcmUgZXhlYyAoZGVmZW5jZSBpbiBkZXB0aCk7IHRoaXMgaXMgdGhlIG91dGVyIGZlbmNlLgpDbW5kX0FsaWFzIEZFTEhPTV9TQ1JBVENIX1RFQVJET1dOID0gXAogIC91c3Ivc2Jpbi9wY3QgZGVzdHJveSA5OTAwMFswLTldIC0tcHVyZ2UKCiMgTmV0d29yayBzdG9yYWdlIC8gTkFTIChQYXJ0IEExLCBTUElLRS1uYXMtc3RvcmFnZS0yMDI2LTA2LTI5KS4gVGhlIGFnZW50IG1vdW50cyBhIGN1c3RvbWVyIE5BUyBzaGFyZQojIEhPU1QtU0lERSB1bmRlciAvbW50L2ZlbGhvbS1kcml2ZXMvPG5hbWU+IHZpYSBhIHN5c3RlbWQgLmF1dG9tb3VudCAoKyAubW91bnQpIHBhaXIgc28gaXQgcHJvcGFnYXRlcwojIGludG8gdGhlIGd1ZXN0IHRocm91Z2ggdGhlIGV4aXN0aW5nIHNoYXJlZCBiaW5kIChhbiB1bnByaXZpbGVnZWQgTFhDIGNhbm5vdCBtb3VudCBORlMvQ0lGUyBpdHNlbGYpLgojIEEgTkFTIGlzIE5PVCBhIGRyaXZlIOKAlCBubyBkdXJhYmxlLWlkLCBubyBTTUFSVCwgbm8gd2lwZTsgdGhlc2UgZ3JhbnRzIG9ubHkgaW5zdGFsbC9lbmFibGUvcmVtb3ZlIHRoZQojIHVuaXQgcGFpci4gVGhlIGFnZW50IGZpbmUtdmFsaWRhdGVzIGV2ZXJ5IHZhbHVlIChzaGFyZSBuYW1lLCBzZXJ2ZXIsIGV4cG9ydCwgdWlkL2dpZCwgY3JlZHMgcGF0aCkgYmVmb3JlCiMgYW55IHVuaXQgaXMgcmVuZGVyZWQgKGludGVybmFsL3N0b3JhZ2UvbmV0bW91bnQuZ28gVmFsaWRhdGVOZXR3b3JrTW91bnRTcGVjKTsgdGhlIHVuaXQgRklMRSByZWFjaGVzCiMgL2V0Yy9zeXN0ZW1kL3N5c3RlbSBvbmx5IHRocm91Z2ggYGZlbGhvbS1wcml2LWFwcGx5IHVuaXRgIChGRUxIT01fTU9VTlQpLCB3aGljaCByZXF1aXJlcyBub3N1aWQsbm9kZXYgb24gYSBuZXR3b3JrCiMgc2hhcmUgKFItODYxKS4gVGhlIGAubW91bnRgIGVuYWJsZS9kaXNhYmxlL3N0b3AgcmV1c2UgRkVMSE9NX01PVU5UOyB0aGlzIGFsaWFzIGFkZHMgdGhlCiMgYC5hdXRvbW91bnRgIHZhcmlhbnRzICsgdGhlIHVuaXQtZmlsZSByZW1vdmFsLiBUaGUgdW5pdCBGSUxFIG5hbWUgaXMgdGhlIHN5c3RlbWQtZXNjYXBlZCBtb3VudHBvaW50LAojIHdoaWNoIGFsd2F5cyBiZWdpbnMgYG1udC1mZWxob21gICh0aGUgbW91bnRwb2ludCBpcyAvbW50L2ZlbGhvbS1kcml2ZXMvPG5hbWU+KSwgc28gdGhlIHJtIGdsb2IgaXMgc2NvcGVkCiMgdG8gZmVsaG9tIG1vdW50IHVuaXRzIG9ubHkuIG1rZGlyIG9mIHRoZSBtb3VudHBvaW50IHJldXNlcyBGRUxIT01fSU5URVJNRURJQVJZJ3MgL21udC9mZWxob20tZHJpdmVzLyouCiMgQ0FNUEFJR04tMyBhZGRpdGlvbnMgKGxvdWQsIHBlciB0aGUgbm8td2lkZW5pbmcgcnVsZSk6CiMgIC0gYHN5c3RlbWN0bCByZXNldC1mYWlsZWQgLS0gbW50LWZlbGhvbSpgOiBGMTAgKENSSVRJQ0FMKSDigJQgYSBOQVMgYXV0b21vdW50IHRoYXQgaGl0CiMgICAgbW91bnQtc3RhcnQtbGltaXQtaGl0IGR1cmluZyBhbiBvdXRhZ2Ugd2FzIHJlLWFybWFibGUgYnkgTk8gcGxhdGZvcm0gcGF0aDsgdGhlIHJlYXNzZXJ0IG5vdwojICAgIHJlc2V0LWZhaWxlZCdzIHRoZSBzdHVjayB1bml0IGJlZm9yZSBgZW5hYmxlIC0tbm93YCAod2hpY2ggdGhlIHN0YXJ0LWxpbWl0IG90aGVyd2lzZSByZWZ1c2VzKSwKIyAgICBhbmQgUmVtb3ZlTmV0d29ya01vdW50IGNsZWFycyBmYWlsZWQtc3RhdGUgcmVzaWR1ZSAoRjIpLiBTY29wZWQgdG8gZmVsaG9tIG1vdW50IHVuaXRzICh0aGUgdW5pdAojICAgIG5hbWUgaXMgdGhlIHN5c3RlbWQtZXNjYXBlZCBtb3VudHBvaW50LCBhbHdheXMgYmVnaW5uaW5nIGBtbnQtZmVsaG9tYCkuIHJlc2V0LWZhaWxlZCBvbmx5IGNsZWFycwojICAgIGEgdW5pdCdzIGZhaWxlZCBsYXRjaCDigJQgaXQgY2Fubm90IHN0YXJ0L3N0b3AvYWx0ZXIgYW55dGhpbmcuCiMgIC0gYHJtZGlyIC9tbnQvZmVsaG9tLWRyaXZlcy8qYDogRjEg4oCUIHJlbW92ZSB0aGUgbm93LWVtcHR5IG1vdW50cG9pbnQgZGlyIGEgcmVtb3ZlZCBzaGFyZSBsZWF2ZXMKIyAgICBiZWhpbmQgKHRoZSBjYW1wYWlnbiBhY2N1bXVsYXRlZCAxMCBzdHViLXNoYXBlZCBsZWZ0b3ZlcnMpLiBybWRpciBPTkxZIChuZXZlciBybSAtcmYpOiBpdCByZWZ1c2VzCiMgICAgYSBub24tZW1wdHkgZGlyLCBzbyB1bmV4cGVjdGVkIGRhdGEgaXMgcHJlc2VydmVkLCBub3QgZGVzdHJveWVkIOKAlCBhIGZhaWwtc2FmZSBncmFudC4KQ21uZF9BbGlhcyBGRUxIT01fTkVUTU9VTlQgPSBcCiAgL3Vzci9iaW4vc3lzdGVtY3RsIF5lbmFibGUgLS1ub3cgLS0gbW50LVtBLVphLXowLTlfLlxcLV0rXC5hdXRvbW91bnQkLCBcCiAgL3Vzci9iaW4vc3lzdGVtY3RsIF5kaXNhYmxlIC0tIG1udC1bQS1aYS16MC05Xy5cXC1dK1wuYXV0b21vdW50JCwgXAogIC91c3IvYmluL3N5c3RlbWN0bCBec3RvcCAtLSBtbnQtW0EtWmEtejAtOV8uXFwtXStcLmF1dG9tb3VudCQsIFwKICAvdXNyL2Jpbi9zeXN0ZW1jdGwgXnJlc2V0LWZhaWxlZCAtLSBtbnQtZmVsaG9tW0EtWmEtejAtOV8uXFwtXSpcLihtb3VudHxhdXRvbW91bnQpJCwgXAogIC91c3IvYmluL3JtZGlyIF4vbW50L2ZlbGhvbS1kcml2ZXMvW0EtWmEtejAtOV8tXVtBLVphLXowLTlfLi1dKiQsIFwKICAvdXNyL2Jpbi9ybSBeLWYgL2V0Yy9zeXN0ZW1kL3N5c3RlbS9tbnQtZmVsaG9tW0EtWmEtejAtOV8uXFwtXSpcLihtb3VudHxhdXRvbW91bnQpJAoKIyBPZmZzaXRlIFdHIHR1bm5lbCAoUzMsIGRvYyAwNiDCpzMuMykuIFRoZSBhZ2VudCBtYW5hZ2VzIHdnLXF1aWNrQHdnLWZlbGhvbSBhcyBhbiBhZ2VudC1tYW5hZ2VkCiMgaG9zdCBzZXJ2aWNlICh0aGUgZG5zbWFzcS9sYW5yZXNvbHZlciBzaGFwZSk6IGNvbmYgc3RhZ2VkIGluIHRoZSBhZ2VudC1vd25lZCBTdGF0ZURpciAobmV2ZXIKIyAvdG1wKSwgaW5zdGFsbGVkIDA2MDAgdG8gdGhlIEZJWEVEIGRlc3RpbmF0aW9uIGJ5IGBmZWxob20tcHJpdi1hcHBseSB3Z2AsIHdoaWNoIHJlZnVzZXMgYW55IGtleSByZW5kZXJDb25mIG5ldmVyCiMgd3JpdGVzIChSLTg2MTogUG9zdFVwL1ByZVVwIHJ1biBhcyByb290IHVuZGVyIHdnLXF1aWNrKSwgdW5pdCBlbmFibGUvcmVzdGFydC9kaXNhYmxlLiBUaGUgT05MWSB3ZyByZWFkCiMgaXMgYGxhdGVzdC1oYW5kc2hha2VzYCDigJQgYHdnIHNob3cgPGlmPiBkdW1wYCBpcyBGT1JCSURERU4gZXZlcnl3aGVyZSAoaXRzIGludGVyZmFjZSBsaW5lCiMgY2FycmllcyB0aGUgUFJJVkFURSBLRVk7IHRoZSBTMSBzZXNzaW9uLWxvZyBpbmNpZGVudCkuIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGZpeGVkIGluIHRoZSB3cmFwcGVyLgpDbW5kX0FsaWFzIEZFTEhPTV9XRyA9IFwKICAvdXNyL2Jpbi9hcHQtZ2V0IGluc3RhbGwgLXkgLXEgd2lyZWd1YXJkLXRvb2xzLCBcCiAgL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1wcml2LWFwcGx5IHdnLCBcCiAgL3Vzci9iaW4vc3lzdGVtY3RsIGVuYWJsZSAtLW5vdyB3Zy1xdWlja0B3Zy1mZWxob20sIFwKICAvdXNyL2Jpbi9zeXN0ZW1jdGwgcmVzdGFydCB3Zy1xdWlja0B3Zy1mZWxob20sIFwKICAvdXNyL2Jpbi9zeXN0ZW1jdGwgZGlzYWJsZSAtLW5vdyB3Zy1xdWlja0B3Zy1mZWxob20sIFwKICAvdXNyL2Jpbi93ZyBzaG93IHdnLWZlbGhvbSBsYXRlc3QtaGFuZHNoYWtlcwoKIyBBZ2VudCBzZWxmLXVwZGF0ZSAoVEFTSyBEMTsgUi04NjEpLiBUaGUgQS9CIGZsaXAgKGBmZWxob20tc2VsZnVwZGF0ZS1ndWFyZGVkIGFwcGx5YCkgaXMgTk8gTE9OR0VSIHRoZSBhZ2VudCdzOiB0aGUKIyBhZ2VudCBoYW5kcyB0aGUgb3BlcmF0b3ItU0lHTkVEIGFnZW50X3VwZGF0ZSB0byBmZWxob20tb3MtYXBwbHkgKEZFTEhPTV9PU0FQUExZLCBtb2RlIGFnZW50X3VwZGF0ZSksIHdoaWNoIHZlcmlmaWVzCiMgdGhlIHNpZ25hdHVyZSBhcyByb290IGFuZCBvbmx5IHRoZW4gcnVucyB0aGUgZmxpcC4gVW50aWwgdjAuMTQ2LjAgdGhlIGFnZW50IHBhc3NlZCB0aGUgc2hhIGl0c2VsZiwgc28gYSBjb21wcm9taXNlZAojIGFnZW50IGNvdWxkIGluc3RhbGwgYW55IGJpbmFyeSDigJQgdGhlIGJpbmFyeSBGRUxIT01fRVNDUk9XIGFuZCB0aGUgZ3Vlc3QgaG9vayBydW4gYXMgcm9vdC4gYGNvbW1pdGAgKGNsZWFyIHRoZSBwZW5kaW5nCiMgbWFya2VyKSBhbmQgYHJvbGxiYWNrYCAocGVuZGluZy1ndWFyZGVkIHJldmVydCwgbm9ybWFsbHkgcnVuIGJ5IGZlbGhvbS1hZ2VudC1yb2xsYmFjay5zZXJ2aWNlKSBzdGF5LgpDbW5kX0FsaWFzIEZFTEhPTV9TRUxGVVBEQVRFID0gXAogIC91c3IvbG9jYWwvc2Jpbi9mZWxob20tc2VsZnVwZGF0ZS1ndWFyZGVkIGNvbW1pdCwgXAogIC91c3IvbG9jYWwvc2Jpbi9mZWxob20tc2VsZnVwZGF0ZS1ndWFyZGVkIHJvbGxiYWNrCgojIERlZGljYXRlZCBPT0Igc3NoZCAoVEFTSyBIMSkuIFRoZSBhZ2VudCBtYW5hZ2VzIGZlbGhvbS1zc2hkIGxpa2Ugd2ctZmVsaG9tL2Ruc21hc3E6IGl0IFJFTkRFUlMgdGhlCiMgY29uZmlnIChQb3J0IGZyb20gaXRzIGNsYWltKSArIHRoZSBvcGVyYXRvcidzIGF1dGhvcml6ZWRfa2V5cywgdmFsaWRhdGVzIHdpdGggYHNzaGQgLXRgLCBhbmQgcmVsb2FkcwojIChuZXZlciByZXN0YXJ0LW9uLWNoYW5nZSBbU0YtMl0pLiBCb3RoIGZpbGVzIHJlYWNoIC9ldGMvZmVsaG9tLXNzaGQgb25seSB0aHJvdWdoIGZlbGhvbS1wcml2LWFwcGx5IChSLTg2MSk6IHRoZSBjb25maWcKIyBtdXN0IGJlIHRoZSBPTkUgdGVtcGxhdGUgd2l0aCBvbmx5IHRoZSBQb3J0IHZhcnlpbmcgKGFuIEF1dGhvcml6ZWRLZXlzRmlsZSB0aGUgYWdlbnQgb3ducyArIGBTdHJpY3RNb2RlcyBub2Agd291bGQgYmUKIyBhIHJvb3QgbG9naW4pLCB0aGUga2V5IGZpbGUgb25lIHBsYWluIHB1YmxpYyBrZXkgd2l0aG91dCBvcHRpb25zLiBgc3NoZCAtdC8tVGAgYXJlIHRoZSB2YWxpZGF0ZS9kaXNjb3ZlciByZWFkcy4gVGhlCiMgc3lzdGVtY3RsIHZlcmJzIGFyZSBTQ09QRUQgdG8gZmVsaG9tLXNzaGQgb25seS4gcmVzZXQtZmFpbGVkIHByZWNlZGVzIGEgZGVsaWJlcmF0ZSByZXN0YXJ0IFtTRi01XS4KIyBOT1RISU5HIGhlcmUgY2FuIHRvdWNoIHRoZSBzdG9jayBzc2hkLCA6MjIsIG9yIC9ldGMvc3NoLgpDbW5kX0FsaWFzIEZFTEhPTV9TU0hEID0gXAogIC91c3IvbG9jYWwvc2Jpbi9mZWxob20tcHJpdi1hcHBseSBzc2hkLWNvbmZpZywgXAogIC91c3IvbG9jYWwvc2Jpbi9mZWxob20tcHJpdi1hcHBseSBzc2hkLWtleSwgXAogIC91c3Ivc2Jpbi9zc2hkIC10IC1mIC92YXIvbGliL2ZlbGhvbS1hZ2VudC9mZWxob20tc3NoZC9zc2hkX2NvbmZpZywgXAogIC91c3Ivc2Jpbi9zc2hkIC10IC1mIC9ldGMvZmVsaG9tLXNzaGQvc3NoZF9jb25maWcsIFwKICAvdXNyL3NiaW4vc3NoZCAtVCAtZiAvZXRjL2ZlbGhvbS1zc2hkL3NzaGRfY29uZmlnLCBcCiAgL3Vzci9iaW4vc3lzdGVtY3RsIGVuYWJsZSAtLW5vdyBmZWxob20tc3NoZCwgXAogIC91c3IvYmluL3N5c3RlbWN0bCByZWxvYWQgZmVsaG9tLXNzaGQsIFwKICAvdXNyL2Jpbi9zeXN0ZW1jdGwgcmVzdGFydCBmZWxob20tc3NoZCwgXAogIC91c3IvYmluL3N5c3RlbWN0bCByZXNldC1mYWlsZWQgZmVsaG9tLXNzaGQsIFwKICAvdXNyL2Jpbi93ZyBzaG93IHdnLWZlbGhvbSBsYXRlc3QtaGFuZHNoYWtlcwoKIyBQQlMgRFIgdGllciBhcHBseSAoc2xpY2UgMiwgU1BJS0UtcGJzLXRpZXItcHJvdmlzaW9uaW5nLTIwMjYtMDctMTAgwqcyYikuIFN0b3JhZ2UtZW50cnkKIyBsaWZlY3ljbGUgaXMgL3N0b3JhZ2UtUk9PVC1nYXRlZCBpbiB0aGUgUFZFIEFQSSAoc3Bpa2UgUHJvYmUgMTogY3JlYXRlL21vZGlmeS9kZWxldGUgYWxsIGNoZWNrCiMgRGF0YXN0b3JlLkFsbG9jYXRlIG9uIC9zdG9yYWdlKSwgc28gdGhlIGFnZW50IHRva2VuIGNhbm5vdCBkbyBpdCDigJQgdGhpcyB3cmFwcGVyIGlzIHRoZSBwaW5uZWQKIyB2ZWN0b3IuIFRIRSBTRVQtT05MWSBMQVc6IHRoZSB3cmFwcGVyIGNvbnRhaW5zIE5PIGRlbGV0aW9uIHBhdGggKGVudHJ5IGRlbGV0aW9uIGRlc3Ryb3lzIHRoZQojIGNsaWVudCBlbmNyeXB0aW9uIGtleSA9IHVuLWRlY3J5cHRhYmxlIGJhY2t1cHMpOyB2ZXJicyBhcmUgY3JlYXRlL3JlY29uY2lsZS9ncmFudCBvbmx5LiBUaGUKIyB0b2tlbiBzZWNyZXQgcmlkZXMgdGhlIHdyYXBwZXIncyBTVERJTiDigJQgc3VkbyBsb2dzIGFyZ3YsIHNvIGl0IG11c3QgbmV2ZXIgYXBwZWFyIGhlcmUuIFRoZQojIGFnZW50IGZpbmUtdmFsaWRhdGVzIGV2ZXJ5IGZpZWxkIChjaGFyc2V0ICsgZGVzY3JpcHRvciBlcXVhbGl0eSkgYmVmb3JlIGV4ZWM7IHRoZXNlIGdsb2JzIGFyZQojIHRoZSBjb2Fyc2UgYWxsb3dsaXN0LgojCiMgYHJlYWRgIChSLTM5IGxlZyBiLCBhZ2VudCB2MC45MS4wKSBpcyB0aGUgT05FIGFkZGVkIHZlcmIuIEl0IHByaW50cyBhIHRva2VuIHNlY3JldCB0byBzdGRvdXQgYW5kCiMgcGVyZm9ybXMgbm8gbXV0YXRpb24uIEl0IGV4aXN0cyBiZWNhdXNlIHRoZSBhZ2VudCB3cml0ZXMgdGhhdCBmaWxlIHRocm91Z2ggdGhpcyB3cmFwcGVyIGJ1dCBjb3VsZAojIG5ldmVyIHJlYWQgaXQgYmFjayAoL2V0Yy9wdmUvcHJpdiBpcyAwNzAwIHJvb3Q6d3d3LWRhdGEpLCBsZWF2aW5nIGl0cyBQQlMgdmVyaWZ5IGxvb3AgcGVybWFuZW50bHkKIyBibGluZCB0byBhbiBgYXBwbGllZGAtYnV0LTQwMSB0aWVyLiBJdCBpcyBOT1QgYSBnZW5lcmFsIGZpbGUtcmVhZDogdGhlIHdyYXBwZXIgcGlucyB0aGUgZGlyZWN0b3J5CiMgYW5kIHByZWZpeC1hc3NlcnRzIHRoZSByZXNvbHZlZCBwYXRoLCBhbmQgdGhlIGlkIGdyYW1tYXIgYWRtaXRzIG5vIHNsYXNoLiBUaGUgc2VjcmV0IGdvZXMgdG8KIyBTVERPVVQsIG5ldmVyIGFyZ3Yg4oCUIHN1ZG8gbG9ncyBhcmd2LgojIEUtMmE6IHRoZSBiYWNrdXAtdGFyZ2V0IHN0b3JhZ2Ugc2hpbS4gQ3JlYXRpbmcgYSBQVkUgc3RvcmFnZSBuZWVkcyBEYXRhc3RvcmUuQWxsb2NhdGUgYXQgL3N0b3JhZ2UKIyBhbmQgdGhlIGdyYW50IG5lZWRzIFBlcm1pc3Npb25zLk1vZGlmeSAtLSB0aGUgYWdlbnQgaG9sZHMgTkVJVEhFUiBieSBkZXNpZ24gKGJsYXN0LXJhZGl1cwojIGNvbnRhaW5tZW50OyBQZXJtaXNzaW9ucy5Nb2RpZnkgd291bGQgbGV0IGl0IHJld3JpdGUgaXRzIG93biBhdXRob3JpdHkpLiBCb3RoIGxpdmUgYmVoaW5kIHRoaXMKIyBmaXhlZC12b2NhYnVsYXJ5IHJvb3Qgc2hpbSBpbnN0ZWFkLCBleGFjdGx5IGxpa2UgdGhlIG1rZnMgYW5kIHBicy1hcHBseSB3cmFwcGVycy4gVGhlIHdyYXBwZXIgaGFzCiMgTk8gc3RvcmFnZS1yZW1vdmFsIHBhdGgsIGVuZm9yY2VzIGlzX21vdW50cG9pbnQgMSwgYW5kIHJlZnVzZXMgYSB0YXJnZXQgb24gdGhlIHJvb3QgZGV2aWNlLgpDbW5kX0FsaWFzIEZFTEhPTV9CQUNLVVBUQVJHRVQgPSBcCiAgL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1iYWNrdXAtdGFyZ2V0LWFwcGx5IGNyZWF0ZSAqLCBcCiAgL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1iYWNrdXAtdGFyZ2V0LWFwcGx5IGdyYW50ICoKCkNtbmRfQWxpYXMgRkVMSE9NX1BCU0RSID0gXAogIC91c3IvbG9jYWwvc2Jpbi9mZWxob20tcGJzLWFwcGx5IGNyZWF0ZSAqLCBcCiAgL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1wYnMtYXBwbHkgcmVjb25jaWxlICosIFwKICAvdXNyL2xvY2FsL3NiaW4vZmVsaG9tLXBicy1hcHBseSBncmFudCAqLCBcCiAgL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1wYnMtYXBwbHkgcmVhZCAqCgojIE9PQiBuZnQgYmVsdCAoVEFTSyBIMSkuIFRoZSBTVEFUSUMgdGFibGUgYGluZXQgZmVsaG9tX29vYmAgaXMgaW5zdGFsbGVkIG9uY2UgYnkgaG9zdC1pbnN0YWxsOyB0aGUKIyBhZ2VudCBtdXRhdGVzIE9OTFkgaXRzIHR3byBTRVRTIOKAlCBAb3BlcmF0b3JfaXBzICh0aGUgb3BlcmF0b3IgLzMyKSArIEBzc2hfcG9ydCAodGhlIGNsYWltZWQgcG9ydCkuCiMgU0VUIEVMRU1FTlRTIE9OTFkgW3RyYXAgNF06IE5PIGBuZnQgYWRkIHJ1bGVgLCBOTyBgbmZ0IC1mYCwgTk8gYGZsdXNoIHJ1bGVzZXQvdGFibGVgIOKAlCBhIHJ1bGUgZ3JhbnQKIyB3b3VsZCBsZXQgdGhlIGFnZW50IGZpcmV3YWxsIGFueXRoaW5nLiBUaGUgYWdlbnQgZmluZS12YWxpZGF0ZXMgZXZlcnkgZWxlbWVudCAobmV0aXAgLyBpbnQgcmFuZ2UpCiMgYmVmb3JlIGV4ZWM7IHRoZSB0cmFpbGluZyB3aWxkY2FyZHMgYXJlIHRoZSBjb2Fyc2UgYWxsb3dsaXN0ICh2YWx1ZXMgb25seSkuCkNtbmRfQWxpYXMgRkVMSE9NX09PQiA9IFwKICAvdXNyL3NiaW4vbmZ0IGxpc3Qgc2V0IGluZXQgZmVsaG9tX29vYiBvcGVyYXRvcl9pcHMsIFwKICAvdXNyL3NiaW4vbmZ0IGxpc3Qgc2V0IGluZXQgZmVsaG9tX29vYiBzc2hfcG9ydCwgXAogIC91c3Ivc2Jpbi9uZnQgZmx1c2ggc2V0IGluZXQgZmVsaG9tX29vYiBvcGVyYXRvcl9pcHMsIFwKICAvdXNyL3NiaW4vbmZ0IGZsdXNoIHNldCBpbmV0IGZlbGhvbV9vb2Igc3NoX3BvcnQsIFwKICAvdXNyL3NiaW4vbmZ0IF5hZGQgZWxlbWVudCBpbmV0IGZlbGhvbV9vb2Igb3BlcmF0b3JfaXBzIFx7IFswLTkuXSsoL1swLTldKyk/IFx9JCwgXAogIC91c3Ivc2Jpbi9uZnQgXmFkZCBlbGVtZW50IGluZXQgZmVsaG9tX29vYiBzc2hfcG9ydCBceyBbMC05XSsgXH0kCgojIEVzY3JvdyBjZXJlbW9ueSAoY29udHJvbGxlci1kcml2ZW4sIFRBU0sgMjAyNi0wNy0xMzsgbWVjaGFuaWNzIHZhbGlkYXRlZCBieQojIFNQSUtFLWNvbnRyb2xsZXItZXNjcm93LTIwMjYtMDctMTMpLiBPTkUgZml4ZWQgYXJndiDigJQgc3Vkb2VycyBtYXRjaGVzIHRoZSBhcmd1bWVudCB2ZWN0b3IKIyBieXRlLWZvci1ieXRlIChzcGlrZSDCpzIuMik6IGFueSBhbHRlcmF0aW9uICh2YWx1ZSwgZXh0cmEgZmxhZywgb3JkZXIsIGNvbmZpZyBwYXRoKSBpcyByZWZ1c2VkLgojIC0tY29uZmlnIHBpbm5lZDogZW52X3Jlc2V0IHN0cmlwcyBGRUxIT01fQUdFTlRfQ09ORklHIGFuZCB0aGUgcGluIGNsb3NlcyBhbHRlcm5hdGUtY29uZmlnCiMgaW5qZWN0aW9uLiBSIHJpZGVzIHRoZSBzdWJwcm9jZXNzIHN0ZG91dCBwaXBlIG9ubHk7IHN1ZG8gbG9ncyBhcmd2ID0gc2VjcmV0cy1mcmVlLiBUaGUgYXJndgojIE1VU1Qgc3RheSBieXRlLWlkZW50aWNhbCB0byBlc2Nyb3cuQ2VyZW1vbnlBcmdzKCkgKGludGVybmFsL2VzY3Jvdy9jZXJlbW9ueS5nbykg4oCUIHRoZQojIGNhcGFiaWxpdHkgbWFuaWZlc3QgZW50cnkgKyBUZXN0TWFuaWZlc3RDb3ZlcmVkQnlTdWRvZXJzIGxvY2sgdGhlIHRocmVlIGNvcGllcyB0b2dldGhlci4KQ21uZF9BbGlhcyBGRUxIT01fRVNDUk9XID0gXAogIC91c3IvbG9jYWwvYmluL2ZlbGhvbS1hZ2VudCAtLWNvbmZpZyAvZXRjL2ZlbGhvbS1hZ2VudC9hZ2VudC5qc29uIC0tc2VsZnRlc3Q9ZXNjcm93LWNyZWF0ZSAtLXVwbG9hZCAtLW91dHB1dD1qc29uCgojIE5vZGUgc2VsZi1oZWFsIChDQU1QQUlHTi0zIFBhcnQgNiwgRjEyLWNsYXNzIGRlZmVuc2UgaW4gZGVwdGgpLiBUaGUgT05FIGZpeGVkIHVuaXQgdGhlIGFwcGxpYW5jZQojIHdhdGNoZG9nIG1heSAocmUpc3RhcnQgd2hlbiBhIGJvb3QgbGVhdmVzIG5ldHdvcmtpbmcgZG93biDigJQgdGhlIGV4YWN0IGNvbW1hbmQgdGhlIG1vcm5pbmcgcmVjb3ZlcnkKIyByYW4gYnkgaGFuZCBhZnRlciB0aGUgRjEyIGhvc3QgbG9zcy4gRklYRUQgdW5pdCwgbm8gZ2xvYjogdGhpcyBncmFudCBhbG9uZSBjYW5ub3QgaGFybSDigJQgc3RhcnRpbmcKIyBuZXR3b3JraW5nLnNlcnZpY2UgaXMgcHJlY2lzZWx5IHdoYXQgdGhlIGJvb3Qgc2hvdWxkIGhhdmUgZG9uZS4gVGhlIHJlbWVkeSBpcyBBTFNPIGNvZGUtZ2F0ZWQgb24KIyBkZXBsb3ltZW50X21vZGU9ImFwcGxpYW5jZSIgKHRoZSBNYW5hZ2VyIHJlZnVzZXMgdG8gaW52b2tlIGl0IG9uIGEgYnlvIGhvc3QpOyB0aGUgc3Vkb2VycyBncmFudCBpcwojIHRoZSBjb2Fyc2UgZmxvb3IsIHRoZSBtb2RlIGdhdGUgaXMgdGhlIGZpbmUgb25lLgpDbW5kX0FsaWFzIEZFTEhPTV9TRUxGSEVBTCA9IFwKICAvdXNyL2Jpbi9zeXN0ZW1jdGwgc3RhcnQgbmV0d29ya2luZy5zZXJ2aWNlCgojIEd1ZXN0LW5ldHdvcmsgd2F0Y2hkb2cgKGludGVybmFsL2d1ZXN0bmV0LCBSLTU0KS4gVGhlIGd1ZXN0J3MgREhDUCBjbGllbnQgaXMgdW5zdXBlcnZpc2VkIOKAlCB3aGVuIGl0CiMgZGllZCBvbiAyMDI2LTA3LTIwIHRoZSBib3ggbG9zdCBpdHMgYWRkcmVzcyB+ODAgbWludXRlcyBsYXRlciBhbmQgd2VudCBvZmYgdGhlIGludGVybmV0IGZvciAxaDE1bQojIChJTkNJREVOVC1ndWVzdC1kaGNsaWVudC1raWxsZWQtMjAyNi0wNy0yMCkuIEZvdXIgRklYRUQgcmVhZCB2ZWN0b3JzIHBsdXMgT05FIGZpeGVkIGhlYWwgdmVjdG9yOyB0aGUKIyBoZWFsIGlzIHRoZSBpbmNpZGVudCdzIG93biByZXN0b3JlZCBpbnZvY2F0aW9uLCBieXRlIGZvciBieXRlLiBUaGlzIGlzIE5PVCBhIGdlbmVyYWwgYHBjdCBleGVjYDogZXZlcnkKIyBhcmd1bWVudCBhZnRlciB0aGUgbnVtZXJpYyB2bWlkIGlzIGEgbGl0ZXJhbCwgc28gdGhlIGdyYW50IGNhbm5vdCBiZSB3aWRlbmVkIGJ5IGFueXRoaW5nIHRoZSBndWVzdCBvcgojIHRoZSBodWIgc2F5cy4gVGhlIGFkZHJlc3MgcmVhZCBpcyBkZWxpYmVyYXRlbHkgTk9UIGR1cGxpY2F0ZWQgaGVyZSDigJQgaXQgaXMgYWxyZWFkeSBGRUxIT01fRE5TTUFTUSdzLAojIGFuZCB0aGUgc2FtZSBjb21tYW5kIG11c3Qgbm90IGJlIGdyYW50ZWQgdHdpY2UgdW5kZXIgdHdvIG5hbWVzLgojIE9TIHVwZGF0ZXMsIGd1ZXN0IGZhc3QgbGFuZSAoYDExLW9zLXVwZGF0ZXMubWRgIMKnNS40LjEsIGFnZW50IHYwLjE0MC4wKS4gVGhlIE9OTFkgZW50cnk6IHRoZSByb290IHdyYXBwZXIgd2l0aAojIG9uZSBwbGFuIGZpbGUgaW4gdGhlIGFnZW50J3Mgb3duIG9zLyBkaXIuIEV2ZXJ5IHNhZmV0eSBydWxlIChubyByZW1vdmFsLCBubyBkb3duZ3JhZGUsIG5vIG5ldyBvciB1bmxpc3RlZCBwYWNrYWdlLAojIERlYmlhbiBvcmlnaW4gb25seSwgdGhlIGJveCdzIG93biBjdXN0b21lciBndWVzdCBvbmx5KSBsaXZlcyBpbiB0aGUgd3JhcHBlciwgcmVkLXByb3ZlZCBwZXIgcnVsZQojIChjb25maWdzL3Rlc3RfZmVsaG9tX29zX2FwcGx5LnB5KS4gVGhlIGFnZW50IGdldHMgTk8gYXB0IGdyYW50IG9mIGl0cyBvd24uCkNtbmRfQWxpYXMgRkVMSE9NX09TQVBQTFkgPSBcCiAgL3Vzci9sb2NhbC9zYmluL2ZlbGhvbS1vcy1hcHBseSAtLXBsYW4gL3Zhci9saWIvZmVsaG9tLWFnZW50L29zL3BsYW4tKi5qc29uCgpDbW5kX0FsaWFzIEZFTEhPTV9HVUVTVE5FVCA9IFwKICAvdXNyL3NiaW4vcGN0IF5leGVjIFswLTldKyAtLSBpcCByb3V0ZSBzaG93IGRlZmF1bHQkLCBcCiAgL3Vzci9zYmluL3BjdCBeZXhlYyBbMC05XSsgLS0gY2F0IC9ldGMvbmV0d29yay9pbnRlcmZhY2VzJCwgXAogIC91c3Ivc2Jpbi9wY3QgXmV4ZWMgWzAtOV0rIC0tIHBncmVwIC14IGRoY2xpZW50JCwgXAogIC91c3Ivc2Jpbi9wY3QgXmV4ZWMgWzAtOV0rIC0tIGRoY2xpZW50IC1wZiAvcnVuL2RoY2xpZW50XC5ldGgwXC5waWQgLWxmIC92YXIvbGliL2RoY3AvZGhjbGllbnRcLmV0aDBcLmxlYXNlcyBldGgwJAoKZmVsaG9tLWFnZW50IEFMTD0ocm9vdCkgTk9QQVNTV0Q6IEZFTEhPTV9NT1VOVCwgRkVMSE9NX0RJU0ssIEZFTEhPTV9QUk9WSVNJT04sIEZFTEhPTV9GT1JNQVQsIEZFTEhPTV9ETlNNQVNRLCBGRUxIT01fR1VFU1RIT09LLCBGRUxIT01fSU5URVJNRURJQVJZLCBGRUxIT01fQ09OVFJPTExFUlNXQVAsIEZFTEhPTV9TVEFMRUxPQ0ssIEZFTEhPTV9GU1RSSU0sIEZFTEhPTV9ORVRNT1VOVCwgRkVMSE9NX1dHLCBGRUxIT01fU0VMRlVQREFURSwgRkVMSE9NX1NTSEQsIEZFTEhPTV9PT0IsIEZFTEhPTV9QQlNEUiwgRkVMSE9NX0JBQ0tVUFRBUkdFVCwgRkVMSE9NX1NFTEZIRUFMLCBGRUxIT01fRVNDUk9XLCBGRUxIT01fR1VFU1RORVQsIEZFTEhPTV9TQ1JBVENIX1RFQVJET1dOLCBGRUxIT01fT1NBUFBMWQo=",
   "mode": "0o440",
   "path": "/etc/sudoers.d/felhom-agent",
   "policy": "replace",
   "sha256": "84d7da38c937624251fbc6defb8f04a7e33bc0abd0e002d782aec3ea04853fb2",
   "source": "configs/felhom-agent.sudoers"
  }
 ],
 "format": 1
}
