From: Daniel Finnie Date: 2006-12-11T10:52:09+09:00 Subject: Re: [QUIZ] Tournament Matchups (#105) --Boundary_(ID_TlmLM4p4p0SqxQgU8NofSQ) Content-type: text/plain; charset=ISO-8859-1; format=flowed Content-transfer-encoding: 7BIT OK, this is my updated version of the chart producing script that is in full compliance with the rules...those pesky things. All byes will be in the first round. The file is attached as the wrapping is messing it up. My other submission, that is 56 lines compared to this 463-liner, does not have the problem that was fixed in this version. The sample output from the quiz examples (with 2 FREE!): daniel@daniel-desktop:~$ ./tournie.rb -n 6 -c 1 -----+ |---+ -----+ | 1 bye +----+ | |---+ 4 +----+ | -----+ | 4 | |---+ | -----+ | 1 5 +----+ | |---> 1 2 +----+ -----+ | 2 |---+ | -----+ | 2 | bye +----+ | | |---+ 3 +----+ -----+ | 3 |---+ -----+ 6 daniel@daniel-desktop:~$ ./tournie.rb -n 8 -c 1 ---+ |---+ ---+ | 1 8 +----+ | |---+ 4 +----+ | ---+ | 4 | |---+ | ---+ | 1 5 +----+ | |---> 1 2 +----+ ---+ | 2 |---+ | ---+ | 2 | 7 +----+ | | |---+ 3 +----+ ---+ | 3 |---+ ---+ 6 daniel@daniel-desktop:~$ ./tournie.rb -f tournie.csv -c Red Devils ------------+ |---+ ------------+ | Red Devils Underdogs +-------------+ | |---+ Metrostart +-------------+ | ------------+ | Metrostart | |---+ | ------------+ | Red Devils Giants +-------------+ | |---> Red Devils Mets +-------------+ ------------+ | Mets |---+ | ------------+ | Mets | Jets +-------------+ | | |---+ Yankees +-------------+ ------------+ | Yankees |---+ ------------+ Red Sox daniel@daniel-desktop:~$ ./tournie.rb -f tournie.csv -c -5 c Red Devils ------------+ |---+ ------------+ | Red Devils Underdogs +-------------+ | |---+ Metrostart +-------------+ | ------------+ | Metrostart | |---+ | ------------+ | Red Devils Giants +-------------+ | |---> Red Devils Mets +-------------+ ------------+ | Mets |---+ | ------------+ | Mets | Jets +-------------+ | | |---+ Yankees +-------------+ ------------+ | Yankees |---+ ------------+ Red Sox --Boundary_(ID_TlmLM4p4p0SqxQgU8NofSQ) Content-type: text/x-comma-separated-values; name=tournie.csv Content-transfer-encoding: 7BIT Content-disposition: inline; filename=tournie.csv 5,Metrostart 4,Yankees 8,Red Sox 7,Giants 2,Red Devils 9,Jets 3,Mets 56,Underdogs --Boundary_(ID_TlmLM4p4p0SqxQgU8NofSQ) Content-type: application/x-ruby; name=tournie.rb Content-transfer-encoding: base64 Content-disposition: inline; filename=tournie.rb IyEgL3Vzci9iaW4vcnVieQpyZXF1aXJlICdlbnVtZXJhdG9yJwpyZXF1aXJlICdvcHRwYXJz ZScKcmVxdWlyZSAnb3N0cnVjdCcKCmNsYXNzIFN0cmluZwoJIyBBbGlhcyBmb3IgU3RyaW5n I2NlbnRlciB0aGF0IGZpdHMgaW50byB0aGUgbGp1c3QsIHJqdXN0IG5hbWluZyBzY2hlbWUu CglkZWYgY2p1c3QoKmFyZ3MpCgkJc2VsZi5jZW50ZXIoKmFyZ3MpCgllbmQKCQoJIyBhbGln big6ciwgNSkgLS0+IHJqdXN0KDUpLiAgQWxpZ25tZW50IGNhbiBiZSA6ciwgOmwsIDpjCglk ZWYgYWxpZ24oYWxpZ25tZW50LCAqYXJncykKCQlzZWxmLnNlbmQoKGFsaWdubWVudC50b19z ICsgImp1c3QiKS50b19zeW0sICphcmdzKQoJZW5kCmVuZAkKCmNsYXNzIE51bWVyaWMKCSMg SXMgdGhlIGdpdmVuIG51bWJlciBhIHBvd2VyIG9mIHNlbGY/CgkjIDE2LmlzUG93ZXJPZigy KSA9PSB0cnVlCgkjIDEwMC5pc1Bvd2VyT2YoMikgPT0gZmFsc2UKCWRlZiBpc1Bvd2VyT2Yo b3RoZXIpCgkJaSA9IDAKCQl3aGlsZSAob3RoZXIgKiogaSA8PSBzZWxmKQoJCQlyZXR1cm4g dHJ1ZSBpZiBvdGhlciAqKiBpID09IHNlbGYKCQkJaSArPSAxCgkJZW5kCgkJZmFsc2UKCWVu ZAoJCglkZWYgYXZlcmFnZShvdGhlcikKCQkoc2VsZiArIG90aGVyKSAvIDIKCWVuZAplbmQK CiMgUm91bmRzIGhhdmUgbWF0Y2hlcyB3aGljaCBoYXZlIGEgd2lubmluZyBhbmQgbG9vc2lu ZyB0ZWFtLgpjbGFzcyBNYXRjaAoJZGVmIGluaXRpYWxpemUoKnRlYW1zKQoJCUB0ZWFtcyA9 IHRlYW1zLnNvcnQKCQlzZXRMb3NlcgoJZW5kCgkKCSMgVGhlIGxvc2VyIGlzIGRlZmluZWQg YXMgdGhlIHRlYW0gd2l0aCB0aGUgbG93ZXN0IHJhbmtpbmcgYmVmb3JlIHRoZSB0b3VybmFt ZW50LgoJZGVmIHNldExvc2VyCgkJQHRlYW1zLmxhc3QuZWxpbWluYXRlCgllbmQKCQoJZGVm IHdpbm5lcgoJCUB0ZWFtcy5maW5ke3x4fCAheC5lbGltaW5hdGVkP30KCWVuZAoJCglkZWYg bG9zZXIKCQlAdGVhbXMuZmluZHt8eHwgeC5lbGltaW5hdGVkPyB9CgllbmQKCQoJIyBSZXR1 cm4gaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6IDx3aW5uZXI+IHZzLiA8bG9vc2VyPgoJZGVm IHRvX3MKCQlAdGVhbXMuY29sbGVjdHt8dGVhbXwgdGVhbS50b19zfS5qb2luKCIgdnMuICIp CgllbmQKCQoJYXR0cl9yZWFkZXIgOnRlYW1zCmVuZAoKIyBUb3VybmFtZW50cyBoYXZlIHJv dW5kcywgd2hpY2ggaGF2ZSBtYXRjaGVzLgpjbGFzcyBSb3VuZAoJQEB0b3RhbFJvdW5kcyA9 IDAKCQoJZGVmIGluaXRpYWxpemUoKQoJCUBtYXRjaGVzID0gW10KCQlAcm91bmROdW0gPSBA QHRvdGFsUm91bmRzICs9IDEKCWVuZAoJCglkZWYgYWRkTWF0Y2gobWF0Y2gpCgkJQG1hdGNo ZXMucHVzaChtYXRjaCkKCWVuZAoKCSMgUHJpbnRzIHRoZSByb3VuZCBpbiAiUm91bmQgeDog PG1hdGNoPiwgPG1hdGNoPiwgZXRjLiIgZm9ybWF0LgoJZGVmIHRvX3MKCQkiUm91bmQgI3tA cm91bmROdW19OiAiICsgQG1hdGNoZXMuam9pbigiLCAiKSArICIuIgoJZW5kCgkKCSMgVGhp cyBjaGFuZ2VzIHRoZSBvcmRlciBvZiB0aGUgbWF0Y2hlcyBzbyB0aGF0IGluIHRoZSBuZXh0 IHJvdW5kLCB0aGUgbW9zdCBleHRyZW1lIHRlYW1zIHdpbGwgZmFjZSBvZmYuCgkjIEFzc3Vt ZXMgdGhhdCB0aGUgbWF0Y2hlcyB3ZXJlIHByZXZpb3VzbHkgc29ydGVkIGJ5IGZhdm9yYWJp bGl0eSAoYXNjIG9yIGRlc2MpCglkZWYgc29ydCEKCQlzb3J0ZWQgPSBbXQoJCXdoaWxlIEBt YXRjaGVzLmxlbmd0aCA+IDAKCQkJc29ydGVkIDw8IEBtYXRjaGVzLnNoaWZ0IDw8IEBtYXRj aGVzLnBvcAoJCWVuZAoJCUBtYXRjaGVzID0gc29ydGVkLmNvbXBhY3QKCQlzZWxmCgllbmQK CQoJYXR0cl9yZWFkZXIgOnJvdW5kTnVtLCA6bWF0Y2hlcwplbmQKCiMgTWF0Y2hlcyBoYXZl IHRlYW1zIHdoaWNoIGhhdmUgaW5mbyBhYm91dCB0aGVtc2VsdmVzLgpjbGFzcyBUZWFtCglA QGZhdm9yZWQgPSBbXQoJQEBjdXJyZW50Um91bmQgPSBuaWwKCUBAdG90YWwgPSAwCgkKCWRl ZiBpbml0aWFsaXplKG5hbWUpCgkJQG5hbWUgPSBuYW1lCgkJQGVsaW1pbmF0ZWQgPSBmYWxz ZQoJCUByb3VuZHMgPSBbXQoJCUBAZmF2b3JlZC5wdXNoKHNlbGYpCgkJQEB0b3RhbCArPSAx CgkJc2VsZgoJZW5kCgkKCSMgUmVtb3ZlIGEgdGVhbSBmcm9tIGZ1dHVyZSByb3VuZHMgaWYg dGhleSBsb3N0LgoJZGVmIGVsaW1pbmF0ZQoJCUBlbGltaW5hdGVkID0gdHJ1ZQoJCUBAZmF2 b3JlZC5kZWxldGUoc2VsZikKCWVuZAoJCgkjIElmIGEgdGVhbSBoYXMgcGxheWVkIGluIGEg Y2VydGFpbiByb3VuZC4KCWRlZiBpblJvdW5kPygpCgkJQHJvdW5kcy5pbmNsdWRlPyBAQGN1 cnJlbnRSb3VuZAoJZW5kCgkKCSMgQWRkIGEgcm91bmQgYSB0ZWFtIGhhcyBwbGF5ZWQgaW4K CWRlZiBhZGRQbGF5ZWRSb3VuZCgpCgkJQHJvdW5kcyA8PCBAQGN1cnJlbnRSb3VuZAoJCXNl bGYKCWVuZAoJCgkjIFJldHVybnMgYW4gYXJyYXkgd2l0aCB0ZWFtcyBub3QgaW4gdGhlIGN1 cnJlbnQgcm91bmQgYnkgZmF2b3JhYmlsaXR5LgoJZGVmIHNlbGYuZWxpZ2libGVUZWFtcygp CgkJQEBmYXZvcmVkLnNlbGVjdHt8eHwgIXguaW5Sb3VuZD99LnNvcnQKCWVuZAoJCglkZWYg PD0+KG90aGVyKQoJCUBAZmF2b3JlZC5pbmRleChzZWxmKSA8PT4gQEBmYXZvcmVkLmluZGV4 KG90aGVyKQoJZW5kCgkKCWRlZiBzZWxmLmN1cnJlbnRSb3VuZD0ocm91bmQpCgkJQEBjdXJy ZW50Um91bmQgPSByb3VuZAoJZW5kCgkKCWRlZiBzZWxmLnRvdGFsCgkJQEB0b3RhbAoJZW5k CgkKCWF0dHJfcmVhZGVyIDpuYW1lLCA6ZWxpbWluYXRlZAoJYWxpYXNfbWV0aG9kIDoiZWxp bWluYXRlZD8iLCA6ZWxpbWluYXRlZAoJYWxpYXNfbWV0aG9kIDoidG9fcyIsIDpuYW1lCmVu ZAoKY2xhc3MgVG91cm5hbWVudAoJIyBSZWNpZXZlcyBhbiBhcmF5IG9mIHRlYW0gbmFtZXMg aW4gb3JkZXIgb2YgcmFua2luZyB3aXRoIHRoZSBiZXN0IGZpcnN0LgoJZGVmIGluaXRpYWxp emUodGVhbXMpCgkJQHRlYW1zID0gdGVhbXMuY29sbGVjdCB7fHRlYW18IFRlYW0ubmV3KHRl YW0udG9fcykgfQoJCUByb3VuZHMgPSBbXQoJZW5kCgkKCWRlZiBjcmVhdGVOZXh0Um91bmQK CQljdXJyZW50Um91bmQgPSBSb3VuZC5uZXcoKQoJCVRlYW0uY3VycmVudFJvdW5kID0gY3Vy cmVudFJvdW5kCgkJCgkJIyBUaGUgdG9wIHRlYW1zIGhhdmUgYSAiYnllIiBvcHBvbmVudCBp ZiB0aGUgbnVtYmVyIG9mIHRlYW1zIGlzbid0IGEgcG93ZXIgb2YgdHdvLiAgQnllIG9wcG9u ZW50cyBhbHdheXMgbG9zZS4KCQl1bnRpbCAoVGVhbS50b3RhbC5pc1Bvd2VyT2YoMikpCgkJ CWN1cnJlbnRSb3VuZC5hZGRNYXRjaCggTWF0Y2gubmV3KAoJCQkJVGVhbS5lbGlnaWJsZVRl YW1zLmZpcnN0LmFkZFBsYXllZFJvdW5kLAoJCQkJVGVhbS5uZXcoImJ5ZSIpLmFkZFBsYXll ZFJvdW5kCgkJCSkgKQoJCWVuZAoJCQoJCSMgQXNzaWduIHRoZSByZXN0IG9mIHRoZSB0ZWFt cyB0byBwbGF5IHRoZWlyIGV4dHJlbWUgb3Bwb3NpdGVzLgoJCXdoaWxlKFRlYW0uZWxpZ2li bGVUZWFtcy5sZW5ndGggPiAxKQoJCQljdXJyZW50Um91bmQuYWRkTWF0Y2goIE1hdGNoLm5l dygKCQkJCVRlYW0uZWxpZ2libGVUZWFtcy5sYXN0LmFkZFBsYXllZFJvdW5kLAoJCQkJVGVh bS5lbGlnaWJsZVRlYW1zLmZpcnN0LmFkZFBsYXllZFJvdW5kCgkJCSkgKQoJCWVuZAoJCQoJ CWN1cnJlbnRSb3VuZC5zb3J0ISBpZiBjdXJyZW50Um91bmQucm91bmROdW0gPT0gMQoJCUBy b3VuZHMucHVzaChjdXJyZW50Um91bmQpCgllbmQKCQoJZGVmIGNyZWF0ZUFsbFJvdW5kcwoJ CXVudGlsIChAdGVhbXMuZmluZF9hbGx7fHh8ICF4LmVsaW1pbmF0ZWQ/fS5sZW5ndGggPT0g MSkKCQkJY3JlYXRlTmV4dFJvdW5kCgkJZW5kCgllbmQKCQoJZGVmIHRvX3MKCQlAcm91bmRz LmpvaW4oIlxuIikKCWVuZAoJCglkZWYgdG9BU0NJSUNoYXJ0KGNoYXJ0SGVpZ2h0TW9kaWZp ZXIsIHNwYWNpbmdMZWZ0LCBzcGFjaW5nUmlnaHQsIGFsaWdubWVudCkKCQkjIEV2ZXJ5dGhp bmcgZ29lcyBpbnRvIHRoaXMgYXJyYXkgaW4gb3V0cHV0W3hdW3ldIGZvcm1hdCwgd2hpY2gg aXMgdGhlbiBwcmludGVkLiAgVGhlIG9yaWdpbiBpcyBpbiB0aGUgdG9wIGxlZnQuCgkJb3V0 cHV0ID0gQVNDSUlDb29yZGluYXRlUGxhbmUubmV3CgkJCgkJIyBUaGlzIHN0b3JlcyB0aGUg bWlkcG9pbnRzIG9mIHRoZSBleGlzdGluZyBnYW1lcyBvdXRwdXR0ZWQgc28gdGhhdCB0aGUg bmV4dCByb3VuZCdzIG1hdGNoZXMgd2lsbCBiZSBhbGlnbmVkIGluIGJldHdlZW4gdGhpcyBy b3VuZCdzIG1hdGNoZXMuCgkJbWlkcG9pbnRzID0gSGFzaC5uZXcoIEFycmF5Lm5ldyApCgkJ bWlkcG9pbnRzWzFdID0gW2NoYXJ0SGVpZ2h0TW9kaWZpZXJdCgkJQHJvdW5kcy5maXJzdC5t YXRjaGVzLmVhY2gge21pZHBvaW50c1sxXS51bnNoaWZ0KCBtaWRwb2ludHNbMV0uZmlyc3Qg LSAoY2hhcnRIZWlnaHRNb2RpZmllciArIDIpICl9CgkJCgkJeCA9IDIKCQkKCQkjIEV2ZXJ5 IHJvdW5kIGlzIG9uZSBjb2x1bW4uCgkJQHJvdW5kcy5lYWNoIGRvIHxyb3VuZHwKCQkJIyBU aGUgbG9uZ2VzdCB0ZWFtIG5hbWUuCgkJCWNvbHVtbldpZHRoID0gcm91bmQubWF0Y2hlcy5j b2xsZWN0e3xtYXRjaHwgbWF0Y2gudGVhbXN9LmZsYXR0ZW4uY29sbGVjdHt8dGVhbXwgdGVh bS5uYW1lfS5tYXh7fGEsIGJ8IGEubGVuZ3RoIDw9PiBiLmxlbmd0aH0ubGVuZ3RoICsgc3Bh Y2luZ1JpZ2h0CgkJCQoJCQljb25uZWN0VGhlRG90cyA9IFtdCgkJCWluc2VydE1pZHBvaW50 ID0gdHJ1ZQoJCQkKCQkJIyBFdmVyeSBpdGVyYXRpb24gbWFrZXMgMSBtYXRjaCBhcHBlYXIu CgkJCXJvdW5kLm1hdGNoZXMucmV2ZXJzZS5lYWNoIGRvIHxtYXRjaHwKCQkJCXkgPSBtaWRw b2ludHNbcm91bmQucm91bmROdW1dLnNoaWZ0ICsgMgoJCQkJCgkJCQkjIFRoZSBmaXJzdCB0 ZWFtJ3MgbmFtZS4KCQkJCW91dHB1dC5zZXQoeCwgeSwgbWF0Y2gudGVhbXNbMF0ubmFtZS50 b19zLmFsaWduKGFsaWdubWVudCwgY29sdW1uV2lkdGgpKQoJCQkJCgkJCQkjIFRoZSBsaW5l IHVuZGVyIHRoYXQgdGVhbSdzIG5hbWUuCgkJCQlvdXRwdXQuZmlsbCh4IC0gc3BhY2luZ0xl ZnQsIHkgLT0gMSwgeCArIGNvbHVtbldpZHRoLCB5LCAiLSIpCgkJCQlvdXRwdXQuc2V0KHgg LSBzcGFjaW5nTGVmdCwgeSwgIisiKQoJCQkJb3V0cHV0LmZpbGwoMCwgeSwgeCAtIDEsIHks ICIgIikgaWYgcm91bmQucm91bmROdW0gPT0gMQoJCQkJCgkJCQkjIFRoZSBjb25uZWN0b3Ig dG8gdGhlIG5leHQgcm91bmQuCgkJCQlvdXRwdXQuc2V0KHggKyBjb2x1bW5XaWR0aCArIDEs IHkgLT0gMSwgIi0iICogMykKCQkJCQoJCQkJIyBEZWFscyB3aXRoIHRoZSBtaWRwb2ludHMu CgkJCQlpZiBpbnNlcnRNaWRwb2ludAoJCQkJCW1pZHBvaW50c1tyb3VuZC5yb3VuZE51bSAr IDFdLnB1c2goeSkKCQkJCWVsc2UKCQkJCQltaWRwb2ludHNbcm91bmQucm91bmROdW0gKyAx XS5wdXNoKCBtaWRwb2ludHNbcm91bmQucm91bmROdW0gKyAxXS5wb3AuYXZlcmFnZSh5KSAp CgkJCQllbmQKCQkJCWluc2VydE1pZHBvaW50ID0gIWluc2VydE1pZHBvaW50CgkJCQkKCQkJ CSMgVGhlIGxpbmUgYWJvdmUgdGhlIG5leHQgdGVhbSdzIG5hbWUuCgkJCQlvdXRwdXQuZmls bCh4IC0gc3BhY2luZ0xlZnQsIHkgLT0gMSwgeCArIGNvbHVtbldpZHRoLCB5LCAiLSIpCgkJ CQlvdXRwdXQuc2V0KHggLSBzcGFjaW5nTGVmdCwgeSwgIisiKQoJCQkJb3V0cHV0LmZpbGwo MCwgeSwgeCAtIDEsIHksICIgIikgaWYgcm91bmQucm91bmROdW0gPT0gMQoJCQkJCgkJCQkj IFRoZSBuZXh0IHRlYW0ncyBuYW1lLgoJCQkJb3V0cHV0LnNldCh4LCB5IC09IDEsIG1hdGNo LnRlYW1zWzFdLm5hbWUudG9fcy5hbGlnbihhbGlnbm1lbnQsIGNvbHVtbldpZHRoKSkKCQkJ CQoJCQkJIyBUaGUgbGluZSBvbiB0aGUgcmlnaHQgb2YgdGhlIG1hdGNoIGdvaW5nIHZlcnRp Y2FsbHkuCgkJCQlvdXRwdXQudmVydExpbmUoeCArIGNvbHVtbldpZHRoLCB5ICsgMywgeSsx KQoJCQkJCgkJCQkjIFRvIGNvbm5lY3QgdGhlIG1hdGNoIGFuZCB0aGUgbmV4dCBtYXRjaCB0 byBlYWNoIG90aGVyLgoJCQkJY29ubmVjdFRoZURvdHMucHVzaCh5KzIpCgkJCWVuZAoJCQl4 ICs9IGNvbHVtbldpZHRoICsgNAoJCQkKCQkJIyBNYWtlcyB0aGUgbGluZXMgdmVydGljYWxs eSBiZXR3ZWVuIG1hdGNoZXMuCgkJCWNvbm5lY3RUaGVEb3RzLmVhY2hfc2xpY2UoMikgZG8g fHl2YWx1ZXN8CgkJCQlzdGFydGluZyA9IHl2YWx1ZXNbMF0KCQkJCWlmIHl2YWx1ZXNbMV0K CQkJCQllbmRpbmcgPSB5dmFsdWVzWzFdCgkJCQllbHNlCgkJCQkJZW5kaW5nID0gc3RhcnRp bmcKCQkJCWVuZAoJCQkJCgkJCQlvdXRwdXQudmVydExpbmUoeCwgc3RhcnRpbmcsIGVuZGlu ZykKCQkJZW5kCgkJCQoJCQl4ICs9IHNwYWNpbmdMZWZ0CgkJZW5kCgkJCgkJIyBQcmludCB0 aGUgd2lubmluZyB0ZWFtLgoJCW91dHB1dC5zZXQoeCAtIHNwYWNpbmdMZWZ0LCBtaWRwb2lu dHNbQHJvdW5kcy5sZW5ndGhdLmxhc3QsICI+ICIgKyBAcm91bmRzLmxhc3QubWF0Y2hlc1sw XS53aW5uZXIubmFtZSkKCQlvdXRwdXQKCWVuZAoJCglhdHRyX3JlYWRlciA6cm91bmRzCmVu ZAoKIyBSZXByZXNlbnRzIGEgY29vcmRpbmF0ZSBwbGFuZSB3aXRoIHRoZSBvcmlnaW4gaW4g dGhlIHRvcCBsZWZ0LiAgRXZlcnkgcG9zaXRpb24gY2FuIHN0b3JlIGEgY2hhcmFjdGVyLgpj bGFzcyBBU0NJSUNvb3JkaW5hdGVQbGFuZQoJZGVmIGluaXRpYWxpemUKCQkjIFRoYW5rIHlv dSBKb2VsIFZhbmRlcldlcmYhCgkJQHZhbHVlID0gSGFzaC5uZXcge3xoLGt8IGhba10gPSBI YXNoLm5ldyB7IiAifX0KCQkKCQlAbWF4eCA9IDEwCgkJQG1pbnkgPSAtMTAKCWVuZAoJCgkj IFNldHMgYSBzcGVjaWZpYyBjaGFyYWN0ZXIgdG8gYSBwb2ludCwgb3ZlcmZsb3dpbmcgb250 byBwb2ludHMgdG8gdGhlIHJpZ2h0IGlmIG5lY2Nlc3NhcnkuCglkZWYgc2V0KHgsIHksIHN0 cmluZykKCQkwLnVwdG8oc3RyaW5nLmxlbmd0aC0xKSBkbyB8aW5kZXh8CgkJCUB2YWx1ZVt4 XVt5XSA9IHN0cmluZ1tpbmRleF0uY2hyCQoJCQl4ICs9IDEKCQllbmQKCQkKCQlAbWlueSA9 IHkgaWYgeSA8IEBtaW55CgkJQG1heHggPSB4IGlmIHggPiBAbWF4eAoJZW5kCgkKCSMgRmls bCBhIGhvcml6b250YWwgbGluZSB3aXRoIGEgcmVwZWF0aW5nIGNoYXJhY3Rlci4KCWRlZiBm aWxsSG9yeihvcHRzKQoJCXNldChvcHRzWzpzdGFydHhdLCBvcHRzWzpzdGFydHldLCBvcHRz WzpzdHJpbmcgXSAqIChvcHRzWzplbmR4XSAtIG9wdHNbOnN0YXJ0eF0pLmFicykKCWVuZAoJ CgkjIEZpbGwgYSB2ZXJ0aWNhbCBsaW5lIHdpdGggYSByZXBlYXRpbmcgY2hhcmFjdGVyLgoJ ZGVmIGZpbGxWZXJ0KG9wdHMpCgkJeXZhbHVlcyA9IFtvcHRzWzpzdGFydHldLCBvcHRzWzpl bmR5XV0KCQl5ID0geXZhbHVlcy5tYXgKCQkKCQl1bnRpbCAoeSA8IHl2YWx1ZXMubWluKQoJ CQlzZXQob3B0c1s6c3RhcnR4XSwgeSwgb3B0c1s6c3RyaW5nXSkKCQkJeSAtPSAxCgkJZW5k CgllbmQKCQoJIyBGaWxscyBhIHN0cmFpZ2h0LCBub24tZGlhZ29uYWwgbGluZSB3aXRoIGEg cmVwZWF0aW5nIGNoYXJhY3RlcgoJZGVmIGZpbGwoc3RhcnR4LCBzdGFydHksIGVuZHgsIGVu ZHksIHN0cmluZykKCQlpZiBzdGFydHggPT0gZW5keAoJCQlmaWxsVmVydCh7OnN0YXJ0eCA9 PiBzdGFydHgsIDplbmR4ID0+IGVuZHgsIDpzdGFydHkgPT4gc3RhcnR5LCA6ZW5keSA9PiBl bmR5LCA6c3RyaW5nID0+IHN0cmluZ30pCgkJZWxzZQoJCQlmaWxsSG9yeih7OnN0YXJ0eCA9 PiBzdGFydHgsIDplbmR4ID0+IGVuZHgsIDpzdGFydHkgPT4gc3RhcnR5LCA6ZW5keSA9PiBl bmR5LCA6c3RyaW5nID0+IHN0cmluZ30pCgkJZW5kCgllbmQKCQoJIyBDcmVhdGVzIGEgdmVy dGljYWwgbGluZSB3aXRoICsncyBmb3IgdGhlIGxpbmUgZW5kaW5ncy4KCWRlZiB2ZXJ0TGlu ZSh4LCBzdGFydHksIGVuZHkpCgkJZmlsbCh4LCBzdGFydHksIHgsIGVuZHksICJ8IikKCQlb c3RhcnR5LCBlbmR5XS5lYWNoIHt8eXwgc2V0KHgsIHksICIrIikgfQoJZW5kCgkKCSMgT3V0 cHV0cyB0aGUgY29vcmRpbmF0ZSBwbGFuZSB0byBhIHN0cmluZyB3aXRoIHNwYWNlcyB3aGVy ZSBubyBjaGFyYWN0ZXIgd2FzIGVudGVyZWQuCglkZWYgdG9fcwoJCW91dHB1dCA9ICIiCgkJ MC5kb3dudG8oQG1pbnkpIGRvIHx5fAoJCQkwLnVwdG8oQG1heHgpIGRvIHx4fAoJCQkJb3V0 cHV0ICs9IEB2YWx1ZVt4XVt5XQoJCQllbmQKCQkJb3V0cHV0ICs9ICJcbiIKCQllbmQKCQlv dXRwdXQKCWVuZAplbmQKCmNsYXNzIE9wdFBhcnNlcgoJZGVmIHNlbGYucGFyc2UoYXJncykK CQlvcHRpb25zID0gT3BlblN0cnVjdC5uZXcKCQlvcHRpb25zLmNzdiA9IG5pbAoJCW9wdGlv bnMubnVtZXJpY2FsID0gbmlsCgkJb3B0aW9ucy5sZWFndWUgPSBuaWwKCQlvcHRpb25zLmNo YXJ0ID0gZmFsc2UKCQlvcHRpb25zLmNoYXJ0aGVpZ2h0ID0gNAoJCW9wdGlvbnMuc3BhY2lu Z2xlZnQgPSAzCgkJb3B0aW9ucy5zcGFjaW5ncmlnaHQgPSAxCgkJb3B0aW9ucy5hbGlnbm1l bnQgPSA6bAoJCW9wdGlvbnMudGV4dHVhbCA9IGZhbHNlCgkJCgkJIyBXaGVuIGNhbGxlZCB3 aXRoIG5vIG9wdGlvbnMsIHNob3cgdGhlIGhlbHAuCgkJYXJncyA9IFsiLT8iXSBpZiBhcmdz LmVtcHR5PwoJCQoJCW9wdHMgPSBPcHRpb25QYXJzZXIubmV3IGRvIHxvcHRzfAoJCQlvcHRz LmJhbm5lciA9ICJVc2FnZTogdG91cm5pZS5yYiBbb3B0aW9uc10iCgkJCW9wdHMuc2VwYXJh dG9yICIiCgkJCW9wdHMuc2VwYXJhdG9yICJVc2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0 aW9ucyB0byBkZXRlcm1pbmUgdGhlIHRlYW1zOiIKCQkJCgkJCSMgRnJvbSAxIHRvIGEgbnVt ZXJpY2FsIHZhbHVlLgoJCQlvcHRzLm9uKCItbiIsICItLW51bWVyaWNhbCBURUFNUyIsCgkJ CQkJIlRFQU1TIG51bWJlciBvZiB0ZWFtcyB3aGVyZSAxIGlzIHRoZSBiZXN0IiwKCQkJCQki YW5kIFRFQU1TIGlzIHRoZSB3b3JzdC4iKSBkbyB8bnwKCQkJCQkJb3B0aW9ucy5udW1lcmlj YWwgPSBuCgkJCWVuZAoJCQkKCQkJIyBGcm9tIGEgQ1NWIGZpbGUKCQkJb3B0cy5vbigiLWYi LCAiLS1mcm9tLWNzdiBGSUxFIiwKCQkJCQkiQ1NWIGZpbGUgRklMRSB0byBnZXQgdGVhbSBk YXRhIGZyb20uIiwKCQkJCQkiPHJhbms+LDxuYW1lPlxcbiBmb3JtYXQiKSBkbyB8ZmlsZXwK CQkJCQkJb3B0aW9ucy5jc3YgPSBmaWxlCgkJCWVuZAoJCQkKCQkJb3B0cy5zZXBhcmF0b3Ig IiIKCQkJb3B0cy5zZXBhcmF0b3IgIkFuZCBhbnkgbnVtYmVyIG9mIHRoZXNlIHRvIGRldGVy bWluZSB0aGUgb3V0cHV0IGZvcm1hdChzKToiCgkJCQoJCQkjIENoYXJ0IGJhc2VkIHJlcHJl c2VudGF0aW9uCgkJCW9wdHMub24oIi1jIiwgIi0tW25vLV1jaGFydCIsCgkJCQkJIkRpc3Bs YXkgYW4gQVNDSUkgYmFzZWQgY2hhcnQgb2Ygcm91bmRzIikgZG8gfGNoYXJ0WWVzTm9NYXli ZU5hTnwKCQkJCQkJb3B0aW9ucy5jaGFydCA9IGNoYXJ0WWVzTm9NYXliZU5hTgoJCQllbmQK CQkJCgkJCSMgVGV4dHVhbCByZXByZXNlbnRhdGlvbgoJCQlvcHRzLm9uKCItdCIsICItLVtu by1ddGV4dCIsCgkJCQkJIkRpc3BsYXkgdGhlIHJvdW5kcyBpbiBhIHRleHR1YWwgZm9ybWF0 LCIsCgkJCQkJImZvciBleGFtcGxlOiIsCgkJCQkJIlJvdW5kIDE6IDEgdnMuIDgsIDQgdnMu IDUuLi4iKSBkbyB8dGV4dHwKCQkJCQkJb3B0aW9ucy50ZXh0dWFsID0gdGV4dAoJCQllbmQK CQkJCgkJCW9wdHMuc2VwYXJhdG9yICIiCgkJCW9wdHMuc2VwYXJhdG9yICJUaGUgZm9sbG93 aW5nIGFyZSBjb21wbGV0ZWx5IG9wdGlvbmFsOiIKCQkJb3B0cy5zZXBhcmF0b3IgIih0aGUg c2hvcnQgbmFtZXMgY29ycmVzcG9uZCB3aXRoIHBvc2l0aW9ucyBvbiB0aGUgbnVtLXBhZCki CgkJCQoJCQkjIENoYXJ0IGhlaWdodCBtb2RpZmllcgoJCQlvcHRzLm9uKCItOCIsICItLWNo YXJ0LWhlaWdodCBIRUlHSFQiLAoJCQkJCSJDb250cm9scyB0aGUgdmVydGljYWwgc3BhY2lu ZyBvbiB0aGUgY2hhcnQsIiwKCQkJCQkid2l0aCBhIGhpZ2hlciBIRUlHSFQgbWVhbmluZyBt b3JlIHNwYWNpbmcuIiwgCgkJCQkJIkRlZmF1bHRzIHRvIDQsIG11c3QgYmUgYW4gaW50ZWdl ciBhYm92ZSAyLiIpIGRvIHxoZWlnaHwKCQkJCQkJb3B0aW9ucy5jaGFydGhlaWdodCA9IGhl aWdoLnRvX2kKCQkJZW5kCgkJCQkKCQkJIyBTcGFjaW5nIHRvIHRoZSBsZWZ0IG9mIHRlYW0g bmFtZXMuCgkJCW9wdHMub24oIi00IiwgIi0tc3BhY2luZy1sZWZ0IFNQQUNFIiwKCQkJCQki Q29udHJvbHMgdGhlIHNwYWNlIHRvIHRoZSBsZWZ0IG9mIHRoZSB0ZWFtIG5hbWVzLiIsCgkJ CQkJIkRlZmF1bHRzIHRvIDMsIG11c3QgYmUgYSBwb3NpdGl2ZSwgbm9uLW5lZ2F0aXZlIGlu dGVnZXIuIikgZG8gfHN8CgkJCQkJCW9wdGlvbnMuc3BhY2luZ2xlZnQgPSBzLnRvX2kKCQkJ ZW5kCgkJCQoJCQkjIFNwYWNpbmcgdG8gdGhlIHJpZ2h0IG9mIHRlYW0gbmFtZXMuCgkJCW9w dHMub24oIi02IiwgIi0tc3BhY2luZy1yaWdodCBTUEFDRSIsCgkJCQkJIkNvbnRyb2xzIHRo ZSBzcGFjZSB0byB0aGUgcmlnaHQgb2YgdGhlIHRlYW0gbmFtZXMuIiwKCQkJCQkiRGVmYXVs dHMgdG8gMSwgbXVzdCBiZSBhIHBvc2l0aXZlLCBub24tbmVnYXRpdmUgaW50ZWdlci4iKSBk byB8c3wKCQkJCQkJb3B0aW9ucy5zcGFjaW5ncmlnaHQgPSBzLnRvX2kKCQkJZW5kCgkJCQoJ CQkjIEFsaWdubWVudCBvZiB0ZWFtIG5hbWVzLgoJCQlvcHRzLm9uKCItNSIsICItLXRlYW0t YWxpZ25tZW50IEFMSUdOTUVOVCIsCgkJCQkJIlRoZSBhbGlnbm1lbnQgb2YgdGVhbSBuYW1l cyBvbiB0aGVpciBsaW5lcy4iLAoJCQkJCSJEZWZhdWx0cyB0byBbbF1lZnQsIGNhbiBiZSBb cl1pZ2h0IG9yIFtjXWVudGVyZWQuIiwKCQkJCQkiVGFrZXMgLTYgYnV0IG5vdCAtNCBpbnRv IGFjY291bnQuIikgZG8gfHN8CgkJCQkJCW9wdGlvbnMuYWxpZ25tZW50ID0gcy50b19zeW0K CQkJZW5kCgkJCQoJCQlvcHRzLm9uKCItPyIsICItaCIsICItLWhlbHAiLCAiU2hvdyB0aGlz IG1lc3NhZ2UiKSBkbwoJCQkJcHV0cyBvcHRzCgkJCQlleGl0CgkJCWVuZAoJCWVuZAoJCQoJ CW9wdHMucGFyc2UhKGFyZ3MpCgkJb3B0aW9ucwoJZW5kCmVuZAoKIyBQYXJzZSBjb21tYW5k IGxpbmUgYXJndW1lbnRzCm9wdHMgPSBPcHRQYXJzZXIucGFyc2UoQVJHVikKCiMgQ3JlYXRl IHRoZSB0b3VybmFtZW50LgppZiAob3B0cy5udW1lcmljYWwpCgl0b3VybmllID0gVG91cm5h bWVudC5uZXcoKDEuLihvcHRzLm51bWVyaWNhbC50b19pKSkudG9fYSkKZWxzZQoJdGVhbXMg PSBIYXNoLm5ldwoJb3JkZXJlZFRlYW1zID0gQXJyYXkubmV3CglmID0gRmlsZS5uZXcob3B0 cy5jc3YpCgkKCWYuZWFjaF9saW5lIGRvIHxsaW5lfAoJCWxpbmUuY2hvbXAhCgkJbGluZSA9 fiAvXihbMC05XSspLCAqKC4qKSQvCgkJdGVhbXNbJDEudG9faV0gPSAkMgoJZW5kCgkKCXRl YW1zLmtleXMuc29ydC5lYWNoIGRvIHxyYW5rfAoJCW9yZGVyZWRUZWFtcy5wdXNoKHRlYW1z W3JhbmtdKQoJZW5kCgkKCXRvdXJuaWUgPSBUb3VybmFtZW50Lm5ldyhvcmRlcmVkVGVhbXMp CmVuZAoKIyBEbyB0aGUgbG9naWMKdG91cm5pZS5jcmVhdGVBbGxSb3VuZHMKCiMgRGlzcGxh eSB0aGUgdG91cm5hbWVudApwdXRzIHRvdXJuaWUudG9fcyBpZiBvcHRzLnRleHR1YWwKcHV0 cyB0b3VybmllLnRvQVNDSUlDaGFydChvcHRzLmNoYXJ0aGVpZ2h0LCBvcHRzLnNwYWNpbmds ZWZ0LCBvcHRzLnNwYWNpbmdyaWdodCwgb3B0cy5hbGlnbm1lbnQpLnRvX3MgaWYgb3B0cy5j aGFydA== --Boundary_(ID_TlmLM4p4p0SqxQgU8NofSQ)--