Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
C1C91A3892FB22A27FA99D7DAEC9B404A09BCA522722AC6A80ED6C72C268FC31
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
119,843,868
Gas consumed
FEE
250000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1qp5pt8cdq2f6kfdamn3yuxwg6quqnfpyewzz3912000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CqLQBQoML3ZtLm1fYWRkcGtnEpDQBQooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORLTzwUKB3Zlc3RpbmcSO2duby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS92ZXN0aW5nGmIKC2dub21vZC50b21sElNtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3Zlc3RpbmciCmdubyA9ICIwLjkiChqm5QIKC3Zlc3RpbmcuZ25vEpXlAi8vIFJlYWxtIHZlc3RpbmcgZXNjcm93cyBuYXRpdmUgR05PVCBmb3IgYSBuYW1lZCBiZW5lZmljaWFyeSBhbmQgcmVsZWFzZXMKLy8gaXQgaW4gRElTQ1JFVEUsIElORElWSURVQUxMWSBEQVRFRCBUUkFOQ0hFUyDigJQgZWFjaCBwYXlhYmxlIGV4YWN0bHkgb25jZSwKLy8gYXQgb3IgYWZ0ZXIgaXRzIG93biBkdWUgaGVpZ2h0LgovLwovLyAjIERJU0NSRVRFLCBOT1QgTElORUFSIOKAlCByZWFkIHRoaXMgZmlyc3QKLy8KLy8gRXZlcnl3aGVyZSBlbHNlIGluIHRoaXMgZWNvc3lzdGVtICJ2ZXN0aW5nIiBtZWFucyBDT05USU5VT1VTIExJTkVBUgovLyBBQ0NSVUFMOiBhIGZvcm11bGEgb2YgdGhlIGZvcm0gYW1vdW50ICogZWxhcHNlZCAvIGR1cmF0aW9uLCBldmFsdWF0ZWQKLy8gd2hlbmV2ZXIgc29tZW9uZSBhc2tzLiBUaGlzIHJlYWxtIGRvZXMgbm8gc3VjaCBhcml0aG1ldGljLiBBIGZ1bmRlcgovLyBzdGF0ZXMgYW4gZXhwbGljaXQgbGlzdCBvZiAoZGVsYXksIGFtb3VudCkgcGFpcnMgYXQgZnVuZGluZyB0aW1lLCBhbmQKLy8gbm90aGluZyBhY2NydWVzIGJldHdlZW4gdGhlbTogYSB0cmFuY2hlIGlzIHdvcnRoIHplcm8gdW50aWwgaXRzIGR1ZQovLyBoZWlnaHQgYW5kIGl0cyBmdWxsIGFtb3VudCBmcm9tIHRoYXQgaGVpZ2h0IG9uLgovLwovLyBUaGF0IGlzIGEgZGVsaWJlcmF0ZSBjaG9pY2UsIG5vdCBhIHNpbXBsaWZpY2F0aW9uOgovLwovLyAgIC0gSXQgaXMgdGhlIHNoYXBlIHJlYWwgc2NoZWR1bGVzIGFjdHVhbGx5IGhhdmUg4oCUIGNsaWZmcywgcXVhcnRlcmx5Ci8vICAgICB0cmFuY2hlcywgbWlsZXN0b25lIHBheW1lbnRzLCBhIGx1bXAgc3VtIG9uIGEgZGF0ZS4KLy8gICAtIEl0IGhhcyBubyBgYW1vdW50ICogZWxhcHNlZGAgdGVybSwgc28gdGhlIGludDY0IG92ZXJmbG93IGNsYXNzIHRoYXQKLy8gICAgIGhhcyBhbHJlYWR5IHNoaXBwZWQgYSBORUdBVElWRSB2ZXN0ZWQgYW1vdW50IGluIHR3byBpbmRlcGVuZGVudAovLyAgICAgZWNvc3lzdGVtIHBhY2thZ2VzIGNhbm5vdCBvY2N1ciBoZXJlOiB0aGF0IE1VTFRJUExJQ0FUSVZFIGNsYXNzIGlzCi8vICAgICBkZXNpZ25lZCBvdXQgcmF0aGVyIHRoYW4gZ3VhcmRlZCBhZ2FpbnN0LiBUaGUgYWRkaXRpdmUgc3VtcyB0aGF0IGRvCi8vICAgICBleGlzdCBhcmUgZ3VhcmRlZCwgbm90IGRlc2lnbmVkIG91dCDigJQgRnVuZCBjaGVja3MgdGhlIHRyYW5jaGUgdG90YWwKLy8gICAgIGFuZCB0aGUgZXNjcm93IHRvdGFsIHdpdGggY2hlY2tlZEFkZCwgZWFjaCB3aXRoIGl0cyBvd24gcGFuaWMsCi8vICAgICBiZWZvcmUgYW55IHN0YXRlIGNoYW5nZXMuIEJvdGggaGFsdmVzIGFyZSB0cnVlIGFuZCBuZWl0aGVyIHJlcGxhY2VzCi8vICAgICB0aGUgb3RoZXIuCi8vICAgLSBJdCBtYXBzIGV4YWN0bHkgb250byBkdWVib29rLCB3aG9zZSBleGFjdGx5LW9uY2UgQ2xhaW0gaXMgd2hhdCBtYWtlcwovLyAgICAgYSBkb3VibGUgcmVsZWFzZSBzdHJ1Y3R1cmFsbHkgaW1wb3NzaWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY2hlY2tlZC4KLy8KLy8gVGhlcmUgaXMgbm8gZGVmYXVsdCBjdXJ2ZSB0byBiZSBzdXJwcmlzZWQgYnk6IGV2ZXJ5IHRyYW5jaGUgaXMgc3RhdGVkCi8vIGV4cGxpY2l0bHkgYXQgY3JlYXRpb24sIG9yIHRoZSBzY2hlZHVsZSBkb2VzIG5vdCBleGlzdC4KLy8KLy8gIyBDT01QT1NJVElPTgovLwovLyBUaGlzIHJlYWxtIG93bnMgb25seSB0aGUgc2NoZWR1bGUgc3RhdGUgbWFjaGluZS4gRXZlcnl0aGluZyBlbHNlIGlzCi8vIGRlbGVnYXRlZCB0byBwcmltaXRpdmVzIGFscmVhZHkgYXVkaXRlZCBhbmQgZGVwbG95ZWQ6Ci8vCi8vCWR1ZWJvb2sgICDigJQgdGhlIGVudGlyZSBzY2hlZHVsZTogZHVlIGhlaWdodHMsIGFuZCBleGFjdGx5LW9uY2UgcmVsZWFzZQovLwljb2luaW8gICAg4oCUIGNvaW4gY3VzdG9keTogZXNjcm93LWluLCBwYXlvdXQsIHN1cnBsdXMgc3dlZXAKLy8JZmVlbGVkZ2VyIOKAlCBjbGFpbWFibGUgYmFsYW5jZXMgYW5kIHRoZSBmZWUgcG90Ci8vCXNhbml0aXplICDigJQgZnVuZGVyLXN1cHBsaWVkIGZyZWUgdGV4dCwgYmVmb3JlIGl0IHJlYWNoZXMgbWFya2Rvd24KLy8KLy8gSXQgaXMgZHVlYm9vaydzIEZJUlNUIFBST0RVQ1RJVkUgQ09OU1VNRVIuIGR1ZWJvb2tfZGVtbyBpcyB0aGUKLy8gZmFsc2lmaWNhdGlvbiBleHBlcmltZW50IGFuZCBob2xkcyBubyBjb2lucyBieSBkZXNpZ247IHRoaXMgcmVhbG0gaXMgdGhlCi8vIGZpcnN0IHRvIHB1dCB2YWx1ZSBiZWhpbmQgdGhlIGV4YWN0bHktb25jZSBjbGFpbS4KLy8KLy8gIyBMSUZFQ1lDTEUKLy8KLy8JRnVuZCAoRU9BICsgLXNlbmQpICAgICAgOiBvbmUgdHJhbnNhY3Rpb24gY3JlYXRlcyB0aGUgc2NoZWR1bGUsIGVzY3Jvd3MKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXhhY3QgdG90YWwsIGFuZCByZWdpc3RlcnMgZXZlcnkgdHJhbmNoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGR1ZWJvb2suIFRoZXJlIGlzIG5vIGRyYWZ0IHN0YXRlIGFuZCBubwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbGYtZnVuZGVkIHNjaGVkdWxlLgovLwlSZWxlYXNlIChBTllPTkUpICAgICAgICA6IG9uY2UgYSB0cmFuY2hlIGlzIGR1ZSwgYW55b25lIG1heSByZWxlYXNlIGl0LgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBpcyBjcmVkaXRlZCB0byB0aGUgUkVDT1JERUQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICBCRU5FRklDSUFSWSwgbmV2ZXIgdG8gdGhlIGNhbGxlci4KLy8JUmV2b2tlIChmdW5kZXIgb25seSkgICAgOiByZXR1cm5zIGEgTk9ULVlFVC1EVUUgdHJhbmNoZSB0byB0aGUgZnVuZGVyLAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvbmx5IGlmIHRoZSBzY2hlZHVsZSB3YXMgY3JlYXRlZAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgIHJldm9jYWJsZS4gQSBkdWUgdHJhbmNoZSBjYW4gbmV2ZXIgYmUgcmV2b2tlZC4KLy8JV2l0aGRyYXcgLyBXaXRoZHJhd0FsbCAgOiBwYXlzIG91dCB0aGUgY2FsbGVyJ3Mgb3duIGNsYWltYWJsZSBiYWxhbmNlLgovLwovLyAjIFdIWSBOT1RISU5HIENBTiBCRSBUUkFQUEVELCBBTkQgV0hZIFRIRVJFIElTIE5PIEVYUElSWQovLwovLyBUcmFuY2hlcyBhcmUgc2NoZWR1bGVkIHdpdGggZHVlYm9vaydzIHR0bCA9PSAwLCBzbyB0aGV5IE5FVkVSIGV4cGlyZS4KLy8gVmVzdGVkIHZhbHVlIGNhbm5vdCBiZSBsb3N0IGJ5IGEgYmVuZWZpY2lhcnkgd2hvIGlzIHNsb3csIG9mZmxpbmUsIG9yCi8vIGdvbmUuIFRoZSBzaWJsaW5nIHJlYWxtcyBpbiB0aGlzIHBvcnRmb2xpbyB1c2UgYSBwZXJtaXNzaW9ubGVzcyBleHBpcnkKLy8gdmFsdmUgdG8gZ3VhcmFudGVlIGVzY3JvdyBpcyBuZXZlciB0cmFwcGVkOyBoZXJlIHRoZSB2YWx2ZSBpcyBkaWZmZXJlbnQKLy8gYW5kIHN0cm9uZ2VyOiBSZWxlYXNlIGlzIFBFUk1JU1NJT05MRVNTLCBzbyBldmVyeSB0cmFuY2hlIGJlY29tZXMKLy8gY2xhaW1hYmxlLWJ5LWFueW9uZSB0aGUgbW9tZW50IGl0IGlzIGR1ZSwgYW5kIHRoZSBzY2hlZHVsZSBkcmFpbnMgaXRzZWxmCi8vIHdpdGhvdXQgZGVwZW5kaW5nIG9uIGFueSBwYXJ0aWN1bGFyIGFjdG9yIHN0YXlpbmcgYWxpdmUuIENvbWJpbmVkIHdpdGgKLy8gImEgZHVlIHRyYW5jaGUgY2FuIG5ldmVyIGJlIHJldm9rZWQiLCBldmVyeSB1Z25vdCBpbiBlc2Nyb3cgaGFzIGV4YWN0bHkKLy8gb25lIHJlYWNoYWJsZSBkZXN0aW5hdGlvbiBhbmQgYSBoZWlnaHQgYWZ0ZXIgd2hpY2ggbm9ib2R5IGNhbiBibG9jayBpdC4KLy8KLy8gIyBWRVNURUQgTUVBTlMgSVJSRVZPQ0FCTEUsIFdJVEggTk8gUkFDRQovLwovLyBSZXZva2UgcmVmdXNlcyBhbnkgdHJhbmNoZSB3aG9zZSBkdWUgaGVpZ2h0IGhhcyBhcnJpdmVkLCBldmVuIHRob3VnaAovLyBkdWVib29rJ3MgQ2FuY2VsIHdvdWxkIGhhcHBpbHkgY29uc3VtZSBpdC4gVEhBVCBDSEVDSyBJUyBUSElTIFJFQUxNJ1MsCi8vIG5vdCBkdWVib29rJ3MuIFdpdGhvdXQgaXQgYSBmdW5kZXIgY291bGQgd2F0Y2ggZm9yIHRoZSBkdWUgaGVpZ2h0IGFuZAovLyBmcm9udC1ydW4gdGhlIGJlbmVmaWNpYXJ5J3MgUmVsZWFzZSB0byBjbGF3IGJhY2sgdmFsdWUgYWxyZWFkeSBlYXJuZWQuCi8vIExpa2V3aXNlLCBgcmV2b2NhYmxlYCBpcyBmaXhlZCBhdCBmdW5kaW5nIGFuZCBoYXMgbm8gc2V0dGVyOiBhbgovLyBpcnJldm9jYWJsZSBzY2hlZHVsZSBjYW5ub3QgYmUgbWFkZSByZXZvY2FibGUgbGF0ZXIsIHdoaWNoIGlzIHRoZSBvbmx5Ci8vIHRoaW5nIHRoYXQgbWFrZXMgdGhlIHByb21pc2Ugd29ydGggYW55dGhpbmcuCi8vCi8vICMgQVVUSE9SSVpBVElPTgovLwovLyBFdmVyeSBpZGVudGl0eSBpcyBkZXJpdmVkIGZyb20gdGhlIGNyb3NzaW5nIGVudHJ5cG9pbnQncwovLyBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkuIE5vIGZ1bmN0aW9uIHRha2VzIGEgY2FsbGVyIGlkZW50aXR5IGFzIGEKLy8gcGFyYW1ldGVyLCBzbyBhY3RpbmcgYXMgYW5vdGhlciBhY2NvdW50IGlzIGltcG9zc2libGUgYnkgY29uc3RydWN0aW9uLgovLyBSZWxlYXNlIGlzIHBlcm1pc3Npb25sZXNzICpiZWNhdXNlKiBpdCBwYXlzIHRoZSByZWNvcmRlZCBiZW5lZmljaWFyeToKLy8gdGhlIGNhbGxlcidzIGlkZW50aXR5IGlzIG5vdCB1c2VkIHRvIHJvdXRlIHZhbHVlLCBzbyB0aGVyZSBpcyBub3RoaW5nCi8vIGZvciBhIHN0cmFuZ2VyIHRvIGdhaW4uCi8vCi8vICMgSE9XIElUIFdJUkVTIERVRUJPT0sgQ09SUkVDVExZIChkdWVib29rJ3MgZml2ZS1wb2ludCBjb25zdW1lciBjb250cmFjdCkKLy8KLy8gIDEuIFRIRSBDTE9DSyBJUyBydW50aW1lLkNoYWluSGVpZ2h0KCksIG5ldmVyIGEgY2FsbCBhcmd1bWVudC4gQSByZWFsbQovLyAgICAgdGhhdCBsZXRzIGEgY2FsbGVyIGNob29zZSBgbm93YCBoYXMgbm8gZGVsYXkgYXQgYWxsLgovLyAgMi4gSEVJR0hUUyBBUkUgVEhFIE9OTFkgVU5JVC4gTm8gdGltZXN0YW1wIGFwcGVhcnMgYW55d2hlcmUuCi8vICAzLiBUSEUgKkJvb2sgSVMgTkVWRVIgRVhQT1JURUQuIEl0IGlzIGFuIHVuZXhwb3J0ZWQgcGFja2FnZSB2YXIgYW5kIGlzCi8vICAgICBuZXZlciByZXR1cm5lZCBhY3Jvc3MgYSByZWFsbSBib3VuZGFyeTsgaGFuZGluZyBpdCBvdXQgd291bGQgaGFuZCBvdXQKLy8gICAgIHRoZSByaWdodCB0byBzY2hlZHVsZSwgY2FuY2VsIGFuZCBjbGFpbS4KLy8gIDQuIFRIRSBBQ1RPUiBJUyBBVVRIT1JJWkVEIGZyb20gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpOyB0aGUgZHVlYm9vawovLyAgICAgb3duZXIgcmVjb3JkZWQgYXQgU2NoZWR1bGUgaXMgdGhlIGZ1bmRlciwgYW5kIGR1ZWJvb2sgY2hlY2tzIENhbmNlbAovLyAgICAgYWdhaW5zdCB0aGF0IHJlY29yZGVkIHZhbHVlLCBuZXZlciBhZ2FpbnN0IGFuIGFyZ3VtZW50LgovLyAgNS4gVEhFIEVGRkVDVCBIQVBQRU5TIEFGVEVSIEEgU1VDQ0VTU0ZVTCBDbGFpbSwgSU4gVEhFIFNBTUUKLy8gICAgIFRSQU5TQUNUSU9OLgovLwovLyBUaGUgZGVmZXJyYWwgUEFZTE9BRCBpcyBhIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciBldmVudHMgYW5kIHJlbmRlcmluZy4KLy8gVEhJUyBSRUFMTSBORVZFUiBQQVJTRVMgSVQuIEV2ZXJ5IGF1dGhvcml0YXRpdmUgZmFjdCBhYm91dCBhIHRyYW5jaGUg4oCUCi8vIGl0cyBhbW91bnQsIGl0cyBzY2hlZHVsZSwgaXRzIGJlbmVmaWNpYXJ5IOKAlCBjb21lcyBmcm9tIHRoaXMgcmVhbG0ncyBvd24KLy8gYHRyYW5jaGVzYCB0cmVlLCBrZXllZCBieSB0aGUgZGVmZXJyYWwgSUQgdGhhdCBkdWVib29rIGd1YXJhbnRlZXMgaXMKLy8gbmV2ZXIgcmV1c2VkLgovLwovLyAjIE1PTkVUQVJZIElOVkFSSUFOVCAoY29uc2VydmF0aW9uKQovLwovLyBMZXQgSCBiZSB1Z25vdCBoZWxkIGF0IHRoaXMgcmVhbG0ncyBhZGRyZXNzLCBFID0gZXNjcm93VG90YWwgKHRoZSBzdW0gb2YKLy8gYW1vdW50cyBvdmVyIHRyYW5jaGVzIHN0aWxsIHBlbmRpbmcpLCBVIHRoZSBsZWRnZXIncyBjbGFpbWFibGUgYmFsYW5jZXMsCi8vIEYgdGhlIGZlZSBwb3QsIGFuZCBTID49IDAgb3V0LW9mLWJhbmQgc3VycGx1czoKLy8KLy8JSCA9PSBFICsgVSArIEYgKyBTCi8vCi8vIEZ1bmQgcmFpc2VzIEggYW5kIEUgdG9nZXRoZXIgKGNvaW5pby5SZWNlaXZlIGlzIHRoZSByZWNlaXB0LWd1YXJhbnRlZWQKLy8gc2hhcGUpLiBSZWxlYXNlIG1vdmVzIG9uZSB0cmFuY2hlIGFtb3VudCBmcm9tIEUgaW50byBVK0YsIHdpdGggZmVlbGVkZ2VyCi8vIGd1YXJhbnRlZWluZyBjcmVkaXRlZCArIGZlZSA9PSBhbW91bnQuIFJldm9rZSBtb3ZlcyBhIHRyYW5jaGUgYW1vdW50IGZyb20KLy8gRSBpbnRvIFUsIGZlZS1mcmVlLiBXaXRoZHJhd2FscyBkZWJpdCB0aGUgbGVkZ2VyIEJFRk9SRSBjb2luaW8uUGF5b3V0Ci8vIG1vdmVzIHRoZSBpZGVudGljYWwgYW1vdW50IG91dCAoY2hlY2tzLWVmZmVjdHMtaW50ZXJhY3Rpb25zKS4gQW55IHBhbmljCi8vIGFib3J0cyB0aGUgd2hvbGUgdHJhbnNhY3Rpb24uIFRoaXMgcmVhbG0gbmV2ZXIgaXNzdWVzIG9yIHJlbW92ZXMgY29pbnMuCi8vIFN1cnBsdXMgaXMgcmVjb3ZlcmFibGUgb25seSB2aWEgU3dlZXBEZW5vbSwgd2hpY2ggcmVzZXJ2ZXMgTGlhYmlsaXRpZXMoKS4KLy8KLy8gIyBPTkxZIEdOT1QKLy8KLy8gRnVuZCByZWplY3RzIGFueSBlbnZlbG9wZSB0aGF0IGlzIG5vdCBleGFjdGx5IG9uZSBwb3NpdGl2ZSB1Z25vdCBjb2luLgovLyBGb3JlaWduIGRlbm9taW5hdGlvbnMgc2l0IGluIHN1cnBsdXMgYW5kIGFyZSBzd2VlcGFibGUuCnBhY2thZ2UgdmVzdGluZwoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2NvaW5pbyIKCSJnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvZHVlYm9vayIKCSJnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvZmVlbGVkZ2VyIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIERlbm9tIGlzIHRoZSBvbmx5IGFzc2V0IHRoaXMgcmVhbG0gZXNjcm93cy4KY29uc3QgRGVub20gPSAidWdub3QiCgovLyBNYXhGZWVCcHMgaXMgdGhlIGhhcmQgcHJvdG9jb2wtZmVlIGNhcDogMTAwMCBicHMgPSAxMCUuCmNvbnN0IE1heEZlZUJwcyA9IGludDY0KDEwMDApCgovLyBUcmFuY2hlIHN0YXR1cyB2YWx1ZXMuIEEgdHJhbmNoZSBpcyBjcmVhdGVkIHBlbmRpbmcgYW5kIHJlYWNoZXMgZXhhY3RseQovLyBvbmUgdGVybWluYWwgc3RhdGU7IGJvdGggdGVybWluYWxzIGFyZSBmcm96ZW4uCmNvbnN0ICgKCVN0YXR1c1BlbmRpbmcgID0gInBlbmRpbmciCglTdGF0dXNSZWxlYXNlZCA9ICJyZWxlYXNlZCIKCVN0YXR1c1Jldm9rZWQgID0gInJldm9rZWQiCikKCi8vIEJvdW5kcy4gQWxsIGFyZSBjb21waWxlLXRpbWUgY29uc3RhbnRzOiBub25lIGlzIGFkbWluLW11dGFibGUsIHNvIGEKLy8gc2NoZWR1bGUncyBzaGFwZSBjYW5ub3QgYmUgY2hhbmdlZCB1bmRlciBpdHMgZnVuZGVyIG9yIGJlbmVmaWNpYXJ5Lgpjb25zdCAoCgkvLyBNaW5EZWxheUJsb2NrcyBpcyB0aGUgZmxvb3Igb24gaG93IGZhciBhaGVhZCB0aGUgRklSU1QgdHJhbmNoZSBtYXkKCS8vIGZhbGwuIE9uZSBibG9jayBpcyBlbm91Z2ggdG8gcHJvdmUgdGhlIGRlbGF5IGlzIGVuZm9yY2VkIHdoaWxlCgkvLyBrZWVwaW5nIHRoZSByZWFsbSBleGVyY2lzYWJsZSBvbiBhIGxpdmUgY2hhaW4uCglNaW5EZWxheUJsb2NrcyA9IGludDY0KDEpCgoJLy8gTWF4RGVsYXlCbG9ja3MgY2FwcyB0aGUgZnVydGhlc3QgdHJhbmNoZSBhdCByb3VnaGx5IDEwLjggeWVhcnMgYXQKCS8vIHBlYXJsLTEncyB+My40MnMgYmxvY2tzLiBJdCBhbHNvIGJvdW5kcyBub3crZGVsYXkgZmFyIGluc2lkZSBpbnQ2NC4KCU1heERlbGF5QmxvY2tzID0gaW50NjQoMTAwXzAwMF8wMDApCgoJLy8gTWF4VHJhbmNoZXMgYm91bmRzIG9uZSBzY2hlZHVsZS4gSXQgYm91bmRzIHRoZSBGdW5kIHRyYW5zYWN0aW9uJ3MKCS8vIHdvcmssIHRoZSBSZXZva2VBbGwgbG9vcCwgYW5kIHRoZSBzY2hlZHVsZSBkZXRhaWwgcmVuZGVyLgoJTWF4VHJhbmNoZXMgPSA2NAoKCS8vIE1heE9wZW5UcmFuY2hlcyBjYXBzIHBlbmRpbmcgdHJhbmNoZXMgYWNyb3NzIEVWRVJZIHNjaGVkdWxlIGF0IG9uY2UKCS8vIOKAlCBpdCBpcyBhIHdob2xlLXJlYWxtIGxpbWl0LCBub3QgYSBwZXItc2NoZWR1bGUgb25lLCBiZWNhdXNlIGl0IGlzCgkvLyBkdWVib29rJ3Mgb3Blbi1kZWZlcnJhbCBjYXAuIEZ1bmQgZmFpbHMgd2hlbiBhIG5ldyBzY2hlZHVsZSB3b3VsZAoJLy8gY3Jvc3MgaXQuIE11c3QgYmUgPD0gZHVlYm9vay5NYXhPcGVuTGltaXQuCglNYXhPcGVuVHJhbmNoZXMgPSA1MDAwCgoJLy8gTWF4T3BlblBlckZ1bmRlciBib3VuZHMgaG93IG1hbnkgdHJhbmNoZXMgT05FIGZ1bmRlciBtYXkgaG9sZAoJLy8gcGVuZGluZyBhdCBvbmNlLCBzbyB0aGF0IE1heE9wZW5UcmFuY2hlcyBjYW5ub3QgYmUgY29uc3VtZWQgYnkgYQoJLy8gc2luZ2xlIGFjY291bnQuCgkvLwoJLy8gV2l0aG91dCB0aGlzIGJvdW5kIHRoZSB3aG9sZS1yZWFsbSBjYXAgaXMgYSBkZW5pYWwtb2Ytc2VydmljZQoJLy8gc3VyZmFjZSB0aGF0IGNvc3RzIG5vdGhpbmcgdG8gdXNlOiA3OSBGdW5kIGNhbGxzIG9mIDY0IG9uZS11Z25vdAoJLy8gdHJhbmNoZXMgZmlsbCB0aGUgcmVhbG0sIEZ1bmQgdGhlbiBhYm9ydHMgZm9yIGV2ZXJ5Ym9keSwgYW5kIHRoZQoJLy8gYXR0YWNrZXIgcmVjb3ZlcnMgMTAwJSBvZiB0aGUgZXNjcm93IGZlZS1mcmVlIHdpdGggUmV2b2tlQWxsLiBUd28KCS8vIGRlbGliZXJhdGUgY2hvaWNlcyBlbHNld2hlcmUgcmVtb3ZlIGV2ZXJ5IHJlY292ZXJ5IHBhdGgg4oCUIHR0bCBpcwoJLy8gYWx3YXlzIDAsIHNvIGR1ZWJvb2sncyBwZXJtaXNzaW9ubGVzcyBFeHBpcmUgdmFsdmUgbmV2ZXIgb3BlbnMsIGFuZAoJLy8gTWF4T3BlblRyYW5jaGVzIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IHdpdGggbm8gYWRtaW4gc2V0dGVyLiBUaGUKCS8vIGRlbmlhbCB3b3VsZCB0aGVyZWZvcmUgYmUgdG90YWwgYW5kIHBlcm1hbmVudCwgd2hpY2ggaXMgb3V0IG9mIGFsbAoJLy8gcHJvcG9ydGlvbiB0byBpdHMgY29zdC4KCS8vCgkvLyAyNTYgbGVhdmVzIG9uZSBmdW5kZXIgZm91ciBmdWxsIE1heFRyYW5jaGVzIHNjaGVkdWxlcyBvcGVuIGF0IG9uY2Ug4oCUCgkvLyBnZW5lcm91cyBmb3IgdGhlIGludGVuZGVkIHVzZSDigJQgd2hpbGUgZXhoYXVzdGluZyB0aGUgcmVhbG0gbm93IHRha2VzCgkvLyBhdCBsZWFzdCBjZWlsKDUwMDAvMjU2KSA9IDIwIHNlcGFyYXRlbHkgZnVuZGVkIGFjY291bnRzLgoJLy8KCS8vIFRoYXQgaXMgYSBTWUJJTCBCT1VORCBhbmQgbm90aGluZyBtb3JlLCBzbyB0aGUgcmVzaWR1YWwgaXMgcXVhbnRpZmllZAoJLy8gaGVyZSByYXRoZXIgdGhhbiBsZWZ0IHRvIGJlIGluZmVycmVkIGZyb20gdGhlIDIwOiB0aGUgY2FwIGNvdW50cwoJLy8gVFJBTkNIRVMsIG5ldmVyIHZhbHVlLiBwYXJzZVNwZWMgYWNjZXB0cyBhbW91bnQgPT0gMSwgc28gMjU2IHBlbmRpbmcKCS8vIHRyYW5jaGVzIGNvc3QgMjU2dWdub3QgYW5kIGFsbCAyMCBhY2NvdW50cyB0b2dldGhlciBlc2Nyb3cgYWJvdXQKCS8vIDUwMDB1Z25vdCDigJQgZXZlcnkgYml0IG9mIGl0IHJlY292ZXJhYmxlIGZlZS1mcmVlLCBzaW5jZSByZXZva2VPbmUKCS8vIHJlZnVuZHMgYXQgMCBicHMuIFRoZSByZWFsIGNvc3Qgb2YgdGhlIHJlYWxtLXdpZGUgZGVuaWFsIGlzIHRoZXJlZm9yZQoJLy8gfjgwIEZ1bmQgdHJhbnNhY3Rpb25zJyBnYXMgYW5kIDIwIGZ1bmRlZCBhZGRyZXNzZXMsIE5PVCBjYXBpdGFsLgoJLy8gQW55b25lIHNpemluZyB0aGUgcmVzaWR1YWwgcmlzayBmcm9tIHRoZSAiMjAgYWNjb3VudHMiIGZpZ3VyZSBhbG9uZQoJLy8gd2lsbCBzaXplIGl0IHdyb25nIGJ5IG9yZGVycyBvZiBtYWduaXR1ZGUuCgkvLwoJLy8gQm91bmRpbmcgdGhlIGF0dGFjayBieSBWQUxVRSBpbnN0ZWFkIHdvdWxkIHRha2UgYSBwZXItdHJhbmNoZSBtaW5pbXVtCgkvLyBhbW91bnQuIFRoYXQgaXMgYSBjaGFuZ2UgdG8gd2hhdCB0aGUgYXBwbGljYXRpb24gaXMg4oCUIGl0IHdvdWxkIHByaWNlCgkvLyBzbWFsbCBsZWdpdGltYXRlIHRyYW5jaGVzIG91dCDigJQgc28gaXQgaXMgYSByZXZpZXdlcidzIGRlY2lzaW9uLCBub3QgYQoJLy8gcm91dGluZSBmaXgsIGFuZCBpdCBpcyBkZWxpYmVyYXRlbHkgbm90IG1hZGUgaGVyZS4KCU1heE9wZW5QZXJGdW5kZXIgPSAyNTYKCgkvLyBNYXhUaXRsZUxlbiBib3VuZHMgYSBzY2hlZHVsZSB0aXRsZS4gVGl0bGVzIGFyZSBjaGFyc2V0LXJlc3RyaWN0ZWQKCS8vIHNvIHRoZXkgYXJlIGxpc3Qtc2FmZSBpbiBSZW5kZXIgd2l0aG91dCBlc2NhcGluZy4KCU1heFRpdGxlTGVuID0gODAKCgkvLyBNYXhNZW1vTGVuIGJvdW5kcyB0aGUgZnJlZS10ZXh0IG1lbW8uIEl0IGlzIGEgQllURSBsZW5ndGgsIG5vdCBhCgkvLyBydW5lIGNvdW50LCBiZWNhdXNlIGl0cyBqb2IgaXMgdG8gYm91bmQgc3RvcmFnZS4KCU1heE1lbW9MZW4gPSAxMDAwCgoJLy8gTWF4U3BlY0xlbiBib3VuZHMgdGhlIHRyYW5jaGUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIHNvIHBhcnNpbmcgY29zdAoJLy8gaXMgYm91bmRlZCBiZWZvcmUgYW55IHBhcnNpbmcgYmVnaW5zLgoJTWF4U3BlY0xlbiA9IDE0MDAKCgkvLyBNYXhMaXN0ZWQgY2FwcyBob3cgbWFueSBlbnRyaWVzIGEgc2luZ2xlIHZpZXcgb3IgcmVuZGVyIHJldHVybnMuCglNYXhMaXN0ZWQgPSA1MAopCgovLyB0cmFuY2hlIGlzIG9uZSBkYXRlZCBwYXltZW50LiBJdCBpcyB0aGlzIHJlYWxtJ3MgYXV0aG9yaXRhdGl2ZSByZWNvcmQ7Ci8vIHRoZSBtYXRjaGluZyBkdWVib29rIGRlZmVycmFsIGNhcnJpZXMgb25seSB0aGUgZHVlIGhlaWdodCBhbmQgYSBsYWJlbC4KLy8gUmVjb3JkcyBhcmUga2VwdCBhZnRlciB0aGV5IHRlcm1pbmF0ZSwgc28gaGlzdG9yeSByZW1haW5zIGFuc3dlcmFibGUKLy8gb25jZSBkdWVib29rIGhhcyBjb25zdW1lZCB0aGUgZGVmZXJyYWwuCnR5cGUgdHJhbmNoZSBzdHJ1Y3QgewoJZGVmZXJyYWxJRCB1aW50NjQKCXNjaGVkdWxlSUQgaW50NjQKCXNlcSAgICAgICAgaW50NjQgLy8gMS1iYXNlZCBwb3NpdGlvbiB3aXRoaW4gaXRzIHNjaGVkdWxlCglhbW91bnQgICAgIGludDY0CglkdWVBdCAgICAgIGludDY0CglzdGF0dXMgICAgIHN0cmluZwoJc2V0dGxlZEF0ICBpbnQ2NCAvLyBoZWlnaHQgb2YgcmVsZWFzZSBvciByZXZvY2F0aW9uOyAwIHdoaWxlIHBlbmRpbmcKfQoKLy8gc2NoZWR1bGUgaXMgb25lIGZ1bmRlZCB2ZXN0aW5nIGFncmVlbWVudC4KdHlwZSBzY2hlZHVsZSBzdHJ1Y3QgewoJaWQgICAgICAgICAgaW50NjQKCWZ1bmRlciAgICAgIGFkZHJlc3MKCWJlbmVmaWNpYXJ5IGFkZHJlc3MKCXRpdGxlICAgICAgIHN0cmluZwoJbWVtbyAgICAgICAgc3RyaW5nCgl0b3RhbCAgICAgICBpbnQ2NCAvLyDOoyB0cmFuY2hlIGFtb3VudHMsIGZpeGVkIGF0IGZ1bmRpbmcKCWZlZUJwcyAgICAgIGludDY0IC8vIHNuYXBzaG90dGVkIGF0IGZ1bmRpbmcsIGNoYXJnZWQgYXQgZWFjaCByZWxlYXNlCglyZXZvY2FibGUgICBib29sICAvLyBmaXhlZCBhdCBmdW5kaW5nOyB0aGVyZSBpcyBubyBzZXR0ZXIKCWNyZWF0ZWRBdCAgIGludDY0Cgl0cmFuY2hlSURzICBbXXVpbnQ2NCAvLyBpbiB0cmFuY2hlIG9yZGVyCgoJcGVuZGluZyAgICAgICBpbnQ2NCAvLyBjb3VudCBvZiB0cmFuY2hlcyBzdGlsbCBwZW5kaW5nCglyZWxlYXNlZEdyb3NzIGludDY0IC8vIM6jIGFtb3VudHMgcmVsZWFzZWQgKGJlZm9yZSBmZWUpCglyZXZva2VkVG90YWwgIGludDY0IC8vIM6jIGFtb3VudHMgcmV0dXJuZWQgdG8gdGhlIGZ1bmRlcgp9Cgp2YXIgKAoJYWRtaW4gICAgICAgIGFkZHJlc3MgLy8gbWF5IHNldCBmZWUsIGZlZSByZWNpcGllbnQsIGFuZCBwcm9wb3NlIGEgc3VjY2Vzc29yCglwZW5kaW5nQWRtaW4gYWRkcmVzcyAvLyBtdXN0IGFjY2VwdCBiZWZvcmUgdGhlIGhhbmRvdmVyIHRha2VzIGVmZmVjdAoJZmVlUmVjaXBpZW50IGFkZHJlc3MgLy8gbWF5IHdpdGhkcmF3IGZlZXMgYW5kIHN3ZWVwIHN1cnBsdXMKCWZlZUJwcyAgICAgICBpbnQ2NCAgIC8vIGZlZSBzbmFwc2hvdHRlZCBpbnRvIE5FVyBzY2hlZHVsZXMKCglzZWxmICAgICAgICAgICBhZGRyZXNzIC8vIHRoaXMgcmVhbG0ncyBhZGRyZXNzLCBjYXB0dXJlZCBhdCBkZXBsb3kKCW5leHRTY2hlZHVsZUlEIGludDY0Cgllc2Nyb3dUb3RhbCAgICBpbnQ2NCAvLyA9PSDOoyBhbW91bnQgb3ZlciBwZW5kaW5nIHRyYW5jaGVzICh0aGUgRSB0ZXJtKQoKCXNjaGVkdWxlcyA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoc2NoZWR1bGVJRCkgIC0+ICpzY2hlZHVsZQoJdHJhbmNoZXMgID0gYXZsLk5ld1RyZWUoKSAvLyBwYWRVKGRlZmVycmFsSUQpICAgLT4gKnRyYW5jaGUKCgkvLyBvcGVuQnlGdW5kZXIgY291bnRzIGVhY2ggZnVuZGVyJ3Mgc3RpbGwtcGVuZGluZyB0cmFuY2hlcywgZm9yIHRoZQoJLy8gTWF4T3BlblBlckZ1bmRlciBjYXAuIEFuIGVudHJ5IGlzIFJFTU9WRUQgYXQgemVybyByYXRoZXIgdGhhbiBsZWZ0CgkvLyBob2xkaW5nIDAsIHNvIHRoZSB0cmVlIHRyYWNrcyBsaXZlIGZ1bmRlcnMgYW5kIGRvZXMgbm90IGFjY3VtdWxhdGUgYQoJLy8gZGVhZCBrZXkgcGVyIGFkZHJlc3MgdGhhdCBldmVyIGZ1bmRlZCBhbnl0aGluZy4KCW9wZW5CeUZ1bmRlciA9IGF2bC5OZXdUcmVlKCkgLy8gZnVuZGVyLlN0cmluZygpIC0+IGludDY0CgoJbGVkZ2VyID0gZmVlbGVkZ2VyLk11c3ROZXcoTWF4RmVlQnBzKQoKCS8vIGJvb2sgaXMgdW5leHBvcnRlZCBhbmQgbmV2ZXIgcmV0dXJuZWQgKGR1ZWJvb2sgY29uc3VtZXIgY29udHJhY3QgMykuCglib29rID0gZHVlYm9vay5NdXN0TmV3KE1pbkRlbGF5QmxvY2tzLCBNYXhEZWxheUJsb2NrcywgTWF4T3BlblRyYW5jaGVzKQopCgpmdW5jIGluaXQoKSB7CglhZG1pbiA9IHVuc2FmZS5PcmlnaW5DYWxsZXIoKQoJZmVlUmVjaXBpZW50ID0gYWRtaW4KCXNlbGYgPSB1bnNhZmUuQ3VycmVudFJlYWxtKCkuQWRkcmVzcygpCn0KCi8vIHJlamVjdFN0cmF5U2VuZCBhYm9ydHMgaWYgYW4gRU9BIGF0dGFjaGVkIGNvaW5zIHRvIGFuIGVudHJ5cG9pbnQgdGhhdCBoYXMKLy8gbm8gdXNlIGZvciB0aGVtLiBPbmx5IEZ1bmQgYWNjZXB0cyB2YWx1ZTsgd2l0aG91dCB0aGlzIGd1YXJkIGEgbWlzdHlwZWQKLy8gc2VuZCB3b3VsZCBiZSBzaWxlbnRseSBhYnNvcmJlZCBpbnRvIHN1cnBsdXMuCmZ1bmMgcmVqZWN0U3RyYXlTZW5kKGN1ciByZWFsbSkgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJLy8gZXZlcnkgY2FsbCBzaXRlIHBhc3NlcyB0aGUgZW50cnlwb2ludCdzIG93biBmaXJzdCBjdXI7IHRoaXMKCQkvLyBwaW5zIHRoYXQgZGlzY2lwbGluZSBhZ2FpbnN0IGZ1dHVyZSBjYWxsLXNpdGUgZHJpZnQsIHdoaWNoIGlzCgkJLy8gdGhlIGhvdXNlIHBhdHRlcm4gZnJvbSBmZWVfc3BsaXQvdjIuIFVuZXhwb3J0ZWQgYW5kIHdpdGggYWxsCgkJLy8gMTEgY2FsbCBzaXRlcyBmb3J3YXJkaW5nIGEgbGl2ZSBjdXIsIHRoaXMgaXMgdW5yZWFjaGFibGUKCQkvLyB0b2RheSDigJQgaXQgaXMgaGVyZSBiZWNhdXNlIHRoZSBhcnRpZmFjdCBpcyBpbW11dGFibGUgYW5kIHRoZQoJCS8vIGd1YXJkJ3MgYW5zd2VyIGRlY2lkZXMgd2hldGhlciBjb2lucyBhcmUgcmVqZWN0ZWQgb3IgYWJzb3JiZWQKCQlwYW5pYygicmVhbG0gY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudCIpCgl9CglpZiBjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgJiYgbGVuKHVuc2FmZS5PcmlnaW5TZW5kKCkpID4gMCB7CgkJcGFuaWMoInRoaXMgZW50cnlwb2ludCBkb2VzIG5vdCBhY2NlcHQgY29pbnM7IG9ubHkgRnVuZCBkb2VzIikKCX0KfQoKLy8gRnVuZCBjcmVhdGVzIGEgdmVzdGluZyBzY2hlZHVsZSBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbjogaXQgZXNjcm93cyB0aGUKLy8gYXR0YWNoZWQgR05PVCwgcmVnaXN0ZXJzIGV2ZXJ5IHRyYW5jaGUgd2l0aCBkdWVib29rLCBhbmQgcmV0dXJucyB0aGUgbmV3Ci8vIHNjaGVkdWxlIGlkLiBPbmx5IGRpcmVjdCBFT0EgY2FsbHMgd2l0aCAtc2VuZCBhcmUgYWNjZXB0ZWQuCi8vCi8vIHNwZWMgbGlzdHMgdGhlIHRyYW5jaGVzIGFzICJkZWxheTphbW91bnQiIHBhaXJzIHNlcGFyYXRlZCBieSBjb21tYXMsIGZvcgovLyBleGFtcGxlICIxMDA6NTAwLDIwMDo1MDAsMzAwOjEwMDAiLiBEZWxheXMgYXJlIGluIEJMT0NLUyBGUk9NIE5PVyBhbmQKLy8gbXVzdCBiZSBTVFJJQ1RMWSBJTkNSRUFTSU5HIOKAlCB0d28gcGF5bWVudHMgYXQgdGhlIHNhbWUgaGVpZ2h0IGFyZSBvbmUKLy8gdHJhbmNoZSB3aXRoIHRoZSBhbW91bnRzIGFkZGVkLiBFdmVyeSBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSwgYW5kIHRoZQovLyBhbW91bnRzIG11c3Qgc3VtIHRvIEVYQUNUTFkgdGhlIGF0dGFjaGVkIHNlbmQ6IHRoaXMgcmVhbG0gd2lsbCBub3QKLy8gc2lsZW50bHkgYWJzb3JiIGEgc3VycGx1cyBvciBjcmVhdGUgYW4gdW5kZXJmdW5kZWQgc2NoZWR1bGUuCi8vCi8vIHJldm9jYWJsZSBkZWNpZGVzLCBwZXJtYW5lbnRseSwgd2hldGhlciB0aGUgZnVuZGVyIG1heSByZWNsYWltCi8vIG5vdC15ZXQtZHVlIHRyYW5jaGVzLiBUaGVyZSBpcyBubyBzZXR0ZXI7IGFuIGlycmV2b2NhYmxlIHNjaGVkdWxlIHN0YXlzCi8vIGlycmV2b2NhYmxlLgovLwovLyBtYXhGZWVCcHMgaXMgdGhlIGNlaWxpbmcgdGhlIGNhbGxlciBzaWducyBmb3IuIEZ1bmRpbmcgaXMgcmVqZWN0ZWQgaWYgdGhlCi8vIGxpdmUgZmVlIGV4Y2VlZHMgaXQsIHdoaWNoIGNsb3NlcyB0aGUgcmFjZSB3aGVyZSBhbiBhZG1pbiBzZXF1ZW5jZXMgYSBmZWUKLy8gcmFpc2UgYWhlYWQgb2YgdGhpcyB0cmFuc2FjdGlvbi4gUGFzcyBNYXhGZWVCcHMgdG8gYWNjZXB0IGFueSBsZWdhbCBmZWUuCmZ1bmMgRnVuZChjdXIgcmVhbG0sIGJlbmVmaWNpYXJ5IGFkZHJlc3MsIHRpdGxlLCBtZW1vLCBzcGVjIHN0cmluZywgcmV2b2NhYmxlIGJvb2wsIG1heEZlZUJwcyBpbnQ2NCkgaW50NjQgewoJLy8gUmVjZWl2ZSBmaXJzdCBhbmQgZXhhY3RseSBvbmNlIHBlciB0cmFuc2FjdGlvbiAoY29pbmlvJ3MgY29udHJhY3QpOgoJLy8gaXQgUkVBRFMgdGhlIHNlbmQgZW52ZWxvcGUgYW5kIGNhbm5vdCBtYXJrIGl0IHNwZW50LCBzbyBjcmVkaXRpbmcKCS8vIHBlciBjYWxsIHdvdWxkIG1pbnQgdW5iYWNrZWQgbGlhYmlsaXRpZXMgZnJvbSBhIHNpbmdsZSAtc2VuZC4KCWZ1bmRlciwgYW1vdW50IDo9IGNvaW5pby5SZWNlaXZlKDAsIGN1ciwgRGVub20pCgoJaWYgZmVlQnBzID4gbWF4RmVlQnBzIHsKCQlwYW5pYygiY3VycmVudCBmZWUgIiArIGl0b2EoZmVlQnBzKSArICIgYnBzIGV4Y2VlZHMgdGhlIGNhbGxlcidzIG1heGltdW0gIiArIGl0b2EobWF4RmVlQnBzKSkKCX0KCXZhciB6ZXJvIGFkZHJlc3MKCWlmIGJlbmVmaWNpYXJ5ID09IHplcm8gewoJCXBhbmljKCJlbXB0eSBiZW5lZmljaWFyeSBhZGRyZXNzIikKCX0KCS8vIFRoaXMgcmVhbG0gY2FuIG5ldmVyIGNhbGwgaXRzIG93biBXaXRoZHJhdywgc28gYSBiYWxhbmNlIGNyZWRpdGVkIHRvCgkvLyBpdHMgb3duIGFkZHJlc3MgaXMgY2xhaW1hYmxlIGJ5IG5vYm9keSB3aGlsZSBzdGlsbCBjb3VudGluZyBpbnNpZGUKCS8vIExpYWJpbGl0aWVzKCkg4oCUIHBlcm1hbmVudGx5IHN0cmFuZGVkIEFORCBwZXJtYW5lbnRseSBzaHJpbmtpbmcKCS8vIFN3ZWVwRGVub20ncyByZWFjaC4gVW5saWtlIGFuIGFyYml0cmFyeSB0eXBvLCBzZWxmIGlzIGEgdW5pcXVlbHkKCS8vIGtub3dhYmxlIGFkZHJlc3MgdGhpcyByZWFsbSBwdWJsaXNoZXMgaXRzZWxmIHZpYSBBZGRyZXNzKCksIHNvIGl0IGlzCgkvLyB0aGUgb25lIHdyb25nIGJlbmVmaWNpYXJ5IHdvcnRoIHNwZW5kaW5nIGEgY29tcGFyaXNvbiBvbgoJaWYgYmVuZWZpY2lhcnkgPT0gc2VsZiB7CgkJcGFuaWMoImJlbmVmaWNpYXJ5IG11c3Qgbm90IGJlIHRoaXMgcmVhbG0ncyBvd24gYWRkcmVzcyIpCgl9Cglhc3NlcnRWYWxpZFRpdGxlKHRpdGxlKQoJaWYgbGVuKG1lbW8pID4gTWF4TWVtb0xlbiB7CgkJcGFuaWMoIm1lbW8gZXhjZWVkcyAiICsgaXRvYShNYXhNZW1vTGVuKSArICIgYnl0ZXMiKQoJfQoKCWRlbGF5cywgYW1vdW50cyA6PSBwYXJzZVNwZWMoc3BlYykKCW4gOj0gaW50NjQobGVuKGRlbGF5cykpCgoJLy8gVGhlIGRlY2xhcmVkIHRvdGFsIG11c3QgbWF0Y2ggdGhlIGVzY3JvdyBleGFjdGx5LCBpbiBib3RoIGRpcmVjdGlvbnMuCglkZWNsYXJlZCA6PSBpbnQ2NCgwKQoJZm9yIF8sIGEgOj0gcmFuZ2UgYW1vdW50cyB7CgkJc3VtLCBvayA6PSBjaGVja2VkQWRkKGRlY2xhcmVkLCBhKQoJCWlmICFvayB7CgkJCXBhbmljKCJ0cmFuY2hlIGFtb3VudHMgb3ZlcmZsb3cgaW50NjQiKQoJCX0KCQlkZWNsYXJlZCA9IHN1bQoJfQoJaWYgZGVjbGFyZWQgIT0gYW1vdW50IHsKCQlwYW5pYygidHJhbmNoZSBhbW91bnRzIHRvdGFsICIgKyBpdG9hKGRlY2xhcmVkKSArIERlbm9tICsKCQkJIiBidXQgIiArIGl0b2EoYW1vdW50KSArIERlbm9tICsgIiB3YXMgc2VudDsgdGhleSBtdXN0IGJlIGVxdWFsIikKCX0KCgkvLyBXaG9sZS1yZWFsbSBjYXBhY2l0eSBjaGVjaywgYWhlYWQgb2YgYW55IHN0YXRlIGNoYW5nZSwgZm9yIGEgY2xlYXIKCS8vIG1lc3NhZ2UuIGR1ZWJvb2sgd291bGQgcmVmdXNlIHdpdGggRXJyQm9va0Z1bGwgYW55d2F5LCBhbmQgYSBwYW5pYwoJLy8gdGhlcmUgd291bGQgYWJvcnQgdGhpcyB0cmFuc2FjdGlvbiB3aG9sbHkg4oCUIHRoZSBwcmUtY2hlY2sgb25seQoJLy8gaW1wcm92ZXMgdGhlIGVycm9yLgoJaWYgaW50NjQoYm9vay5PcGVuQ291bnQoKSkrbiA+IGludDY0KE1heE9wZW5UcmFuY2hlcykgewoJCXBhbmljKCJyZWFsbSB0cmFuY2hlIGNhcGFjaXR5IHJlYWNoZWQ6ICIgKyBpdG9hKGludDY0KGJvb2suT3BlbkNvdW50KCkpKSArCgkJCSIgcGVuZGluZyBvZiAiICsgaXRvYShpbnQ2NChNYXhPcGVuVHJhbmNoZXMpKSArICIsIHRoaXMgc2NoZWR1bGUgbmVlZHMgIiArIGl0b2EobikpCgl9CgoJLy8gUGVyLWZ1bmRlciBjYXBhY2l0eSwgc28gb25lIGFjY291bnQgY2Fubm90IGNvbnN1bWUgdGhlIHdob2xlLXJlYWxtCgkvLyBjYXAgYWJvdmUgYW5kIGxvY2sgZXZlcnlib2R5IG91dC4gU2VlIE1heE9wZW5QZXJGdW5kZXIuCglpZiBtaW5lIDo9IG9wZW5PZihmdW5kZXIpOyBtaW5lK24gPiBpbnQ2NChNYXhPcGVuUGVyRnVuZGVyKSB7CgkJcGFuaWMoImZ1bmRlciB0cmFuY2hlIGNhcGFjaXR5IHJlYWNoZWQ6ICIgKyBpdG9hKG1pbmUpICsgIiBwZW5kaW5nIG9mICIgKwoJCQlpdG9hKGludDY0KE1heE9wZW5QZXJGdW5kZXIpKSArICIsIHRoaXMgc2NoZWR1bGUgbmVlZHMgIiArIGl0b2EobikpCgl9CgoJbmV3RXNjcm93LCBvayA6PSBjaGVja2VkQWRkKGVzY3Jvd1RvdGFsLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJlc2Nyb3cgb3ZlcmZsb3ciKQoJfQoKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkgLy8gdGhlIGNoYWluJ3MgY2xvY2sgKGNvbnRyYWN0IDEpLCBoZWlnaHRzIG9ubHkgKGNvbnRyYWN0IDIpCgoJbmV4dFNjaGVkdWxlSUQrKwoJcyA6PSAmc2NoZWR1bGV7CgkJaWQ6ICAgICAgICAgIG5leHRTY2hlZHVsZUlELAoJCWZ1bmRlcjogICAgICBmdW5kZXIsCgkJYmVuZWZpY2lhcnk6IGJlbmVmaWNpYXJ5LAoJCXRpdGxlOiAgICAgICB0aXRsZSwKCQltZW1vOiAgICAgICAgbWVtbywKCQl0b3RhbDogICAgICAgYW1vdW50LAoJCWZlZUJwczogICAgICBmZWVCcHMsCgkJcmV2b2NhYmxlOiAgIHJldm9jYWJsZSwKCQljcmVhdGVkQXQ6ICAgbm93LAoJCXBlbmRpbmc6ICAgICBuLAoJfQoKCWZvciBpIDo9IDA7IGkgPCBsZW4oZGVsYXlzKTsgaSsrIHsKCQlzZXEgOj0gaW50NjQoaSArIDEpCgkJLy8gVGhlIHBheWxvYWQgaXMgYSBsYWJlbCBmb3IgaHVtYW5zIGFuZCBldmVudHMuIEl0IGlzIE5FVkVSIHBhcnNlZAoJCS8vIChzZWUgdGhlIHBhY2thZ2UgZG9jKTogdGhlIGF1dGhvcml0YXRpdmUgcmVjb3JkIGlzIHRoZSB0cmFuY2hlCgkJLy8gc3RydWN0IHN0b3JlZCB1bmRlciB0aGUgZGVmZXJyYWwgSUQgYmVsb3cuCgkJbGFiZWwgOj0gInNjaGVkdWxlICIgKyBpdG9hKHMuaWQpICsgIiB0cmFuY2hlICIgKyBpdG9hKHNlcSkgKyAiLyIgKyBpdG9hKG4pCgoJCS8vIHR0bCAwIG1lYW5zIHRoZSB0cmFuY2hlIG5ldmVyIGV4cGlyZXM6IHZlc3RlZCB2YWx1ZSBjYW5ub3QgYmUKCQkvLyBsb3N0IGJ5IGEgc2xvdyBvciBhYnNlbnQgYmVuZWZpY2lhcnkuCgkJZGlkLCBlcnIgOj0gYm9vay5TY2hlZHVsZShmdW5kZXIuU3RyaW5nKCksIGxhYmVsLCBub3csIGRlbGF5c1tpXSwgMCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoZXJyKQoJCX0KCQlkLCBmb3VuZCA6PSBib29rLkdldChkaWQpCgkJaWYgIWZvdW5kIHsKCQkJcGFuaWMoImludGVybmFsOiBzY2hlZHVsZWQgZGVmZXJyYWwgbm90IGZvdW5kIikKCQl9CgkJdHJhbmNoZXMuU2V0KHBhZFUoZGlkKSwgJnRyYW5jaGV7CgkJCWRlZmVycmFsSUQ6IGRpZCwKCQkJc2NoZWR1bGVJRDogcy5pZCwKCQkJc2VxOiAgICAgICAgc2VxLAoJCQlhbW91bnQ6ICAgICBhbW91bnRzW2ldLAoJCQlkdWVBdDogICAgICBkLkR1ZUF0LAoJCQlzdGF0dXM6ICAgICBTdGF0dXNQZW5kaW5nLAoJCX0pCgkJcy50cmFuY2hlSURzID0gYXBwZW5kKHMudHJhbmNoZUlEcywgZGlkKQoKCQljaGFpbi5FbWl0KCJUcmFuY2hlU2NoZWR1bGVkIiwKCQkJInNjaGVkdWxlIiwgaXRvYShzLmlkKSwKCQkJInRyYW5jaGUiLCB1dG9hKGRpZCksCgkJCSJzZXEiLCBpdG9hKHNlcSksCgkJCSJhbW91bnQiLCBpdG9hKGFtb3VudHNbaV0pLAoJCQkiZHVlQXQiLCBpdG9hKGQuRHVlQXQpLAoJCSkKCX0KCglzY2hlZHVsZXMuU2V0KHBhZElEKHMuaWQpLCBzKQoJZXNjcm93VG90YWwgPSBuZXdFc2Nyb3cKCWFkZE9wZW4oZnVuZGVyLCBuKSAvLyBjb21taXRzIHdpdGggZXNjcm93VG90YWw6IGJvdGggY291bnQgdGhlIHNhbWUgdHJhbmNoZXMKCgljaGFpbi5FbWl0KCJTY2hlZHVsZUZ1bmRlZCIsCgkJInNjaGVkdWxlIiwgaXRvYShzLmlkKSwKCQkiZnVuZGVyIiwgZnVuZGVyLlN0cmluZygpLAoJCSJiZW5lZmljaWFyeSIsIGJlbmVmaWNpYXJ5LlN0cmluZygpLAoJCSJ0b3RhbCIsIGl0b2EoYW1vdW50KSwKCQkidHJhbmNoZXMiLCBpdG9hKG4pLAoJCSJmZWVCcHMiLCBpdG9hKHMuZmVlQnBzKSwKCQkicmV2b2NhYmxlIiwgYnRvYShyZXZvY2FibGUpLAoJKQoJcmV0dXJuIHMuaWQKfQoKLy8gUmVsZWFzZSBwYXlzIG91dCBhIGR1ZSB0cmFuY2hlLiBBTllPTkUgbWF5IGNhbGwgaXQ6IHRoZSB2YWx1ZSBpcyBjcmVkaXRlZAovLyB0byB0aGUgc2NoZWR1bGUncyBSRUNPUkRFRCBCRU5FRklDSUFSWSwgbmV2ZXIgdG8gdGhlIGNhbGxlciwgc28gYQovLyBzdHJhbmdlciBjYWxsaW5nIHRoaXMgZ2FpbnMgbm90aGluZyBhbmQgdGhlIGJlbmVmaWNpYXJ5IG5lZWRzIG5vIGxpdmVuZXNzCi8vIG9mIHRoZWlyIG93bi4gVGhlIHByb3RvY29sIGZlZSBzbmFwc2hvdHRlZCBhdCBmdW5kaW5nIGlzIGNoYXJnZWQgaGVyZS4KLy8KLy8gQWJvcnRzIGlmIHRoZSB0cmFuY2hlIGRvZXMgbm90IGV4aXN0LCBpcyBub3QgZHVlIHlldCwgb3IgaGFzIGFscmVhZHkgYmVlbgovLyByZWxlYXNlZCBvciByZXZva2VkIOKAlCB0aGUgbGFzdCBvZiB0aG9zZSBpcyBkdWVib29rJ3MgZ3VhcmFudGVlLCBub3QgYQovLyBjaGVjayB3cml0dGVuIGhlcmUuCmZ1bmMgUmVsZWFzZShjdXIgcmVhbG0sIHRyYW5jaGVJRCBpbnQ2NCkgc3RyaW5nIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgoJZGlkIDo9IG11c3RJRCh0cmFuY2hlSUQpCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgoJLy8gQ09OU1VNRSBGSVJTVCAoZHVlYm9vayBjb25zdW1lciBjb250cmFjdCA1KS4gQ2xhaW0gcmVtb3ZlcyB0aGUKCS8vIGRlZmVycmFsIGJlZm9yZSByZXR1cm5pbmcsIHNvIGJ5IHRoZSB0aW1lIHRoZSBlZmZlY3QgYmVsb3cgcnVucyBubwoJLy8gc2Vjb25kIENsYWltIG9mIHRoaXMgSUQgY2FuIGV2ZXIgc3VjY2VlZCDigJQgbm90IGluIHRoaXMgdHJhbnNhY3Rpb24sCgkvLyBhbmQgbm90IGluIGFueSBmdXR1cmUgb25lLiBUaGlzIHJlYWxtIHdyaXRlcyBubyByZXBsYXkgZ3VhcmQgb2YgaXRzCgkvLyBvd24gYmVjYXVzZSBkdWVib29rJ3MgaXMgc3RydWN0dXJhbC4KCWQsIGVyciA6PSBib29rLkNsYWltKGRpZCwgbm93KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCS8vIEVGRkVDVCBTRUNPTkQsIHNhbWUgdHJhbnNhY3Rpb24uCgl0IDo9IG11c3RUcmFuY2hlKGQuSUQpCglpZiB0LnN0YXR1cyAhPSBTdGF0dXNQZW5kaW5nIHsKCQkvLyBVbnJlYWNoYWJsZTogYSBzdWNjZXNzZnVsIENsYWltIHByb3ZlcyB0aGUgZGVmZXJyYWwgd2FzIG9wZW4sIGFuZAoJCS8vIHRoaXMgcmVhbG0gdGVybWluYXRlcyB0aGUgdHJhbmNoZSByZWNvcmQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24KCQkvLyBpdCBjb25zdW1lcyB0aGUgZGVmZXJyYWwuIEtlcHQgYXMgYSBjb25zaXN0ZW5jeSBhc3NlcnRpb24g4oCUIGlmIGl0CgkJLy8gZXZlciBmaXJlcywgdGhlIHR3byBzdG9yZXMgaGF2ZSBkaXZlcmdlZCBhbmQgdGhlIHRyYW5zYWN0aW9uIG11c3QKCQkvLyBub3QgcHJvY2VlZC4KCQlwYW5pYygiaW50ZXJuYWw6IGNsYWltZWQgYSBkZWZlcnJhbCB3aG9zZSB0cmFuY2hlIGlzICIgKyB0LnN0YXR1cykKCX0KCXMgOj0gbXVzdFNjaGVkdWxlKHQuc2NoZWR1bGVJRCkKCgkvLyBmZWVsZWRnZXIgdmFsaWRhdGVzIGJlZm9yZSBtdXRhdGluZywgYW5kIGd1YXJhbnRlZXMKCS8vIGNyZWRpdGVkICsgZmVlID09IGFtb3VudC4KCWNyZWRpdGVkLCBmZWUsIGVyciA6PSBsZWRnZXIuRGVwb3NpdChzLmJlbmVmaWNpYXJ5LlN0cmluZygpLCB0LmFtb3VudCwgcy5mZWVCcHMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cgllc2Nyb3dUb3RhbCAtPSB0LmFtb3VudCAvLyA+PSAwOiBlc2Nyb3dUb3RhbCA9PSDOoyBwZW5kaW5nIGFtb3VudHMgPj0gdC5hbW91bnQKCXQuc3RhdHVzID0gU3RhdHVzUmVsZWFzZWQKCXQuc2V0dGxlZEF0ID0gbm93CglzLnBlbmRpbmctLQoJcy5yZWxlYXNlZEdyb3NzICs9IHQuYW1vdW50CglhZGRPcGVuKHMuZnVuZGVyLCAtMSkgLy8gdGhpcyB0cmFuY2hlIG5vIGxvbmdlciBjb3VudHMgYWdhaW5zdCB0aGUgZnVuZGVyCgoJY2hhaW4uRW1pdCgiVHJhbmNoZVJlbGVhc2VkIiwKCQkic2NoZWR1bGUiLCBpdG9hKHMuaWQpLAoJCSJ0cmFuY2hlIiwgdXRvYShkLklEKSwKCQkic2VxIiwgaXRvYSh0LnNlcSksCgkJImJlbmVmaWNpYXJ5Iiwgcy5iZW5lZmljaWFyeS5TdHJpbmcoKSwKCQkiY3JlZGl0ZWQiLCBpdG9hKGNyZWRpdGVkKSwKCQkiZmVlIiwgaXRvYShmZWUpLAoJCSJjYWxsZXIiLCBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkuU3RyaW5nKCksCgkJImhlaWdodCIsIGl0b2Eobm93KSwKCSkKCXJldHVybiAicmVsZWFzZWQgdHJhbmNoZSAiICsgdXRvYShkLklEKSArICIgKCIgKyBpdG9hKGNyZWRpdGVkKSArIERlbm9tICsgIiB0byAiICsKCQlzLmJlbmVmaWNpYXJ5LlN0cmluZygpICsgIikiCn0KCi8vIFJldm9rZSByZXR1cm5zIGEgTk9ULVlFVC1EVUUgdHJhbmNoZSB0byB0aGUgZnVuZGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UsCi8vIGZlZS1mcmVlLiBPbmx5IHRoZSBmdW5kZXIgbWF5IGNhbGwgaXQsIGFuZCBvbmx5IG9uIGEgc2NoZWR1bGUgY3JlYXRlZAovLyByZXZvY2FibGUuCi8vCi8vIEEgdHJhbmNoZSB3aG9zZSBkdWUgaGVpZ2h0IGhhcyBhcnJpdmVkIGNhbiBuZXZlciBiZSByZXZva2VkLCBldmVuIHRob3VnaAovLyBkdWVib29rJ3MgQ2FuY2VsIHdvdWxkIGNvbnN1bWUgaXQ6IHRoYXQgcmVmdXNhbCBpcyB0aGlzIHJlYWxtJ3MsIGFuZCBpdAovLyBpcyB3aGF0IHN0b3BzIGEgZnVuZGVyIGZyb250LXJ1bm5pbmcgdGhlIGJlbmVmaWNpYXJ5J3MgUmVsZWFzZSB0byBjbGF3Ci8vIGJhY2sgdmFsdWUgYWxyZWFkeSB2ZXN0ZWQuCmZ1bmMgUmV2b2tlKGN1ciByZWFsbSwgdHJhbmNoZUlEIGludDY0KSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglkaWQgOj0gbXVzdElEKHRyYW5jaGVJRCkKCXQgOj0gbXVzdFRyYW5jaGUoZGlkKQoJcyA6PSBtdXN0U2NoZWR1bGUodC5zY2hlZHVsZUlEKQoKCWFzc2VydFJldm9jYWJsZUJ5KHMsIGNhbGxlcikKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIG5vdyA+PSB0LmR1ZUF0IHsKCQlwYW5pYygidHJhbmNoZSAiICsgdXRvYShkaWQpICsgIiBpcyBkdWUgYXQgaGVpZ2h0ICIgKyBpdG9hKHQuZHVlQXQpICsKCQkJIiAobm93ICIgKyBpdG9hKG5vdykgKyAiKTogYSB2ZXN0ZWQgdHJhbmNoZSBjYW4gbmV2ZXIgYmUgcmV2b2tlZCIpCgl9CgoJcmV2b2tlT25lKGN1ciwgcywgdCwgbm93KQoJcmV0dXJuICJyZXZva2VkIHRyYW5jaGUgIiArIHV0b2EoZGlkKSArICIgKCIgKyBpdG9hKHQuYW1vdW50KSArIERlbm9tICsgIiB0byB0aGUgZnVuZGVyKSIKfQoKLy8gUmV2b2tlQWxsIHJldHVybnMgZXZlcnkgbm90LXlldC1kdWUgdHJhbmNoZSBvZiBhIHNjaGVkdWxlIHRvIHRoZSBmdW5kZXIncwovLyBjbGFpbWFibGUgYmFsYW5jZSBpbiBvbmUgdHJhbnNhY3Rpb24sIGFuZCByZXR1cm5zIGhvdyBtYW55IHdlcmUgcmV2b2tlZC4KLy8gQWxyZWFkeS1kdWUgYW5kIGFscmVhZHktc2V0dGxlZCB0cmFuY2hlcyBhcmUgc2tpcHBlZCwgbm90IGFuIGVycm9yLgovLyBGdW5kZXIgb25seSwgcmV2b2NhYmxlIHNjaGVkdWxlcyBvbmx5LiBBYm9ydHMgaWYgbm90aGluZyB3YXMgcmV2b2NhYmxlLAovLyBzbyBhIG5vLW9wIGNhbm5vdCBiZSBtaXN0YWtlbiBmb3Igc3VjY2Vzcy4KZnVuYyBSZXZva2VBbGwoY3VyIHJlYWxtLCBzY2hlZHVsZUlEIGludDY0KSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglzIDo9IG11c3RTY2hlZHVsZShzY2hlZHVsZUlEKQoJYXNzZXJ0UmV2b2NhYmxlQnkocywgY2FsbGVyKQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoKCS8vIEJvdW5kZWQgYnkgTWF4VHJhbmNoZXMsIHNvIHRoZSBsb29wIGNvc3QgaXMgYm91bmRlZCBhdCBmdW5kaW5nIHRpbWUuCgljb3VudCA6PSBpbnQ2NCgwKQoJdG90YWwgOj0gaW50NjQoMCkKCWZvciBfLCBkaWQgOj0gcmFuZ2Ugcy50cmFuY2hlSURzIHsKCQl2IDo9IHRyYW5jaGVzLkdldChwYWRVKGRpZCkpCgkJaWYgdiA9PSBuaWwgewoJCQlwYW5pYygiaW50ZXJuYWw6IHNjaGVkdWxlIHJlZmVyZW5jZXMgYW4gdW5rbm93biB0cmFuY2hlIikKCQl9CgkJdCA6PSB2LigqdHJhbmNoZSkKCQlpZiB0LnN0YXR1cyAhPSBTdGF0dXNQZW5kaW5nIHx8IG5vdyA+PSB0LmR1ZUF0IHsKCQkJY29udGludWUKCQl9CgkJYW1vdW50IDo9IHQuYW1vdW50CgkJcmV2b2tlT25lKGN1ciwgcywgdCwgbm93KQoJCWNvdW50KysKCQl0b3RhbCArPSBhbW91bnQgLy8gYm91bmRlZCBieSBzLnRvdGFsLCB3aGljaCB3YXMgb3ZlcmZsb3ctY2hlY2tlZCBhdCBmdW5kaW5nCgl9CglpZiBjb3VudCA9PSAwIHsKCQlwYW5pYygibm8gcmV2b2NhYmxlIHRyYW5jaGVzOiBldmVyeSB0cmFuY2hlIG9mIHRoaXMgc2NoZWR1bGUgaXMgYWxyZWFkeSBkdWUgb3Igc2V0dGxlZCIpCgl9CgoJY2hhaW4uRW1pdCgiU2NoZWR1bGVSZXZva2VkIiwKCQkic2NoZWR1bGUiLCBpdG9hKHMuaWQpLAoJCSJ0cmFuY2hlcyIsIGl0b2EoY291bnQpLAoJCSJhbW91bnQiLCBpdG9hKHRvdGFsKSwKCQkiaGVpZ2h0IiwgaXRvYShub3cpLAoJKQoJcmV0dXJuICJyZXZva2VkICIgKyBpdG9hKGNvdW50KSArICIgdHJhbmNoZXMgKCIgKyBpdG9hKHRvdGFsKSArIERlbm9tICsgIiB0byB0aGUgZnVuZGVyKSIKfQoKLy8gcmV2b2tlT25lIGNhbmNlbHMgb25lIHBlbmRpbmcsIG5vdC15ZXQtZHVlIHRyYW5jaGUgYW5kIGNyZWRpdHMgdGhlIGZ1bmRlcgovLyBmZWUtZnJlZS4gQ2FsbGVycyBoYXZlIGFscmVhZHkgdmVyaWZpZWQgYXV0aG9yaXphdGlvbiwgcmV2b2NhYmlsaXR5IGFuZAovLyB0aGUgZHVlLWhlaWdodCByZWZ1c2FsLgpmdW5jIHJldm9rZU9uZShjdXIgcmVhbG0sIHMgKnNjaGVkdWxlLCB0ICp0cmFuY2hlLCBub3cgaW50NjQpIHsKCS8vIENPTlNVTUUgRklSU1QuIE93bmVyc2hpcCBpcyBjaGVja2VkIGJ5IGR1ZWJvb2sgYWdhaW5zdCB0aGUgZnVuZGVyCgkvLyBhZGRyZXNzIHRoaXMgcmVhbG0gcmVjb3JkZWQgYXQgU2NoZWR1bGUsIG5ldmVyIGFnYWluc3QgYW4gYXJndW1lbnQKCS8vIChkdWVib29rIGNvbnN1bWVyIGNvbnRyYWN0IDQpLgoJZCwgZXJyIDo9IGJvb2suQ2FuY2VsKHQuZGVmZXJyYWxJRCwgcy5mdW5kZXIuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglfID0gZAoKCS8vIEVGRkVDVCBTRUNPTkQsIHNhbWUgdHJhbnNhY3Rpb24uIFJlZnVuZHMgYXJlIGFsd2F5cyBmZWUtZnJlZS4KCWlmIF8sIF8sIGVyciA6PSBsZWRnZXIuRGVwb3NpdChzLmZ1bmRlci5TdHJpbmcoKSwgdC5hbW91bnQsIDApOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cgllc2Nyb3dUb3RhbCAtPSB0LmFtb3VudAoJdC5zdGF0dXMgPSBTdGF0dXNSZXZva2VkCgl0LnNldHRsZWRBdCA9IG5vdwoJcy5wZW5kaW5nLS0KCXMucmV2b2tlZFRvdGFsICs9IHQuYW1vdW50CglhZGRPcGVuKHMuZnVuZGVyLCAtMSkgLy8gcmV2b2tpbmcgZnJlZXMgdGhlIGZ1bmRlcidzIHNsb3QgdG9vCgoJY2hhaW4uRW1pdCgiVHJhbmNoZVJldm9rZWQiLAoJCSJzY2hlZHVsZSIsIGl0b2Eocy5pZCksCgkJInRyYW5jaGUiLCB1dG9hKHQuZGVmZXJyYWxJRCksCgkJInNlcSIsIGl0b2EodC5zZXEpLAoJCSJmdW5kZXIiLCBzLmZ1bmRlci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYSh0LmFtb3VudCksCgkJImhlaWdodCIsIGl0b2Eobm93KSwKCSkKfQoKLy8gV2l0aGRyYXcgc2VuZHMgYW1vdW50IHVnbm90IG9mIHRoZSBjYWxsZXIncyBjbGFpbWFibGUgYmFsYW5jZSAocmVsZWFzZWQKLy8gdHJhbmNoZXMgZm9yIGEgYmVuZWZpY2lhcnksIHJldm9jYXRpb25zIGZvciBhIGZ1bmRlcikgdG8gdGhlIGNhbGxlci4KZnVuYyBXaXRoZHJhdyhjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCkgc3RyaW5nIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgoJLy8gRGViaXQgdGhlIGxlZGdlciBCRUZPUkUgdGhlIGNvaW5zIG1vdmUgKGNvaW5pbydzIG9yZGVyaW5nIGNvbnRyYWN0KS4KCWlmIGVyciA6PSBsZWRnZXIuV2l0aGRyYXcoY2FsbGVyLlN0cmluZygpLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoKCWNoYWluLkVtaXQoIldpdGhkcmF3biIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKCXJldHVybiAid2l0aGRyZXcgIiArIGl0b2EoYW1vdW50KSArIERlbm9tCn0KCi8vIFdpdGhkcmF3QWxsIHNlbmRzIHRoZSBjYWxsZXIncyBlbnRpcmUgY2xhaW1hYmxlIGJhbGFuY2UgdG8gdGhlIGNhbGxlci4KLy8gQWJvcnRzIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gd2l0aGRyYXcuCmZ1bmMgV2l0aGRyYXdBbGwoY3VyIHJlYWxtKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoY2FsbGVyLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJub3RoaW5nIHRvIHdpdGhkcmF3IikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgoJY2hhaW4uRW1pdCgiV2l0aGRyYXduIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQoJcmV0dXJuICJ3aXRoZHJldyAiICsgaXRvYShhbW91bnQpICsgRGVub20KfQoKLy8gV2l0aGRyYXdGZWVzIHNlbmRzIHRoZSBhY2NydWVkIGZlZSBwb3QgdG8gdGhlIGZlZSByZWNpcGllbnQuIE9ubHkgdGhlIGZlZQovLyByZWNpcGllbnQgbWF5IGNhbGwgaXQuCmZ1bmMgV2l0aGRyYXdGZWVzKGN1ciByZWFsbSkgc3RyaW5nIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBjYWxsZXIgIT0gZmVlUmVjaXBpZW50IHsKCQlwYW5pYygib25seSB0aGUgZmVlIHJlY2lwaWVudCBtYXkgd2l0aGRyYXcgZmVlcyIpCgl9CglpZiBsZWRnZXIuRmVlc0FjY3J1ZWQoKSA9PSAwIHsKCQlwYW5pYygibm8gZmVlcyBhY2NydWVkIikKCX0KCWFtb3VudCA6PSBsZWRnZXIuV2l0aGRyYXdGZWVzKCkKCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBmZWVSZWNpcGllbnQsIERlbm9tLCBhbW91bnQpCgoJY2hhaW4uRW1pdCgiRmVlc1dpdGhkcmF3biIsICJ0byIsIGZlZVJlY2lwaWVudC5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKCXJldHVybiAid2l0aGRyZXcgIiArIGl0b2EoYW1vdW50KSArIERlbm9tICsgIiBpbiBmZWVzIgp9CgovLyBTd2VlcERlbm9tIHNlbmRzIHRoZSBzdXJwbHVzIG9mIGEgc2luZ2xlIGRlbm9taW5hdGlvbiB0byB0aGUgZmVlCi8vIHJlY2lwaWVudC4gRm9yIHVnbm90IG9ubHkgdGhlIGV4Y2VzcyBvdmVyIExpYWJpbGl0aWVzKCkgbW92ZXMg4oCUIGVzY3Jvd2VkCi8vIHRyYW5jaGVzIGFuZCBjbGFpbWFibGUgYmFsYW5jZXMgYXJlIHVudG91Y2hhYmxlIGJ5IGNvbnN0cnVjdGlvbi4gT3RoZXIKLy8gZGVub21pbmF0aW9ucyBtb3ZlIHdob2xseS4gT25seSB0aGUgZmVlIHJlY2lwaWVudCBtYXkgY2FsbCBpdC4KZnVuYyBTd2VlcERlbm9tKGN1ciByZWFsbSwgZGVub20gc3RyaW5nKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGNhbGxlciAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJvbmx5IHRoZSBmZWUgcmVjaXBpZW50IG1heSBzd2VlcCBzdXJwbHVzIikKCX0KCXJlc2VydmUgOj0gaW50NjQoMCkKCWlmIGRlbm9tID09IERlbm9tIHsKCQlyZXNlcnZlID0gTGlhYmlsaXRpZXMoKQoJfQoJc3dlcHQgOj0gY29pbmlvLlN3ZWVwKDAsIGN1ciwgZmVlUmVjaXBpZW50LCBkZW5vbSwgcmVzZXJ2ZSkKCgljaGFpbi5FbWl0KCJTdXJwbHVzU3dlcHQiLCAidG8iLCBmZWVSZWNpcGllbnQuU3RyaW5nKCksICJjb2lucyIsIGl0b2Eoc3dlcHQpK2Rlbm9tKQoJcmV0dXJuICJzd2VwdCAiICsgaXRvYShzd2VwdCkgKyBkZW5vbQp9CgovLyAtLS0gYWRtaW5pc3RyYXRpb24gLS0tCgovLyBTZXRGZWVCcHMgc2V0cyB0aGUgcHJvdG9jb2wgZmVlIHNuYXBzaG90dGVkIGludG8gRlVUVVJFIHNjaGVkdWxlcyBhdAovLyBmdW5kaW5nLiBFeGlzdGluZyBzY2hlZHVsZXMga2VlcCB0aGUgZmVlIHRoZXkgd2VyZSBmdW5kZWQgdW5kZXIsIHNvIGFuCi8vIGluLWZsaWdodCBzY2hlZHVsZSdzIGVjb25vbWljcyBjYW5ub3QgYmUgY2hhbmdlZC4gQWRtaW4gb25seS4KZnVuYyBTZXRGZWVCcHMoY3VyIHJlYWxtLCBicHMgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglpZiBicHMgPCAwIHx8IGJwcyA+IE1heEZlZUJwcyB7CgkJcGFuaWMoImZlZSBicHMgb3V0IG9mIHJhbmdlIFswLCAiICsgaXRvYShNYXhGZWVCcHMpICsgIl0iKQoJfQoJb2xkIDo9IGZlZUJwcwoJZmVlQnBzID0gYnBzCgljaGFpbi5FbWl0KCJGZWVCcHNDaGFuZ2VkIiwgIm9sZCIsIGl0b2Eob2xkKSwgIm5ldyIsIGl0b2EoYnBzKSkKfQoKLy8gU2V0RmVlUmVjaXBpZW50IHJlLXBvaW50cyB0aGUgZmVlL3N1cnBsdXMgcm9sZS4gVGhlIHBvdCBhY2NydWVkIHVuZGVyIHRoZQovLyBPVVRHT0lORyByZWNpcGllbnQgaXMgc2V0dGxlZCB0byB0aGF0IHJlY2lwaWVudCdzIG93biBjbGFpbWFibGUgYmFsYW5jZQovLyBmaXJzdCwgc28gdGhlIHN1Y2Nlc3NvciBpbmhlcml0cyB0aGUgcm9sZSBhbmQgbm90IHRoZSBlYXJuaW5ncy4gQWRtaW4KLy8gb25seTsgdGhlIHplcm8gYWRkcmVzcyBpcyByZWplY3RlZC4KZnVuYyBTZXRGZWVSZWNpcGllbnQoY3VyIHJlYWxtLCBuZXh0IGFkZHJlc3MpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCgl2YXIgemVybyBhZGRyZXNzCglpZiBuZXh0ID09IHplcm8gewoJCXBhbmljKCJlbXB0eSBmZWUgcmVjaXBpZW50IikKCX0KCW9sZCA6PSBmZWVSZWNpcGllbnQKCgkvLyBUaGUgZmVlIHBvdCBpcyBhIHNpbmdsZSBzY2FsYXIg4oCUIGZlZWxlZGdlciBrZWVwcyBubyBwZXItcmVjaXBpZW50CgkvLyBhY2NvdW50aW5nIOKAlCBzbyBhIGJhcmUgcmUtcG9pbnQgd291bGQgaGFuZCBldmVyeSBiYXNpcyBwb2ludCBlYXJuZWQKCS8vIHVuZGVyIGBvbGRgIHRvIGBuZXh0YCwgYXQgdGhlIGFkbWluJ3Mgc29sZSBkaXNjcmV0aW9uIGFuZCB3aXRoIG5vCgkvLyB0aW1lbG9jay4gVGhhdCBpcyBhIHByaXZpbGVnZSB0aGUgcmVzdCBvZiB0aGlzIHJlYWxtIGRvZXMgbm90IGdyYW50OgoJLy8gdGhlIGFkbWluIHJvbGUgaXRzZWxmIGlzIHR3by1zdGVwLCB0aGUgZmVlIGlzIGNhcHBlZCBhbmQgc25hcHNob3R0ZWQKCS8vIHBlciBzY2hlZHVsZSwgYW5kIHRoZSBmdW5kZXIgc2lnbnMgYSBtYXhGZWVCcHMgY2VpbGluZy4KCS8vCgkvLyBTZXR0bGluZyB0byBgb2xkYCdzIGNsYWltYWJsZSBiYWxhbmNlIG1vdmVzIEYgaW50byBVIGJ5IHRoZSBzYW1lCgkvLyBhbW91bnQsIHNvIG5vIGNvaW5zIG1vdmUgaGVyZSBhbmQgY29uc2VydmF0aW9uIGlzIHVudG91Y2hlZDsgYG9sZGAKCS8vIHRoZW4gd2l0aGRyYXdzIG9uIHRoZWlyIG93biBpbml0aWF0aXZlIGxpa2UgYW55IG90aGVyIGNyZWRpdG9yLgoJLy8KCS8vIFJlZnVzaW5nIHRoZSBjYWxsIHdoaWxlIGZlZXMgYXJlIGFjY3J1ZWQgd291bGQgYmUgdGhlIG90aGVyIGF2YWlsYWJsZQoJLy8gZml4IGFuZCBpcyB3b3JzZTogV2l0aGRyYXdGZWVzIGlzIHJlY2lwaWVudC1vbmx5LCBzbyBhIHJlY2lwaWVudCB3aG8KCS8vIHNpbXBseSBkZWNsaW5lZCB0byB3aXRoZHJhdyBjb3VsZCBob2xkIHRoZSByb2xlIGhvc3RhZ2UgYWdhaW5zdCB0aGUKCS8vIGFkbWluIGluZGVmaW5pdGVseS4KCWlmIG9sZCAhPSBuZXh0ICYmIGxlZGdlci5GZWVzQWNjcnVlZCgpID4gMCB7CgkJcG90IDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJCWNyZWRpdGVkLCBmZWUsIGVyciA6PSBsZWRnZXIuRGVwb3NpdChvbGQuU3RyaW5nKCksIHBvdCwgMCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoZXJyKQoJCX0KCQlpZiBjcmVkaXRlZCAhPSBwb3QgfHwgZmVlICE9IDAgewoJCQkvLyBVbnJlYWNoYWJsZSBhdCAwIGJwcywgd2hlcmUgZmVlbGVkZ2VyJ3MgY3JlZGl0ZWQrZmVlID09IGFtb3VudAoJCQkvLyBndWFyYW50ZWUgZm9yY2VzIGNyZWRpdGVkID09IGFtb3VudC4gQXNzZXJ0ZWQgYmVjYXVzZSB0aGlzIGlzCgkJCS8vIHRoZSBvbmUgcGxhY2UgdGhlIHJlYWxtIG1vdmVzIHZhbHVlIGJldHdlZW4gdHdvIG9mIGl0cyBvd24KCQkJLy8gbGlhYmlsaXR5IHRlcm1zLCBhbmQgYSBzaWxlbnQgc2hvcnRmYWxsIGhlcmUgd291bGQgYmUgYSBsZWFrLgoJCQlwYW5pYygiaW50ZXJuYWw6IGZlZSBzZXR0bGVtZW50IGRpZCBub3QgY3JlZGl0IHRoZSBmdWxsIHBvdCIpCgkJfQoJCWNoYWluLkVtaXQoIkZlZXNTZXR0bGVkIiwgInRvIiwgb2xkLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShwb3QpKQoJfQoKCWZlZVJlY2lwaWVudCA9IG5leHQKCWNoYWluLkVtaXQoIkZlZVJlY2lwaWVudENoYW5nZWQiLCAib2xkIiwgb2xkLlN0cmluZygpLCAibmV3IiwgbmV4dC5TdHJpbmcoKSkKfQoKLy8gUHJvcG9zZUFkbWluIG5vbWluYXRlcyBhIHN1Y2Nlc3NvciBhZG1pbi4gVGhlIGhhbmRvdmVyIHRha2VzIGVmZmVjdCBvbmx5Ci8vIHdoZW4gdGhhdCBhY2NvdW50IGNhbGxzIEFjY2VwdEFkbWluLCBzbyBhIHR5cG8gY2Fubm90IHN0cmFuZCB0aGUgcm9sZS4KLy8gQWRtaW4gb25seTsgdGhlIHplcm8gYWRkcmVzcyBjbGVhcnMgYSBwZW5kaW5nIHByb3Bvc2FsLgpmdW5jIFByb3Bvc2VBZG1pbihjdXIgcmVhbG0sIG5leHQgYWRkcmVzcykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWFzc2VydEFkbWluKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCXBlbmRpbmdBZG1pbiA9IG5leHQKCWNoYWluLkVtaXQoIkFkbWluUHJvcG9zZWQiLCAicGVuZGluZyIsIG5leHQuU3RyaW5nKCkpCn0KCi8vIEFjY2VwdEFkbWluIGNvbXBsZXRlcyBhIGhhbmRvdmVyLiBPbmx5IHRoZSBwcm9wb3NlZCBhY2NvdW50IG1heSBjYWxsIGl0LgpmdW5jIEFjY2VwdEFkbWluKGN1ciByZWFsbSkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCXZhciB6ZXJvIGFkZHJlc3MKCWlmIHBlbmRpbmdBZG1pbiA9PSB6ZXJvIHx8IGNhbGxlciAhPSBwZW5kaW5nQWRtaW4gewoJCXBhbmljKCJvbmx5IHRoZSBwcm9wb3NlZCBhZG1pbiBtYXkgYWNjZXB0IikKCX0KCW9sZCA6PSBhZG1pbgoJYWRtaW4gPSBjYWxsZXIKCXBlbmRpbmdBZG1pbiA9IHplcm8KCWNoYWluLkVtaXQoIkFkbWluVHJhbnNmZXJyZWQiLCAib2xkIiwgb2xkLlN0cmluZygpLCAibmV3IiwgYWRtaW4uU3RyaW5nKCkpCn0KCi8vIC0tLSByZWFkLW9ubHkgdmlld3MgLS0tCgovLyBTY2hlZHVsZUluZm8gcmV0dXJucyBhIHNjaGVkdWxlJ3MgZmllbGRzIGJ5IHZhbHVlLgpmdW5jIFNjaGVkdWxlSW5mbyhpZCBpbnQ2NCkgKGZ1bmRlciwgYmVuZWZpY2lhcnkgYWRkcmVzcywgdGl0bGUgc3RyaW5nLCB0b3RhbCwgZmVlQnBzIGludDY0LAoJcmV2b2NhYmxlIGJvb2wsIGNyZWF0ZWRBdCwgbnVtVHJhbmNoZXMsIHBlbmRpbmcsIHJlbGVhc2VkR3Jvc3MsIHJldm9rZWRUb3RhbCBpbnQ2NCkgewoJcyA6PSBtdXN0U2NoZWR1bGUoaWQpCglyZXR1cm4gcy5mdW5kZXIsIHMuYmVuZWZpY2lhcnksIHMudGl0bGUsIHMudG90YWwsIHMuZmVlQnBzLCBzLnJldm9jYWJsZSwKCQlzLmNyZWF0ZWRBdCwgaW50NjQobGVuKHMudHJhbmNoZUlEcykpLCBzLnBlbmRpbmcsIHMucmVsZWFzZWRHcm9zcywgcy5yZXZva2VkVG90YWwKfQoKLy8gTWVtbyByZXR1cm5zIGEgc2NoZWR1bGUncyByYXcgbWVtbyB0ZXh0LgpmdW5jIE1lbW8oaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0U2NoZWR1bGUoaWQpLm1lbW8gfQoKLy8gVHJhbmNoZUluZm8gcmV0dXJucyBvbmUgdHJhbmNoZSdzIGZpZWxkcyBieSB2YWx1ZS4gSXQgYW5zd2VycyBmb3Igc2V0dGxlZAovLyB0cmFuY2hlcyB0b28sIGFmdGVyIGR1ZWJvb2sgaGFzIGNvbnN1bWVkIHRoZSBkZWZlcnJhbC4KZnVuYyBUcmFuY2hlSW5mbyh0cmFuY2hlSUQgaW50NjQpIChzY2hlZHVsZUlELCBzZXEsIGFtb3VudCwgZHVlQXQgaW50NjQsIHN0YXR1cyBzdHJpbmcsIHNldHRsZWRBdCBpbnQ2NCkgewoJdCA6PSBtdXN0VHJhbmNoZShtdXN0SUQodHJhbmNoZUlEKSkKCXJldHVybiB0LnNjaGVkdWxlSUQsIHQuc2VxLCB0LmFtb3VudCwgdC5kdWVBdCwgdC5zdGF0dXMsIHQuc2V0dGxlZEF0Cn0KCi8vIFRyYW5jaGVzT2YgbGlzdHMgYSBzY2hlZHVsZSdzIHRyYW5jaGVzLCBuZXdsaW5lLXNlcGFyYXRlZCwgb25lIHBlciBsaW5lCi8vIGFzICJpZCBzZXEgYW1vdW50IGR1ZUF0IHN0YXR1cyIuCmZ1bmMgVHJhbmNoZXNPZihpZCBpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gbXVzdFNjaGVkdWxlKGlkKQoJb3V0IDo9ICIiCglmb3IgXywgZGlkIDo9IHJhbmdlIHMudHJhbmNoZUlEcyB7CgkJdCA6PSB0cmFuY2hlcy5HZXQocGFkVShkaWQpKS4oKnRyYW5jaGUpCgkJb3V0ICs9IHV0b2EoZGlkKSArICIgIiArIGl0b2EodC5zZXEpICsgIiAiICsgaXRvYSh0LmFtb3VudCkgKyAiICIgKwoJCQlpdG9hKHQuZHVlQXQpICsgIiAiICsgdC5zdGF0dXMgKyAiXG4iCgl9CglyZXR1cm4gb3V0Cn0KCi8vIFZlc3RlZE9mIHJldHVybnMsIGZvciBhIHNjaGVkdWxlLCB0aGUgYW1vdW50IHdob3NlIGR1ZSBoZWlnaHQgaGFzIGFycml2ZWQKLy8gYW5kIHdoaWNoIGlzIHRoZXJlZm9yZSBubyBsb25nZXIgcmV2b2NhYmxlIOKAlCB3aGV0aGVyIG9yIG5vdCBpdCBoYXMgYmVlbgovLyByZWxlYXNlZCB5ZXQg4oCUIGFsb25nc2lkZSB0aGUgYW1vdW50IHN0aWxsIHJldm9jYWJsZSBieSB0aGUgZnVuZGVyLgpmdW5jIFZlc3RlZE9mKGlkIGludDY0KSAodmVzdGVkLCB1bnZlc3RlZCBpbnQ2NCkgewoJcyA6PSBtdXN0U2NoZWR1bGUoaWQpCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglmb3IgXywgZGlkIDo9IHJhbmdlIHMudHJhbmNoZUlEcyB7CgkJdCA6PSB0cmFuY2hlcy5HZXQocGFkVShkaWQpKS4oKnRyYW5jaGUpCgkJaWYgdC5zdGF0dXMgPT0gU3RhdHVzUmV2b2tlZCB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIG5vdyA+PSB0LmR1ZUF0IHsKCQkJdmVzdGVkICs9IHQuYW1vdW50CgkJfSBlbHNlIHsKCQkJdW52ZXN0ZWQgKz0gdC5hbW91bnQKCQl9Cgl9CglyZXR1cm4gdmVzdGVkLCB1bnZlc3RlZAp9CgovLyBSZWxlYXNhYmxlTm93IGxpc3RzIHRyYW5jaGUgaWRzIHRoYXQgYXJlIGR1ZSBhbmQgc3RpbGwgcGVuZGluZywgdXAgdG8KLy8gTWF4TGlzdGVkLCBuZXdsaW5lLXNlcGFyYXRlZC4gQW55b25lIG1heSBSZWxlYXNlIGVhY2ggb2YgdGhlbS4KZnVuYyBSZWxlYXNhYmxlTm93KCkgc3RyaW5nIHsKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWR1ZSA6PSBib29rLkR1ZShub3csIE1heExpc3RlZCkKCW91dCA6PSAiIgoJZm9yIF8sIGQgOj0gcmFuZ2UgZHVlIHsKCQlvdXQgKz0gdXRvYShkLklEKSArICJcbiIKCX0KCXJldHVybiBvdXQKfQoKLy8gQWRtaW4gcmV0dXJucyB0aGUgY3VycmVudCBhZG1pbi4KZnVuYyBBZG1pbigpIGFkZHJlc3MgeyByZXR1cm4gYWRtaW4gfQoKLy8gUGVuZGluZ0FkbWluIHJldHVybnMgdGhlIHByb3Bvc2VkIHN1Y2Nlc3NvciBhZG1pbiwgb3IgdGhlIHplcm8gYWRkcmVzcy4KZnVuYyBQZW5kaW5nQWRtaW4oKSBhZGRyZXNzIHsgcmV0dXJuIHBlbmRpbmdBZG1pbiB9CgovLyBGZWVSZWNpcGllbnQgcmV0dXJucyB3aG8gbWF5IHdpdGhkcmF3IGZlZXMgYW5kIHN3ZWVwIHN1cnBsdXMuCmZ1bmMgRmVlUmVjaXBpZW50KCkgYWRkcmVzcyB7IHJldHVybiBmZWVSZWNpcGllbnQgfQoKLy8gRmVlQnBzIHJldHVybnMgdGhlIGZlZSB0aGF0IHdpbGwgYmUgc25hcHNob3R0ZWQgaW50byBuZXdseSBmdW5kZWQKLy8gc2NoZWR1bGVzLiBFeGlzdGluZyBzY2hlZHVsZXMga2VlcCB0aGVpciBvd24gc25hcHNob3QuCmZ1bmMgRmVlQnBzKCkgaW50NjQgeyByZXR1cm4gZmVlQnBzIH0KCi8vIEZlZU9uIHByZXZpZXdzIHRoZSBmZWUgYW5kIG5ldCBjcmVkaXQgZm9yIGEgdHJhbmNoZSBvZiBhbW91bnQgYXQgdGhlCi8vIENVUlJFTlQgRmVlQnBzLgpmdW5jIEZlZU9uKGFtb3VudCBpbnQ2NCkgKGZlZSwgY3JlZGl0ZWQgaW50NjQpIHsKCWYsIGVyciA6PSBmZWVsZWRnZXIuRmVlRm9yKGFtb3VudCwgZmVlQnBzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIGYsIGFtb3VudCAtIGYKfQoKLy8gTnVtU2NoZWR1bGVzIHJldHVybnMgaG93IG1hbnkgc2NoZWR1bGVzIGhhdmUgZXZlciBiZWVuIGZ1bmRlZC4KZnVuYyBOdW1TY2hlZHVsZXMoKSBpbnQ2NCB7IHJldHVybiBuZXh0U2NoZWR1bGVJRCB9CgovLyBPcGVuVHJhbmNoZUNvdW50IHJldHVybnMgaG93IG1hbnkgdHJhbmNoZXMgYXJlIHBlbmRpbmcgYWNyb3NzIHRoZSB3aG9sZQovLyByZWFsbSwgYWdhaW5zdCB0aGUgTWF4T3BlblRyYW5jaGVzIGNhcC4KZnVuYyBPcGVuVHJhbmNoZUNvdW50KCkgaW50IHsgcmV0dXJuIGJvb2suT3BlbkNvdW50KCkgfQoKLy8gT3BlblRyYW5jaGVzT2ZGdW5kZXIgcmV0dXJucyBob3cgbWFueSB0cmFuY2hlcyBmdW5kZXIgY3VycmVudGx5IGhvbGRzCi8vIHBlbmRpbmcsIGFnYWluc3QgdGhlIE1heE9wZW5QZXJGdW5kZXIgY2FwLiBBIGZ1bmRlciBjYW4gcmVhZCB0aGlzIGJlZm9yZQovLyBmdW5kaW5nIHRvIHNlZSB0aGUgaGVhZHJvb20gdGhleSBoYXZlIGxlZnQuCmZ1bmMgT3BlblRyYW5jaGVzT2ZGdW5kZXIoZnVuZGVyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIG9wZW5PZihmdW5kZXIpIH0KCi8vIEZ1bmRlcnNXaXRoT3BlblRyYW5jaGVzIHJldHVybnMgaG93IG1hbnkgZGlzdGluY3QgZnVuZGVycyBob2xkIGF0IGxlYXN0Ci8vIG9uZSBwZW5kaW5nIHRyYW5jaGUuIEl0IGlzIHRoZSB3aWR0aCBvZiB0aGUgcGVyLWZ1bmRlciBjYXA6IGV4aGF1c3RpbmcKLy8gTWF4T3BlblRyYW5jaGVzIHJlcXVpcmVzIHRoaXMgdG8gcmVhY2ggY2VpbChNYXhPcGVuVHJhbmNoZXMvTWF4T3BlblBlckZ1bmRlcikuCmZ1bmMgRnVuZGVyc1dpdGhPcGVuVHJhbmNoZXMoKSBpbnQgeyByZXR1cm4gb3BlbkJ5RnVuZGVyLlNpemUoKSB9CgovLyBFc2Nyb3dUb3RhbCByZXR1cm5zIHRoZSBlc2Nyb3cgaGVsZCBieSBwZW5kaW5nIHRyYW5jaGVzICh0aGUgRSB0ZXJtKS4KZnVuYyBFc2Nyb3dUb3RhbCgpIGludDY0IHsgcmV0dXJuIGVzY3Jvd1RvdGFsIH0KCi8vIEJhbGFuY2VPZiByZXR1cm5zIGFkZHIncyBjbGFpbWFibGUgYmFsYW5jZSAocmVsZWFzZWQgdHJhbmNoZXMgZm9yIGEKLy8gYmVuZWZpY2lhcnksIHJldm9jYXRpb25zIGZvciBhIGZ1bmRlcikuCmZ1bmMgQmFsYW5jZU9mKGFkZHIgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkJhbGFuY2VPZihhZGRyLlN0cmluZygpKSB9CgovLyBVc2Vyc1RvdGFsIHJldHVybnMgdGhlIHN1bSBvZiBhbGwgY2xhaW1hYmxlIGJhbGFuY2VzICh0aGUgVSB0ZXJtKS4KZnVuYyBVc2Vyc1RvdGFsKCkgaW50NjQgeyByZXR1cm4gbGVkZ2VyLlVzZXJzVG90YWwoKSB9CgovLyBGZWVzQWNjcnVlZCByZXR1cm5zIHRoZSBmZWUgcG90ICh0aGUgRiB0ZXJtKS4KZnVuYyBGZWVzQWNjcnVlZCgpIGludDY0IHsgcmV0dXJuIGxlZGdlci5GZWVzQWNjcnVlZCgpIH0KCi8vIExpYWJpbGl0aWVzIHJldHVybnMgZXZlcnl0aGluZyB0aGlzIHJlYWxtIG93ZXM6Ci8vIEVzY3Jvd1RvdGFsICsgVXNlcnNUb3RhbCArIEZlZXNBY2NydWVkLgpmdW5jIExpYWJpbGl0aWVzKCkgaW50NjQgeyByZXR1cm4gZXNjcm93VG90YWwgKyBsZWRnZXIuTGlhYmlsaXRpZXMoKSB9CgovLyBIZWxkIHJldHVybnMgdGhlIHVnbm90IGFjdHVhbGx5IGhlbGQgYXQgdGhpcyByZWFsbSdzIGFkZHJlc3MgKEgpLgpmdW5jIEhlbGQoKSBpbnQ2NCB7IHJldHVybiBjb2luaW8uSGVsZEF0KHNlbGYsIERlbm9tKSB9CgovLyBTdXJwbHVzIHJldHVybnMgSGVsZCgpIC0gTGlhYmlsaXRpZXMoKSAodGhlIFMgdGVybSkuCmZ1bmMgU3VycGx1cygpIGludDY0IHsgcmV0dXJuIEhlbGQoKSAtIExpYWJpbGl0aWVzKCkgfQoKLy8gQWRkcmVzcyByZXR1cm5zIHRoaXMgcmVhbG0ncyBhZGRyZXNzICh0aGUgZXNjcm93IHRhcmdldCkuCmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgeyByZXR1cm4gc2VsZiB9CgovLyBIZWlnaHQgcmV0dXJucyB0aGUgY3VycmVudCBjaGFpbiBoZWlnaHQuIERlbGF5cyBpbiBGdW5kJ3Mgc3BlYyBhcmUKLy8gcmVsYXRpdmUgdG8gdGhlIGhlaWdodCBhdCB3aGljaCBGdW5kIGV4ZWN1dGVzLCBzbyB0aGlzIGlzIGFuIGFpZCBmb3IKLy8gY29tcG9zaW5nIGEgc3BlYywgbm90IGFuIGlucHV0IHRvIG9uZS4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tIHJlbmRlciAtLS0KCi8vIFJlbmRlciBzaG93cyB0aGUgcmVhbG0gYXQgIiIgYW5kIGEgc2NoZWR1bGUgZGV0YWlsIGF0ICI8aWQ+Ii4gRnJlZSB0ZXh0Ci8vICh0aXRsZXMgYXJlIGNoYXJzZXQtcmVzdHJpY3RlZDsgbWVtb3MgYXJlIG5vdCkgcGFzc2VzIHRocm91Z2ggdGhlCi8vIGVjb3N5c3RlbSBzYW5pdGl6ZXIgYmVmb3JlIGl0IHJlYWNoZXMgbWFya2Rvd24uCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgcGF0aCAhPSAiIiB7CgkJcmV0dXJuIHJlbmRlclNjaGVkdWxlKHBhdGgpCgl9CgloZWxkIDo9IEhlbGQoKQoJbGlhYiA6PSBMaWFiaWxpdGllcygpCglzdGF0dXMgOj0gIk9LIgoJaWYgaGVsZCA8IGxpYWIgewoJCXN0YXR1cyA9ICJWSU9MQVRFRCIKCX0KCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCglvdXQgOj0gIiMgVmVzdGluZyDigJQgZGF0ZWQgdHJhbmNoZSBkaXNidXJzZW1lbnRcblxuIgoJb3V0ICs9ICJFc2Nyb3dlZCBHTk9UIHJlbGVhc2VkIGluICoqZGlzY3JldGUsIGluZGl2aWR1YWxseSBkYXRlZCB0cmFuY2hlcyoqIOKAlCBub3QgYnkgIgoJb3V0ICs9ICJsaW5lYXIgYWNjcnVhbC4gQSB0cmFuY2hlIGlzIHdvcnRoIG5vdGhpbmcgYmVmb3JlIGl0cyBkdWUgaGVpZ2h0IGFuZCBpdHMgZnVsbCAiCglvdXQgKz0gImFtb3VudCBmcm9tIHRoYXQgaGVpZ2h0IG9uLlxuXG4iCglvdXQgKz0gIlNjaGVkdWxlIGFuZCBleGFjdGx5LW9uY2UgcmVsZWFzZSB2aWEgYGR1ZWJvb2tgOyBjb2luIGN1c3RvZHkgdmlhIGBjb2luaW9gOyAiCglvdXQgKz0gImFjY291bnRpbmcgdmlhIGBmZWVsZWRnZXJgLlxuXG4iCglvdXQgKz0gIiMjIENvbmZpZ3VyYXRpb25cblxuIgoJb3V0ICs9ICItIGZlZSBmb3IgbmV3IHNjaGVkdWxlczogIiArIGl0b2EoZmVlQnBzKSArICIgYnBzIChjYXAgIiArIGl0b2EoTWF4RmVlQnBzKSArCgkJIiBicHM7IGVhY2ggc2NoZWR1bGUga2VlcHMgdGhlIGZlZSBzbmFwc2hvdHRlZCBhdCBmdW5kaW5nKVxuIgoJb3V0ICs9ICItIHRyYW5jaGVzIHBlciBzY2hlZHVsZTogdXAgdG8gIiArIGl0b2EoTWF4VHJhbmNoZXMpICsgIlxuIgoJb3V0ICs9ICItIHBlbmRpbmcgdHJhbmNoZXMgcmVhbG0td2lkZTogIiArIGl0b2EoaW50NjQoYm9vay5PcGVuQ291bnQoKSkpICsgIiBvZiAiICsKCQlpdG9hKGludDY0KE1heE9wZW5UcmFuY2hlcykpICsgIlxuIgoJb3V0ICs9ICItIHBlbmRpbmcgdHJhbmNoZXMgcGVyIGZ1bmRlcjogdXAgdG8gIiArIGl0b2EoaW50NjQoTWF4T3BlblBlckZ1bmRlcikpICsKCQkiICgiICsgaXRvYShpbnQ2NChvcGVuQnlGdW5kZXIuU2l6ZSgpKSkgKyAiIGZ1bmRlcihzKSBob2xkIGF0IGxlYXN0IG9uZSlcbiIKCW91dCArPSAiLSBkZWxheSByYW5nZTogIiArIGl0b2EoTWluRGVsYXlCbG9ja3MpICsgIiB0byAiICsgaXRvYShNYXhEZWxheUJsb2NrcykgKyAiIGJsb2Nrc1xuIgoJb3V0ICs9ICItIGZlZSByZWNpcGllbnQ6ICIgKyBmZWVSZWNpcGllbnQuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gIi0gYWRtaW46ICIgKyBhZG1pbi5TdHJpbmcoKSArICJcbiIKCW91dCArPSAiLSBjdXJyZW50IGhlaWdodDogIiArIGl0b2Eobm93KSArICJcblxuIgoJb3V0ICs9ICIjIyBBY2NvdW50aW5nIChIID09IEUgKyBVICsgRiArIFMpXG5cbiIKCW91dCArPSAiLSBlc2Nyb3dlZCBpbiBwZW5kaW5nIHRyYW5jaGVzIChFKTogIiArIGl0b2EoZXNjcm93VG90YWwpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gY2xhaW1hYmxlIChVKTogIiArIGl0b2EobGVkZ2VyLlVzZXJzVG90YWwoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBmZWVzIGFjY3J1ZWQgKEYpOiAiICsgaXRvYShsZWRnZXIuRmVlc0FjY3J1ZWQoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBoZWxkIChIKTogIiArIGl0b2EoaGVsZCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBjb25zZXJ2YXRpb246ICIgKyBzdGF0dXMgKyAiXG5cbiIKCW91dCArPSAiIyMgTGF0ZXN0IHNjaGVkdWxlc1xuXG4iCglpZiBuZXh0U2NoZWR1bGVJRCA9PSAwIHsKCQlvdXQgKz0gIk5vIHNjaGVkdWxlcyB5ZXQuXG4iCgkJcmV0dXJuIG91dAoJfQoJc2hvd24gOj0gMAoJc2NoZWR1bGVzLlJldmVyc2VJdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCXMgOj0gdi4oKnNjaGVkdWxlKQoJCWtpbmQgOj0gImlycmV2b2NhYmxlIgoJCWlmIHMucmV2b2NhYmxlIHsKCQkJa2luZCA9ICJyZXZvY2FibGUiCgkJfQoJCW91dCArPSAiLSBbIyIgKyBpdG9hKHMuaWQpICsgIl0oL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS92ZXN0aW5nOiIgKwoJCQlpdG9hKHMuaWQpICsgIikgIiArIHMudGl0bGUgKyAiIOKAlCAiICsgaXRvYShzLnRvdGFsKSArIERlbm9tICsgIiBpbiAiICsKCQkJaXRvYShpbnQ2NChsZW4ocy50cmFuY2hlSURzKSkpICsgIiB0cmFuY2hlcyAoIiArIGl0b2Eocy5wZW5kaW5nKSArICIgcGVuZGluZywgIiArCgkJCWtpbmQgKyAiKVxuIgoJCXNob3duKysKCQlyZXR1cm4gc2hvd24gPj0gMjAKCX0pCglyZXR1cm4gb3V0Cn0KCmZ1bmMgcmVuZGVyU2NoZWR1bGUocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocGF0aCwgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gaW52YWxpZCBzY2hlZHVsZSBpZFxuIgoJfQoJdiA6PSBzY2hlZHVsZXMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gIj4gWyFXQVJOSU5HXVxuPiB1bmtub3duIHNjaGVkdWxlIGlkXG4iCgl9CglzIDo9IHYuKCpzY2hlZHVsZSkKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCXZlc3RlZCwgdW52ZXN0ZWQgOj0gVmVzdGVkT2Yocy5pZCkKCglvdXQgOj0gIiMgU2NoZWR1bGUgIyIgKyBpdG9hKHMuaWQpICsgIjogIiArIHMudGl0bGUgKyAiXG5cbiIKCW91dCArPSAiLSBmdW5kZXI6ICIgKyBzLmZ1bmRlci5TdHJpbmcoKSArICJcbiIKCW91dCArPSAiLSBiZW5lZmljaWFyeTogIiArIHMuYmVuZWZpY2lhcnkuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gIi0gdG90YWw6ICIgKyBpdG9hKHMudG90YWwpICsgRGVub20gKyAiIGluICIgKyBpdG9hKGludDY0KGxlbihzLnRyYW5jaGVJRHMpKSkgKyAiIHRyYW5jaGVzXG4iCglvdXQgKz0gIi0gZmVlIChzbmFwc2hvdCk6ICIgKyBpdG9hKHMuZmVlQnBzKSArICIgYnBzXG4iCglpZiBzLnJldm9jYWJsZSB7CgkJb3V0ICs9ICItIHJldm9jYWJsZSBieSB0aGUgZnVuZGVyIOKAlCBidXQgb25seSBmb3IgdHJhbmNoZXMgdGhhdCBhcmUgTk9UIHlldCBkdWVcbiIKCX0gZWxzZSB7CgkJb3V0ICs9ICItICoqaXJyZXZvY2FibGUqKjogdGhlIGZ1bmRlciBjYW5ub3QgcmVjbGFpbSBhbnkgdHJhbmNoZVxuIgoJfQoJb3V0ICs9ICItIGZ1bmRlZCBhdCBoZWlnaHQ6ICIgKyBpdG9hKHMuY3JlYXRlZEF0KSArICIgKG5vdyAiICsgaXRvYShub3cpICsgIilcbiIKCW91dCArPSAiLSB2ZXN0ZWQgKG5vIGxvbmdlciByZXZvY2FibGUpOiAiICsgaXRvYSh2ZXN0ZWQpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gdW52ZXN0ZWQgKHN0aWxsIHJldm9jYWJsZSBpZiByZXZvY2FibGUpOiAiICsgaXRvYSh1bnZlc3RlZCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSByZWxlYXNlZCBzbyBmYXI6ICIgKyBpdG9hKHMucmVsZWFzZWRHcm9zcykgKyBEZW5vbSArCgkJIjsgcmV2b2tlZDogIiArIGl0b2Eocy5yZXZva2VkVG90YWwpICsgRGVub20gKyAiXG5cbiIKCglvdXQgKz0gIiMjIFRyYW5jaGVzXG5cbiIKCW91dCArPSAifCAjIHwgaWQgfCBhbW91bnQgfCBkdWUgYXQgfCBzdGF0dXMgfFxufC0tLXwtLS18LS0tfC0tLXwtLS18XG4iCglzaG93biA6PSAwCglmb3IgXywgZGlkIDo9IHJhbmdlIHMudHJhbmNoZUlEcyB7CgkJaWYgc2hvd24gPj0gTWF4TGlzdGVkIHsKCQkJb3V0ICs9ICJ8IOKApiB8IHwgfCB8ICgiICsgaXRvYShpbnQ2NChsZW4ocy50cmFuY2hlSURzKSktaW50NjQoc2hvd24pKSArICIgbW9yZSkgfFxuIgoJCQlicmVhawoJCX0KCQl0IDo9IHRyYW5jaGVzLkdldChwYWRVKGRpZCkpLigqdHJhbmNoZSkKCQlub3RlIDo9IHQuc3RhdHVzCgkJaWYgdC5zdGF0dXMgPT0gU3RhdHVzUGVuZGluZyAmJiBub3cgPj0gdC5kdWVBdCB7CgkJCW5vdGUgPSAiKipyZWxlYXNhYmxlIG5vdyoqIgoJCX0KCQlvdXQgKz0gInwgIiArIGl0b2EodC5zZXEpICsgIiB8ICIgKyB1dG9hKGRpZCkgKyAiIHwgIiArIGl0b2EodC5hbW91bnQpICsgRGVub20gKwoJCQkiIHwgIiArIGl0b2EodC5kdWVBdCkgKyAiIHwgIiArIG5vdGUgKyAiIHxcbiIKCQlzaG93bisrCgl9CglpZiBzLm1lbW8gIT0gIiIgewoJCW91dCArPSAiXG4jIyBNZW1vXG5cbiIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KHMubWVtbykgKyAiXG4iCgl9CglyZXR1cm4gb3V0Cn0KCi8vIC0tLSBpbnRlcm5hbHMgLS0tCgpmdW5jIGFzc2VydEFkbWluKGNhbGxlciBhZGRyZXNzKSB7CglpZiBjYWxsZXIgIT0gYWRtaW4gewoJCXBhbmljKCJhZG1pbiBvbmx5IikKCX0KfQoKLy8gYXNzZXJ0UmV2b2NhYmxlQnkgY2hlY2tzIGJvdGggaGFsdmVzIG9mIHRoZSByZXZvY2F0aW9uIGF1dGhvcml0eTogdGhlCi8vIHNjaGVkdWxlIG11c3QgaGF2ZSBiZWVuIGZ1bmRlZCByZXZvY2FibGUsIGFuZCB0aGUgY2FsbGVyIG11c3QgYmUgaXRzCi8vIGZ1bmRlci4KZnVuYyBhc3NlcnRSZXZvY2FibGVCeShzICpzY2hlZHVsZSwgY2FsbGVyIGFkZHJlc3MpIHsKCWlmICFzLnJldm9jYWJsZSB7CgkJcGFuaWMoInNjaGVkdWxlICIgKyBpdG9hKHMuaWQpICsgIiBpcyBpcnJldm9jYWJsZSIpCgl9CglpZiBjYWxsZXIgIT0gcy5mdW5kZXIgewoJCXBhbmljKCJvbmx5IHRoZSBmdW5kZXIgbWF5IHJldm9rZSIpCgl9Cn0KCmZ1bmMgbXVzdFNjaGVkdWxlKGlkIGludDY0KSAqc2NoZWR1bGUgewoJdiA6PSBzY2hlZHVsZXMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biBzY2hlZHVsZSBpZCIpCgl9CglyZXR1cm4gdi4oKnNjaGVkdWxlKQp9CgpmdW5jIG11c3RUcmFuY2hlKGRpZCB1aW50NjQpICp0cmFuY2hlIHsKCXYgOj0gdHJhbmNoZXMuR2V0KHBhZFUoZGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biB0cmFuY2hlIGlkIikKCX0KCXJldHVybiB2LigqdHJhbmNoZSkKfQoKLy8gb3Blbk9mIHJlcG9ydHMgaG93IG1hbnkgdHJhbmNoZXMgZnVuZGVyIGN1cnJlbnRseSBob2xkcyBwZW5kaW5nLiBBCi8vIG1pc3Npbmcga2V5IG1lYW5zIHplcm8sIHdoaWNoIGlzIHRoZSBzYW1lIHRoaW5nOiBhZGRPcGVuIHJlbW92ZXMgdGhlCi8vIGVudHJ5IHdoZW4gdGhlIGNvdW50IHJlYWNoZXMgemVyby4KZnVuYyBvcGVuT2YoZnVuZGVyIGFkZHJlc3MpIGludDY0IHsKCXYgOj0gb3BlbkJ5RnVuZGVyLkdldChmdW5kZXIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB2LihpbnQ2NCkKfQoKLy8gYWRkT3BlbiBhZGp1c3RzIGZ1bmRlcidzIHBlbmRpbmctdHJhbmNoZSBjb3VudCBieSBkZWx0YSwgd2hpY2ggbWF5IGJlCi8vIG5lZ2F0aXZlLiBFdmVyeSBpbmNyZW1lbnQgaGFwcGVucyBpbiBGdW5kIGFuZCBldmVyeSBkZWNyZW1lbnQgaXMgcGFpcmVkCi8vIHdpdGggYSBwZW5kaW5nIC0+IHRlcm1pbmFsIHRyYW5zaXRpb24sIHNvIHRoZSBjb3VudCB0cmFja3MgZXhhY3RseSB0aGUKLy8gdHJhbmNoZXMgb3Blbk9mIGNsYWltcy4KZnVuYyBhZGRPcGVuKGZ1bmRlciBhZGRyZXNzLCBkZWx0YSBpbnQ2NCkgewoJbmV4dCA6PSBvcGVuT2YoZnVuZGVyKSArIGRlbHRhCglpZiBuZXh0IDwgMCB7CgkJLy8gVW5yZWFjaGFibGU6IGEgdHJhbmNoZSBjYW4gb25seSBsZWF2ZSBTdGF0dXNQZW5kaW5nIG9uY2UsIGFuZCBpdAoJCS8vIHdhcyBjb3VudGVkIHdoZW4gaXQgd2FzIGNyZWF0ZWQuIEtlcHQgYXMgYSBjb25zaXN0ZW5jeSBhc3NlcnRpb24KCQkvLyDigJQgaWYgaXQgZmlyZXMsIHRoaXMgY291bnRlciBoYXMgZGl2ZXJnZWQgZnJvbSB0aGUgdHJhbmNoZSByZWNvcmRzCgkJLy8gYW5kIHRoZSB0cmFuc2FjdGlvbiBtdXN0IG5vdCBwcm9jZWVkLgoJCXBhbmljKCJpbnRlcm5hbDogZnVuZGVyIG9wZW4tdHJhbmNoZSBjb3VudCB3ZW50IG5lZ2F0aXZlIikKCX0KCWlmIG5leHQgPT0gMCB7CgkJb3BlbkJ5RnVuZGVyLlJlbW92ZShmdW5kZXIuU3RyaW5nKCkpCgkJcmV0dXJuCgl9CglvcGVuQnlGdW5kZXIuU2V0KGZ1bmRlci5TdHJpbmcoKSwgbmV4dCkKfQoKLy8gbXVzdElEIGNvbnZlcnRzIGFuIGVudHJ5cG9pbnQncyBpbnQ2NCB0cmFuY2hlIGlkIHRvIGR1ZWJvb2sncyB1aW50NjQsCi8vIHJlamVjdGluZyB0aGUgbm9uLXBvc2l0aXZlIHZhbHVlcyBkdWVib29rIG5ldmVyIGlzc3Vlcy4KZnVuYyBtdXN0SUQoaWQgaW50NjQpIHVpbnQ2NCB7CglpZiBpZCA8PSAwIHsKCQlwYW5pYygidHJhbmNoZSBpZCBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCXJldHVybiB1aW50NjQoaWQpCn0KCi8vIHBhcnNlU3BlYyBwYXJzZXMgImRlbGF5OmFtb3VudCxkZWxheTphbW91bnQs4oCmIiBpbnRvIHBhcmFsbGVsIHNsaWNlcywKLy8gZW5mb3JjaW5nIGV2ZXJ5IGJvdW5kIGJlZm9yZSBhbnkgc3RhdGUgaXMgdG91Y2hlZC4gRGVsYXlzIG11c3QgYmUKLy8gc3RyaWN0bHkgaW5jcmVhc2luZzsgYW1vdW50cyBtdXN0IGJlIHBvc2l0aXZlLiBOb3RoaW5nIGhlcmUgY29uc3VsdHMgb3IKLy8gbXV0YXRlcyByZWFsbSBzdGF0ZSwgc28gYSBtYWxmb3JtZWQgc3BlYyBpcyByZWplY3RlZCB3aXRoIHRoZSBlc2Nyb3cKLy8gc3RpbGwgdW50b3VjaGVkICh0aGUgd2hvbGUgdHJhbnNhY3Rpb24gYWJvcnRzIHJlZ2FyZGxlc3MpLgpmdW5jIHBhcnNlU3BlYyhzcGVjIHN0cmluZykgKGRlbGF5cywgYW1vdW50cyBbXWludDY0KSB7CglpZiBzcGVjID09ICIiIHsKCQlwYW5pYygic3BlYyBtdXN0IGxpc3QgYXQgbGVhc3Qgb25lIHRyYW5jaGUgYXMgXCJkZWxheTphbW91bnRcIiIpCgl9CglpZiBsZW4oc3BlYykgPiBNYXhTcGVjTGVuIHsKCQlwYW5pYygic3BlYyBleGNlZWRzICIgKyBpdG9hKE1heFNwZWNMZW4pICsgIiBieXRlcyIpCgl9CglwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KHNwZWMsICIsIikKCWlmIGxlbihwYXJ0cykgPiBNYXhUcmFuY2hlcyB7CgkJcGFuaWMoImEgc2NoZWR1bGUgbWF5IGhhdmUgYXQgbW9zdCAiICsgaXRvYShNYXhUcmFuY2hlcykgKyAiIHRyYW5jaGVzLCBnb3QgIiArCgkJCWl0b2EoaW50NjQobGVuKHBhcnRzKSkpKQoJfQoKCXByZXYgOj0gaW50NjQoLTEpCglmb3IgaSwgcGFydCA6PSByYW5nZSBwYXJ0cyB7CgkJYXQgOj0gc3RyaW5ncy5JbmRleChwYXJ0LCAiOiIpCgkJaWYgYXQgPCAwIHsKCQkJcGFuaWMoInRyYW5jaGUgIiArIGl0b2EoaW50NjQoaSsxKSkgKyAiOiBleHBlY3RlZCBcImRlbGF5OmFtb3VudFwiLCBnb3QgXCIiICsgcGFydCArICJcIiIpCgkJfQoJCWRlbGF5LCBlcnIgOj0gc3RyY29udi5QYXJzZUludChwYXJ0WzphdF0sIDEwLCA2NCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoInRyYW5jaGUgIiArIGl0b2EoaW50NjQoaSsxKSkgKyAiOiBkZWxheSBpcyBub3QgYW4gaW50ZWdlciIpCgkJfQoJCWFtb3VudCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocGFydFthdCsxOl0sIDEwLCA2NCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoInRyYW5jaGUgIiArIGl0b2EoaW50NjQoaSsxKSkgKyAiOiBhbW91bnQgaXMgbm90IGFuIGludGVnZXIiKQoJCX0KCQlpZiBkZWxheSA8IE1pbkRlbGF5QmxvY2tzIHx8IGRlbGF5ID4gTWF4RGVsYXlCbG9ja3MgewoJCQlwYW5pYygidHJhbmNoZSAiICsgaXRvYShpbnQ2NChpKzEpKSArICI6IGRlbGF5ICIgKyBpdG9hKGRlbGF5KSArCgkJCQkiIG91dHNpZGUgWyIgKyBpdG9hKE1pbkRlbGF5QmxvY2tzKSArICIsICIgKyBpdG9hKE1heERlbGF5QmxvY2tzKSArICJdIikKCQl9CgkJaWYgZGVsYXkgPD0gcHJldiB7CgkJCXBhbmljKCJ0cmFuY2hlICIgKyBpdG9hKGludDY0KGkrMSkpICsgIjogZGVsYXlzIG11c3QgYmUgc3RyaWN0bHkgaW5jcmVhc2luZyAoIiArCgkJCQlpdG9hKGRlbGF5KSArICIgZm9sbG93cyAiICsgaXRvYShwcmV2KSArICIpOyBjb21iaW5lIHNhbWUtaGVpZ2h0IHBheW1lbnRzIikKCQl9CgkJaWYgYW1vdW50IDw9IDAgewoJCQlwYW5pYygidHJhbmNoZSAiICsgaXRvYShpbnQ2NChpKzEpKSArICI6IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCQl9CgkJcHJldiA9IGRlbGF5CgkJZGVsYXlzID0gYXBwZW5kKGRlbGF5cywgZGVsYXkpCgkJYW1vdW50cyA9IGFwcGVuZChhbW91bnRzLCBhbW91bnQpCgl9CglyZXR1cm4gZGVsYXlzLCBhbW91bnRzCn0KCi8vIGFzc2VydFZhbGlkVGl0bGUgYm91bmRzIGxlbmd0aCBhbmQgcmVzdHJpY3RzIHRoZSBjaGFyc2V0IHNvIHRpdGxlcyBhcmUKLy8gbGlzdC1zYWZlIGluIFJlbmRlciB3aXRob3V0IGVzY2FwaW5nLgpmdW5jIGFzc2VydFZhbGlkVGl0bGUodGl0bGUgc3RyaW5nKSB7CglpZiBsZW4odGl0bGUpID09IDAgfHwgbGVuKHRpdGxlKSA+IE1heFRpdGxlTGVuIHsKCQlwYW5pYygidGl0bGUgbXVzdCBiZSAxLSIgKyBpdG9hKE1heFRpdGxlTGVuKSArICIgY2hhcmFjdGVycyIpCgl9Cglmb3IgaSA6PSAwOyBpIDwgbGVuKHRpdGxlKTsgaSsrIHsKCQljIDo9IHRpdGxlW2ldCgkJc3dpdGNoIHsKCQljYXNlIGMgPj0gJ2EnICYmIGMgPD0gJ3onOgoJCWNhc2UgYyA+PSAnQScgJiYgYyA8PSAnWic6CgkJY2FzZSBjID49ICcwJyAmJiBjIDw9ICc5JzoKCQljYXNlIGMgPT0gJyAnIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy0nOgoJCWRlZmF1bHQ6CgkJCXBhbmljKCJ0aXRsZSBtYXkgb25seSBjb250YWluIGxldHRlcnMsIGRpZ2l0cywgc3BhY2UsIF8gYW5kIC0iKQoJCX0KCX0KfQoKLy8gcGFkSUQgcmVuZGVycyBhIHNjaGVkdWxlIGlkIGFzIGEgZml4ZWQtd2lkdGgga2V5IHNvIGF2bCBpdGVyYXRpb24gb3JkZXIKLy8gaXMgbnVtZXJpYyBvcmRlci4KZnVuYyBwYWRJRChpZCBpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5Gb3JtYXRJbnQoaWQsIDEwKQoJZm9yIGxlbihzKSA8IDEyIHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIHMKfQoKLy8gcGFkVSByZW5kZXJzIGEgZGVmZXJyYWwgaWQgYXMgYSBmaXhlZC13aWR0aCBrZXkuIDIwIGRpZ2l0cyBjb3ZlcnMgdGhlCi8vIHdob2xlIHVpbnQ2NCByYW5nZSwgc28gdHJhbmNoZSBpdGVyYXRpb24gaXMgbnVtZXJpYyBvcmRlciB0b28uCmZ1bmMgcGFkVShpZCB1aW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApCglmb3IgbGVuKHMpIDwgMjAgewoJCXMgPSAiMCIgKyBzCgl9CglyZXR1cm4gcwp9CgpmdW5jIGl0b2EobiBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSB9CgpmdW5jIHV0b2EobiB1aW50NjQpIHN0cmluZyB7IHJldHVybiBzdHJjb252LkZvcm1hdFVpbnQobiwgMTApIH0KCmZ1bmMgYnRvYShiIGJvb2wpIHN0cmluZyB7CglpZiBiIHsKCQlyZXR1cm4gInRydWUiCgl9CglyZXR1cm4gImZhbHNlIgp9CgpmdW5jIGNoZWNrZWRBZGQoYSwgYiBpbnQ2NCkgKGludDY0LCBib29sKSB7CglzdW0gOj0gYSArIGIKCWlmIChiID4gMCAmJiBzdW0gPCBhKSB8fCAoYiA8IDAgJiYgc3VtID4gYSkgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHN1bSwgdHJ1ZQp9ChrX6AIKEHZlc3RpbmdfdGVzdC5nbm8SwegCcGFja2FnZSB2ZXN0aW5nCgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJImNoYWluL3J1bnRpbWUiCgoJImduby5sYW5kL3AvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9kdWVib29rIgoJImduby5sYW5kL3AvbnQvdGVzdHV0aWxzL3YwIgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKKQoKdmFyICgKCXRlc3RBZG1pbiA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygidmVzdGFkbWluIikKCWZ1bmRlcjEgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygidmZ1bmRlcjEiKQoJZnVuZGVyMiAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJ2ZnVuZGVyMiIpCgliZW5lMSAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInZiZW5lMSIpCgliZW5lMiAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInZiZW5lMiIpCgltYWxsb3J5ICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInZtYWxsb3J5IikKCXN0cmFuZ2VyICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygidnN0cmFuZ2VyIikKKQoKLy8gSEFSTkVTUyBOT1RFUywgY2FycmllZCBmcm9tIHRoZSBkdWVib29rX2RlbW8gYW5kIGdyYW50cyBzdWl0ZXMgYW5kCi8vIHJlLXZlcmlmaWVkIGhlcmU6Ci8vCi8vICAgLSB0ZXN0aW5nLlNldFJlYWxtIHJlY29yZHMgdGhlIG92ZXJyaWRlIHBlciBGUkFNRSBJTkRFWC4gQSBoZWxwZXIgdGhhdAovLyAgICAgc3RhZ2VzIGEgY2FsbGVyIGFuZCBSRVRVUk5TIGxlYXZlcyB0aGUgdGVzdCBmcmFtZSB1bnRvdWNoZWQsIHNvIHRoZQovLyAgICAgcHJldmlvdXMgc3RhZ2luZyBzaWxlbnRseSB3aW5zIGFuZCBldmVyeSBjYWxsZXIgbG9va3MgbGlrZSB0aGUgc2FtZQovLyAgICAgYWNjb3VudCDigJQgd2hpY2ggaGlkZXMgZXhhY3RseSB0aGUgYXV0aG9yaXphdGlvbiBidWdzIHRoZXNlIHRlc3RzCi8vICAgICBleGlzdCB0byBmaW5kLiBFdmVyeSBjYWxsZXIgYmVsb3cgaXMgdGhlcmVmb3JlIHN0YWdlZCBJTkxJTkUgaW4gdGhlCi8vICAgICBmcmFtZSB0aGF0IG1ha2VzIHRoZSBjYWxsLiBUaGUgc3RhZ2luZyBoZWxwZXJzIChmdW5kQXMsIGNhbGxBcykgYXJlCi8vICAgICBzYWZlIG9ubHkgYmVjYXVzZSB0aGV5IG1ha2UgdGhlaXIgY2FsbCBmcm9tIGluc2lkZSB0aGVpciBvd24gZnJhbWUuCi8vCi8vICAgLSBSZWFsbSBnbG9iYWxzIFBFUlNJU1QgYWNyb3NzIHRlc3RzIGluIHRoZSB0ZXN0IFZNLCB3aGlsZSBiYW5rZXIKLy8gICAgIHN0YXRlIHJlc2V0cyBwZXIgdGVzdC4gVGhlIG1vbmV0YXJ5IGludmFyaWFudCBpcyB0aGVyZWZvcmUgYXNzZXJ0ZWQKLy8gICAgIGluIERFTFRBIGZvcm0gYWZ0ZXIgcmUtc2VlZGluZyBjYXJyaWVkIGxpYWJpbGl0aWVzIChiZWdpbigpKS4KLy8KLy8gICAtIEEgcGFuaWMgY2F1Z2h0IGJ5IHVhc3NlcnQgZG9lcyBOT1Qgcm9sbCBiYWNrIHJlYWxtIGdsb2JhbHMgaGVyZSwKLy8gICAgIHdoZXJlYXMgb24tY2hhaW4gaXQgYWJvcnRzIGFuZCByZXZlcnRzIHRoZSB3aG9sZSB0cmFuc2FjdGlvbi4gRXZlcnkKLy8gICAgIGFib3J0IGFzc2VydGVkIGJlbG93IGhhcHBlbnMgc3RyaWN0bHkgQkVGT1JFIHRoaXMgcmVhbG0gd3JpdGVzIGFueQovLyAgICAgc3RhdGUsIHNvIHRoZSBkaXN0aW5jdGlvbiBuZXZlciBiaXRlcy4gVGhlIG9uZSBwYXRoIHdoZXJlIGl0IGNvdWxkIOKAlAovLyAgICAgYSBib29rLlNjaGVkdWxlIGZhaWx1cmUgcGFydHdheSB0aHJvdWdoIEZ1bmQncyBsb29wIOKAlCBpcyB1bnJlYWNoYWJsZQovLyAgICAgYmVjYXVzZSBGdW5kIHByZS1jaGVja3MgY2FwYWNpdHksIGFuZCBpcyBub3QgYXNzZXJ0ZWQgaGVyZS4KLy8KLy8gICAtIFRlc3RzIG11c3Qgbm90IGFzc3VtZSBhIGZpeGVkIHN0YXJ0aW5nIGhlaWdodCwgc2NoZWR1bGUgaWQsIG9yCi8vICAgICB0cmFuY2hlIGlkLiBUaGV5IHJlYWQgYWxsIHRocmVlIGFuZCByZWFzb24gaW4gZGVsdGFzLgpmdW5jIGluaXQoKSB7CglhZG1pbiA9IHRlc3RBZG1pbgoJZmVlUmVjaXBpZW50ID0gdGVzdEFkbWluCglzZWxmID0gY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS92ZXN0aW5nIikKfQoKLy8gLS0tIGhhcm5lc3MgLS0tCgp0eXBlIGJhc2VsaW5lIHN0cnVjdHsgaGVsZCwgZXNjcm93LCB1c2VycywgZmVlcyBpbnQ2NCB9CgpmdW5jIGJlZ2luKCkgYmFzZWxpbmUgewoJLy8gRGlzYXJtIGFueSBPcmlnaW5TZW5kIGEgcHJldmlvdXMgdGVzdCBsZWZ0IHN0YWdlZC4gVGhlIGVudmVsb3BlIGlzCgkvLyBwcm9jZXNzLWdsb2JhbCwgbm90IHBlci1mcmFtZSwgYW5kIGEgbGVmdG92ZXIgb25lIG1ha2VzIHRoZSBmaXJzdAoJLy8gbm9uLUZ1bmQgZW50cnlwb2ludCBvZiB0aGlzIHRlc3QgYWJvcnQgaW4gcmVqZWN0U3RyYXlTZW5kIOKAlCB3aGljaAoJLy8gbG9va3MgZXhhY3RseSBsaWtlIHRoZSBndWFyZCB3b3JraW5nIGFuZCBpcyByZWFsbHkgdGhlIGhhcm5lc3MKCS8vIGxlYWtpbmcuIEVhY2ggdGVzdCBvcGVucyB3aXRoIGFuIGVtcHR5IGVudmVsb3BlLCBhcyBhIGZyZXNoIHR4IGRvZXMuCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJaWYgbCA6PSBMaWFiaWxpdGllcygpOyBsID4gMCB7CgkJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QobCkpCgl9CglyZXR1cm4gYmFzZWxpbmV7aGVsZDogSGVsZCgpLCBlc2Nyb3c6IEVzY3Jvd1RvdGFsKCksIHVzZXJzOiBVc2Vyc1RvdGFsKCksIGZlZXM6IEZlZXNBY2NydWVkKCl9Cn0KCi8vIGNvbnNlcnZlZCBhc3NlcnRzIM6USCA9PSDOlEUgKyDOlFUgKyDOlEYgKyBleHRyYVN1cnBsdXMuCmZ1bmMgKGIgYmFzZWxpbmUpIGNvbnNlcnZlZCh0ICp0ZXN0aW5nLlQsIGV4dHJhU3VycGx1cyBpbnQ2NCkgewoJdC5IZWxwZXIoKQoJZEggOj0gSGVsZCgpIC0gYi5oZWxkCglkRSA6PSBFc2Nyb3dUb3RhbCgpIC0gYi5lc2Nyb3cKCWRVIDo9IFVzZXJzVG90YWwoKSAtIGIudXNlcnMKCWRGIDo9IEZlZXNBY2NydWVkKCkgLSBiLmZlZXMKCWlmIGRIICE9IGRFK2RVK2RGK2V4dHJhU3VycGx1cyB7CgkJdC5GYXRhbGYoImNvbnNlcnZhdGlvbiB2aW9sYXRlZDogZEg9JWQgZEU9JWQgZFU9JWQgZEY9JWQgZFM9JWQiLCBkSCwgZEUsIGRVLCBkRiwgZXh0cmFTdXJwbHVzKQoJfQoJLy8gTk9UIGEgdGVzdCDigJQgYW4gaWRlbnRpdHkuIExpYWJpbGl0aWVzKCkgaXMgREVGSU5FRCBhcyBlc2Nyb3dUb3RhbCArCgkvLyBsZWRnZXIuTGlhYmlsaXRpZXMoKSwgYW5kIGxlZGdlci5MaWFiaWxpdGllcygpIGFzIHVzZXJzVG90YWwgKwoJLy8gZmVlc0FjY3J1ZWQsIHNvIGJvdGggc2lkZXMgYXJlIHRoZSBzYW1lIGV4cHJlc3Npb24gYW5kIHRoaXMgY2FuIG9ubHkKCS8vIGZhaWwgb24gaW50ZWdlciBvdmVyZmxvdy4gS2VwdCBkZWxpYmVyYXRlbHksIGFzIGFuIG92ZXJmbG93IHRyaXB3aXJlCgkvLyBhbmQgYXMgZXhlY3V0YWJsZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBkZWZpbml0aW9uOyB0aGUgcmVhbAoJLy8gY29uc2VydmF0aW9uIGNoZWNrIGlzIHRoZSBkSCBjb21wYXJpc29uIGFib3ZlLCB3aGljaCBpcyBhZ2FpbnN0IHRoZQoJLy8gYmFua2VyJ3MgYWN0dWFsIGJhbGFuY2UgYW5kIGNhbiBnZW51aW5lbHkgZmFpbC4KCWlmIExpYWJpbGl0aWVzKCkgIT0gRXNjcm93VG90YWwoKStVc2Vyc1RvdGFsKCkrRmVlc0FjY3J1ZWQoKSB7CgkJdC5GYXRhbGYoIkxpYWJpbGl0aWVzKCkgPSAlZCwgd2FudCBFK1UrRiIsIExpYWJpbGl0aWVzKCkpCgl9Cn0KCi8vIHBlbmRpbmdTdW0gcmVjb21wdXRlcyB0aGUgc3VtIG9mIGFtb3VudHMgb3ZlciBwZW5kaW5nIHRyYW5jaGVzIOKAlCB0aGUKLy8gYXBwbGljYXRpb24gaW52YXJpYW50IEUgPT0gzqMgcGVuZGluZy4KZnVuYyBwZW5kaW5nU3VtKCkgaW50NjQgewoJc3VtIDo9IGludDY0KDApCgl0cmFuY2hlcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCWlmIHQgOj0gdi4oKnRyYW5jaGUpOyB0LnN0YXR1cyA9PSBTdGF0dXNQZW5kaW5nIHsKCQkJc3VtICs9IHQuYW1vdW50CgkJfQoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiBzdW0KfQoKZnVuYyBwZW5kaW5nQ291bnQoKSBpbnQgewoJbiA6PSAwCgl0cmFuY2hlcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCWlmIHYuKCp0cmFuY2hlKS5zdGF0dXMgPT0gU3RhdHVzUGVuZGluZyB7CgkJCW4rKwoJCX0KCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gbgp9CgovLyBhcHBJbnZhcmlhbnQgYXNzZXJ0cyBCT1RIIHN0b3JlcyBhZ3JlZTogZXNjcm93VG90YWwgdHJhY2tzIHRoZSBwZW5kaW5nCi8vIHRyYW5jaGVzLCBhbmQgZHVlYm9vayBob2xkcyBleGFjdGx5IG9uZSBvcGVuIGRlZmVycmFsIHBlciBwZW5kaW5nCi8vIHRyYW5jaGUuIFRoZSBzZWNvbmQgaGFsZiBpcyB0aGUgY3Jvc3Mtc3RvcmUgY2hlY2sgdGhhdCBtYXR0ZXJzIG1vc3Qg4oCUCi8vIGEgdHJhbmNoZSB0aGlzIHJlYWxtIHRoaW5rcyBpcyBwZW5kaW5nIGJ1dCBkdWVib29rIGhhcyBjb25zdW1lZCB3b3VsZAovLyBiZSB1bnJlbGVhc2FibGUgZXNjcm93LCBhbmQgdGhlIHJldmVyc2Ugd291bGQgYmUgYSBkb3VibGUtc3BlbmQuCmZ1bmMgYXBwSW52YXJpYW50KHQgKnRlc3RpbmcuVCkgewoJdC5IZWxwZXIoKQoJaWYgZ290IDo9IHBlbmRpbmdTdW0oKTsgZ290ICE9IEVzY3Jvd1RvdGFsKCkgewoJCXQuRmF0YWxmKCJhcHAgaW52YXJpYW50IHZpb2xhdGVkOiBlc2Nyb3dUb3RhbD0lZCwgc3VtIHBlbmRpbmc9JWQiLCBFc2Nyb3dUb3RhbCgpLCBnb3QpCgl9CglpZiBnb3QgOj0gYm9vay5PcGVuQ291bnQoKTsgZ290ICE9IHBlbmRpbmdDb3VudCgpIHsKCQl0LkZhdGFsZigic3RvcmUgZGl2ZXJnZW5jZTogZHVlYm9vayBvcGVuPSVkLCBwZW5kaW5nIHRyYW5jaGVzPSVkIiwgZ290LCBwZW5kaW5nQ291bnQoKSkKCX0KCWFzc2VydE9wZW5Db3VudHModCkKCS8vIFBlci1zY2hlZHVsZSBib29ra2VlcGluZyBtdXN0IGFkZCB1cCB0byB0aGUgc2NoZWR1bGUgdG90YWwuCglmb3IgaWQgOj0gaW50NjQoMSk7IGlkIDw9IE51bVNjaGVkdWxlcygpOyBpZCsrIHsKCQlzIDo9IG11c3RTY2hlZHVsZShpZCkKCQlwZW5kIDo9IGludDY0KDApCgkJZm9yIF8sIGRpZCA6PSByYW5nZSBzLnRyYW5jaGVJRHMgewoJCQlpZiB0cmFuY2hlcy5HZXQocGFkVShkaWQpKS4oKnRyYW5jaGUpLnN0YXR1cyA9PSBTdGF0dXNQZW5kaW5nIHsKCQkJCXBlbmQgKz0gdHJhbmNoZXMuR2V0KHBhZFUoZGlkKSkuKCp0cmFuY2hlKS5hbW91bnQKCQkJfQoJCX0KCQlpZiBwZW5kK3MucmVsZWFzZWRHcm9zcytzLnJldm9rZWRUb3RhbCAhPSBzLnRvdGFsIHsKCQkJdC5GYXRhbGYoInNjaGVkdWxlICVkOiBwZW5kaW5nPSVkICsgcmVsZWFzZWQ9JWQgKyByZXZva2VkPSVkICE9IHRvdGFsPSVkIiwKCQkJCWlkLCBwZW5kLCBzLnJlbGVhc2VkR3Jvc3MsIHMucmV2b2tlZFRvdGFsLCBzLnRvdGFsKQoJCX0KCX0KfQoKLy8gYXNzZXJ0T3BlbkNvdW50cyByZWNvbXB1dGVzIGV2ZXJ5IGZ1bmRlcidzIHBlbmRpbmctdHJhbmNoZSBjb3VudCBmcm9tIHRoZQovLyB0cmFuY2hlIHJlY29yZHMgYW5kIGNvbXBhcmVzIGl0IHRvIHRoZSBvcGVuQnlGdW5kZXIgY291bnRlci4gVGhpcyBpcyB0aGUKLy8gVEhJUkQgY3Jvc3Mtc3RvcmUgY2hlY2ssIGFuZCBpdCBlYXJucyBpdHMgcGxhY2U6IHRoZSBjb3VudGVyIGdhdGVzIEZ1bmQsCi8vIHNvIGEgY291bnRlciB0aGF0IGRyaWZ0cyBoaWdoIGxvY2tzIGFuIGhvbmVzdCBmdW5kZXIgb3V0IG9mIGEgcmVhbG0gdGhhdAovLyBoYXMgcm9vbSwgYW5kIG9uZSB0aGF0IGRyaWZ0cyBsb3cgc2lsZW50bHkgZGVmZWF0cyB0aGUgcGVyLWZ1bmRlciBjYXAuCi8vIEl0IGFsc28gYXNzZXJ0cyB0aGUgemVyby1lbnRyeSByZW1vdmFsLCBiZWNhdXNlIGEgdHJlZSB0aGF0IGFjY3VtdWxhdGVzIGEKLy8gZGVhZCAwIHBlciBhZGRyZXNzIHRoYXQgZXZlciBmdW5kZWQgYW55dGhpbmcgaXMgYW4gdW5ib3VuZGVkIGdyb3d0aCBwYXRoLgpmdW5jIGFzc2VydE9wZW5Db3VudHModCAqdGVzdGluZy5UKSB7Cgl0LkhlbHBlcigpCgoJd2FudCA6PSBtYXBbc3RyaW5nXWludDY0e30KCXRyYW5jaGVzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJdHIgOj0gdi4oKnRyYW5jaGUpCgkJaWYgdHIuc3RhdHVzID09IFN0YXR1c1BlbmRpbmcgewoJCQl3YW50W211c3RTY2hlZHVsZSh0ci5zY2hlZHVsZUlEKS5mdW5kZXIuU3RyaW5nKCldKysKCQl9CgkJcmV0dXJuIGZhbHNlCgl9KQoKCWdvdCA6PSBtYXBbc3RyaW5nXWludDY0e30KCXRvdGFsIDo9IGludDY0KDApCglvcGVuQnlGdW5kZXIuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoayBzdHJpbmcsIHYgYW55KSBib29sIHsKCQluIDo9IHYuKGludDY0KQoJCWlmIG4gPT0gMCB7CgkJCXQuRmF0YWxmKCJvcGVuQnlGdW5kZXIgaG9sZHMgYSB6ZXJvIGVudHJ5IGZvciAlczsgaXQgbXVzdCBiZSByZW1vdmVkIGF0IHplcm8iLCBrKQoJCX0KCQlnb3Rba10gPSBuCgkJdG90YWwgKz0gbgoJCXJldHVybiBmYWxzZQoJfSkKCglpZiBsZW4oZ290KSAhPSBsZW4od2FudCkgewoJCXQuRmF0YWxmKCJvcGVuQnlGdW5kZXIgdHJhY2tzICVkIGZ1bmRlcihzKSwgcmVjb21wdXRlZCAlZCIsIGxlbihnb3QpLCBsZW4od2FudCkpCgl9Cglmb3IgaywgdyA6PSByYW5nZSB3YW50IHsKCQlpZiBnb3Rba10gIT0gdyB7CgkJCXQuRmF0YWxmKCJmdW5kZXIgJXM6IGNvdW50ZXIgc2F5cyAlZCwgdHJhbmNoZSByZWNvcmRzIHNheSAlZCIsIGssIGdvdFtrXSwgdykKCQl9Cgl9CglpZiB0b3RhbCAhPSBpbnQ2NChwZW5kaW5nQ291bnQoKSkgewoJCXQuRmF0YWxmKCJvcGVuQnlGdW5kZXIgdG90YWxzICVkLCBwZW5kaW5nIHRyYW5jaGVzICVkIiwgdG90YWwsIHBlbmRpbmdDb3VudCgpKQoJfQoJaWYgZ290IDo9IEZ1bmRlcnNXaXRoT3BlblRyYW5jaGVzKCk7IGdvdCAhPSBsZW4od2FudCkgewoJCXQuRmF0YWxmKCJGdW5kZXJzV2l0aE9wZW5UcmFuY2hlcygpPSVkLCByZWNvbXB1dGVkICVkIiwgZ290LCBsZW4od2FudCkpCgl9Cn0KCmZ1bmMgY29pbnNPZihhZGRyIGFkZHJlc3MpIGludDY0IHsKCXJldHVybiBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2luKGFkZHIsIERlbm9tKQp9CgpmdW5jIHVnbm90KG4gaW50NjQpIGNoYWluLkNvaW5zIHsKCXJldHVybiBjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKERlbm9tLCBuKSkKfQoKLy8gZnVuZEFzIHBlcmZvcm1zIGEgY2hhaW4tZmFpdGhmdWwgZnVuZGVkIEZ1bmQuIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlCi8vIHRlc3QgZnVuY3Rpb24ncyBvd24gZnJhbWUuCi8vCi8vIFRoZSBPcmlnaW5TZW5kIGVudmVsb3BlIGlzIE5PVCBwZXItZnJhbWU6IHdoYXRldmVyIHdhcyBsYXN0IHN0YWdlZCBzdGF5cwovLyB2aXNpYmxlIHRvIGV2ZXJ5IGxhdGVyIGNhbGwgaW4gdGhlIHByb2Nlc3MuIEZ1bmQgaXMgdGhlIG9uZSBlbnRyeXBvaW50Ci8vIHRoYXQgYWNjZXB0cyBjb2lucywgc28gbGVhdmluZyB0aGUgZW52ZWxvcGUgYXJtZWQgbWFrZXMgdGhlIHZlcnkgbmV4dAovLyBSZWxlYXNlL1Jldm9rZSBhYm9ydCBpbiByZWplY3RTdHJheVNlbmQgaW5zdGVhZCBvZiByZWFjaGluZyB0aGUgbG9naWMKLy8gdW5kZXIgdGVzdC4gQ2xlYXIgaXQgb24gdGhlIHdheSBvdXQg4oCUIGEgcmVhbCB0cmFuc2FjdGlvbiBlbmRzIGhlcmUuCmZ1bmMgZnVuZEFzKGN1ciByZWFsbSwgZnJvbSwgYmVuZWZpY2lhcnkgYWRkcmVzcywgdG90YWwgaW50NjQsIHRpdGxlLCBtZW1vLCBzcGVjIHN0cmluZywgcmV2b2NhYmxlIGJvb2wpIGludDY0IHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnJvbSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihmcm9tKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KHRvdGFsKSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KHRvdGFsKSkKCWlkIDo9IEZ1bmQoY3Jvc3MoY3VyKSwgYmVuZWZpY2lhcnksIHRpdGxlLCBtZW1vLCBzcGVjLCByZXZvY2FibGUsIE1heEZlZUJwcykKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglyZXR1cm4gaWQKfQoKLy8gdHJhbmNoZUlEc09mIHJldHVybnMgYSBzY2hlZHVsZSdzIHRyYW5jaGUgaWRzIGFzIGludDY0LCBpbiBvcmRlci4KZnVuYyB0cmFuY2hlSURzT2YoaWQgaW50NjQpIFtdaW50NjQgewoJcyA6PSBtdXN0U2NoZWR1bGUoaWQpCglvdXQgOj0gW11pbnQ2NHt9Cglmb3IgXywgZGlkIDo9IHJhbmdlIHMudHJhbmNoZUlEcyB7CgkJb3V0ID0gYXBwZW5kKG91dCwgaW50NjQoZGlkKSkKCX0KCXJldHVybiBvdXQKfQoKLy8gLS0tIHRlc3RzIC0tLQoKZnVuYyBUZXN0SW5pdGlhbENvbmZpZyh0ICp0ZXN0aW5nLlQpIHsKCWlmIEFkbWluKCkgIT0gdGVzdEFkbWluIHx8IEZlZVJlY2lwaWVudCgpICE9IHRlc3RBZG1pbiB7CgkJdC5GYXRhbCgic2VlZGVkIHJvbGVzIG1pc21hdGNoIikKCX0KCXZhciB6ZXJvIGFkZHJlc3MKCWlmIFBlbmRpbmdBZG1pbigpICE9IHplcm8gewoJCXQuRmF0YWwoInBlbmRpbmdBZG1pbiBzaG91bGQgc3RhcnQgemVybyIpCgl9CglpZiBBZGRyZXNzKCkgPT0gemVybyB7CgkJdC5GYXRhbCgicmVhbG0gYWRkcmVzcyBpcyB6ZXJvIikKCX0KCS8vIFJlZmVyZW5jZSBkdWVib29rJ3Mgb3duIGNvbnN0YW50LCBOT1QgYSBoYXJkY29kZWQgMTAwMDAuIFdpdGggdGhlCgkvLyBsaXRlcmFsLCBib3RoIG9wZXJhbmRzIHdlcmUgY29tcGlsZS10aW1lIGNvbnN0YW50cyBhbmQgdGhlIGJyYW5jaCB3YXMKCS8vIGRlYWQg4oCUIGl0IGNvdWxkIG5vdCBmYWlsIGV2ZW4gaWYgZHVlYm9vayB3ZXJlIHJlZGVwbG95ZWQgd2l0aCBhIGxvd2VyCgkvLyBsaW1pdCwgYW5kIGR1ZWJvb2suTXVzdE5ldyB3b3VsZCB0aGVuIHBhbmljIGF0IHJlYWxtIGluaXQgaW5zdGVhZCwKCS8vIHR1cm5pbmcgYSBjYXVnaHQgdGVzdCBmYWlsdXJlIGludG8gYSBkZXBsb3ktdGltZSBhYm9ydC4KCWlmIE1heE9wZW5UcmFuY2hlcyA+IGR1ZWJvb2suTWF4T3BlbkxpbWl0IHsKCQl0LkZhdGFsZigiTWF4T3BlblRyYW5jaGVzICVkIGV4Y2VlZHMgZHVlYm9vay5NYXhPcGVuTGltaXQgJWQiLAoJCQlNYXhPcGVuVHJhbmNoZXMsIGR1ZWJvb2suTWF4T3BlbkxpbWl0KQoJfQoJaWYgTWF4T3BlblBlckZ1bmRlciA+IE1heE9wZW5UcmFuY2hlcyB7CgkJdC5GYXRhbGYoIk1heE9wZW5QZXJGdW5kZXIgJWQgZXhjZWVkcyB0aGUgd2hvbGUtcmVhbG0gY2FwICVkIiwKCQkJTWF4T3BlblBlckZ1bmRlciwgTWF4T3BlblRyYW5jaGVzKQoJfQoJaWYgYm9vay5NaW5EZWxheSgpICE9IE1pbkRlbGF5QmxvY2tzIHx8IGJvb2suTWF4RGVsYXkoKSAhPSBNYXhEZWxheUJsb2NrcyB7CgkJdC5GYXRhbCgiYm9vayBib3VuZHMgZG8gbm90IG1hdGNoIHRoZSBkZWNsYXJlZCBjb25zdGFudHMiKQoJfQp9CgpmdW5jIFRlc3RGdW5kSGFwcHlQYXRoKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCWggOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgoJaWQgOj0gZnVuZEFzKGN1ciwgZnVuZGVyMSwgYmVuZTEsIDEwMDAsICJlbmdpbmVlciBncmFudCIsICJhIG1lbW8iLCAiMTA6MjAwLDIwOjMwMCwzMDo1MDAiLCB0cnVlKQoKCWZ1bmRlciwgYmVuZWZpY2lhcnksIHRpdGxlLCB0b3RhbCwgc25hcEJwcywgcmV2b2NhYmxlLAoJCWNyZWF0ZWRBdCwgbnVtVHJhbmNoZXMsIHBlbmRpbmcsIHJlbGVhc2VkR3Jvc3MsIHJldm9rZWRUb3RhbCA6PSBTY2hlZHVsZUluZm8oaWQpCglpZiBmdW5kZXIgIT0gZnVuZGVyMSB8fCBiZW5lZmljaWFyeSAhPSBiZW5lMSB8fCB0aXRsZSAhPSAiZW5naW5lZXIgZ3JhbnQiIHsKCQl0LkZhdGFsZigiaWRlbnRpdHkgZmllbGRzIHdyb25nOiAldiAldiAlcSIsIGZ1bmRlciwgYmVuZWZpY2lhcnksIHRpdGxlKQoJfQoJaWYgdG90YWwgIT0gMTAwMCB8fCBzbmFwQnBzICE9IDAgfHwgIXJldm9jYWJsZSB7CgkJdC5GYXRhbGYoInRlcm1zIHdyb25nOiB0b3RhbD0lZCBicHM9JWQgcmV2b2NhYmxlPSV2IiwgdG90YWwsIHNuYXBCcHMsIHJldm9jYWJsZSkKCX0KCWlmIGNyZWF0ZWRBdCAhPSBoIHx8IG51bVRyYW5jaGVzICE9IDMgfHwgcGVuZGluZyAhPSAzIHx8IHJlbGVhc2VkR3Jvc3MgIT0gMCB8fCByZXZva2VkVG90YWwgIT0gMCB7CgkJdC5GYXRhbGYoImJvb2trZWVwaW5nIHdyb25nOiBjcmVhdGVkQXQ9JWQgbj0lZCBwZW5kaW5nPSVkIHJlbD0lZCByZXY9JWQiLAoJCQljcmVhdGVkQXQsIG51bVRyYW5jaGVzLCBwZW5kaW5nLCByZWxlYXNlZEdyb3NzLCByZXZva2VkVG90YWwpCgl9CglpZiBNZW1vKGlkKSAhPSAiYSBtZW1vIiB7CgkJdC5GYXRhbCgibWVtbyBtaXNtYXRjaCIpCgl9CgoJLy8gVHJhbmNoZSByZWNvcmRzIGNhcnJ5IHRoZSByaWdodCBhbW91bnRzIGFuZCBhYnNvbHV0ZSBkdWUgaGVpZ2h0cy4KCWlkcyA6PSB0cmFuY2hlSURzT2YoaWQpCgl3YW50QW1vdW50cyA6PSBbXWludDY0ezIwMCwgMzAwLCA1MDB9Cgl3YW50RHVlIDo9IFtdaW50NjR7aCArIDEwLCBoICsgMjAsIGggKyAzMH0KCWZvciBpLCB0aWQgOj0gcmFuZ2UgaWRzIHsKCQlzSUQsIHNlcSwgYW1vdW50LCBkdWVBdCwgc3RhdHVzLCBzZXR0bGVkQXQgOj0gVHJhbmNoZUluZm8odGlkKQoJCWlmIHNJRCAhPSBpZCB8fCBzZXEgIT0gaW50NjQoaSsxKSB8fCBhbW91bnQgIT0gd2FudEFtb3VudHNbaV0gfHwKCQkJZHVlQXQgIT0gd2FudER1ZVtpXSB8fCBzdGF0dXMgIT0gU3RhdHVzUGVuZGluZyB8fCBzZXR0bGVkQXQgIT0gMCB7CgkJCXQuRmF0YWxmKCJ0cmFuY2hlICVkIHdyb25nOiBzY2hlZD0lZCBzZXE9JWQgYW1vdW50PSVkIGR1ZT0lZCBzdGF0dXM9JXMgc2V0dGxlZD0lZCIsCgkJCQl0aWQsIHNJRCwgc2VxLCBhbW91bnQsIGR1ZUF0LCBzdGF0dXMsIHNldHRsZWRBdCkKCQl9Cgl9CgoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgpmdW5jIFRlc3RGdW5kUmVqZWN0c0VudmVsb3BlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCgkvLyBOb3QgYSBkaXJlY3QgRU9BIGNhbGwgKGNvaW5pby5SZWNlaXZlIGd1YXJkKS4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZGVtby9hdHRhY2tlciIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEwMCkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImRpcmVjdCBFT0EgY2FsbCIsIGZ1bmMoKSB7CgkJRnVuZChjcm9zcyhjdXIpLCBiZW5lMSwgImV2aWwiLCAiIiwgIjEwOjEwMCIsIGZhbHNlLCBNYXhGZWVCcHMpCgl9KQoKCS8vIE5vIGNvaW5zIGF0IGFsbC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiZXhhY3RseSBvbmUgY29pbiB0eXBlIiwgZnVuYygpIHsKCQlGdW5kKGNyb3NzKGN1ciksIGJlbmUxLCAibm8gY29pbnMiLCAiIiwgIjEwOjEwMCIsIGZhbHNlLCBNYXhGZWVCcHMpCgl9KQoKCS8vIFdyb25nIGRlbm9taW5hdGlvbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLk5ld0NvaW5zKGNoYWluLk5ld0NvaW4oImZvb2NvaW4iLCAxMDApKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiZXhhY3RseSBvbmUgY29pbiB0eXBlIiwgZnVuYygpIHsKCQlGdW5kKGNyb3NzKGN1ciksIGJlbmUxLCAid3JvbmcgZGVub20iLCAiIiwgIjEwOjEwMCIsIGZhbHNlLCBNYXhGZWVCcHMpCgl9KQoKCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKZnVuYyBUZXN0RnVuZFJlamVjdHNUZXJtcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCgl2YXIgemVybyBhZGRyZXNzCgoJLy8gRWFjaCBjYXNlIHN0YWdlcyBpbmxpbmUsIGJlY2F1c2UgU2V0UmVhbG0gaXMgcGVyLWZyYW1lLgoJY2FzZXMgOj0gW11zdHJ1Y3QgewoJCW5hbWUsIHdhbnQgIHN0cmluZwoJCWJlbmVmaWNpYXJ5IGFkZHJlc3MKCQl0aXRsZSwgbWVtbyBzdHJpbmcKCQlzcGVjICAgICAgICBzdHJpbmcKCQlzZW50ICAgICAgICBpbnQ2NAoJfXsKCQl7Inplcm8gYmVuZWZpY2lhcnkiLCAiZW1wdHkgYmVuZWZpY2lhcnkiLCB6ZXJvLCAidCIsICIiLCAiMTA6MTAwIiwgMTAwfSwKCQkvLyBBIGJhbGFuY2UgY3JlZGl0ZWQgdG8gdGhlIHJlYWxtJ3Mgb3duIGFkZHJlc3MgaXMgY2xhaW1hYmxlIGJ5CgkJLy8gbm9ib2R5IGFuZCBzdGlsbCBjb3VudGVkIGluIExpYWJpbGl0aWVzKCksIHNvIGl0IGlzIHN0cmFuZGVkCgkJLy8gQU5EIGl0IHNocmlua3MgU3dlZXBEZW5vbSdzIHJlYWNoLiBSZWxlYXNlZCBieSBhbnkgdGhpcmQKCQkvLyBwYXJ0eSwgc28gdGhlIGZ1bmRlciBjYW5ub3QgdW5kbyBpdC4KCQl7InNlbGYgYmVuZWZpY2lhcnkiLCAibXVzdCBub3QgYmUgdGhpcyByZWFsbSdzIG93biBhZGRyZXNzIiwgc2VsZiwgInQiLCAiIiwgIjEwOjEwMCIsIDEwMH0sCgkJeyJlbXB0eSB0aXRsZSIsICJ0aXRsZSBtdXN0IGJlIiwgYmVuZTEsICIiLCAiIiwgIjEwOjEwMCIsIDEwMH0sCgkJeyJsb25nIHRpdGxlIiwgInRpdGxlIG11c3QgYmUiLCBiZW5lMSwgc3RyaW5ncy5SZXBlYXQoImEiLCBNYXhUaXRsZUxlbisxKSwgIiIsICIxMDoxMDAiLCAxMDB9LAoJCXsiYmFkIHRpdGxlIGNoYXJzZXQiLCAibGV0dGVycywgZGlnaXRzIiwgYmVuZTEsICJiYWQhdGl0bGUiLCAiIiwgIjEwOjEwMCIsIDEwMH0sCgkJeyJsb25nIG1lbW8iLCAibWVtbyBleGNlZWRzIiwgYmVuZTEsICJ0Iiwgc3RyaW5ncy5SZXBlYXQoIm0iLCBNYXhNZW1vTGVuKzEpLCAiMTA6MTAwIiwgMTAwfSwKCQl7ImVtcHR5IHNwZWMiLCAiYXQgbGVhc3Qgb25lIHRyYW5jaGUiLCBiZW5lMSwgInQiLCAiIiwgIiIsIDEwMH0sCgkJeyJsb25nIHNwZWMiLCAic3BlYyBleGNlZWRzIiwgYmVuZTEsICJ0IiwgIiIsIHN0cmluZ3MuUmVwZWF0KCI5IiwgTWF4U3BlY0xlbisxKSwgMTAwfSwKCQl7Im1pc3NpbmcgY29sb24iLCAiZXhwZWN0ZWQiLCBiZW5lMSwgInQiLCAiIiwgIjEwLTEwMCIsIDEwMH0sCgkJeyJkZWxheSBub3QgaW50ZWdlciIsICJkZWxheSBpcyBub3QgYW4gaW50ZWdlciIsIGJlbmUxLCAidCIsICIiLCAidGVuOjEwMCIsIDEwMH0sCgkJeyJhbW91bnQgbm90IGludGVnZXIiLCAiYW1vdW50IGlzIG5vdCBhbiBpbnRlZ2VyIiwgYmVuZTEsICJ0IiwgIiIsICIxMDpsb3RzIiwgMTAwfSwKCQl7ImRlbGF5IHplcm8iLCAib3V0c2lkZSIsIGJlbmUxLCAidCIsICIiLCAiMDoxMDAiLCAxMDB9LAoJCXsiZGVsYXkgdG9vIGxhcmdlIiwgIm91dHNpZGUiLCBiZW5lMSwgInQiLCAiIiwgIjEwMDAwMDAwMToxMDAiLCAxMDB9LAoJCXsiZGVsYXlzIGVxdWFsIiwgInN0cmljdGx5IGluY3JlYXNpbmciLCBiZW5lMSwgInQiLCAiIiwgIjEwOjUwLDEwOjUwIiwgMTAwfSwKCQl7ImRlbGF5cyBkZWNyZWFzaW5nIiwgInN0cmljdGx5IGluY3JlYXNpbmciLCBiZW5lMSwgInQiLCAiIiwgIjIwOjUwLDEwOjUwIiwgMTAwfSwKCQl7Inplcm8gYW1vdW50IiwgImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIiwgYmVuZTEsICJ0IiwgIiIsICIxMDowIiwgMTAwfSwKCQl7Im5lZ2F0aXZlIGFtb3VudCIsICJhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSIsIGJlbmUxLCAidCIsICIiLCAiMTA6LTUiLCAxMDB9LAoJCXsidW5kZXJmdW5kZWQiLCAidGhleSBtdXN0IGJlIGVxdWFsIiwgYmVuZTEsICJ0IiwgIiIsICIxMDoyMDAiLCAxMDB9LAoJCXsib3ZlcmZ1bmRlZCIsICJ0aGV5IG11c3QgYmUgZXF1YWwiLCBiZW5lMSwgInQiLCAiIiwgIjEwOjUwIiwgMTAwfSwKCX0KCgkvLyBBIGNyb3NzLWNhbGwgYWJvcnQgaXMgTk9UIGNhdGNoYWJsZSB3aXRoIHJlY292ZXIoKSBpbiB0aGUgY2FsbGluZwoJLy8gcmVhbG0g4oCUIHRoYXQgaXMgd2hhdCB1YXNzZXJ0LkFib3J0c0NvbnRhaW5zIGlzIGZvci4gU3RhZ2luZyBzdGF5cyBpbgoJLy8gdGhpcyBmcmFtZSwgaW1tZWRpYXRlbHkgYmVmb3JlIGVhY2ggY2FsbC4KCWZvciBfLCBjIDo9IHJhbmdlIGNhc2VzIHsKCQlzcGVjIDo9IGMuc3BlYwoJCWJlbiA6PSBjLmJlbmVmaWNpYXJ5CgkJdGl0bGUgOj0gYy50aXRsZQoJCW1lbW8gOj0gYy5tZW1vCgoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCQl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoYy5zZW50KSkKCQl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgYy53YW50LCBmdW5jKCkgewoJCQlGdW5kKGNyb3NzKGN1ciksIGJlbiwgdGl0bGUsIG1lbW8sIHNwZWMsIGZhbHNlLCBNYXhGZWVCcHMpCgkJfSwgYy5uYW1lKQoJfQoKCS8vIFRvbyBtYW55IHRyYW5jaGVzOiBNYXhUcmFuY2hlcysxIGVudHJpZXMgd2l0aCBpbmNyZWFzaW5nIGRlbGF5cy4KCXBhcnRzIDo9IFtdc3RyaW5ne30KCWZvciBpIDo9IDE7IGkgPD0gTWF4VHJhbmNoZXMrMTsgaSsrIHsKCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgaXRvYShpbnQ2NChpKSkrIjoxIikKCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KGludDY0KE1heFRyYW5jaGVzICsgMSkpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJhdCBtb3N0ICIraXRvYShNYXhUcmFuY2hlcykrIiB0cmFuY2hlcyIsIGZ1bmMoKSB7CgkJRnVuZChjcm9zcyhjdXIpLCBiZW5lMSwgIm1hbnkiLCAiIiwgc3RyaW5ncy5Kb2luKHBhcnRzLCAiLCIpLCBmYWxzZSwgTWF4RmVlQnBzKQoJfSkKCglhcHBJbnZhcmlhbnQodCkKCWIuY29uc2VydmVkKHQsIDApCn0KCmZ1bmMgVGVzdFJlbGVhc2VCZWZvcmVEdWVBYm9ydHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJaWQgOj0gZnVuZEFzKGN1ciwgZnVuZGVyMSwgYmVuZTEsIDEwMCwgIm5vdCB5ZXQiLCAiIiwgIjU6MTAwIiwgZmFsc2UpCgl0aWQgOj0gdHJhbmNoZUlEc09mKGlkKVswXQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oc3RyYW5nZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoc3RyYW5nZXIpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vdCBkdWUgeWV0IiwgZnVuYygpIHsgUmVsZWFzZShjcm9zcyhjdXIpLCB0aWQpIH0pCgoJLy8gTm90aGluZyBtb3ZlZC4KCWlmIEJhbGFuY2VPZihiZW5lMSkgIT0gMCB7CgkJdC5GYXRhbCgiYmVuZWZpY2lhcnkgY3JlZGl0ZWQgYmVmb3JlIHRoZSBkdWUgaGVpZ2h0IikKCX0KCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKLy8gVGVzdFJlbGVhc2VJc1Blcm1pc3Npb25sZXNzQW5kUGF5c1RoZUJlbmVmaWNpYXJ5IGlzIHRoZSBjZW50cmFsCi8vIGF1dGhvcml6YXRpb24gcHJvcGVydHk6IGEgc3RyYW5nZXIgbWF5IHRyaWdnZXIgdGhlIHJlbGVhc2UsIGFuZCBkb2luZyBzbwovLyBjcmVkaXRzIHRoZSBSRUNPUkRFRCBiZW5lZmljaWFyeSwgbmV2ZXIgdGhlIGNhbGxlci4KZnVuYyBUZXN0UmVsZWFzZUlzUGVybWlzc2lvbmxlc3NBbmRQYXlzVGhlQmVuZWZpY2lhcnkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJaWQgOj0gZnVuZEFzKGN1ciwgZnVuZGVyMSwgYmVuZTEsIDQwMCwgInBheWFibGUiLCAiIiwgIjE6NDAwIiwgZmFsc2UpCgl0aWQgOj0gdHJhbmNoZUlEc09mKGlkKVswXQoKCWJlbmVCZWZvcmUgOj0gQmFsYW5jZU9mKGJlbmUxKQoJbWFsbG9yeUJlZm9yZSA6PSBCYWxhbmNlT2YobWFsbG9yeSkKCXRlc3RpbmcuU2tpcEhlaWdodHMoMSkKCgkvLyBNYWxsb3J5LCBhbiB1bnJlbGF0ZWQgYWNjb3VudCwgdHJpZ2dlcnMgdGhlIHJlbGVhc2UuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCVJlbGVhc2UoY3Jvc3MoY3VyKSwgdGlkKQoKCWlmIGdvdCA6PSBCYWxhbmNlT2YoYmVuZTEpIC0gYmVuZUJlZm9yZTsgZ290ICE9IDQwMCB7CgkJdC5GYXRhbGYoImJlbmVmaWNpYXJ5IGNyZWRpdGVkICVkLCB3YW50IDQwMCIsIGdvdCkKCX0KCWlmIGdvdCA6PSBCYWxhbmNlT2YobWFsbG9yeSkgLSBtYWxsb3J5QmVmb3JlOyBnb3QgIT0gMCB7CgkJdC5GYXRhbGYoInRoZSBjYWxsZXIgd2FzIGNyZWRpdGVkICVkOyByZWxlYXNlIG11c3QgbmV2ZXIgcGF5IHRoZSBjYWxsZXIiLCBnb3QpCgl9CglfLCBfLCBfLCBfLCBzdGF0dXMsIHNldHRsZWRBdCA6PSBUcmFuY2hlSW5mbyh0aWQpCglpZiBzdGF0dXMgIT0gU3RhdHVzUmVsZWFzZWQgfHwgc2V0dGxlZEF0ID09IDAgewoJCXQuRmF0YWxmKCJ0cmFuY2hlIG5vdCBtYXJrZWQgcmVsZWFzZWQ6IHN0YXR1cz0lcyBzZXR0bGVkQXQ9JWQiLCBzdGF0dXMsIHNldHRsZWRBdCkKCX0KCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKLy8gVGVzdERvdWJsZVJlbGVhc2VJc0ltcG9zc2libGUgaXMgdGhlIHByb3BlcnR5IGR1ZWJvb2sgZXhpc3RzIHRvIHByb3ZpZGUuCi8vIFRoZSBzZWNvbmQgYXR0ZW1wdCBtdXN0IGZhaWwgYmVjYXVzZSB0aGUgZGVmZXJyYWwgbm8gbG9uZ2VyIGV4aXN0cyDigJQgbm90Ci8vIGJlY2F1c2UgdGhpcyByZWFsbSByZS1jaGVja2VkIGEgc3RhdHVzIGZsYWcuCmZ1bmMgVGVzdERvdWJsZVJlbGVhc2VJc0ltcG9zc2libGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJaWQgOj0gZnVuZEFzKGN1ciwgZnVuZGVyMSwgYmVuZTEsIDcwMCwgIm9uY2Ugb25seSIsICIiLCAiMTo3MDAiLCBmYWxzZSkKCXRpZCA6PSB0cmFuY2hlSURzT2YoaWQpWzBdCgl0ZXN0aW5nLlNraXBIZWlnaHRzKDEpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiZW5lMSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihiZW5lMSkKCVJlbGVhc2UoY3Jvc3MoY3VyKSwgdGlkKQoJYWZ0ZXIgOj0gQmFsYW5jZU9mKGJlbmUxKQoKCS8vIFNlY29uZCBhdHRlbXB0LCBzYW1lIHRyYW5zYWN0aW9uLWVxdWl2YWxlbnQgZnJhbWUgYW5kIGEgZGlmZmVyZW50CgkvLyBjYWxsZXI6IGR1ZWJvb2sgaGFzIGNvbnN1bWVkIHRoZSBJRCBhbmQgY2FuIG5ldmVyIHJldHVybiBpdCBhZ2Fpbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJubyBzdWNoIG9wZW4gZGVmZXJyYWwiLCBmdW5jKCkgeyBSZWxlYXNlKGNyb3NzKGN1ciksIHRpZCkgfSkKCgkvLyBBbmQgYSB0aGlyZCwgZnJvbSB0aGUgYmVuZWZpY2lhcnkuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJlbmUxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJlbmUxKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJubyBzdWNoIG9wZW4gZGVmZXJyYWwiLCBmdW5jKCkgeyBSZWxlYXNlKGNyb3NzKGN1ciksIHRpZCkgfSkKCglpZiBCYWxhbmNlT2YoYmVuZTEpICE9IGFmdGVyIHsKCQl0LkZhdGFsKCJhIHJlcGVhdCByZWxlYXNlIGNoYW5nZWQgdGhlIGJhbGFuY2UiKQoJfQoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgovLyBUZXN0VmVzdGVkVHJhbmNoZUNhbm5vdEJlUmV2b2tlZCBpcyB0aGlzIHJlYWxtJ3Mgb3duIGNoZWNrLCBub3QKLy8gZHVlYm9vaydzOiBkdWVib29rLkNhbmNlbCB3b3VsZCBjb25zdW1lIGEgZHVlLWJ1dC11bmNsYWltZWQgZGVmZXJyYWwKLy8gaGFwcGlseS4gV2l0aG91dCB0aGUgcmVmdXNhbCBhIGZ1bmRlciBjb3VsZCBmcm9udC1ydW4gdGhlIGJlbmVmaWNpYXJ5LgpmdW5jIFRlc3RWZXN0ZWRUcmFuY2hlQ2Fubm90QmVSZXZva2VkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCWlkIDo9IGZ1bmRBcyhjdXIsIGZ1bmRlcjEsIGJlbmUxLCAzMDAsICJ2ZXN0ZWQgbm93IiwgIiIsICIxOjMwMCIsIHRydWUpCgl0aWQgOj0gdHJhbmNoZUlEc09mKGlkKVswXQoKCXRlc3RpbmcuU2tpcEhlaWdodHMoMSkgLy8gbm93ID09IGR1ZUF0OiB2ZXN0ZWQKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiY2FuIG5ldmVyIGJlIHJldm9rZWQiLCBmdW5jKCkgeyBSZXZva2UoY3Jvc3MoY3VyKSwgdGlkKSB9KQoKCS8vIFN0aWxsIHJlbGVhc2FibGUgdG8gdGhlIGJlbmVmaWNpYXJ5IGFmdGVyd2FyZHMuCgliZWZvcmUgOj0gQmFsYW5jZU9mKGJlbmUxKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShzdHJhbmdlcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihzdHJhbmdlcikKCVJlbGVhc2UoY3Jvc3MoY3VyKSwgdGlkKQoJaWYgZ290IDo9IEJhbGFuY2VPZihiZW5lMSkgLSBiZWZvcmU7IGdvdCAhPSAzMDAgewoJCXQuRmF0YWxmKCJiZW5lZmljaWFyeSBjcmVkaXRlZCAlZCBhZnRlciBhIHJlZnVzZWQgcmV2b2NhdGlvbiwgd2FudCAzMDAiLCBnb3QpCgl9CglhcHBJbnZhcmlhbnQodCkKCWIuY29uc2VydmVkKHQsIDApCn0KCmZ1bmMgVGVzdFJldm9rZUF1dGhvcml6YXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJcmV2IDo9IGZ1bmRBcyhjdXIsIGZ1bmRlcjEsIGJlbmUxLCA1MDAsICJyZXZvY2FibGUgb25lIiwgIiIsICIxMDA6NTAwIiwgdHJ1ZSkKCWlyciA6PSBmdW5kQXMoY3VyLCBmdW5kZXIyLCBiZW5lMiwgNjAwLCAiaXJyZXZvY2FibGUgb25lIiwgIiIsICIxMDA6NjAwIiwgZmFsc2UpCglyZXZUSUQgOj0gdHJhbmNoZUlEc09mKHJldilbMF0KCWlyclRJRCA6PSB0cmFuY2hlSURzT2YoaXJyKVswXQoKCS8vIEEgc3RyYW5nZXIgbWF5IG5vdCByZXZva2UuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAib25seSB0aGUgZnVuZGVyIG1heSByZXZva2UiLCBmdW5jKCkgeyBSZXZva2UoY3Jvc3MoY3VyKSwgcmV2VElEKSB9KQoKCS8vIE5vciBtYXkgdGhlIGJlbmVmaWNpYXJ5LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiZW5lMSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihiZW5lMSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAib25seSB0aGUgZnVuZGVyIG1heSByZXZva2UiLCBmdW5jKCkgeyBSZXZva2UoY3Jvc3MoY3VyKSwgcmV2VElEKSB9KQoKCS8vIE5vciB0aGUgT1RIRVIgc2NoZWR1bGUncyBmdW5kZXIuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMikKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAib25seSB0aGUgZnVuZGVyIG1heSByZXZva2UiLCBmdW5jKCkgeyBSZXZva2UoY3Jvc3MoY3VyKSwgcmV2VElEKSB9KQoKCS8vIEFuIGlycmV2b2NhYmxlIHNjaGVkdWxlIHJlZnVzZXMgZXZlbiBpdHMgb3duIGZ1bmRlci4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnVuZGVyMikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihmdW5kZXIyKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJpcyBpcnJldm9jYWJsZSIsIGZ1bmMoKSB7IFJldm9rZShjcm9zcyhjdXIpLCBpcnJUSUQpIH0pCgoJLy8gUmV2b2tlQWxsIGNhcnJpZXMgdGhlIHNhbWUgdHdvIGNoZWNrcy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJvbmx5IHRoZSBmdW5kZXIgbWF5IHJldm9rZSIsIGZ1bmMoKSB7IFJldm9rZUFsbChjcm9zcyhjdXIpLCByZXYpIH0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMikKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiaXMgaXJyZXZvY2FibGUiLCBmdW5jKCkgeyBSZXZva2VBbGwoY3Jvc3MoY3VyKSwgaXJyKSB9KQoKCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKZnVuYyBUZXN0UmV2b2tlUmVmdW5kc0Z1bmRlckZlZUZyZWUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCS8vIEEgbm9uLXplcm8gZmVlIG11c3QgTk9UIGJlIGNoYXJnZWQgb24gYSByZXZvY2F0aW9uLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJU2V0RmVlQnBzKGNyb3NzKGN1ciksIDUwMCkKCgliIDo9IGJlZ2luKCkKCWlkIDo9IGZ1bmRBcyhjdXIsIGZ1bmRlcjEsIGJlbmUxLCA4MDAsICJjbGF3YmFjayIsICIiLCAiMTAwMDo4MDAiLCB0cnVlKQoJdGlkIDo9IHRyYW5jaGVJRHNPZihpZClbMF0KCglmdW5kZXJCZWZvcmUgOj0gQmFsYW5jZU9mKGZ1bmRlcjEpCglmZWVzQmVmb3JlIDo9IEZlZXNBY2NydWVkKCkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMSkKCVJldm9rZShjcm9zcyhjdXIpLCB0aWQpCgoJaWYgZ290IDo9IEJhbGFuY2VPZihmdW5kZXIxKSAtIGZ1bmRlckJlZm9yZTsgZ290ICE9IDgwMCB7CgkJdC5GYXRhbGYoImZ1bmRlciByZWZ1bmRlZCAlZCwgd2FudCB0aGUgZnVsbCA4MDAgZmVlLWZyZWUiLCBnb3QpCgl9CglpZiBGZWVzQWNjcnVlZCgpICE9IGZlZXNCZWZvcmUgewoJCXQuRmF0YWxmKCJhIHJldm9jYXRpb24gYWNjcnVlZCBhIGZlZTogJWQgLT4gJWQiLCBmZWVzQmVmb3JlLCBGZWVzQWNjcnVlZCgpKQoJfQoJXywgXywgXywgXywgc3RhdHVzLCBzZXR0bGVkQXQgOj0gVHJhbmNoZUluZm8odGlkKQoJaWYgc3RhdHVzICE9IFN0YXR1c1Jldm9rZWQgfHwgc2V0dGxlZEF0ID09IDAgewoJCXQuRmF0YWxmKCJ0cmFuY2hlIG5vdCBtYXJrZWQgcmV2b2tlZDogJXMgJWQiLCBzdGF0dXMsIHNldHRsZWRBdCkKCX0KCgkvLyBBIHJldm9rZWQgdHJhbmNoZSBjYW4gbmV2ZXIgYmUgcmVsZWFzZWQ6IGR1ZWJvb2sgY29uc3VtZWQgdGhlIElELgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiZW5lMSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihiZW5lMSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibm8gc3VjaCBvcGVuIGRlZmVycmFsIiwgZnVuYygpIHsgUmVsZWFzZShjcm9zcyhjdXIpLCB0aWQpIH0pCgoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCVNldEZlZUJwcyhjcm9zcyhjdXIpLCAwKQp9CgpmdW5jIFRlc3RSZXZva2VBbGxTa2lwc1Zlc3RlZEFuZFNldHRsZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJLy8gVHJhbmNoZSAxIGR1ZSBhdCArMSwgdGhlIHJlc3QgZmFyIG91dC4KCWlkIDo9IGZ1bmRBcyhjdXIsIGZ1bmRlcjEsIGJlbmUxLCAxMDAwLCAibWl4ZWQiLCAiIiwgIjE6MTAwLDUwMDoyMDAsNjAwOjMwMCw3MDA6NDAwIiwgdHJ1ZSkKCWlkcyA6PSB0cmFuY2hlSURzT2YoaWQpCgoJdGVzdGluZy5Ta2lwSGVpZ2h0cygxKSAvLyB0cmFuY2hlIDEgdmVzdHMKCgkvLyBSZWxlYXNlIHRyYW5jaGUgMSBzbyBpdCBpcyBzZXR0bGVkLCBub3QgbWVyZWx5IHZlc3RlZC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oc3RyYW5nZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoc3RyYW5nZXIpCglSZWxlYXNlKGNyb3NzKGN1ciksIGlkc1swXSkKCglmdW5kZXJCZWZvcmUgOj0gQmFsYW5jZU9mKGZ1bmRlcjEpCgliZW5lQmVmb3JlIDo9IEJhbGFuY2VPZihiZW5lMSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnVuZGVyMSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihmdW5kZXIxKQoJUmV2b2tlQWxsKGNyb3NzKGN1ciksIGlkKQoKCS8vIFRoZSB0aHJlZSB1bnZlc3RlZCB0cmFuY2hlcyBjYW1lIGJhY2s7IHRoZSByZWxlYXNlZCBvbmUgZGlkIG5vdC4KCWlmIGdvdCA6PSBCYWxhbmNlT2YoZnVuZGVyMSkgLSBmdW5kZXJCZWZvcmU7IGdvdCAhPSA5MDAgewoJCXQuRmF0YWxmKCJmdW5kZXIgcmVmdW5kZWQgJWQsIHdhbnQgOTAwICgxMDAwIGxlc3MgdGhlIHJlbGVhc2VkIDEwMCkiLCBnb3QpCgl9CgkvLyBBc3NlcnQgdGhlIERFTFRBLCBub3QgdGhlIGFic29sdXRlLiBCYWxhbmNlT2YoYmVuZTEpIGlzIGN1bXVsYXRpdmUKCS8vIGFjcm9zcyB0aGUgd2hvbGUgc3VpdGUgYW5kIGlzIGFscmVhZHkgZmFyIGFib3ZlIDEwMCBieSB0aGlzIHBvaW50LCBzbwoJLy8gYSBgPCAxMDBgIGNoZWNrIGNvdWxkIG5vdCBmYWlsIGhvd2V2ZXIgYmFkbHkgUmV2b2tlQWxsIGJlaGF2ZWQuIFdoYXQKCS8vIG11c3QgaG9sZCBpcyB0aGF0IFJldm9rZUFsbCBtb3ZlZCBub3RoaW5nIG91dCBvZiB0aGUgYmVuZWZpY2lhcnkuCglpZiBnb3QgOj0gQmFsYW5jZU9mKGJlbmUxKSAtIGJlbmVCZWZvcmU7IGdvdCAhPSAwIHsKCQl0LkZhdGFsZigiUmV2b2tlQWxsIGNoYW5nZWQgdGhlIGJlbmVmaWNpYXJ5IGJhbGFuY2UgYnkgJWQsIHdhbnQgMCIsIGdvdCkKCX0KCV8sIF8sIF8sIF8sIHN0MCwgXyA6PSBUcmFuY2hlSW5mbyhpZHNbMF0pCglpZiBzdDAgIT0gU3RhdHVzUmVsZWFzZWQgewoJCXQuRmF0YWxmKCJyZWxlYXNlZCB0cmFuY2hlIHdhcyBhbHRlcmVkIGJ5IFJldm9rZUFsbDogJXMiLCBzdDApCgl9Cglmb3IgXywgdGlkIDo9IHJhbmdlIGlkc1sxOl0gewoJCV8sIF8sIF8sIF8sIHN0LCBfIDo9IFRyYW5jaGVJbmZvKHRpZCkKCQlpZiBzdCAhPSBTdGF0dXNSZXZva2VkIHsKCQkJdC5GYXRhbGYoInRyYW5jaGUgJWQgc3RhdHVzICVzLCB3YW50IHJldm9rZWQiLCB0aWQsIHN0KQoJCX0KCX0KCgkvLyBBIHNlY29uZCBSZXZva2VBbGwgaGFzIG5vdGhpbmcgbGVmdCB0byBkbyBhbmQgbXVzdCBzYXkgc28gcmF0aGVyCgkvLyB0aGFuIHJlcG9ydCBhIHNpbGVudCBzdWNjZXNzLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmdW5kZXIxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGZ1bmRlcjEpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vIHJldm9jYWJsZSB0cmFuY2hlcyIsIGZ1bmMoKSB7IFJldm9rZUFsbChjcm9zcyhjdXIpLCBpZCkgfSkKCglhcHBJbnZhcmlhbnQodCkKCWIuY29uc2VydmVkKHQsIDApCn0KCmZ1bmMgVGVzdFdpdGhkcmF3UGF5c091dEFuZERlYml0c0ZpcnN0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCWlkIDo9IGZ1bmRBcyhjdXIsIGZ1bmRlcjEsIGJlbmUxLCAyNTAsICJwYXlvdXQgdGVzdCIsICIiLCAiMToyNTAiLCBmYWxzZSkKCXRpZCA6PSB0cmFuY2hlSURzT2YoaWQpWzBdCgl0ZXN0aW5nLlNraXBIZWlnaHRzKDEpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiZW5lMSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihiZW5lMSkKCVJlbGVhc2UoY3Jvc3MoY3VyKSwgdGlkKQoKCWNsYWltYWJsZSA6PSBCYWxhbmNlT2YoYmVuZTEpCglpZiBjbGFpbWFibGUgPCAyNTAgewoJCXQuRmF0YWxmKCJjbGFpbWFibGUgJWQsIHdhbnQgYXQgbGVhc3QgMjUwIiwgY2xhaW1hYmxlKQoJfQoJY29pbnNCZWZvcmUgOj0gY29pbnNPZihiZW5lMSkKCgkvLyBQYXJ0aWFsIHdpdGhkcmF3YWwuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJlbmUxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJlbmUxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVdpdGhkcmF3KGNyb3NzKGN1ciksIDEwMCkKCWlmIGdvdCA6PSBjb2luc09mKGJlbmUxKSAtIGNvaW5zQmVmb3JlOyBnb3QgIT0gMTAwIHsKCQl0LkZhdGFsZigicmVjZWl2ZWQgJWQgY29pbnMsIHdhbnQgMTAwIiwgZ290KQoJfQoJaWYgQmFsYW5jZU9mKGJlbmUxKSAhPSBjbGFpbWFibGUtMTAwIHsKCQl0LkZhdGFsZigibGVkZ2VyIG5vdCBkZWJpdGVkOiAlZCIsIEJhbGFuY2VPZihiZW5lMSkpCgl9CgoJLy8gT3Zlci13aXRoZHJhd2FsIGlzIHJlZnVzZWQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJlbmUxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJlbmUxKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJpbnN1ZmZpY2llbnQgYmFsYW5jZSIsIGZ1bmMoKSB7IFdpdGhkcmF3KGNyb3NzKGN1ciksIGNsYWltYWJsZSkgfSkKCgkvLyBUaGUgcmVzdC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmVuZTEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYmVuZTEpCglXaXRoZHJhd0FsbChjcm9zcyhjdXIpKQoJaWYgQmFsYW5jZU9mKGJlbmUxKSAhPSAwIHsKCQl0LkZhdGFsZigiYmFsYW5jZSBhZnRlciBXaXRoZHJhd0FsbCA9ICVkIiwgQmFsYW5jZU9mKGJlbmUxKSkKCX0KCgkvLyBOb3RoaW5nIGxlZnQgdG8gd2l0aGRyYXc6IGZlZWxlZGdlciByZXR1cm5zICgwLCBuaWwpIGZvciBhbiBlbXB0eQoJLy8gYWNjb3VudCwgc28gdGhpcyByZWFsbSdzIG93biBndWFyZCBpcyB3aGF0IHR1cm5zIHRoYXQgaW50byBhbiBhYm9ydC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmVuZTEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYmVuZTEpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vdGhpbmcgdG8gd2l0aGRyYXciLCBmdW5jKCkgeyBXaXRoZHJhd0FsbChjcm9zcyhjdXIpKSB9KQoKCS8vIEEgc3RyYW5nZXIgd2l0aCBubyBiYWxhbmNlIGNhbm5vdCB3aXRoZHJhdy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJpbnN1ZmZpY2llbnQgYmFsYW5jZSIsIGZ1bmMoKSB7IFdpdGhkcmF3KGNyb3NzKGN1ciksIDEpIH0pCgoJLy8gRXZlcnkgd2l0aGRyYXdhbCBtb3ZlZCBIIGFuZCBVIGJ5IHRoZSBzYW1lIGFtb3VudCwgc28gdGhlIGlkZW50aXR5CgkvLyBob2xkcyB3aXRoIG5vIHN1cnBsdXMgdGVybTogZEggPT0gZEUgKyBkVSArIGRGLgoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgovLyBUZXN0RmVlU25hcHNob3RBbmRDZWlsaW5nIGNvdmVycyBib3RoIGhhbHZlcyBvZiB0aGUgZmVlIHJhY2U6IGEgZmVlCi8vIGNoYW5nZSBuZXZlciByZWFjaGVzIGFuIGFscmVhZHktZnVuZGVkIHNjaGVkdWxlLCBhbmQgYSBmZWUgcmFpc2UKLy8gc2VxdWVuY2VkIGFoZWFkIG9mIGEgRnVuZCBpcyByZWZ1c2VkIHJhdGhlciB0aGFuIHNpbGVudGx5IGFwcGxpZWQuCmZ1bmMgVGVzdEZlZVNuYXBzaG90QW5kQ2VpbGluZyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJU2V0RmVlQnBzKGNyb3NzKGN1ciksIDIwMCkKCgliIDo9IGJlZ2luKCkKCWlkIDo9IGZ1bmRBcyhjdXIsIGZ1bmRlcjEsIGJlbmUxLCAxMDAwLCAic25hcHNob3R0ZWQiLCAiIiwgIjE6MTAwMCIsIGZhbHNlKQoJXywgXywgXywgXywgc25hcEJwcywgXywgXywgXywgXywgXywgXyA6PSBTY2hlZHVsZUluZm8oaWQpCglpZiBzbmFwQnBzICE9IDIwMCB7CgkJdC5GYXRhbGYoInNuYXBzaG90IGJwcyA9ICVkLCB3YW50IDIwMCIsIHNuYXBCcHMpCgl9CgoJLy8gQWRtaW4gcmFpc2VzIHRoZSBmZWUgQUZURVIgZnVuZGluZzsgdGhlIHNjaGVkdWxlIGtlZXBzIDIwMC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCVNldEZlZUJwcyhjcm9zcyhjdXIpLCAxMDAwKQoKCXRpZCA6PSB0cmFuY2hlSURzT2YoaWQpWzBdCgl0ZXN0aW5nLlNraXBIZWlnaHRzKDEpCgliZW5lQmVmb3JlIDo9IEJhbGFuY2VPZihiZW5lMSkKCWZlZXNCZWZvcmUgOj0gRmVlc0FjY3J1ZWQoKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oc3RyYW5nZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoc3RyYW5nZXIpCglSZWxlYXNlKGNyb3NzKGN1ciksIHRpZCkKCgkvLyAyMDAgYnBzIG9mIDEwMDAgPT0gMjAsIGNoYXJnZWQgYXQgdGhlIFNOQVBTSE9ULCBub3QgdGhlIGxpdmUgMTAwMCBicHMuCglpZiBnb3QgOj0gRmVlc0FjY3J1ZWQoKSAtIGZlZXNCZWZvcmU7IGdvdCAhPSAyMCB7CgkJdC5GYXRhbGYoImZlZSBjaGFyZ2VkID0gJWQsIHdhbnQgMjAgKHRoZSBzbmFwc2hvdCkiLCBnb3QpCgl9CglpZiBnb3QgOj0gQmFsYW5jZU9mKGJlbmUxKSAtIGJlbmVCZWZvcmU7IGdvdCAhPSA5ODAgewoJCXQuRmF0YWxmKCJiZW5lZmljaWFyeSBjcmVkaXRlZCAlZCwgd2FudCA5ODAiLCBnb3QpCgl9CgoJLy8gVGhlIGNyZWF0aW9uLXRpbWUgcmFjZTogdGhlIGxpdmUgZmVlIGlzIG5vdyAxMDAwLCBzbyBhIGNhbGxlciB3aG8KCS8vIHNpZ25zIGZvciBhdCBtb3N0IDIwMCBtdXN0IGJlIHJlZnVzZWQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgxMDApKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJleGNlZWRzIHRoZSBjYWxsZXIncyBtYXhpbXVtIiwgZnVuYygpIHsKCQlGdW5kKGNyb3NzKGN1ciksIGJlbmUxLCAicmFjZWQiLCAiIiwgIjEwOjEwMCIsIGZhbHNlLCAyMDApCgl9KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkgLy8gZGlzYXJtOyB0aGUgZW52ZWxvcGUgaXMgcHJvY2Vzcy1nbG9iYWwKCglhcHBJbnZhcmlhbnQodCkKCWIuY29uc2VydmVkKHQsIDApCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJU2V0RmVlQnBzKGNyb3NzKGN1ciksIDApCn0KCmZ1bmMgVGVzdEZlZVdpdGhkcmF3YWxBdXRob3JpemF0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCglTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgMTAwMCkKCgliIDo9IGJlZ2luKCkKCWlkIDo9IGZ1bmRBcyhjdXIsIGZ1bmRlcjEsIGJlbmUxLCAxMDAwLCAiZmVlcyIsICIiLCAiMToxMDAwIiwgZmFsc2UpCgl0aWQgOj0gdHJhbmNoZUlEc09mKGlkKVswXQoJdGVzdGluZy5Ta2lwSGVpZ2h0cygxKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShzdHJhbmdlcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihzdHJhbmdlcikKCVJlbGVhc2UoY3Jvc3MoY3VyKSwgdGlkKQoKCWlmIEZlZXNBY2NydWVkKCkgPT0gMCB7CgkJdC5GYXRhbCgibm8gZmVlIGFjY3J1ZWQgYXQgMTAwMCBicHMiKQoJfQoKCS8vIEEgbm9uLXJlY2lwaWVudCBjYW5ub3Qgd2l0aGRyYXcgZmVlcyBvciBzd2VlcC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJvbmx5IHRoZSBmZWUgcmVjaXBpZW50IiwgZnVuYygpIHsgV2l0aGRyYXdGZWVzKGNyb3NzKGN1cikpIH0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAib25seSB0aGUgZmVlIHJlY2lwaWVudCIsIGZ1bmMoKSB7IFN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgRGVub20pIH0pCgoJcG90IDo9IEZlZXNBY2NydWVkKCkKCWNvaW5zQmVmb3JlIDo9IGNvaW5zT2YodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJV2l0aGRyYXdGZWVzKGNyb3NzKGN1cikpCglpZiBnb3QgOj0gY29pbnNPZih0ZXN0QWRtaW4pIC0gY29pbnNCZWZvcmU7IGdvdCAhPSBwb3QgewoJCXQuRmF0YWxmKCJmZWUgcmVjaXBpZW50IHJlY2VpdmVkICVkLCB3YW50ICVkIiwgZ290LCBwb3QpCgl9CglpZiBGZWVzQWNjcnVlZCgpICE9IDAgewoJCXQuRmF0YWxmKCJmZWUgcG90IG5vdCBkcmFpbmVkOiAlZCIsIEZlZXNBY2NydWVkKCkpCgl9CgoJLy8gRHJhaW5pbmcgdHdpY2UgaXMgcmVmdXNlZC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibm8gZmVlcyBhY2NydWVkIiwgZnVuYygpIHsgV2l0aGRyYXdGZWVzKGNyb3NzKGN1cikpIH0pCgoJYXBwSW52YXJpYW50KHQpCgkvLyBUaGUgd2l0aGRyYXdhbCB0b29rIDEyMCBvdXQgb2YgSCAqYW5kKiBvdXQgb2YgRiwgc28gYm90aCBzaWRlcyBvZiB0aGUKCS8vIGlkZW50aXR5IG1vdmVkIHRvZ2V0aGVyIGFuZCB0aGVyZSBpcyBubyBzdXJwbHVzIHRlcm0uIGRGIGlzIG9ubHkgLTIwCgkvLyBiZWNhdXNlIDIwIG9mIHRoYXQgMTIwIHdhcyBhY2NydWVkIGJ5IGFuIGVhcmxpZXIgdGVzdCBhbmQgaXMgaW5zaWRlCgkvLyB0aGUgYmFzZWxpbmU6IEYgd2VudCAyMCAtPiAxMjAgLT4gMC4gU3VidHJhY3RpbmcgYHBvdGAgaGVyZSB3b3VsZCBiZQoJLy8gZG91YmxlLWNvdW50aW5nIHRoZSB2ZXJ5IHRyYW5zZmVyIGRIIGFscmVhZHkgcmVjb3Jkcy4KCWIuY29uc2VydmVkKHQsIDApCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJU2V0RmVlQnBzKGNyb3NzKGN1ciksIDApCn0KCi8vIFRlc3RTZXRGZWVSZWNpcGllbnRTZXR0bGVzVGhlT3V0Z29pbmdSZWNpcGllbnQgaXMgYXVkaXQgZmluZGluZyBZMjogdGhlCi8vIGZlZSBwb3QgaXMgYSBzaW5nbGUgc2NhbGFyIHdpdGggbm8gcGVyLXJlY2lwaWVudCBhY2NvdW50aW5nLCBzbyBhIGJhcmUKLy8gcmUtcG9pbnQgd291bGQgaGFuZCBldmVyeSBiYXNpcyBwb2ludCBlYXJuZWQgdW5kZXIgdGhlIG9sZCByZWNpcGllbnQgdG8KLy8gdGhlIG5ldyBvbmUgYXQgdGhlIGFkbWluJ3Mgc29sZSBkaXNjcmV0aW9uLgpmdW5jIFRlc3RTZXRGZWVSZWNpcGllbnRTZXR0bGVzVGhlT3V0Z29pbmdSZWNpcGllbnQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCVNldEZlZUJwcyhjcm9zcyhjdXIpLCAxMDAwKQoKCWIgOj0gYmVnaW4oKQoJaWQgOj0gZnVuZEFzKGN1ciwgZnVuZGVyMSwgYmVuZTEsIDEwMDAsICJzZXR0bGUiLCAiIiwgIjE6MTAwMCIsIGZhbHNlKQoJdGlkIDo9IHRyYW5jaGVJRHNPZihpZClbMF0KCXRlc3RpbmcuU2tpcEhlaWdodHMoMSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oc3RyYW5nZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoc3RyYW5nZXIpCglSZWxlYXNlKGNyb3NzKGN1ciksIHRpZCkKCglwb3QgOj0gRmVlc0FjY3J1ZWQoKQoJaWYgcG90ID09IDAgewoJCXQuRmF0YWwoIm5vIGZlZSBhY2NydWVkIGF0IDEwMDAgYnBzIikKCX0KCW9sZFJlY2lwaWVudCA6PSBGZWVSZWNpcGllbnQoKQoJb2xkQ2xhaW1CZWZvcmUgOj0gQmFsYW5jZU9mKG9sZFJlY2lwaWVudCkKCW5ld0NsYWltQmVmb3JlIDo9IEJhbGFuY2VPZihiZW5lMikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCglTZXRGZWVSZWNpcGllbnQoY3Jvc3MoY3VyKSwgYmVuZTIpCgoJaWYgRmVlUmVjaXBpZW50KCkgIT0gYmVuZTIgewoJCXQuRmF0YWxmKCJyZWNpcGllbnQgaXMgJXMsIHdhbnQgJXMiLCBGZWVSZWNpcGllbnQoKSwgYmVuZTIpCgl9CgkvLyBUaGUgcG90IG1vdmVkIHRvIHRoZSBPVVRHT0lORyByZWNpcGllbnQncyBjbGFpbWFibGUgYmFsYW5jZS4uLgoJaWYgZ290IDo9IEJhbGFuY2VPZihvbGRSZWNpcGllbnQpIC0gb2xkQ2xhaW1CZWZvcmU7IGdvdCAhPSBwb3QgewoJCXQuRmF0YWxmKCJvdXRnb2luZyByZWNpcGllbnQgY3JlZGl0ZWQgJWQsIHdhbnQgdGhlIHdob2xlIHBvdCAlZCIsIGdvdCwgcG90KQoJfQoJLy8gLi4uYW5kIEYgaXMgbm93IGVtcHR5LCBzbyB0aGUgc3VjY2Vzc29yIGluaGVyaXRzIHRoZSByb2xlLCBub3QgdGhlCgkvLyBlYXJuaW5ncy4gVGhpcyBpcyB0aGUgYXNzZXJ0aW9uIHRoZSBmaW5kaW5nIGlzIGFib3V0LgoJaWYgRmVlc0FjY3J1ZWQoKSAhPSAwIHsKCQl0LkZhdGFsZigiZmVlIHBvdCBzdGlsbCBob2xkcyAlZCBhZnRlciByZS1wb2ludGluZyIsIEZlZXNBY2NydWVkKCkpCgl9CglpZiBnb3QgOj0gQmFsYW5jZU9mKGJlbmUyKSAtIG5ld0NsYWltQmVmb3JlOyBnb3QgIT0gMCB7CgkJdC5GYXRhbGYoInN1Y2Nlc3NvciB3YXMgY3JlZGl0ZWQgJWQgb2YgdGhlIHByZWRlY2Vzc29yJ3MgZWFybmluZ3MsIHdhbnQgMCIsIGdvdCkKCX0KCS8vIFRoZSBzdWNjZXNzb3IgaGFzIG5vIHBvdCB0byBkcmFpbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmVuZTIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYmVuZTIpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vIGZlZXMgYWNjcnVlZCIsIGZ1bmMoKSB7IFdpdGhkcmF3RmVlcyhjcm9zcyhjdXIpKSB9KQoKCS8vIE5vIGNvaW5zIG1vdmVkOiBGIHNpbXBseSBiZWNhbWUgVS4gQ29uc2VydmF0aW9uIGlzIHVudG91Y2hlZC4KCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKCgkvLyBBIHJlLXBvaW50IHRvIHRoZSBTQU1FIGFkZHJlc3MgaXMgYSBuby1vcCBhbmQgbXVzdCBub3QgY2h1cm4gdGhlIHBvdC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCVNldEZlZVJlY2lwaWVudChjcm9zcyhjdXIpLCBiZW5lMikKCWlmIEZlZXNBY2NydWVkKCkgIT0gMCB7CgkJdC5GYXRhbCgic2VsZiByZS1wb2ludCBkaXN0dXJiZWQgdGhlIHBvdCIpCgl9CgoJLy8gUmVzdG9yZSB0aGUgc3VpdGUncyBiYXNlbGluZSByb2xlcyBhbmQgZmVlLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJU2V0RmVlUmVjaXBpZW50KGNyb3NzKGN1ciksIHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCVNldEZlZUJwcyhjcm9zcyhjdXIpLCAwKQp9CgovLyBUZXN0UGVyRnVuZGVyQ2FwSXNFbmZvcmNlZEFuZEZyZWVkIGlzIGF1ZGl0IGZpbmRpbmcgWTE6IE1heE9wZW5UcmFuY2hlcyBpcwovLyBhIHdob2xlLXJlYWxtIGNhcCwgYW5kIHdpdGhvdXQgYSBwZXItZnVuZGVyIGJvdW5kIG9uZSBhY2NvdW50IGNvdWxkIGZpbGwKLy8gaXQgZm9yIH5ub3RoaW5nIGFuZCB0aGVuIHJlY2xhaW0gZXZlcnkgY29pbiBmZWUtZnJlZSB3aXRoIFJldm9rZUFsbC4KLy8KLy8gSXQgYWxzbyBjbG9zZXMgdGhlIGNvdmVyYWdlIGdhcCB0aGUgYXVkaXQgbmFtZWQ6IGJlZm9yZSB0aGlzLCBOTyB0ZXN0Ci8vIGV4ZXJjaXNlZCBhIGNhcGFjaXR5IGNoZWNrIGF0IGFsbC4gVGhlIHdob2xlLXJlYWxtIGNhcCBpdHNlbGYgc3RheXMKLy8gdW50ZXN0ZWQgb24gcHVycG9zZSDigJQgcmVhY2hpbmcgaXQgbmVlZHMgNTAwMCB0cmFuY2hlcywgYW5kIHRoZSBwZXItZnVuZGVyCi8vIGNhcCBpcyBub3cgdGhlIGJpbmRpbmcgb25lIGZvciBhbnkgc2luZ2xlIGFjY291bnQsIHdoaWNoIGlzIHRoZSBwb2ludC4KZnVuYyBUZXN0UGVyRnVuZGVyQ2FwSXNFbmZvcmNlZEFuZEZyZWVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCgkvLyBvbmVzU3BlYyBidWlsZHMgbiB0cmFuY2hlcyBvZiAxdWdub3Qgd2l0aCBzdHJpY3RseSBpbmNyZWFzaW5nIGRlbGF5cy4KCS8vIG4gPT0gTWF4VHJhbmNoZXMgaXMgdGhlIGxhcmdlc3Qgc2NoZWR1bGUgYSBzaW5nbGUgRnVuZCBjYW4gY3JlYXRlLgoJb25lc1NwZWMgOj0gZnVuYyhuIGludDY0KSBzdHJpbmcgewoJCXBhcnRzIDo9IFtdc3RyaW5ne30KCQlmb3IgaSA6PSBpbnQ2NCgxKTsgaSA8PSBuOyBpKysgewoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgaXRvYShpKSsiOjEiKQoJCX0KCQlyZXR1cm4gc3RyaW5ncy5Kb2luKHBhcnRzLCAiLCIpCgl9CgoJLy8gUmVhbG0gZ2xvYmFscyBwZXJzaXN0IGFjcm9zcyB0ZXN0cywgc28gZnVuZGVyMiBtYXkgYWxyZWFkeSBob2xkIHBlbmRpbmcKCS8vIHRyYW5jaGVzIGFuZCB0aGUgaGVhZHJvb20gbmVlZCBub3QgZGl2aWRlIGV2ZW5seSBieSBNYXhUcmFuY2hlcy4gRmlsbAoJLy8gd2l0aCBmdWxsIHNjaGVkdWxlcyBhbmQgdG9wIG9mZiB3aXRoIHRoZSByZW1haW5kZXIgcmF0aGVyIHRoYW4gYXNzZXJ0IGFuCgkvLyBhcml0aG1ldGljIGNvaW5jaWRlbmNlOiBhbiBlYXJsaWVyIGRyYWZ0IGFzc2VydGVkIHJvb20lTWF4VHJhbmNoZXM9PTAgYW5kCgkvLyBmYWlsZWQgYXQgcm9vbT0yNTUuCglzdGFydCA6PSBPcGVuVHJhbmNoZXNPZkZ1bmRlcihmdW5kZXIyKQoJcm9vbSA6PSBpbnQ2NChNYXhPcGVuUGVyRnVuZGVyKSAtIHN0YXJ0CglpZiByb29tIDw9IDAgewoJCXQuRmF0YWxmKCJmdW5kZXIyIHN0YXJ0cyBhdCAlZCBwZW5kaW5nLCBhbHJlYWR5IGF0IHRoZSBjYXAgJWQiLCBzdGFydCwgTWF4T3BlblBlckZ1bmRlcikKCX0KCglpZHMgOj0gW11pbnQ2NHt9CglzaXplcyA6PSBbXWludDY0e30KCWZvciBsZWZ0IDo9IHJvb207IGxlZnQgPiAwOyB7CgkJbiA6PSBpbnQ2NChNYXhUcmFuY2hlcykKCQlpZiBsZWZ0IDwgbiB7CgkJCW4gPSBsZWZ0CgkJfQoJCWlkcyA9IGFwcGVuZChpZHMsIGZ1bmRBcyhjdXIsIGZ1bmRlcjIsIGJlbmUyLCBuLCAiZmlsbCIsICIiLCBvbmVzU3BlYyhuKSwgdHJ1ZSkpCgkJc2l6ZXMgPSBhcHBlbmQoc2l6ZXMsIG4pCgkJbGVmdCAtPSBuCgl9CglpZiBnb3QgOj0gT3BlblRyYW5jaGVzT2ZGdW5kZXIoZnVuZGVyMik7IGdvdCAhPSBpbnQ2NChNYXhPcGVuUGVyRnVuZGVyKSB7CgkJdC5GYXRhbGYoImZ1bmRlcjIgaG9sZHMgJWQgcGVuZGluZywgd2FudCB0aGUgY2FwICVkIiwgZ290LCBNYXhPcGVuUGVyRnVuZGVyKQoJfQoKCS8vIE9uZSBtb3JlIHRyYW5jaGUg4oCUIGEgc2luZ2xlIG9uZSDigJQgbXVzdCBiZSByZWZ1c2VkLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmdW5kZXIyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGZ1bmRlcjIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMSkpCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdCgxKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiZnVuZGVyIHRyYW5jaGUgY2FwYWNpdHkgcmVhY2hlZCIsIGZ1bmMoKSB7CgkJRnVuZChjcm9zcyhjdXIpLCBiZW5lMiwgIm9uZSB0b28gbWFueSIsICIiLCAiMToxIiwgZmFsc2UsIE1heEZlZUJwcykKCX0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoKCS8vIFRoZSAxdWdub3QgaXNzdWVkIGZvciB0aGF0IHJlamVjdGVkIEZ1bmQgbmV2ZXIgZW50ZXJlZCB0aGUgZXNjcm93LCBzbwoJLy8gaXQgaXMgc3VycGx1cyBub3cuIEFjY291bnQgZm9yIGl0IGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gbGV0IGl0IGhpZGUKCS8vIGluc2lkZSBhIHRvbGVyYW5jZS4KCXN1cnBsdXMgOj0gaW50NjQoMSkKCgkvLyBUaGUgY2FwIGlzIFBFUiBGVU5ERVIsIG5vdCBnbG9iYWw6IGEgZGlmZmVyZW50IGZ1bmRlciBpcyB1bmFmZmVjdGVkCgkvLyBldmVuIHRob3VnaCBmdW5kZXIyIGlzIGF0IGl0cyBvd24gY2VpbGluZy4KCW90aGVySUQgOj0gZnVuZEFzKGN1ciwgZnVuZGVyMSwgYmVuZTEsIDUsICJ1bmFmZmVjdGVkIiwgIiIsICIxOjUiLCB0cnVlKQoJaWYgT3BlblRyYW5jaGVzT2ZGdW5kZXIoZnVuZGVyMSkgPCAxIHsKCQl0LkZhdGFsKCJmdW5kZXIxIHdhcyBibG9ja2VkIGJ5IGZ1bmRlcjIncyBjYXAiKQoJfQoKCS8vIFJlbGVhc2luZyBvciByZXZva2luZyBmcmVlcyB0aGUgc2xvdCBhZ2Fpbi4gUmV2b2tlIG9uZSB3aG9sZSBzY2hlZHVsZQoJLy8gYW5kIGNvbmZpcm0gZnVuZGVyMiBnZXRzIGJhY2sgZXhhY3RseSB0aGF0IHNjaGVkdWxlJ3Mgd29ydGggb2YgaGVhZHJvb20uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMikKCVJldm9rZUFsbChjcm9zcyhjdXIpLCBpZHNbMF0pCglpZiBnb3QgOj0gT3BlblRyYW5jaGVzT2ZGdW5kZXIoZnVuZGVyMik7IGdvdCAhPSBpbnQ2NChNYXhPcGVuUGVyRnVuZGVyKS1zaXplc1swXSB7CgkJdC5GYXRhbGYoImFmdGVyIFJldm9rZUFsbCBmdW5kZXIyIGhvbGRzICVkLCB3YW50ICVkIiwKCQkJZ290LCBpbnQ2NChNYXhPcGVuUGVyRnVuZGVyKS1zaXplc1swXSkKCX0KCS8vIC4uLmFuZCBjYW4gZnVuZCBhZ2Fpbi4KCWlkc1swXSA9IGZ1bmRBcyhjdXIsIGZ1bmRlcjIsIGJlbmUyLCBzaXplc1swXSwgInJlZmlsbCIsICIiLCBvbmVzU3BlYyhzaXplc1swXSksIHRydWUpCglpZiBnb3QgOj0gT3BlblRyYW5jaGVzT2ZGdW5kZXIoZnVuZGVyMik7IGdvdCAhPSBpbnQ2NChNYXhPcGVuUGVyRnVuZGVyKSB7CgkJdC5GYXRhbGYoImFmdGVyIHJlZnVuZGluZyBmdW5kZXIyIGhvbGRzICVkLCB3YW50IHRoZSBjYXAgJWQiLCBnb3QsIE1heE9wZW5QZXJGdW5kZXIpCgl9CgoJLy8gQ2xlYW4gdXA6IHJldHVybiBmdW5kZXIyIHRvIGl0cyBzdGFydGluZyBjb3VudCBzbyBsYXRlciB0ZXN0cyBhcmUgbm90CgkvLyBmdW5kaW5nIGFnYWluc3QgYSBmdWxsIGFjY291bnQsIGFuZCBkcm9wIHRoZSBjb3VudGVyIGVudHJpZXMgdG8gcHJvdmUKCS8vIHRoZSB6ZXJvLXJlbW92YWwgcGF0aCBydW5zLgoJZm9yIF8sIGlkIDo9IHJhbmdlIGlkcyB7CgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmdW5kZXIyKSkKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihmdW5kZXIyKQoJCVJldm9rZUFsbChjcm9zcyhjdXIpLCBpZCkKCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnVuZGVyMSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihmdW5kZXIxKQoJUmV2b2tlQWxsKGNyb3NzKGN1ciksIG90aGVySUQpCglpZiBnb3QgOj0gT3BlblRyYW5jaGVzT2ZGdW5kZXIoZnVuZGVyMik7IGdvdCAhPSBzdGFydCB7CgkJdC5GYXRhbGYoImZ1bmRlcjIgbGVmdCB3aXRoICVkIHBlbmRpbmcsIHdhbnQgdGhlIHN0YXJ0aW5nICVkIiwgZ290LCBzdGFydCkKCX0KCglhcHBJbnZhcmlhbnQodCkKCWIuY29uc2VydmVkKHQsIHN1cnBsdXMpCn0KCi8vIFRlc3RTd2VlcENhbm5vdFRvdWNoRXNjcm93IGlzIHRoZSByZXNlcnZlIHByb3BlcnR5OiBzdXJwbHVzIGlzCi8vIHN3ZWVwYWJsZSwgZXNjcm93ZWQgdHJhbmNoZXMgYW5kIGNsYWltYWJsZSBiYWxhbmNlcyBhcmUgbm90LgpmdW5jIFRlc3RTd2VlcENhbm5vdFRvdWNoRXNjcm93KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCWZ1bmRBcyhjdXIsIGZ1bmRlcjEsIGJlbmUxLCA5MDAsICJyZXNlcnZlZCIsICIiLCAiMTAwMDo5MDAiLCBmYWxzZSkKCgkvLyBGb3JjZS1zZW5kIDc3IHVnbm90IG91dCBvZiBiYW5kLCB0aGVuIHN3ZWVwLiBPbmx5IHRoZSA3NyBtYXkgbW92ZS4KCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KDc3KSkKCWlmIGdvdCA6PSBTdXJwbHVzKCk7IGdvdCAhPSA3NyB7CgkJdC5GYXRhbGYoInN1cnBsdXMgPSAlZCwgd2FudCA3NyIsIGdvdCkKCX0KCWxpYWJCZWZvcmUgOj0gTGlhYmlsaXRpZXMoKQoJY29pbnNCZWZvcmUgOj0gY29pbnNPZih0ZXN0QWRtaW4pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJU3dlZXBEZW5vbShjcm9zcyhjdXIpLCBEZW5vbSkKCglpZiBnb3QgOj0gY29pbnNPZih0ZXN0QWRtaW4pIC0gY29pbnNCZWZvcmU7IGdvdCAhPSA3NyB7CgkJdC5GYXRhbGYoInN3ZXB0ICVkLCB3YW50IGV4YWN0bHkgdGhlIDc3IHN1cnBsdXMiLCBnb3QpCgl9CglpZiBMaWFiaWxpdGllcygpICE9IGxpYWJCZWZvcmUgewoJCXQuRmF0YWxmKCJzd2VlcCBjaGFuZ2VkIGxpYWJpbGl0aWVzOiAlZCAtPiAlZCIsIGxpYWJCZWZvcmUsIExpYWJpbGl0aWVzKCkpCgl9CglpZiBIZWxkKCkgPCBMaWFiaWxpdGllcygpIHsKCQl0LkZhdGFsZigic3dlZXAgYnJva2Ugc29sdmVuY3k6IGhlbGQ9JWQgbGlhYmlsaXRpZXM9JWQiLCBIZWxkKCksIExpYWJpbGl0aWVzKCkpCgl9CgoJLy8gV2l0aCBubyBzdXJwbHVzIGxlZnQsIHN3ZWVwaW5nIGFib3J0cyByYXRoZXIgdGhhbiB0b3VjaGluZyByZXNlcnZlcy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibm8gc3VycGx1cyB0byBzd2VlcCIsIGZ1bmMoKSB7IFN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgRGVub20pIH0pCgoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgpmdW5jIFRlc3RBZG1pbkhhbmRvdmVySXNUd29TdGVwKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl2YXIgemVybyBhZGRyZXNzCgoJLy8gT25seSB0aGUgYWRtaW4gbWF5IHByb3Bvc2UuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiYWRtaW4gb25seSIsIGZ1bmMoKSB7IFByb3Bvc2VBZG1pbihjcm9zcyhjdXIpLCBtYWxsb3J5KSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCVByb3Bvc2VBZG1pbihjcm9zcyhjdXIpLCBmdW5kZXIyKQoJaWYgUGVuZGluZ0FkbWluKCkgIT0gZnVuZGVyMiB7CgkJdC5GYXRhbCgicHJvcG9zYWwgbm90IHJlY29yZGVkIikKCX0KCWlmIEFkbWluKCkgIT0gdGVzdEFkbWluIHsKCQl0LkZhdGFsKCJhIHByb3Bvc2FsIG11c3Qgbm90IHRyYW5zZmVyIHRoZSByb2xlIG9uIGl0cyBvd24iKQoJfQoKCS8vIE9ubHkgdGhlIHByb3Bvc2VkIGFjY291bnQgbWF5IGFjY2VwdC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJvbmx5IHRoZSBwcm9wb3NlZCBhZG1pbiIsIGZ1bmMoKSB7IEFjY2VwdEFkbWluKGNyb3NzKGN1cikpIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmdW5kZXIyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGZ1bmRlcjIpCglBY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJaWYgQWRtaW4oKSAhPSBmdW5kZXIyIHx8IFBlbmRpbmdBZG1pbigpICE9IHplcm8gewoJCXQuRmF0YWxmKCJoYW5kb3ZlciBpbmNvbXBsZXRlOiBhZG1pbj0ldiBwZW5kaW5nPSV2IiwgQWRtaW4oKSwgUGVuZGluZ0FkbWluKCkpCgl9CgoJLy8gQWNjZXB0aW5nIGFnYWluIGlzIHJlZnVzZWQgKHRoZSBwcm9wb3NhbCB3YXMgY2xlYXJlZCkuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMikKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAib25seSB0aGUgcHJvcG9zZWQgYWRtaW4iLCBmdW5jKCkgeyBBY2NlcHRBZG1pbihjcm9zcyhjdXIpKSB9KQoKCS8vIFRoZSBvbGQgYWRtaW4gaGFzIGxvc3QgdGhlIHJvbGUuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImFkbWluIG9ubHkiLCBmdW5jKCkgeyBTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgMSkgfSkKCgkvLyBIYW5kIGl0IGJhY2sgc28gbGF0ZXIgdGVzdHMga2VlcCB0aGVpciBzZWVkZWQgYWRtaW4uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMikKCVByb3Bvc2VBZG1pbihjcm9zcyhjdXIpLCB0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCglBY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJaWYgQWRtaW4oKSAhPSB0ZXN0QWRtaW4gewoJCXQuRmF0YWwoImZhaWxlZCB0byByZXN0b3JlIHRoZSBzZWVkZWQgYWRtaW4iKQoJfQp9CgpmdW5jIFRlc3RTZXRGZWVCb3VuZHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAib3V0IG9mIHJhbmdlIiwgZnVuYygpIHsgU2V0RmVlQnBzKGNyb3NzKGN1ciksIE1heEZlZUJwcysxKSB9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJvdXQgb2YgcmFuZ2UiLCBmdW5jKCkgeyBTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgLTEpIH0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImVtcHR5IGZlZSByZWNpcGllbnQiLCBmdW5jKCkgewoJCXZhciB6ZXJvIGFkZHJlc3MKCQlTZXRGZWVSZWNpcGllbnQoY3Jvc3MoY3VyKSwgemVybykKCX0pCn0KCi8vIFRlc3RTdHJheVNlbmRSZWplY3RlZDogb25seSBGdW5kIGFjY2VwdHMgdmFsdWUuIEV2ZXJ5IG90aGVyIHBheWFibGUtCi8vIGxvb2tpbmcgZW50cnlwb2ludCBtdXN0IHJlZnVzZSBhbiBhdHRhY2hlZCBlbnZlbG9wZSByYXRoZXIgdGhhbiBhYnNvcmIKLy8gaXQgaW50byBzdXJwbHVzLgpmdW5jIFRlc3RTdHJheVNlbmRSZWplY3RlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCglpZCA6PSBmdW5kQXMoY3VyLCBmdW5kZXIxLCBiZW5lMSwgMTAwLCAic3RyYXkiLCAiIiwgIjEwMDA6MTAwIiwgdHJ1ZSkKCXRpZCA6PSB0cmFuY2hlSURzT2YoaWQpWzBdCgoJY29uc3QgZ3VhcmQgPSAiZG9lcyBub3QgYWNjZXB0IGNvaW5zIgoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnVuZGVyMSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihmdW5kZXIxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDUpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsIGd1YXJkLCBmdW5jKCkgeyBSZWxlYXNlKGNyb3NzKGN1ciksIHRpZCkgfSwgIlJlbGVhc2UiKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnVuZGVyMSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihmdW5kZXIxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDUpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsIGd1YXJkLCBmdW5jKCkgeyBSZXZva2UoY3Jvc3MoY3VyKSwgdGlkKSB9LCAiUmV2b2tlIikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCg1KSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCBndWFyZCwgZnVuYygpIHsgUmV2b2tlQWxsKGNyb3NzKGN1ciksIGlkKSB9LCAiUmV2b2tlQWxsIikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZ1bmRlcjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnVuZGVyMSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCg1KSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCBndWFyZCwgZnVuYygpIHsgV2l0aGRyYXdBbGwoY3Jvc3MoY3VyKSkgfSwgIldpdGhkcmF3QWxsIikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoNSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgZ3VhcmQsIGZ1bmMoKSB7IFNldEZlZUJwcyhjcm9zcyhjdXIpLCAwKSB9LCAiU2V0RmVlQnBzIikKCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgpmdW5jIFRlc3RVbmtub3duSURzQWJvcnQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCS8vIFRoZSB2aWV3cyBhcmUgbm9uLWNyb3NzaW5nLCBhbmQgdGhpcyB0ZXN0IGZpbGUgaXMgY29tcGlsZWQgSU5UTyB0aGUKCS8vIHJlYWxtLCBzbyBjYWxsaW5nIG9uZSBpcyBhIHNhbWUtcmVhbG0gY2FsbCBhbmQgaXRzIHBhbmljIGlzIGFuCgkvLyBvcmRpbmFyeSBwYW5pYyDigJQgbm90IGFuIGFib3J0LiBQYW5pY3NDb250YWlucyBpcyB0aGUgbWF0Y2hpbmcKCS8vIGFzc2VydGlvbjsgQWJvcnRzQ29udGFpbnMgY2Fubm90IHNlZSBpdCBhbmQgdGhlIHBhbmljIGVzY2FwZXMuCgkvLyBPZmYtY2hhaW4gYSByZWFkZXIgcmVhY2hlcyB0aGVzZSB0aHJvdWdoIHZtL3FldmFsLCB3aGljaCBkb2VzIGNyb3NzCgkvLyB0aGUgYm91bmRhcnkgYW5kIHNvIHN1cmZhY2VzIHRoZSBzYW1lIHRleHQgYXMgYW4gYWJvcnQuCgl1YXNzZXJ0LlBhbmljc0NvbnRhaW5zKHQsIGN1ciwgInVua25vd24gc2NoZWR1bGUgaWQiLCBmdW5jKCkgeyBTY2hlZHVsZUluZm8oOTk5OTk5KSB9KQoJdWFzc2VydC5QYW5pY3NDb250YWlucyh0LCBjdXIsICJ1bmtub3duIHRyYW5jaGUgaWQiLCBmdW5jKCkgeyBUcmFuY2hlSW5mbyg5OTk5OTkpIH0pCgl1YXNzZXJ0LlBhbmljc0NvbnRhaW5zKHQsIGN1ciwgIm11c3QgYmUgcG9zaXRpdmUiLCBmdW5jKCkgeyBUcmFuY2hlSW5mbygwKSB9KQoJdWFzc2VydC5QYW5pY3NDb250YWlucyh0LCBjdXIsICJtdXN0IGJlIHBvc2l0aXZlIiwgZnVuYygpIHsgVHJhbmNoZUluZm8oLTEpIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgkvLyBSZWxlYXNlIGNvbnN1bWVzIGJlZm9yZSBpdCBsb29rcyBhbnl0aGluZyB1cCwgc28gYW4gdW5rbm93biBpZCBpcwoJLy8gcmVqZWN0ZWQgYnkgZHVlYm9vayBhbmQgY2FycmllcyBkdWVib29rJ3Mgd29yZGluZywgbm90IHRoaXMgcmVhbG0ncwoJLy8gInVua25vd24gdHJhbmNoZSBpZCIuIFRoYXQgb3JkZXJpbmcgaXMgdGhlIHJlcGxheSBndWFyZCBhbmQgaXMgbm90CgkvLyB3b3J0aCByZXZlcnNpbmcgZm9yIGEgbmljZXIgbWVzc2FnZTogcmVhZGluZyB0aGUgdHJhbmNoZXMgdHJlZSBmaXJzdAoJLy8gd291bGQgcHV0IGEgbG9va3VwIGFoZWFkIG9mIHRoZSBjb25zdW1lLCB3aGljaCBpcyBleGFjdGx5IHRoZSBzaGFwZQoJLy8gdGhlIGNvbnN1bWVyIGNvbnRyYWN0IGZvcmJpZHMuCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vIHN1Y2ggb3BlbiBkZWZlcnJhbCIsIGZ1bmMoKSB7IFJlbGVhc2UoY3Jvc3MoY3VyKSwgOTk5OTk5KSB9KQp9CgpmdW5jIFRlc3RWZXN0ZWRPZlRyYWNrc1RoZVJldm9jYXRpb25Cb3VuZGFyeShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCglpZCA6PSBmdW5kQXMoY3VyLCBmdW5kZXIxLCBiZW5lMSwgNjAwLCAiYm91bmRhcnkiLCAiIiwgIjE6MTAwLDI6MjAwLDEwMDA6MzAwIiwgZmFsc2UpCgoJdmVzdGVkLCB1bnZlc3RlZCA6PSBWZXN0ZWRPZihpZCkKCWlmIHZlc3RlZCAhPSAwIHx8IHVudmVzdGVkICE9IDYwMCB7CgkJdC5GYXRhbGYoImF0IGZ1bmRpbmc6IHZlc3RlZD0lZCB1bnZlc3RlZD0lZCwgd2FudCAwLzYwMCIsIHZlc3RlZCwgdW52ZXN0ZWQpCgl9CgoJdGVzdGluZy5Ta2lwSGVpZ2h0cygxKQoJdmVzdGVkLCB1bnZlc3RlZCA9IFZlc3RlZE9mKGlkKQoJaWYgdmVzdGVkICE9IDEwMCB8fCB1bnZlc3RlZCAhPSA1MDAgewoJCXQuRmF0YWxmKCJhZnRlciAxIGJsb2NrOiB2ZXN0ZWQ9JWQgdW52ZXN0ZWQ9JWQsIHdhbnQgMTAwLzUwMCIsIHZlc3RlZCwgdW52ZXN0ZWQpCgl9CgoJdGVzdGluZy5Ta2lwSGVpZ2h0cygxKQoJdmVzdGVkLCB1bnZlc3RlZCA9IFZlc3RlZE9mKGlkKQoJaWYgdmVzdGVkICE9IDMwMCB8fCB1bnZlc3RlZCAhPSAzMDAgewoJCXQuRmF0YWxmKCJhZnRlciAyIGJsb2NrczogdmVzdGVkPSVkIHVudmVzdGVkPSVkLCB3YW50IDMwMC8zMDAiLCB2ZXN0ZWQsIHVudmVzdGVkKQoJfQoKCS8vIFJlbGVhc2luZyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHZlc3RlZCBmaWd1cmU6IHZlc3RlZCBtZWFucyAibm8gbG9uZ2VyCgkvLyByZXZvY2FibGUiLCB3aGV0aGVyIG9yIG5vdCBpdCBoYXMgYmVlbiBwYWlkIG91dC4KCWlkcyA6PSB0cmFuY2hlSURzT2YoaWQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHN0cmFuZ2VyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHN0cmFuZ2VyKQoJUmVsZWFzZShjcm9zcyhjdXIpLCBpZHNbMF0pCgl2ZXN0ZWQsIHVudmVzdGVkID0gVmVzdGVkT2YoaWQpCglpZiB2ZXN0ZWQgIT0gMzAwIHx8IHVudmVzdGVkICE9IDMwMCB7CgkJdC5GYXRhbGYoImFmdGVyIGEgcmVsZWFzZTogdmVzdGVkPSVkIHVudmVzdGVkPSVkLCB3YW50IDMwMC8zMDAiLCB2ZXN0ZWQsIHVudmVzdGVkKQoJfQoKCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKZnVuYyBUZXN0Vmlld3NBbmRSZW5kZXJEb05vdFBhbmljKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgkvLyBmZWVCcHMgaXMgYSByZWFsbSBnbG9iYWwgYW5kIHBlcnNpc3RzIGFjcm9zcyB0ZXN0cywgc28gYSB0ZXN0IHRoYXQKCS8vIGFzc2VydHMgYSBmZWUtZnJlZSBmaWd1cmUgbXVzdCBzZXQgdGhlIGZlZSBpdCB3YW50cyByYXRoZXIgdGhhbgoJLy8gaW5oZXJpdCB3aGF0ZXZlciB0aGUgbGFzdCBmZWUgdGVzdCBsZWZ0IOKAlCBpbmNsdWRpbmcgdGhlIGNhc2Ugd2hlcmUKCS8vIHRoYXQgdGVzdCBmYWlsZWQgYmVmb3JlIGl0cyBvd24gcmVzZXQgbGluZSByYW4uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCglTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgMCkKCgliIDo9IGJlZ2luKCkKCWlkIDo9IGZ1bmRBcyhjdXIsIGZ1bmRlcjEsIGJlbmUxLCAzMDAsICJyZW5kZXJhYmxlIiwgImEgKm1lbW8qIHdpdGggX21hcmtkb3duXyIsICIxOjEwMCw5MDA6MjAwIiwgdHJ1ZSkKCglpZiBvdXQgOj0gVHJhbmNoZXNPZihpZCk7ICFzdHJpbmdzLkNvbnRhaW5zKG91dCwgU3RhdHVzUGVuZGluZykgewoJCXQuRmF0YWxmKCJUcmFuY2hlc09mIG1pc3Npbmcgc3RhdHVzOiAlcSIsIG91dCkKCX0KCXRlc3RpbmcuU2tpcEhlaWdodHMoMSkKCWlmIG91dCA6PSBSZWxlYXNhYmxlTm93KCk7IG91dCA9PSAiIiB7CgkJdC5GYXRhbCgiUmVsZWFzYWJsZU5vdyBlbXB0eSB3aXRoIGEgZHVlIHRyYW5jaGUiKQoJfQoJaWYgZmVlLCBjcmVkaXRlZCA6PSBGZWVPbigxMDAwKTsgZmVlICE9IDAgfHwgY3JlZGl0ZWQgIT0gMTAwMCB7CgkJdC5GYXRhbGYoIkZlZU9uIGF0IDAgYnBzID0gJWQvJWQiLCBmZWUsIGNyZWRpdGVkKQoJfQoJaWYgT3BlblRyYW5jaGVDb3VudCgpIDwgMSB7CgkJdC5GYXRhbCgiT3BlblRyYW5jaGVDb3VudCBpcyB6ZXJvIHdpdGggcGVuZGluZyB0cmFuY2hlcyIpCgl9CglpZiBIZWlnaHQoKSA9PSAwIHsKCQl0LkZhdGFsKCJIZWlnaHQoKSBpcyB6ZXJvIikKCX0KCgkvLyBBc3NlcnQgdGhlIFNUQVRFLURFUEVOREVOVCBsaW5lLCBub3QgdGhlIGhlYWRpbmcuICJFICsgVSArIEYgKyBTIiBpcwoJLy8gZW1pdHRlZCB1bmNvbmRpdGlvbmFsbHkgYXMgcGFydCBvZiB0aGUgc2VjdGlvbiB0aXRsZSwgc28gbWF0Y2hpbmcgaXQKCS8vIHByb3ZlcyBvbmx5IHRoYXQgUmVuZGVyIHJhbiDigJQgaXQgd291bGQga2VlcCBwYXNzaW5nIHdoaWxlIHRoZSByZWFsbQoJLy8gcmVuZGVyZWQgImNvbnNlcnZhdGlvbjogVklPTEFURUQiIHVuZGVybmVhdGguCglpZiBvdXQgOj0gUmVuZGVyKCIiKTsgIXN0cmluZ3MuQ29udGFpbnMob3V0LCAiVmVzdGluZyIpIHx8CgkJIXN0cmluZ3MuQ29udGFpbnMob3V0LCAiY29uc2VydmF0aW9uOiBPSyIpIHsKCQl0LkZhdGFsZigib3ZlcnZpZXcgcmVuZGVyIHdyb25nOiAlcSIsIGhlYWQob3V0LCA0MDApKQoJfQoJaWYgb3V0IDo9IFJlbmRlcigiIik7ICFzdHJpbmdzLkNvbnRhaW5zKG91dCwgInBlciBmdW5kZXIiKSB7CgkJdC5GYXRhbGYoIm92ZXJ2aWV3IHJlbmRlciBvbWl0cyB0aGUgcGVyLWZ1bmRlciBjYXA6ICVxIiwgaGVhZChvdXQsIDQwMCkpCgl9CglpZiBvdXQgOj0gUmVuZGVyKGl0b2EoaWQpKTsgIXN0cmluZ3MuQ29udGFpbnMob3V0LCAiU2NoZWR1bGUgIyIraXRvYShpZCkpIHx8CgkJIXN0cmluZ3MuQ29udGFpbnMob3V0LCAicmVsZWFzYWJsZSBub3ciKSB7CgkJdC5GYXRhbGYoImRldGFpbCByZW5kZXIgd3Jvbmc6ICVxIiwgb3V0KQoJfQoJaWYgb3V0IDo9IFJlbmRlcigibm90LWEtbnVtYmVyIik7ICFzdHJpbmdzLkNvbnRhaW5zKG91dCwgImludmFsaWQgc2NoZWR1bGUgaWQiKSB7CgkJdC5GYXRhbGYoImJhZCBwYXRoIHJlbmRlcjogJXEiLCBvdXQpCgl9CglpZiBvdXQgOj0gUmVuZGVyKCI5OTk5OTkiKTsgIXN0cmluZ3MuQ29udGFpbnMob3V0LCAidW5rbm93biBzY2hlZHVsZSBpZCIpIHsKCQl0LkZhdGFsZigidW5rbm93biBwYXRoIHJlbmRlcjogJXEiLCBvdXQpCgl9CgoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgpmdW5jIGhlYWQocyBzdHJpbmcsIG4gaW50KSBzdHJpbmcgewoJaWYgbGVuKHMpIDw9IG4gewoJCXJldHVybiBzCgl9CglyZXR1cm4gc1s6bl0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTEyMDAwMDAwdWdub3QSEwiAyrXuARILMjUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECPhf90g+OC8yXeUFx4dbxf0HAqOip4lwnD2jA+CeUVacSQHrmm5fFQMa3CCogQ/CJS1SwktD7jP1mjVPgt+XFRQDgR4B4T/IQv5/puyC49L0X9ZWl5DlyAcroPHPI0dw/nDIaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=