IwojICAgQ29weXJpZ2h0IChjKSAyMDA1IEpv428gQWJlY2FzaXMKIyAgIENvcHlyaWdodCAoYykgMjAwNSBWbGFkaW1pciBQcnVzCiMgICBDb3B5cmlnaHQgKGMpIDIwMDYgUmVuZSBSaXZlcmEKIwojICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCiMgICBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAojICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQojCgojIFRoaXMgdG9vbHNldCBkZWZpbmVzIGEgZ2VuZXJhdG9yIHRvIHRyYW5zbGF0ZSBRdWlja0Jvb2sgdG8gQm9vc3RCb29rLiBJdCBjYW4KIyBiZSB1c2VkIHRvIGdlbmVyYXRlIG5pY2UgKCEpIHVzZXIgZG9jdW1lbnRhdGlvbiBpbiBkaWZmZXJlbnQgZm9ybWF0cwojIChwZGYvaHRtbC8uLi4pLCBmcm9tIGEgc2luZ2xlIHRleHQgZmlsZSB3aXRoIHNpbXBsZSBtYXJrdXAuCiMKIyBUaGUgdG9vbHNldCBkZWZpbmVzIHRoZSBRVUlDS0JPT0sgdHlwZSAoZmlsZSBleHRlbnNpb24gJ3FiaycpIGFuZAojIGEgUVVJQ0tCT09LIHRvIFhNTCAoQk9PU1RCT09LKSBnZW5lcmF0b3IuCiMKIwojICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgICBRICYgQQojICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMKIyAgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBhbGwgYWJvdXQsIHNvbWUgUSAmIEEgd2lsbCBob3BlZnVsbHkgZ2V0IHlvdQojICAgdXAgdG8gc3BlZWQgd2l0aCBRdWlja0Jvb2sgYW5kIHRoaXMgdG9vbHNldC4KIwojCiMgICBXaGF0IGlzIFF1aWNrQm9vayA/CiMKIyAgICAgICBRdWlja0Jvb2sgaXMgYSBXaWtpV2lraSBzdHlsZSBkb2N1bWVudGF0aW9uIHRvb2wgZ2VhcmVkIHRvd2FyZHMgQysrCiMgICAgICAgZG9jdW1lbnRhdGlvbiB1c2luZyBzaW1wbGUgcnVsZXMgYW5kIG1hcmt1cCBmb3Igc2ltcGxlIGZvcm1hdHRpbmcgdGFza3MuCiMgICAgICAgUXVpY2tCb29rIGV4dGVuZHMgdGhlIFdpa2lXaWtpIGNvbmNlcHQuIExpa2UgdGhlIFdpa2lXaWtpLCBRdWlja0Jvb2sKIyAgICAgICBkb2N1bWVudHMgYXJlIHNpbXBsZSB0ZXh0IGZpbGVzLiBBIHNpbmdsZSBRdWlja0Jvb2sgZG9jdW1lbnQgY2FuCiMgICAgICAgZ2VuZXJhdGUgYSBmdWxseSBsaW5rZWQgc2V0IG9mIG5pY2UgSFRNTCBhbmQgUG9zdFNjcmlwdC9QREYgZG9jdW1lbnRzCiMgICAgICAgY29tcGxldGUgd2l0aCBpbWFnZXMgYW5kIHN5bnRheC1jb2xvcml6ZWQgc291cmNlIGNvZGUuCiMKIwojICAgV2hlcmUgY2FuIEkgZ2V0IFF1aWNrQm9vayA/CiMKIyAgICAgICBRdWlja2Jvb2sgY2FuIGJlIGZvdW5kIGluIEJvb3N0J3MgcmVwb3NpdG9yeSwgdW5kZXIgdGhlIHRvb2xzL3F1aWNrYm9vawojICAgICAgIGRpcmVjdG9yeSBpdCB3YXMgYWRkZWQgdGhlcmUgb24gSmFuIDIwMDUsIHNvbWUgdGltZSBhZnRlciB0aGUgcmVsZWFzZSBvZgojICAgICAgIEJvb3N0IHYxLjMyLjAgYW5kIGhhcyBiZWVuIGFuIGludGVncmFsIHBhcnQgb2YgdGhlIEJvb3N0IGRpc3RyaWJ1dGlvbgojICAgICAgIHNpbmNlIHYxLjMzLgojCiMgICAgICAgSGVyZSdzIGEgbGluayB0byB0aGUgU1ZOIHJlcG9zaXRvcnk6CiMgICAgICAgICAgIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy9zdm4vYm9vc3QvdHJ1bmsvdG9vbHMvcXVpY2tib29rCiMKIyAgICAgICBBbmQgdG8gUXVpY2tCb29rJ3MgUXVpY2tCb29rLWdlbmVyYXRlZCBkb2NzOgojICAgICAgICAgICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvbGlicy9yZWxlYXNlL3Rvb2xzL3F1aWNrYm9vay9pbmRleC5odG1sCiMKIwojICAgSG93IGRvIEkgdXNlIFF1aWNrQm9vayBhbmQgdGhpcyB0b29sc2V0IGluIG15IHByb2plY3RzID8KIwojICAgICAgIFRoZSBtaW5pbWFsIGV4YW1wbGUgaXM6CiMKIyAgICAgICAgICAgdXNpbmcgYm9vc3Rib29rIDsKIyAgICAgICAgICAgaW1wb3J0IHF1aWNrYm9vayA7CiMKIyAgICAgICAgICAgYm9vc3Rib29rIG15X2RvY3MgOiBteV9kb2NzX3NvdXJjZS5xYmsgOwojCiMgICAgICAgd2hlcmUgbXlfZG9jcyBpcyBhIHRhcmdldCBuYW1lIGFuZCBteV9kb2NzX3NvdXJjZS5xYmsgaXMgYSBRdWlja0Jvb2sKIyAgICAgICBmaWxlLiBUaGUgZG9jdW1lbnRhdGlvbiBmb3JtYXQgdG8gYmUgZ2VuZXJhdGVkIGlzIGRldGVybWluZWQgYnkgdGhlCiMgICAgICAgYm9vc3Rib29rIHRvb2xzZXQuIEJ5IGRlZmF1bHQgaHRtbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBnZW5lcmF0ZWQsCiMgICAgICAgYnV0IHlvdSBzaG91bGQgY2hlY2sgQm9vc3RCb29rJ3MgZG9jcyB0byBiZSBzdXJlLgojCiMKIyAgIFdoYXQgZG8gSSBuZWVkID8KIwojICAgICAgIFlvdSBzaG91bGQgc3RhcnQgYnkgc2V0dGluZyB1cCB0aGUgQm9vc3RCb29rIHRvb2xzZXQuIFBsZWFzZSByZWZlciB0bwojICAgICAgIGJvb3N0Ym9vay5qYW0gYW5kIHRoZSBCb29zdEJvb2sgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvCiMgICAgICAgZG8gdGhpcy4KIwojICAgICAgIEEgUXVpY2tCb29rIGV4ZWN1dGFibGUgaXMgYWxzbyBuZWVkZWQuIFRoZSB0b29sc2V0IHdpbGwgZ2VuZXJhdGUgdGhpcwojICAgICAgIGV4ZWN1dGFibGUgaWYgaXQgY2FuIGZpbmQgdGhlIFF1aWNrQm9vayBzb3VyY2VzLiBUaGUgZm9sbG93aW5nCiMgICAgICAgZGlyZWN0b3JpZXMgd2lsbCBiZSBzZWFyY2hlZDoKIwojICAgICAgICAgICBCT09TVF9ST09UL3Rvb2xzL3F1aWNrYm9vay8KIyAgICAgICAgICAgQk9PU1RfQlVJTERfUEFUSC8uLi8uLi9xdWlja2Jvb2svCiMKIyAgICAgICAoQk9PU1RfUk9PVCBhbmQgQk9PU1RfQlVJTERfUEFUSCBhcmUgZW52aXJvbm1lbnQgdmFyaWFibGVzKQojCiMgICAgICAgSWYgUXVpY2tCb29rIHNvdXJjZXMgYXJlIG5vdCBmb3VuZCB0aGUgdG9vbHNldCB3aWxsIHRoZW4gdHJ5IHRvIHVzZQojICAgICAgIHRoZSBzaGVsbCBjb21tYW5kICdxdWlja2Jvb2snLgojCiMKIyAgIEhvdyBkbyBJIHByb3ZpZGUgYSBjdXN0b20gUXVpY2tCb29rIGV4ZWN1dGFibGUgPwojCiMgICAgICAgWW91IG1heSBwdXQgdGhlIGZvbGxvd2luZyBpbiB5b3VyIHVzZXItY29uZmlnLmphbSBvciBzaXRlLWNvbmZpZy5qYW06CiMKIyAgICAgICAgICAgdXNpbmcgcXVpY2tib29rIDogL3BhdGgvdG8vcXVpY2tib29rIDsKIwojICAgICAgIG9yLCBpZiAncXVpY2tib29rJyBjYW4gYmUgZm91bmQgaW4geW91ciBQQVRILAojCiMgICAgICAgICAgIHVzaW5nIHF1aWNrYm9vayA6IHF1aWNrYm9vayA7CiMKIwojICAgRm9yIGNvbnZlbmllbmNlIHRocmVlIGFsdGVybmF0aXZlcyBhcmUgdHJpZWQgdG8gZ2V0IGEgUXVpY2tCb29rIGV4ZWN1dGFibGU6CiMKIyAgICAgICAxLiAgSWYgdGhlIHVzZXIgcG9pbnRzIHVzIHRvIHRoZSBhIFF1aWNrQm9vayBleGVjdXRhYmxlLCB0aGF0IGlzIHVzZWQuCiMKIyAgICAgICAyLiAgT3RoZXJ3aXNlLCB3ZSBzZWFyY2ggZm9yIHRoZSBRdWlja0Jvb2sgc291cmNlcyBhbmQgY29tcGlsZSBRdWlja0Jvb2sKIyAgICAgICAgICAgdXNpbmcgdGhlIGRlZmF1bHQgdG9vbHNldC4KIwojICAgICAgIDMuICBBcyBhIGxhc3QgcmVzb3J0LCB3ZSByZWx5IG9uIHRoZSBzaGVsbCBmb3IgZmluZGluZyAncXVpY2tib29rJy4KIwoKaW1wb3J0IGJvb3N0Ym9vayA7CmltcG9ydCAiY2xhc3MiIDogbmV3IDsKaW1wb3J0IGZlYXR1cmUgOwppbXBvcnQgZ2VuZXJhdG9ycyA7CmltcG9ydCB0b29sc2V0IDsKaW1wb3J0IHR5cGUgOwppbXBvcnQgc2Nhbm5lciA7CmltcG9ydCBwcm9qZWN0IDsKaW1wb3J0IHRhcmdldHMgOwoKCiMgVGhlIG9uZSBhbmQgb25seSBRVUlDS0JPT0sgdHlwZSEKdHlwZS5yZWdpc3RlciBRVUlDS0JPT0sgOiBxYmsgOwoKIyA8cXVpY2tib29rLWJpbmFyeT4gc2hlbGwgY29tbWFuZCB0byBydW4gUXVpY2tCb29rCiMgPHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzPiB0YXJnZXRzIHRvIGJ1aWxkIFF1aWNrQm9vayBmcm9tIHNvdXJjZXMuCmZlYXR1cmUuZmVhdHVyZSA8cXVpY2tib29rLWJpbmFyeT4gOiA6IGZyZWUgOwpmZWF0dXJlLmZlYXR1cmUgPHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzPiA6IDogZnJlZSBkZXBlbmRlbmN5IDsKCgojIHF1aWNrYm9vay1iaW5hcnktZ2VuZXJhdG9yIGhhbmRsZXMgZ2VuZXJhdGlvbiBvZiB0aGUgUXVpY2tCb29rIGV4ZWN1dGFibGUsIGJ5CiMgbWFya2luZyBpdCBhcyBhIGRlcGVuZGVuY3kgZm9yIFF1aWNrQm9vayBkb2NzLgojCiMgSWYgdGhlIHVzZXIgc3VwcGxpZWQgdGhlIFF1aWNrQm9vayBjb21tYW5kIHRoYXQgd2lsbCBiZSB1c2VkLgojCiMgT3RoZXJ3aXNlIHdlIHNlYXJjaCBzb21lIHNlbnNpYmxlIHBsYWNlcyBmb3IgdGhlIFF1aWNrQm9vayBzb3VyY2VzIGFuZCBjb21waWxlCiMgZnJvbSBzY3JhdGNoIHVzaW5nIHRoZSBkZWZhdWx0IHRvb2xzZXQuCiMKIyBBcyBhIGxhc3QgcmVzb3J0IHdlIHJlbHkgb24gdGhlIHNoZWxsIHRvIGZpbmQgJ3F1aWNrYm9vaycuCiMKY2xhc3MgcXVpY2tib29rLWJpbmFyeS1nZW5lcmF0b3IgOiBnZW5lcmF0b3IKewogICAgaW1wb3J0IGNvbW1vbiBtb2R1bGVzIHBhdGggdGFyZ2V0cyBidWlsZC1zeXN0ZW0gOwoKICAgIHJ1bGUgcnVuICggcHJvamVjdCBuYW1lID8gOiBwcm9wZXJ0eS1zZXQgOiBzb3VyY2VzICogOiBtdWx0aXBsZSA/ICkKICAgIHsKICAgICAgICAjIFF1aWNrQm9vayBpbnZvY2F0aW9uIGNvbW1hbmQgYW5kIGRlcGVuZGVuY2llcy4KICAgICAgICBsb2NhbCBxdWlja2Jvb2stYmluYXJ5ID0gWyBtb2R1bGVzLnBlZWsgcXVpY2tib29rIDogLmNvbW1hbmQgXSA7CiAgICAgICAgbG9jYWwgcXVpY2tib29rLWJpbmFyeS1kZXBlbmRlbmNpZXMgOwoKICAgICAgICBpZiAkKHF1aWNrYm9vay1iaW5hcnkpCiAgICAgICAgewogICAgICAgICAgICAjIFVzZSB1c2VyLXN1cHBsaWVkIGNvbW1hbmQuCiAgICAgICAgICAgIHF1aWNrYm9vay1iaW5hcnkgPSBbIGNvbW1vbi5nZXQtaW52b2NhdGlvbi1jb21tYW5kIHF1aWNrYm9vayA6IHF1aWNrYm9vayA6ICQocXVpY2tib29rLWJpbmFyeSkgXSA7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICMgU2VhcmNoIGZvciBRdWlja0Jvb2sgc291cmNlcyBpbiBzZW5zaWJsZSBwbGFjZXMsIGxpa2UKICAgICAgICAgICAgIyAgICQoQk9PU1RfUk9PVCkvdG9vbHMvcXVpY2tib29rCiAgICAgICAgICAgICMgICAkKEJPT1NUX0JVSUxEX1BBVEgpLy4uLy4uL3F1aWNrYm9vawoKICAgICAgICAgICAgIyBBbmQgYnVpbGQgcXVpY2tib29rIGV4ZWN1dGFibGUgZnJvbSBzb3VyY2VzLgoKICAgICAgICAgICAgbG9jYWwgYm9vc3Qtcm9vdCA9IFsgbW9kdWxlcy5wZWVrIDogQk9PU1RfUk9PVCBdIDsKICAgICAgICAgICAgbG9jYWwgYm9vc3QtYnVpbGQtcGF0aCA9IFsgYnVpbGQtc3lzdGVtLmxvY2F0aW9uIF0gOwoKICAgICAgICAgICAgbG9jYWwgcXVpY2tib29rLWRpciA7CgogICAgICAgICAgICBpZiAkKGJvb3N0LXJvb3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHF1aWNrYm9vay1kaXIgKz0gWyBwYXRoLmpvaW4gJChib29zdC1yb290KSB0b29scyBdIDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgJChib29zdC1idWlsZC1wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBxdWlja2Jvb2stZGlyICs9ICQoYm9vc3QtYnVpbGQtcGF0aCkvLi4vLi4gOwogICAgICAgICAgICB9CgogICAgICAgICAgICBxdWlja2Jvb2stZGlyID0gWyBwYXRoLmdsb2IgJChxdWlja2Jvb2stZGlyKSA6IHF1aWNrYm9vayBdIDsKCiAgICAgICAgICAgICMgSWYgdGhlIFF1aWNrQm9vayBzb3VyY2UgZGlyZWN0b3J5IHdhcyBmb3VuZCwgbWFyayBpdHMgbWFpbiB0YXJnZXQKICAgICAgICAgICAgIyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoZSBjdXJyZW50IHByb2plY3QuIE90aGVyd2lzZSwgdHJ5IHRvIGZpbmQKICAgICAgICAgICAgIyAncXVpY2tib29rJyBpbiB1c2VyJ3MgUEFUSAogICAgICAgICAgICBpZiAkKHF1aWNrYm9vay1kaXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHF1aWNrYm9vay1kaXIgPSBbIHBhdGgubWFrZSAkKHF1aWNrYm9vay1kaXJbMV0pIF0gOwoKICAgICAgICAgICAgICAgICMgR2V0IHRoZSBtYWluLXRhcmdldCBpbiBRdWlja0Jvb2sgZGlyZWN0b3J5LgogICAgICAgICAgICAgICAgbG9jYWwgcXVpY2tib29rLW1haW4tdGFyZ2V0ID0gWyB0YXJnZXRzLnJlc29sdmUtcmVmZXJlbmNlICQocXVpY2tib29rLWRpcikgOiAkKHByb2plY3QpIF0gOwoKICAgICAgICAgICAgICAgICMgVGhlIGZpcnN0IGVsZW1lbnQgYXJlIGFjdHVhbCB0YXJnZXRzLCB0aGUgc2Vjb25kIGFyZQogICAgICAgICAgICAgICAgIyBwcm9wZXJ0aWVzIGZvdW5kIGluIHRhcmdldC1pZC4gV2UgZG8gbm90IGNhcmUgYWJvdXQgdGhlc2UKICAgICAgICAgICAgICAgICMgc2luY2Ugd2UgaGF2ZSBwYXNzZWQgdGhlIGlkIG91cnNlbHZlcy4KICAgICAgICAgICAgICAgIHF1aWNrYm9vay1tYWluLXRhcmdldCA9CiAgICAgICAgICAgICAgICAgICAgWyAkKHF1aWNrYm9vay1tYWluLXRhcmdldFsxXSkubWFpbi10YXJnZXQgcXVpY2tib29rIF0gOwoKICAgICAgICAgICAgICAgIHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzID0KICAgICAgICAgICAgICAgICAgICBbICQocXVpY2tib29rLW1haW4tdGFyZ2V0KS5nZW5lcmF0ZSBbICQocHJvcGVydHktc2V0KS5wcm9wYWdhdGVkIF0gXSA7CgogICAgICAgICAgICAgICAgIyBJZ25vcmUgdXNhZ2UtcmVxdWlyZW1lbnRzIHJldHVybmVkIGFzIGZpcnN0IGVsZW1lbnQuCiAgICAgICAgICAgICAgICBxdWlja2Jvb2stYmluYXJ5LWRlcGVuZGVuY2llcyA9ICQocXVpY2tib29rLWJpbmFyeS1kZXBlbmRlbmNpZXNbMi1dKSA7CgogICAgICAgICAgICAgICAgIyBTb21lIHRvb2xzZXRzIGdlbmVyYXRlIGV4dHJhIHRhcmdldHMgKGUuZy4gUlNQKS4gV2UgbXVzdCBtYXJrCiAgICAgICAgICAgICAgICAjIGFsbCB0YXJnZXRzIGFzIGRlcGVuZGVuY2llcyBmb3IgdGhlIHByb2plY3QsIGJ1dCB3ZSB3aWxsIG9ubHkKICAgICAgICAgICAgICAgICMgdXNlIHRoZSBFWEUgdGFyZ2V0IGZvciBxdWlja2Jvb2stdG8tYm9vc3Rib29rIHRyYW5zbGF0aW9uLgogICAgICAgICAgICAgICAgZm9yIGxvY2FsIHRhcmdldCBpbiAkKHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIFsgJCh0YXJnZXQpLnR5cGUgXSA9IEVYRQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpY2tib29rLWJpbmFyeSA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBwYXRoLm5hdGl2ZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIHBhdGguam9pbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICQodGFyZ2V0KS5wYXRoIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAkKHRhcmdldCkubmFtZSBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRUNITyAiUXVpY2tCb29rIHdhcm5pbmc6IFRoZSBwYXRoIHRvIHRoZSBxdWlja2Jvb2sgZXhlY3V0YWJsZSB3YXMiIDsKICAgICAgICAgICAgICAgIEVDSE8gIiAgbm90IHByb3ZpZGVkLiBBZGRpdGlvbmFsbHksIGNvdWxkbid0IGZpbmQgUXVpY2tCb29rIiA7CiAgICAgICAgICAgICAgICBFQ0hPICIgIHNvdXJjZXMgc2VhcmNoaW5nIGluIiA7CiAgICAgICAgICAgICAgICBFQ0hPICIgICAgKiBCT09TVF9ST09UL3Rvb2xzL3F1aWNrYm9vayIgOwogICAgICAgICAgICAgICAgRUNITyAiICAgICogQk9PU1RfQlVJTERfUEFUSC8uLi8uLi9xdWlja2Jvb2siIDsKICAgICAgICAgICAgICAgIEVDSE8gIiAgV2lsbCBub3cgdHJ5IHRvIGZpbmQgYSBwcmVjb21waWxlZCBleGVjdXRhYmxlIGJ5IHNlYXJjaGluZyIgOwogICAgICAgICAgICAgICAgRUNITyAiICB0aGUgUEFUSCBmb3IgJ3F1aWNrYm9vaycuIiA7CiAgICAgICAgICAgICAgICBFQ0hPICIgIFRvIGRpc2FibGUgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIG9yIHRvIGNvbXBsZXRlbHkiIDsKICAgICAgICAgICAgICAgIEVDSE8gIiAgYXZvaWQgY29tcGlsYXRpb24gb2YgcXVpY2tib29rLCB5b3UgY2FuIGV4cGxpY2l0bHkgc2V0IHRoZSIgOwogICAgICAgICAgICAgICAgRUNITyAiICBwYXRoIHRvIGEgcXVpY2tib29rIGV4ZWN1dGFibGUgY29tbWFuZCBpbiB1c2VyLWNvbmZpZy5qYW0iIDsKICAgICAgICAgICAgICAgIEVDSE8gIiAgb3Igc2l0ZS1jb25maWcuamFtIHdpdGggdGhlIGNhbGwiIDsKICAgICAgICAgICAgICAgIEVDSE8gIiAgICB1c2luZyBxdWlja2Jvb2sgOiAvcGF0aC90by9xdWlja2Jvb2sgOyIgOwoKICAgICAgICAgICAgICAgICMgQXMgYSBsYXN0IHJlc29ydCwgc2VhcmNoIGZvciAncXVpY2tib29rJyBjb21tYW5kIGluIHBhdGguIE5vdGUKICAgICAgICAgICAgICAgICMgdGhhdCBldmVuIGlmIHRoZSAncXVpY2tib29rJyBjb21tYW5kIGlzIG5vdCBmb3VuZCwKICAgICAgICAgICAgICAgICMgZ2V0LWludm9jYXRpb24tY29tbWFuZCB3aWxsIHN0aWxsIHJldHVybiAncXVpY2tib29rJyBhbmQgbWlnaHQKICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgYW4gZXJyb3Igd2hpbGUgZ2VuZXJhdGluZyB0aGUgdmlydHVhbC10YXJnZXQuCgogICAgICAgICAgICAgICAgcXVpY2tib29rLWJpbmFyeSA9IFsgY29tbW9uLmdldC1pbnZvY2F0aW9uLWNvbW1hbmQgcXVpY2tib29rIDogcXVpY2tib29rIF0gOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFkZCAkKHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzKSBhcyBhIGRlcGVuZGVuY3kgb2YgdGhlIGN1cnJlbnQKICAgICAgICAjIHByb2plY3QgYW5kIHNldCBpdCBhcyB0aGUgPHF1aWNrYm9vay1iaW5hcnk+IGZlYXR1cmUgZm9yIHRoZQogICAgICAgICMgcXVpY2tib29rLXRvLWJvb3N0Ym9vayBydWxlLCBiZWxvdy4KICAgICAgICBwcm9wZXJ0eS1zZXQgPSBbICQocHJvcGVydHktc2V0KS5hZGQtcmF3CiAgICAgICAgICAgIDxkZXBlbmRlbmN5PiQocXVpY2tib29rLWJpbmFyeS1kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIDxxdWlja2Jvb2stYmluYXJ5PiQocXVpY2tib29rLWJpbmFyeSkKICAgICAgICAgICAgPHF1aWNrYm9vay1iaW5hcnktZGVwZW5kZW5jaWVzPiQocXVpY2tib29rLWJpbmFyeS1kZXBlbmRlbmNpZXMpCiAgICAgICAgXSA7CgogICAgICAgIHJldHVybiBbIGdlbmVyYXRvci5ydW4gJChwcm9qZWN0KSAkKG5hbWUpIDogJChwcm9wZXJ0eS1zZXQpIDogJChzb3VyY2VzKSA6ICQobXVsdGlwbGUpIF0gOwogICAgfQp9CgoKIyBEZWZpbmUgYSBzY2FubmVyIGZvciB0cmFja2luZyBRQksgaW5jbHVkZSBkZXBlbmRlbmNpZXMuCiMKY2xhc3MgcWJrLXNjYW5uZXIgOiBjb21tb24tc2Nhbm5lcgp7CiAgICBydWxlIHBhdHRlcm4gKCApCiAgICB7CiAgICAgICAgcmV0dXJuICJcXFtbIF0qaW5jbHVkZVsgXSsoW15dXSspXFxdIiAKICAgICAgICAiXFxbWyBdKmluY2x1ZGU6W2EtekEtWjAtOV9dK1sgXSsoW15dXSspXFxdIiAKICAgICAgICAiXFxbWyBdKmltcG9ydFsgXSsoW15dXSspXFxdIiA7CiAgICB9Cn0KCgpzY2FubmVyLnJlZ2lzdGVyIHFiay1zY2FubmVyIDogaW5jbHVkZSA7Cgp0eXBlLnNldC1zY2FubmVyIFFVSUNLQk9PSyA6IHFiay1zY2FubmVyIDsKCgojIEluaXRpYWxpemF0aW9uIG9mIHRvb2xzZXQuCiMKIyBQYXJhbWV0ZXJzOgojICAgY29tbWFuZCA/ICAgIC0+IHBhdGggdG8gUXVpY2tCb29rIGV4ZWN1dGFibGUuCiMKIyBXaGVuIGNvbW1hbmQgaXMgbm90IHN1cHBsaWVkIHRvb2xzZXQgd2lsbCBzZWFyY2ggZm9yIFF1aWNrQm9vayBkaXJlY3RvcnkgYW5kCiMgY29tcGlsZSB0aGUgZXhlY3V0YWJsZSBmcm9tIHNvdXJjZS4gSWYgdGhhdCBmYWlscyB3ZSBzdGlsbCBzZWFyY2ggdGhlIHBhdGggZm9yCiMgJ3F1aWNrYm9vaycuCiMKcnVsZSBpbml0ICgKICAgICAgICBjb21tYW5kID8gICAjIHBhdGggdG8gdGhlIFF1aWNrQm9vayBleGVjdXRhYmxlLgogICAgKQp7CiAgICBpZiAhICQoLmluaXRpYWxpemVkKQogICAgewogICAgICAgIC5pbml0aWFsaXplZCA9IHRydWUgOwogICAgICAgIC5jb21tYW5kID0gJChjb21tYW5kKSA7CiAgICB9Cn0KCgpnZW5lcmF0b3JzLnJlZ2lzdGVyIFsgbmV3IHF1aWNrYm9vay1iaW5hcnktZ2VuZXJhdG9yIHF1aWNrYm9vay5xdWlja2Jvb2stdG8tYm9vc3Rib29rIDogUVVJQ0tCT09LIDogWE1MIF0gOwoKCiMgPHF1aWNrYm9vay1iaW5hcnk+IHNoZWxsIGNvbW1hbmQgdG8gcnVuIFF1aWNrQm9vawojIDxxdWlja2Jvb2stYmluYXJ5LWRlcGVuZGVuY2llcz4gdGFyZ2V0cyB0byBidWlsZCBRdWlja0Jvb2sgZnJvbSBzb3VyY2VzLgp0b29sc2V0LmZsYWdzIHF1aWNrYm9vay5xdWlja2Jvb2stdG8tYm9vc3Rib29rIFFCLUNPTU1BTkQgICAgICA8cXVpY2tib29rLWJpbmFyeT4gOwp0b29sc2V0LmZsYWdzIHF1aWNrYm9vay5xdWlja2Jvb2stdG8tYm9vc3Rib29rIFFCLURFUEVOREVOQ0lFUyA8cXVpY2tib29rLWJpbmFyeS1kZXBlbmRlbmNpZXM+IDsKdG9vbHNldC5mbGFncyBxdWlja2Jvb2sucXVpY2tib29rLXRvLWJvb3N0Ym9vayBJTkNMVURFUyAgICAgICAgPGluY2x1ZGU+IDsKCgpydWxlIHF1aWNrYm9vay10by1ib29zdGJvb2sgKCB0YXJnZXQgOiBzb3VyY2UgOiBwcm9wZXJ0aWVzICogKQp7CiAgICAjIFNpZ25hbCBkZXBlbmRlbmN5IG9mIHF1aWNrYm9vayBzb3VyY2VzIG9uIDxxdWlja2Jvb2stYmluYXJ5LWRlcGVuZGVuY2llcz4KICAgICMgdXBvbiBpbnZvY2F0aW9uIG9mIHF1aWNrYm9vay10by1ib29zdGJvb2suCiAgICBERVBFTkRTICQodGFyZ2V0KSA6IFsgb24gJCh0YXJnZXQpIHJldHVybiAkKFFCLURFUEVOREVOQ0lFUykgXSA7Cn0KCgphY3Rpb25zIHF1aWNrYm9vay10by1ib29zdGJvb2sKewogICAgIiQoUUItQ09NTUFORCkiIC1JIiQoSU5DTFVERVMpIiAtLW91dHB1dC1maWxlPSIkKDEpIiAiJCgyKSIgIAp9CgoKIyBEZWNsYXJlIGEgbWFpbiB0YXJnZXQgdG8gY29udmVydCBhIHF1aWNrYm9vayBzb3VyY2UgaW50byBhIGJvb3N0Ym9vayBYTUwgZmlsZS4KIwpydWxlIHRvLWJvb3N0Ym9vayAoIHRhcmdldC1uYW1lIDogc291cmNlcyAqIDogcmVxdWlyZW1lbnRzICogOiBkZWZhdWx0LWJ1aWxkICogKQp7IAogIGxvY2FsIHByb2plY3QgPSBbIHByb2plY3QuY3VycmVudCBdIDsKICAgIAogIHRhcmdldHMubWFpbi10YXJnZXQtYWx0ZXJuYXRpdmUgCiAgICBbIG5ldyB0eXBlZC10YXJnZXQgJCh0YXJnZXQtbmFtZSkgOiAkKHByb2plY3QpIDogWE1MCiAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtc291cmNlcyAkKHNvdXJjZXMpIDogJCh0YXJnZXQtbmFtZSkgXSAKICAgICAgICA6IFsgdGFyZ2V0cy5tYWluLXRhcmdldC1yZXF1aXJlbWVudHMgJChyZXF1aXJlbWVudHMpIDogJChwcm9qZWN0KSBdCiAgICAgICAgOiBbIHRhcmdldHMubWFpbi10YXJnZXQtZGVmYXVsdC1idWlsZCAkKGRlZmF1bHQtYnVpbGQpIDogJChwcm9qZWN0KSBdIAogICAgXSA7Cn0K