The Mindset Teaching Compass: A Reflection Tool for EducatorsBy Martha Ramirez / July 13, 2026 Loading The Mindset Teaching Compass… CihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwoKICAvKiAtLS0tLS0tLS0tIHlvdXIgZGF0YSBzb3VyY2UgLS0tLS0tLS0tLSAqLwogIHZhciBTSEVFVF9FTkRQT0lOVF9VUkwgPSAiaHR0cHM6Ly9zY3JpcHQuZ29vZ2xlLmNvbS9tYWNyb3Mvcy9BS2Z5Y2J4b3hCaG42ZEttX2tpV0JjNUYzWE0zUjFOT2o4RzltLVhRU3FSeU5rRE5HcWJxclBGWDZTZDBXRFFFbkF3YmFpdm00US9leGVjIjsKICB2YXIgU1RPUkVfS0VZID0gInRjLWNvbXBhc3MtcHJvZ3Jlc3MiOwoKICB2YXIgUkFNUCA9IFsiIzAwOTBDNyIsICIjM0U2Q0M0IiwgIiM4QjRCQkUiLCAiI0MyMkJBNSIsICIjRUIwMDhCIl07CgogIHZhciBDQVRTID0gWwogICAgeyBrZXk6IndvcmxkX3Zpc2lvbiIsIG5hbWU6IldvcmxkIFZpc2lvbiIsCiAgICAgIGRlc2M6IlBlcmNlcHRpb24gb2YgeW91ciBjYXBhY2l0eSB0byBjaGFuZ2UgYW5kIGdyb3cgYXMgYW4gZWR1Y2F0b3IsIGluY2x1ZGluZyB5b3VyIHRlYWNoaW5nIGlkZW50aXR5LCBvdXRsb29rLCBhbmQgcG90ZW50aWFsIGluIHRoZSBjbGFzc3Jvb20uIFRoaXMgY29uY2VwdCBhZGRyZXNzZXMgd2hldGhlciB5b3Ugc2VlIHlvdXIgcHJvZmVzc2lvbmFsIGdyb3d0aCwgYW5kIHlvdXIgdmlldyBvZiB5b3Vyc2VsZiBhcyBhIHRlYWNoZXIsIGFzIGEgY29udGludW91cyBvciBsaW1pdGVkIHByb2Nlc3MuIiwKICAgICAgc3RhdGVtZW50czpbCiAgICAgICAgIk15IHRlYWNoaW5nIGFiaWxpdHkgaXMgZml4ZWQuIEkgaGF2ZSBhIGNlcnRhaW4gd2F5IG9mIHRlYWNoaW5nLCBhbmQgdGhhdCBpcyBzaW1wbHkgd2hvIEkgYW0gYXMgYW4gZWR1Y2F0b3IuIiwKICAgICAgICAiQSBmZXcgcGFydHMgb2YgbXkgdGVhY2hpbmcgY291bGQgaW1wcm92ZSwgYnV0IEkgc3RpbGwgY29uc2lkZXIgbXkgb3ZlcmFsbCBhcHByb2FjaCBzZXQuIiwKICAgICAgICAiSSdtIG9wZW4gdG8gZ3Jvd2luZyBpbiBwYXJ0cyBvZiBteSB0ZWFjaGluZywgYXMgbG9uZyBhcyBpdCBkb2Vzbid0IHRvdWNoIHdoYXQgSSBjb25zaWRlciBjb3JlIHRvIHdobyBJIGFtIGFzIGFuIGVkdWNhdG9yLiIsCiAgICAgICAgIkkgYWxsb3cgbXlzZWxmIHRvIGdyb3cgZXZlbiBpbiB0aGUgcGFydHMgb2YgbXkgdGVhY2hpbmcgdGhhdCBvbmNlIGZlbHQgbGlrZSBjb3JlIHRvIHdobyBJIGFtLiIsCiAgICAgICAgIkknbSB3aWxsaW5nIHRvIHF1ZXN0aW9uIGFuZCBjaGFuZ2UgZXZlbiB0aGUgcGFydHMgb2YgbXkgdGVhY2hpbmcgSSBvbmNlIGJlbGlldmVkIHdlcmUgc2ltcGx5IHdobyBJIGFtIGFzIGFuIGVkdWNhdG9yLiJdLAogICAgICByZWZsZWN0aW9uczpbCiAgICAgICAgIldoZXJlIGluIHlvdXIgdGVhY2hpbmcgbGlmZSBkb2VzIHRoaXMgYmVsaWVmIHNob3cgdXAgbW9zdD8iLAogICAgICAgICJXaGljaCBwYXJ0cyBvZiB5b3VyIHRlYWNoaW5nIGRvIHlvdSBjb25zaWRlciBvcGVuIHRvIGNoYW5nZSwgYW5kIHdoaWNoIGRvIHlvdSBrZWVwIG9mZi1saW1pdHM/IFdoYXQncyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0/IiwKICAgICAgICAiV2hhdCB3b3VsZCBzb21lb25lIHdobydzIHdhdGNoZWQgeW91IHRlYWNoIGZvciB5ZWFycyBzYXkgaGFzIGFjdHVhbGx5IGNoYW5nZWQ/Il0gfSwKICAgIHsga2V5OiJlZmZvcnQiLCBuYW1lOiJFZmZvcnQiLAogICAgICBkZXNjOiJQZXJjZXB0aW9uIG9mIGNvbnNpc3RlbnQgd29yayBhbmQgZGVkaWNhdGlvbiBhcyBrZXkgZmFjdG9ycyBmb3IgZ2VuZXJhdGluZyBjaGFuZ2UgYW5kIGFjaGlldmluZyBnb2FscyBpbiB5b3VyIHRlYWNoaW5nIHByYWN0aWNlLiBUaGlzIGNvbmNlcHQgZXhwbG9yZXMgd2hldGhlciBlZmZvcnQgaXMgc2VlbiBhcyBhbiBlZmZlY3RpdmUgbWVhbnMgb2YgaW1wcm92aW5nIGluc3RydWN0aW9uYWwgc2tpbGxzIGFuZCBvdmVyY29taW5nIGNsYXNzcm9vbSBjaGFsbGVuZ2VzLiIsCiAgICAgIHN0YXRlbWVudHM6WwogICAgICAgICJJIGRvbid0IGJlbGlldmUgZWZmb3J0IG1ha2VzIG11Y2ggZGlmZmVyZW5jZSBpbiBob3cgZ29vZCBhIHRlYWNoZXIgSSBhbS4gRWl0aGVyIEkgYW0gbmF0dXJhbGx5IGdvb2QgYXQgaXQsIG9yIEknbSBub3QuIiwKICAgICAgICAiSSBrbm93IGVmZm9ydCBjYW4gaGVscCBhIGxpdHRsZSwgYnV0IEkgZG9uJ3QgdGhpbmsgaXQgY2hhbmdlcyBtdWNoIGFib3V0IG15IHRlYWNoaW5nIGluIGFueSByZWFsIHdheS4iLAogICAgICAgICJJIHB1dCBpbiBlZmZvcnQgdG8gY2hhbmdlIG15IHByYWN0aWNlLCBidXQgbW9zdGx5IHdoZW4gSSBjYW4gc2VlIGl0IHdpbGwgcGF5IG9mZiBmYWlybHkgcXVpY2tseS4iLAogICAgICAgICJJIHB1dCBpbiBlZmZvcnQgdG8gY2hhbmdlIG15IHByYWN0aWNlIGV2ZW4gd2hlbiBJIGRvbid0IGtub3cgaWYgaXQgd2lsbCBwYXkgb2ZmIHJpZ2h0IGF3YXkuIiwKICAgICAgICAiSSBrZWVwIHB1dHRpbmcgaW4gZWZmb3J0LCBldmVuIGluIHRoZSBhcmVhcyB3aGVyZSBJIG9uY2UgYmVsaWV2ZWQgSSBkaWRuJ3QgbmVlZCB0by4iXSwKICAgICAgcmVmbGVjdGlvbnM6WwogICAgICAgICJJcyB0aGVyZSBhbiBhcmVhIG9mIHlvdXIgcHJhY3RpY2Ugd2hlcmUgeW91J3ZlIHF1aWV0bHkgc3RvcHBlZCB0cnlpbmc/IiwKICAgICAgICAiV2hlcmUgYXJlIHlvdSB3aWxsaW5nIHRvIHB1dCBpbiBlZmZvcnQsIGFuZCB3aGVyZSBoYXZlIHlvdSBxdWlldGx5IHN0b3BwZWQ/IiwKICAgICAgICAiV2hhdCBlZmZvcnQgaGF2ZSB5b3UgcHV0IGludG8geW91ciB0ZWFjaGluZyByZWNlbnRseSB0aGF0IHlvdSdyZSBwcm91ZCBvZiwgYW5kIHdoYXQgbWFkZSBpdCB3b3J0aCB0aGUgd29yaz8iXSB9LAogICAgeyBrZXk6ImNoYWxsZW5nZXMiLCBuYW1lOiJDaGFsbGVuZ2VzIiwKICAgICAgZGVzYzoiUGVyY2VwdGlvbiBvZiBob3cgdG8gZGVhbCB3aXRoIGRpZmZpY3VsdCB0ZWFjaGluZyBzaXR1YXRpb25zIG9yIHNpdHVhdGlvbnMgb3V0c2lkZSB5b3VyIGNvbWZvcnQgem9uZSBhcyBhbiBlZHVjYXRvci4gVGhpcyBpbmNsdWRlcyBhIHdpbGxpbmduZXNzIHRvIGFwcHJvYWNoIHRoZXNlIGNoYWxsZW5nZXMgYXMgb3Bwb3J0dW5pdGllcyBmb3IgcHJvZmVzc2lvbmFsIGRldmVsb3BtZW50LCBvciBhIHRlbmRlbmN5IHRvIGF2b2lkIHRoZW0uIiwKICAgICAgc3RhdGVtZW50czpbCiAgICAgICAgIldoZW4gc29tZXRoaW5nIGluIG15IHRlYWNoaW5nIHB1c2hlcyBtZSBvdXRzaWRlIG15IGNvbWZvcnQgem9uZSwgSSBhdm9pZCBpdCB3aGVuZXZlciBwb3NzaWJsZS4iLAogICAgICAgICJDaGFsbGVuZ2VzIG1ha2UgbWUgdW5jb21mb3J0YWJsZSwgYW5kIEkgdXN1YWxseSBhdm9pZCB0aGVtLCBldmVuIHRob3VnaCBJIGtub3cgSSBzaG91bGRuJ3QuIiwKICAgICAgICAiSSBmYWNlIGEgdGVhY2hpbmcgY2hhbGxlbmdlLCBidXQgb25seSBpZiBJIGJlbGlldmUgSSBjYW4gaGFuZGxlIGl0LiIsCiAgICAgICAgIkkgZmFjZSB0ZWFjaGluZyBjaGFsbGVuZ2VzIGV2ZW4gd2hlbiBJJ20gbm90IHN1cmUgSSBjYW4gaGFuZGxlIHRoZW0uIiwKICAgICAgICAiSSBzZWVrIG91dCB0aGUgdGVhY2hpbmcgY2hhbGxlbmdlcyBJJ2Qgbm9ybWFsbHkgYXZvaWQsIGV2ZW4ga25vd2luZyBJIG1pZ2h0IGZhaWwgYXQgdGhlbS4iXSwKICAgICAgcmVmbGVjdGlvbnM6WwogICAgICAgICJJcyB0aGVyZSBhIHRlYWNoaW5nIGNoYWxsZW5nZSB5b3UndmUgYmVlbiBhdm9pZGluZz8gV2hhdCdzIHRoZSBjb3N0IG9mIGNvbnRpbnVpbmcgdG8gYXZvaWQgaXQ/IiwKICAgICAgICAiV2hlcmUgZG8geW91IGRyYXcgdGhlIGxpbmUgYmV0d2VlbiBhIGNoYWxsZW5nZSB3b3J0aCBmYWNpbmcgYW5kIG9uZSB5b3UnZCByYXRoZXIgc2tpcD8iLAogICAgICAgICJXaGF0J3MgYSByZWNlbnQgY2hhbGxlbmdlIHRoYXQgY2hhbmdlZCBob3cgeW91IHRlYWNoPyJdIH0sCiAgICB7IGtleToiY29sbGVhZ3VlX3N1Y2Nlc3MiLCBuYW1lOiJDb2xsZWFndWVzJyBTdWNjZXNzIiwKICAgICAgZGVzYzoiVGhlIGVtb3Rpb25hbCBhbmQgYXR0aXR1ZGluYWwgcmVhY3Rpb24gdG8gb3RoZXIgY29sbGVhZ3VlcycgYWNoaWV2ZW1lbnRzIGFuZCBzdWNjZXNzLCBpbmNsdWRpbmcgaG93IHlvdSBoYW5kbGUgdGhlIGNvbXBhcmlzb25zIHRoYXQgYXJpc2UgZnJvbSBvYnNlcnZpbmcgdGhlaXIgcHJvZ3Jlc3MuIiwKICAgICAgc3RhdGVtZW50czpbCiAgICAgICAgIkEgY29sbGVhZ3VlJ3Mgc3VjY2VzcyBtYWtlcyBtZSB1bmNvbWZvcnRhYmxlLCBhbmQgSSB0cnkgdG8gYXZvaWQgc2l0dWF0aW9ucyB3aGVyZSBJIG1pZ2h0IGJlIGNvbXBhcmVkIHRvIHRoZW0uIiwKICAgICAgICAiQSBjb2xsZWFndWUncyBzdWNjZXNzIHN0aWxsIG1ha2VzIG1lIHVuY29tZm9ydGFibGUsIGJ1dCBJIHJlY29nbml6ZSBpdCBjYW4gdGVhY2ggbWUgc29tZXRoaW5nLiIsCiAgICAgICAgIkkgbGVhcm4gZnJvbSBhIGNvbGxlYWd1ZSdzIHN1Y2Nlc3Mgd2hlbiBpdCdzIGluIHNvbWV0aGluZyBJJ20gbm90IHRyeWluZyB0byBhY2hpZXZlIG15c2VsZjsgd2hlbiBpdCdzIGluIG15IG93biBmaWVsZCwgaXQncyBoYXJkZXIgZm9yIG1lLiIsCiAgICAgICAgIkV2ZW4gd2hlbiBhIGNvbGxlYWd1ZSBzdWNjZWVkcyBpbiBteSBvd24gZmllbGQsIEkgYXNrIG15c2VsZiBob3cgdGhleSBkaWQgaXQgYW5kIHdoYXQgSSBjYW4gbGVhcm4gZnJvbSBpdC4iLAogICAgICAgICJJJ20gaW5zcGlyZWQgYnkgbXkgY29sbGVhZ3Vlcycgc3VjY2VzcywgYW5kIEkgcmVhY2ggb3V0IHRvIHRoZW0gdG8gZ3JvdyB0b2dldGhlciwgZXZlbiB3aGVuIEkgaGF2ZW4ndCB5ZXQgYWNoaWV2ZWQgd2hhdCB0aGV5IGhhdmUuIl0sCiAgICAgIHJlZmxlY3Rpb25zOlsKICAgICAgICAiV2hlbiBhIGNvbGxlYWd1ZSBpcyByZWNvZ25pemVkIGZvciBzb21ldGhpbmcsIHdoYXQncyB0aGUgZmlyc3QgZmVlbGluZyB0aGF0IHNob3dzIHVwIGZvciB5b3U/IERvZXMgdGhhdCBmZWVsaW5nIHRlbGwgeW91IHNvbWV0aGluZyBhYm91dCB0aGVtLCBvciBzb21ldGhpbmcgYWJvdXQgeW91PyIsCiAgICAgICAgIldoYXQga2luZCBvZiBjb2xsZWFndWUgc3VjY2VzcyBpcyBlYXN5IGZvciB5b3UgdG8gY2VsZWJyYXRlLCBhbmQgd2hhdCBraW5kIGlzbid0PyIsCiAgICAgICAgIldobydzIGEgY29sbGVhZ3VlIHlvdSBhY3RpdmVseSBsZWFybiBmcm9tIHJpZ2h0IG5vdywgYW5kIHdoYXQgd291bGQgaXQgbG9vayBsaWtlIHRvIHRlbGwgdGhlbSwgZGlyZWN0bHksIHdoYXQgdGhlaXIgc3VjY2VzcyBoYXMgdGF1Z2h0IHlvdT8iXSB9LAogICAgeyBrZXk6ImRpZmZpY3VsdGllcyIsIG5hbWU6IkRpZmZpY3VsdGllcyBhbmQgT2JzdGFjbGVzIiwKICAgICAgZGVzYzoiUGVyY2VwdGlvbiBvZiBob3cgYmFycmllcnMgYW5kIHNldGJhY2tzIGluIHlvdXIgdGVhY2hpbmcgcHJhY3RpY2UgKGUuZy4gYSBsZXNzb24gdGhhdCBkb2Vzbid0IGxhbmQgb3IgYSBkaWZmaWN1bHQgc2VtZXN0ZXIpIGFyZSBoYW5kbGVkIGFsb25nIHRoZSB3YXkuIiwKICAgICAgc3RhdGVtZW50czpbCiAgICAgICAgIldoZW4gYW4gb2JzdGFjbGUgYXBwZWFycywgSSB0ZW5kIHRvIGdpdmUgdXAgYmVjYXVzZSBJIGJlbGlldmUgSSBjYW4ndCBjaGFuZ2UgdGhlIHNpdHVhdGlvbi4iLAogICAgICAgICJJIHJlY29nbml6ZSBJIGNvdWxkIG92ZXJjb21lIG9ic3RhY2xlcywgYnV0IHdoZW4gdGhleSBhcHBlYXIsIEkgd2FpdCB0byBzZWUgaWYgdGhleSByZXNvbHZlIG9uIHRoZWlyIG93bi4iLAogICAgICAgICJJIGtlZXAgZ29pbmcgd2hlbiB0aGUgb2JzdGFjbGUgZGVwZW5kcyBvbiBtZTsgaWYgaXQgZGVwZW5kcyBvbiBvdGhlciBwZW9wbGUgb3IgY2lyY3Vtc3RhbmNlcywgSSBsZWF2ZSBpdCB0aGVyZS4iLAogICAgICAgICJXaGVuIGFuIG9ic3RhY2xlIGFwcGVhcnMsIEkgbG9vayBmb3IgYSB3YXkgdG8gbW92ZSBmb3J3YXJkIGV2ZW4gaWYgaXQgZG9lc24ndCBkZXBlbmQgb25seSBvbiBtZS4iLAogICAgICAgICJXaGVuIGFuIG9ic3RhY2xlIGJsb2NrcyBteSBwYXRoLCBJIGZpbmQgYW5vdGhlciB3YXkgdGhyb3VnaCwgZXZlbiB3aGVuIGl0J3Mgc2xvd2VyIG9yIGhhcmRlciB0aGFuIHNpbXBseSB3YWl0aW5nIGZvciB0aGluZ3MgdG8gY2hhbmdlLiJdLAogICAgICByZWZsZWN0aW9uczpbCiAgICAgICAgIlRoaW5rIG9mIGEgdGVhY2hpbmcgc2l0dWF0aW9uIHdoZXJlIHlvdSBnYXZlIHVwLiBXaGF0IHdvdWxkIGl0IGhhdmUgdGFrZW4gZm9yIHlvdSB0byBrZWVwIGdvaW5nPyIsCiAgICAgICAgIklzIHRoZXJlIGEgc2V0YmFjayB5b3UncmUgc3RpbGwgZGVjaWRpbmcgd2hldGhlciB0byBwdXNoIHRocm91Z2ggb3IgbGV0IGdvIG9mPyBXaGF0J3MgbWFraW5nIHRoYXQgZGVjaXNpb24gaGFyZCB0byBsYW5kIG9uPyIsCiAgICAgICAgIldoYXQgc3VzdGFpbnMgeW91ciBwZXJzaXN0ZW5jZSBpbiB0aGUgaGFyZGVzdCBzdHJldGNoZXM/Il0gfSwKICAgIHsga2V5OiJtaXN0YWtlcyIsIG5hbWU6Ik1ha2luZyBNaXN0YWtlcyIsCiAgICAgIGRlc2M6IlBlcmNlcHRpb24gYW5kIG1hbmFnZW1lbnQgb2YgdGhlIG1pc3Rha2VzIHlvdSBtYWtlIGluIHlvdXIgdGVhY2hpbmcsIGFuZCBob3cgeW91IGhhbmRsZSB0aGVtIGJlaW5nIHNlZW4sIHdoZXRoZXIgYnkgc3R1ZGVudHMsIGNvbGxlYWd1ZXMsIGFkbWluaXN0cmF0b3JzLCBvciBwYXJlbnRzLiIsCiAgICAgIHN0YXRlbWVudHM6WwogICAgICAgICJJIGhpZGUgb3IgZG93bnBsYXkgbXkgbWlzdGFrZXMgYmVjYXVzZSB0aGV5IG1ha2UgbWUgZmVlbCBpbnNlY3VyZSBvciBleHBvc2VkIGluIGZyb250IG9mIG90aGVycyAoZS5nLiBzdHVkZW50cywgY29sbGVhZ3VlcywgcGFyZW50cywgZXRjLikuIiwKICAgICAgICAiSSBtYWtlIGV4Y3VzZXMgb3IgcG9pbnQgdG8gZXh0ZXJuYWwgZmFjdG9ycywgYmVjYXVzZSBhZG1pdHRpbmcgdGhhdCBhIG1pc3Rha2Ugd2FzIG1pbmUgZmVlbHMgd29yc2UgdGhhbiB0aGUgbWlzdGFrZSBpdHNlbGYuIiwKICAgICAgICAiSSBhZG1pdCBhIG1pc3Rha2Ugd2hlbiBpdCdzIHNtYWxsIG9yIGVhc3kgdG8gZml4OyBpZiBpdCdzIGJpZ2dlciBvciBtb3JlIHZpc2libGUsIEkgc3RpbGwgc3RydWdnbGUgdG8gb3duIGl0LiIsCiAgICAgICAgIldoZW4gSSBtYWtlIGEgbWlzdGFrZSwgZXZlbiBhIGJpZyBvciB2aXNpYmxlIG9uZSwgSSByZWZsZWN0IG9uIGl0IGFuZCB0aGluayBhYm91dCB3aGF0IEknZCBkbyBkaWZmZXJlbnRseS4iLAogICAgICAgICJXaGVuIEkgbWFrZSBhIG1pc3Rha2UsIEkgcmVjb2duaXplIGl0IGluIHRpbWUgYW5kIGNvcnJlY3QgaXQsIGV2ZW4gd2hlbiBpdCB0YWtlcyBleHRyYSBlZmZvcnQgSSBoYWRuJ3QgcGxhbm5lZCBmb3IuIl0sCiAgICAgIHJlZmxlY3Rpb25zOlsKICAgICAgICAiV2hlbiB5b3UgbWFrZSBhIG1pc3Rha2UgaW4gZnJvbnQgb2Ygc29tZW9uZSwgd2hhdCdzIHRoZSBzdG9yeSB5b3UgdGVsbCB5b3Vyc2VsZiBhYm91dCB3aGF0IGl0IG1lYW5zPyBXaGF0J3MgdGhlIG5hcnJhdGl2ZSB0aGF0IGtpY2tzIGluIHJpZ2h0IGFmdGVyIHRoYXQgZmVlbGluZyBoaXRzPyIsCiAgICAgICAgIklzIHRoZXJlIGEga2luZCBvZiBtaXN0YWtlIHlvdSBjYW4gYWNjZXB0IGVhc2lseSwgYW5kIG9uZSB5b3UgY2FuJ3Q/IiwKICAgICAgICAiV2hhdCdzIGEgbWlzdGFrZSB0aGF0IHRhdWdodCB5b3Ugc29tZXRoaW5nIHlvdSBzdGlsbCB1c2U/Il0gfSwKICAgIHsga2V5OiJzZWVraW5nX2hlbHAiLCBuYW1lOiJTZWVraW5nIEhlbHAgYW5kIE1lbnRvcnNoaXAiLAogICAgICBkZXNjOiJXaWxsaW5nbmVzcyB0byBzZWVrIG9yIHJlY2VpdmUgZXh0ZXJuYWwgc3VwcG9ydCBmb3IgeW91ciB0ZWFjaGluZyBwcmFjdGljZSwgc3VjaCBhcyBtZW50b3JzaGlwLCBjb2FjaGluZywgb3IgcGVlciBndWlkYW5jZS4iLAogICAgICBzdGF0ZW1lbnRzOlsKICAgICAgICAiSSBhdm9pZCBhc2tpbmcgZm9yIGhlbHAgYmVjYXVzZSBJIGRvbid0IHdhbnQgbXkgZmxhd3MgdG8gYmUgb2J2aW91cy4iLAogICAgICAgICJJIGtub3cgYXNraW5nIGZvciBoZWxwIGlzIHZhbGlkLCBidXQgSSBwcmVmZXIgdG8gbWFuYWdlIG9uIG15IG93biBzbyBJIGRvbid0IGluY29udmVuaWVuY2UgYW55b25lLiIsCiAgICAgICAgIkkgYXNrIGZvciBoZWxwIG9ubHkgd2hlbiBJJ3ZlIGV4aGF1c3RlZCBldmVyeXRoaW5nIEkgY291bGQgZG8gb24gbXkgb3duLiIsCiAgICAgICAgIkkgYXNrIGZvciBoZWxwIHdoZW4gSSBuZWVkIGl0LCB3aXRob3V0IHdhaXRpbmcgdW50aWwgSSdtIGF0IG15IGxpbWl0LiIsCiAgICAgICAgIkkgYXNrIGZvciBoZWxwIHdpdGggc29tZXRoaW5nIEknbSBzdXBwb3NlZCB0byBoYXZlIG1hc3RlcmVkLCBldmVuIHdoZW4gaXQgbWVhbnMgYWRtaXR0aW5nLCBvdXQgbG91ZCwgdGhhdCBJIGRvbid0IGhhdmUgaXQgZmlndXJlZCBvdXQuIl0sCiAgICAgIHJlZmxlY3Rpb25zOlsKICAgICAgICAiV2hhdCdzIHRoZSBzdG9yeSB5b3UgdGVsbCB5b3Vyc2VsZiBhYm91dCBuZWVkaW5nIHN1cHBvcnQgb3IgYXNraW5nIGZvciBoZWxwPyIsCiAgICAgICAgIldoYXQgbWFrZXMgeW91IGRlY2lkZSBhIHByb2JsZW0gaXMgeW91cnMgdG8gc29sdmUgdmVyc3VzIG9uZSB3b3J0aCBhc2tpbmcgYWJvdXQ/IElzIHRoYXQgZGVjaXNpb24gYWJvdXQgdGhlIHByb2JsZW0gaXRzZWxmLCBvciBhYm91dCB3aGF0IGFza2luZyB3b3VsZCBzYXkgYWJvdXQgeW91IGFzIGEgcGVyc29uPyIsCiAgICAgICAgIldobyBkbyB5b3UgZ28gdG8gZm9yIGRpZmZlcmVudCBraW5kcyBvZiBzdXBwb3J0LCBhbmQgaXMgdGhhdCBjaXJjbGUgd2lkZSBlbm91Z2g/Il0gfSwKICAgIHsga2V5OiJmZWVkYmFjayIsIG5hbWU6IkNyaXRpY2lzbSBhbmQgRmVlZGJhY2siLAogICAgICBkZXNjOiJSZXNwb25zZSB0byBjb25zdHJ1Y3RpdmUgZmVlZGJhY2sgb3IgY3JpdGljaXNtIG9uIHlvdXIgdGVhY2hpbmcgZnJvbSBkaWZmZXJlbnQgbWVtYmVycyBvZiB0aGUgZWR1Y2F0aW9uYWwgY29tbXVuaXR5LCBpbmNsdWRpbmcgY2xhc3Nyb29tIG9ic2VydmF0aW9ucyBhbmQgZm9ybWFsIGV2YWx1YXRpb25zLiIsCiAgICAgIHN0YXRlbWVudHM6WwogICAgICAgICJXaGVuIEknbSBjcml0aWNpemVkIGFib3V0IG15IHRlYWNoaW5nLCBJIHRha2UgaXQgcGVyc29uYWxseSBhbmQgZmVlbCBsaWtlIGl0J3MgYW4gYXR0YWNrLCBzbyBJIGRvbid0IGdpdmUgYW55IHdlaWdodCB0byB3aGF0J3Mgc2FpZC4iLAogICAgICAgICJJIGxpc3RlbiB0byBmZWVkYmFjayBhbmQgZXZlbiByZWNvZ25pemUgaXQgbWlnaHQgYmUgcmlnaHQsIGJ1dCBJIHJhcmVseSBjaGFuZ2UgaG93IEkgdGVhY2guIiwKICAgICAgICAiSSBtYWtlIHVzZSBvZiBmZWVkYmFjayB3aGVuIGl0J3MgZGVsaXZlcmVkIHdlbGw7IGlmIEkgZG9uJ3QgbGlrZSB0aGUgdG9uZSBvZiBhbiBvYnNlcnZhdGlvbiBvciBldmFsdWF0aW9uLCBJIGZvY3VzIG9uIGhvdyBpdCB3YXMgc2FpZCBpbnN0ZWFkIG9mIHdoYXQgd2FzIHNhaWQuIiwKICAgICAgICAiSSBtYWtlIHVzZSBvZiBmZWVkYmFjayBldmVuIHdoZW4gSSBkb24ndCBsaWtlIGhvdyBpdCB3YXMgZGVsaXZlcmVkLCBiZWNhdXNlIEkgc2VwYXJhdGUgdGhlIGRlbGl2ZXJ5IGZyb20gdGhlIGNvbnRlbnQuIiwKICAgICAgICAiSSBzZWVrIG91dCBmZWVkYmFjayBmcm9tIGNvbGxlYWd1ZXMsIHN0dWRlbnRzLCBvciBzdXBlcnZpc29ycywgZXZlbiB3aGVuIEkga25vdyB0aGV5IHdpbGwgcG9pbnQgb3V0IHRoaW5ncyBJIGRvbid0IHdhbnQgdG8gaGVhci4iXSwKICAgICAgcmVmbGVjdGlvbnM6WwogICAgICAgICJXaGF0IGRvZXMgY3JpdGljYWwgZmVlZGJhY2sgdXN1YWxseSBmZWVsIGxpa2UgdGhlIG1vbWVudCB5b3UgaGVhciBpdCwgcmVnYXJkbGVzcyBvZiB3aG8gaXQgY29tZXMgZnJvbT8iLAogICAgICAgICJXaGVuIHdhcyB0aGUgbGFzdCB0aW1lIHlvdSBhY3RpdmVseSBhc2tlZCBzb21lb25lIGZvciBmZWVkYmFjaz8iLAogICAgICAgICJXaGF0J3MgdGhlIGJlc3QgcGllY2Ugb2YgZmVlZGJhY2sgeW91J3ZlIHJlY2VpdmVkIHRoYXQgc2lnbmlmaWNhbnRseSBjaGFuZ2VkIHlvdXIgdGVhY2hpbmc/Il0gfSwKICAgIHsga2V5OiJleHBlcnRpc2UiLCBuYW1lOiJFeHBlcnRpc2UiLAogICAgICBkZXNjOiJQZXJjZXB0aW9uIG9mIHlvdXIgb3duIGxldmVsIG9mIHBlZGFnb2dpY2FsIGtub3dsZWRnZSBhbmQgc2tpbGwsIGluY2x1ZGluZyBvcGVubmVzcyB0byBrZWVwIGxlYXJuaW5nIG5ldyBtZXRob2RzLCBjb250ZW50LCBhbmQgdG9vbHMgdGhyb3VnaG91dCB5b3VyIGNhcmVlci4iLAogICAgICBzdGF0ZW1lbnRzOlsKICAgICAgICAiSSBiZWxpZXZlIEkgYWxyZWFkeSBoYXZlIGFsbCB0aGUga25vd2xlZGdlIEkgbmVlZCwgc28gSSBkb24ndCBmZWVsIHRoZSBuZWVkIHRvIGtlZXAgbGVhcm5pbmcuIiwKICAgICAgICAiSSByZWNvZ25pemUgSSBjb3VsZCBsZWFybiBtb3JlLCBidXQgaXQncyBoYXJkIGZvciBtZSB0byBhZG1pdCB0aGVyZSBhcmUgc3RpbGwgZ2FwcyBpbiBteSBzdWJqZWN0IGFyZWEuIiwKICAgICAgICAiSSB1cGRhdGUgbXkga25vd2xlZGdlIHdoZW4gc29tZXRoaW5nIGludGVyZXN0cyBtZSBvciBoYXMgYW4gaW1tZWRpYXRlIHVzZSBpbiBteSBjbGFzc3Jvb207IGlmIEkgZG9uJ3Qgc2VlIGEgZGlyZWN0IGJlbmVmaXQsIEkgZG9uJ3QgYm90aGVyLiIsCiAgICAgICAgIkkgbGVhcm4gdGhpbmdzIGFoZWFkIG9mIHRpbWUsIGJlZm9yZSBJIGFjdHVhbGx5IG5lZWQgdGhlbSBpbiBteSB0ZWFjaGluZy4iLAogICAgICAgICJJIGxlYXJuIGZyb20gYW55IHNvdXJjZSwgZXZlbiB3aGVuIGl0IGNoYWxsZW5nZXMgc29tZXRoaW5nIEknZCBhbHdheXMgdGFrZW4gZm9yIGdyYW50ZWQgYWJvdXQgaG93IHRvIHRlYWNoLiJdLAogICAgICByZWZsZWN0aW9uczpbCiAgICAgICAgIldoYXQncyBhIGRldmVsb3BtZW50IGluIHRlYWNoaW5nLCBhIG1ldGhvZCwgYSB0ZWNobm9sb2d5LCBvciBhIHBpZWNlIG9mIHJlc2VhcmNoLCB0aGF0IHlvdSd2ZSBkaXNtaXNzZWQgd2l0aG91dCByZWFsbHkgbG9va2luZyBpbnRvIGl0PyIsCiAgICAgICAgIldoZW4gd2FzIHRoZSBsYXN0IHRpbWUgeW91IHVwZGF0ZWQgaG93IHlvdSBkbyBzb21ldGhpbmcgaW4geW91ciB0ZWFjaGluZz8iLAogICAgICAgICJXaGF0J3Mgc29tZXRoaW5nIG5ldyB5b3UndmUgbGVhcm5lZCByZWNlbnRseSB0aGF0IHlvdSd2ZSBhbHJlYWR5IHVzZWQgd2l0aCBzdHVkZW50cz8gSGF2ZSB5b3Ugc2hhcmVkIG9yIHRhdWdodCBpdCB0byBhIGNvbGxlYWd1ZT8iXSB9LAogICAgeyBrZXk6IndlbGxiZWluZyIsIG5hbWU6IldlbGwtQmVpbmciLAogICAgICBkZXNjOiJUaGUgaW1wb3J0YW5jZSBnaXZlbiB0byB5b3VyIHBoeXNpY2FsLCBlbW90aW9uYWwsIGFuZCBtZW50YWwgaGVhbHRoIGFzIGEgZnVuZGFtZW50YWwgcGlsbGFyIGZvciBiYWxhbmNpbmcgdGhlIHJlc3BvbnNpYmlsaXRpZXMgb2YgdGVhY2hpbmcgYW5kIHN1c3RhaW5pbmcgeW91ciBwcmFjdGljZSBvdmVyIHRpbWUuIiwKICAgICAgc3RhdGVtZW50czpbCiAgICAgICAgIldoZW4gSSBkb24ndCBmZWVsIHdlbGwsIEkgYmVsaWV2ZSB0aGF0J3MganVzdCBob3cgaXQgaXMsIGFuZCB0aGVyZSdzIG5vdCBtdWNoIEkgY2FuIGRvIGFib3V0IGl0LiIsCiAgICAgICAgIkkga25vdyBJIGNvdWxkIGxlYXJuIHRvIGZlZWwgYmV0dGVyLCBidXQgSSByYXJlbHkgZG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gd2hhdCBJIGFsd2F5cyBkby4iLAogICAgICAgICJJIG9ubHkgcGF5IGF0dGVudGlvbiB0byBob3cgSSdtIGZlZWxpbmcgb25jZSB0aGluZ3MgYXJlIGFscmVhZHkgYmFkOyBhcyBsb25nIGFzIEkgY2FuIG1hbmFnZSwgSSBwdXQgaXQgb2ZmLiIsCiAgICAgICAgIkkgdGFrZSBjYXJlIG9mIGhvdyBJJ20gZmVlbGluZyByZWd1bGFybHksIHdpdGhvdXQgd2FpdGluZyB1bnRpbCBJJ20gYXQgbXkgbGltaXQuIiwKICAgICAgICAiSSBjaGFuZ2Ugd2hhdCdzIHdpdGhpbiBteSBjb250cm9sIGFuZCBsZXQgZ28gb2Ygd2hhdCBpc24ndCwgZXZlbiB3aGVuIGl0J3MgaGFyZCB0byBhZG1pdCB0aGUgZGlmZmVyZW5jZS4iXSwKICAgICAgcmVmbGVjdGlvbnM6WwogICAgICAgICJXaGF0IHRlbmRzIHRvIGNvbWUgYmVmb3JlIHlvdXIgb3duIHdlbGwtYmVpbmcgb24gYSByZWd1bGFyIHdlZWs/IiwKICAgICAgICAiV2hhdCdzIG9uZSB0aGluZyB5b3UgYWxyZWFkeSBrbm93IHdvdWxkIGhlbHAgeW91ciB3ZWxsLWJlaW5nIHRoYXQgeW91IGhhdmVuJ3QgZG9uZSBpbiB0aGUgbGFzdCBtb250aD8gV2hhdCdzIHN0b3BwaW5nIHlvdT8iLAogICAgICAgICJXaGF0J3Mgc29tZXRoaW5nIHlvdSBkbyBmb3IgeW91ciB3ZWxsLWJlaW5nIHRoYXQgeW91J2QgcmVjb21tZW5kIHRvIGEgc3RydWdnbGluZyBjb2xsZWFndWU/IEhvdyBhYm91dCBzaGFyaW5nIGl0LCBpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5PyJdIH0KICBdOwoKICB2YXIgVElFUl9MQUJFTCA9IFsiRml4ZWQtbGVhbmluZyIsICJNaXhlZCIsICJHcm93dGgtbGVhbmluZyJdOwogIHZhciBBR0VTID0gWyJVbmRlciAyNSIsICIyNSB0byAzNCIsICIzNSB0byA0NCIsICI0NSB0byA1NCIsICI1NSBvciBvbGRlciJdOwogIHZhciBBR0VfVkFMUyA9IFsiVW5kZXIgMjUiLCAiMjUtMzQiLCAiMzUtNDQiLCAiNDUtNTQiLCAiNTUrIl07CiAgdmFyIEdFTkRFUlMgPSBbIldvbWFuIiwgIk1hbiIsICJOb24tYmluYXJ5IiwgIlByZWZlciB0byBzZWxmLWRlc2NyaWJlIiwgIlByZWZlciBub3QgdG8gc2F5Il07CiAgdmFyIEdFTkRFUl9WQUxTID0gWyJXb21hbiIsICJNYW4iLCAiTm9uLWJpbmFyeSIsICJTZWxmLWRlc2NyaWJlIiwgIlByZWZlciBub3QgdG8gc2F5Il07CiAgdmFyIExFVkVMUyA9IFsiRWFybHkgeWVhcnMgLyBQcmVzY2hvb2wiLCAiUHJpbWFyeSIsICJTZWNvbmRhcnkiLCAiSGlnaGVyIGVkdWNhdGlvbiIsICJPdGhlciJdOwogIHZhciBMRVZFTF9WQUxTID0gWyJFYXJseSB5ZWFycyIsICJQcmltYXJ5IiwgIlNlY29uZGFyeSIsICJIaWdoZXIgZWR1Y2F0aW9uIiwgIk90aGVyIl07CgogIGZ1bmN0aW9uIHRpZXJPZihzKSB7IHJldHVybiBzIDw9IDIgPyAwIDogKHMgPT09IDMgPyAxIDogMik7IH0KICBmdW5jdGlvbiBlc2MocykgeyByZXR1cm4gU3RyaW5nKHMgPT0gbnVsbCA/ICIiIDogcykucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iik7IH0KCiAgLyogLS0tLS0tLS0tLSBzdGF0ZSAtLS0tLS0tLS0tICovCiAgdmFyIHN0YXRlID0gewogICAgc2NyZWVuOiAiaW50cm8iLCBpZHg6IDAsIGFuc3dlcnM6IHt9LAogICAgY3R4OiB7IGFnZTpudWxsLCBnZW5kZXI6bnVsbCwgbG9jYXRpb246IiIsIHllYXJzOiIiLCBsZXZlbDpudWxsLCBzdWJqZWN0OiIiLCBzZWxmRGVzYzoiIiB9LAogICAgcmVmbDogeyBmaXhlZDoiIiwgZ3Jvd3RoOiIiIH0sCiAgICBzaGFyZWQ6ZmFsc2UsIGRvd25sb2FkaW5nOmZhbHNlLCBzYXZlZDpudWxsCiAgfTsKICB2YXIgY29yZVNlbnQgPSBmYWxzZSwgZGV0YWlsc1NlbnQgPSBmYWxzZSwgc2lkID0gIiI7CiAgdmFyIHJvb3QgPSBudWxsOwoKICAvKiAtLS0tLS0tLS0tIHBlcnNpc3RlbmNlIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBwZXJzaXN0KCkgewogICAgdHJ5IHsgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JFX0tFWSwgSlNPTi5zdHJpbmdpZnkoeyBhbnN3ZXJzOiBzdGF0ZS5hbnN3ZXJzLCBpZHg6IHN0YXRlLmlkeCwgYXQ6IERhdGUubm93KCkgfSkpOyB9IGNhdGNoIChlKSB7fQogIH0KICBmdW5jdGlvbiBjbGVhclN0b3JlKCkgeyB0cnkgeyB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkVfS0VZKTsgfSBjYXRjaCAoZSkge30gfQogIGZ1bmN0aW9uIGxvYWRTYXZlZCgpIHsKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkVfS0VZKTsKICAgICAgaWYgKHJhdykgewogICAgICAgIHZhciBkID0gSlNPTi5wYXJzZShyYXcpOwogICAgICAgIGlmIChkICYmIGQuYW5zd2VycyAmJiBPYmplY3Qua2V5cyhkLmFuc3dlcnMpLmxlbmd0aCkgc3RhdGUuc2F2ZWQgPSBkOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgLyogLS0tLS0tLS0tLSBHb29nbGUgU2hlZXQgbG9nZ2luZyAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gcG9zdChib2R5LCBrZWVwYWxpdmUpIHsKICAgIHRyeSB7CiAgICAgIGZldGNoKFNIRUVUX0VORFBPSU5UX1VSTCwgeyBtZXRob2Q6IlBPU1QiLCBtb2RlOiJuby1jb3JzIiwga2VlcGFsaXZlOiAhIWtlZXBhbGl2ZSwKICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04IiB9LCBib2R5OiBib2R5IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQogIGZ1bmN0aW9uIHNlbmRDb3JlKCkgewogICAgaWYgKGNvcmVTZW50IHx8ICFTSEVFVF9FTkRQT0lOVF9VUkwpIHJldHVybjsKICAgIGNvcmVTZW50ID0gdHJ1ZTsKICAgIHNpZCA9IERhdGUubm93KCkudG9TdHJpbmcoMzYpICsgIi0iICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOSk7CiAgICB2YXIgYyA9IHN0YXRlLmN0eCwgYSA9IHN0YXRlLmFuc3dlcnM7CiAgICB2YXIgZyA9IChjLmdlbmRlciA9PT0gIlNlbGYtZGVzY3JpYmUiICYmIGMuc2VsZkRlc2MpID8gYy5zZWxmRGVzYyA6IGMuZ2VuZGVyOwogICAgdmFyIHAgPSB7IHNpZDogc2lkLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgeWVhcnM6IGMueWVhcnMsIGxldmVsOiBjLmxldmVsLAogICAgICBnZW5kZXI6IGcsIGxvY2F0aW9uOiBjLmxvY2F0aW9uLCBhZ2U6IGMuYWdlLCBzdWJqZWN0OiBjLnN1YmplY3QsCiAgICAgIHJlZmxlY3Rpb25fZml4ZWQ6IHN0YXRlLnJlZmwuZml4ZWQsIHJlZmxlY3Rpb25fZ3Jvd3RoOiBzdGF0ZS5yZWZsLmdyb3d0aCB9OwogICAgQ0FUUy5mb3JFYWNoKGZ1bmN0aW9uIChjYXQsIGkpIHsgcFsicyIgKyAoaSArIDEpXSA9IGFbY2F0LmtleV07IH0pOwogICAgcG9zdChKU09OLnN0cmluZ2lmeShwKSwgZmFsc2UpOwogIH0KICBmdW5jdGlvbiBzZW5kRGV0YWlscyhrZWVwYWxpdmUpIHsKICAgIGlmIChkZXRhaWxzU2VudCB8fCAhY29yZVNlbnQgfHwgIXNpZCkgcmV0dXJuOwogICAgdmFyIGMgPSBzdGF0ZS5jdHgsIHIgPSBzdGF0ZS5yZWZsOwogICAgdmFyIGcgPSAoYy5nZW5kZXIgPT09ICJTZWxmLWRlc2NyaWJlIiAmJiBjLnNlbGZEZXNjKSA/IGMuc2VsZkRlc2MgOiBjLmdlbmRlcjsKICAgIGlmICghKGMuYWdlIHx8IGcgfHwgYy5sb2NhdGlvbiB8fCBjLnllYXJzIHx8IGMubGV2ZWwgfHwgYy5zdWJqZWN0IHx8IHIuZml4ZWQgfHwgci5ncm93dGgpKSByZXR1cm47CiAgICBkZXRhaWxzU2VudCA9IHRydWU7CiAgICBwb3N0KEpTT04uc3RyaW5naWZ5KHsgdXBkYXRlOnRydWUsIHNpZDpzaWQsIGFnZTpjLmFnZSwgZ2VuZGVyOmcsIGxvY2F0aW9uOmMubG9jYXRpb24sCiAgICAgIHllYXJzOmMueWVhcnMsIGxldmVsOmMubGV2ZWwsIHN1YmplY3Q6Yy5zdWJqZWN0LCByZWZsZWN0aW9uX2ZpeGVkOnIuZml4ZWQsIHJlZmxlY3Rpb25fZ3Jvd3RoOnIuZ3Jvd3RoIH0pLCBrZWVwYWxpdmUpOwogIH0KCiAgLyogLS0tLS0tLS0tLSBsb2NhbCBhY3Rpb25zOiBubyBnbG9iYWwgd2luZG93IG9iamVjdCAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gYmVnaW5Db21wYXNzKCkgeyBjbGVhclN0b3JlKCk7IHN0YXRlLnNhdmVkID0gbnVsbDsgc3RhdGUuYW5zd2VycyA9IHt9OyBzdGF0ZS5pZHggPSAwOyBnbygiYXNzZXNzIik7IH0KICBmdW5jdGlvbiByZXN1bWVDb21wYXNzKCkgewogICAgdmFyIHMgPSBzdGF0ZS5zYXZlZCB8fCB7fTsKICAgIHN0YXRlLmFuc3dlcnMgPSBzLmFuc3dlcnMgfHwge307IHN0YXRlLmlkeCA9IHMuaWR4IHx8IDA7CiAgICBnbygiYXNzZXNzIik7CiAgfQogIGZ1bmN0aW9uIHBpY2tTY29yZShzY29yZSkgewogICAgdmFyIGNhdCA9IENBVFNbc3RhdGUuaWR4XTsKICAgIHN0YXRlLmFuc3dlcnNbY2F0LmtleV0gPSBzY29yZTsKICAgIHBlcnNpc3QoKTsgcmVuZGVyKCk7CiAgfQogIGZ1bmN0aW9uIHN0ZXBDb21wYXNzKGQpIHsKICAgIHZhciBuID0gc3RhdGUuaWR4ICsgZDsKICAgIGlmIChuIDwgMCkgeyBnbygiaW50cm8iKTsgcmV0dXJuOyB9CiAgICBpZiAobiA+PSBDQVRTLmxlbmd0aCkgeyBmaW5pc2hDb21wYXNzKCk7IHJldHVybjsgfQogICAgc3RhdGUuaWR4ID0gbjsgcGVyc2lzdCgpOyBnbyhzdGF0ZS5zY3JlZW4sIHRydWUpOwogIH0KICBmdW5jdGlvbiBqdW1wQ29tcGFzcyhpKSB7IHN0YXRlLmlkeCA9IGk7IGdvKHN0YXRlLnNjcmVlbiwgdHJ1ZSk7IH0KICBmdW5jdGlvbiBmaW5pc2hDb21wYXNzKCkgewogICAgdmFyIG1pc3NpbmcgPSAtMTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQ0FUUy5sZW5ndGg7IGkrKykgeyBpZiAoIXN0YXRlLmFuc3dlcnNbQ0FUU1tpXS5rZXldKSB7IG1pc3NpbmcgPSBpOyBicmVhazsgfSB9CiAgICBpZiAobWlzc2luZyA+PSAwKSB7IHN0YXRlLmlkeCA9IG1pc3Npbmc7IGdvKCJhc3Nlc3MiLCB0cnVlKTsgcmV0dXJuOyB9CiAgICBjbGVhclN0b3JlKCk7IGdvKCJkZXRhaWxzIik7CiAgfQogIGZ1bmN0aW9uIGJhY2tUb0Fzc2VzcygpIHsgc3RhdGUuaWR4ID0gQ0FUUy5sZW5ndGggLSAxOyBnbygiYXNzZXNzIik7IH0KICBmdW5jdGlvbiBzZXRDb250ZXh0KGssIHYpIHsgc3RhdGUuY3R4W2tdID0gdjsgcmVuZGVyKCk7IH0KICBmdW5jdGlvbiBzZXRSZWZsZWN0aW9uKGssIHYpIHsgc3RhdGUucmVmbFtrXSA9IHY7IHJlbmRlckNvdW50ZXJzKCk7IH0KICBmdW5jdGlvbiBzdWJtaXREZXRhaWxzKCkgeyBzZW5kQ29yZSgpOyBzdGF0ZS5zaGFyZWQgPSB0cnVlOyBnbygicmVzdWx0cyIpOyB9CiAgZnVuY3Rpb24gcmVzdGFydENvbXBhc3MoKSB7CiAgICBjb3JlU2VudCA9IGZhbHNlOyBkZXRhaWxzU2VudCA9IGZhbHNlOyBzaWQgPSAiIjsKICAgIGNsZWFyU3RvcmUoKTsKICAgIHN0YXRlID0geyBzY3JlZW46ImludHJvIiwgaWR4OjAsIGFuc3dlcnM6e30sIHNhdmVkOm51bGwsIHNoYXJlZDpmYWxzZSwKICAgICAgY3R4OnsgYWdlOm51bGwsIGdlbmRlcjpudWxsLCBsb2NhdGlvbjoiIiwgeWVhcnM6IiIsIGxldmVsOm51bGwsIHN1YmplY3Q6IiIsIHNlbGZEZXNjOiIiIH0sCiAgICAgIHJlZmw6eyBmaXhlZDoiIiwgZ3Jvd3RoOiIiIH0gfTsKICAgIGdvKCJpbnRybyIpOwogIH0KICBmdW5jdGlvbiBkb3dubG9hZFJlc3VsdHMoKSB7CiAgICAvKiBBdm9pZCBkeW5hbWljIHNjcmlwdCBpbmplY3Rpb24gb24gV29yZFByZXNzIGZyb250LWVuZC4gKi8KICAgIHdpbmRvdy5wcmludCgpOwogIH0KCgogIC8qIC0tLS0tLS0tLS0gV29yZFByZXNzLXNhZmUgZGVsZWdhdGVkIGV2ZW50cyAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gYXR0YWNoUm9vdEV2ZW50cygpIHsKICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICB2YXIgZWw7CgogICAgICBlbCA9IGUudGFyZ2V0LmNsb3Nlc3QoIltkYXRhLXRjLXNjb3JlXSIpOwogICAgICBpZiAoZWwgJiYgcm9vdC5jb250YWlucyhlbCkpIHsKICAgICAgICBwaWNrU2NvcmUocGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXRjLXNjb3JlIiksIDEwKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBlbCA9IGUudGFyZ2V0LmNsb3Nlc3QoIltkYXRhLXRjLWp1bXBdIik7CiAgICAgIGlmIChlbCAmJiByb290LmNvbnRhaW5zKGVsKSkgewogICAgICAgIGp1bXBDb21wYXNzKHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZSgiZGF0YS10Yy1qdW1wIiksIDEwKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBlbCA9IGUudGFyZ2V0LmNsb3Nlc3QoIltkYXRhLXRjLWN0eC1rZXldIik7CiAgICAgIGlmIChlbCAmJiByb290LmNvbnRhaW5zKGVsKSkgewogICAgICAgIHNldENvbnRleHQoZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXRjLWN0eC1rZXkiKSwgZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXRjLWN0eC12YWx1ZSIpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGVsID0gZS50YXJnZXQuY2xvc2VzdCgiW2RhdGEtdGMtYWN0aW9uXSIpOwogICAgICBpZiAoIWVsIHx8ICFyb290LmNvbnRhaW5zKGVsKSkgcmV0dXJuOwoKICAgICAgdmFyIGFjdGlvbiA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS10Yy1hY3Rpb24iKTsKICAgICAgaWYgKGFjdGlvbiA9PT0gImJlZ2luIikgYmVnaW5Db21wYXNzKCk7CiAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gInJlc3VtZSIpIHJlc3VtZUNvbXBhc3MoKTsKICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAicHJldmlvdXMiKSBzdGVwQ29tcGFzcygtMSk7CiAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gIm5leHQiICYmICFlbC5kaXNhYmxlZCkgc3RlcENvbXBhc3MoMSk7CiAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gImJhY2tUb0Fzc2VzcyIpIGJhY2tUb0Fzc2VzcygpOwogICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICJzdWJtaXREZXRhaWxzIikgc3VibWl0RGV0YWlscygpOwogICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICJkb3dubG9hZCIpIGRvd25sb2FkUmVzdWx0cygpOwogICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICJyZXN0YXJ0IikgcmVzdGFydENvbXBhc3MoKTsKICAgIH0pOwoKICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHZhciBlbCA9IGUudGFyZ2V0LmNsb3Nlc3QoIltkYXRhLXRjLXNjb3JlXSIpOwogICAgICBpZiAoIWVsIHx8ICFyb290LmNvbnRhaW5zKGVsKSkgcmV0dXJuOwogICAgICBpZiAoZS5rZXkgPT09ICIgIiB8fCBlLmtleSA9PT0gIkVudGVyIikgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBwaWNrU2NvcmUocGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXRjLXNjb3JlIiksIDEwKSk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyIGtleSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtdGMtaW5wdXQiKTsKICAgICAgaWYgKGtleSkgc2V0Q29udGV4dChrZXksIGUudGFyZ2V0LnZhbHVlLnRyaW0oKSk7CiAgICB9KTsKCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyIGtleSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtdGMtcmVmbCIpOwogICAgICBpZiAoa2V5KSBzZXRSZWZsZWN0aW9uKGtleSwgZS50YXJnZXQudmFsdWUpOwogICAgfSk7CgogIH0KCiAgZnVuY3Rpb24gZ28oc2NyZWVuLCBza2lwU2Nyb2xsKSB7CiAgICBzdGF0ZS5zY3JlZW4gPSBzY3JlZW47IHJlbmRlcigpOwogICAgaWYgKCFza2lwU2Nyb2xsKSB7IHRyeSB7IHJvb3Quc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogInNtb290aCIsIGJsb2NrOiAic3RhcnQiIH0pOyB9IGNhdGNoIChlKSB7fSB9CiAgfQoKCiAgLyogLS0tLS0tLS0tLSBrZXlib2FyZCBuYXYgb24gYXNzZXNzIHNjcmVlbiAtLS0tLS0tLS0tICovCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICBpZiAoc3RhdGUuc2NyZWVuICE9PSAiYXNzZXNzIikgcmV0dXJuOwogICAgdmFyIHQgPSBlLnRhcmdldCAmJiBlLnRhcmdldC50YWdOYW1lOwogICAgaWYgKHQgPT09ICJJTlBVVCIgfHwgdCA9PT0gIlRFWFRBUkVBIikgcmV0dXJuOwogICAgaWYgKGUua2V5ID49ICIxIiAmJiBlLmtleSA8PSAiNSIpIHsgcGlja1Njb3JlKHBhcnNlSW50KGUua2V5LCAxMCkpOyBlLnByZXZlbnREZWZhdWx0KCk7IH0KICAgIGVsc2UgaWYgKGUua2V5ID09PSAiQXJyb3dSaWdodCIgfHwgZS5rZXkgPT09ICJFbnRlciIpIHsgaWYgKHN0YXRlLmFuc3dlcnNbQ0FUU1tzdGF0ZS5pZHhdLmtleV0pIHN0ZXBDb21wYXNzKDEpOyB9CiAgICBlbHNlIGlmIChlLmtleSA9PT0gIkFycm93TGVmdCIpIHsgc3RlcENvbXBhc3MoLTEpOyB9CiAgfSk7CgogIC8qIC0tLS0tLS0tLS0gcm9zZSAvIGNvbXBhc3MgaWNvbiAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gY29tcGFzc1NWRyhzaXplLCBpZFN1ZmZpeCkgewogICAgdmFyIGdpZCA9ICJ0Y1JpbmciICsgaWRTdWZmaXg7CiAgICByZXR1cm4gJzxzdmcgdmlld0JveD0iMCAwIDEyMCAxMjAiIHdpZHRoPSInICsgc2l6ZSArICciIGhlaWdodD0iJyArIHNpemUgKyAnIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JyArCiAgICAgICc8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9IicgKyBnaWQgKyAnIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMDA5MEM3Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRUIwMDhCIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+JyArCiAgICAgICc8Y2lyY2xlIGN4PSI2MCIgY3k9IjYwIiByPSI1MiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJ1cmwoIycgKyBnaWQgKyAnKSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4nICsKICAgICAgJzxjaXJjbGUgY3g9IjYwIiBjeT0iNjAiIHI9IjQwIiBmaWxsPSJub25lIiBzdHJva2U9IiNjN2M3ZDYiIHN0cm9rZS13aWR0aD0iMC43NSIgb3BhY2l0eT0iMC43Ii8+JyArCiAgICAgICc8ZyBzdHJva2U9IiNkNGQ0ZGMiIHN0cm9rZS13aWR0aD0iMC43NSIgb3BhY2l0eT0iMC44Ij48bGluZSB4MT0iNjAiIHkxPSIxMCIgeDI9IjYwIiB5Mj0iMTEwIi8+PGxpbmUgeDE9IjEwIiB5MT0iNjAiIHgyPSIxMTAiIHkyPSI2MCIvPjxsaW5lIHgxPSIyNSIgeTE9IjI1IiB4Mj0iOTUiIHkyPSI5NSIvPjxsaW5lIHgxPSI5NSIgeTE9IjI1IiB4Mj0iMjUiIHkyPSI5NSIvPjwvZz4nICsKICAgICAgJzxwb2x5Z29uIHBvaW50cz0iNjAsMTYgNjcsNjAgNjAsNjYgNTMsNjAiIGZpbGw9IiNFQjAwOEIiLz48cG9seWdvbiBwb2ludHM9IjYwLDEwNCA2Nyw2MCA2MCw1NCA1Myw2MCIgZmlsbD0iIzAwOTBDNyIvPicgKwogICAgICAnPHBvbHlnb24gcG9pbnRzPSIxNiw2MCA2MCw1MyA2Niw2MCA2MCw2NyIgZmlsbD0iIzdjZDRmYiIvPjxwb2x5Z29uIHBvaW50cz0iMTA0LDYwIDYwLDUzIDU0LDYwIDYwLDY3IiBmaWxsPSIjZmY4YWMyIi8+JyArCiAgICAgICc8Y2lyY2xlIGN4PSI2MCIgY3k9IjYwIiByPSI0IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMGUwZTYiIHN0cm9rZS13aWR0aD0iMC41Ii8+PC9zdmc+JzsKICB9CgogIC8qIC0tLS0tLS0tLS0gcmVuZGVyIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICBpZiAoc3RhdGUuc2NyZWVuID09PSAiaW50cm8iKSByb290LmlubmVySFRNTCA9IHJlbmRlckludHJvKCk7CiAgICBlbHNlIGlmIChzdGF0ZS5zY3JlZW4gPT09ICJhc3Nlc3MiKSByb290LmlubmVySFRNTCA9IHJlbmRlckFzc2VzcygpOwogICAgZWxzZSBpZiAoc3RhdGUuc2NyZWVuID09PSAiZGV0YWlscyIpIHJvb3QuaW5uZXJIVE1MID0gcmVuZGVyRGV0YWlscygpOwogICAgZWxzZSBpZiAoc3RhdGUuc2NyZWVuID09PSAicmVzdWx0cyIpIHsgcm9vdC5pbm5lckhUTUwgPSByZW5kZXJSZXN1bHRzKCk7IGRyYXdSYWRhcigpOyB9CiAgfQoKICBmdW5jdGlvbiByZW5kZXJJbnRybygpIHsKICAgIHZhciBzYXZlZEJsb2NrID0gIiI7CiAgICBpZiAoc3RhdGUuc2F2ZWQpIHsKICAgICAgc2F2ZWRCbG9jayA9CiAgICAgICAgJzxkaXYgc3R5bGU9Im1heC13aWR0aDo2NDBweDttYXJnaW46MjJweCBhdXRvIDA7ZGlzcGxheTpmbGV4O2dhcDoxNHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtmbGV4LXdyYXA6d3JhcDtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsMik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1wYW5lbGJvcmRlcik7Ym9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6MTZweCAxOHB4OyI+JyArCiAgICAgICAgJzxzcGFuIHN0eWxlPSJmb250LXNpemU6MTRweDtjb2xvcjp2YXIoLS10ZXh0KTsiPllvdSBoYXZlICcgKyBPYmplY3Qua2V5cyhzdGF0ZS5zYXZlZC5hbnN3ZXJzIHx8IHt9KS5sZW5ndGggKyAnIG9mIDEwIGFuc3dlcnMgc2F2ZWQgb24gdGhpcyBkZXZpY2UuPC9zcGFuPicgKwogICAgICAgICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InRjLWJ0bi1naG9zdCIgc3R5bGU9ImJvcmRlci1jb2xvcjp2YXIoLS1tYWcpO2NvbG9yOnZhcigtLW1hZyk7IiBkYXRhLXRjLWFjdGlvbj0icmVzdW1lIj5Db250aW51ZSB3aGVyZSBJIGxlZnQgb2ZmPC9idXR0b24+PC9kaXY+JzsKICAgIH0KICAgIHJldHVybiAnPGRpdiBjbGFzcz0idGMtYW5pbSB0Yy1yZXN1bHRzLXNjcmVlbiI+JyArCiAgICAgICc8ZGl2IGNsYXNzPSJ0Yy1yZXN1bHRzLWhlcm8iIHN0eWxlPSJiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxMzVkZWcsIzAwOTBDNywjRUIwMDhCKTtib3JkZXItcmFkaXVzOjE2cHg7cGFkZGluZzo2cHg7Ij4nICsKICAgICAgJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2ZiZmJmYztib3JkZXItcmFkaXVzOjExcHg7cGFkZGluZzo0MHB4IDI4cHg7dGV4dC1hbGlnbjpjZW50ZXI7Ij4nICsKICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbi1ib3R0b206MTZweDsiPicgKyBjb21wYXNzU1ZHKDk2LCAiSW50cm8iKSArICc8L2Rpdj4nICsKICAgICAgJzxoMSBzdHlsZT0iY29sb3I6dmFyKC0taW5rKTtmb250LXNpemU6MzJweDtsaW5lLWhlaWdodDoxLjEyO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW46NnB4IDAgOXB4OyI+VGhlIE1pbmRzZXQgVGVhY2hpbmcgQ29tcGFzczwvaDE+JyArCiAgICAgICc8cCBzdHlsZT0iY29sb3I6dmFyKC0tc29mdCk7Zm9udC1zaXplOjE0cHg7bWF4LXdpZHRoOjUyMHB4O21hcmdpbjowIGF1dG87Ij5BIHJlZmxlY3Rpb24gdG9vbCBmb3IgZWR1Y2F0b3JzIHRvIGV4cGxvcmUgdGhlaXIgb3duIG1pbmRzZXQuPC9wPicgKwogICAgICAnPC9kaXY+PC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjM0cHggMjRweCA2cHg7Ij4nICsKICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTZweDtjb2xvcjp2YXIoLS10ZXh0KTtsaW5lLWhlaWdodDoxLjY1O21heC13aWR0aDo2NDBweDttYXJnaW46MCBhdXRvOyI+VGhpcyB0b29sIHdhcyBjcmVhdGVkIHNvIHlvdSBjYW4gcGF1c2UgYW5kIHRoaW5rIGhvbmVzdGx5IGFib3V0IGhvdyB5b3Ugc2VlIHlvdXJzZWxmIGFzIGFuIGVkdWNhdG9yLiBJdFwncyBncm91bmRlZCBpbiBwc3ljaG9sb2dpc3QgQ2Fyb2wgRHdlY2tcJ3MgcmVzZWFyY2g6IGEgZml4ZWQgbWluZHNldCBzZWVzIGFiaWxpdHkgYXMgc29tZXRoaW5nIHNldCBpbiBwbGFjZSwgd2hpbGUgYSBncm93dGggbWluZHNldCBzZWVzIGl0IGFzIHNvbWV0aGluZyB0aGF0IGtlZXBzIGRldmVsb3Bpbmcgd2l0aCBlZmZvcnQgYW5kIHRpbWUuIEFjcm9zcyB0ZW4gZXZlcnlkYXkgc2l0dWF0aW9ucyBkZXNjcmliZWQgaGVyZSwgbGlrZSBtYWtpbmcgYSBtaXN0YWtlLCByZWNlaXZpbmcgZmVlZGJhY2ssIG9yIGZhY2luZyBhIGRpZmZpY3VsdCBjbGFzcywgeW91XCdsbCBzZWUgd2hlcmUgeW91IGN1cnJlbnRseSBzdGFuZCBiZXR3ZWVuIHRoZSB0d28uIFRoaXMgaXNuXCd0IGEgdGVzdCwganVzdCBhIHNwYWNlIGZvciByZWZsZWN0aW9uLiBXZSBhbGwgY2FycnkgYm90aCBtaW5kc2V0cywgYW5kIHRoaXMgaXMgYSBjaGFuY2UgdG8gbm90aWNlIHdoZXJlIGVhY2ggb25lIHNob3dzIHVwIGZvciB5b3UuPC9wPicgKwogICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxMy41cHg7Y29sb3I6dmFyKC0tdGV4dCk7bGluZS1oZWlnaHQ6MS41NTttYXgtd2lkdGg6NjQwcHg7bWFyZ2luOjE2cHggYXV0byAwO3BhZGRpbmctdG9wOjE0cHg7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtmb250LXN0eWxlOml0YWxpYzsiPlRoaXMgdG9vbCBpcyBhbHNvIHBhcnQgb2Ygb25nb2luZyByZXNlYXJjaCBvbiB0ZWFjaGVyIG1pbmRzZXRzLCBhbmQgeW91ciBhbm9ueW1vdXMgYW5zd2VycyBjb250cmlidXRlIHRvIG91ciBrbm93bGVkZ2UgYmFzZS48L3A+JyArCiAgICAgICc8L2Rpdj4nICsgc2F2ZWRCbG9jayArCiAgICAgICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjE0cHggMCAzNHB4OyI+JyArCiAgICAgICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InRjLWJ0bi1wcmltYXJ5IiBkYXRhLXRjLWFjdGlvbj0iYmVnaW4iPkJlZ2luIHRoZSBjb21wYXNzPC9idXR0b24+JyArCiAgICAgICc8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tdGV4dCk7bWFyZ2luOjEycHggMCAwOyI+T25lIHNpdHVhdGlvbiBhdCBhIHRpbWUuIFlvdSBjYW4gZ28gYmFjayBhbmQgY2hhbmdlIGFueSBhbnN3ZXIuPC9wPicgKwogICAgICAnPC9kaXY+PC9kaXY+JzsKICB9CgogIGZ1bmN0aW9uIHJlbmRlckFzc2VzcygpIHsKICAgIHZhciBjYXQgPSBDQVRTW3N0YXRlLmlkeF0sIGNob3NlbiA9IHN0YXRlLmFuc3dlcnNbY2F0LmtleV07CiAgICB2YXIgc2VncyA9IENBVFMubWFwKGZ1bmN0aW9uIChjLCBpKSB7CiAgICAgIHZhciBoZXJlID0gaSA9PT0gc3RhdGUuaWR4LCBkb25lID0gISFzdGF0ZS5hbnN3ZXJzW2Mua2V5XTsKICAgICAgdmFyIGJnID0gaGVyZSA/ICJ2YXIoLS1pbmspIiA6IChkb25lID8gInZhcigtLW1hZykiIDogInZhcigtLWJvcmRlcikiKTsKICAgICAgcmV0dXJuICc8YnV0dG9uIHRpdGxlPSInICsgZXNjKChpICsgMSkgKyAnLiAnICsgYy5uYW1lKSArICciIGFyaWEtbGFiZWw9IicgKyBlc2MoKGkgKyAxKSArICcuICcgKyBjLm5hbWUpICsgJyIgJyArCiAgICAgICAgKGhlcmUgPyAnYXJpYS1jdXJyZW50PSJzdGVwIicgOiAnJykgKwogICAgICAgICcgdHlwZT0iYnV0dG9uIiBkYXRhLXRjLWp1bXA9IicgKyBpICsgJyIgc3R5bGU9ImZsZXg6MTtoZWlnaHQ6NXB4O2JvcmRlci1yYWRpdXM6M3B4O2JvcmRlcjpub25lO3BhZGRpbmc6MDtiYWNrZ3JvdW5kOicgKyBiZyArICc7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4ycyBlYXNlOyI+PC9idXR0b24+JzsKICAgIH0pLmpvaW4oIiIpOwogICAgdmFyIG9wdGlvbnMgPSBjYXQuc3RhdGVtZW50cy5tYXAoZnVuY3Rpb24gKHRleHQsIGkpIHsKICAgICAgdmFyIG9uID0gY2hvc2VuID09PSBpICsgMTsKICAgICAgdmFyIGNvbCA9IFJBTVBbaV07CiAgICAgIHJldHVybiAnPGRpdiByb2xlPSJyYWRpbyIgdGFiaW5kZXg9IicgKyAoKG9uIHx8ICghY2hvc2VuICYmIGkgPT09IDApKSA/ICIwIiA6ICItMSIpICsgJyIgYXJpYS1jaGVja2VkPSInICsgb24gKyAnIiAnICsKICAgICAgICAnZGF0YS10Yy1zY29yZT0iJyArIChpICsgMSkgKyAnIiAnICsKICAgICAgICAnc3R5bGU9ImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2dhcDoxNHB4O3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpsZWZ0O2N1cnNvcjpwb2ludGVyO2JvcmRlcjoxLjVweCBzb2xpZCAnICsgKG9uID8gInZhcigtLW1hZykiIDogInZhcigtLWJvcmRlcikiKSArICc7YmFja2dyb3VuZDonICsgKG9uID8gInZhcigtLXBhbmVsMikiIDogIiNmZmYiKSArICc7Ym9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6MTRweCAxNnB4O21pbi1oZWlnaHQ6NDRweDsnICsgKG9uID8gImJveC1zaGFkb3c6MCAwIDAgNHB4IHJnYmEoMjM1LDAsMTM5LDAuMTYpOyIgOiAiIikgKyAnIj4nICsKICAgICAgICAnPHNwYW4gYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJmbGV4LXNocmluazowO3dpZHRoOjM0cHg7aGVpZ2h0OjM0cHg7Ym9yZGVyLXJhZGl1czo1MCU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2ZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjcwMDtib3JkZXI6Mi41cHggc29saWQgJyArIGNvbCArICc7YmFja2dyb3VuZDonICsgKG9uID8gY29sIDogIiNmZmYiKSArICc7Y29sb3I6JyArIChvbiA/ICIjZmZmIiA6IGNvbCkgKyAnOyI+JyArIChpICsgMSkgKyAnPC9zcGFuPicgKwogICAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjE0LjVweDtsaW5lLWhlaWdodDoxLjU7Y29sb3I6dmFyKC0tdGV4dCk7Zm9udC13ZWlnaHQ6JyArIChvbiA/ICI3MDAiIDogIjQwMCIpICsgJzsiPicgKyBlc2ModGV4dCkgKyAnPC9zcGFuPjwvZGl2Pic7CiAgICB9KS5qb2luKCIiKTsKICAgIHZhciBsYXN0ID0gc3RhdGUuaWR4ID09PSBDQVRTLmxlbmd0aCAtIDE7CiAgICB2YXIgY2FuTmV4dCA9ICEhY2hvc2VuOwogICAgdmFyIGludHJvID0gc3RhdGUuaWR4ID09PSAwID8KICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206MjZweDsiPjxoMiBjbGFzcz0idGMtZ3JhZC10ZXh0IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjIycHg7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjEuMTI7bWFyZ2luOjAgMCAxNnB4OyI+WW91ciBtaW5kc2V0IGluIHRlbiBzaXR1YXRpb25zPC9oMj4nICsKICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTVweDtjb2xvcjp2YXIoLS10ZXh0KTtsaW5lLWhlaWdodDoxLjY7bWFyZ2luOjA7Ij5CZWxvdyBhcmUgdGVuIGV2ZXJ5ZGF5IHNpdHVhdGlvbnMuIEZvciBlYWNoIG9uZSwgeW91XCdsbCBmaW5kIGEgZ2VuZXJhbCBkZXNjcmlwdGlvbiwgZm9sbG93ZWQgYnkgZml2ZSBzdGF0ZW1lbnRzIGFycmFuZ2VkIGFsb25nIGEgcGF0aCwgZnJvbSBtb3JlIGZpeGVkIHRvIG1vcmUgZ3Jvd3RoLiBSZWFkIHRocm91Z2ggYWxsIGZpdmUgYmVmb3JlIGNob29zaW5nLCBhbmQgcGljayB0aGUgb25lIHRoYXQgZmVlbHMgbW9zdCB0cnVlIHRvIGhvdyB5b3UgYWN0dWFsbHkgcmVzcG9uZCB0b2RheSwgbm90IGhvdyB5b3Ugd2lzaCB5b3UgcmVzcG9uZGVkLjwvcD48L2Rpdj4nIDogIiI7CiAgICByZXR1cm4gJzxkaXYgY2xhc3M9InRjLWFuaW0iPicgKwogICAgICAnPGRpdiBzdHlsZT0icG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MjA7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuOTUpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDZweCk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKTtwYWRkaW5nOjExcHggOHB4OyI+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87Ij4nICsKICAgICAgY29tcGFzc1NWRygyNiwgIk1pbmkiKSArCiAgICAgICc8c3BhbiBjbGFzcz0idGMtZ3JhZC10ZXh0IiBzdHlsZT0iZm9udC1zaXplOjEyLjVweDtmb250LXdlaWdodDo3MDA7bGV0dGVyLXNwYWNpbmc6LjAzZW07ZmxleC1zaHJpbms6MDsiPlNpdHVhdGlvbiAnICsgKHN0YXRlLmlkeCArIDEpICsgJyBvZiAxMDwvc3Bhbj4nICsKICAgICAgJzxkaXYgcm9sZT0iZ3JvdXAiIGFyaWEtbGFiZWw9IlNpdHVhdGlvbnMiIHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjRweDtmbGV4OjE7bWF4LXdpZHRoOjQ0MHB4OyI+JyArIHNlZ3MgKyAnPC9kaXY+PC9kaXY+PC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjI2cHggMjBweCAwO21heC13aWR0aDo3MjBweDttYXJnaW46MCBhdXRvOyI+JyArIGludHJvICsKICAgICAgJzxkaXYgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjE2cHg7cGFkZGluZzozMHB4IDI2cHggMjZweDtiYWNrZ3JvdW5kOiNmZmY7Ij4nICsKICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7bWFyZ2luLWJvdHRvbTo3cHg7Ij4nICsKICAgICAgJzxzcGFuIHN0eWxlPSJmb250LXNpemU6MTIuNXB4O2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMDZlbTtjb2xvcjp2YXIoLS1tYWcpO2JvcmRlci1yYWRpdXM6OTk5cHg7cGFkZGluZzozcHggMTJweDtmbGV4LXNocmluazowO2JvcmRlcjoycHggc29saWQgdHJhbnNwYXJlbnQ7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoI2ZmZiwjZmZmKSxsaW5lYXItZ3JhZGllbnQoOTBkZWcsIzAwOTBDNywjRUIwMDhCKTtiYWNrZ3JvdW5kLW9yaWdpbjpib3JkZXItYm94O2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveCwgYm9yZGVyLWJveDsiPicgKyBlc2MoKCIwIiArIChzdGF0ZS5pZHggKyAxKSkuc2xpY2UoLTIpKSArICc8L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjIycHg7bGluZS1oZWlnaHQ6MS4xMjtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0taW5rKTsiPicgKyBlc2MoY2F0Lm5hbWUpICsgJzwvc3Bhbj48L2Rpdj4nICsKICAgICAgJzxwIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0KTtmb250LXNpemU6MTRweDttYXJnaW46MCAwIDI0cHg7Ij4nICsgZXNjKGNhdC5kZXNjKSArICc8L3A+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O21hcmdpbi1ib3R0b206MTRweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LXdlaWdodDo3MDA7bGV0dGVyLXNwYWNpbmc6LjEyZW07Y29sb3I6dmFyKC0tYmx1KTsiPkZJWEVEPC9zcGFuPicgKwogICAgICAnPHNwYW4gc3R5bGU9ImZsZXg6MTtoZWlnaHQ6M3B4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCMwMDkwQzcsI0VCMDA4Qik7Ij48L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4xMmVtO2NvbG9yOnZhcigtLW1hZyk7Ij5HUk9XVEg8L3NwYW4+PC9kaXY+JyArCiAgICAgICc8ZGl2IHJvbGU9InJhZGlvZ3JvdXAiIGFyaWEtbGFiZWw9IicgKyBlc2MoY2F0Lm5hbWUpICsgJyIgc3R5bGU9ImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjEwcHg7Ij4nICsgb3B0aW9ucyArICc8L2Rpdj48L2Rpdj4nICsKICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Z2FwOjEycHg7bWFyZ2luLXRvcDoyMnB4O2ZsZXgtd3JhcDp3cmFwOyI+JyArCiAgICAgICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InRjLWJ0bi1naG9zdCIgZGF0YS10Yy1hY3Rpb249InByZXZpb3VzIj4nICsgKHN0YXRlLmlkeCA9PT0gMCA/ICJcdTIxOTAgQmFjayIgOiAiXHUyMTkwIFByZXZpb3VzIikgKyAnPC9idXR0b24+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tdGV4dCk7dGV4dC1hbGlnbjpjZW50ZXI7ZmxleDoxO21pbi13aWR0aDoxNjBweDsiPicgKyAoY2FuTmV4dCA/ICIiIDogIkNob29zZSB0aGUgc3RhdGVtZW50IGNsb3Nlc3QgdG8gaG93IHlvdSByZXNwb25kIHRvZGF5IikgKyAnPC9zcGFuPicgKwogICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0Yy1idG4tcHJpbWFyeSIgZGF0YS10Yy1hY3Rpb249Im5leHQiICcgKyAoY2FuTmV4dCA/ICIiIDogImRpc2FibGVkIikgKyAnPicgKyAobGFzdCA/ICJDb250aW51ZSBcdTIxOTIiIDogIk5leHQgXHUyMTkyIikgKyAnPC9idXR0b24+PC9kaXY+JyArCiAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEyLjVweDtjb2xvcjp2YXIoLS10ZXh0KTttYXJnaW46MjZweCAwIDA7Zm9udC1zdHlsZTppdGFsaWM7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZy1ib3R0b206MzRweDsiPlRoaXMgZnJhbWV3b3JrIGlzIGJhc2VkIG9uIHRoZSB3b3JrIG9mIEFuZGVyc29uICgyMDE3KSwgRHdlY2sgKDIwMTYpLCBHYXJjXHUwMGVkYSwgVGVqYWRhLCBhbmQgUmFtXHUwMGVkcmV6ICgyMDIzKSwgYW5kIFJhbVx1MDBlZHJleiAoMjAyNCkuPC9wPicgKwogICAgICAnPC9kaXY+PC9kaXY+JzsKICB9CgogIGZ1bmN0aW9uIGNoaXBzSFRNTChsYWJlbHMsIHZhbHMsIGtleSwgc2VsKSB7CiAgICByZXR1cm4gbGFiZWxzLm1hcChmdW5jdGlvbiAobGFiZWwsIGkpIHsKICAgICAgdmFyIG9uID0gc2VsID09PSB2YWxzW2ldOwogICAgICByZXR1cm4gJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idGMtY2hpcCIgYXJpYS1wcmVzc2VkPSInICsgb24gKyAnIiBkYXRhLXRjLWN0eC1rZXk9IicgKyBlc2Moa2V5KSArICciIGRhdGEtdGMtY3R4LXZhbHVlPSInICsgZXNjKHZhbHNbaV0pICsgJyI+JyArIGVzYyhsYWJlbCkgKyAnPC9idXR0b24+JzsKICAgIH0pLmpvaW4oIiIpOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyRGV0YWlscygpIHsKICAgIHZhciBjID0gc3RhdGUuY3R4LCByID0gc3RhdGUucmVmbDsKICAgIHZhciBzZWxmRGVzY0Jsb2NrID0gYy5nZW5kZXIgPT09ICJTZWxmLWRlc2NyaWJlIiA/CiAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI2MCIgY2xhc3M9InRjLWlucHV0IiBwbGFjZWhvbGRlcj0iSG93IHdvdWxkIHlvdSBkZXNjcmliZSB5b3VyIGdlbmRlcj8iIHZhbHVlPSInICsgZXNjKGMuc2VsZkRlc2MpICsgJyIgZGF0YS10Yy1pbnB1dD0ic2VsZkRlc2MiIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4nIDogIiI7CiAgICByZXR1cm4gJzxkaXYgY2xhc3M9InRjLWFuaW0iPicgKwogICAgICAnPGRpdiBzdHlsZT0icG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MjA7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuOTUpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDZweCk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKTtwYWRkaW5nOjExcHggOHB4OyI+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87Ij4nICsgY29tcGFzc1NWRygyNiwgIkQiKSArCiAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjVweDtjb2xvcjp2YXIoLS10ZXh0KTtmb250LXdlaWdodDo3MDA7bGV0dGVyLXNwYWNpbmc6LjAzZW07Ij5UZW4gc2l0dWF0aW9ucyBjb21wbGV0ZTwvc3Bhbj4nICsKICAgICAgJzxkaXYgc3R5bGU9ImZsZXg6MTttYXgtd2lkdGg6NDQwcHg7aGVpZ2h0OjVweDtib3JkZXItcmFkaXVzOjNweDtiYWNrZ3JvdW5kOnZhcigtLW1hZyk7Ij48L2Rpdj48L2Rpdj48L2Rpdj4nICsKICAgICAgJzxkaXYgc3R5bGU9InBhZGRpbmc6MzBweCAyMHB4IDA7bWF4LXdpZHRoOjcyMHB4O21hcmdpbjowIGF1dG87Ij4nICsKICAgICAgJzxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTNweDtjb2xvcjp2YXIoLS10ZXh0KTttYXJnaW46MCAwIDIycHg7Ij5PcHRpb25hbCDigJQgZXZlcnkgZmllbGQgY2FuIGJlIGxlZnQgYmxhbmsuPC9wPicgKwogICAgICAnPGRpdiBzdHlsZT0ibWF4LXdpZHRoOjY0MHB4O21hcmdpbjowIGF1dG87Ij4nICsKICAgICAgJzxoMiBjbGFzcz0idGMtZ3JhZC10ZXh0IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjIwcHg7bGluZS1oZWlnaHQ6MS4xMjtmb250LXdlaWdodDo3MDA7bWFyZ2luOjAgMCA2cHg7Ij5BIGZldyBkZXRhaWxzLCBpZiB5b3VcJ2QgbGlrZTwvaDI+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLXBhbmVsMik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1wYW5lbGJvcmRlcik7Ym9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6MTZweCAxOHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOnZhcigtLXRleHQpO21hcmdpbi1ib3R0b206MjhweDsiPllvdXIgYW5zd2VycyBhcmUgYWxzbyBjb250cmlidXRpbmcgdG8gcmVzZWFyY2ggb24gdGVhY2hlciBtaW5kc2V0cy4gV2VcJ3JlIHRyeWluZyB0byB1bmRlcnN0YW5kIGhvdyBlZHVjYXRvcnMsIGFjcm9zcyBkaWZmZXJlbnQgY291bnRyaWVzLCBsZXZlbHMsIGFuZCBleHBlcmllbmNlLCBzZWUgdGhlaXIgb3duIGNhcGFjaXR5IHRvIGdyb3cuIFRvIGRvIHRoYXQsIHdlIGNvbGxlY3QgeW91ciBhZ2UsIGdlbmRlciwgY291bnRyeSwgY2l0eSwgeWVhcnMgdGVhY2hpbmcsIGxldmVsLCBhbmQgc3ViamVjdCwgYWxvbmcgd2l0aCB5b3VyIGFuc3dlcnMgdG8gdGhlIHRlbiBzaXR1YXRpb25zIGFuZCBhbnl0aGluZyB5b3UgY2hvb3NlIHRvIHdyaXRlIGluIHRoZSBvcHRpb25hbCByZWZsZWN0aW9uLiBOb3RoaW5nIGhlcmUgaW5jbHVkZXMgeW91ciBuYW1lIG9yIGVtYWlsLiBJdCBzdGF5cyBhbm9ueW1vdXMuPC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjIycHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTpibG9jaztmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjE1LjVweDttYXJnaW4tYm90dG9tOjEwcHg7Y29sb3I6dmFyKC0taW5rKTsiPkFnZTwvc3Bhbj4nICsKICAgICAgJzxkaXYgcm9sZT0iZ3JvdXAiIGFyaWEtbGFiZWw9IkFnZSIgc3R5bGU9ImRpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6OHB4OyI+JyArIGNoaXBzSFRNTChBR0VTLCBBR0VfVkFMUywgImFnZSIsIGMuYWdlKSArICc8L2Rpdj48L2Rpdj4nICsKICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206MjJweDsiPjxzcGFuIHN0eWxlPSJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MTUuNXB4O21hcmdpbi1ib3R0b206MTBweDtjb2xvcjp2YXIoLS1pbmspOyI+R2VuZGVyPC9zcGFuPicgKwogICAgICAnPGRpdiByb2xlPSJncm91cCIgYXJpYS1sYWJlbD0iR2VuZGVyIiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo4cHg7Ij4nICsgY2hpcHNIVE1MKEdFTkRFUlMsIEdFTkRFUl9WQUxTLCAiZ2VuZGVyIiwgYy5nZW5kZXIpICsgJzwvZGl2PicgKyBzZWxmRGVzY0Jsb2NrICsgJzwvZGl2PicgKwogICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KDIzMHB4LDFmcikpO2dhcDoxOHB4O21hcmdpbi1ib3R0b206MjJweDsiPicgKwogICAgICAnPGRpdj48bGFiZWwgc3R5bGU9ImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxNS41cHg7bWFyZ2luLWJvdHRvbToxMHB4O2NvbG9yOnZhcigtLWluayk7IiBmb3I9InRjLWxvY2F0aW9uIj5Db3VudHJ5IGFuZCBjaXR5PC9sYWJlbD4nICsKICAgICAgJzxpbnB1dCBpZD0idGMtbG9jYXRpb24iIHR5cGU9InRleHQiIG1heGxlbmd0aD0iMTIwIiBjbGFzcz0idGMtaW5wdXQiIHBsYWNlaG9sZGVyPSJlLmcuIENvbG9tYmlhIOKAlCBCb2dvdFx1MDBlMSIgdmFsdWU9IicgKyBlc2MoYy5sb2NhdGlvbikgKyAnIiBkYXRhLXRjLWlucHV0PSJsb2NhdGlvbiI+PC9kaXY+JyArCiAgICAgICc8ZGl2PjxsYWJlbCBzdHlsZT0iZGlzcGxheTpibG9jaztmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjE1LjVweDttYXJnaW4tYm90dG9tOjEwcHg7Y29sb3I6dmFyKC0taW5rKTsiIGZvcj0idGMteWVhcnMiPlllYXJzIHRlYWNoaW5nPC9sYWJlbD4nICsKICAgICAgJzxpbnB1dCBpZD0idGMteWVhcnMiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iMzAiIGNsYXNzPSJ0Yy1pbnB1dCIgcGxhY2Vob2xkZXI9ImUuZy4gNyIgdmFsdWU9IicgKyBlc2MoYy55ZWFycykgKyAnIiBkYXRhLXRjLWlucHV0PSJ5ZWFycyI+PC9kaXY+PC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjIycHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTpibG9jaztmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjE1LjVweDttYXJnaW4tYm90dG9tOjEwcHg7Y29sb3I6dmFyKC0taW5rKTsiPkxldmVsIHlvdSBtYWlubHkgdGVhY2g8L3NwYW4+JyArCiAgICAgICc8ZGl2IHJvbGU9Imdyb3VwIiBhcmlhLWxhYmVsPSJMZXZlbCB5b3UgbWFpbmx5IHRlYWNoIiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo4cHg7Ij4nICsgY2hpcHNIVE1MKExFVkVMUywgTEVWRUxfVkFMUywgImxldmVsIiwgYy5sZXZlbCkgKyAnPC9kaXY+PC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxsYWJlbCBzdHlsZT0iZGlzcGxheTpibG9jaztmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjE1LjVweDttYXJnaW4tYm90dG9tOjEwcHg7Y29sb3I6dmFyKC0taW5rKTsiIGZvcj0idGMtc3ViamVjdCI+U3ViamVjdCB5b3UgbWFpbmx5IHRlYWNoPC9sYWJlbD4nICsKICAgICAgJzxpbnB1dCBpZD0idGMtc3ViamVjdCIgdHlwZT0idGV4dCIgbWF4bGVuZ3RoPSI4MCIgY2xhc3M9InRjLWlucHV0IiBwbGFjZWhvbGRlcj0iZS5nLiBNYXRoZW1hdGljcyIgdmFsdWU9IicgKyBlc2MoYy5zdWJqZWN0KSArICciIGRhdGEtdGMtaW5wdXQ9InN1YmplY3QiPjwvZGl2PicgKwogICAgICAnPGRpdiBzdHlsZT0ibWFyZ2luOjMwcHggYXV0byAwOyI+PGgzIGNsYXNzPSJ0Yy1ncmFkLXRleHQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MjBweDtsaW5lLWhlaWdodDoxLjEyO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW46MCAwIDEycHg7Ij5PbmUgbW9yZSB0aGluZzwvaDM+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLXBhbmVsMik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1wYW5lbGJvcmRlcik7Ym9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6MTZweCAxOHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOnZhcigtLXRleHQpO2xpbmUtaGVpZ2h0OjEuNjttYXJnaW46MCAwIDI0cHg7Ij5UaGlzIHBhcnQgaXMgb3B0aW9uYWwuIElmIHlvdVwncmUgd2lsbGluZywgc2hhcmUgYSBsaXR0bGUgbW9yZSBhYm91dCB3aGVyZSB5b3UgYXJlIHJpZ2h0IG5vdy4gV2hhdCB5b3Ugd3JpdGUgaGVscHMgdXMgdW5kZXJzdGFuZCB0cmVuZHMgYWNyb3NzIGVkdWNhdG9yc1wnIHJlc3BvbnNlcy4gUGxlYXNlIGRvblwndCBpbmNsdWRlIHJlYWwgbmFtZXMgb3IgZGV0YWlscyB0aGF0IGNvdWxkIGlkZW50aWZ5IHlvdSwgeW91ciBzdHVkZW50cywgb3IgeW91ciBjb2xsZWFndWVzLjwvZGl2PicgKwogICAgICAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbToyMnB4OyI+PGxhYmVsIHN0eWxlPSJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MTVweDtjb2xvcjp2YXIoLS1pbmspO21hcmdpbi1ib3R0b206OXB4OyIgZm9yPSJ0Yy1yZWZsLWZpeGVkIj5XaGVyZSBkb2VzIGl0IGZlZWwgaGFyZGVzdCB0byBpbWFnaW5lIHlvdXJzZWxmIGdyb3dpbmcgYXMgYSB0ZWFjaGVyPzwvbGFiZWw+JyArCiAgICAgICc8dGV4dGFyZWEgaWQ9InRjLXJlZmwtZml4ZWQiIG1heGxlbmd0aD0iNjAwIiByb3dzPSIzIiBjbGFzcz0idGMtaW5wdXQiIHBsYWNlaG9sZGVyPSJPcHRpb25hbCIgZGF0YS10Yy1yZWZsPSJmaXhlZCI+JyArIGVzYyhyLmZpeGVkKSArICc8L3RleHRhcmVhPicgKwogICAgICAnPGRpdiBpZD0idGMtY291bnQtZml4ZWQiIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0O2ZvbnQtc2l6ZToxMS41cHg7Y29sb3I6dmFyKC0tdGV4dCk7bWFyZ2luLXRvcDo0cHg7Ij4nICsgci5maXhlZC5sZW5ndGggKyAnIC8gNjAwPC9kaXY+PC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjIycHg7Ij48bGFiZWwgc3R5bGU9ImRpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxNXB4O2NvbG9yOnZhcigtLWluayk7bWFyZ2luLWJvdHRvbTo5cHg7IiBmb3I9InRjLXJlZmwtZ3Jvd3RoIj5XaGVyZSBpbiB5b3VyIHRlYWNoaW5nIGRvIHlvdSBmZWVsIHlvdXJzZWxmIGdyb3dpbmcsIG9yIGdlbnVpbmVseSB0cnlpbmcgdG8/PC9sYWJlbD4nICsKICAgICAgJzx0ZXh0YXJlYSBpZD0idGMtcmVmbC1ncm93dGgiIG1heGxlbmd0aD0iNjAwIiByb3dzPSIzIiBjbGFzcz0idGMtaW5wdXQiIHBsYWNlaG9sZGVyPSJPcHRpb25hbCIgZGF0YS10Yy1yZWZsPSJncm93dGgiPicgKyBlc2Moci5ncm93dGgpICsgJzwvdGV4dGFyZWE+JyArCiAgICAgICc8ZGl2IGlkPSJ0Yy1jb3VudC1ncm93dGgiIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0O2ZvbnQtc2l6ZToxMS41cHg7Y29sb3I6dmFyKC0tdGV4dCk7bWFyZ2luLXRvcDo0cHg7Ij4nICsgci5ncm93dGgubGVuZ3RoICsgJyAvIDYwMDwvZGl2PjwvZGl2PicgKwogICAgICAnPC9kaXY+PC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxMnB4O21hcmdpbjozNHB4IDAgMDtmbGV4LXdyYXA6d3JhcDsiPicgKwogICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0Yy1idG4tZ2hvc3QiIGRhdGEtdGMtYWN0aW9uPSJiYWNrVG9Bc3Nlc3MiPlx1MjE5MCBQcmV2aW91czwvYnV0dG9uPicgKwogICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0Yy1idG4tcHJpbWFyeSIgZGF0YS10Yy1hY3Rpb249InN1Ym1pdERldGFpbHMiPlNob3cgbXkgY29tcGFzcyBcdTIxOTI8L2J1dHRvbj48L2Rpdj4nICsKICAgICAgJzwvZGl2PjwvZGl2Pic7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJDb3VudGVycygpIHsKICAgIHZhciBmYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Yy1jb3VudC1maXhlZCIpLCBnYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Yy1jb3VudC1ncm93dGgiKTsKICAgIGlmIChmYykgZmMudGV4dENvbnRlbnQgPSBzdGF0ZS5yZWZsLmZpeGVkLmxlbmd0aCArICIgLyA2MDAiOwogICAgaWYgKGdjKSBnYy50ZXh0Q29udGVudCA9IHN0YXRlLnJlZmwuZ3Jvd3RoLmxlbmd0aCArICIgLyA2MDAiOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyUmVzdWx0cygpIHsKICAgIHZhciBhID0gc3RhdGUuYW5zd2VyczsKICAgIHZhciBzY29yZXMgPSBDQVRTLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gYVtjLmtleV0gfHwgMDsgfSk7CiAgICB2YXIgYXZnID0gc2NvcmVzLnJlZHVjZShmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4geCArIHk7IH0sIDApIC8gQ0FUUy5sZW5ndGg7CiAgICB2YXIgaGkgPSAwLCBsbyA9IDA7CiAgICBzY29yZXMuZm9yRWFjaChmdW5jdGlvbiAocywgaSkgeyBpZiAocyA+IHNjb3Jlc1toaV0pIGhpID0gaTsgaWYgKHMgPCBzY29yZXNbbG9dKSBsbyA9IGk7IH0pOwogICAgdmFyIG92ZXJhbGwgPSBhdmcgPD0gMi40ID8gImxlYW5pbmcgZml4ZWQiIDogKGF2ZyA8IDMuNiA/ICJzaXR0aW5nIGluIHRoZSBtaWRkbGUiIDogImxlYW5pbmcgZ3Jvd3RoIik7CiAgICB2YXIgY2FyZHMgPSBDQVRTLm1hcChmdW5jdGlvbiAoYywgaSkgewogICAgICB2YXIgdCA9IHRpZXJPZihhW2Mua2V5XSk7CiAgICAgIHJldHVybiAnPGRpdiBjbGFzcz0idGMtcmVzdWx0LWNhcmQiIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtib3JkZXItbGVmdDo0cHggc29saWQgdmFyKC0tbWFnKTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMThweCAxNnB4IDIxcHg7Ij4nICsKICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MTBweDtmbGV4LXdyYXA6d3JhcDsiPicgKwogICAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnZhcigtLWluayk7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OXB4OyI+JyArCiAgICAgICAgJzxzcGFuIHN0eWxlPSJib3JkZXI6MS40cHggc29saWQgdmFyKC0tbWFnKTtjb2xvcjp2YXIoLS1tYWcpO2JvcmRlci1yYWRpdXM6OTk5cHg7cGFkZGluZzoxcHggOHB4O2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMDVlbTsiPicgKyBlc2MoKCIwIiArIChpICsgMSkpLnNsaWNlKC0yKSkgKyAnPC9zcGFuPicgKyBlc2MoYy5uYW1lKSArICc8L3NwYW4+JyArCiAgICAgICAgJzxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tYmx1KTtsZXR0ZXItc3BhY2luZzouMDVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7d2hpdGUtc3BhY2U6bm93cmFwOyI+JyArIFRJRVJfTEFCRUxbdF0gKyAnPC9zcGFuPjwvZGl2PicgKwogICAgICAgICc8ZGl2IHN0eWxlPSJmb250LXNpemU6MTAuNXB4O2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMDhlbTtjb2xvcjp2YXIoLS1tYWcpO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTttYXJnaW4tYm90dG9tOjRweDsiPllvdXIgcmVzcG9uc2U8L2Rpdj4nICsKICAgICAgICAnPGRpdiBzdHlsZT0iZm9udC1zaXplOjE0LjVweDtjb2xvcjp2YXIoLS10ZXh0KTttYXJnaW4tYm90dG9tOjE0cHg7bGluZS1oZWlnaHQ6MS41OyI+JyArIGVzYyhjLnN0YXRlbWVudHNbYVtjLmtleV0gLSAxXSkgKyAnPC9kaXY+JyArCiAgICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZToxMC41cHg7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4wNmVtO2NvbG9yOiNmZmY7YmFja2dyb3VuZDp2YXIoLS12aW9sZXQpO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjNweCA5cHg7bWFyZ2luLWJvdHRvbTo2cHg7Ij5BIHF1ZXN0aW9uIHRvIHNpdCB3aXRoPC9kaXY+JyArCiAgICAgICAgJzxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxNXB4O2NvbG9yOnZhcigtLXRleHQpO2xpbmUtaGVpZ2h0OjEuNTsiPicgKyBlc2MoYy5yZWZsZWN0aW9uc1t0XSkgKyAnPC9kaXY+PC9kaXY+JzsKICAgIH0pLmpvaW4oJzxkaXYgc3R5bGU9ImhlaWdodDoxNHB4OyI+PC9kaXY+Jyk7CiAgICByZXR1cm4gJzxkaXYgY2xhc3M9InRjLWFuaW0iPicgKwogICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCMwMDkwQzcsI0VCMDA4Qik7Ym9yZGVyLXJhZGl1czoxNnB4O3BhZGRpbmc6NnB4OyI+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmYmZiZmM7Ym9yZGVyLXJhZGl1czoxMXB4O3BhZGRpbmc6NDBweCAyOHB4O3RleHQtYWxpZ246Y2VudGVyOyI+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW4tYm90dG9tOjE0cHg7Ij4nICsgY29tcGFzc1NWRyg4MCwgIjIiKSArICc8L2Rpdj4nICsKICAgICAgJzxkaXYgc3R5bGU9ImNvbG9yOiMwQzQ0N0M7Zm9udC1zaXplOjE1cHg7bGV0dGVyLXNwYWNpbmc6LjE0ZW07bWFyZ2luLWJvdHRvbToxMnB4O2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ij5Zb3VyIFJlc3VsdHM8L2Rpdj4nICsKICAgICAgJzxoMSBzdHlsZT0iY29sb3I6dmFyKC0taW5rKTtmb250LXNpemU6MzJweDtsaW5lLWhlaWdodDoxLjEyO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW46NnB4IDAgOXB4OyI+QSBTbmFwc2hvdCBvZiBZb3VyIE1pbmRzZXQgVG9kYXk8L2gxPicgKwogICAgICAnPHAgc3R5bGU9ImNvbG9yOnZhcigtLXNvZnQpO2ZvbnQtc2l6ZToxNHB4O21heC13aWR0aDo1MjBweDttYXJnaW46MCBhdXRvOyI+QWNyb3NzIHRlbiBzaXR1YXRpb25zLCB5b3VyIGFuc3dlcnMgYXZlcmFnZSAnICsgYXZnLnRvRml4ZWQoMSkgKyAnIG91dCBvZiA1IFx1MjAxNCAnICsgb3ZlcmFsbCArICcgdG9kYXkuPC9wPicgKwogICAgICAnPC9kaXY+PC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjhweCAyMHB4IDQwcHg7Ij4nICsKICAgICAgJzxkaXYgY2xhc3M9InRjLXJhZGFyLXdyYXAiIHN0eWxlPSJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46NnB4IGF1dG87Ij48Y2FudmFzIGlkPSJ0Yy1yYWRhciI+PC9jYW52YXM+PC9kaXY+JyArCiAgICAgICc8ZGl2IGNsYXNzPSJ0Yy1zdW1tYXJ5LWdyaWQiIHN0eWxlPSJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpdCxtaW5tYXgoMTgwcHgsMWZyKSk7Z2FwOjEycHg7bWF4LXdpZHRoOjYyMHB4O21hcmdpbjoxMHB4IGF1dG8gMDsiPicgKwogICAgICAnPGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6MTJweDtwYWRkaW5nOjE2cHggMThweDsiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMC41cHg7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4wOGVtO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtjb2xvcjp2YXIoLS1tYWcpO21hcmdpbi1ib3R0b206NnB4OyI+QXZlcmFnZSBwb3NpdGlvbjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjp2YXIoLS1pbmspOyI+JyArIGF2Zy50b0ZpeGVkKDEpICsgJyAvIDU8L2Rpdj48L2Rpdj4nICsKICAgICAgJzxkaXYgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjEycHg7cGFkZGluZzoxNnB4IDE4cHg7Ij48ZGl2IHN0eWxlPSJmb250LXNpemU6MTAuNXB4O2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMDhlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Y29sb3I6dmFyKC0tbWFnKTttYXJnaW4tYm90dG9tOjZweDsiPkdyb3dpbmcgbW9zdDwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxN3B4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjp2YXIoLS1pbmspO2xpbmUtaGVpZ2h0OjEuMzsiPicgKyBlc2MoQ0FUU1toaV0ubmFtZSkgKyAnPC9kaXY+PC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6MTZweCAxOHB4OyI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjEwLjVweDtmb250LXdlaWdodDo3MDA7bGV0dGVyLXNwYWNpbmc6LjA4ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2NvbG9yOnZhcigtLWJsdSk7bWFyZ2luLWJvdHRvbTo2cHg7Ij5Sb29tIHRvIGdyb3c8L2Rpdj48ZGl2IHN0eWxlPSJmb250LXNpemU6MTdweDtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0taW5rKTtsaW5lLWhlaWdodDoxLjM7Ij4nICsgZXNjKENBVFNbbG9dLm5hbWUpICsgJzwvZGl2PjwvZGl2PjwvZGl2PicgKwogICAgICAnPGRpdiBjbGFzcz0idGMtaG93dG8iIHN0eWxlPSJtYXgtd2lkdGg6NjIwcHg7bWFyZ2luOjI0cHggYXV0byA4cHg7Ij48aDIgY2xhc3M9InRjLWdyYWQtdGV4dCIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjEuMTI7Zm9udC13ZWlnaHQ6NzAwO21hcmdpbjowIDAgMTRweDsiPkhvdyB0byByZWFkIHlvdXIgY29tcGFzczwvaDI+JyArCiAgICAgICc8cCBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dCk7Zm9udC1zaXplOjE1cHg7bGluZS1oZWlnaHQ6MS42O21hcmdpbjowIDAgMTJweDsiPlRoZSBzaGFwZSBhYm92ZSBpcyBjYWxsZWQgYSBzcGlkZXIgY2hhcnQsIHdpdGggb25lIHBvaW50IGZvciBlYWNoIHNpdHVhdGlvbi4gRWFjaCBwb2ludCBpcyBsYWJlbGVkIDEgdG8gNSwgbWF0Y2hpbmcgdGhlIHN0YXRlbWVudCB5b3UgY2hvc2UsIGZyb20gMSAobW9yZSBmaXhlZCkgdG8gNSAobW9yZSBncm93dGgpLiBQb2ludHMgY2xvc2VyIHRvIHRoZSBjZW50ZXIgbGVhbiB0b3dhcmQgYSBmaXhlZCB2aWV3OyBwb2ludHMgcmVhY2hpbmcgb3V0d2FyZCBsZWFuIHRvd2FyZCBncm93dGguIFRvZ2V0aGVyLCB0aGV5IHNob3cgd2hlcmUgeW91IHN0YW5kIHRvZGF5LCBhbGwgYXQgb25jZS48L3A+JyArCiAgICAgICc8cCBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dCk7Zm9udC1zaXplOjE1cHg7bGluZS1oZWlnaHQ6MS42O21hcmdpbjowIDAgMTJweDsiPkJlbG93LCB5b3VcJ2xsIGZpbmQgZWFjaCBzaXR1YXRpb24gYWdhaW4sIGFsb25nIHdpdGggdGhlIHJlc3BvbnNlIHlvdSBjaG9zZS4gVGhlIHdvcmQgYmVzaWRlIGl0IChGaXhlZC1sZWFuaW5nLCBNaXhlZCwgb3IgR3Jvd3RoLWxlYW5pbmcpIHNob3dzIHdoZXJlIHlvdXIgYW5zd2VyIGxhbmRlZCBvbiB0aGF0IHNjYWxlLiBOZWl0aGVyIGVuZCBpcyBhIGdyYWRlOyBpdFwncyBqdXN0IGEgcG9pbnQgb2YgcmVmZXJlbmNlLjwvcD4nICsKICAgICAgJzxwIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0KTtmb250LXNpemU6MTVweDtsaW5lLWhlaWdodDoxLjY7bWFyZ2luOjA7Ij5FYWNoIHNpdHVhdGlvbiBhbHNvIGNhcnJpZXMgYSByZWZsZWN0aW9uIHF1ZXN0aW9uLCBtYXRjaGVkIHRvIHlvdXIgcmVzcG9uc2UuIEFzIHlvdSBnbyBvdmVyIHRoZW0sIHdlIGludml0ZSB5b3UgdG8gam90IGEgZmV3IG5vdGVzLCBzaXQgcXVpZXRseSB3aXRoIHRoZSBvbmVzIHRoYXQgc3BlYWsgdG8geW91LCBvciB0YWxrIHRoZW0gb3ZlciB3aXRoIGEgY29sbGVhZ3VlIHlvdSB0cnVzdC48L3A+PC9kaXY+JyArCiAgICAgICc8aDIgY2xhc3M9InRjLWdyYWQtdGV4dCB0Yy1xdWVzdGlvbnMtdGl0bGUiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MjJweDtsaW5lLWhlaWdodDoxLjEyO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW46NDBweCAwIDIycHg7Ij5RdWVzdGlvbnMgdG8gc2l0IHdpdGg8L2gyPicgKwogICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjsiPicgKyBjYXJkcyArICc8L2Rpdj4nICsKICAgICAgJzxkaXYgY2xhc3M9InRjLXJlc3VsdC1hY3Rpb25zIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjM4cHggMCAxMHB4O2Rpc3BsYXk6ZmxleDtnYXA6MTJweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjsiPicgKwogICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0Yy1idG4tZ2hvc3QiIGRhdGEtdGMtYWN0aW9uPSJkb3dubG9hZCI+JyArIChzdGF0ZS5kb3dubG9hZGluZyA/ICJQcmVwYXJpbmcuLi4iIDogIlByaW50IC8gc2F2ZSBteSByZXN1bHRzIChQREYpIikgKyAnPC9idXR0b24+JyArCiAgICAgICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgc3R5bGU9ImJvcmRlcjpub25lO2JhY2tncm91bmQ6bm9uZTtjb2xvcjp2YXIoLS10ZXh0KTtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjE0cHg7cGFkZGluZzoxNXB4IDE4cHg7IiBkYXRhLXRjLWFjdGlvbj0icmVzdGFydCI+U3RhcnQgb3ZlcjwvYnV0dG9uPjwvZGl2PicgKwogICAgICAnPGRpdiBjbGFzcz0idGMtcmVjb3JkZWQtbWVzc2FnZSIgYXJpYS1saXZlPSJwb2xpdGUiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTNweDtjb2xvcjp2YXIoLS10ZXh0KTttYXJnaW4tdG9wOjEycHg7Ij4nICsgKHN0YXRlLnNoYXJlZCA/ICJZb3VyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjb3JkZWQgYW5vbnltb3VzbHkuIiA6ICIiKSArICc8L2Rpdj4nICsKICAgICAgJzwvZGl2PjwvZGl2Pic7CiAgfQoKICAvKiAtLS0tLS0tLS0tIHJhZGFyIGNoYXJ0IC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBkcmF3UmFkYXIoKSB7CiAgICB2YXIgYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Yy1yYWRhciIpOyBpZiAoIWMpIHJldHVybjsKICAgIHZhciBob3N0ID0gYy5wYXJlbnROb2RlOwogICAgdmFyIHNpemUgPSBNYXRoLm1heCgzMDAsIE1hdGgubWluKDQ2MCwgKGhvc3QuY2xpZW50V2lkdGggfHwgNDYwKSAtIDIwKSk7CiAgICB2YXIgc2NhbGUgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxOwogICAgYy53aWR0aCA9IHNpemUgKiBzY2FsZTsgYy5oZWlnaHQgPSBzaXplICogc2NhbGU7CiAgICBjLnN0eWxlLndpZHRoID0gc2l6ZSArICJweCI7IGMuc3R5bGUuaGVpZ2h0ID0gc2l6ZSArICJweCI7CiAgICB2YXIgZyA9IGMuZ2V0Q29udGV4dCAmJiBjLmdldENvbnRleHQoIjJkIik7CiAgICBpZiAoIWcpIHJldHVybjsKICAgIGcuc2V0VHJhbnNmb3JtKHNjYWxlLCAwLCAwLCBzY2FsZSwgMCwgMCk7CiAgICB2YXIgY3ggPSBzaXplIC8gMiwgY3kgPSBzaXplIC8gMiwgbWF4UiA9IHNpemUgLyAyIC0gNTgsIG4gPSBDQVRTLmxlbmd0aCwgYSA9IHN0YXRlLmFuc3dlcnM7CiAgICBnLmNsZWFyUmVjdCgwLCAwLCBzaXplLCBzaXplKTsKICAgIGZ1bmN0aW9uIHB0KGksIHIpIHsgdmFyIGFuZyA9IC1NYXRoLlBJIC8gMiArIGkgKiAoMiAqIE1hdGguUEkgLyBuKTsgcmV0dXJuIFtjeCArIHIgKiBNYXRoLmNvcyhhbmcpLCBjeSArIHIgKiBNYXRoLnNpbihhbmcpXTsgfQogICAgZm9yICh2YXIgbHZsID0gMTsgbHZsIDw9IDU7IGx2bCsrKSB7CiAgICAgIGcuYmVnaW5QYXRoKCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7IHZhciBwID0gcHQoaSwgbWF4UiAqIGx2bCAvIDUpOyBpZiAoaSA9PT0gMCkgZy5tb3ZlVG8ocFswXSwgcFsxXSk7IGVsc2UgZy5saW5lVG8ocFswXSwgcFsxXSk7IH0KICAgICAgZy5jbG9zZVBhdGgoKTsgZy5zdHJva2VTdHlsZSA9IGx2bCA9PT0gNSA/ICIjYzhjY2Q0IiA6ICIjZTZlOGVjIjsgZy5saW5lV2lkdGggPSAxOyBnLnN0cm9rZSgpOwogICAgfQogICAgZy50ZXh0QWxpZ24gPSAiY2VudGVyIjsgZy50ZXh0QmFzZWxpbmUgPSAibWlkZGxlIjsKICAgIGZvciAodmFyIHMgPSAwOyBzIDwgbjsgcysrKSB7CiAgICAgIHZhciBlID0gcHQocywgbWF4Uik7CiAgICAgIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKGN4LCBjeSk7IGcubGluZVRvKGVbMF0sIGVbMV0pOyBnLnN0cm9rZVN0eWxlID0gIiNlNmU4ZWMiOyBnLmxpbmVXaWR0aCA9IDE7IGcuc3Ryb2tlKCk7CiAgICAgIHZhciBscCA9IHB0KHMsIG1heFIgKyAyNiksIG5hbWUgPSBDQVRTW3NdLm5hbWUsIHdvcmRzID0gbmFtZS5zcGxpdCgiICIpOwogICAgICBnLmZpbGxTdHlsZSA9ICIjMWIyNTMwIjsgZy5mb250ID0gIjcwMCAxMS41cHggJ0F0a2luc29uIEh5cGVybGVnaWJsZScsIHNhbnMtc2VyaWYiOwogICAgICBpZiAobmFtZS5sZW5ndGggPiAxMiAmJiB3b3Jkcy5sZW5ndGggPiAxKSB7CiAgICAgICAgdmFyIG1pZCA9IE1hdGguY2VpbCh3b3Jkcy5sZW5ndGggLyAyKTsKICAgICAgICBnLmZpbGxUZXh0KHdvcmRzLnNsaWNlKDAsIG1pZCkuam9pbigiICIpLCBscFswXSwgbHBbMV0gLSA2KTsKICAgICAgICBnLmZpbGxUZXh0KHdvcmRzLnNsaWNlKG1pZCkuam9pbigiICIpLCBscFswXSwgbHBbMV0gKyA2KTsKICAgICAgfSBlbHNlIHsgZy5maWxsVGV4dChuYW1lLCBscFswXSwgbHBbMV0pOyB9CiAgICB9CiAgICB2YXIgcHRzID0gQ0FUUy5tYXAoZnVuY3Rpb24gKGNhdCwgaSkgeyByZXR1cm4gcHQoaSwgTWF0aC5tYXgobWF4UiAqIChhW2NhdC5rZXldIC0gMSkgLyA0LCAyKSk7IH0pOwogICAgZy5iZWdpblBhdGgoKTsgcHRzLmZvckVhY2goZnVuY3Rpb24gKHAsIGkpIHsgaWYgKGkgPT09IDApIGcubW92ZVRvKHBbMF0sIHBbMV0pOyBlbHNlIGcubGluZVRvKHBbMF0sIHBbMV0pOyB9KTsgZy5jbG9zZVBhdGgoKTsKICAgIGcuZmlsbFN0eWxlID0gInJnYmEoMjM1LDAsMTM5LDAuMTgpIjsgZy5maWxsKCk7CiAgICBnLnN0cm9rZVN0eWxlID0gIiNFQjAwOEIiOyBnLmxpbmVXaWR0aCA9IDIuNTsgZy5saW5lSm9pbiA9ICJyb3VuZCI7IGcuc3Ryb2tlKCk7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmFyYyhjeCwgY3ksIDMsIDAsIDIgKiBNYXRoLlBJKTsgZy5maWxsU3R5bGUgPSAiIzAwOTBDNyI7IGcuZmlsbCgpOwogICAgcHRzLmZvckVhY2goZnVuY3Rpb24gKHAsIGkpIHsKICAgICAgZy5iZWdpblBhdGgoKTsgZy5hcmMocFswXSwgcFsxXSwgOS41LCAwLCAyICogTWF0aC5QSSk7IGcuZmlsbFN0eWxlID0gIiNmZmZmZmYiOyBnLmZpbGwoKTsKICAgICAgZy5saW5lV2lkdGggPSAyOyBnLnN0cm9rZVN0eWxlID0gIiNFQjAwOEIiOyBnLnN0cm9rZSgpOwogICAgICBnLmZpbGxTdHlsZSA9ICIjRUIwMDhCIjsgZy5mb250ID0gIjcwMCAxMXB4ICdBdGtpbnNvbiBIeXBlcmxlZ2libGUnLCBzYW5zLXNlcmlmIjsKICAgICAgZy5maWxsVGV4dChTdHJpbmcoYVtDQVRTW2ldLmtleV0pLCBwWzBdLCBwWzFdICsgMC41KTsKICAgIH0pOwogIH0KCiAgLyogLS0tLS0tLS0tLSBQREYgZXhwb3J0IC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBidWlsZFBERigpIHsKICAgIHZhciBqc1BERiA9IHdpbmRvdy5qc3BkZi5qc1BERjsKICAgIHZhciBkb2MgPSBuZXcganNQREYoeyB1bml0OiAicHQiLCBmb3JtYXQ6ICJhNCIgfSk7CiAgICB2YXIgVyA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpLCBIID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpLCBNID0gNTI7CiAgICB2YXIgSU5LID0gWzIyLCAzNSwgNThdLCBJTksyID0gWzU4LCAzMSwgNzFdLCBQTFVNID0gWzEwNiwgMzEsIDk0XTsKICAgIHZhciBNQUcgPSBbMjM1LCAwLCAxMzldLCBCTFUgPSBbMCwgMTQ0LCAxOTldLCBNQUdTT0ZUID0gWzI1NSwgMTM4LCAxOTRdLCBCTFVTT0ZUID0gWzEyNCwgMjEyLCAyNTFdOwogICAgdmFyIFRFWFQgPSBbMjcsIDM3LCA0OF0sIFNPRlQgPSBbNzQsIDg0LCA5Nl0sIFZJT0xFVCA9IFs4OCwgNTQsIDEyN107CiAgICB2YXIgYSA9IHN0YXRlLmFuc3dlcnM7CgogICAgZnVuY3Rpb24gcm9zZShjeCwgY3ksIHIpIHsKICAgICAgZG9jLnNldERyYXdDb2xvcigxMjAsIDE1MCwgMjAwKTsgZG9jLnNldExpbmVXaWR0aCgwLjgpOyBkb2MuY2lyY2xlKGN4LCBjeSwgciwgIlMiKTsKICAgICAgZG9jLnNldERyYXdDb2xvcigxNTAsIDE1MCwgMTgwKTsgZG9jLnNldExpbmVXaWR0aCgwLjQpOyBkb2MuY2lyY2xlKGN4LCBjeSwgciAqIDAuNzQsICJTIik7CiAgICAgIGRvYy5zZXREcmF3Q29sb3IoMTUwLCAxNjAsIDE5MCk7CiAgICAgIGRvYy5saW5lKGN4LCBjeSAtIHIsIGN4LCBjeSArIHIpOyBkb2MubGluZShjeCAtIHIsIGN5LCBjeCArIHIsIGN5KTsKICAgICAgdmFyIGQgPSByICogMC43OyBkb2MubGluZShjeCAtIGQsIGN5IC0gZCwgY3ggKyBkLCBjeSArIGQpOyBkb2MubGluZShjeCArIGQsIGN5IC0gZCwgY3ggLSBkLCBjeSArIGQpOwogICAgICBmdW5jdGlvbiB0cmkoYXgsIGF5LCBieCwgYnksIGMyLCBkMiwgY29sKSB7CiAgICAgICAgZG9jLnNldEZpbGxDb2xvcihjb2xbMF0sIGNvbFsxXSwgY29sWzJdKTsKICAgICAgICBkb2MubGluZXMoW1tieCAtIGF4LCBieSAtIGF5XSwgW2MyIC0gYngsIGQyIC0gYnldLCBbYXggLSBjMiwgYXkgLSBkMl1dLCBheCwgYXksIFsxLCAxXSwgIkYiLCB0cnVlKTsKICAgICAgfQogICAgICB0cmkoY3gsIGN5IC0gciAqIDAuODIsIGN4ICsgciAqIDAuMTIsIGN5LCBjeCAtIHIgKiAwLjEyLCBjeSwgTUFHKTsKICAgICAgdHJpKGN4LCBjeSArIHIgKiAwLjgyLCBjeCArIHIgKiAwLjEyLCBjeSwgY3ggLSByICogMC4xMiwgY3ksIEJMVSk7CiAgICAgIHRyaShjeCAtIHIgKiAwLjgyLCBjeSwgY3gsIGN5IC0gciAqIDAuMTEsIGN4LCBjeSArIHIgKiAwLjExLCBCTFVTT0ZUKTsKICAgICAgdHJpKGN4ICsgciAqIDAuODIsIGN5LCBjeCwgY3kgLSByICogMC4xMSwgY3gsIGN5ICsgciAqIDAuMTEsIE1BR1NPRlQpOwogICAgICBkb2Muc2V0RmlsbENvbG9yKDI1NSwgMjU1LCAyNTUpOyBkb2MuY2lyY2xlKGN4LCBjeSwgciAqIDAuMDcsICJGIik7CiAgICB9CiAgICBmdW5jdGlvbiBoZWFkZXJCYW5kKHRpdGxlLCBzdWIpIHsKICAgICAgdmFyIGJhbmRIID0gMTUwLCBzdGVwcyA9IDYwOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBzOyBpKyspIHsKICAgICAgICB2YXIgdCA9IGkgLyAoc3RlcHMgLSAxKSwgciwgZzIsIGI7CiAgICAgICAgaWYgKHQgPCAwLjUpIHsgdmFyIGsgPSB0IC8gMC41OyByID0gSU5LWzBdICsgKElOSzJbMF0gLSBJTktbMF0pICogazsgZzIgPSBJTktbMV0gKyAoSU5LMlsxXSAtIElOS1sxXSkgKiBrOyBiID0gSU5LWzJdICsgKElOSzJbMl0gLSBJTktbMl0pICogazsgfQogICAgICAgIGVsc2UgeyB2YXIgazIgPSAodCAtIDAuNSkgLyAwLjU7IHIgPSBJTksyWzBdICsgKFBMVU1bMF0gLSBJTksyWzBdKSAqIGsyOyBnMiA9IElOSzJbMV0gKyAoUExVTVsxXSAtIElOSzJbMV0pICogazI7IGIgPSBJTksyWzJdICsgKFBMVU1bMl0gLSBJTksyWzJdKSAqIGsyOyB9CiAgICAgICAgZG9jLnNldEZpbGxDb2xvcihyLCBnMiwgYik7IGRvYy5yZWN0KGkgKiAoVyAvIHN0ZXBzKSwgMCwgVyAvIHN0ZXBzICsgMSwgYmFuZEgsICJGIik7CiAgICAgIH0KICAgICAgcm9zZShXIC8gMiwgNDYsIDIyKTsKICAgICAgZG9jLnNldFRleHRDb2xvcihCTFVTT0ZUWzBdLCBCTFVTT0ZUWzFdLCBCTFVTT0ZUWzJdKTsgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJib2xkIik7IGRvYy5zZXRGb250U2l6ZSg4LjUpOwogICAgICBkb2MudGV4dCgiQSBNSU5EU0VUIFJFRkxFQ1RJT04gRk9SIEVEVUNBVE9SUyIsIFcgLyAyLCA5MiwgeyBhbGlnbjogImNlbnRlciIsIGNoYXJTcGFjZTogMS41IH0pOwogICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwgMjU1LCAyNTUpOyBkb2Muc2V0Rm9udFNpemUoMjMpOwogICAgICBkb2MudGV4dCh0aXRsZSwgVyAvIDIsIDExOCwgeyBhbGlnbjogImNlbnRlciIgfSk7CiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMjEzLCAyMTcsIDIyNik7IGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAibm9ybWFsIik7IGRvYy5zZXRGb250U2l6ZSg5LjUpOwogICAgICBkb2MudGV4dChzdWIsIFcgLyAyLCAxMzgsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwogICAgICByZXR1cm4gYmFuZEg7CiAgICB9CiAgICBmdW5jdGlvbiBiYWRnZShudW0sIHgsIHkpIHsKICAgICAgZG9jLnNldERyYXdDb2xvcihNQUdbMF0sIE1BR1sxXSwgTUFHWzJdKTsgZG9jLnNldExpbmVXaWR0aCgxKTsKICAgICAgZG9jLnJvdW5kZWRSZWN0KHgsIHkgLSAxMiwgMzAsIDE1LCA3LjUsIDcuNSwgIlMiKTsKICAgICAgZG9jLnNldFRleHRDb2xvcihNQUdbMF0sIE1BR1sxXSwgTUFHWzJdKTsgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJib2xkIik7IGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgZG9jLnRleHQobnVtLCB4ICsgMTUsIHkgLSAxLjUsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwogICAgfQoKICAgIHZhciBkYXRlID0gbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoImVuLUdCIiwgeyBkYXk6ICJudW1lcmljIiwgbW9udGg6ICJsb25nIiwgeWVhcjogIm51bWVyaWMiIH0pOwogICAgdmFyIHkgPSBoZWFkZXJCYW5kKCJUaGUgTWluZHNldCBUZWFjaGluZyBDb21wYXNzIiwgIllvdXIgcmVzdWx0cyBcdTAwYjcgIiArIGRhdGUpICsgMjA7CiAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgIml0YWxpYyIpOyBkb2Muc2V0VGV4dENvbG9yKFNPRlRbMF0sIFNPRlRbMV0sIFNPRlRbMl0pOyBkb2Muc2V0Rm9udFNpemUoOCk7CiAgICBkb2MudGV4dCgiQmFzZWQgb24gdGhlIHdvcmsgb2YgQW5kZXJzb24gKDIwMTcpLCBEd2VjayAoMjAxNiksIEdhcmNcdTAwZWRhLCBUZWphZGEsIGFuZCBSYW1cdTAwZWRyZXogKDIwMjMpLCBhbmQgUmFtXHUwMGVkcmV6ICgyMDI0KS4iLCBXIC8gMiwgeSwgeyBhbGlnbjogImNlbnRlciIgfSk7CiAgICB5ICs9IDIwOwogICAgdHJ5IHsKICAgICAgdmFyIGltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Yy1yYWRhciIpLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7CiAgICAgIGRvYy5hZGRJbWFnZShpbWcsICJQTkciLCAoVyAtIDI4NikgLyAyLCB5LCAyODYsIDI4Nik7IHkgKz0gMzAwOwogICAgfSBjYXRjaCAoZSkgeyB5ICs9IDg7IH0KCiAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgImJvbGQiKTsgZG9jLnNldFRleHRDb2xvcihJTktbMF0sIElOS1sxXSwgSU5LWzJdKTsgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgIGRvYy50ZXh0KCJIb3cgdG8gcmVhZCB5b3VyIGNvbXBhc3MiLCBXIC8gMiwgeSwgeyBhbGlnbjogImNlbnRlciIgfSk7IHkgKz0gMTg7CiAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgIm5vcm1hbCIpOyBkb2Muc2V0VGV4dENvbG9yKFRFWFRbMF0sIFRFWFRbMV0sIFRFWFRbMl0pOyBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgWyJUaGUgc2hhcGUgYWJvdmUgaXMgY2FsbGVkIGEgc3BpZGVyIGNoYXJ0LiBJdCBzaG93cyBvbmUgcG9pbnQgZm9yIGVhY2ggb2YgdGhlIHRlbiBzaXR1YXRpb25zLiBQb2ludHMgY2xvc2VyIHRvIHRoZSBjZW50ZXIgbGVhbiB0b3dhcmQgYSBmaXhlZCB2aWV3LCBhbmQgcG9pbnRzIHJlYWNoaW5nIG91dHdhcmQgbGVhbiB0b3dhcmQgZ3Jvd3RoLiAoQSBmaXhlZCB2aWV3IHNlZXMgYWJpbGl0eSBhcyBzZXQ7IGEgZ3Jvd3RoIHZpZXcgc2VlcyBpdCBhcyBzb21ldGhpbmcgdGhhdCBjYW4ga2VlcCBkZXZlbG9waW5nLikgVG9nZXRoZXIsIHRoZSBwb2ludHMgc2hvdyB3aGVyZSB5b3Ugc3RhbmQgdG9kYXksIGFsbCBhdCBvbmNlLiIsCiAgICAgICJCZWxvdywgeW91J2xsIGZpbmQgZWFjaCBzaXR1YXRpb24gYWdhaW4sIG51bWJlcmVkIDAxIHRvIDEwLCBhbG9uZyB3aXRoIHRoZSByZXNwb25zZSB5b3UgY2hvc2UuIFRoZSB3b3JkIG9uIHRoZSByaWdodCAoRml4ZWQtbGVhbmluZywgTWl4ZWQsIG9yIEdyb3d0aC1sZWFuaW5nKSBzaG93cyB3aGVyZSB5b3VyIGFuc3dlciBsYW5kZWQgb24gdGhhdCBzY2FsZSwgZnJvbSBhIGZpeGVkIG1pbmRzZXQgdG8gYSBncm93dGggb25lLiBOZWl0aGVyIGVuZCBpcyBhIGdyYWRlOyBpdCdzIGp1c3QgYSBwb2ludCBvZiByZWZlcmVuY2UuIiwKICAgICAgIldpdGggZWFjaCBzaXR1YXRpb24gdGhlcmUncyBhbHNvIGEgcmVmbGVjdGlvbiBxdWVzdGlvbiwgbWF0Y2hlZCB0byB3aGVyZSB5b3UgbGFuZGVkLiBUaGVzZSBhcmVuJ3QgdGVzdHMsIGFuZCB0aGVyZSBhcmUgbm8gcmlnaHQgYW5zd2Vycy4gVGhleSdyZSBzaW1wbHkgaGVyZSB0byB0aGluayBhYm91dC4gWW91IG1pZ2h0IGpvdCBhIGZldyBub3RlcyBvbiBwYXBlciwgc2l0IHF1aWV0bHkgd2l0aCB0aGUgb25lcyB0aGF0IHNwZWFrIHRvIHlvdSwgb3IgdGFsayB0aGVtIG92ZXIgd2l0aCBhIGNvbGxlYWd1ZSB5b3UgdHJ1c3QuIgogICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgIHZhciBsaW5lcyA9IGRvYy5zcGxpdFRleHRUb1NpemUocCwgVyAtIDIgKiBNKTsKICAgICAgZG9jLnRleHQobGluZXMsIE0sIHkpOyB5ICs9IGxpbmVzLmxlbmd0aCAqIDEzICsgOTsKICAgIH0pOwoKICAgIGRvYy5hZGRQYWdlKCk7IHkgPSA1NjsKICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAiYm9sZCIpOyBkb2Muc2V0VGV4dENvbG9yKElOS1swXSwgSU5LWzFdLCBJTktbMl0pOyBkb2Muc2V0Rm9udFNpemUoMTYpOwogICAgZG9jLnRleHQoIllvdXIgcmVzdWx0cywgc2l0dWF0aW9uIGJ5IHNpdHVhdGlvbiIsIE0sIHkpOyB5ICs9IDEwOwogICAgZG9jLnNldERyYXdDb2xvcihNQUdbMF0sIE1BR1sxXSwgTUFHWzJdKTsgZG9jLnNldExpbmVXaWR0aCgyKTsgZG9jLmxpbmUoTSwgeSwgTSArIDQ2LCB5KTsgeSArPSAyNDsKCiAgICBDQVRTLmZvckVhY2goZnVuY3Rpb24gKGNhdCwgaWR4KSB7CiAgICAgIHZhciB0ID0gdGllck9mKGFbY2F0LmtleV0pOwogICAgICB2YXIgbnVtID0gKCIwIiArIChpZHggKyAxKSkuc2xpY2UoLTIpOwogICAgICB2YXIgY2hvc2VuTGluZXMgPSBkb2Muc3BsaXRUZXh0VG9TaXplKGNhdC5zdGF0ZW1lbnRzW2FbY2F0LmtleV0gLSAxXSwgVyAtIDIgKiBNIC0gMTQpOwogICAgICB2YXIgcUxpbmVzID0gZG9jLnNwbGl0VGV4dFRvU2l6ZShjYXQucmVmbGVjdGlvbnNbdF0sIFcgLSAyICogTSAtIDE0KTsKICAgICAgaWYgKHkgKyA3NiArIGNob3NlbkxpbmVzLmxlbmd0aCAqIDEyICsgcUxpbmVzLmxlbmd0aCAqIDEyID4gSCAtIDUwKSB7IGRvYy5hZGRQYWdlKCk7IHkgPSA1NjsgfQogICAgICBiYWRnZShudW0sIE0sIHkgKyAyKTsKICAgICAgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJib2xkIik7IGRvYy5zZXRUZXh0Q29sb3IoSU5LWzBdLCBJTktbMV0sIElOS1syXSk7IGRvYy5zZXRGb250U2l6ZSgxMyk7CiAgICAgIGRvYy50ZXh0KGNhdC5uYW1lLCBNICsgNDAsIHkpOwogICAgICBkb2Muc2V0VGV4dENvbG9yKEJMVVswXSwgQkxVWzFdLCBCTFVbMl0pOyBkb2Muc2V0Rm9udFNpemUoOC41KTsKICAgICAgZG9jLnRleHQoVElFUl9MQUJFTFt0XS50b1VwcGVyQ2FzZSgpLCBXIC0gTSwgeSwgeyBhbGlnbjogInJpZ2h0IiwgY2hhclNwYWNlOiAwLjUgfSk7CiAgICAgIHkgKz0gMTg7CiAgICAgIHZhciB0b3AgPSB5IC0gNDsKICAgICAgZG9jLnNldFRleHRDb2xvcihNQUdbMF0sIE1BR1sxXSwgTUFHWzJdKTsgZG9jLnNldEZvbnRTaXplKDgpOwogICAgICBkb2MudGV4dCgiWU9VUiBSRVNQT05TRSIsIE0gKyAxNCwgeSArIDQsIHsgY2hhclNwYWNlOiAwLjggfSk7IHkgKz0gMTI7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAibm9ybWFsIik7IGRvYy5zZXRUZXh0Q29sb3IoVEVYVFswXSwgVEVYVFsxXSwgVEVYVFsyXSk7IGRvYy5zZXRGb250U2l6ZSgxMC41KTsKICAgICAgZG9jLnRleHQoY2hvc2VuTGluZXMsIE0gKyAxNCwgeSArIDQpOyB5ICs9IGNob3NlbkxpbmVzLmxlbmd0aCAqIDEyICsgMTA7CiAgICAgIHZhciBsYmwgPSAiQSBRVUVTVElPTiBUTyBTSVQgV0lUSCI7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAiYm9sZCIpOyBkb2Muc2V0Rm9udFNpemUoOCk7CiAgICAgIHZhciBsdyA9IGRvYy5nZXRUZXh0V2lkdGgobGJsKSwgYmFzZSA9IHkgKyA0OwogICAgICBkb2Muc2V0RmlsbENvbG9yKFZJT0xFVFswXSwgVklPTEVUWzFdLCBWSU9MRVRbMl0pOwogICAgICBkb2Mucm91bmRlZFJlY3QoTSArIDksIGJhc2UgLSA5LjQsIGx3ICsgMTAsIDEyLjYsIDIsIDIsICJGIik7CiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMjU1LCAyNTUsIDI1NSk7IGRvYy50ZXh0KGxibCwgTSArIDE0LCBiYXNlKTsKICAgICAgeSArPSAxNDsKICAgICAgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJub3JtYWwiKTsgZG9jLnNldFRleHRDb2xvcihURVhUWzBdLCBURVhUWzFdLCBURVhUWzJdKTsgZG9jLnNldEZvbnRTaXplKDEwLjUpOwogICAgICBkb2MudGV4dChxTGluZXMsIE0gKyAxNCwgeSArIDQpOyB5ICs9IHFMaW5lcy5sZW5ndGggKiAxMiArIDY7CiAgICAgIGRvYy5zZXREcmF3Q29sb3IoTUFHWzBdLCBNQUdbMV0sIE1BR1syXSk7IGRvYy5zZXRMaW5lV2lkdGgoMi41KTsgZG9jLmxpbmUoTSArIDQsIHRvcCwgTSArIDQsIHkpOwogICAgICB5ICs9IDIwOwogICAgfSk7CgogICAgdmFyIHBhZ2VzID0gZG9jLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKTsKICAgIGZvciAodmFyIHAgPSAxOyBwIDw9IHBhZ2VzOyBwKyspIHsKICAgICAgZG9jLnNldFBhZ2UocCk7CiAgICAgIGRvYy5zZXREcmF3Q29sb3IoMjI4LCAyMjgsIDIzMSk7IGRvYy5zZXRMaW5lV2lkdGgoMC41KTsgZG9jLmxpbmUoTSwgSCAtIDM4LCBXIC0gTSwgSCAtIDM4KTsKICAgICAgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJub3JtYWwiKTsgZG9jLnNldFRleHRDb2xvcigxNTAsIDE1MCwgMTUwKTsgZG9jLnNldEZvbnRTaXplKDcuNSk7CiAgICAgIGRvYy50ZXh0KCJUaGUgTWluZHNldCBUZWFjaGluZyBDb21wYXNzIFx1MDBiNyBtYXJ0aGFyYW1pcmV6LmNvbS5jbyBcdTAwYjcgRnJlZSB0byBzaGFyZSBmb3IgaW5kaXZpZHVhbCBhbmQgZWR1Y2F0aW9uYWwgdXNlIiwgTSwgSCAtIDI0KTsKICAgICAgZG9jLnRleHQocCArICIgLyAiICsgcGFnZXMsIFcgLSBNLCBIIC0gMjQsIHsgYWxpZ246ICJyaWdodCIgfSk7CiAgICB9CiAgICBkb2Muc2F2ZSgiTXktVGVhY2hpbmctQ29tcGFzcy1SZXN1bHRzLnBkZiIpOwogIH0KCiAgLyogLS0tLS0tLS0tLSByb2J1c3QgV29yZFByZXNzL2Zyb250LWVuZCBpbml0IC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBpbml0Q29tcGFzcygpIHsKICAgIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGMtcm9vdCIpOwogICAgaWYgKCFyb290KSByZXR1cm47CiAgICBhdHRhY2hSb290RXZlbnRzKCk7CiAgICBsb2FkU2F2ZWQoKTsKICAgIHJlbmRlcigpOwogIH0KCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGluaXRDb21wYXNzLCB7IG9uY2U6dHJ1ZSB9KTsKICB9IGVsc2UgewogICAgaW5pdENvbXBhc3MoKTsKICB9Cn0pKCk7Cg==