OyBndm1hdDMyLmFzbSAtLSBBc20gcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2DQo7IENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkgYW5kIEdpbGxlcyBWb2xsYW50Lg0KOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gNCjsgIGZyb20gSmVhbi1sb3VwIEdhaWxseSBpbiBkZWZsYXRlLmMNCjsNCjsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0DQo7ICAgICAgICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbA0KOyAgICAgICAgIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwNCjsNCjsgRm9yIFZpc3VhbCBDKysgNC54IGFuZCBoaWdoZXIgYW5kIE1MIDYueCBhbmQgaGlnaGVyDQo7ICAgbWwuZXhlIGlzIGluIGRpcmVjdG9yeSBcTUFTTTYxMUMgb2YgV2luOTUgRERLDQo7ICAgbWwuZXhlIGlzIGFsc28gZGlzdHJpYnV0ZWQgaW4gaHR0cDovL3d3dy5tYXNtMzIuY29tL21hc21kbC5odG0NCjsgICAgYW5kIGluIFZDKysyMDAzIHRvb2xraXQgYXQgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS92aXN1YWxjL3ZjdG9vbGtpdDIwMDMvDQo7DQo7IHRoaXMgZmlsZSBjb250YWluIHR3byBpbXBsZW1lbnRhdGlvbiBvZiBsb25nZXN0X21hdGNoDQo7DQo7ICBsb25nZXN0X21hdGNoXzdmZmYgOiB3cml0dGVuIDE5OTYgYnkgR2lsbGVzIFZvbGxhbnQgb3B0aW1pemVkIGZvciANCjsgICAgICAgICAgICBmaXJzdCBQZW50aXVtLiBBc3N1bWUgcy0+d19tYXNrID09IDB4N2ZmZg0KOyAgbG9uZ2VzdF9tYXRjaF82ODYgOiB3cml0dGVuIGJ5IEJyaWFuIHJhaXRlciAoMTk5OCksIG9wdGltaXplZCBmb3IgUGVudGl1bSBQcm8NCjsNCjsgIGZvciB1c2luZyBhbiBzZWVtYmx5IHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCwgeW91IG5lZWQgZGVmaW5lIEFTTVYgaW4gcHJvamVjdA0KOyAgVGhlcmUgaXMgdHdvIHdheSBpbiB1c2luZyBndm1hdDMyLmFzbQ0KOw0KOyAgQSkgU3VnZ2VzdGVkIG1ldGhvZA0KOyAgICBpZiB5b3Ugd2FudCBpbmNsdWRlIGJvdGggbG9uZ2VzdF9tYXRjaF83ZmZmIGFuZCBsb25nZXN0X21hdGNoXzY4Ng0KOyAgICBjb21waWxlIHRoZSBhc20gZmlsZSBydW5uaW5nDQo7ICAgICAgICAgICBtbCAvY29mZiAvWmkgL0ZsZ3ZtYXQzMi5sc3QgL2MgZ3ZtYXQzMi5hc20NCjsgICAgYW5kIGluY2x1ZGUgZ3ZtYXQzMmMuYyBpbiB5b3VyIHByb2plY3QNCjsgICAgaWYgeW91IGhhdmUgYW4gb2xkIGNwdSAoMzg2LDQ4NiBvciBmaXJzdCBQZW50aXVtKSBhbmQgcy0+d19tYXNrPT0weDdmZmYsDQo7ICAgICAgICBsb25nZXN0X21hdGNoXzdmZmYgd2lsbCBiZSB1c2VkDQo7ICAgIGlmIHlvdSBoYXZlIGEgbW9yZSBtb2Rlcm4gQ1BVIChQZW50aXVtIFBybywgSUkgYW5kIGhpZ2hlcikNCjsgICAgICAgIGxvbmdlc3RfbWF0Y2hfNjg2IHdpbGwgYmUgdXNlZA0KOyAgICBvbiBvbGQgY3B1IHdpdGggcy0+d19tYXNrIT0weDdmZmYsIGxvbmdlc3RfbWF0Y2hfNjg2IHdpbGwgYmUgdXNlZCwNCjsgICAgICAgIGJ1dCB0aGlzIGlzIG5vdCBhIHNpdGF0aW9uIHlvdSdsbCBmaW5kIG9mdGVuDQo7DQo7ICBCKSBBbHRlcm5hdGl2ZQ0KOyAgICBpZiB5b3UgYXJlIG5vdCBpbnRlcnJlc2VkIGluIG9sZCBjcHUgcGVyZm9ybWFuY2UgYW5kIHdhbnQgdGhlIHNtYWxsZXINCjsgICAgICAgYmluYXJpZXMgcG9zc2libGUNCjsNCjsgICAgY29tcGlsZSB0aGUgYXNtIGZpbGUgcnVubmluZw0KOyAgICAgICAgICAgbWwgL2NvZmYgL1ppIC9jIC9GbGd2bWF0MzIubHN0IC9ETk9PTERQRU5USVVNQ09ERSBndm1hdDMyLmFzbQ0KOyAgICBhbmQgZG8gbm90IGluY2x1ZGUgZ3ZtYXQzMmMuYyBpbiB5b3VyIHByb2plY3QgKG91IGRlZmluZSBhbHNvIA0KOyAgICAgICAgICAgICAgTk9PTERQRU5USVVNQ09ERSkNCjsNCjsgbm90ZSA6IGFzIEkga25vd24sIGxvbmdlc3RfbWF0Y2hfNjg2IGlzIHZlcnkgZmFzdGVyIHRoYW4gbG9uZ2VzdF9tYXRjaF83ZmZmDQo7ICAgICAgICBvbiBwZW50aXVtIFByby9JSS9JSUksIGZhc3RlciAoYnV0IGxlc3MpIGluIFA0LCBidXQgaXQgc2VlbQ0KOyAgICAgICAgbG9uZ2VzdF9tYXRjaF83ZmZmIGNhbiBiZSBmYXN0ZXIgKHZlcnkgdmVyeSBsaXR0ZSkgb24gQU1EIEF0aGxvbjY0L0s4DQo7DQo7IHNlZSBiZWxvdyA6IHpsaWIxMjIyYWRkIG11c3QgYmUgYWRqdXN0ZXIgaWYgeW91IHVzZSBhIHpsaWIgdmVyc2lvbiA8IDEuMi4yLjINCg0KO3VJbnQgbG9uZ2VzdF9tYXRjaF83ZmZmKHMsIGN1cl9tYXRjaCkNCjsgICAgZGVmbGF0ZV9zdGF0ZSAqczsNCjsgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovDQoNCiAgICBOYlN0YWNrICAgICAgICAgZXF1ICAgICA3Ng0KICAgIGN1cl9tYXRjaCAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0wXQ0KICAgIHN0cl9zICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay00XQ0KOyA1IGR3b3JkIG9uIHRvcCAocmV0LGVicCxlc2ksZWRpLGVieCkNCiAgICBhZHJyZXQgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stOF0NCiAgICBwdXNoZWJwICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMTJdDQogICAgcHVzaGVkaSAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTE2XQ0KICAgIHB1c2hlc2kgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0yMF0NCiAgICBwdXNoZWJ4ICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMjRdDQoNCiAgICBjaGFpbl9sZW5ndGggICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTI4XQ0KICAgIGxpbWl0ICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzJdDQogICAgYmVzdF9sZW4gICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay0zNl0NCiAgICB3aW5kb3cgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQwXQ0KICAgIHByZXYgICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDRdDQogICAgc2Nhbl9zdGFydCAgICAgIGVxdSAgICAgIHdvcmQgcHRyIFtlc3ArTmJTdGFjay00OF0NCiAgICB3bWFzayAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTUyXQ0KICAgIG1hdGNoX3N0YXJ0X3B0ciBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTZdDQogICAgbmljZV9tYXRjaCAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay02MF0NCiAgICBzY2FuICAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY0XQ0KDQogICAgd2luZG93bGVuICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay02OF0NCiAgICBtYXRjaF9zdGFydCAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTcyXQ0KICAgIHN0cmVuZCAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNzZdDQogICAgTmJTdGFja0FkZCAgICAgIGVxdSAgICAgKE5iU3RhY2stMjQpDQoNCiAgICAuMzg2cA0KDQogICAgbmFtZSAgICBndm1hdGNoDQogICAgLk1PREVMICBGTEFUDQoNCg0KDQo7ICBhbGwgdGhlICt6bGliMTIyMmFkZCBvZmZzZXRzIGFyZSBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIGZpZWxkcw0KOyAgaW4gemxpYiBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIGFzbSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuDQo7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuDQo7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIGJldHdlZW4gMS4wLjUgYW5kIDEuMi4yLjEsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDAiKS4NCjsgIGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjIuMi4yIG9yIGxhdGVyICwgdXNlICJ6bGliMTIyMmFkZCBlcXUgOCIpLg0KDQogICAgemxpYjEyMjJhZGQgICAgICAgICBlcXUgICAgIDgNCg0KOyAgTm90ZSA6IHRoZXNlIHZhbHVlIGFyZSBnb29kIHdpdGggYSA4IGJ5dGVzIGJvdW5kYXJ5IHBhY2sgc3RydWN0dXJlDQogICAgZGVwX2NoYWluX2xlbmd0aCAgICBlcXUgICAgIDc0aCt6bGliMTIyMmFkZA0KICAgIGRlcF93aW5kb3cgICAgICAgICAgZXF1ICAgICAzMGgremxpYjEyMjJhZGQNCiAgICBkZXBfc3Ryc3RhcnQgICAgICAgIGVxdSAgICAgNjRoK3psaWIxMjIyYWRkDQogICAgZGVwX3ByZXZfbGVuZ3RoICAgICBlcXUgICAgIDcwaCt6bGliMTIyMmFkZA0KICAgIGRlcF9uaWNlX21hdGNoICAgICAgZXF1ICAgICA4OGgremxpYjEyMjJhZGQNCiAgICBkZXBfd19zaXplICAgICAgICAgIGVxdSAgICAgMjRoK3psaWIxMjIyYWRkDQogICAgZGVwX3ByZXYgICAgICAgICAgICBlcXUgICAgIDM4aCt6bGliMTIyMmFkZA0KICAgIGRlcF93X21hc2sgICAgICAgICAgZXF1ICAgICAyY2gremxpYjEyMjJhZGQNCiAgICBkZXBfZ29vZF9tYXRjaCAgICAgIGVxdSAgICAgODRoK3psaWIxMjIyYWRkDQogICAgZGVwX21hdGNoX3N0YXJ0ICAgICBlcXUgICAgIDY4aCt6bGliMTIyMmFkZA0KICAgIGRlcF9sb29rYWhlYWQgICAgICAgZXF1ICAgICA2Y2gremxpYjEyMjJhZGQNCg0KDQpfVEVYVCAgICAgICAgICAgICAgICAgICBzZWdtZW50DQoNCklGREVGIE5PVU5ERVJMSU5FDQogICBJRkRFRiBOT09MRFBFTlRJVU1DT0RFDQogICAgICAgICAgICBwdWJsaWMgIGxvbmdlc3RfbWF0Y2gNCiAgICAgICAgICAgIHB1YmxpYyAgbWF0Y2hfaW5pdA0KICAgRUxTRSAgICAgICAgICAgIA0KICAgICAgICAgICAgcHVibGljICBsb25nZXN0X21hdGNoXzdmZmYNCiAgICAgICAgICAgIHB1YmxpYyAgY3B1ZGV0ZWN0MzINCiAgICAgICAgICAgIHB1YmxpYyAgbG9uZ2VzdF9tYXRjaF82ODYNCiAgIEVORElGDQpFTFNFDQogICBJRkRFRiBOT09MRFBFTlRJVU1DT0RFDQogICAgICAgICAgICBwdWJsaWMgIF9sb25nZXN0X21hdGNoDQogICAgICAgICAgICBwdWJsaWMgIF9tYXRjaF9pbml0DQogICBFTFNFDQogICAgICAgICAgICBwdWJsaWMgIF9sb25nZXN0X21hdGNoXzdmZmYNCiAgICAgICAgICAgIHB1YmxpYyAgX2NwdWRldGVjdDMyDQogICAgICAgICAgICBwdWJsaWMgIF9sb25nZXN0X21hdGNoXzY4Ng0KICAgRU5ESUYNCkVORElGDQoNCiAgICBNQVhfTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMjU4DQogICAgTUlOX01BVENIICAgICAgICAgICBlcXUgICAgIDMNCiAgICBNSU5fTE9PS0FIRUFEICAgICAgIGVxdSAgICAgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkNCg0KDQoNCklGTkRFRiBOT09MRFBFTlRJVU1DT0RFDQpJRkRFRiBOT1VOREVSTElORQ0KbG9uZ2VzdF9tYXRjaF83ZmZmICAgcHJvYyBuZWFyDQpFTFNFDQpfbG9uZ2VzdF9tYXRjaF83ZmZmICBwcm9jIG5lYXINCkVORElGDQoNCiAgICBtb3YgICAgIGVkeCxbZXNwKzRdDQoNCg0KDQogICAgcHVzaCAgICBlYnANCiAgICBwdXNoICAgIGVkaQ0KICAgIHB1c2ggICAgZXNpDQogICAgcHVzaCAgICBlYngNCg0KICAgIHN1YiAgICAgZXNwLE5iU3RhY2tBZGQNCg0KOyBpbml0aWFsaXplIG9yIGNoZWNrIHRoZSB2YXJpYWJsZXMgdXNlZCBpbiBtYXRjaC5hc20uDQogICAgbW92ICAgICBlYnAsZWR4DQoNCjsgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aA0KOyBpZiAocHJldl9sZW5ndGg+PWdvb2RfbWF0Y2gpIGNoYWluX2xlbmd0aCA+Pj0gMg0KICAgIG1vdiAgICAgZWR4LFtlYnArZGVwX2NoYWluX2xlbmd0aF0NCiAgICBtb3YgICAgIGVieCxbZWJwK2RlcF9wcmV2X2xlbmd0aF0NCiAgICBjbXAgICAgIFtlYnArZGVwX2dvb2RfbWF0Y2hdLGVieA0KICAgIGphICAgICAgbm9zaHINCiAgICBzaHIgICAgIGVkeCwyDQpub3NocjoNCjsgd2UgaW5jcmVtZW50IGNoYWluX2xlbmd0aCBiZWNhdXNlIGluIHRoZSBhc20sIHRoZSAtLWNoYWluX2xlbmdodCBpcyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb29wDQogICAgaW5jICAgICBlZHgNCiAgICBtb3YgICAgIGVkaSxbZWJwK2RlcF9uaWNlX21hdGNoXQ0KICAgIG1vdiAgICAgY2hhaW5fbGVuZ3RoLGVkeA0KICAgIG1vdiAgICAgZWF4LFtlYnArZGVwX2xvb2thaGVhZF0NCiAgICBjbXAgICAgIGVheCxlZGkNCjsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQogICAgamFlICAgICBub2xvb2thaGVhZG5pY2VtYXRjaA0KICAgIG1vdiAgICAgZWRpLGVheA0Kbm9sb29rYWhlYWRuaWNlbWF0Y2g6DQo7IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGgNCiAgICBtb3YgICAgIGJlc3RfbGVuLGVieA0KDQo7IHdpbmRvdyA9IHMtPndpbmRvdw0KICAgIG1vdiAgICAgZXNpLFtlYnArZGVwX3dpbmRvd10NCiAgICBtb3YgICAgIGVjeCxbZWJwK2RlcF9zdHJzdGFydF0NCiAgICBtb3YgICAgIHdpbmRvdyxlc2kNCg0KICAgIG1vdiAgICAgbmljZV9tYXRjaCxlZGkNCjsgc2NhbiA9IHdpbmRvdyArIHN0cnN0YXJ0DQogICAgYWRkICAgICBlc2ksZWN4DQogICAgbW92ICAgICBzY2FuLGVzaQ0KOyBkeCA9ICp3aW5kb3cNCiAgICBtb3YgICAgIGR4LHdvcmQgcHRyIFtlc2ldDQo7IGJ4ID0gKih3aW5kb3crYmVzdF9sZW4tMSkNCiAgICBtb3YgICAgIGJ4LHdvcmQgcHRyIFtlc2krZWJ4LTFdDQogICAgYWRkICAgICBlc2ksTUFYX01BVENILTENCjsgc2Nhbl9zdGFydCA9ICpzY2FuDQogICAgbW92ICAgICBzY2FuX3N0YXJ0LGR4DQo7IHN0cmVuZCA9IHNjYW4gKyBNQVhfTUFUQ0gtMQ0KICAgIG1vdiAgICAgc3RyZW5kLGVzaQ0KOyBieCA9IHNjYW5fZW5kID0gKih3aW5kb3crYmVzdF9sZW4tMSkNCg0KOyAgICBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/DQo7ICAgICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOw0KDQogICAgbW92ICAgICBlc2ksW2VicCtkZXBfd19zaXplXQ0KICAgIHN1YiAgICAgZXNpLE1JTl9MT09LQUhFQUQNCjsgaGVyZSBlc2kgPSBNQVhfRElTVChzKQ0KICAgIHN1YiAgICAgZWN4LGVzaQ0KICAgIGphICAgICAgbm9kaXN0DQogICAgeG9yICAgICBlY3gsZWN4DQpub2Rpc3Q6DQogICAgbW92ICAgICBsaW1pdCxlY3gNCg0KOyBwcmV2ID0gcy0+cHJldg0KICAgIG1vdiAgICAgZWR4LFtlYnArZGVwX3ByZXZdDQogICAgbW92ICAgICBwcmV2LGVkeA0KDQo7DQogICAgbW92ICAgICBlZHgsZHdvcmQgcHRyIFtlYnArZGVwX21hdGNoX3N0YXJ0XQ0KICAgIG1vdiAgICAgYnAsc2Nhbl9zdGFydA0KICAgIG1vdiAgICAgZWF4LGN1cl9tYXRjaA0KICAgIG1vdiAgICAgbWF0Y2hfc3RhcnQsZWR4DQoNCiAgICBtb3YgICAgIGVkeCx3aW5kb3cNCiAgICBtb3YgICAgIGVkaSxlZHgNCiAgICBhZGQgICAgIGVkaSxiZXN0X2xlbg0KICAgIG1vdiAgICAgZXNpLHByZXYNCiAgICBkZWMgICAgIGVkaQ0KOyB3aW5kb3dsZW4gPSB3aW5kb3cgKyBiZXN0X2xlbiAtMQ0KICAgIG1vdiAgICAgd2luZG93bGVuLGVkaQ0KDQogICAgam1wICAgICBiZWdpbmxvb3AyDQogICAgYWxpZ24gICA0DQoNCjsgaGVyZSwgaW4gdGhlIGxvb3ANCjsgICAgICAgZWF4ID0gYXggPSBjdXJfbWF0Y2gNCjsgICAgICAgZWN4ID0gbGltaXQNCjsgICAgICAgIGJ4ID0gc2Nhbl9lbmQNCjsgICAgICAgIGJwID0gc2Nhbl9zdGFydA0KOyAgICAgICBlZGkgPSB3aW5kb3dsZW4gKHdpbmRvdyArIGJlc3RfbGVuIC0xKQ0KOyAgICAgICBlc2kgPSBwcmV2DQoNCg0KOy8vIGhlcmU7IGNoYWluX2xlbmd0aCA8PTE2DQpub3JtYWxiZWcwYWRkMTY6DQogICAgYWRkICAgICBjaGFpbl9sZW5ndGgsMTYNCiAgICBqeiAgICAgIGV4aXRsb29wDQpub3JtYWxiZWcwOg0KICAgIGNtcCAgICAgd29yZCBwdHJbZWRpK2VheF0sYngNCiAgICBqZSAgICAgIG5vcm1hbGJlZzJub3JvbGwNCnJjb250bGFibm9yb2xsOg0KOyBjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXQ0KICAgIGFuZCAgICAgZWF4LDdmZmZoDQogICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdDQo7IGlmIGN1cl9tYXRjaCA+IGxpbWl0LCBnbyB0byBleGl0bG9vcA0KICAgIGNtcCAgICAgZWN4LGVheA0KICAgIGpuYiAgICAgZXhpdGxvb3ANCjsgaWYgLS1jaGFpbl9sZW5ndGggIT0gMCwgZ28gdG8gZXhpdGxvb3ANCiAgICBkZWMgICAgIGNoYWluX2xlbmd0aA0KICAgIGpueiAgICAgbm9ybWFsYmVnMA0KICAgIGptcCAgICAgZXhpdGxvb3ANCg0Kbm9ybWFsYmVnMm5vcm9sbDoNCjsgaWYgKHNjYW5fc3RhcnQ9PSooY3VyX21hdGNoK3dpbmRvdykpIGdvdG8gbm9ybWFsYmVnMg0KICAgIGNtcCAgICAgYnAsd29yZCBwdHJbZWR4K2VheF0NCiAgICBqbmUgICAgIHJjb250bGFibm9yb2xsDQogICAgam1wICAgICBub3JtYWxiZWcyDQoNCmNvbnRsb29wMzoNCiAgICBtb3YgICAgIGVkaSx3aW5kb3dsZW4NCg0KOyBjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXQ0KICAgIGFuZCAgICAgZWF4LDdmZmZoDQogICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdDQo7IGlmIGN1cl9tYXRjaCA+IGxpbWl0LCBnbyB0byBleGl0bG9vcA0KICAgIGNtcCAgICAgZWN4LGVheA0Kam5iZXhpdGxvb3BzaG9ydDE6DQogICAgam5iICAgICBleGl0bG9vcA0KOyBpZiAtLWNoYWluX2xlbmd0aCAhPSAwLCBnbyB0byBleGl0bG9vcA0KDQoNCjsgYmVnaW4gdGhlIG1haW4gbG9vcA0KYmVnaW5sb29wMjoNCiAgICBzdWIgICAgIGNoYWluX2xlbmd0aCwxNisxDQo7IGlmIGNoYWluX2xlbmd0aCA8PTE2LCBkb24ndCB1c2UgdGhlIHVucm9sbGVkIGxvb3ANCiAgICBqbmEgICAgIG5vcm1hbGJlZzBhZGQxNg0KDQpkbzE2Og0KICAgIGNtcCAgICAgd29yZCBwdHJbZWRpK2VheF0sYngNCiAgICBqZSAgICAgIG5vcm1hbGJlZzJkYzANCg0KbWFjY24gICBNQUNSTyAgIGxhYg0KICAgIGFuZCAgICAgZWF4LDdmZmZoDQogICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdDQogICAgY21wICAgICBlY3gsZWF4DQogICAgam5iICAgICBleGl0bG9vcA0KICAgIGNtcCAgICAgd29yZCBwdHJbZWRpK2VheF0sYngNCiAgICBqZSAgICAgIGxhYg0KICAgIEVORE0NCg0KcmNvbnRsb29wMDoNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzENCg0KcmNvbnRsb29wMToNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzINCg0KcmNvbnRsb29wMjoNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzMNCg0KcmNvbnRsb29wMzoNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzQNCg0KcmNvbnRsb29wNDoNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzUNCg0KcmNvbnRsb29wNToNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzYNCg0KcmNvbnRsb29wNjoNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzcNCg0KcmNvbnRsb29wNzoNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzgNCg0KcmNvbnRsb29wODoNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzkNCg0KcmNvbnRsb29wOToNCiAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzEwDQoNCnJjb250bG9vcDEwOg0KICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTENCg0KcmNvbnRsb29wMTE6DQogICAgbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxMg0KDQpyY29udGxvb3AxMjoNCiAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzEzDQoNCnJjb250bG9vcDEzOg0KICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTQNCg0KcmNvbnRsb29wMTQ6DQogICAgbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxNQ0KDQpyY29udGxvb3AxNToNCiAgICBhbmQgICAgIGVheCw3ZmZmaA0KICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQ0KICAgIGNtcCAgICAgZWN4LGVheA0KICAgIGpuYiAgICAgZXhpdGxvb3ANCg0KICAgIHN1YiAgICAgY2hhaW5fbGVuZ3RoLDE2DQogICAgamEgICAgICBkbzE2DQogICAgam1wICAgICBub3JtYWxiZWcwYWRkMTYNCg0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsNCg0Kbm9ybWJlZyBNQUNSTyAgIHJjb250bGFiLHZhbHN1Yg0KOyBpZiB3ZSBhcmUgaGVyZSwgd2Uga25vdyB0aGF0ICoobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQNCiAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkeCtlYXhdDQo7IGlmIChtYXRjaCAhPSBzY2FuX3N0YXJ0KSBnb3RvIHJjb250bGFiDQogICAgam5lICAgICByY29udGxhYg0KOyBjYWxjdWxhdGUgdGhlIGdvb2QgY2hhaW5fbGVuZ3RoLCBhbmQgd2UnbGwgY29tcGFyZSBzY2FuIGFuZCBtYXRjaCBzdHJpbmcNCiAgICBhZGQgICAgIGNoYWluX2xlbmd0aCwxNi12YWxzdWINCiAgICBqbXAgICAgIGlzZXENCiAgICBFTkRNDQoNCg0Kbm9ybWFsYmVnMmRjMTE6DQogICAgbm9ybWJlZyByY29udGxvb3AxMSwxMQ0KDQpub3JtYWxiZWcyZGMxMjoNCiAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDEyLDEyDQoNCm5vcm1hbGJlZzJkYzEzOg0KICAgIG5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTMsMTMNCg0Kbm9ybWFsYmVnMmRjMTQ6DQogICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxNCwxNA0KDQpub3JtYWxiZWcyZGMxNToNCiAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDE1LDE1DQoNCm5vcm1hbGJlZzJkYzEwOg0KICAgIG5vcm1iZWcgcmNvbnRsb29wMTAsMTANCg0Kbm9ybWFsYmVnMmRjOToNCiAgICBub3JtYmVnIHJjb250bG9vcDksOQ0KDQpub3JtYWxiZWcyZGM4Og0KICAgIG5vcm1iZWcgcmNvbnRsb29wOCw4DQoNCm5vcm1hbGJlZzJkYzc6DQogICAgbm9ybWJlZyByY29udGxvb3A3LDcNCg0Kbm9ybWFsYmVnMmRjNjoNCiAgICBub3JtYmVnIHJjb250bG9vcDYsNg0KDQpub3JtYWxiZWcyZGM1Og0KICAgIG5vcm1iZWcgcmNvbnRsb29wNSw1DQoNCm5vcm1hbGJlZzJkYzQ6DQogICAgbm9ybWJlZyByY29udGxvb3A0LDQNCg0Kbm9ybWFsYmVnMmRjMzoNCiAgICBub3JtYmVnIHJjb250bG9vcDMsMw0KDQpub3JtYWxiZWcyZGMyOg0KICAgIG5vcm1iZWcgcmNvbnRsb29wMiwyDQoNCm5vcm1hbGJlZzJkYzE6DQogICAgbm9ybWJlZyByY29udGxvb3AxLDENCg0Kbm9ybWFsYmVnMmRjMDoNCiAgICBub3JtYmVnIHJjb250bG9vcDAsMA0KDQoNCjsgd2UgZ28gaW4gbm9ybWFsYmVnMiBiZWNhdXNlICoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kDQoNCm5vcm1hbGJlZzI6DQogICAgbW92ICAgICBlZGksd2luZG93DQoNCiAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkaStlYXhdDQogICAgam5lICAgICBjb250bG9vcDMgICAgICAgICAgICAgICAgICAgOyBpZiAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQsIGNvbnRpbnVlDQoNCmlzZXE6DQo7IGlmIHdlIGFyZSBoZXJlLCB3ZSBrbm93IHRoYXQgKihtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZA0KOyBhbmQgKG1hdGNoID09IHNjYW5fc3RhcnQpDQoNCiAgICBtb3YgICAgIGVkaSxlZHgNCiAgICBtb3YgICAgIGVzaSxzY2FuICAgICAgICAgICAgICAgICAgICA7IGVzaSA9IHNjYW4NCiAgICBhZGQgICAgIGVkaSxlYXggICAgICAgICAgICAgICAgICAgICA7IGVkaSA9IHdpbmRvdyArIGN1cl9tYXRjaCA9IG1hdGNoDQoNCiAgICBtb3YgICAgIGVkeCxbZXNpKzNdICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgbWFudWFsbHkgZHdvcmQgYXQgbWF0Y2grMw0KICAgIHhvciAgICAgZWR4LFtlZGkrM10gICAgICAgICAgICAgICAgIDsgYW5kIHNjYW4gKzMNCg0KICAgIGp6ICAgICAgYmVnaW5jb21wYXJlICAgICAgICAgICAgICAgIDsgaWYgZXF1YWwsIGdvIHRvIGxvbmcgY29tcGFyZQ0KDQo7IHdlIHdpbGwgZGV0ZXJtaW5lIHRoZSB1bm1hdGNoIGJ5dGUgYW5kIGNhbGN1bGF0ZSBsZW4gKGluIGVzaSkNCiAgICBvciAgICAgIGRsLGRsDQogICAgamUgICAgICBlcTFycg0KICAgIG1vdiAgICAgZXNpLDMNCiAgICBqbXAgICAgIHRyZmludmFsDQplcTFycjoNCiAgICBvciAgICAgIGR4LGR4DQogICAgamUgICAgICBlcTENCg0KICAgIG1vdiAgICAgZXNpLDQNCiAgICBqbXAgICAgIHRyZmludmFsDQplcTE6DQogICAgYW5kICAgICBlZHgsMGZmZmZmZmgNCiAgICBqeiAgICAgIGVxMTENCiAgICBtb3YgICAgIGVzaSw1DQogICAgam1wICAgICB0cmZpbnZhbA0KZXExMToNCiAgICBtb3YgICAgIGVzaSw2DQogICAgam1wICAgICB0cmZpbnZhbA0KDQpiZWdpbmNvbXBhcmU6DQogICAgOyBoZXJlIHdlIG5vdyBzY2FuIGFuZCBtYXRjaCBiZWdpbiBzYW1lDQogICAgYWRkICAgICBlZGksNg0KICAgIGFkZCAgICAgZXNpLDYNCiAgICBtb3YgICAgIGVjeCwoTUFYX01BVENILSgyKzQpKS80ICAgICA7IHNjYW4gZm9yIGF0IG1vc3QgTUFYX01BVENIIGJ5dGVzDQogICAgcmVwZSAgICBjbXBzZCAgICAgICAgICAgICAgICAgICAgICAgOyBsb29wIHVudGlsIG1pc21hdGNoDQoNCiAgICBqZSAgICAgIHRyZmluICAgICAgICAgICAgICAgICAgICAgICA7IGdvIHRvIHRyZmluIGlmIG5vdCB1bm1hdGNoDQo7IHdlIGRldGVybWluZSB0aGUgdW5tYXRjaCBieXRlDQogICAgc3ViICAgICBlc2ksNA0KICAgIG1vdiAgICAgZWR4LFtlZGktNF0NCiAgICB4b3IgICAgIGVkeCxbZXNpXQ0KDQogICAgb3IgICAgICBkbCxkbA0KICAgIGpueiAgICAgdHJmaW4NCiAgICBpbmMgICAgIGVzaQ0KDQogICAgb3IgICAgICBkeCxkeA0KICAgIGpueiAgICAgdHJmaW4NCiAgICBpbmMgICAgIGVzaQ0KDQogICAgYW5kICAgICBlZHgsMGZmZmZmZmgNCiAgICBqbnogICAgIHRyZmluDQogICAgaW5jICAgICBlc2kNCg0KdHJmaW46DQogICAgc3ViICAgICBlc2ksc2NhbiAgICAgICAgICA7IGVzaSA9IGxlbg0KdHJmaW52YWw6DQo7IGhlcmUgd2UgaGF2ZSBmaW5pc2VkIGNvbXBhcmUsIGFuZCBlc2kgY29udGFpbiBsZW4gb2YgZXF1YWwgc3RyaW5nDQogICAgY21wICAgICBlc2ksYmVzdF9sZW4gICAgICAgIDsgaWYgbGVuID4gYmVzdF9sZW4sIGdvIG5ld2Jlc3RsZW4NCiAgICBqYSAgICAgIHNob3J0IG5ld2Jlc3RsZW4NCjsgbm93IHdlIHJlc3RvcmUgZWR4LCBlY3ggYW5kIGVzaSwgZm9yIHRoZSBiaWcgbG9vcA0KICAgIG1vdiAgICAgZXNpLHByZXYNCiAgICBtb3YgICAgIGVjeCxsaW1pdA0KICAgIG1vdiAgICAgZWR4LHdpbmRvdw0KICAgIGptcCAgICAgY29udGxvb3AzDQoNCm5ld2Jlc3RsZW46DQogICAgbW92ICAgICBiZXN0X2xlbixlc2kgICAgICAgIDsgbGVuIGJlY29tZSBiZXN0X2xlbg0KDQogICAgbW92ICAgICBtYXRjaF9zdGFydCxlYXggICAgIDsgc2F2ZSBuZXcgcG9zaXRpb24gYXMgbWF0Y2hfc3RhcnQNCiAgICBjbXAgICAgIGVzaSxuaWNlX21hdGNoICAgICAgOyBpZiBiZXN0X2xlbiA+PSBuaWNlX21hdGNoLCBleGl0DQogICAgamFlICAgICBleGl0bG9vcA0KICAgIG1vdiAgICAgZWN4LHNjYW4NCiAgICBtb3YgICAgIGVkeCx3aW5kb3cgICAgICAgICAgOyByZXN0b3JlIGVkeD13aW5kb3cNCiAgICBhZGQgICAgIGVjeCxlc2kNCiAgICBhZGQgICAgIGVzaSxlZHgNCg0KICAgIGRlYyAgICAgZXNpDQogICAgbW92ICAgICB3aW5kb3dsZW4sZXNpICAgICAgIDsgd2luZG93bGVuID0gd2luZG93ICsgYmVzdF9sZW4tMQ0KICAgIG1vdiAgICAgYngsW2VjeC0xXSAgICAgICAgICA7IGJ4ID0gKihzY2FuK2Jlc3RfbGVuLTEpID0gc2Nhbl9lbmQNCg0KOyBub3cgd2UgcmVzdG9yZSBlY3ggYW5kIGVzaSwgZm9yIHRoZSBiaWcgbG9vcCA6DQogICAgbW92ICAgICBlc2kscHJldg0KICAgIG1vdiAgICAgZWN4LGxpbWl0DQogICAgam1wICAgICBjb250bG9vcDMNCg0KZXhpdGxvb3A6DQo7IGV4aXQgOiBzLT5tYXRjaF9zdGFydD1tYXRjaF9zdGFydA0KICAgIG1vdiAgICAgZWJ4LG1hdGNoX3N0YXJ0DQogICAgbW92ICAgICBlYnAsc3RyX3MNCiAgICBtb3YgICAgIGVjeCxiZXN0X2xlbg0KICAgIG1vdiAgICAgZHdvcmQgcHRyIFtlYnArZGVwX21hdGNoX3N0YXJ0XSxlYngNCiAgICBtb3YgICAgIGVheCxkd29yZCBwdHIgW2VicCtkZXBfbG9va2FoZWFkXQ0KICAgIGNtcCAgICAgZWN4LGVheA0KICAgIGphICAgICAgbWluZXhsbw0KICAgIG1vdiAgICAgZWF4LGVjeA0KbWluZXhsbzoNCjsgcmV0dXJuIG1pbihiZXN0X2xlbixzLT5sb29rYWhlYWQpDQoNCjsgcmVzdG9yZSBzdGFjayBhbmQgcmVnaXN0ZXIgZWJ4LGVzaSxlZGksZWJwDQogICAgYWRkICAgICBlc3AsTmJTdGFja0FkZA0KDQogICAgcG9wICAgICBlYngNCiAgICBwb3AgICAgIGVzaQ0KICAgIHBvcCAgICAgZWRpDQogICAgcG9wICAgICBlYnANCiAgICByZXQNCkluZm9BdXRob3I6DQo7IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQ0KOyBZb3VyIGFyZSBmcmVlIHVzZSBndm1hdDMyIGluIGFueSBmcmUgb3IgY29tbWVyY2lhbCBhcHBzIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQ0KICAgIGRiICAgICAwZGgsMGFoLCJHVk1hdDMyIG9wdGltaXNlZCBhc3NlbWJseSBjb2RlIHdyaXR0ZW4gMTk5Ni05OCBieSBHaWxsZXMgVm9sbGFudCIsMGRoLDBhaA0KDQoNCg0KSUZERUYgTk9VTkRFUkxJTkUNCmxvbmdlc3RfbWF0Y2hfN2ZmZiAgIGVuZHANCkVMU0UNCl9sb25nZXN0X21hdGNoXzdmZmYgIGVuZHANCkVORElGDQoNCg0KSUZERUYgTk9VTkRFUkxJTkUNCmNwdWRldGVjdDMyICAgICBwcm9jIG5lYXINCkVMU0UNCl9jcHVkZXRlY3QzMiAgICBwcm9jIG5lYXINCkVORElGDQoNCiAgICBwdXNoICAgIGVieA0KDQogICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBwdXNoIG9yaWdpbmFsIEVGTEFHUw0KICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgZ2V0IG9yaWdpbmFsIEVGTEFHUw0KICAgIG1vdiAgICAgZWN4LCBlYXggICAgICAgIDsgc2F2ZSBvcmlnaW5hbCBFRkxBR1MNCiAgICB4b3IgICAgIGVheCwgNDAwMDBoICAgICA7IGZsaXAgQUMgYml0IGluIEVGTEFHUw0KICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgIDsgc2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrDQogICAgcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlDQogICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBnZXQgbmV3IEVGTEFHUw0KICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgc3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgNCiAgICB4b3IgICAgIGVheCwgZWN4ICAgICAgICA7IGNhbpJ0IHRvZ2dsZSBBQyBiaXQsIHByb2Nlc3Nvcj04MDM4Ng0KICAgIGp6ICAgICAgZW5kX2NwdV9pc18zODYgIDsganVtcCBpZiA4MDM4NiBwcm9jZXNzb3INCiAgICBwdXNoICAgIGVjeA0KICAgIHBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBBQyBiaXQgaW4gRUZMQUdTIGZpcnN0DQoNCiAgICBwdXNoZmQNCiAgICBwdXNoZmQNCiAgICBwb3AgICAgIGVjeA0KDQogICAgbW92ICAgICBlYXgsIGVjeCAgICAgICAgOyBnZXQgb3JpZ2luYWwgRUZMQUdTDQogICAgeG9yICAgICBlYXgsIDIwMDAwMGggICAgOyBmbGlwIElEIGJpdCBpbiBFRkxBR1MNCiAgICBwdXNoICAgIGVheCAgICAgICAgICAgICA7IHNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjaw0KICAgIHBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQ0KICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgZ2V0IG5ldyBFRkxBR1MNCiAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IHN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYDQogICAgcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIG9yaWdpbmFsIEVGTEFHUw0KICAgIHhvciAgICAgZWF4LCBlY3ggICAgICAgIDsgY2FuknQgdG9nZ2xlIElEIGJpdCwNCiAgICBqZSAgICAgIGlzX29sZF80ODYgICAgICA7IHByb2Nlc3Nvcj1vbGQNCg0KICAgIG1vdiAgICAgZWF4LDENCiAgICBkYiAgICAgIDBmaCwwYTJoICAgICAgICA7Q1BVSUQNCg0KZXhpdGNwdWRldGVjdDoNCiAgICBwb3AgZWJ4DQogICAgcmV0DQoNCmVuZF9jcHVfaXNfMzg2Og0KICAgIG1vdiAgICAgZWF4LDAzMDBoDQogICAgam1wICAgICBleGl0Y3B1ZGV0ZWN0DQoNCmlzX29sZF80ODY6DQogICAgbW92ICAgICBlYXgsMDQwMGgNCiAgICBqbXAgICAgIGV4aXRjcHVkZXRlY3QNCg0KSUZERUYgTk9VTkRFUkxJTkUNCmNwdWRldGVjdDMyICAgICBlbmRwDQpFTFNFDQpfY3B1ZGV0ZWN0MzIgICAgZW5kcA0KRU5ESUYNCkVORElGDQoNCk1BWF9NQVRDSCAgICAgICBlcXUgICAgIDI1OA0KTUlOX01BVENIICAgICAgIGVxdSAgICAgMw0KTUlOX0xPT0tBSEVBRCAgIGVxdSAgICAgKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpDQpNQVhfTUFUQ0hfOF8gICAgIGVxdSAgICAgKChNQVhfTUFUQ0ggKyA3KSBBTkQgMEZGRjBoKQ0KDQoNCjs7OyBzdGFjayBmcmFtZSBvZmZzZXRzDQoNCmNoYWlubGVud21hc2sgICBlcXUgIGVzcCArIDAgICAgOyBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuDQogICAgICAgICAgICAgICAgICAgIDsgbG93IHdvcmQ6IHMtPndtYXNrDQp3aW5kb3cgICAgICBlcXUgIGVzcCArIDQgICAgOyBsb2NhbCBjb3B5IG9mIHMtPndpbmRvdw0Kd2luZG93YmVzdGxlbiAgIGVxdSAgZXNwICsgOCAgICA7IHMtPndpbmRvdyArIGJlc3RsZW4NCnNjYW5zdGFydCAgIGVxdSAgZXNwICsgMTYgICA7IGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcNCnNjYW5lbmQgICAgIGVxdSAgZXNwICsgMTIgICA7IGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZw0Kc2NhbmFsaWduICAgZXF1ICBlc3AgKyAyMCAgIDsgZHdvcmQtbWlzYWxpZ25tZW50IG9mIHN0cmluZw0KbmljZW1hdGNoICAgZXF1ICBlc3AgKyAyNCAgIDsgYSBnb29kIGVub3VnaCBtYXRjaCBzaXplDQpiZXN0bGVuICAgICBlcXUgIGVzcCArIDI4ICAgOyBzaXplIG9mIGJlc3QgbWF0Y2ggc28gZmFyDQpzY2FuICAgICAgICBlcXUgIGVzcCArIDMyICAgOyBwdHIgdG8gc3RyaW5nIHdhbnRpbmcgbWF0Y2gNCg0KTG9jYWxWYXJzU2l6ZSAgIGVxdSAzNg0KOyAgIHNhdmVkIGVieCAgIGJ5dGUgZXNwICsgMzYNCjsgICBzYXZlZCBlZGkgICBieXRlIGVzcCArIDQwDQo7ICAgc2F2ZWQgZXNpICAgYnl0ZSBlc3AgKyA0NA0KOyAgIHNhdmVkIGVicCAgIGJ5dGUgZXNwICsgNDgNCjsgICByZXR1cm4gYWRkcmVzcyAgYnl0ZSBlc3AgKyA1Mg0KZGVmbGF0ZXN0YXRlICAgIGVxdSAgZXNwICsgNTYgICA7IHRoZSBmdW5jdGlvbiBhcmd1bWVudHMNCmN1cm1hdGNoICAgIGVxdSAgZXNwICsgNjANCg0KOzs7IE9mZnNldHMgZm9yIGZpZWxkcyBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUuIFRoZXNlIG51bWJlcnMNCjs7OyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlDQo7OzsgYXNzdW1wdGlvbiB0aGF0IHRoZSBjb21waWxlciB3aWxsIGR3b3JkLWFsaWduIHRoZSBmaWVsZHMuIChUaHVzLA0KOzs7IGNoYW5naW5nIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUgY291bGQgZWFzaWx5IGNhdXNlIHRoaXMNCjs7OyBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0DQo7OzsgY29tcGlsZSB0aW1lLiBTaWdoLikNCg0KZHNXU2l6ZSAgICAgZXF1IDM2K3psaWIxMjIyYWRkDQpkc1dNYXNrICAgICBlcXUgNDQremxpYjEyMjJhZGQNCmRzV2luZG93ICAgIGVxdSA0OCt6bGliMTIyMmFkZA0KZHNQcmV2ICAgICAgZXF1IDU2K3psaWIxMjIyYWRkDQpkc01hdGNoTGVuICBlcXUgODgremxpYjEyMjJhZGQNCmRzUHJldk1hdGNoIGVxdSA5Mit6bGliMTIyMmFkZA0KZHNTdHJTdGFydCAgZXF1IDEwMCt6bGliMTIyMmFkZA0KZHNNYXRjaFN0YXJ0ICAgIGVxdSAxMDQremxpYjEyMjJhZGQNCmRzTG9va2FoZWFkIGVxdSAxMDgremxpYjEyMjJhZGQNCmRzUHJldkxlbiAgIGVxdSAxMTIremxpYjEyMjJhZGQNCmRzTWF4Q2hhaW5MZW4gICBlcXUgMTE2K3psaWIxMjIyYWRkDQpkc0dvb2RNYXRjaCBlcXUgMTMyK3psaWIxMjIyYWRkDQpkc05pY2VNYXRjaCBlcXUgMTM2K3psaWIxMjIyYWRkDQoNCg0KOzs7IG1hdGNoLmFzbSAtLSBQZW50aXVtLVByby1vcHRpbWl6ZWQgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoKCkNCjs7OyBXcml0dGVuIGZvciB6bGliIDEuMS4yDQo7OzsgQ29weXJpZ2h0IChDKSAxOTk4IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+DQo7OzsgWW91IGNhbiBsb29rIGF0IGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwNCjs7Ow0KOzs7IFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdA0KOzs7IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuDQoNCjtHTE9CQUwgX2xvbmdlc3RfbWF0Y2gsIF9tYXRjaF9pbml0DQoNCg0KO1NFQ1RJT04gICAgLnRleHQNCg0KOzs7IHVJbnQgbG9uZ2VzdF9tYXRjaChkZWZsYXRlX3N0YXRlICpkZWZsYXRlc3RhdGUsIElQb3MgY3VybWF0Y2gpDQoNCjtfbG9uZ2VzdF9tYXRjaDoNCklGREVGIE5PT0xEUEVOVElVTUNPREUNCiAgICBJRkRFRiBOT1VOREVSTElORQ0KICAgIGxvbmdlc3RfbWF0Y2ggICAgICAgcHJvYyBuZWFyDQogICAgRUxTRQ0KICAgIF9sb25nZXN0X21hdGNoICAgICAgcHJvYyBuZWFyDQogICAgRU5ESUYNCkVMU0UNCiAgICBJRkRFRiBOT1VOREVSTElORQ0KICAgIGxvbmdlc3RfbWF0Y2hfNjg2ICAgcHJvYyBuZWFyDQogICAgRUxTRQ0KICAgIF9sb25nZXN0X21hdGNoXzY4NiAgcHJvYyBuZWFyDQogICAgRU5ESUYNCkVORElGDQoNCjs7OyBTYXZlIHJlZ2lzdGVycyB0aGF0IHRoZSBjb21waWxlciBtYXkgYmUgdXNpbmcsIGFuZCBhZGp1c3QgZXNwIHRvDQo7OzsgbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuDQoNCiAgICAgICAgcHVzaCAgICBlYnANCiAgICAgICAgcHVzaCAgICBlZGkNCiAgICAgICAgcHVzaCAgICBlc2kNCiAgICAgICAgcHVzaCAgICBlYngNCiAgICAgICAgc3ViIGVzcCwgTG9jYWxWYXJzU2l6ZQ0KDQo7OzsgUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gZWN4IHdpbGwgaG9sZCBjdXJfbWF0Y2gNCjs7OyB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24uIGVkeCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlDQo7OzsgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUNCjs7OyBlbnRlcmluZyB0aGUgbWFpbiBsb29wLg0KDQogICAgICAgIG1vdiBlZHgsIFtkZWZsYXRlc3RhdGVdDQogICAgICAgIG1vdiBlY3gsIFtjdXJtYXRjaF0NCg0KOzs7IHVJbnQgd21hc2sgPSBzLT53X21hc2s7DQo7OzsgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsNCjs7OyBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgew0KOzs7ICAgICBjaGFpbl9sZW5ndGggPj49IDI7DQo7OzsgfQ0KDQogICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1ByZXZMZW5dDQogICAgICAgIG1vdiBlYngsIFtlZHggKyBkc0dvb2RNYXRjaF0NCiAgICAgICAgY21wIGVheCwgZWJ4DQogICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1dNYXNrXQ0KICAgICAgICBtb3YgZWJ4LCBbZWR4ICsgZHNNYXhDaGFpbkxlbl0NCiAgICAgICAgamwgIExhc3RNYXRjaEdvb2QNCiAgICAgICAgc2hyIGVieCwgMg0KTGFzdE1hdGNoR29vZDoNCg0KOzs7IGNoYWlubGVuIGlzIGRlY3JlbWVudGVkIG9uY2UgYmVmb3JlaGFuZCBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4NCjs7OyB1c2UgdGhlIHNpZ24gZmxhZyBpbnN0ZWFkIG9mIHRoZSB6ZXJvIGZsYWcgZm9yIHRoZSBleGl0IHRlc3QuDQo7OzsgSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sNCjs7OyB2YWx1ZSwgd2hpY2ggaXQgd2lsbCBhbHdheXMgYWNjb21wYW55Lg0KDQogICAgICAgIGRlYyBlYngNCiAgICAgICAgc2hsIGVieCwgMTYNCiAgICAgICAgb3IgIGVieCwgZWF4DQogICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVieA0KDQo7OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQoNCiAgICAgICAgbW92IGVheCwgW2VkeCArIGRzTmljZU1hdGNoXQ0KICAgICAgICBtb3YgZWJ4LCBbZWR4ICsgZHNMb29rYWhlYWRdDQogICAgICAgIGNtcCBlYngsIGVheA0KICAgICAgICBqbCAgTG9va2FoZWFkTGVzcw0KICAgICAgICBtb3YgZWJ4LCBlYXgNCkxvb2thaGVhZExlc3M6ICBtb3YgW25pY2VtYXRjaF0sIGVieA0KDQo7OzsgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsNCg0KICAgICAgICBtb3YgZXNpLCBbZWR4ICsgZHNXaW5kb3ddDQogICAgICAgIG1vdiBbd2luZG93XSwgZXNpDQogICAgICAgIG1vdiBlYnAsIFtlZHggKyBkc1N0clN0YXJ0XQ0KICAgICAgICBsZWEgZWRpLCBbZXNpICsgZWJwXQ0KICAgICAgICBtb3YgW3NjYW5dLCBlZGkNCg0KOzs7IERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcNCjs7OyBkd29yZC1hbGlnbmVkLg0KDQogICAgICAgIG1vdiBlYXgsIGVkaQ0KICAgICAgICBuZWcgZWF4DQogICAgICAgIGFuZCBlYXgsIDMNCiAgICAgICAgbW92IFtzY2FuYWxpZ25dLCBlYXgNCg0KOzs7IElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCjs7OyAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsNCg0KICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNXU2l6ZV0NCiAgICAgICAgc3ViIGVheCwgTUlOX0xPT0tBSEVBRA0KICAgICAgICBzdWIgZWJwLCBlYXgNCiAgICAgICAgamcgIExpbWl0UG9zaXRpdmUNCiAgICAgICAgeG9yIGVicCwgZWJwDQpMaW1pdFBvc2l0aXZlOg0KDQo7OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7DQoNCiAgICAgICAgbW92IGVheCwgW2VkeCArIGRzUHJldkxlbl0NCiAgICAgICAgbW92IFtiZXN0bGVuXSwgZWF4DQoNCjs7OyBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluIGVzaSBsb2NhbGx5LCBhbmQgaW4gZXNpLg0KDQogICAgICAgIGFkZCBlc2ksIGVheA0KICAgICAgICBtb3YgW3dpbmRvd2Jlc3RsZW5dLCBlc2kNCg0KOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOw0KOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCjs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCg0KICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaV0NCiAgICAgICAgbW92IFtzY2Fuc3RhcnRdLCBlYngNCiAgICAgICAgbW92enggICBlYngsIHdvcmQgcHRyIFtlZGkgKyBlYXggLSAxXQ0KICAgICAgICBtb3YgW3NjYW5lbmRdLCBlYngNCiAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCg0KOzs7IEp1bXAgaW50byB0aGUgbWFpbiBsb29wLg0KDQogICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KICAgICAgICBqbXAgc2hvcnQgTG9vcEVudHJ5DQoNCmFsaWduIDQNCg0KOzs7IGRvIHsNCjs7OyAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7DQo7OzsgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fA0KOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsNCjs7OyAgICAgWy4uLl0NCjs7OyB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQNCjs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsNCjs7Ow0KOzs7IEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUNCjs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbA0KOzs7IGJlIHNwZW50IGluIHRoZSBmaXJzdCB0ZW4gaW5zdHJ1Y3Rpb25zLg0KOzs7DQo7OzsgV2l0aGluIHRoaXMgbG9vcDoNCjs7OyBlYnggPSBzY2FuZW5kDQo7OzsgZWN4ID0gY3VybWF0Y2gNCjs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykNCjs7OyBlc2kgPSB3aW5kb3diZXN0bGVuIC0gaS5lLiwgKHdpbmRvdyArIGJlc3RsZW4pDQo7OzsgZWRpID0gcHJldg0KOzs7IGVicCA9IGxpbWl0DQoNCkxvb2t1cExvb3A6DQogICAgICAgIGFuZCBlY3gsIGVkeA0KICAgICAgICBtb3Z6eCAgIGVjeCwgd29yZCBwdHIgW2VkaSArIGVjeCoyXQ0KICAgICAgICBjbXAgZWN4LCBlYnANCiAgICAgICAgamJlIExlYXZlTm93DQogICAgICAgIHN1YiBlZHgsIDAwMDEwMDAwaA0KICAgICAgICBqcyAgTGVhdmVOb3cNCkxvb3BFbnRyeTogIG1vdnp4ICAgZWF4LCB3b3JkIHB0ciBbZXNpICsgZWN4IC0gMV0NCiAgICAgICAgY21wIGVheCwgZWJ4DQogICAgICAgIGpueiBMb29rdXBMb29wDQogICAgICAgIG1vdiBlYXgsIFt3aW5kb3ddDQogICAgICAgIG1vdnp4ICAgZWF4LCB3b3JkIHB0ciBbZWF4ICsgZWN4XQ0KICAgICAgICBjbXAgZWF4LCBbc2NhbnN0YXJ0XQ0KICAgICAgICBqbnogTG9va3VwTG9vcA0KDQo7OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uDQoNCiAgICAgICAgbW92IFtjaGFpbmxlbndtYXNrXSwgZWR4DQoNCjs7OyBQb2ludCBlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kIGVzaSB0byB0aGUgc3RyaW5nIHdlDQo7OzsgYXJlIGhvcGluZyB0byBtYXRjaCBpdCB1cCB3aXRoLiBJbiBhY3R1YWxpdHksIGVzaSBhbmQgZWRpIGFyZQ0KOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQo7OzsgaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuDQoNCiAgICAgICAgbW92IGVzaSwgW3dpbmRvd10NCiAgICAgICAgbW92IGVkaSwgW3NjYW5dDQogICAgICAgIGFkZCBlc2ksIGVjeA0KICAgICAgICBtb3YgZWF4LCBbc2NhbmFsaWduXQ0KICAgICAgICBtb3YgZWR4LCAwZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQ0KICAgICAgICBsZWEgZWRpLCBbZWRpICsgZWF4ICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0NCiAgICAgICAgbGVhIGVzaSwgW2VzaSArIGVheCArIDAxMDhoXSA7TUFYX01BVENIXzhdDQoNCjs7OyBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsDQo7OzsgYWRqdXN0IGVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQo7OzsNCjs7OyBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUNCjs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQo7Ozsgc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zDQo7OzsgYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSBlZGkNCjs7OyBwb2ludGVyLiAoZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQo7OzsNCjs7OyBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50DQo7OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCjs7OyBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUNCjs7OyBwZXJmb3JtYW5jZS4NCg0KTG9vcENtcHM6DQogICAgICAgIG1vdiBlYXgsIFtlc2kgKyBlZHhdDQogICAgICAgIHhvciBlYXgsIFtlZGkgKyBlZHhdDQogICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzDQogICAgICAgIG1vdiBlYXgsIFtlc2kgKyBlZHggKyA0XQ0KICAgICAgICB4b3IgZWF4LCBbZWRpICsgZWR4ICsgNF0NCiAgICAgICAgam56IExlYXZlTG9vcENtcHM0DQogICAgICAgIGFkZCBlZHgsIDgNCiAgICAgICAgam56IExvb3BDbXBzDQogICAgICAgIGptcCBzaG9ydCBMZW5NYXhpbXVtDQpMZWF2ZUxvb3BDbXBzNDogYWRkIGVkeCwgNA0KTGVhdmVMb29wQ21wczogIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgNCiAgICAgICAgam56IExlbkxvd2VyDQogICAgICAgIGFkZCBlZHgsICAyDQogICAgICAgIHNociBlYXgsIDE2DQpMZW5Mb3dlcjogICBzdWIgYWwsIDENCiAgICAgICAgYWRjIGVkeCwgMA0KDQo7OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQo7OzsgdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuDQoNCiAgICAgICAgbGVhIGVheCwgW2VkaSArIGVkeF0NCiAgICAgICAgbW92IGVkaSwgW3NjYW5dDQogICAgICAgIHN1YiBlYXgsIGVkaQ0KICAgICAgICBjbXAgZWF4LCBNQVhfTUFUQ0gNCiAgICAgICAgamdlIExlbk1heGltdW0NCg0KOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KOzs7IGhhdmUgc28gZmFyLCB0aGVuIGZvcmdldCBpdCBhbmQgcmV0dXJuIHRvIHRoZSBsb29rdXAgbG9vcC4NCg0KICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KICAgICAgICBtb3YgZWJ4LCBbYmVzdGxlbl0NCiAgICAgICAgY21wIGVheCwgZWJ4DQogICAgICAgIGpnICBMb25nZXJNYXRjaA0KICAgICAgICBtb3YgZXNpLCBbd2luZG93YmVzdGxlbl0NCiAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCiAgICAgICAgbW92IGVieCwgW3NjYW5lbmRdDQogICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KICAgICAgICBqbXAgTG9va3VwTG9vcA0KDQo7OzsgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsNCjs7OyAgICAgICAgIGJlc3RfbGVuID0gbGVuOw0KOzs7ICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsNCjs7OyAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCg0KTG9uZ2VyTWF0Y2g6ICAgIG1vdiBlYngsIFtuaWNlbWF0Y2hdDQogICAgICAgIG1vdiBbYmVzdGxlbl0sIGVheA0KICAgICAgICBtb3YgW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeA0KICAgICAgICBjbXAgZWF4LCBlYngNCiAgICAgICAgamdlIExlYXZlTm93DQogICAgICAgIG1vdiBlc2ksIFt3aW5kb3ddDQogICAgICAgIGFkZCBlc2ksIGVheA0KICAgICAgICBtb3YgW3dpbmRvd2Jlc3RsZW5dLCBlc2kNCiAgICAgICAgbW92enggICBlYngsIHdvcmQgcHRyIFtlZGkgKyBlYXggLSAxXQ0KICAgICAgICBtb3YgZWRpLCBbZWR4ICsgZHNQcmV2XQ0KICAgICAgICBtb3YgW3NjYW5lbmRdLCBlYngNCiAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQogICAgICAgIGptcCBMb29rdXBMb29wDQoNCjs7OyBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4NCg0KTGVuTWF4aW11bTogbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0NCiAgICAgICAgbW92IGR3b3JkIHB0ciBbYmVzdGxlbl0sIE1BWF9NQVRDSA0KICAgICAgICBtb3YgW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeA0KDQo7OzsgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOw0KOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7DQoNCkxlYXZlTm93Og0KICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KICAgICAgICBtb3YgZWJ4LCBbYmVzdGxlbl0NCiAgICAgICAgbW92IGVheCwgW2VkeCArIGRzTG9va2FoZWFkXQ0KICAgICAgICBjbXAgZWJ4LCBlYXgNCiAgICAgICAgamcgIExvb2thaGVhZFJldA0KICAgICAgICBtb3YgZWF4LCBlYngNCkxvb2thaGVhZFJldDoNCg0KOzs7IFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4NCg0KICAgICAgICBhZGQgZXNwLCBMb2NhbFZhcnNTaXplDQogICAgICAgIHBvcCBlYngNCiAgICAgICAgcG9wIGVzaQ0KICAgICAgICBwb3AgZWRpDQogICAgICAgIHBvcCBlYnANCg0KICAgICAgICByZXQNCjsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhDQo7IFlvdXIgY2FuIGZyZWVseSB1c2UgZ3ZtYXQzMiBpbiBhbnkgZnJlZSBvciBjb21tZXJjaWFsIGFwcCBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSENCiAgICBkYiAgICAgMGRoLDBhaCwiYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCIsMGRoLDBhaA0KDQoNCklGREVGIE5PT0xEUEVOVElVTUNPREUNCiAgICBJRkRFRiBOT1VOREVSTElORQ0KICAgIGxvbmdlc3RfbWF0Y2ggICAgICAgZW5kcA0KICAgIEVMU0UNCiAgICBfbG9uZ2VzdF9tYXRjaCAgICAgIGVuZHANCiAgICBFTkRJRg0KDQogICAgSUZERUYgTk9VTkRFUkxJTkUNCiAgICBtYXRjaF9pbml0ICAgICAgcHJvYyBuZWFyDQogICAgICAgICAgICAgICAgICAgIHJldA0KICAgIG1hdGNoX2luaXQgICAgICBlbmRwDQogICAgRUxTRQ0KICAgIF9tYXRjaF9pbml0ICAgICBwcm9jIG5lYXINCiAgICAgICAgICAgICAgICAgICAgcmV0DQogICAgX21hdGNoX2luaXQgICAgIGVuZHANCiAgICBFTkRJRiAgICANCkVMU0UNCiAgICBJRkRFRiBOT1VOREVSTElORQ0KICAgIGxvbmdlc3RfbWF0Y2hfNjg2ICAgZW5kcA0KICAgIEVMU0UNCiAgICBfbG9uZ2VzdF9tYXRjaF82ODYgIGVuZHANCiAgICBFTkRJRg0KRU5ESUYNCg0KX1RFWFQgICBlbmRzDQplbmQNCg==