Pull digest info from db - not doing this, using the data from the infile instead.

Create a list of pool names based on the last pool used in the database

Use the lig_ng method to assign ligation amounts to samples and to create pools of 47 samples, leaving room for 1 regenotype sample in each pool. Not all pools are getting a regenotype.

Define destination and source plates

LS0tCnRpdGxlOiAiUHJlcHBpbmcgYHIgcGFyYW1zJGZpcnN0YCAtIGByIHBhcmFtcyRsYXN0YCIKcGFyYW1zOgogIGZpcnN0OiBEMzQ3OQogIGluZmlsZTogZGF0YS9zYW1wbGVzX3RvX2xpZ2F0ZS5SZGF0YQogIGxhc3Q6IEQ2NDk2CiAgcmVnZW5vX2ZpcnN0OiBOQQogIHJlZ2Vub19sYXN0OiBOQQogIHJ4bl9zaXplOiAxNQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCjwhLS0gVE9ETzogcmVhZCB1cCBvbiBnZ3Bsb3QyIHRvIG1ha2UgYSBtdWx0aXBhbmVsIGdyYXBoIHRoYXQgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbGwgb2YgdGhlIHBsYXRlcyBhbmQgbG9jYXRpb25zIG9uIHRoZSByb2JvdCBiZW5jaCB0aGUgd2F5IHRoYXQgeW91IG5vcm1hbGx5IGRyYXcgdGhlbS4uLmZvciBleGFtcGxlIDFzdCBwbG90IGluIG11bHRpcGFuZWwgd291bGQganVzdCBiZSAgIkQ0NTg4L1A1IiBpbiB0aGUgY2VudGVyIG9mIHRoZSBncmFwaCBzcGFjZSBmb2xsb3dpbmcgdGhlIGZvcm11bGEgcGxhbiRzb3VyY2VfcGxhdGUgLyBwbGFuJHNvdXJjZV9sb2MgLS0+CgoKYGBge3Igc2V0dXAsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnNvdXJjZSgiLi4vZ2Vub21pY3Mvc2NyaXB0cy9sYWJfaGVscGVycy5SIikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBjb25uZWN0IHRvIHRoZSBkYgpsYWIgPC0gd3JpdGVfZGIoIkxhYm9yYXRvcnkiKQoKIyBkZWZpbmUgc2FtcGxlcyB0byBiZSBsaWdhdGVkIChpZiBrbm93bikKZGlnX21pbiA8LSBwYXJhbXMkZmlyc3QKZGlnX21heCA8LSBwYXJhbXMkbGFzdAoKIyBkZWZpbmUgZGlnZXN0cyB0aGF0IGhhdmUgYmVlbiBkaWdlc3RlZCBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBzZXJ2aW5nIGFzIHJlZ2Vub3R5cGVzIChpZiBrbm93bikKcmVnZW5vX21pbiA8LSBwYXJhbXMkcmVnZW5vX2ZpcnN0CnJlZ2Vub19tYXggPC0gcGFyYW1zJHJlZ2Vub19sYXN0CmBgYAoKUHVsbCBkaWdlc3QgaW5mbyBmcm9tIGRiIC0gbm90IGRvaW5nIHRoaXMsIHVzaW5nIHRoZSBkYXRhIGZyb20gdGhlIGluZmlsZSBpbnN0ZWFkLgpgYGB7ciBnZXRfZGF0YSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZGlncyA8LSByZWFkUkRTKHBhcmFtcyRpbmZpbGUpCiAgCmRpZyA8LSBkYlJlYWRUYWJsZShsYWIsICJkaWdlc3QiKSAlPiUKICBmaWx0ZXIoZGlnZXN0X2lkICVpbiUgZGlncyRkaWdlc3RfaWQpICU+JQogIHNlbGVjdChkaWdlc3RfaWQsIHF1YW50LCB3ZWxsLCBwbGF0ZSwgbm90ZXMpICU+JQogIGFycmFuZ2UoZGlnZXN0X2lkKSAlPiUgCiAgZmlsdGVyKHF1YW50ID49IDIuMjUsICMgYW55dGhpbmcgYmVsb3cgdGhpcyBhbW91bnQgY2Fubm90IGJlIGxpZ2F0ZWQgYXQgNTBuZyBvciBoaWdoZXIKICAgICAgICAgIWdyZXBsKCJlbXB0eSIsIG5vdGVzKSwgCiAgICAgICAgICFncmVwbCgiY29udGFpbWluYXRlZCIsIG5vdGVzKSwgCiAgICAgICAgICFncmVwbCgibm90IGVub3VnaCIsIG5vdGVzKSkgCgojIFRoZXJlIGFyZSBmZXdlciBkaWdlc3RzIGZyb20gdGhlIGRiIHRoYW4gdGhlIGluZmlsZSwgd2h5PyBCZWNhdXNlIHRoZSBxdWFudHMgYXJlIHRvbyBsb3cuCiMgbWlzc2luZyA8LSBhbnRpX2pvaW4oZGlncywgZGlnLCBieSA9ICJkaWdlc3RfaWQiKQoKCnJlZ2VubyA8LSBkYlJlYWRUYWJsZShsYWIsICJkaWdlc3QiKSAlPiUKICBmaWx0ZXIoZGlnZXN0X2lkID49IHJlZ2Vub19taW4gJiBkaWdlc3RfaWQgPD0gcmVnZW5vX21heCAmIGV4dHJhY3Rpb25faWQgIT0gIlhYWFgiKSAlPiUKICBzZWxlY3QoZGlnZXN0X2lkLCBxdWFudCwgd2VsbCwgcGxhdGUpICU+JQogIGFycmFuZ2UocXVhbnQpCgpkaWcgPC0gZGlnICU+JSAKICBmaWx0ZXIoIWRpZ2VzdF9pZCAlaW4lIHJlZ2VubyRkaWdlc3RfaWQpCmBgYApDcmVhdGUgYSBsaXN0IG9mIHBvb2wgbmFtZXMgYmFzZWQgb24gdGhlIGxhc3QgcG9vbCB1c2VkIGluIHRoZSBkYXRhYmFzZQpgYGB7ciBwb29scywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBnZXQgYSBsaXN0IChpbiB0YWJsZSBmb3JtKSBvZiBhbGwgb2YgdGhlIG51bWJlcnMgdXNlZCBhcyBwb29scyBzbyBmYXIKYWxsIDwtIGxhYiAlPiUgCiAgdGJsKCJsaWdhdGlvbiIpICU+JSAKICBzZWxlY3QocG9vbCkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGNvbGxlY3QoKSAlPiUgCiAgZmlsdGVyKGdyZXBsKCJQIiwgcG9vbCkpICU+JSAKICBtdXRhdGUocG9vbCA9IGFzLm51bWVyaWMoc3Vic3RyKHBvb2wsIDIsIDQpKSkKCm5vbl9jbG93bl9wb29scyA8LSB0aWJibGUocG9vbCA9IGMoIlAwMjgiLCAiUDAyOSIsICAiUDAzNCIsICJQMDM1IiwgIlAwMzYiLCAiUDAzNyIsICJQMDM4IiwgIlAwNDMiLCAiUDA0NCIsICJQMDQ1IiwgIlAwNDYiLCAiUDA0NyIsICJQMDQ4IiwgIlAwNDkiLCAiUDA1MCIsICJQMDUxIiwgIlAwNTIiKSApICU+JSAKICBtdXRhdGUocG9vbCA9IGFzLm51bWVyaWMoc3Vic3RyKHBvb2wsIDIsIDQpKSkKCmNsb3duIDwtIGFudGlfam9pbihhbGwsIG5vbl9jbG93bl9wb29scywgYnkgPSAicG9vbCIpCgojIHdoYXQgYXJlIHRoZSBsb3dlc3QgYW5kIGhpZ2hlc3QgbnVtYmVycyB1c2VkPwpsaW1zIDwtIGFsbCAlPiUgCiAgc3VtbWFyaXNlKG1heCA9IG1heChwb29sKSwgCiAgICBtaW4gPSBtaW4ocG9vbCkpCgoKIyBhcmUgdGhlcmUgYW55IG1pc3NpbmcgbnVtYmVycyB0aGF0IGFyZSB1c2VhYmxlPwpwb29sX25hbWVzIDwtIHRpYmJsZShwb29sID0gbGltcyRtaW46bGltcyRtYXgpICU+JSAKICBmaWx0ZXIoIXBvb2wgJWluJSBhbGwkcG9vbCkKCiMgaG93IG1hbnkgbW9yZSBwb29sIG5hbWVzIGRvIHdlIG5lZWQ/Cm5lZWQgPC0gdGliYmxlKHBvb2wgPSA4NTooODUrZmxvb3IoKG5yb3coZGlnKS80NykgLSBucm93KHBvb2xfbmFtZXMpKSkpCgpwb29sX25hbWVzIDwtIHJiaW5kKHBvb2xfbmFtZXMsIG5lZWQpICU+JSAKICBtdXRhdGUocG9vbCA9IHBhc3RlKCJQIiwgcG9vbCwgc2VwID0gIiIpKSAlPiUgCiAgcmVuYW1lKG5ld19wb29sID0gcG9vbCkKCnJtKG5lZWQsIGxpbXMsIGFsbCkgIApgYGAKCgpVc2UgdGhlIGxpZ19uZyBtZXRob2QgdG8gYXNzaWduIGxpZ2F0aW9uIGFtb3VudHMgdG8gc2FtcGxlcyBhbmQgdG8gY3JlYXRlIHBvb2xzIG9mIDQ3IHNhbXBsZXMsIGxlYXZpbmcgcm9vbSBmb3IgMSByZWdlbm90eXBlIHNhbXBsZSBpbiBlYWNoIHBvb2wuICBOb3QgYWxsIHBvb2xzIGFyZSBnZXR0aW5nIGEgcmVnZW5vdHlwZS4KYGBge3IgbGlnX25nLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQoKb3V0IDwtIGRhdGEuZnJhbWUoKSAjIG1ha2UgYSBibGFuayBkYXRhIGZyYW1lIHRvIHdyaXRlIHRvCmZvcihpIGluIGMoMjAwLCAxNTAsIDEwMCwgNzUsIDUwKSl7CiAgIyBnZXQgYWxsIHBvc3NpYmxlIHJlZ2VubyBmb3IgdGhpcyBsaWdhdGlvbiBhbW91bnQKICB4IDwtIHJlZ2VubyAlPiUKICAgIG11dGF0ZSh1TF9pbiA9IHJvdW5kKGkvcXVhbnQsIDEpKSAlPiUgIyByb3VuZCB0byAxIGRlY2ltYWwgcG9pbnQKICAgIGZpbHRlcih1TF9pbiA8IChwYXJhbXMkcnhuX3NpemUvMS4zNSkgJiB1TF9pbiA+IDAuNSkgJT4lCiAgICBtdXRhdGUod2F0ZXIgPSByb3VuZCgocGFyYW1zJHJ4bl9zaXplLzEuMzUpLXVMX2luLCAxKSwgCiAgICAgICAgICAgRE5BID0gaSkKICAKICAjIGdldCBhbGwgcG9zc2libGUgb3JpZ2luYWxzIGZvciB0aGlzIGxpZ2F0aW9uIGFtb3VudAogIHkgPC0gZGlnICU+JQogICAgbXV0YXRlKHVMX2luID0gcm91bmQoaS9xdWFudCwgMSkpICU+JSAjIHJvdW5kIHRvIDEgZGVjaW1hbCBwb2ludAogICAgZmlsdGVyKHVMX2luIDwgKHBhcmFtcyRyeG5fc2l6ZS8xLjM1KSAmIHVMX2luID4gMC41KSAlPiUKICAgIG11dGF0ZSh3YXRlciA9IHJvdW5kKChwYXJhbXMkcnhuX3NpemUvMS4zNSktdUxfaW4sIDEpLCAKICAgICAgICAgICBETkEgPSBpKQogIAogICMgdGhlIGZvbGxvd2luZyBmZXcgbGluZXMgKHRocm91Z2ggMTA4KSBhcmUgdG8gcmVtb3ZlIHRoZSBsaW5lcyB0aGF0IGFyZW4ndCBnb2luZyB0byBtYWtlIGl0IGludG8gcG9vbHMgYW5kIGFyZSB0aGUgbG93ZXN0IHZvbHVtZXMgc28gdGhhdCB3ZSBjYW4gc29ydCBieSBwbGF0ZSBhbmQgaXQgd29uJ3QgbWF0dGVyIHRoYXQgbG93IHZvbHVtZXMgYXJlIG1peGVkIHdpdGggaGlnaC4KICAjIGhvdyBtYW55IHJvd3MgYXJlbid0IGdvaW5nIHRvIGZpdCBpbnRvIHBvb2xzPyBDYWxjdWxhdGUgdGhlIHJlbWFpbmRlciBsZWZ0IGFmdGVyIGRpdmlkaW5nIGJ5IDQ4CiAgbGVmdCA8LSBucm93KHkpJSU0OAogICMgd2hhdCBpcyB0aGUgbGFzdCByb3cgdGhhdCBjYW4gYmUgcHV0IGludG8gYSBwb29sICh0aGlzIGlzIHNsaWdodGx5IG1vcmUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVwbGFjZSBzb21lIG9mIHRoZXNlIHdpdGggcmVnZW5vcykKICBlbmQgPC0gbnJvdyh5KSAtIGxlZnQKICB5IDwtIHkgJT4lIAogICAgc2xpY2UoMTplbmQpCgogICAKICAgIyBpZiB0aGVyZSBhcmUgYW55IHJlZ2Vub3MgbGVmdAogICBpZiAobnJvdyh4KSA+IDApewogICAgICMgdGhlbiB3ZSBuZWVkIGF0IGxlYXN0IDQ3IG9yaWdpbmFscyB0byBjb21wbGV0ZSB0aGUgcG9vbAogICAgIGlmIChucm93KHkpLzQ3ID49IDEpeyAKICAgICAgIGZvcihqIGluIDE6bnJvdyh4KSl7CiAgICAgICAgIHBvb2xfYSA8LSB4ICU+JSAKICAgICAgICAgICBhcnJhbmdlKGRlc2ModUxfaW4pKSAlPiUgCiAgICAgICAgICAgc2xpY2UoMSkKICAgICAgICAgeCA8LSBhbnRpX2pvaW4oeCwgcG9vbF9hLCBieSA9ICJkaWdlc3RfaWQiKQogICAgICAgICBwb29sX2IgPC0geSAlPiUKICAgICAgICAgICBhcnJhbmdlKHBsYXRlKSAlPiUgIyBzb3J0IGJ5IHBsYXRlIHRvIGtlZXAgdGhlIGxvd2VzdCBudW1iZXIgb2YgcGxhdGVzIGluIGEgcm9ib3Qgcm91bmQKICAgICAgICAgICBzbGljZSgxOjQ3KQogICAgICAgICBwb29sIDwtIHJiaW5kKHBvb2xfYSwgcG9vbF9iKSAlPiUgCiAgICAgICAgICAgbXV0YXRlKHBvb2wgPSBwYXN0ZSgicG9vbCIsIGksIGosIHNlcCA9ICJfIikpCiAgICAgICAgIG91dCA8LSByYmluZChvdXQsIHBvb2wpCiAgICAgICAgIHkgPC0gYW50aV9qb2luKHksIG91dCwgYnkgPSAiZGlnZXN0X2lkIikKICAgICAgIH0KICAgICAgIGlmIChucm93KHkpID49IDQ4KXsKICAgICAgICAgZm9yKGogaW4gMToobnJvdyh5KS80OCkpewogICAgICAgICAgIHBvb2wgPC0geSAlPiUKICAgICAgICAgICAgIGFycmFuZ2UocGxhdGUpICU+JSAjIGtlZXAgdGhlIGxhcmdlc3QgcGlwZXQgdm9sdW1lcwogICAgICAgICAgICAgc2xpY2UoMTo0OCkgJT4lIAogICAgICAgICAgICAgbXV0YXRlKHBvb2wgPSBwYXN0ZSgicG9vbF9iIiwgaSwgaiwgc2VwID0gIl8iKSkKICAgICAgICAgICBvdXQgPC0gcmJpbmQob3V0LCBwb29sKQogICAgICAgICB5IDwtIGFudGlfam9pbih5LCBvdXQsIGJ5ID0gImRpZ2VzdF9pZCIpCiAgICAgICAgIH0KICAgICAgIH0KICAgICBkaWcgPC0gYW50aV9qb2luKGRpZywgb3V0LCBieSA9ICJkaWdlc3RfaWQiKQogICAgIHJlZ2VubyA8LSBhbnRpX2pvaW4ocmVnZW5vLCBvdXQsIGJ5ID0gImRpZ2VzdF9pZCIpCiAgIH0KICAgfWVsc2V7CiAgaWYgKG5yb3coeSkgPj0gNDgpewogICAgICAgICBmb3IoaiBpbiAxOihucm93KHkpLzQ4KSl7CiAgICAgICAgICAgcG9vbCA8LSB5ICU+JQogICAgICAgICAgICAgYXJyYW5nZShwbGF0ZSkgJT4lICMga2VlcCB0aGUgbGFyZ2VzdCBwaXBldCB2b2x1bWVzCiAgICAgICAgICAgICBzbGljZSgxOjQ4KSAlPiUgCiAgICAgICAgICAgICBtdXRhdGUocG9vbCA9IHBhc3RlKCJwb29sX2MiLCBpLCBqLCBzZXAgPSAiXyIpKQogICAgICAgICAgIG91dCA8LSByYmluZChvdXQsIHBvb2wpCiAgICAgICAgIHkgPC0gYW50aV9qb2luKHksIG91dCwgYnkgPSAiZGlnZXN0X2lkIikKICAgICAgICAgfQogICAgICAgfQogICAgIGRpZyA8LSBhbnRpX2pvaW4oZGlnLCBvdXQsIGJ5ID0gImRpZ2VzdF9pZCIpCiAgIH0KfQoKIyB0ZXN0IGhvdyBtYW55IHNhbXBsZXMgYXJlIGluIGVhY2ggcG9vbD8KdGVzdCA8LSBvdXQgJT4lIAogIGdyb3VwX2J5KHBvb2wpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpCgpudW1fcG9vbHMgPC0gbnJvdyh0ZXN0KQpwb29sX25hbWVzIDwtIHBvb2xfbmFtZXMgJT4lIAogIHNsaWNlKDE6bnVtX3Bvb2xzKQpybShjbG93biwgbm9uX2Nsb3duX3Bvb2xzLCBwb29sLCBwb29sX2EsIHBvb2xfYiwgcmVnZW5vLCB0ZXN0LCB4LCB5KQpgYGAKCkRlZmluZSBkZXN0aW5hdGlvbiBhbmQgc291cmNlIHBsYXRlcwpgYGB7ciBwbGF0ZXMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cm91dCA8LSBvdXQgJT4lCiAgcmVuYW1lKHNvdXJjZV93ZWxsID0gd2VsbCwKICAgIHNvdXJjZV9wbGF0ZSA9IHBsYXRlKSAlPiUKICBtdXRhdGUoc291cmNlX2xvYyA9IE5BKQojIGhvdyBtYW55IHBsYXRlcyBhcmUgdGhlcmU/Cm5wbGF0ZXMgPC0gbnJvdyhvdXQpLzk2CiMgd2hhdCBhcmUgdGhlIHBvb2wgbmFtZXMKcG9vbF9saXN0IDwtIGRpc3RpbmN0KG91dCwgcG9vbCkKIyBhdHRhY2ggcG9vbCBuYW1lcwpwb29sX25hbWVzIDwtIGNiaW5kKHBvb2xfbmFtZXMsIHBvb2xfbGlzdCkgJT4lIAogIHJlbmFtZSgpCiMgc2V0IHVwIHRoZSBwbGF0ZQpwbGF0ZSA8LSBkYXRhX2ZyYW1lKCkKIyBkZWZpbmUgd2VsbHMKd2VsbCA8LSBkYXRhLmZyYW1lKCJ3ZWxsIiA9IDE6KDk2Km5wbGF0ZXMpKQoKCmZvciAoaSBpbiBzZXEobnBsYXRlcykpewogICMgZGVmaW5lIGZpcnN0IHBvb2wgb2YgdGhlIGkgcGxhdGUKICBwb29sMSA8LSBvdXQgJT4lIAogICAgZmlsdGVyKHBvb2wgPT0gcG9vbF9saXN0JHBvb2xbMV0pICU+JSAKICAgIHNlbGVjdChkaWdlc3RfaWQpCiAgIyBkZWZpbmUgc2Vjb25kIHBvb2wgb2YgdGhlIGkgcGxhdGUKICBwb29sMiA8LSBvdXQgJT4lIAogICAgZmlsdGVyKHBvb2wgPT0gcG9vbF9saXN0JHBvb2xbMl0pICU+JSAKICAgIHNlbGVjdChkaWdlc3RfaWQpCiAgICBhIDwtIDk2KmktOTUgIyBwb3NpdGlvbiAxCiAgICBiIDwtIDk2KmktNDggICAgICMgcG9zaXRpb24gNDgKICAgIGMgPC0gOTYqaS00NyAjIHBvc2l0aW9uIDQ5CiAgICBkIDwtIDk2KmkgIyBwb3NpdGlvbiA5NgogICAgdGVtcCA8LSBjYmluZCh3ZWxsJHdlbGxbYTpiXSwgcG9vbDEpCiAgICBjb2xuYW1lcyh0ZW1wKSA8LSBjKCJ3ZWxsIiwgImRpZ2VzdF9pZCIpCiAgICB0ZW1wMiA8LSBjYmluZCh3ZWxsJHdlbGxbYzpkXSwgcG9vbDIpCiAgICBjb2xuYW1lcyh0ZW1wMikgPC0gYygid2VsbCIsICJkaWdlc3RfaWQiKQogICAgdGVtcCA8LSByYmluZCh0ZW1wLCB0ZW1wMikgJT4lIAogICAgICBtdXRhdGUocm93ID0gcmVwKExFVFRFUlNbMTo4XSwgMTIpLCAKICAgICAgICBjb2wgPSB1bmxpc3QobGFwcGx5KDE6MTIsIHJlcCwgOCkpLCAKICAgICAgICByb3VuZCA9IGkpCiAgICBwbGF0ZSA8LSByYmluZChwbGF0ZSwgdGVtcCkKICAgICMgcmVtb3ZlIHBvb2xzIGZyb20gbGlzdCBiZWNhdXNlIHRoZXkgaGF2ZSBiZWVuIHVzZWQKICAgIHBvb2xfbGlzdCA8LSBwb29sX2xpc3QgJT4lIAogICAgICBzbGljZSgzOm5yb3cocG9vbF9saXN0KSkKfQoKcGxhdGUgPC0gcGxhdGUgJT4lIAogIG11dGF0ZShkZXN0X2xvYyA9ICJQMTIiLCAKICAgIGRlc3Rfd2VsbCA9IHBhc3RlKHJvdywgY29sLCBzZXAgPSAiIiksIAogICAgd2F0ZXJfbG9jID0gIlAxMSIsIAogICAgd2F0ZXJfd2VsbCA9ICJBMSIsIAogICAgdGlwMV9sb2MgPSAiUDgiLCAKICAgIHRpcDJfbG9jID0gIlAxMCIpCgpybShwb29sX2xpc3QsIHBvb2wxLCBwb29sMiwgdGVtcCwgdGVtcDIsIGEsYixjLGQsIGkpCgpsaWdhdGlvbnMgPC0gbGVmdF9qb2luKHBsYXRlLCBvdXQsIGJ5ID0gImRpZ2VzdF9pZCIpICU+JSAKICBzZWxlY3QoLXdlbGwsIC1yb3csIC1jb2wpCgoKIyByZW5hbWUgcG9vbHMKbGlnYXRpb25zIDwtIGxlZnRfam9pbihsaWdhdGlvbnMsIHBvb2xfbmFtZXMsIGJ5ID0gInBvb2wiKSAlPiUgCiAgc2VsZWN0KC1wb29sKSAlPiUgCiAgcmVuYW1lKHBvb2wgPSBuZXdfcG9vbCkKCiMgY3JlYXRlIHNvdXJjZSBwbGF0ZXMgZm9yIGVhY2ggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYXRlcyAjIyMjCnBsYXRlX2xpc3QgPC0gZGlzdGluY3QobGlnYXRpb25zLCByb3VuZCkKCmBgYApgYGB7ciB3cml0ZV9wb3NpdGlvbnMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojIGZvciBlYWNoIHJvdW5kLCBkZWZpbmUgd2hpY2ggc291cmNlIHBsYXRlcyBhcmUgcHJlc2VudCBhbmQgYXNzaWduIHNvdXJjZSBsb2NhdGlvbnMKZm9yIChpIGluIHNlcShwbGF0ZV9saXN0JHJvdW5kKSl7CiMgZm9yIChpIGluIDYpewogICMgbmFycm93IHRoZSBpbmZvIGRvd24gdG8gb25seSB0aGUgcm91bmQgaW4gcXVlc3Rpb24KICBkZXN0X3BsYXRlIDwtIGxpZ2F0aW9ucyAlPiUgZmlsdGVyKHJvdW5kID09IHBsYXRlX2xpc3Qkcm91bmRbaV0pCiAgIyBNYWtlIGEgdGFibGUgb2Ygc291cmNlIHBsYXRlcwogIHNvdXJjZXMgPC0gZGlzdGluY3QoZGVzdF9wbGF0ZSwgc291cmNlX3BsYXRlKSAKICAjIERldGVybWluZSBob3cgbWFueSByb3VuZHMgb2Ygc291cmNlIHBsYXRlcyBpdCB3aWxsIHRha2UgdG8gY29tcGxldGUgdGhlIGRlc3RpbmF0aW9uIHBsYXRlCiAgbnVtX3JvdW5kcyA8LSBjZWlsaW5nKG5yb3coc291cmNlcykvNSkgIyBiZWNhdXNlIDUgcG9zc2libGUgcG9zaXRpb25zCiAgcmVwcyA8LSBjZWlsaW5nKG5yb3coc291cmNlcykvbnVtX3JvdW5kcykKICAjIERlZmluZSBwb3NzaWJsZSBzb3VyY2UgbG9jYXRpb25zIGFuZCBhZGp1c3QgdG8gZml0IHRoZSBudW1iZXIgb2Ygc291cmNlIHBsYXRlcwogICNQOCBpcyB0aXBzLCBQMTEgaXMgd2F0ZXIsIFAxMiBpcyBkZXN0aW5hdGlvbgogIHBvc2l0aW9ucyA8LSB0aWJibGUobG9jID0gcmVwKGMoIlA1IiwgIlA2IiwgIlA3IiwgIlA5IiwgIlAxMyIpLG51bV9yb3VuZHMgKSkgJT4lIAogICAgc2xpY2UoMTpucm93KHNvdXJjZXMpKQogIHJvdW5kcyA8LSB0aWJibGUocm91bmQgPSByZXAobGV0dGVyc1sxOm51bV9yb3VuZHNdLCByZXBzKSkgJT4lIAogICAgc2xpY2UoMTpucm93KHNvdXJjZXMpKSAlPiUgCiAgICBhcnJhbmdlKHJvdW5kKQojIENyZWF0ZSBhIHRhYmxlIG9mIHBsYXRlcywgcm91bmQgZGVzaWduYXRpb24sIGFuZCBwb3NpdGlvbgogIHNvdXJjZXMgPC0gY2JpbmQoc291cmNlcywgcm91bmRzLCBwb3NpdGlvbnMpCgogICMgbWF0Y2ggdGhlIHNvdXJjZSB0YWJsZSB0byB0aGUgbGlnYXRpb24gdGFibGUKICBmb3IgKGogaW4gc2VxKG5yb3coc291cmNlcykpKXsKICAgIGxpZ2F0aW9ucyA8LSBsaWdhdGlvbnMgJT4lIAogICAgICBtdXRhdGUoc291cmNlX2xvYyA9IGlmZWxzZShkaWdlc3RfaWQgJWluJSBkZXN0X3BsYXRlJGRpZ2VzdF9pZCAmIHNvdXJjZV9wbGF0ZSA9PSBzb3VyY2VzJHNvdXJjZV9wbGF0ZVtqXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMkbG9jW2pdLCBzb3VyY2VfbG9jKSwgCiAgICAgICAgICAgICByb3VuZCA9IGlmZWxzZShkaWdlc3RfaWQgJWluJSBkZXN0X3BsYXRlJGRpZ2VzdF9pZCAmIHNvdXJjZV9wbGF0ZSA9PSBzb3VyY2VzJHNvdXJjZV9wbGF0ZVtqXSxwYXN0ZShyb3VuZCwgc291cmNlcyRyb3VuZFtqXSwgc2VwID0gIl8iKSwgcm91bmQpKQogIH0KICAKICAjIHNlcGFyYXRlIHRoZSByb3VuZHMgaW50byBjc3YgZmlsZXMKICB0ZW1wIDwtIGxpZ2F0aW9ucyAlPiUgCiAgICBmaWx0ZXIoZGlnZXN0X2lkICVpbiUgZGVzdF9wbGF0ZSRkaWdlc3RfaWQpCiAgcm91bmRzIDwtIGRpc3RpbmN0KHJvdW5kcykKICBmb3IoYiBpbiBzZXEocm91bmRzJHJvdW5kKSl7CiAgICB0ZW1wMSA8LSB0ZW1wICU+JSAKICAgICAgZmlsdGVyKGdyZXBsKHJvdW5kcyRyb3VuZFtiXSwgcm91bmQpKQogICAgd3JpdGUuY3N2KHRlbXAxLCBmaWxlID0gcGFzdGUoImRhdGEvIiwgU3lzLkRhdGUoKSwgIl8iLCB0ZW1wMSRyb3VuZFsxXSwgIi5jc3YiLCBzZXAgPSAiIikpCiAgICMgcHJpbnQoa2FibGUodGVtcDEsICJsYXRleCIsIGxvbmd0YWJsZSA9IFQsIGJvb2t0YWJzID0gVCwgY2FwdGlvbiA9IHRlbXAxJHJvdW5kWzFdKSAlPiUgCiAgICMgICAga2FibGVfc3R5bGluZyhsYXRleF9vcHRpb25zID0gYygicmVwZWF0X2hlYWRlciIpKSkKICB9Cn0KCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBhZGQgbGlnYXRpb25zIHRvIGRhdGFiYXNlICMjIyMKCiMgZmV0Y2ggbGFzdCB1c2VkIGxpZ2F0aW9uX2lkCmxpZ19tYXggPC0gZGJSZWFkVGFibGUobGFiLCAibGlnYXRpb24iKSAlPiUKICBzdW1tYXJpc2UobGlnX2lkID0gbWF4KGxpZ2F0aW9uX2lkKSkgJT4lCiAgbXV0YXRlKGxpZ19pZCA9IGFzLm51bWVyaWMoc3Vic3RyKGxpZ19pZCwgMiwgNSkpKQoKIyBwb29sX21heCA8LSBkYlJlYWRUYWJsZShsYWIsICJsaWdhdGlvbiIpICU+JQojICAgc3VtbWFyaXNlKHBvb2wgPSBtYXgocG9vbCkpICU+JQojICAgbXV0YXRlKHBvb2wgPSBhcy5udW1lcmljKHN1YnN0cihwb29sLCAyLCA1KSkpCgpsaWdhdGlvbnMgPC0gbGlnYXRpb25zICU+JQogIG11dGF0ZShsaWdhdGlvbl9pZCA9ICgxK2xpZ19tYXgkbGlnX2lkKToobnJvdyhsaWdhdGlvbnMpICsgbGlnX21heCRsaWdfaWQpLAogICAgbGlnYXRpb25faWQgPSBwYXN0ZSgiTCIsIGxpZ2F0aW9uX2lkLCBzZXAgPSAiIikpICU+JQogIG11dGF0ZShwb29sID0gcGFzdGUoIlAiLCBmb3JtYXRDKGFzLm51bWVyaWMoc3Vic3RyKHBvb2wsIDIsIDYpKSwgd2lkdGggPSAzLCBmb3JtYXQgPSAiZCIsIGZsYWcgPSAwKSwgc2VwID0gIiIpKSAlPiUKICByZW5hbWUodm9sX2luID0gdUxfaW4sCiAgICAgICAgIHdlbGwgPSBkZXN0X3dlbGwpICU+JQogIHNlbGVjdChsaWdhdGlvbl9pZCwgZGlnZXN0X2lkLCB3ZWxsLCB2b2xfaW4sIEROQSwgd2F0ZXIsIHBvb2wpCgoKCiMjIGFkZCB0byBkYgojIGRiV3JpdGVUYWJsZShsYWIsICJsaWdhdGlvbiIsIGxpZ2F0aW9ucywgYXBwZW5kID0gVCwgcm93Lm5hbWVzID0gRikKIyBkYkRpc2Nvbm5lY3QobGFiKQojIHJtKGxhYikKYGBgCgoKCjwhLS0gTWFrZSBub3RlIG9mIHRoZSBkaWdlc3RzIHRoYXQgYXJlIHRvbyBsb3cgdG8gbGlnYXRlIGF0IDUwbmcgb3IgaGlnaGVyIC0tPgo8IS0tIGBgYHtyIGxvdywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0gLS0+CjwhLS0gZGF0X2RiIDwtIGxhYiAlPiUgIC0tPgo8IS0tICAgdGJsKCJkaWdlc3QiKSAlPiUgIC0tPgo8IS0tICAgY29sbGVjdCgpIC0tPgoKPCEtLSBjaGFuZ2UgPC0gcmVhZFJEUyhwYXJhbXMkaW5maWxlKSAlPiUgIC0tPgo8IS0tICAgZmlsdGVyKHF1YW50IDwgMi4yNSkgJT4lICAtLT4KPCEtLSAgIHNlbGVjdCgtc2FtcGxlX2lkKSAlPiUgIC0tPgo8IS0tICAgbXV0YXRlKG5vdGVzID0gaWZlbHNlKGlzLm5hKG5vdGVzKSwgIm5vdCBlbm91Z2ggRE5BIHRvIGxpZ2F0ZSBhdCA1MG5nIG9yIGhpZ2hlciIsIHBhc3RlKG5vdGVzLCAiLCBub3QgZW5vdWdoIEROQSB0byBsaWdhdGUgYXQgNTBuZyBvciBoaWdoZXIiLCBzZXAgPSAiIikpKSAtLT4KCjwhLS0gZGF0X2RiIDwtIGNoYW5nZV9yb3dzKGRhdF9kYiwgY2hhbmdlLCAiZGlnZXN0X2lkIikgLS0+Cgo8IS0tICMgZGJXcml0ZVRhYmxlKGxhYiwgImRpZ2VzdCIsIGRhdF9kYiwgcm93Lm5hbWVzPUYsIG92ZXJ3cml0ZT1UICkgLS0+CjwhLS0gIyBkYkRpc2Nvbm5lY3QobGFiKSAtLT4KPCEtLSBgYGAgLS0+Cgo=