The Mindset Teaching Compass: A Reflection Tool for EducatorsBy Martha Ramirez / July 13, 2026 Loading The Mindset Teaching Compass… KGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CgogIC8qIC0tLS0tLS0tLS0geW91ciBkYXRhIHNvdXJjZSAtLS0tLS0tLS0tICovCiAgdmFyIFNIRUVUX0VORFBPSU5UX1VSTCA9ICJodHRwczovL3NjcmlwdC5nb29nbGUuY29tL21hY3Jvcy9zL0FLZnljYnhveEJobjZkS21fa2lXQmM1RjNYTTNSMU5PajhHOW0tWFFTcVJ5TmtETkdxYnFyUEZYNlNkMFdEUUVuQXdiYWl2bTRRL2V4ZWMiOwogIHZhciBTVE9SRV9LRVkgPSAidGMtY29tcGFzcy1wcm9ncmVzcyI7CgogIHZhciBSQU1QID0gWyIjMDA5MEM3IiwgIiMzRTZDQzQiLCAiIzhCNEJCRSIsICIjQzIyQkE1IiwgIiNFQjAwOEIiXTsKCiAgdmFyIENBVFMgPSBbCiAgICB7IGtleToid29ybGRfdmlzaW9uIiwgbmFtZToiV29ybGQgVmlzaW9uIiwKICAgICAgZGVzYzoiUGVyY2VwdGlvbiBvZiB5b3VyIGNhcGFjaXR5IHRvIGNoYW5nZSBhbmQgZ3JvdyBhcyBhbiBlZHVjYXRvciwgaW5jbHVkaW5nIHlvdXIgdGVhY2hpbmcgaWRlbnRpdHksIG91dGxvb2ssIGFuZCBwb3RlbnRpYWwgaW4gdGhlIGNsYXNzcm9vbS4gVGhpcyBjb25jZXB0IGFkZHJlc3NlcyB3aGV0aGVyIHlvdSBzZWUgeW91ciBwcm9mZXNzaW9uYWwgZ3Jvd3RoLCBhbmQgeW91ciB2aWV3IG9mIHlvdXJzZWxmIGFzIGEgdGVhY2hlciwgYXMgYSBjb250aW51b3VzIG9yIGxpbWl0ZWQgcHJvY2Vzcy4iLAogICAgICBzdGF0ZW1lbnRzOlsKICAgICAgICAiTXkgdGVhY2hpbmcgYWJpbGl0eSBpcyBmaXhlZC4gSSBoYXZlIGEgY2VydGFpbiB3YXkgb2YgdGVhY2hpbmcsIGFuZCB0aGF0IGlzIHNpbXBseSB3aG8gSSBhbSBhcyBhbiBlZHVjYXRvci4iLAogICAgICAgICJBIGZldyBwYXJ0cyBvZiBteSB0ZWFjaGluZyBjb3VsZCBpbXByb3ZlLCBidXQgSSBzdGlsbCBjb25zaWRlciBteSBvdmVyYWxsIGFwcHJvYWNoIHNldC4iLAogICAgICAgICJJJ20gb3BlbiB0byBncm93aW5nIGluIHBhcnRzIG9mIG15IHRlYWNoaW5nLCBhcyBsb25nIGFzIGl0IGRvZXNuJ3QgdG91Y2ggd2hhdCBJIGNvbnNpZGVyIGNvcmUgdG8gd2hvIEkgYW0gYXMgYW4gZWR1Y2F0b3IuIiwKICAgICAgICAiSSBhbGxvdyBteXNlbGYgdG8gZ3JvdyBldmVuIGluIHRoZSBwYXJ0cyBvZiBteSB0ZWFjaGluZyB0aGF0IG9uY2UgZmVsdCBsaWtlIGNvcmUgdG8gd2hvIEkgYW0uIiwKICAgICAgICAiSSdtIHdpbGxpbmcgdG8gcXVlc3Rpb24gYW5kIGNoYW5nZSBldmVuIHRoZSBwYXJ0cyBvZiBteSB0ZWFjaGluZyBJIG9uY2UgYmVsaWV2ZWQgd2VyZSBzaW1wbHkgd2hvIEkgYW0gYXMgYW4gZWR1Y2F0b3IuIl0sCiAgICAgIHJlZmxlY3Rpb25zOlsKICAgICAgICAiV2hlcmUgaW4geW91ciB0ZWFjaGluZyBsaWZlIGRvZXMgdGhpcyBiZWxpZWYgc2hvdyB1cCBtb3N0PyIsCiAgICAgICAgIldoaWNoIHBhcnRzIG9mIHlvdXIgdGVhY2hpbmcgZG8geW91IGNvbnNpZGVyIG9wZW4gdG8gY2hhbmdlLCBhbmQgd2hpY2ggZG8geW91IGtlZXAgb2ZmLWxpbWl0cz8gV2hhdCdzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbT8iLAogICAgICAgICJXaGF0IHdvdWxkIHNvbWVvbmUgd2hvJ3Mgd2F0Y2hlZCB5b3UgdGVhY2ggZm9yIHllYXJzIHNheSBoYXMgYWN0dWFsbHkgY2hhbmdlZD8iXSB9LAogICAgeyBrZXk6ImVmZm9ydCIsIG5hbWU6IkVmZm9ydCIsCiAgICAgIGRlc2M6IlBlcmNlcHRpb24gb2YgY29uc2lzdGVudCB3b3JrIGFuZCBkZWRpY2F0aW9uIGFzIGtleSBmYWN0b3JzIGZvciBnZW5lcmF0aW5nIGNoYW5nZSBhbmQgYWNoaWV2aW5nIGdvYWxzIGluIHlvdXIgdGVhY2hpbmcgcHJhY3RpY2UuIFRoaXMgY29uY2VwdCBleHBsb3JlcyB3aGV0aGVyIGVmZm9ydCBpcyBzZWVuIGFzIGFuIGVmZmVjdGl2ZSBtZWFucyBvZiBpbXByb3ZpbmcgaW5zdHJ1Y3Rpb25hbCBza2lsbHMgYW5kIG92ZXJjb21pbmcgY2xhc3Nyb29tIGNoYWxsZW5nZXMuIiwKICAgICAgc3RhdGVtZW50czpbCiAgICAgICAgIkkgZG9uJ3QgYmVsaWV2ZSBlZmZvcnQgbWFrZXMgbXVjaCBkaWZmZXJlbmNlIGluIGhvdyBnb29kIGEgdGVhY2hlciBJIGFtLiBFaXRoZXIgSSBhbSBuYXR1cmFsbHkgZ29vZCBhdCBpdCwgb3IgSSdtIG5vdC4iLAogICAgICAgICJJIGtub3cgZWZmb3J0IGNhbiBoZWxwIGEgbGl0dGxlLCBidXQgSSBkb24ndCB0aGluayBpdCBjaGFuZ2VzIG11Y2ggYWJvdXQgbXkgdGVhY2hpbmcgaW4gYW55IHJlYWwgd2F5LiIsCiAgICAgICAgIkkgcHV0IGluIGVmZm9ydCB0byBjaGFuZ2UgbXkgcHJhY3RpY2UsIGJ1dCBtb3N0bHkgd2hlbiBJIGNhbiBzZWUgaXQgd2lsbCBwYXkgb2ZmIGZhaXJseSBxdWlja2x5LiIsCiAgICAgICAgIkkgcHV0IGluIGVmZm9ydCB0byBjaGFuZ2UgbXkgcHJhY3RpY2UgZXZlbiB3aGVuIEkgZG9uJ3Qga25vdyBpZiBpdCB3aWxsIHBheSBvZmYgcmlnaHQgYXdheS4iLAogICAgICAgICJJIGtlZXAgcHV0dGluZyBpbiBlZmZvcnQsIGV2ZW4gaW4gdGhlIGFyZWFzIHdoZXJlIEkgb25jZSBiZWxpZXZlZCBJIGRpZG4ndCBuZWVkIHRvLiJdLAogICAgICByZWZsZWN0aW9uczpbCiAgICAgICAgIklzIHRoZXJlIGFuIGFyZWEgb2YgeW91ciBwcmFjdGljZSB3aGVyZSB5b3UndmUgcXVpZXRseSBzdG9wcGVkIHRyeWluZz8iLAogICAgICAgICJXaGVyZSBhcmUgeW91IHdpbGxpbmcgdG8gcHV0IGluIGVmZm9ydCwgYW5kIHdoZXJlIGhhdmUgeW91IHF1aWV0bHkgc3RvcHBlZD8iLAogICAgICAgICJXaGF0IGVmZm9ydCBoYXZlIHlvdSBwdXQgaW50byB5b3VyIHRlYWNoaW5nIHJlY2VudGx5IHRoYXQgeW91J3JlIHByb3VkIG9mLCBhbmQgd2hhdCBtYWRlIGl0IHdvcnRoIHRoZSB3b3JrPyJdIH0sCiAgICB7IGtleToiY2hhbGxlbmdlcyIsIG5hbWU6IkNoYWxsZW5nZXMiLAogICAgICBkZXNjOiJQZXJjZXB0aW9uIG9mIGhvdyB0byBkZWFsIHdpdGggZGlmZmljdWx0IHRlYWNoaW5nIHNpdHVhdGlvbnMgb3Igc2l0dWF0aW9ucyBvdXRzaWRlIHlvdXIgY29tZm9ydCB6b25lIGFzIGFuIGVkdWNhdG9yLiBUaGlzIGluY2x1ZGVzIGEgd2lsbGluZ25lc3MgdG8gYXBwcm9hY2ggdGhlc2UgY2hhbGxlbmdlcyBhcyBvcHBvcnR1bml0aWVzIGZvciBwcm9mZXNzaW9uYWwgZGV2ZWxvcG1lbnQsIG9yIGEgdGVuZGVuY3kgdG8gYXZvaWQgdGhlbS4iLAogICAgICBzdGF0ZW1lbnRzOlsKICAgICAgICAiV2hlbiBzb21ldGhpbmcgaW4gbXkgdGVhY2hpbmcgcHVzaGVzIG1lIG91dHNpZGUgbXkgY29tZm9ydCB6b25lLCBJIGF2b2lkIGl0IHdoZW5ldmVyIHBvc3NpYmxlLiIsCiAgICAgICAgIkNoYWxsZW5nZXMgbWFrZSBtZSB1bmNvbWZvcnRhYmxlLCBhbmQgSSB1c3VhbGx5IGF2b2lkIHRoZW0sIGV2ZW4gdGhvdWdoIEkga25vdyBJIHNob3VsZG4ndC4iLAogICAgICAgICJJIGZhY2UgYSB0ZWFjaGluZyBjaGFsbGVuZ2UsIGJ1dCBvbmx5IGlmIEkgYmVsaWV2ZSBJIGNhbiBoYW5kbGUgaXQuIiwKICAgICAgICAiSSBmYWNlIHRlYWNoaW5nIGNoYWxsZW5nZXMgZXZlbiB3aGVuIEknbSBub3Qgc3VyZSBJIGNhbiBoYW5kbGUgdGhlbS4iLAogICAgICAgICJJIHNlZWsgb3V0IHRoZSB0ZWFjaGluZyBjaGFsbGVuZ2VzIEknZCBub3JtYWxseSBhdm9pZCwgZXZlbiBrbm93aW5nIEkgbWlnaHQgZmFpbCBhdCB0aGVtLiJdLAogICAgICByZWZsZWN0aW9uczpbCiAgICAgICAgIklzIHRoZXJlIGEgdGVhY2hpbmcgY2hhbGxlbmdlIHlvdSd2ZSBiZWVuIGF2b2lkaW5nPyBXaGF0J3MgdGhlIGNvc3Qgb2YgY29udGludWluZyB0byBhdm9pZCBpdD8iLAogICAgICAgICJXaGVyZSBkbyB5b3UgZHJhdyB0aGUgbGluZSBiZXR3ZWVuIGEgY2hhbGxlbmdlIHdvcnRoIGZhY2luZyBhbmQgb25lIHlvdSdkIHJhdGhlciBza2lwPyIsCiAgICAgICAgIldoYXQncyBhIHJlY2VudCBjaGFsbGVuZ2UgdGhhdCBjaGFuZ2VkIGhvdyB5b3UgdGVhY2g/Il0gfSwKICAgIHsga2V5OiJjb2xsZWFndWVfc3VjY2VzcyIsIG5hbWU6IkNvbGxlYWd1ZXMnIFN1Y2Nlc3MiLAogICAgICBkZXNjOiJUaGUgZW1vdGlvbmFsIGFuZCBhdHRpdHVkaW5hbCByZWFjdGlvbiB0byBvdGhlciBjb2xsZWFndWVzJyBhY2hpZXZlbWVudHMgYW5kIHN1Y2Nlc3MsIGluY2x1ZGluZyBob3cgeW91IGhhbmRsZSB0aGUgY29tcGFyaXNvbnMgdGhhdCBhcmlzZSBmcm9tIG9ic2VydmluZyB0aGVpciBwcm9ncmVzcy4iLAogICAgICBzdGF0ZW1lbnRzOlsKICAgICAgICAiQSBjb2xsZWFndWUncyBzdWNjZXNzIG1ha2VzIG1lIHVuY29tZm9ydGFibGUsIGFuZCBJIHRyeSB0byBhdm9pZCBzaXR1YXRpb25zIHdoZXJlIEkgbWlnaHQgYmUgY29tcGFyZWQgdG8gdGhlbS4iLAogICAgICAgICJBIGNvbGxlYWd1ZSdzIHN1Y2Nlc3Mgc3RpbGwgbWFrZXMgbWUgdW5jb21mb3J0YWJsZSwgYnV0IEkgcmVjb2duaXplIGl0IGNhbiB0ZWFjaCBtZSBzb21ldGhpbmcuIiwKICAgICAgICAiSSBsZWFybiBmcm9tIGEgY29sbGVhZ3VlJ3Mgc3VjY2VzcyB3aGVuIGl0J3MgaW4gc29tZXRoaW5nIEknbSBub3QgdHJ5aW5nIHRvIGFjaGlldmUgbXlzZWxmOyB3aGVuIGl0J3MgaW4gbXkgb3duIGZpZWxkLCBpdCdzIGhhcmRlciBmb3IgbWUuIiwKICAgICAgICAiRXZlbiB3aGVuIGEgY29sbGVhZ3VlIHN1Y2NlZWRzIGluIG15IG93biBmaWVsZCwgSSBhc2sgbXlzZWxmIGhvdyB0aGV5IGRpZCBpdCBhbmQgd2hhdCBJIGNhbiBsZWFybiBmcm9tIGl0LiIsCiAgICAgICAgIkknbSBpbnNwaXJlZCBieSBteSBjb2xsZWFndWVzJyBzdWNjZXNzLCBhbmQgSSByZWFjaCBvdXQgdG8gdGhlbSB0byBncm93IHRvZ2V0aGVyLCBldmVuIHdoZW4gSSBoYXZlbid0IHlldCBhY2hpZXZlZCB3aGF0IHRoZXkgaGF2ZS4iXSwKICAgICAgcmVmbGVjdGlvbnM6WwogICAgICAgICJXaGVuIGEgY29sbGVhZ3VlIGlzIHJlY29nbml6ZWQgZm9yIHNvbWV0aGluZywgd2hhdCdzIHRoZSBmaXJzdCBmZWVsaW5nIHRoYXQgc2hvd3MgdXAgZm9yIHlvdT8gRG9lcyB0aGF0IGZlZWxpbmcgdGVsbCB5b3Ugc29tZXRoaW5nIGFib3V0IHRoZW0sIG9yIHNvbWV0aGluZyBhYm91dCB5b3U/IiwKICAgICAgICAiV2hhdCBraW5kIG9mIGNvbGxlYWd1ZSBzdWNjZXNzIGlzIGVhc3kgZm9yIHlvdSB0byBjZWxlYnJhdGUsIGFuZCB3aGF0IGtpbmQgaXNuJ3Q/IiwKICAgICAgICAiV2hvJ3MgYSBjb2xsZWFndWUgeW91IGFjdGl2ZWx5IGxlYXJuIGZyb20gcmlnaHQgbm93LCBhbmQgd2hhdCB3b3VsZCBpdCBsb29rIGxpa2UgdG8gdGVsbCB0aGVtLCBkaXJlY3RseSwgd2hhdCB0aGVpciBzdWNjZXNzIGhhcyB0YXVnaHQgeW91PyJdIH0sCiAgICB7IGtleToiZGlmZmljdWx0aWVzIiwgbmFtZToiRGlmZmljdWx0aWVzIGFuZCBPYnN0YWNsZXMiLAogICAgICBkZXNjOiJQZXJjZXB0aW9uIG9mIGhvdyBiYXJyaWVycyBhbmQgc2V0YmFja3MgaW4geW91ciB0ZWFjaGluZyBwcmFjdGljZSAoZS5nLiBhIGxlc3NvbiB0aGF0IGRvZXNuJ3QgbGFuZCBvciBhIGRpZmZpY3VsdCBzZW1lc3RlcikgYXJlIGhhbmRsZWQgYWxvbmcgdGhlIHdheS4iLAogICAgICBzdGF0ZW1lbnRzOlsKICAgICAgICAiV2hlbiBhbiBvYnN0YWNsZSBhcHBlYXJzLCBJIHRlbmQgdG8gZ2l2ZSB1cCBiZWNhdXNlIEkgYmVsaWV2ZSBJIGNhbid0IGNoYW5nZSB0aGUgc2l0dWF0aW9uLiIsCiAgICAgICAgIkkgcmVjb2duaXplIEkgY291bGQgb3ZlcmNvbWUgb2JzdGFjbGVzLCBidXQgd2hlbiB0aGV5IGFwcGVhciwgSSB3YWl0IHRvIHNlZSBpZiB0aGV5IHJlc29sdmUgb24gdGhlaXIgb3duLiIsCiAgICAgICAgIkkga2VlcCBnb2luZyB3aGVuIHRoZSBvYnN0YWNsZSBkZXBlbmRzIG9uIG1lOyBpZiBpdCBkZXBlbmRzIG9uIG90aGVyIHBlb3BsZSBvciBjaXJjdW1zdGFuY2VzLCBJIGxlYXZlIGl0IHRoZXJlLiIsCiAgICAgICAgIldoZW4gYW4gb2JzdGFjbGUgYXBwZWFycywgSSBsb29rIGZvciBhIHdheSB0byBtb3ZlIGZvcndhcmQgZXZlbiBpZiBpdCBkb2Vzbid0IGRlcGVuZCBvbmx5IG9uIG1lLiIsCiAgICAgICAgIldoZW4gYW4gb2JzdGFjbGUgYmxvY2tzIG15IHBhdGgsIEkgZmluZCBhbm90aGVyIHdheSB0aHJvdWdoLCBldmVuIHdoZW4gaXQncyBzbG93ZXIgb3IgaGFyZGVyIHRoYW4gc2ltcGx5IHdhaXRpbmcgZm9yIHRoaW5ncyB0byBjaGFuZ2UuIl0sCiAgICAgIHJlZmxlY3Rpb25zOlsKICAgICAgICAiVGhpbmsgb2YgYSB0ZWFjaGluZyBzaXR1YXRpb24gd2hlcmUgeW91IGdhdmUgdXAuIFdoYXQgd291bGQgaXQgaGF2ZSB0YWtlbiBmb3IgeW91IHRvIGtlZXAgZ29pbmc/IiwKICAgICAgICAiSXMgdGhlcmUgYSBzZXRiYWNrIHlvdSdyZSBzdGlsbCBkZWNpZGluZyB3aGV0aGVyIHRvIHB1c2ggdGhyb3VnaCBvciBsZXQgZ28gb2Y/IFdoYXQncyBtYWtpbmcgdGhhdCBkZWNpc2lvbiBoYXJkIHRvIGxhbmQgb24/IiwKICAgICAgICAiV2hhdCBzdXN0YWlucyB5b3VyIHBlcnNpc3RlbmNlIGluIHRoZSBoYXJkZXN0IHN0cmV0Y2hlcz8iXSB9LAogICAgeyBrZXk6Im1pc3Rha2VzIiwgbmFtZToiTWFraW5nIE1pc3Rha2VzIiwKICAgICAgZGVzYzoiUGVyY2VwdGlvbiBhbmQgbWFuYWdlbWVudCBvZiB0aGUgbWlzdGFrZXMgeW91IG1ha2UgaW4geW91ciB0ZWFjaGluZywgYW5kIGhvdyB5b3UgaGFuZGxlIHRoZW0gYmVpbmcgc2Vlbiwgd2hldGhlciBieSBzdHVkZW50cywgY29sbGVhZ3VlcywgYWRtaW5pc3RyYXRvcnMsIG9yIHBhcmVudHMuIiwKICAgICAgc3RhdGVtZW50czpbCiAgICAgICAgIkkgaGlkZSBvciBkb3ducGxheSBteSBtaXN0YWtlcyBiZWNhdXNlIHRoZXkgbWFrZSBtZSBmZWVsIGluc2VjdXJlIG9yIGV4cG9zZWQgaW4gZnJvbnQgb2Ygb3RoZXJzIChlLmcuIHN0dWRlbnRzLCBjb2xsZWFndWVzLCBwYXJlbnRzLCBldGMuKS4iLAogICAgICAgICJJIG1ha2UgZXhjdXNlcyBvciBwb2ludCB0byBleHRlcm5hbCBmYWN0b3JzLCBiZWNhdXNlIGFkbWl0dGluZyB0aGF0IGEgbWlzdGFrZSB3YXMgbWluZSBmZWVscyB3b3JzZSB0aGFuIHRoZSBtaXN0YWtlIGl0c2VsZi4iLAogICAgICAgICJJIGFkbWl0IGEgbWlzdGFrZSB3aGVuIGl0J3Mgc21hbGwgb3IgZWFzeSB0byBmaXg7IGlmIGl0J3MgYmlnZ2VyIG9yIG1vcmUgdmlzaWJsZSwgSSBzdGlsbCBzdHJ1Z2dsZSB0byBvd24gaXQuIiwKICAgICAgICAiV2hlbiBJIG1ha2UgYSBtaXN0YWtlLCBldmVuIGEgYmlnIG9yIHZpc2libGUgb25lLCBJIHJlZmxlY3Qgb24gaXQgYW5kIHRoaW5rIGFib3V0IHdoYXQgSSdkIGRvIGRpZmZlcmVudGx5LiIsCiAgICAgICAgIldoZW4gSSBtYWtlIGEgbWlzdGFrZSwgSSByZWNvZ25pemUgaXQgaW4gdGltZSBhbmQgY29ycmVjdCBpdCwgZXZlbiB3aGVuIGl0IHRha2VzIGV4dHJhIGVmZm9ydCBJIGhhZG4ndCBwbGFubmVkIGZvci4iXSwKICAgICAgcmVmbGVjdGlvbnM6WwogICAgICAgICJXaGVuIHlvdSBtYWtlIGEgbWlzdGFrZSBpbiBmcm9udCBvZiBzb21lb25lLCB3aGF0J3MgdGhlIHN0b3J5IHlvdSB0ZWxsIHlvdXJzZWxmIGFib3V0IHdoYXQgaXQgbWVhbnM/IFdoYXQncyB0aGUgbmFycmF0aXZlIHRoYXQga2lja3MgaW4gcmlnaHQgYWZ0ZXIgdGhhdCBmZWVsaW5nIGhpdHM/IiwKICAgICAgICAiSXMgdGhlcmUgYSBraW5kIG9mIG1pc3Rha2UgeW91IGNhbiBhY2NlcHQgZWFzaWx5LCBhbmQgb25lIHlvdSBjYW4ndD8iLAogICAgICAgICJXaGF0J3MgYSBtaXN0YWtlIHRoYXQgdGF1Z2h0IHlvdSBzb21ldGhpbmcgeW91IHN0aWxsIHVzZT8iXSB9LAogICAgeyBrZXk6InNlZWtpbmdfaGVscCIsIG5hbWU6IlNlZWtpbmcgSGVscCBhbmQgTWVudG9yc2hpcCIsCiAgICAgIGRlc2M6IldpbGxpbmduZXNzIHRvIHNlZWsgb3IgcmVjZWl2ZSBleHRlcm5hbCBzdXBwb3J0IGZvciB5b3VyIHRlYWNoaW5nIHByYWN0aWNlLCBzdWNoIGFzIG1lbnRvcnNoaXAsIGNvYWNoaW5nLCBvciBwZWVyIGd1aWRhbmNlLiIsCiAgICAgIHN0YXRlbWVudHM6WwogICAgICAgICJJIGF2b2lkIGFza2luZyBmb3IgaGVscCBiZWNhdXNlIEkgZG9uJ3Qgd2FudCBteSBmbGF3cyB0byBiZSBvYnZpb3VzLiIsCiAgICAgICAgIkkga25vdyBhc2tpbmcgZm9yIGhlbHAgaXMgdmFsaWQsIGJ1dCBJIHByZWZlciB0byBtYW5hZ2Ugb24gbXkgb3duIHNvIEkgZG9uJ3QgaW5jb252ZW5pZW5jZSBhbnlvbmUuIiwKICAgICAgICAiSSBhc2sgZm9yIGhlbHAgb25seSB3aGVuIEkndmUgZXhoYXVzdGVkIGV2ZXJ5dGhpbmcgSSBjb3VsZCBkbyBvbiBteSBvd24uIiwKICAgICAgICAiSSBhc2sgZm9yIGhlbHAgd2hlbiBJIG5lZWQgaXQsIHdpdGhvdXQgd2FpdGluZyB1bnRpbCBJJ20gYXQgbXkgbGltaXQuIiwKICAgICAgICAiSSBhc2sgZm9yIGhlbHAgd2l0aCBzb21ldGhpbmcgSSdtIHN1cHBvc2VkIHRvIGhhdmUgbWFzdGVyZWQsIGV2ZW4gd2hlbiBpdCBtZWFucyBhZG1pdHRpbmcsIG91dCBsb3VkLCB0aGF0IEkgZG9uJ3QgaGF2ZSBpdCBmaWd1cmVkIG91dC4iXSwKICAgICAgcmVmbGVjdGlvbnM6WwogICAgICAgICJXaGF0J3MgdGhlIHN0b3J5IHlvdSB0ZWxsIHlvdXJzZWxmIGFib3V0IG5lZWRpbmcgc3VwcG9ydCBvciBhc2tpbmcgZm9yIGhlbHA/IiwKICAgICAgICAiV2hhdCBtYWtlcyB5b3UgZGVjaWRlIGEgcHJvYmxlbSBpcyB5b3VycyB0byBzb2x2ZSB2ZXJzdXMgb25lIHdvcnRoIGFza2luZyBhYm91dD8gSXMgdGhhdCBkZWNpc2lvbiBhYm91dCB0aGUgcHJvYmxlbSBpdHNlbGYsIG9yIGFib3V0IHdoYXQgYXNraW5nIHdvdWxkIHNheSBhYm91dCB5b3UgYXMgYSBwZXJzb24/IiwKICAgICAgICAiV2hvIGRvIHlvdSBnbyB0byBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIHN1cHBvcnQsIGFuZCBpcyB0aGF0IGNpcmNsZSB3aWRlIGVub3VnaD8iXSB9LAogICAgeyBrZXk6ImZlZWRiYWNrIiwgbmFtZToiQ3JpdGljaXNtIGFuZCBGZWVkYmFjayIsCiAgICAgIGRlc2M6IlJlc3BvbnNlIHRvIGNvbnN0cnVjdGl2ZSBmZWVkYmFjayBvciBjcml0aWNpc20gb24geW91ciB0ZWFjaGluZyBmcm9tIGRpZmZlcmVudCBtZW1iZXJzIG9mIHRoZSBlZHVjYXRpb25hbCBjb21tdW5pdHksIGluY2x1ZGluZyBjbGFzc3Jvb20gb2JzZXJ2YXRpb25zIGFuZCBmb3JtYWwgZXZhbHVhdGlvbnMuIiwKICAgICAgc3RhdGVtZW50czpbCiAgICAgICAgIldoZW4gSSdtIGNyaXRpY2l6ZWQgYWJvdXQgbXkgdGVhY2hpbmcsIEkgdGFrZSBpdCBwZXJzb25hbGx5IGFuZCBmZWVsIGxpa2UgaXQncyBhbiBhdHRhY2ssIHNvIEkgZG9uJ3QgZ2l2ZSBhbnkgd2VpZ2h0IHRvIHdoYXQncyBzYWlkLiIsCiAgICAgICAgIkkgbGlzdGVuIHRvIGZlZWRiYWNrIGFuZCBldmVuIHJlY29nbml6ZSBpdCBtaWdodCBiZSByaWdodCwgYnV0IEkgcmFyZWx5IGNoYW5nZSBob3cgSSB0ZWFjaC4iLAogICAgICAgICJJIG1ha2UgdXNlIG9mIGZlZWRiYWNrIHdoZW4gaXQncyBkZWxpdmVyZWQgd2VsbDsgaWYgSSBkb24ndCBsaWtlIHRoZSB0b25lIG9mIGFuIG9ic2VydmF0aW9uIG9yIGV2YWx1YXRpb24sIEkgZm9jdXMgb24gaG93IGl0IHdhcyBzYWlkIGluc3RlYWQgb2Ygd2hhdCB3YXMgc2FpZC4iLAogICAgICAgICJJIG1ha2UgdXNlIG9mIGZlZWRiYWNrIGV2ZW4gd2hlbiBJIGRvbid0IGxpa2UgaG93IGl0IHdhcyBkZWxpdmVyZWQsIGJlY2F1c2UgSSBzZXBhcmF0ZSB0aGUgZGVsaXZlcnkgZnJvbSB0aGUgY29udGVudC4iLAogICAgICAgICJJIHNlZWsgb3V0IGZlZWRiYWNrIGZyb20gY29sbGVhZ3Vlcywgc3R1ZGVudHMsIG9yIHN1cGVydmlzb3JzLCBldmVuIHdoZW4gSSBrbm93IHRoZXkgd2lsbCBwb2ludCBvdXQgdGhpbmdzIEkgZG9uJ3Qgd2FudCB0byBoZWFyLiJdLAogICAgICByZWZsZWN0aW9uczpbCiAgICAgICAgIldoYXQgZG9lcyBjcml0aWNhbCBmZWVkYmFjayB1c3VhbGx5IGZlZWwgbGlrZSB0aGUgbW9tZW50IHlvdSBoZWFyIGl0LCByZWdhcmRsZXNzIG9mIHdobyBpdCBjb21lcyBmcm9tPyIsCiAgICAgICAgIldoZW4gd2FzIHRoZSBsYXN0IHRpbWUgeW91IGFjdGl2ZWx5IGFza2VkIHNvbWVvbmUgZm9yIGZlZWRiYWNrPyIsCiAgICAgICAgIldoYXQncyB0aGUgYmVzdCBwaWVjZSBvZiBmZWVkYmFjayB5b3UndmUgcmVjZWl2ZWQgdGhhdCBzaWduaWZpY2FudGx5IGNoYW5nZWQgeW91ciB0ZWFjaGluZz8iXSB9LAogICAgeyBrZXk6ImV4cGVydGlzZSIsIG5hbWU6IkV4cGVydGlzZSIsCiAgICAgIGRlc2M6IlBlcmNlcHRpb24gb2YgeW91ciBvd24gbGV2ZWwgb2YgcGVkYWdvZ2ljYWwga25vd2xlZGdlIGFuZCBza2lsbCwgaW5jbHVkaW5nIG9wZW5uZXNzIHRvIGtlZXAgbGVhcm5pbmcgbmV3IG1ldGhvZHMsIGNvbnRlbnQsIGFuZCB0b29scyB0aHJvdWdob3V0IHlvdXIgY2FyZWVyLiIsCiAgICAgIHN0YXRlbWVudHM6WwogICAgICAgICJJIGJlbGlldmUgSSBhbHJlYWR5IGhhdmUgYWxsIHRoZSBrbm93bGVkZ2UgSSBuZWVkLCBzbyBJIGRvbid0IGZlZWwgdGhlIG5lZWQgdG8ga2VlcCBsZWFybmluZy4iLAogICAgICAgICJJIHJlY29nbml6ZSBJIGNvdWxkIGxlYXJuIG1vcmUsIGJ1dCBpdCdzIGhhcmQgZm9yIG1lIHRvIGFkbWl0IHRoZXJlIGFyZSBzdGlsbCBnYXBzIGluIG15IHN1YmplY3QgYXJlYS4iLAogICAgICAgICJJIHVwZGF0ZSBteSBrbm93bGVkZ2Ugd2hlbiBzb21ldGhpbmcgaW50ZXJlc3RzIG1lIG9yIGhhcyBhbiBpbW1lZGlhdGUgdXNlIGluIG15IGNsYXNzcm9vbTsgaWYgSSBkb24ndCBzZWUgYSBkaXJlY3QgYmVuZWZpdCwgSSBkb24ndCBib3RoZXIuIiwKICAgICAgICAiSSBsZWFybiB0aGluZ3MgYWhlYWQgb2YgdGltZSwgYmVmb3JlIEkgYWN0dWFsbHkgbmVlZCB0aGVtIGluIG15IHRlYWNoaW5nLiIsCiAgICAgICAgIkkgbGVhcm4gZnJvbSBhbnkgc291cmNlLCBldmVuIHdoZW4gaXQgY2hhbGxlbmdlcyBzb21ldGhpbmcgSSdkIGFsd2F5cyB0YWtlbiBmb3IgZ3JhbnRlZCBhYm91dCBob3cgdG8gdGVhY2guIl0sCiAgICAgIHJlZmxlY3Rpb25zOlsKICAgICAgICAiV2hhdCdzIGEgZGV2ZWxvcG1lbnQgaW4gdGVhY2hpbmcsIGEgbWV0aG9kLCBhIHRlY2hub2xvZ3ksIG9yIGEgcGllY2Ugb2YgcmVzZWFyY2gsIHRoYXQgeW91J3ZlIGRpc21pc3NlZCB3aXRob3V0IHJlYWxseSBsb29raW5nIGludG8gaXQ/IiwKICAgICAgICAiV2hlbiB3YXMgdGhlIGxhc3QgdGltZSB5b3UgdXBkYXRlZCBob3cgeW91IGRvIHNvbWV0aGluZyBpbiB5b3VyIHRlYWNoaW5nPyIsCiAgICAgICAgIldoYXQncyBzb21ldGhpbmcgbmV3IHlvdSd2ZSBsZWFybmVkIHJlY2VudGx5IHRoYXQgeW91J3ZlIGFscmVhZHkgdXNlZCB3aXRoIHN0dWRlbnRzPyBIYXZlIHlvdSBzaGFyZWQgb3IgdGF1Z2h0IGl0IHRvIGEgY29sbGVhZ3VlPyJdIH0sCiAgICB7IGtleToid2VsbGJlaW5nIiwgbmFtZToiV2VsbC1CZWluZyIsCiAgICAgIGRlc2M6IlRoZSBpbXBvcnRhbmNlIGdpdmVuIHRvIHlvdXIgcGh5c2ljYWwsIGVtb3Rpb25hbCwgYW5kIG1lbnRhbCBoZWFsdGggYXMgYSBmdW5kYW1lbnRhbCBwaWxsYXIgZm9yIGJhbGFuY2luZyB0aGUgcmVzcG9uc2liaWxpdGllcyBvZiB0ZWFjaGluZyBhbmQgc3VzdGFpbmluZyB5b3VyIHByYWN0aWNlIG92ZXIgdGltZS4iLAogICAgICBzdGF0ZW1lbnRzOlsKICAgICAgICAiV2hlbiBJIGRvbid0IGZlZWwgd2VsbCwgSSBiZWxpZXZlIHRoYXQncyBqdXN0IGhvdyBpdCBpcywgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggSSBjYW4gZG8gYWJvdXQgaXQuIiwKICAgICAgICAiSSBrbm93IEkgY291bGQgbGVhcm4gdG8gZmVlbCBiZXR0ZXIsIGJ1dCBJIHJhcmVseSBkbyBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSB3aGF0IEkgYWx3YXlzIGRvLiIsCiAgICAgICAgIkkgb25seSBwYXkgYXR0ZW50aW9uIHRvIGhvdyBJJ20gZmVlbGluZyBvbmNlIHRoaW5ncyBhcmUgYWxyZWFkeSBiYWQ7IGFzIGxvbmcgYXMgSSBjYW4gbWFuYWdlLCBJIHB1dCBpdCBvZmYuIiwKICAgICAgICAiSSB0YWtlIGNhcmUgb2YgaG93IEknbSBmZWVsaW5nIHJlZ3VsYXJseSwgd2l0aG91dCB3YWl0aW5nIHVudGlsIEknbSBhdCBteSBsaW1pdC4iLAogICAgICAgICJJIGNoYW5nZSB3aGF0J3Mgd2l0aGluIG15IGNvbnRyb2wgYW5kIGxldCBnbyBvZiB3aGF0IGlzbid0LCBldmVuIHdoZW4gaXQncyBoYXJkIHRvIGFkbWl0IHRoZSBkaWZmZXJlbmNlLiJdLAogICAgICByZWZsZWN0aW9uczpbCiAgICAgICAgIldoYXQgdGVuZHMgdG8gY29tZSBiZWZvcmUgeW91ciBvd24gd2VsbC1iZWluZyBvbiBhIHJlZ3VsYXIgd2Vlaz8iLAogICAgICAgICJXaGF0J3Mgb25lIHRoaW5nIHlvdSBhbHJlYWR5IGtub3cgd291bGQgaGVscCB5b3VyIHdlbGwtYmVpbmcgdGhhdCB5b3UgaGF2ZW4ndCBkb25lIGluIHRoZSBsYXN0IG1vbnRoPyBXaGF0J3Mgc3RvcHBpbmcgeW91PyIsCiAgICAgICAgIldoYXQncyBzb21ldGhpbmcgeW91IGRvIGZvciB5b3VyIHdlbGwtYmVpbmcgdGhhdCB5b3UnZCByZWNvbW1lbmQgdG8gYSBzdHJ1Z2dsaW5nIGNvbGxlYWd1ZT8gSG93IGFib3V0IHNoYXJpbmcgaXQsIGlmIHlvdSBoYXZlbid0IGFscmVhZHk/Il0gfQogIF07CgogIHZhciBUSUVSX0xBQkVMID0gWyJGaXhlZC1sZWFuaW5nIiwgIk1peGVkIiwgIkdyb3d0aC1sZWFuaW5nIl07CiAgdmFyIEFHRVMgPSBbIlVuZGVyIDI1IiwgIjI1IHRvIDM0IiwgIjM1IHRvIDQ0IiwgIjQ1IHRvIDU0IiwgIjU1IG9yIG9sZGVyIl07CiAgdmFyIEFHRV9WQUxTID0gWyJVbmRlciAyNSIsICIyNS0zNCIsICIzNS00NCIsICI0NS01NCIsICI1NSsiXTsKICB2YXIgR0VOREVSUyA9IFsiV29tYW4iLCAiTWFuIiwgIk5vbi1iaW5hcnkiLCAiUHJlZmVyIHRvIHNlbGYtZGVzY3JpYmUiLCAiUHJlZmVyIG5vdCB0byBzYXkiXTsKICB2YXIgR0VOREVSX1ZBTFMgPSBbIldvbWFuIiwgIk1hbiIsICJOb24tYmluYXJ5IiwgIlNlbGYtZGVzY3JpYmUiLCAiUHJlZmVyIG5vdCB0byBzYXkiXTsKICB2YXIgTEVWRUxTID0gWyJFYXJseSB5ZWFycyAvIFByZXNjaG9vbCIsICJQcmltYXJ5IiwgIlNlY29uZGFyeSIsICJIaWdoZXIgZWR1Y2F0aW9uIiwgIk90aGVyIl07CiAgdmFyIExFVkVMX1ZBTFMgPSBbIkVhcmx5IHllYXJzIiwgIlByaW1hcnkiLCAiU2Vjb25kYXJ5IiwgIkhpZ2hlciBlZHVjYXRpb24iLCAiT3RoZXIiXTsKCiAgZnVuY3Rpb24gdGllck9mKHMpIHsgcmV0dXJuIHMgPD0gMiA/IDAgOiAocyA9PT0gMyA/IDEgOiAyKTsgfQogIGZ1bmN0aW9uIGVzYyhzKSB7IHJldHVybiBTdHJpbmcocyA9PSBudWxsID8gIiIgOiBzKS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKTsgfQoKICAvKiAtLS0tLS0tLS0tIHN0YXRlIC0tLS0tLS0tLS0gKi8KICB2YXIgc3RhdGUgPSB7CiAgICBzY3JlZW46ICJpbnRybyIsIGlkeDogMCwgYW5zd2Vyczoge30sCiAgICBjdHg6IHsgYWdlOm51bGwsIGdlbmRlcjpudWxsLCBsb2NhdGlvbjoiIiwgeWVhcnM6IiIsIGxldmVsOm51bGwsIHN1YmplY3Q6IiIsIHNlbGZEZXNjOiIiIH0sCiAgICByZWZsOiB7IGZpeGVkOiIiLCBncm93dGg6IiIgfSwKICAgIHNoYXJlZDpmYWxzZSwgZG93bmxvYWRpbmc6ZmFsc2UsIHNhdmVkOm51bGwKICB9OwogIHZhciBjb3JlU2VudCA9IGZhbHNlLCBkZXRhaWxzU2VudCA9IGZhbHNlLCBzaWQgPSAiIjsKICB2YXIgcm9vdCA9IG51bGw7CgogIC8qIC0tLS0tLS0tLS0gcGVyc2lzdGVuY2UgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHBlcnNpc3QoKSB7CiAgICB0cnkgewogICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkVfS0VZLCBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgYW5zd2Vyczogc3RhdGUuYW5zd2VycywKICAgICAgICBpZHg6IHN0YXRlLmlkeCwKICAgICAgICBjdHg6IHN0YXRlLmN0eCwKICAgICAgICByZWZsOiBzdGF0ZS5yZWZsLAogICAgICAgIGF0OiBEYXRlLm5vdygpCiAgICAgIH0pKTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQogIGZ1bmN0aW9uIGNsZWFyU3RvcmUoKSB7IHRyeSB7IHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SRV9LRVkpOyB9IGNhdGNoIChlKSB7fSB9CiAgZnVuY3Rpb24gbG9hZFNhdmVkKCkgewogICAgdHJ5IHsKICAgICAgdmFyIHJhdyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SRV9LRVkpOwogICAgICBpZiAocmF3KSB7CiAgICAgICAgdmFyIGQgPSBKU09OLnBhcnNlKHJhdyk7CiAgICAgICAgaWYgKGQgJiYgZC5hbnN3ZXJzICYmIE9iamVjdC5rZXlzKGQuYW5zd2VycykubGVuZ3RoKSBzdGF0ZS5zYXZlZCA9IGQ7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICAvKiAtLS0tLS0tLS0tIEdvb2dsZSBTaGVldCBsb2dnaW5nOiBPTkUgcmVxdWVzdCBwZXIgcGFydGljaXBhbnQgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHBvc3QoYm9keSwga2VlcGFsaXZlKSB7CiAgICBpZiAoIVNIRUVUX0VORFBPSU5UX1VSTCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7CiAgICB0cnkgewogICAgICByZXR1cm4gZmV0Y2goU0hFRVRfRU5EUE9JTlRfVVJMLCB7CiAgICAgICAgbWV0aG9kOiJQT1NUIiwKICAgICAgICBtb2RlOiJuby1jb3JzIiwKICAgICAgICBrZWVwYWxpdmU6ICEha2VlcGFsaXZlLAogICAgICAgIGhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgiIH0sCiAgICAgICAgYm9keTogYm9keQogICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZW5kU3VibWlzc2lvbigpIHsKICAgIGlmIChjb3JlU2VudCB8fCAhU0hFRVRfRU5EUE9JTlRfVVJMKSByZXR1cm47CiAgICBjb3JlU2VudCA9IHRydWU7CiAgICBzaWQgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KSArICItIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDkpOwoKICAgIHZhciBjID0gc3RhdGUuY3R4LCBhID0gc3RhdGUuYW5zd2VycywgciA9IHN0YXRlLnJlZmw7CiAgICB2YXIgZyA9IChjLmdlbmRlciA9PT0gIlNlbGYtZGVzY3JpYmUiICYmIGMuc2VsZkRlc2MpID8gYy5zZWxmRGVzYyA6IGMuZ2VuZGVyOwogICAgdmFyIHBheWxvYWQgPSB7CiAgICAgIHNpZDogc2lkLAogICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgeWVhcnM6IGMueWVhcnMsCiAgICAgIGxldmVsOiBjLmxldmVsLAogICAgICBnZW5kZXI6IGcsCiAgICAgIGxvY2F0aW9uOiBjLmxvY2F0aW9uLAogICAgICBhZ2U6IGMuYWdlLAogICAgICBzdWJqZWN0OiBjLnN1YmplY3QsCiAgICAgIHJlZmxlY3Rpb25fZml4ZWQ6IHIuZml4ZWQsCiAgICAgIHJlZmxlY3Rpb25fZ3Jvd3RoOiByLmdyb3d0aAogICAgfTsKICAgIENBVFMuZm9yRWFjaChmdW5jdGlvbiAoY2F0LCBpKSB7IHBheWxvYWRbInMiICsgKGkgKyAxKV0gPSBhW2NhdC5rZXldOyB9KTsKCiAgICBwb3N0KEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLCBmYWxzZSk7CiAgfQoKICAvKiAtLS0tLS0tLS0tIGxvY2FsIGFjdGlvbnM6IG5vIGdsb2JhbCB3aW5kb3cgb2JqZWN0IC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBiZWdpbkNvbXBhc3MoKSB7CiAgICBjbGVhclN0b3JlKCk7CiAgICBzdGF0ZS5zYXZlZCA9IG51bGw7CiAgICBzdGF0ZS5hbnN3ZXJzID0ge307CiAgICBzdGF0ZS5pZHggPSAwOwogICAgc3RhdGUuY3R4ID0geyBhZ2U6bnVsbCwgZ2VuZGVyOm51bGwsIGxvY2F0aW9uOiIiLCB5ZWFyczoiIiwgbGV2ZWw6bnVsbCwgc3ViamVjdDoiIiwgc2VsZkRlc2M6IiIgfTsKICAgIHN0YXRlLnJlZmwgPSB7IGZpeGVkOiIiLCBncm93dGg6IiIgfTsKICAgIGdvKCJhc3Nlc3MiKTsKICB9CiAgZnVuY3Rpb24gcmVzdW1lQ29tcGFzcygpIHsKICAgIHZhciBzID0gc3RhdGUuc2F2ZWQgfHwge307CiAgICBzdGF0ZS5hbnN3ZXJzID0gcy5hbnN3ZXJzIHx8IHt9OwogICAgc3RhdGUuaWR4ID0gdHlwZW9mIHMuaWR4ID09PSAibnVtYmVyIiA/IHMuaWR4IDogMDsKICAgIGlmIChzLmN0eCkgc3RhdGUuY3R4ID0gcy5jdHg7CiAgICBpZiAocy5yZWZsKSBzdGF0ZS5yZWZsID0gcy5yZWZsOwogICAgZ28oImFzc2VzcyIpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlU2NvcmVVSShzY29yZSkgewogICAgdmFyIHJhZGlvcyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdGMtc2NvcmVdIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhZGlvcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaXRlbSA9IHJhZGlvc1tpXTsKICAgICAgdmFyIHZhbHVlID0gcGFyc2VJbnQoaXRlbS5nZXRBdHRyaWJ1dGUoImRhdGEtdGMtc2NvcmUiKSwgMTApOwogICAgICB2YXIgb24gPSB2YWx1ZSA9PT0gc2NvcmU7CiAgICAgIHZhciBjb2wgPSBSQU1QW3ZhbHVlIC0gMV07CiAgICAgIHZhciBwYXJ0cyA9IGl0ZW0ucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpOwoKICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgIGl0ZW0udGFiSW5kZXggPSBvbiA/IDAgOiAtMTsKICAgICAgaXRlbS5zdHlsZS5ib3JkZXJDb2xvciA9IG9uID8gInZhcigtLW1hZykiIDogInZhcigtLWJvcmRlcikiOwogICAgICBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSBvbiA/ICJ2YXIoLS1wYW5lbDIpIiA6ICIjZmZmIjsKICAgICAgaXRlbS5zdHlsZS5ib3hTaGFkb3cgPSBvbiA/ICIwIDAgMCA0cHggcmdiYSgyMzUsMCwxMzksMC4xNikiIDogIm5vbmUiOwoKICAgICAgaWYgKHBhcnRzWzBdKSB7CiAgICAgICAgcGFydHNbMF0uc3R5bGUuYmFja2dyb3VuZCA9IG9uID8gY29sIDogIiNmZmYiOwogICAgICAgIHBhcnRzWzBdLnN0eWxlLmNvbG9yID0gb24gPyAiI2ZmZiIgOiBjb2w7CiAgICAgIH0KICAgICAgaWYgKHBhcnRzWzFdKSBwYXJ0c1sxXS5zdHlsZS5mb250V2VpZ2h0ID0gb24gPyAiNzAwIiA6ICI0MDAiOwogICAgfQoKICAgIHZhciBuZXh0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10Yy1hY3Rpb249Im5leHQiXScpOwogICAgaWYgKG5leHQpIG5leHQuZGlzYWJsZWQgPSBmYWxzZTsKICAgIHZhciBoaW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRjLWFzc2Vzcy1oaW50Iik7CiAgICBpZiAoaGludCkgaGludC50ZXh0Q29udGVudCA9ICIiOwogIH0KCiAgZnVuY3Rpb24gcGlja1Njb3JlKHNjb3JlKSB7CiAgICB2YXIgY2F0ID0gQ0FUU1tzdGF0ZS5pZHhdOwogICAgc3RhdGUuYW5zd2Vyc1tjYXQua2V5XSA9IHNjb3JlOwogICAgcGVyc2lzdCgpOwogICAgdXBkYXRlU2NvcmVVSShzY29yZSk7CiAgfQogIGZ1bmN0aW9uIHN0ZXBDb21wYXNzKGQpIHsKICAgIHZhciBuID0gc3RhdGUuaWR4ICsgZDsKICAgIGlmIChuIDwgMCkgeyBnbygiaW50cm8iKTsgcmV0dXJuOyB9CiAgICBpZiAobiA+PSBDQVRTLmxlbmd0aCkgeyBmaW5pc2hDb21wYXNzKCk7IHJldHVybjsgfQogICAgc3RhdGUuaWR4ID0gbjsgcGVyc2lzdCgpOyBnbyhzdGF0ZS5zY3JlZW4sIHRydWUpOwogIH0KICBmdW5jdGlvbiBqdW1wQ29tcGFzcyhpKSB7IHN0YXRlLmlkeCA9IGk7IGdvKHN0YXRlLnNjcmVlbiwgdHJ1ZSk7IH0KICBmdW5jdGlvbiBmaW5pc2hDb21wYXNzKCkgewogICAgdmFyIG1pc3NpbmcgPSAtMTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQ0FUUy5sZW5ndGg7IGkrKykgeyBpZiAoIXN0YXRlLmFuc3dlcnNbQ0FUU1tpXS5rZXldKSB7IG1pc3NpbmcgPSBpOyBicmVhazsgfSB9CiAgICBpZiAobWlzc2luZyA+PSAwKSB7IHN0YXRlLmlkeCA9IG1pc3Npbmc7IGdvKCJhc3Nlc3MiLCB0cnVlKTsgcmV0dXJuOyB9CiAgICAvKiBLZWVwIHRoZSBhbnN3ZXJzIGxvY2FsbHkgdW50aWwgdGhlIHBhcnRpY2lwYW50IGRlbGliZXJhdGVseSByZXN0YXJ0cy4gKi8KICAgIHBlcnNpc3QoKTsKICAgIGdvKCJkZXRhaWxzIik7CiAgfQogIGZ1bmN0aW9uIGJhY2tUb0Fzc2VzcygpIHsgc3RhdGUuaWR4ID0gQ0FUUy5sZW5ndGggLSAxOyBwZXJzaXN0KCk7IGdvKCJhc3Nlc3MiKTsgfQoKICBmdW5jdGlvbiB1cGRhdGVDb250ZXh0QnV0dG9ucyhrLCB2KSB7CiAgICB2YXIgYnV0dG9ucyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdGMtY3R4LWtleV0iKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYnRuID0gYnV0dG9uc1tpXTsKICAgICAgaWYgKGJ0bi5nZXRBdHRyaWJ1dGUoImRhdGEtdGMtY3R4LWtleSIpID09PSBrKSB7CiAgICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgYnRuLmdldEF0dHJpYnV0ZSgiZGF0YS10Yy1jdHgtdmFsdWUiKSA9PT0gdiA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZXRDb250ZXh0KGssIHYpIHsKICAgIHN0YXRlLmN0eFtrXSA9IHY7CiAgICBwZXJzaXN0KCk7CiAgICB1cGRhdGVDb250ZXh0QnV0dG9ucyhrLCB2KTsKICAgIC8qIE9ubHkgZ2VuZGVyIG5lZWRzIGEgc21hbGwgc3RydWN0dXJhbCByZWZyZXNoIHRvIHNob3cvaGlkZSBzZWxmLWRlc2NyaXB0aW9uLiAqLwogICAgaWYgKGsgPT09ICJnZW5kZXIiKSByZW5kZXIoKTsKICB9CgogIGZ1bmN0aW9uIHNldFJlZmxlY3Rpb24oaywgdikgewogICAgc3RhdGUucmVmbFtrXSA9IHY7CiAgICBwZXJzaXN0KCk7CiAgICByZW5kZXJDb3VudGVycygpOwogIH0KCiAgZnVuY3Rpb24gc3luY0RldGFpbHNGcm9tRE9NKCkgewogICAgdmFyIGlucHV0cyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdGMtaW5wdXRdIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICBzdGF0ZS5jdHhbaW5wdXRzW2ldLmdldEF0dHJpYnV0ZSgiZGF0YS10Yy1pbnB1dCIpXSA9IGlucHV0c1tpXS52YWx1ZS50cmltKCk7CiAgICB9CiAgICB2YXIgcmVmbCA9IHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdGMtcmVmbF0iKTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVmbC5sZW5ndGg7IGorKykgewogICAgICBzdGF0ZS5yZWZsW3JlZmxbal0uZ2V0QXR0cmlidXRlKCJkYXRhLXRjLXJlZmwiKV0gPSByZWZsW2pdLnZhbHVlOwogICAgfQogICAgcGVyc2lzdCgpOwogIH0KCiAgZnVuY3Rpb24gc3VibWl0RGV0YWlscygpIHsKICAgIGlmIChjb3JlU2VudCkgcmV0dXJuOwogICAgc3luY0RldGFpbHNGcm9tRE9NKCk7CiAgICBzZW5kU3VibWlzc2lvbigpOwogICAgc3RhdGUuc2hhcmVkID0gdHJ1ZTsKICAgIC8qIExvY2FsIGJhY2t1cCByZW1haW5zIGF2YWlsYWJsZTsgUmVzdGFydCBjbGVhcnMgaXQuICovCiAgICBnbygicmVzdWx0cyIpOwogIH0KICBmdW5jdGlvbiByZXN0YXJ0Q29tcGFzcygpIHsKICAgIGNvcmVTZW50ID0gZmFsc2U7IGRldGFpbHNTZW50ID0gZmFsc2U7IHNpZCA9ICIiOwogICAgY2xlYXJTdG9yZSgpOwogICAgc3RhdGUgPSB7IHNjcmVlbjoiaW50cm8iLCBpZHg6MCwgYW5zd2Vyczp7fSwgc2F2ZWQ6bnVsbCwgc2hhcmVkOmZhbHNlLAogICAgICBjdHg6eyBhZ2U6bnVsbCwgZ2VuZGVyOm51bGwsIGxvY2F0aW9uOiIiLCB5ZWFyczoiIiwgbGV2ZWw6bnVsbCwgc3ViamVjdDoiIiwgc2VsZkRlc2M6IiIgfSwKICAgICAgcmVmbDp7IGZpeGVkOiIiLCBncm93dGg6IiIgfSB9OwogICAgZ28oImludHJvIik7CiAgfQogIGZ1bmN0aW9uIGRvd25sb2FkUmVzdWx0cygpIHsKICAgIC8qIEF2b2lkIGR5bmFtaWMgc2NyaXB0IGluamVjdGlvbiBvbiBXb3JkUHJlc3MgZnJvbnQtZW5kLiAqLwogICAgd2luZG93LnByaW50KCk7CiAgfQoKCiAgLyogLS0tLS0tLS0tLSBXb3JkUHJlc3Mtc2FmZSBkZWxlZ2F0ZWQgZXZlbnRzIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBhdHRhY2hSb290RXZlbnRzKCkgewogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHZhciBlbDsKCiAgICAgIGVsID0gZS50YXJnZXQuY2xvc2VzdCgiW2RhdGEtdGMtc2NvcmVdIik7CiAgICAgIGlmIChlbCAmJiByb290LmNvbnRhaW5zKGVsKSkgewogICAgICAgIHBpY2tTY29yZShwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoImRhdGEtdGMtc2NvcmUiKSwgMTApKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGVsID0gZS50YXJnZXQuY2xvc2VzdCgiW2RhdGEtdGMtanVtcF0iKTsKICAgICAgaWYgKGVsICYmIHJvb3QuY29udGFpbnMoZWwpKSB7CiAgICAgICAganVtcENvbXBhc3MocGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXRjLWp1bXAiKSwgMTApKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGVsID0gZS50YXJnZXQuY2xvc2VzdCgiW2RhdGEtdGMtY3R4LWtleV0iKTsKICAgICAgaWYgKGVsICYmIHJvb3QuY29udGFpbnMoZWwpKSB7CiAgICAgICAgc2V0Q29udGV4dChlbC5nZXRBdHRyaWJ1dGUoImRhdGEtdGMtY3R4LWtleSIpLCBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtdGMtY3R4LXZhbHVlIikpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZWwgPSBlLnRhcmdldC5jbG9zZXN0KCJbZGF0YS10Yy1hY3Rpb25dIik7CiAgICAgIGlmICghZWwgfHwgIXJvb3QuY29udGFpbnMoZWwpKSByZXR1cm47CgogICAgICB2YXIgYWN0aW9uID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXRjLWFjdGlvbiIpOwogICAgICBpZiAoYWN0aW9uID09PSAiYmVnaW4iKSBiZWdpbkNvbXBhc3MoKTsKICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAicmVzdW1lIikgcmVzdW1lQ29tcGFzcygpOwogICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICJwcmV2aW91cyIpIHN0ZXBDb21wYXNzKC0xKTsKICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAibmV4dCIgJiYgIWVsLmRpc2FibGVkKSBzdGVwQ29tcGFzcygxKTsKICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAiYmFja1RvQXNzZXNzIikgYmFja1RvQXNzZXNzKCk7CiAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gInN1Ym1pdERldGFpbHMiKSBzdWJtaXREZXRhaWxzKCk7CiAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gImRvd25sb2FkIikgZG93bmxvYWRSZXN1bHRzKCk7CiAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gInJlc3RhcnQiKSByZXN0YXJ0Q29tcGFzcygpOwogICAgfSk7CgogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyIGVsID0gZS50YXJnZXQuY2xvc2VzdCgiW2RhdGEtdGMtc2NvcmVdIik7CiAgICAgIGlmICghZWwgfHwgIXJvb3QuY29udGFpbnMoZWwpKSByZXR1cm47CiAgICAgIGlmIChlLmtleSA9PT0gIiAiIHx8IGUua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHBpY2tTY29yZShwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoImRhdGEtdGMtc2NvcmUiKSwgMTApKTsKICAgICAgfQogICAgfSk7CgogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZSkgewogICAgICB2YXIga2V5ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YS10Yy1pbnB1dCIpOwogICAgICBpZiAoa2V5KSB7CiAgICAgICAgc3RhdGUuY3R4W2tleV0gPSBlLnRhcmdldC52YWx1ZS50cmltKCk7CiAgICAgICAgcGVyc2lzdCgpOwogICAgICB9CiAgICB9KTsKCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyIGlucHV0S2V5ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YS10Yy1pbnB1dCIpOwogICAgICBpZiAoaW5wdXRLZXkpIHsKICAgICAgICBzdGF0ZS5jdHhbaW5wdXRLZXldID0gZS50YXJnZXQudmFsdWU7CiAgICAgICAgcGVyc2lzdCgpOwogICAgICB9CiAgICAgIHZhciByZWZsS2V5ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YS10Yy1yZWZsIik7CiAgICAgIGlmIChyZWZsS2V5KSBzZXRSZWZsZWN0aW9uKHJlZmxLZXksIGUudGFyZ2V0LnZhbHVlKTsKICAgIH0pOwoKICB9CgogIGZ1bmN0aW9uIGdvKHNjcmVlbiwgc2tpcFNjcm9sbCkgewogICAgc3RhdGUuc2NyZWVuID0gc2NyZWVuOyByZW5kZXIoKTsKICAgIGlmICghc2tpcFNjcm9sbCkgeyB0cnkgeyByb290LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBibG9jazogInN0YXJ0IiB9KTsgfSBjYXRjaCAoZSkge30gfQogIH0KCgogIC8qIC0tLS0tLS0tLS0ga2V5Ym9hcmQgbmF2IG9uIGFzc2VzcyBzY3JlZW4gLS0tLS0tLS0tLSAqLwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKHN0YXRlLnNjcmVlbiAhPT0gImFzc2VzcyIpIHJldHVybjsKICAgIHZhciB0ID0gZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZTsKICAgIGlmICh0ID09PSAiSU5QVVQiIHx8IHQgPT09ICJURVhUQVJFQSIpIHJldHVybjsKICAgIGlmIChlLmtleSA+PSAiMSIgJiYgZS5rZXkgPD0gIjUiKSB7IHBpY2tTY29yZShwYXJzZUludChlLmtleSwgMTApKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9CiAgICBlbHNlIGlmIChlLmtleSA9PT0gIkFycm93UmlnaHQiIHx8IGUua2V5ID09PSAiRW50ZXIiKSB7IGlmIChzdGF0ZS5hbnN3ZXJzW0NBVFNbc3RhdGUuaWR4XS5rZXldKSBzdGVwQ29tcGFzcygxKTsgfQogICAgZWxzZSBpZiAoZS5rZXkgPT09ICJBcnJvd0xlZnQiKSB7IHN0ZXBDb21wYXNzKC0xKTsgfQogIH0pOwoKICAvKiAtLS0tLS0tLS0tIHJvc2UgLyBjb21wYXNzIGljb24gLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIGNvbXBhc3NTVkcoc2l6ZSwgaWRTdWZmaXgpIHsKICAgIHZhciBnaWQgPSAidGNSaW5nIiArIGlkU3VmZml4OwogICAgcmV0dXJuICc8c3ZnIHZpZXdCb3g9IjAgMCAxMjAgMTIwIiB3aWR0aD0iJyArIHNpemUgKyAnIiBoZWlnaHQ9IicgKyBzaXplICsgJyIgYXJpYS1oaWRkZW49InRydWUiPicgKwogICAgICAnPGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSInICsgZ2lkICsgJyIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzAwOTBDNyIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0VCMDA4QiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPicgKwogICAgICAnPGNpcmNsZSBjeD0iNjAiIGN5PSI2MCIgcj0iNTIiIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCMnICsgZ2lkICsgJykiIHN0cm9rZS13aWR0aD0iMS41Ii8+JyArCiAgICAgICc8Y2lyY2xlIGN4PSI2MCIgY3k9IjYwIiByPSI0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzdjN2Q2IiBzdHJva2Utd2lkdGg9IjAuNzUiIG9wYWNpdHk9IjAuNyIvPicgKwogICAgICAnPGcgc3Ryb2tlPSIjZDRkNGRjIiBzdHJva2Utd2lkdGg9IjAuNzUiIG9wYWNpdHk9IjAuOCI+PGxpbmUgeDE9IjYwIiB5MT0iMTAiIHgyPSI2MCIgeTI9IjExMCIvPjxsaW5lIHgxPSIxMCIgeTE9IjYwIiB4Mj0iMTEwIiB5Mj0iNjAiLz48bGluZSB4MT0iMjUiIHkxPSIyNSIgeDI9Ijk1IiB5Mj0iOTUiLz48bGluZSB4MT0iOTUiIHkxPSIyNSIgeDI9IjI1IiB5Mj0iOTUiLz48L2c+JyArCiAgICAgICc8cG9seWdvbiBwb2ludHM9IjYwLDE2IDY3LDYwIDYwLDY2IDUzLDYwIiBmaWxsPSIjRUIwMDhCIi8+PHBvbHlnb24gcG9pbnRzPSI2MCwxMDQgNjcsNjAgNjAsNTQgNTMsNjAiIGZpbGw9IiMwMDkwQzciLz4nICsKICAgICAgJzxwb2x5Z29uIHBvaW50cz0iMTYsNjAgNjAsNTMgNjYsNjAgNjAsNjciIGZpbGw9IiM3Y2Q0ZmIiLz48cG9seWdvbiBwb2ludHM9IjEwNCw2MCA2MCw1MyA1NCw2MCA2MCw2NyIgZmlsbD0iI2ZmOGFjMiIvPicgKwogICAgICAnPGNpcmNsZSBjeD0iNjAiIGN5PSI2MCIgcj0iNCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTBlMGU2IiBzdHJva2Utd2lkdGg9IjAuNSIvPjwvc3ZnPic7CiAgfQoKICAvKiAtLS0tLS0tLS0tIHJlbmRlciAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgaWYgKHN0YXRlLnNjcmVlbiA9PT0gImludHJvIikgcm9vdC5pbm5lckhUTUwgPSByZW5kZXJJbnRybygpOwogICAgZWxzZSBpZiAoc3RhdGUuc2NyZWVuID09PSAiYXNzZXNzIikgcm9vdC5pbm5lckhUTUwgPSByZW5kZXJBc3Nlc3MoKTsKICAgIGVsc2UgaWYgKHN0YXRlLnNjcmVlbiA9PT0gImRldGFpbHMiKSByb290LmlubmVySFRNTCA9IHJlbmRlckRldGFpbHMoKTsKICAgIGVsc2UgaWYgKHN0YXRlLnNjcmVlbiA9PT0gInJlc3VsdHMiKSB7IHJvb3QuaW5uZXJIVE1MID0gcmVuZGVyUmVzdWx0cygpOyBkcmF3UmFkYXIoKTsgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVySW50cm8oKSB7CiAgICB2YXIgc2F2ZWRCbG9jayA9ICIiOwogICAgaWYgKHN0YXRlLnNhdmVkKSB7CiAgICAgIHNhdmVkQmxvY2sgPQogICAgICAgICc8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6NjQwcHg7bWFyZ2luOjIycHggYXV0byAwO2Rpc3BsYXk6ZmxleDtnYXA6MTRweDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47ZmxleC13cmFwOndyYXA7YmFja2dyb3VuZDp2YXIoLS1wYW5lbDIpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tcGFuZWxib3JkZXIpO2JvcmRlci1yYWRpdXM6MTJweDtwYWRkaW5nOjE2cHggMThweDsiPicgKwogICAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjE0cHg7Y29sb3I6dmFyKC0tdGV4dCk7Ij5Zb3UgaGF2ZSAnICsgT2JqZWN0LmtleXMoc3RhdGUuc2F2ZWQuYW5zd2VycyB8fCB7fSkubGVuZ3RoICsgJyBvZiAxMCBhbnN3ZXJzIHNhdmVkIG9uIHRoaXMgZGV2aWNlLjwvc3Bhbj4nICsKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0Yy1idG4tZ2hvc3QiIHN0eWxlPSJib3JkZXItY29sb3I6dmFyKC0tbWFnKTtjb2xvcjp2YXIoLS1tYWcpOyIgZGF0YS10Yy1hY3Rpb249InJlc3VtZSI+Q29udGludWUgd2hlcmUgSSBsZWZ0IG9mZjwvYnV0dG9uPjwvZGl2Pic7CiAgICB9CiAgICByZXR1cm4gJzxkaXYgY2xhc3M9InRjLWFuaW0gdGMtcmVzdWx0cy1zY3JlZW4iPicgKwogICAgICAnPGRpdiBjbGFzcz0idGMtcmVzdWx0cy1oZXJvIiBzdHlsZT0iYmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCMwMDkwQzcsI0VCMDA4Qik7Ym9yZGVyLXJhZGl1czoxNnB4O3BhZGRpbmc6NnB4OyI+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmYmZiZmM7Ym9yZGVyLXJhZGl1czoxMXB4O3BhZGRpbmc6NDBweCAyOHB4O3RleHQtYWxpZ246Y2VudGVyOyI+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW4tYm90dG9tOjE2cHg7Ij4nICsgY29tcGFzc1NWRyg5NiwgIkludHJvIikgKyAnPC9kaXY+JyArCiAgICAgICc8aDEgc3R5bGU9ImNvbG9yOnZhcigtLWluayk7Zm9udC1zaXplOjMycHg7bGluZS1oZWlnaHQ6MS4xMjtmb250LXdlaWdodDo3MDA7bWFyZ2luOjZweCAwIDlweDsiPlRoZSBNaW5kc2V0IFRlYWNoaW5nIENvbXBhc3M8L2gxPicgKwogICAgICAnPHAgc3R5bGU9ImNvbG9yOnZhcigtLXNvZnQpO2ZvbnQtc2l6ZToxNHB4O21heC13aWR0aDo1MjBweDttYXJnaW46MCBhdXRvOyI+QSByZWZsZWN0aW9uIHRvb2wgZm9yIGVkdWNhdG9ycyB0byBleHBsb3JlIHRoZWlyIG93biBtaW5kc2V0LjwvcD4nICsKICAgICAgJzwvZGl2PjwvZGl2PicgKwogICAgICAnPGRpdiBzdHlsZT0icGFkZGluZzozNHB4IDI0cHggNnB4OyI+JyArCiAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjE2cHg7Y29sb3I6dmFyKC0tdGV4dCk7bGluZS1oZWlnaHQ6MS42NTttYXgtd2lkdGg6NjQwcHg7bWFyZ2luOjAgYXV0bzsiPlRoaXMgdG9vbCB3YXMgY3JlYXRlZCBzbyB5b3UgY2FuIHBhdXNlIGFuZCB0aGluayBob25lc3RseSBhYm91dCBob3cgeW91IHNlZSB5b3Vyc2VsZiBhcyBhbiBlZHVjYXRvci4gSXRcJ3MgZ3JvdW5kZWQgaW4gcHN5Y2hvbG9naXN0IENhcm9sIER3ZWNrXCdzIHJlc2VhcmNoOiBhIGZpeGVkIG1pbmRzZXQgc2VlcyBhYmlsaXR5IGFzIHNvbWV0aGluZyBzZXQgaW4gcGxhY2UsIHdoaWxlIGEgZ3Jvd3RoIG1pbmRzZXQgc2VlcyBpdCBhcyBzb21ldGhpbmcgdGhhdCBrZWVwcyBkZXZlbG9waW5nIHdpdGggZWZmb3J0IGFuZCB0aW1lLiBBY3Jvc3MgdGVuIGV2ZXJ5ZGF5IHNpdHVhdGlvbnMgZGVzY3JpYmVkIGhlcmUsIGxpa2UgbWFraW5nIGEgbWlzdGFrZSwgcmVjZWl2aW5nIGZlZWRiYWNrLCBvciBmYWNpbmcgYSBkaWZmaWN1bHQgY2xhc3MsIHlvdVwnbGwgc2VlIHdoZXJlIHlvdSBjdXJyZW50bHkgc3RhbmQgYmV0d2VlbiB0aGUgdHdvLiBUaGlzIGlzblwndCBhIHRlc3QsIGp1c3QgYSBzcGFjZSBmb3IgcmVmbGVjdGlvbi4gV2UgYWxsIGNhcnJ5IGJvdGggbWluZHNldHMsIGFuZCB0aGlzIGlzIGEgY2hhbmNlIHRvIG5vdGljZSB3aGVyZSBlYWNoIG9uZSBzaG93cyB1cCBmb3IgeW91LjwvcD4nICsKICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTMuNXB4O2NvbG9yOnZhcigtLXRleHQpO2xpbmUtaGVpZ2h0OjEuNTU7bWF4LXdpZHRoOjY0MHB4O21hcmdpbjoxNnB4IGF1dG8gMDtwYWRkaW5nLXRvcDoxNHB4O2JvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Zm9udC1zdHlsZTppdGFsaWM7Ij5UaGlzIHRvb2wgaXMgYWxzbyBwYXJ0IG9mIG9uZ29pbmcgcmVzZWFyY2ggb24gdGVhY2hlciBtaW5kc2V0cywgYW5kIHlvdXIgYW5vbnltb3VzIGFuc3dlcnMgY29udHJpYnV0ZSB0byBvdXIga25vd2xlZGdlIGJhc2UuPC9wPicgKwogICAgICAnPC9kaXY+JyArIHNhdmVkQmxvY2sgKwogICAgICAnPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxNHB4IDAgMzRweDsiPicgKwogICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0Yy1idG4tcHJpbWFyeSIgZGF0YS10Yy1hY3Rpb249ImJlZ2luIj5CZWdpbiB0aGUgY29tcGFzczwvYnV0dG9uPicgKwogICAgICAnPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLXRleHQpO21hcmdpbjoxMnB4IDAgMDsiPk9uZSBzaXR1YXRpb24gYXQgYSB0aW1lLiBZb3UgY2FuIGdvIGJhY2sgYW5kIGNoYW5nZSBhbnkgYW5zd2VyLjwvcD4nICsKICAgICAgJzwvZGl2PjwvZGl2Pic7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJBc3Nlc3MoKSB7CiAgICB2YXIgY2F0ID0gQ0FUU1tzdGF0ZS5pZHhdLCBjaG9zZW4gPSBzdGF0ZS5hbnN3ZXJzW2NhdC5rZXldOwogICAgdmFyIHNlZ3MgPSBDQVRTLm1hcChmdW5jdGlvbiAoYywgaSkgewogICAgICB2YXIgaGVyZSA9IGkgPT09IHN0YXRlLmlkeCwgZG9uZSA9ICEhc3RhdGUuYW5zd2Vyc1tjLmtleV07CiAgICAgIHZhciBiZyA9IGhlcmUgPyAidmFyKC0taW5rKSIgOiAoZG9uZSA/ICJ2YXIoLS1tYWcpIiA6ICJ2YXIoLS1ib3JkZXIpIik7CiAgICAgIHJldHVybiAnPGJ1dHRvbiB0aXRsZT0iJyArIGVzYygoaSArIDEpICsgJy4gJyArIGMubmFtZSkgKyAnIiBhcmlhLWxhYmVsPSInICsgZXNjKChpICsgMSkgKyAnLiAnICsgYy5uYW1lKSArICciICcgKwogICAgICAgIChoZXJlID8gJ2FyaWEtY3VycmVudD0ic3RlcCInIDogJycpICsKICAgICAgICAnIHR5cGU9ImJ1dHRvbiIgZGF0YS10Yy1qdW1wPSInICsgaSArICciIHN0eWxlPSJmbGV4OjE7aGVpZ2h0OjVweDtib3JkZXItcmFkaXVzOjNweDtib3JkZXI6bm9uZTtwYWRkaW5nOjA7YmFja2dyb3VuZDonICsgYmcgKyAnO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnMgZWFzZTsiPjwvYnV0dG9uPic7CiAgICB9KS5qb2luKCIiKTsKICAgIHZhciBvcHRpb25zID0gY2F0LnN0YXRlbWVudHMubWFwKGZ1bmN0aW9uICh0ZXh0LCBpKSB7CiAgICAgIHZhciBvbiA9IGNob3NlbiA9PT0gaSArIDE7CiAgICAgIHZhciBjb2wgPSBSQU1QW2ldOwogICAgICByZXR1cm4gJzxkaXYgcm9sZT0icmFkaW8iIHRhYmluZGV4PSInICsgKChvbiB8fCAoIWNob3NlbiAmJiBpID09PSAwKSkgPyAiMCIgOiAiLTEiKSArICciIGFyaWEtY2hlY2tlZD0iJyArIG9uICsgJyIgJyArCiAgICAgICAgJ2RhdGEtdGMtc2NvcmU9IicgKyAoaSArIDEpICsgJyIgJyArCiAgICAgICAgJ3N0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtnYXA6MTRweDt3aWR0aDoxMDAlO3RleHQtYWxpZ246bGVmdDtjdXJzb3I6cG9pbnRlcjtib3JkZXI6MS41cHggc29saWQgJyArIChvbiA/ICJ2YXIoLS1tYWcpIiA6ICJ2YXIoLS1ib3JkZXIpIikgKyAnO2JhY2tncm91bmQ6JyArIChvbiA/ICJ2YXIoLS1wYW5lbDIpIiA6ICIjZmZmIikgKyAnO2JvcmRlci1yYWRpdXM6MTJweDtwYWRkaW5nOjE0cHggMTZweDttaW4taGVpZ2h0OjQ0cHg7JyArIChvbiA/ICJib3gtc2hhZG93OjAgMCAwIDRweCByZ2JhKDIzNSwwLDEzOSwwLjE2KTsiIDogIiIpICsgJyI+JyArCiAgICAgICAgJzxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZmxleC1zaHJpbms6MDt3aWR0aDozNHB4O2hlaWdodDozNHB4O2JvcmRlci1yYWRpdXM6NTAlO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo3MDA7Ym9yZGVyOjIuNXB4IHNvbGlkICcgKyBjb2wgKyAnO2JhY2tncm91bmQ6JyArIChvbiA/IGNvbCA6ICIjZmZmIikgKyAnO2NvbG9yOicgKyAob24gPyAiI2ZmZiIgOiBjb2wpICsgJzsiPicgKyAoaSArIDEpICsgJzwvc3Bhbj4nICsKICAgICAgICAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNC41cHg7bGluZS1oZWlnaHQ6MS41O2NvbG9yOnZhcigtLXRleHQpO2ZvbnQtd2VpZ2h0OicgKyAob24gPyAiNzAwIiA6ICI0MDAiKSArICc7Ij4nICsgZXNjKHRleHQpICsgJzwvc3Bhbj48L2Rpdj4nOwogICAgfSkuam9pbigiIik7CiAgICB2YXIgbGFzdCA9IHN0YXRlLmlkeCA9PT0gQ0FUUy5sZW5ndGggLSAxOwogICAgdmFyIGNhbk5leHQgPSAhIWNob3NlbjsKICAgIHZhciBpbnRybyA9IHN0YXRlLmlkeCA9PT0gMCA/CiAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjI2cHg7Ij48aDIgY2xhc3M9InRjLWdyYWQtdGV4dCIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToyMnB4O2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxLjEyO21hcmdpbjowIDAgMTZweDsiPllvdXIgbWluZHNldCBpbiB0ZW4gc2l0dWF0aW9uczwvaDI+JyArCiAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjE1cHg7Y29sb3I6dmFyKC0tdGV4dCk7bGluZS1oZWlnaHQ6MS42O21hcmdpbjowOyI+QmVsb3cgYXJlIHRlbiBldmVyeWRheSBzaXR1YXRpb25zLiBGb3IgZWFjaCBvbmUsIHlvdVwnbGwgZmluZCBhIGdlbmVyYWwgZGVzY3JpcHRpb24sIGZvbGxvd2VkIGJ5IGZpdmUgc3RhdGVtZW50cyBhcnJhbmdlZCBhbG9uZyBhIHBhdGgsIGZyb20gbW9yZSBmaXhlZCB0byBtb3JlIGdyb3d0aC4gUmVhZCB0aHJvdWdoIGFsbCBmaXZlIGJlZm9yZSBjaG9vc2luZywgYW5kIHBpY2sgdGhlIG9uZSB0aGF0IGZlZWxzIG1vc3QgdHJ1ZSB0byBob3cgeW91IGFjdHVhbGx5IHJlc3BvbmQgdG9kYXksIG5vdCBob3cgeW91IHdpc2ggeW91IHJlc3BvbmRlZC48L3A+PC9kaXY+JyA6ICIiOwogICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJ0Yy1hbmltIj4nICsKICAgICAgJzxkaXYgc3R5bGU9InBvc2l0aW9uOnN0aWNreTt0b3A6MDt6LWluZGV4OjIwO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjk1KTtiYWNrZHJvcC1maWx0ZXI6Ymx1cig2cHgpO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7cGFkZGluZzoxMXB4IDhweDsiPicgKwogICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21heC13aWR0aDo2NDBweDttYXJnaW46MCBhdXRvOyI+JyArCiAgICAgIGNvbXBhc3NTVkcoMjYsICJNaW5pIikgKwogICAgICAnPHNwYW4gY2xhc3M9InRjLWdyYWQtdGV4dCIgc3R5bGU9ImZvbnQtc2l6ZToxMi41cHg7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4wM2VtO2ZsZXgtc2hyaW5rOjA7Ij5TaXR1YXRpb24gJyArIChzdGF0ZS5pZHggKyAxKSArICcgb2YgMTA8L3NwYW4+JyArCiAgICAgICc8ZGl2IHJvbGU9Imdyb3VwIiBhcmlhLWxhYmVsPSJTaXR1YXRpb25zIiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo0cHg7ZmxleDoxO21heC13aWR0aDo0NDBweDsiPicgKyBzZWdzICsgJzwvZGl2PjwvZGl2PjwvZGl2PicgKwogICAgICAnPGRpdiBzdHlsZT0icGFkZGluZzoyNnB4IDIwcHggMDttYXgtd2lkdGg6NzIwcHg7bWFyZ2luOjAgYXV0bzsiPicgKyBpbnRybyArCiAgICAgICc8ZGl2IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czoxNnB4O3BhZGRpbmc6MzBweCAyNnB4IDI2cHg7YmFja2dyb3VuZDojZmZmOyI+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O21hcmdpbi1ib3R0b206N3B4OyI+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjVweDtmb250LXdlaWdodDo3MDA7bGV0dGVyLXNwYWNpbmc6LjA2ZW07Y29sb3I6dmFyKC0tbWFnKTtib3JkZXItcmFkaXVzOjk5OXB4O3BhZGRpbmc6M3B4IDEycHg7ZmxleC1zaHJpbms6MDtib3JkZXI6MnB4IHNvbGlkIHRyYW5zcGFyZW50O2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KCNmZmYsI2ZmZiksbGluZWFyLWdyYWRpZW50KDkwZGVnLCMwMDkwQzcsI0VCMDA4Qik7YmFja2dyb3VuZC1vcmlnaW46Ym9yZGVyLWJveDtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3gsIGJvcmRlci1ib3g7Ij4nICsgZXNjKCgiMCIgKyAoc3RhdGUuaWR4ICsgMSkpLnNsaWNlKC0yKSkgKyAnPC9zcGFuPicgKwogICAgICAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToyMnB4O2xpbmUtaGVpZ2h0OjEuMTI7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnZhcigtLWluayk7Ij4nICsgZXNjKGNhdC5uYW1lKSArICc8L3NwYW4+PC9kaXY+JyArCiAgICAgICc8cCBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dCk7Zm9udC1zaXplOjE0cHg7bWFyZ2luOjAgMCAyNHB4OyI+JyArIGVzYyhjYXQuZGVzYykgKyAnPC9wPicgKwogICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDttYXJnaW4tYm90dG9tOjE0cHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4xMmVtO2NvbG9yOnZhcigtLWJsdSk7Ij5GSVhFRDwvc3Bhbj4nICsKICAgICAgJzxzcGFuIHN0eWxlPSJmbGV4OjE7aGVpZ2h0OjNweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg5MGRlZywjMDA5MEM3LCNFQjAwOEIpOyI+PC9zcGFuPicgKwogICAgICAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMTJlbTtjb2xvcjp2YXIoLS1tYWcpOyI+R1JPV1RIPC9zcGFuPjwvZGl2PicgKwogICAgICAnPGRpdiByb2xlPSJyYWRpb2dyb3VwIiBhcmlhLWxhYmVsPSInICsgZXNjKGNhdC5uYW1lKSArICciIHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxMHB4OyI+JyArIG9wdGlvbnMgKyAnPC9kaXY+PC9kaXY+JyArCiAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxMnB4O21hcmdpbi10b3A6MjJweDtmbGV4LXdyYXA6d3JhcDsiPicgKwogICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0Yy1idG4tZ2hvc3QiIGRhdGEtdGMtYWN0aW9uPSJwcmV2aW91cyI+JyArIChzdGF0ZS5pZHggPT09IDAgPyAiXHUyMTkwIEJhY2siIDogIlx1MjE5MCBQcmV2aW91cyIpICsgJzwvYnV0dG9uPicgKwogICAgICAnPHNwYW4gaWQ9InRjLWFzc2Vzcy1oaW50IiBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tdGV4dCk7dGV4dC1hbGlnbjpjZW50ZXI7ZmxleDoxO21pbi13aWR0aDoxNjBweDsiPicgKyAoY2FuTmV4dCA/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/ICIjYzhjY2Q0IiA6ICIjZTZlOGVjIjsgZy5saW5lV2lkdGggPSAxOyBnLnN0cm9rZSgpOwogICAgfQogICAgZy50ZXh0QWxpZ24gPSAiY2VudGVyIjsgZy50ZXh0QmFzZWxpbmUgPSAibWlkZGxlIjsKICAgIGZvciAodmFyIHMgPSAwOyBzIDwgbjsgcysrKSB7CiAgICAgIHZhciBlID0gcHQocywgbWF4Uik7CiAgICAgIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKGN4LCBjeSk7IGcubGluZVRvKGVbMF0sIGVbMV0pOyBnLnN0cm9rZVN0eWxlID0gIiNlNmU4ZWMiOyBnLmxpbmVXaWR0aCA9IDE7IGcuc3Ryb2tlKCk7CiAgICAgIHZhciBscCA9IHB0KHMsIG1heFIgKyAyNiksIG5hbWUgPSBDQVRTW3NdLm5hbWUsIHdvcmRzID0gbmFtZS5zcGxpdCgiICIpOwogICAgICBnLmZpbGxTdHlsZSA9ICIjMWIyNTMwIjsgZy5mb250ID0gIjcwMCAxMS41cHggJ0F0a2luc29uIEh5cGVybGVnaWJsZScsIHNhbnMtc2VyaWYiOwogICAgICBpZiAobmFtZS5sZW5ndGggPiAxMiAmJiB3b3Jkcy5sZW5ndGggPiAxKSB7CiAgICAgICAgdmFyIG1pZCA9IE1hdGguY2VpbCh3b3Jkcy5sZW5ndGggLyAyKTsKICAgICAgICBnLmZpbGxUZXh0KHdvcmRzLnNsaWNlKDAsIG1pZCkuam9pbigiICIpLCBscFswXSwgbHBbMV0gLSA2KTsKICAgICAgICBnLmZpbGxUZXh0KHdvcmRzLnNsaWNlKG1pZCkuam9pbigiICIpLCBscFswXSwgbHBbMV0gKyA2KTsKICAgICAgfSBlbHNlIHsgZy5maWxsVGV4dChuYW1lLCBscFswXSwgbHBbMV0pOyB9CiAgICB9CiAgICB2YXIgcHRzID0gQ0FUUy5tYXAoZnVuY3Rpb24gKGNhdCwgaSkgeyByZXR1cm4gcHQoaSwgTWF0aC5tYXgobWF4UiAqIChhW2NhdC5rZXldIC0gMSkgLyA0LCAyKSk7IH0pOwogICAgZy5iZWdpblBhdGgoKTsgcHRzLmZvckVhY2goZnVuY3Rpb24gKHAsIGkpIHsgaWYgKGkgPT09IDApIGcubW92ZVRvKHBbMF0sIHBbMV0pOyBlbHNlIGcubGluZVRvKHBbMF0sIHBbMV0pOyB9KTsgZy5jbG9zZVBhdGgoKTsKICAgIGcuZmlsbFN0eWxlID0gInJnYmEoMjM1LDAsMTM5LDAuMTgpIjsgZy5maWxsKCk7CiAgICBnLnN0cm9rZVN0eWxlID0gIiNFQjAwOEIiOyBnLmxpbmVXaWR0aCA9IDIuNTsgZy5saW5lSm9pbiA9ICJyb3VuZCI7IGcuc3Ryb2tlKCk7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmFyYyhjeCwgY3ksIDMsIDAsIDIgKiBNYXRoLlBJKTsgZy5maWxsU3R5bGUgPSAiIzAwOTBDNyI7IGcuZmlsbCgpOwogICAgcHRzLmZvckVhY2goZnVuY3Rpb24gKHAsIGkpIHsKICAgICAgZy5iZWdpblBhdGgoKTsgZy5hcmMocFswXSwgcFsxXSwgOS41LCAwLCAyICogTWF0aC5QSSk7IGcuZmlsbFN0eWxlID0gIiNmZmZmZmYiOyBnLmZpbGwoKTsKICAgICAgZy5saW5lV2lkdGggPSAyOyBnLnN0cm9rZVN0eWxlID0gIiNFQjAwOEIiOyBnLnN0cm9rZSgpOwogICAgICBnLmZpbGxTdHlsZSA9ICIjRUIwMDhCIjsgZy5mb250ID0gIjcwMCAxMXB4ICdBdGtpbnNvbiBIeXBlcmxlZ2libGUnLCBzYW5zLXNlcmlmIjsKICAgICAgZy5maWxsVGV4dChTdHJpbmcoYVtDQVRTW2ldLmtleV0pLCBwWzBdLCBwWzFdICsgMC41KTsKICAgIH0pOwogIH0KCiAgLyogLS0tLS0tLS0tLSBQREYgZXhwb3J0IC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBidWlsZFBERigpIHsKICAgIHZhciBqc1BERiA9IHdpbmRvdy5qc3BkZi5qc1BERjsKICAgIHZhciBkb2MgPSBuZXcganNQREYoeyB1bml0OiAicHQiLCBmb3JtYXQ6ICJhNCIgfSk7CiAgICB2YXIgVyA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpLCBIID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpLCBNID0gNTI7CiAgICB2YXIgSU5LID0gWzIyLCAzNSwgNThdLCBJTksyID0gWzU4LCAzMSwgNzFdLCBQTFVNID0gWzEwNiwgMzEsIDk0XTsKICAgIHZhciBNQUcgPSBbMjM1LCAwLCAxMzldLCBCTFUgPSBbMCwgMTQ0LCAxOTldLCBNQUdTT0ZUID0gWzI1NSwgMTM4LCAxOTRdLCBCTFVTT0ZUID0gWzEyNCwgMjEyLCAyNTFdOwogICAgdmFyIFRFWFQgPSBbMjcsIDM3LCA0OF0sIFNPRlQgPSBbNzQsIDg0LCA5Nl0sIFZJT0xFVCA9IFs4OCwgNTQsIDEyN107CiAgICB2YXIgYSA9IHN0YXRlLmFuc3dlcnM7CgogICAgZnVuY3Rpb24gcm9zZShjeCwgY3ksIHIpIHsKICAgICAgZG9jLnNldERyYXdDb2xvcigxMjAsIDE1MCwgMjAwKTsgZG9jLnNldExpbmVXaWR0aCgwLjgpOyBkb2MuY2lyY2xlKGN4LCBjeSwgciwgIlMiKTsKICAgICAgZG9jLnNldERyYXdDb2xvcigxNTAsIDE1MCwgMTgwKTsgZG9jLnNldExpbmVXaWR0aCgwLjQpOyBkb2MuY2lyY2xlKGN4LCBjeSwgciAqIDAuNzQsICJTIik7CiAgICAgIGRvYy5zZXREcmF3Q29sb3IoMTUwLCAxNjAsIDE5MCk7CiAgICAgIGRvYy5saW5lKGN4LCBjeSAtIHIsIGN4LCBjeSArIHIpOyBkb2MubGluZShjeCAtIHIsIGN5LCBjeCArIHIsIGN5KTsKICAgICAgdmFyIGQgPSByICogMC43OyBkb2MubGluZShjeCAtIGQsIGN5IC0gZCwgY3ggKyBkLCBjeSArIGQpOyBkb2MubGluZShjeCArIGQsIGN5IC0gZCwgY3ggLSBkLCBjeSArIGQpOwogICAgICBmdW5jdGlvbiB0cmkoYXgsIGF5LCBieCwgYnksIGMyLCBkMiwgY29sKSB7CiAgICAgICAgZG9jLnNldEZpbGxDb2xvcihjb2xbMF0sIGNvbFsxXSwgY29sWzJdKTsKICAgICAgICBkb2MubGluZXMoW1tieCAtIGF4LCBieSAtIGF5XSwgW2MyIC0gYngsIGQyIC0gYnldLCBbYXggLSBjMiwgYXkgLSBkMl1dLCBheCwgYXksIFsxLCAxXSwgIkYiLCB0cnVlKTsKICAgICAgfQogICAgICB0cmkoY3gsIGN5IC0gciAqIDAuODIsIGN4ICsgciAqIDAuMTIsIGN5LCBjeCAtIHIgKiAwLjEyLCBjeSwgTUFHKTsKICAgICAgdHJpKGN4LCBjeSArIHIgKiAwLjgyLCBjeCArIHIgKiAwLjEyLCBjeSwgY3ggLSByICogMC4xMiwgY3ksIEJMVSk7CiAgICAgIHRyaShjeCAtIHIgKiAwLjgyLCBjeSwgY3gsIGN5IC0gciAqIDAuMTEsIGN4LCBjeSArIHIgKiAwLjExLCBCTFVTT0ZUKTsKICAgICAgdHJpKGN4ICsgciAqIDAuODIsIGN5LCBjeCwgY3kgLSByICogMC4xMSwgY3gsIGN5ICsgciAqIDAuMTEsIE1BR1NPRlQpOwogICAgICBkb2Muc2V0RmlsbENvbG9yKDI1NSwgMjU1LCAyNTUpOyBkb2MuY2lyY2xlKGN4LCBjeSwgciAqIDAuMDcsICJGIik7CiAgICB9CiAgICBmdW5jdGlvbiBoZWFkZXJCYW5kKHRpdGxlLCBzdWIpIHsKICAgICAgdmFyIGJhbmRIID0gMTUwLCBzdGVwcyA9IDYwOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBzOyBpKyspIHsKICAgICAgICB2YXIgdCA9IGkgLyAoc3RlcHMgLSAxKSwgciwgZzIsIGI7CiAgICAgICAgaWYgKHQgPCAwLjUpIHsgdmFyIGsgPSB0IC8gMC41OyByID0gSU5LWzBdICsgKElOSzJbMF0gLSBJTktbMF0pICogazsgZzIgPSBJTktbMV0gKyAoSU5LMlsxXSAtIElOS1sxXSkgKiBrOyBiID0gSU5LWzJdICsgKElOSzJbMl0gLSBJTktbMl0pICogazsgfQogICAgICAgIGVsc2UgeyB2YXIgazIgPSAodCAtIDAuNSkgLyAwLjU7IHIgPSBJTksyWzBdICsgKFBMVU1bMF0gLSBJTksyWzBdKSAqIGsyOyBnMiA9IElOSzJbMV0gKyAoUExVTVsxXSAtIElOSzJbMV0pICogazI7IGIgPSBJTksyWzJdICsgKFBMVU1bMl0gLSBJTksyWzJdKSAqIGsyOyB9CiAgICAgICAgZG9jLnNldEZpbGxDb2xvcihyLCBnMiwgYik7IGRvYy5yZWN0KGkgKiAoVyAvIHN0ZXBzKSwgMCwgVyAvIHN0ZXBzICsgMSwgYmFuZEgsICJGIik7CiAgICAgIH0KICAgICAgcm9zZShXIC8gMiwgNDYsIDIyKTsKICAgICAgZG9jLnNldFRleHRDb2xvcihCTFVTT0ZUWzBdLCBCTFVTT0ZUWzFdLCBCTFVTT0ZUWzJdKTsgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJib2xkIik7IGRvYy5zZXRGb250U2l6ZSg4LjUpOwogICAgICBkb2MudGV4dCgiQSBNSU5EU0VUIFJFRkxFQ1RJT04gRk9SIEVEVUNBVE9SUyIsIFcgLyAyLCA5MiwgeyBhbGlnbjogImNlbnRlciIsIGNoYXJTcGFjZTogMS41IH0pOwogICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwgMjU1LCAyNTUpOyBkb2Muc2V0Rm9udFNpemUoMjMpOwogICAgICBkb2MudGV4dCh0aXRsZSwgVyAvIDIsIDExOCwgeyBhbGlnbjogImNlbnRlciIgfSk7CiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMjEzLCAyMTcsIDIyNik7IGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAibm9ybWFsIik7IGRvYy5zZXRGb250U2l6ZSg5LjUpOwogICAgICBkb2MudGV4dChzdWIsIFcgLyAyLCAxMzgsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwogICAgICByZXR1cm4gYmFuZEg7CiAgICB9CiAgICBmdW5jdGlvbiBiYWRnZShudW0sIHgsIHkpIHsKICAgICAgZG9jLnNldERyYXdDb2xvcihNQUdbMF0sIE1BR1sxXSwgTUFHWzJdKTsgZG9jLnNldExpbmVXaWR0aCgxKTsKICAgICAgZG9jLnJvdW5kZWRSZWN0KHgsIHkgLSAxMiwgMzAsIDE1LCA3LjUsIDcuNSwgIlMiKTsKICAgICAgZG9jLnNldFRleHRDb2xvcihNQUdbMF0sIE1BR1sxXSwgTUFHWzJdKTsgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJib2xkIik7IGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgZG9jLnRleHQobnVtLCB4ICsgMTUsIHkgLSAxLjUsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwogICAgfQoKICAgIHZhciBkYXRlID0gbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoImVuLUdCIiwgeyBkYXk6ICJudW1lcmljIiwgbW9udGg6ICJsb25nIiwgeWVhcjogIm51bWVyaWMiIH0pOwogICAgdmFyIHkgPSBoZWFkZXJCYW5kKCJUaGUgTWluZHNldCBUZWFjaGluZyBDb21wYXNzIiwgIllvdXIgcmVzdWx0cyBcdTAwYjcgIiArIGRhdGUpICsgMjA7CiAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgIml0YWxpYyIpOyBkb2Muc2V0VGV4dENvbG9yKFNPRlRbMF0sIFNPRlRbMV0sIFNPRlRbMl0pOyBkb2Muc2V0Rm9udFNpemUoOCk7CiAgICBkb2MudGV4dCgiQmFzZWQgb24gdGhlIHdvcmsgb2YgQW5kZXJzb24gKDIwMTcpLCBEd2VjayAoMjAxNiksIEdhcmNcdTAwZWRhLCBUZWphZGEsIGFuZCBSYW1cdTAwZWRyZXogKDIwMjMpLCBhbmQgUmFtXHUwMGVkcmV6ICgyMDI0KS4iLCBXIC8gMiwgeSwgeyBhbGlnbjogImNlbnRlciIgfSk7CiAgICB5ICs9IDIwOwogICAgdHJ5IHsKICAgICAgdmFyIGltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Yy1yYWRhciIpLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7CiAgICAgIGRvYy5hZGRJbWFnZShpbWcsICJQTkciLCAoVyAtIDI4NikgLyAyLCB5LCAyODYsIDI4Nik7IHkgKz0gMzAwOwogICAgfSBjYXRjaCAoZSkgeyB5ICs9IDg7IH0KCiAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgImJvbGQiKTsgZG9jLnNldFRleHRDb2xvcihJTktbMF0sIElOS1sxXSwgSU5LWzJdKTsgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgIGRvYy50ZXh0KCJIb3cgdG8gcmVhZCB5b3VyIGNvbXBhc3MiLCBXIC8gMiwgeSwgeyBhbGlnbjogImNlbnRlciIgfSk7IHkgKz0gMTg7CiAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgIm5vcm1hbCIpOyBkb2Muc2V0VGV4dENvbG9yKFRFWFRbMF0sIFRFWFRbMV0sIFRFWFRbMl0pOyBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgWyJUaGUgc2hhcGUgYWJvdmUgaXMgY2FsbGVkIGEgc3BpZGVyIGNoYXJ0LiBJdCBzaG93cyBvbmUgcG9pbnQgZm9yIGVhY2ggb2YgdGhlIHRlbiBzaXR1YXRpb25zLiBQb2ludHMgY2xvc2VyIHRvIHRoZSBjZW50ZXIgbGVhbiB0b3dhcmQgYSBmaXhlZCB2aWV3LCBhbmQgcG9pbnRzIHJlYWNoaW5nIG91dHdhcmQgbGVhbiB0b3dhcmQgZ3Jvd3RoLiAoQSBmaXhlZCB2aWV3IHNlZXMgYWJpbGl0eSBhcyBzZXQ7IGEgZ3Jvd3RoIHZpZXcgc2VlcyBpdCBhcyBzb21ldGhpbmcgdGhhdCBjYW4ga2VlcCBkZXZlbG9waW5nLikgVG9nZXRoZXIsIHRoZSBwb2ludHMgc2hvdyB3aGVyZSB5b3Ugc3RhbmQgdG9kYXksIGFsbCBhdCBvbmNlLiIsCiAgICAgICJCZWxvdywgeW91J2xsIGZpbmQgZWFjaCBzaXR1YXRpb24gYWdhaW4sIG51bWJlcmVkIDAxIHRvIDEwLCBhbG9uZyB3aXRoIHRoZSByZXNwb25zZSB5b3UgY2hvc2UuIFRoZSB3b3JkIG9uIHRoZSByaWdodCAoRml4ZWQtbGVhbmluZywgTWl4ZWQsIG9yIEdyb3d0aC1sZWFuaW5nKSBzaG93cyB3aGVyZSB5b3VyIGFuc3dlciBsYW5kZWQgb24gdGhhdCBzY2FsZSwgZnJvbSBhIGZpeGVkIG1pbmRzZXQgdG8gYSBncm93dGggb25lLiBOZWl0aGVyIGVuZCBpcyBhIGdyYWRlOyBpdCdzIGp1c3QgYSBwb2ludCBvZiByZWZlcmVuY2UuIiwKICAgICAgIldpdGggZWFjaCBzaXR1YXRpb24gdGhlcmUncyBhbHNvIGEgcmVmbGVjdGlvbiBxdWVzdGlvbiwgbWF0Y2hlZCB0byB3aGVyZSB5b3UgbGFuZGVkLiBUaGVzZSBhcmVuJ3QgdGVzdHMsIGFuZCB0aGVyZSBhcmUgbm8gcmlnaHQgYW5zd2Vycy4gVGhleSdyZSBzaW1wbHkgaGVyZSB0byB0aGluayBhYm91dC4gWW91IG1pZ2h0IGpvdCBhIGZldyBub3RlcyBvbiBwYXBlciwgc2l0IHF1aWV0bHkgd2l0aCB0aGUgb25lcyB0aGF0IHNwZWFrIHRvIHlvdSwgb3IgdGFsayB0aGVtIG92ZXIgd2l0aCBhIGNvbGxlYWd1ZSB5b3UgdHJ1c3QuIgogICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgIHZhciBsaW5lcyA9IGRvYy5zcGxpdFRleHRUb1NpemUocCwgVyAtIDIgKiBNKTsKICAgICAgZG9jLnRleHQobGluZXMsIE0sIHkpOyB5ICs9IGxpbmVzLmxlbmd0aCAqIDEzICsgOTsKICAgIH0pOwoKICAgIGRvYy5hZGRQYWdlKCk7IHkgPSA1NjsKICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAiYm9sZCIpOyBkb2Muc2V0VGV4dENvbG9yKElOS1swXSwgSU5LWzFdLCBJTktbMl0pOyBkb2Muc2V0Rm9udFNpemUoMTYpOwogICAgZG9jLnRleHQoIllvdXIgcmVzdWx0cywgc2l0dWF0aW9uIGJ5IHNpdHVhdGlvbiIsIE0sIHkpOyB5ICs9IDEwOwogICAgZG9jLnNldERyYXdDb2xvcihNQUdbMF0sIE1BR1sxXSwgTUFHWzJdKTsgZG9jLnNldExpbmVXaWR0aCgyKTsgZG9jLmxpbmUoTSwgeSwgTSArIDQ2LCB5KTsgeSArPSAyNDsKCiAgICBDQVRTLmZvckVhY2goZnVuY3Rpb24gKGNhdCwgaWR4KSB7CiAgICAgIHZhciB0ID0gdGllck9mKGFbY2F0LmtleV0pOwogICAgICB2YXIgbnVtID0gKCIwIiArIChpZHggKyAxKSkuc2xpY2UoLTIpOwogICAgICB2YXIgY2hvc2VuTGluZXMgPSBkb2Muc3BsaXRUZXh0VG9TaXplKGNhdC5zdGF0ZW1lbnRzW2FbY2F0LmtleV0gLSAxXSwgVyAtIDIgKiBNIC0gMTQpOwogICAgICB2YXIgcUxpbmVzID0gZG9jLnNwbGl0VGV4dFRvU2l6ZShjYXQucmVmbGVjdGlvbnNbdF0sIFcgLSAyICogTSAtIDE0KTsKICAgICAgaWYgKHkgKyA3NiArIGNob3NlbkxpbmVzLmxlbmd0aCAqIDEyICsgcUxpbmVzLmxlbmd0aCAqIDEyID4gSCAtIDUwKSB7IGRvYy5hZGRQYWdlKCk7IHkgPSA1NjsgfQogICAgICBiYWRnZShudW0sIE0sIHkgKyAyKTsKICAgICAgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJib2xkIik7IGRvYy5zZXRUZXh0Q29sb3IoSU5LWzBdLCBJTktbMV0sIElOS1syXSk7IGRvYy5zZXRGb250U2l6ZSgxMyk7CiAgICAgIGRvYy50ZXh0KGNhdC5uYW1lLCBNICsgNDAsIHkpOwogICAgICBkb2Muc2V0VGV4dENvbG9yKEJMVVswXSwgQkxVWzFdLCBCTFVbMl0pOyBkb2Muc2V0Rm9udFNpemUoOC41KTsKICAgICAgZG9jLnRleHQoVElFUl9MQUJFTFt0XS50b1VwcGVyQ2FzZSgpLCBXIC0gTSwgeSwgeyBhbGlnbjogInJpZ2h0IiwgY2hhclNwYWNlOiAwLjUgfSk7CiAgICAgIHkgKz0gMTg7CiAgICAgIHZhciB0b3AgPSB5IC0gNDsKICAgICAgZG9jLnNldFRleHRDb2xvcihNQUdbMF0sIE1BR1sxXSwgTUFHWzJdKTsgZG9jLnNldEZvbnRTaXplKDgpOwogICAgICBkb2MudGV4dCgiWU9VUiBSRVNQT05TRSIsIE0gKyAxNCwgeSArIDQsIHsgY2hhclNwYWNlOiAwLjggfSk7IHkgKz0gMTI7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAibm9ybWFsIik7IGRvYy5zZXRUZXh0Q29sb3IoVEVYVFswXSwgVEVYVFsxXSwgVEVYVFsyXSk7IGRvYy5zZXRGb250U2l6ZSgxMC41KTsKICAgICAgZG9jLnRleHQoY2hvc2VuTGluZXMsIE0gKyAxNCwgeSArIDQpOyB5ICs9IGNob3NlbkxpbmVzLmxlbmd0aCAqIDEyICsgMTA7CiAgICAgIHZhciBsYmwgPSAiQSBRVUVTVElPTiBUTyBTSVQgV0lUSCI7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAiYm9sZCIpOyBkb2Muc2V0Rm9udFNpemUoOCk7CiAgICAgIHZhciBsdyA9IGRvYy5nZXRUZXh0V2lkdGgobGJsKSwgYmFzZSA9IHkgKyA0OwogICAgICBkb2Muc2V0RmlsbENvbG9yKFZJT0xFVFswXSwgVklPTEVUWzFdLCBWSU9MRVRbMl0pOwogICAgICBkb2Mucm91bmRlZFJlY3QoTSArIDksIGJhc2UgLSA5LjQsIGx3ICsgMTAsIDEyLjYsIDIsIDIsICJGIik7CiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMjU1LCAyNTUsIDI1NSk7IGRvYy50ZXh0KGxibCwgTSArIDE0LCBiYXNlKTsKICAgICAgeSArPSAxNDsKICAgICAgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJub3JtYWwiKTsgZG9jLnNldFRleHRDb2xvcihURVhUWzBdLCBURVhUWzFdLCBURVhUWzJdKTsgZG9jLnNldEZvbnRTaXplKDEwLjUpOwogICAgICBkb2MudGV4dChxTGluZXMsIE0gKyAxNCwgeSArIDQpOyB5ICs9IHFMaW5lcy5sZW5ndGggKiAxMiArIDY7CiAgICAgIGRvYy5zZXREcmF3Q29sb3IoTUFHWzBdLCBNQUdbMV0sIE1BR1syXSk7IGRvYy5zZXRMaW5lV2lkdGgoMi41KTsgZG9jLmxpbmUoTSArIDQsIHRvcCwgTSArIDQsIHkpOwogICAgICB5ICs9IDIwOwogICAgfSk7CgogICAgdmFyIHBhZ2VzID0gZG9jLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKTsKICAgIGZvciAodmFyIHAgPSAxOyBwIDw9IHBhZ2VzOyBwKyspIHsKICAgICAgZG9jLnNldFBhZ2UocCk7CiAgICAgIGRvYy5zZXREcmF3Q29sb3IoMjI4LCAyMjgsIDIzMSk7IGRvYy5zZXRMaW5lV2lkdGgoMC41KTsgZG9jLmxpbmUoTSwgSCAtIDM4LCBXIC0gTSwgSCAtIDM4KTsKICAgICAgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJub3JtYWwiKTsgZG9jLnNldFRleHRDb2xvcigxNTAsIDE1MCwgMTUwKTsgZG9jLnNldEZvbnRTaXplKDcuNSk7CiAgICAgIGRvYy50ZXh0KCJUaGUgTWluZHNldCBUZWFjaGluZyBDb21wYXNzIFx1MDBiNyBtYXJ0aGFyYW1pcmV6LmNvbS5jbyBcdTAwYjcgRnJlZSB0byBzaGFyZSBmb3IgaW5kaXZpZHVhbCBhbmQgZWR1Y2F0aW9uYWwgdXNlIiwgTSwgSCAtIDI0KTsKICAgICAgZG9jLnRleHQocCArICIgLyAiICsgcGFnZXMsIFcgLSBNLCBIIC0gMjQsIHsgYWxpZ246ICJyaWdodCIgfSk7CiAgICB9CiAgICBkb2Muc2F2ZSgiTXktVGVhY2hpbmctQ29tcGFzcy1SZXN1bHRzLnBkZiIpOwogIH0KCiAgLyogLS0tLS0tLS0tLSBXb3JkUHJlc3Mtc2FmZSBpbml0IHdpdGggdmlzaWJsZSBkaWFnbm9zdGljcyAtLS0tLS0tLS0tICovCiAgdmFyIHRjU3RhcnRlZCA9IGZhbHNlOwogIGZ1bmN0aW9uIGluaXRDb21wYXNzKCkgewogICAgaWYgKHRjU3RhcnRlZCkgcmV0dXJuIHRydWU7CiAgICByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRjLXJvb3QiKTsKICAgIGlmICghcm9vdCkgcmV0dXJuIGZhbHNlOwogICAgdHJ5IHsKICAgICAgdGNTdGFydGVkID0gdHJ1ZTsKICAgICAgYXR0YWNoUm9vdEV2ZW50cygpOwogICAgICBsb2FkU2F2ZWQoKTsKICAgICAgcmVuZGVyKCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHRjU3RhcnRlZCA9IGZhbHNlOwogICAgICByb290LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6NjQwcHg7bWFyZ2luOjI0cHggYXV0bztwYWRkaW5nOjIwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZTRlNGU3O2JvcmRlci1yYWRpdXM6MTJweDtmb250LWZhbWlseTpBcmlhbCxzYW5zLXNlcmlmO2NvbG9yOiMxNjIzM0EiPjxzdHJvbmc+VGhlIGNvbXBhc3MgY291bGQgbm90IHN0YXJ0Ljwvc3Ryb25nPjxicj48c21hbGw+JyArIGVzYyhlcnIgJiYgZXJyLm1lc3NhZ2UgPyBlcnIubWVzc2FnZSA6IGVycikgKyAnPC9zbWFsbD48L2Rpdj4nOwogICAgICBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoIlRlYWNoaW5nIENvbXBhc3Mgc3RhcnR1cDoiLCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBib290Q29tcGFzcygpIHsKICAgIGlmIChpbml0Q29tcGFzcygpKSByZXR1cm47CiAgICB2YXIgdHJpZXMgPSAwOwogICAgdmFyIHRpbWVyID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgdHJpZXMgKz0gMTsKICAgICAgaWYgKGluaXRDb21wYXNzKCkgfHwgdHJpZXMgPj0gMjApIHdpbmRvdy5jbGVhckludGVydmFsKHRpbWVyKTsKICAgIH0sIDEwMCk7CiAgfQoKICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImxvYWRpbmciKSB7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYm9vdENvbXBhc3MpOwogICAgd2luZG93LnNldFRpbWVvdXQoYm9vdENvbXBhc3MsIDApOwogIH0gZWxzZSB7CiAgICB3aW5kb3cuc2V0VGltZW91dChib290Q29tcGFzcywgMCk7CiAgfQp9KSgpOw==