Ly8gIEJvb3N0IHJhdGlvbmFsLmhwcCBoZWFkZXIgZmlsZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KCi8vICAoQykgQ29weXJpZ2h0IFBhdWwgTW9vcmUgMTk5OS4gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQKLy8gIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzCi8vICBpbiBhbGwgY29waWVzLiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yCi8vICBpbXBsaWVkIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgoKLy8gYm9vc3RpbnNwZWN0Om5vbGljZW5zZSAoZG9uJ3QgY29tcGxhaW4gYWJvdXQgdGhlIGxhY2sgb2YgYSBCb29zdCBsaWNlbnNlKQovLyAoUGF1bCBNb29yZSBoYXNuJ3QgYmVlbiBpbiBjb250YWN0IGZvciB5ZWFycywgc28gdGhlcmUncyBubyB3YXkgdG8gY2hhbmdlIHRoZQovLyBsaWNlbnNlLikKCi8vICBTZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9yYXRpb25hbCBmb3IgZG9jdW1lbnRhdGlvbi4KCi8vICBDcmVkaXRzOgovLyAgVGhhbmtzIHRvIHRoZSBib29zdCBtYWlsaW5nIGxpc3QgaW4gZ2VuZXJhbCBmb3IgdXNlZnVsIGNvbW1lbnRzLgovLyAgUGFydGljdWxhciBjb250cmlidXRpb25zIGluY2x1ZGVkOgovLyAgICBBbmRyZXcgRCBKZXdlbGwsIGZvciByZW1pbmRpbmcgbWUgdG8gdGFrZSBjYXJlIHRvIGF2b2lkIG92ZXJmbG93Ci8vICAgIEVkIEJyZXksIGZvciBtYW55IGNvbW1lbnRzLCBpbmNsdWRpbmcgcGlja2luZyB1cCBvbiBzb21lIGRyZWFkZnVsIHR5cG9zCi8vICAgIFN0ZXBoZW4gU2lsdmVyIGNvbnRyaWJ1dGVkIHRoZSB0ZXN0IHN1aXRlIGFuZCBjb21tZW50cyBvbiB1c2VyLWRlZmluZWQKLy8gICAgSW50VHlwZQovLyAgICBOaWNrb2xheSBNbGFkZW5vdiwgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBvcGVyYXRvcis9CgovLyAgUmV2aXNpb24gSGlzdG9yeQovLyAgMDUgTm92IDA2ICBDaGFuZ2UgcmF0aW9uYWxfY2FzdCB0byBub3QgZGVwZW5kIG9uIGRpdmlzaW9uIGJldHdlZW4gZGlmZmVyZW50Ci8vICAgICAgICAgICAgIHR5cGVzIChEYXJ5bGUgV2Fsa2VyKQovLyAgMDQgTm92IDA2ICBPZmYtbG9hZCBHQ0QgYW5kIExDTSB0byBCb29zdC5NYXRoOyBhZGQgc29tZSBpbnZhcmlhbnQgY2hlY2tzOwovLyAgICAgICAgICAgICBhZGQgc3RkOjpudW1lcmljX2xpbWl0czw+IHJlcXVpcmVtZW50IHRvIGhlbHAgR0NEIChEYXJ5bGUgV2Fsa2VyKQovLyAgMzEgT2N0IDA2ICBSZWNvZGVkIGJvdGggb3BlcmF0b3I8IHRvIHVzZSByb3VuZC10by1uZWdhdGl2ZS1pbmZpbml0eQovLyAgICAgICAgICAgICBkaXZpc2lvbnM7IHRoZSByYXRpb25hbC12YWx1ZSB2ZXJzaW9uIG5vdyB1c2VzIGNvbnRpbnVlZCBmcmFjdGlvbgovLyAgICAgICAgICAgICBleHBhbnNpb24gdG8gYXZvaWQgb3ZlcmZsb3dzLCBmb3IgYnVnICM3OTgzNTcgKERhcnlsZSBXYWxrZXIpCi8vICAyMCBPY3QgMDYgIEZpeCBvcGVyYXRvciBib29sX3R5cGUgZm9yIENXIDguMyAoSm9hcXXtbiBNIEzzcGV6IE118W96KQovLyAgMTggT2N0IDA2ICBVc2UgRVhQTElDSVRfVEVNUExBVEVfVFlQRSBoZWxwZXIgbWFjcm9zIGZyb20gQm9vc3QuQ29uZmlnCi8vICAgICAgICAgICAgIChKb2Fxde1uIE0gTPNwZXogTXXxb3opCi8vICAyNyBEZWMgMDUgIEFkZCBCb29sZWFuIGNvbnZlcnNpb24gb3BlcmF0b3IgKERhcnlsZSBXYWxrZXIpCi8vICAyOCBTZXAgMDIgIFVzZSBfbGVmdCB2ZXJzaW9ucyBvZiBvcGVyYXRvcnMgZnJvbSBvcGVyYXRvcnMuaHBwCi8vICAwNSBKdWwgMDEgIFJlY29kZSBnY2QoKSwgYXZvaWRpbmcgc3RkOjpzd2FwIChIZWxtdXQgWmVpc2VsKQovLyAgMDMgTWFyIDAxICBXb3JrYXJvdW5kcyBmb3IgSW50ZWwgQysrIDUuMCAoRGF2aWQgQWJyYWhhbXMpCi8vICAwNSBGZWIgMDEgIFVwZGF0ZSBvcGVyYXRvcj4+IHRvIHRpZ2h0ZW4gdXAgaW5wdXQgc3ludGF4Ci8vICAwNSBGZWIgMDEgIEZpbmFsIHRpZHkgdXAgb2YgZ2NkIGNvZGUgcHJpb3IgdG8gdGhlIG5ldyByZWxlYXNlCi8vICAyNyBKYW4gMDEgIFJlY29kZSBhYnMoKSB3aXRob3V0IHJlbHlpbmcgb24gYWJzKEludFR5cGUpCi8vICAyMSBKYW4gMDEgIEluY2x1ZGUgTmlja29sYXkgTWxhZGVub3YncyBvcGVyYXRvcis9IGFsZ29yaXRobSwKLy8gICAgICAgICAgICAgdGlkeSB1cCBhIG51bWJlciBvZiBhcmVhcywgdXNlIG5ld2VyIGZlYXR1cmVzIG9mIG9wZXJhdG9ycy5ocHAKLy8gICAgICAgICAgICAgKHJlZHVjZXMgc3BhY2Ugb3ZlcmhlYWQgdG8gemVybyksIGFkZCBvcGVyYXRvciEsCi8vICAgICAgICAgICAgIGludHJvZHVjZSBleHBsaWNpdCBtaXhlZC1tb2RlIGFyaXRobWV0aWMgb3BlcmF0aW9ucwovLyAgMTIgSmFuIDAxICBJbmNsdWRlIGZpeGVzIHRvIGhhbmRsZSBhIHVzZXItZGVmaW5lZCBJbnRUeXBlIGJldHRlcgovLyAgMTkgTm92IDAwICBUaHJvdyBvbiBkaXZpZGUgYnkgemVybyBpbiBvcGVyYXRvciAvPSAoSm9obiAoRUJvKSBEYXZpZCkKLy8gIDIzIEp1biAwMCAgSW5jb3Jwb3JhdGUgY2hhbmdlcyBmcm9tIE1hcmsgUm9kZ2VycyBmb3IgQm9ybGFuZCBDKysKLy8gIDIyIEp1biAwMCAgQ2hhbmdlIF9NU0NfVkVSIHRvIEJPT1NUX01TVkMgc28gb3RoZXIgY29tcGlsZXJzIGFyZSBub3QKLy8gICAgICAgICAgICAgYWZmZWN0ZWQgKEJlbWFuIERhd2VzKQovLyAgIDYgTWFyIDAwICBGaXggb3BlcmF0b3ItPSBub3JtYWxpemF0aW9uLCAjaW5jbHVkZSA8c3RyaW5nPiAoSmVucyBNYXVyZXIpCi8vICAxNCBEZWMgOTkgIE1vZGlmaWNhdGlvbnMgYmFzZWQgb24gY29tbWVudHMgZnJvbSB0aGUgYm9vc3QgbGlzdAovLyAgMDkgRGVjIDk5ICBJbml0aWFsIFZlcnNpb24gKFBhdWwgTW9vcmUpCgojaWZuZGVmIEJPT1NUX1JBVElPTkFMX0hQUAojZGVmaW5lIEJPT1NUX1JBVElPTkFMX0hQUAoKI2luY2x1ZGUgPGlvc3RyZWFtPiAgICAgICAgICAgICAgLy8gZm9yIHN0ZDo6aXN0cmVhbSBhbmQgc3RkOjpvc3RyZWFtCiNpbmNsdWRlIDxpb3M+ICAgICAgICAgICAgICAgICAgIC8vIGZvciBzdGQ6Om5vc2tpcHdzCiNpbmNsdWRlIDxzdGRleGNlcHQ+ICAgICAgICAgICAgIC8vIGZvciBzdGQ6OmRvbWFpbl9lcnJvcgojaW5jbHVkZSA8c3RyaW5nPiAgICAgICAgICAgICAgICAvLyBmb3Igc3RkOjpzdHJpbmcgaW1wbGljaXQgY29uc3RydWN0b3IKI2luY2x1ZGUgPGJvb3N0L29wZXJhdG9ycy5ocHA+ICAgLy8gZm9yIGJvb3N0OjphZGRhYmxlIGV0YwojaW5jbHVkZSA8Y3N0ZGxpYj4gICAgICAgICAgICAgICAvLyBmb3Igc3RkOjphYnMKI2luY2x1ZGUgPGJvb3N0L2NhbGxfdHJhaXRzLmhwcD4gLy8gZm9yIGJvb3N0OjpjYWxsX3RyYWl0cwojaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4gICAgICAvLyBmb3IgQk9PU1RfTk9fU1REQ19OQU1FU1BBQ0UsIEJPT1NUX01TVkMKI2luY2x1ZGUgPGJvb3N0L2RldGFpbC93b3JrYXJvdW5kLmhwcD4gLy8gZm9yIEJPT1NUX1dPUktBUk9VTkQKI2luY2x1ZGUgPGJvb3N0L2Fzc2VydC5ocHA+ICAgICAgLy8gZm9yIEJPT1NUX0FTU0VSVAojaW5jbHVkZSA8Ym9vc3QvbWF0aC9jb21tb25fZmFjdG9yX3J0LmhwcD4gIC8vIGZvciBib29zdDo6bWF0aDo6Z2NkLCBsY20KI2luY2x1ZGUgPGxpbWl0cz4gICAgICAgICAgICAgICAgLy8gZm9yIHN0ZDo6bnVtZXJpY19saW1pdHMKI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPiAgLy8gZm9yIEJPT1NUX1NUQVRJQ19BU1NFUlQKCi8vIENvbnRyb2wgd2hldGhlciBkZXByZWNpYXRlZCBHQ0QgYW5kIExDTSBmdW5jdGlvbnMgYXJlIGluY2x1ZGVkIChkZWZhdWx0OiB5ZXMpCiNpZm5kZWYgQk9PU1RfQ09OVFJPTF9SQVRJT05BTF9IQVNfR0NECiNkZWZpbmUgQk9PU1RfQ09OVFJPTF9SQVRJT05BTF9IQVNfR0NEICAxCiNlbmRpZgoKbmFtZXNwYWNlIGJvb3N0IHsKCiNpZiBCT09TVF9DT05UUk9MX1JBVElPTkFMX0hBU19HQ0QKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CkludFR5cGUgZ2NkKEludFR5cGUgbiwgSW50VHlwZSBtKQp7CiAgICAvLyBEZWZlciB0byB0aGUgdmVyc2lvbiBpbiBCb29zdC5NYXRoCiAgICByZXR1cm4gbWF0aDo6Z2NkKCBuLCBtICk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgpJbnRUeXBlIGxjbShJbnRUeXBlIG4sIEludFR5cGUgbSkKewogICAgLy8gRGVmZXIgdG8gdGhlIHZlcnNpb24gaW4gQm9vc3QuTWF0aAogICAgcmV0dXJuIG1hdGg6OmxjbSggbiwgbSApOwp9CiNlbmRpZiAgLy8gQk9PU1RfQ09OVFJPTF9SQVRJT05BTF9IQVNfR0NECgpjbGFzcyBiYWRfcmF0aW9uYWwgOiBwdWJsaWMgc3RkOjpkb21haW5fZXJyb3IKewpwdWJsaWM6CiAgICBleHBsaWNpdCBiYWRfcmF0aW9uYWwoKSA6IHN0ZDo6ZG9tYWluX2Vycm9yKCJiYWQgcmF0aW9uYWw6IHplcm8gZGVub21pbmF0b3IiKSB7fQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CmNsYXNzIHJhdGlvbmFsOwoKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CnJhdGlvbmFsPEludFR5cGU+IGFicyhjb25zdCByYXRpb25hbDxJbnRUeXBlPiYgcik7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50VHlwZT4KY2xhc3MgcmF0aW9uYWwgOgogICAgbGVzc190aGFuX2NvbXBhcmFibGUgPCByYXRpb25hbDxJbnRUeXBlPiwKICAgIGVxdWFsaXR5X2NvbXBhcmFibGUgPCByYXRpb25hbDxJbnRUeXBlPiwKICAgIGxlc3NfdGhhbl9jb21wYXJhYmxlMiA8IHJhdGlvbmFsPEludFR5cGU+LCBJbnRUeXBlLAogICAgZXF1YWxpdHlfY29tcGFyYWJsZTIgPCByYXRpb25hbDxJbnRUeXBlPiwgSW50VHlwZSwKICAgIGFkZGFibGUgPCByYXRpb25hbDxJbnRUeXBlPiwKICAgIHN1YnRyYWN0YWJsZSA8IHJhdGlvbmFsPEludFR5cGU+LAogICAgbXVsdGlwbGlhYmxlIDwgcmF0aW9uYWw8SW50VHlwZT4sCiAgICBkaXZpZGFibGUgPCByYXRpb25hbDxJbnRUeXBlPiwKICAgIGFkZGFibGUyIDwgcmF0aW9uYWw8SW50VHlwZT4sIEludFR5cGUsCiAgICBzdWJ0cmFjdGFibGUyIDwgcmF0aW9uYWw8SW50VHlwZT4sIEludFR5cGUsCiAgICBzdWJ0cmFjdGFibGUyX2xlZnQgPCByYXRpb25hbDxJbnRUeXBlPiwgSW50VHlwZSwKICAgIG11bHRpcGxpYWJsZTIgPCByYXRpb25hbDxJbnRUeXBlPiwgSW50VHlwZSwKICAgIGRpdmlkYWJsZTIgPCByYXRpb25hbDxJbnRUeXBlPiwgSW50VHlwZSwKICAgIGRpdmlkYWJsZTJfbGVmdCA8IHJhdGlvbmFsPEludFR5cGU+LCBJbnRUeXBlLAogICAgaW5jcmVtZW50YWJsZSA8IHJhdGlvbmFsPEludFR5cGU+LAogICAgZGVjcmVtZW50YWJsZSA8IHJhdGlvbmFsPEludFR5cGU+CiAgICA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+CnsKICAgIC8vIENsYXNzLXdpZGUgcHJlLWNvbmRpdGlvbnMKICAgIEJPT1NUX1NUQVRJQ19BU1NFUlQoIDo6c3RkOjpudW1lcmljX2xpbWl0czxJbnRUeXBlPjo6aXNfc3BlY2lhbGl6ZWQgKTsKCiAgICAvLyBIZWxwZXIgdHlwZXMKICAgIHR5cGVkZWYgdHlwZW5hbWUgYm9vc3Q6OmNhbGxfdHJhaXRzPEludFR5cGU+OjpwYXJhbV90eXBlIHBhcmFtX3R5cGU7CgogICAgc3RydWN0IGhlbHBlciB7IEludFR5cGUgcGFydHNbMl07IH07CiAgICB0eXBlZGVmIEludFR5cGUgKGhlbHBlcjo6KiBib29sX3R5cGUpWzJdOwoKcHVibGljOgogICAgdHlwZWRlZiBJbnRUeXBlIGludF90eXBlOwogICAgcmF0aW9uYWwoKSA6IG51bSgwKSwgZGVuKDEpIHt9CiAgICByYXRpb25hbChwYXJhbV90eXBlIG4pIDogbnVtKG4pLCBkZW4oMSkge30KICAgIHJhdGlvbmFsKHBhcmFtX3R5cGUgbiwgcGFyYW1fdHlwZSBkKSA6IG51bShuKSwgZGVuKGQpIHsgbm9ybWFsaXplKCk7IH0KCiAgICAvLyBEZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgYXJlIGZpbmUKCiAgICAvLyBBZGQgYXNzaWdubWVudCBmcm9tIEludFR5cGUKICAgIHJhdGlvbmFsJiBvcGVyYXRvcj0ocGFyYW1fdHlwZSBuKSB7IHJldHVybiBhc3NpZ24obiwgMSk7IH0KCiAgICAvLyBBc3NpZ24gaW4gcGxhY2UKICAgIHJhdGlvbmFsJiBhc3NpZ24ocGFyYW1fdHlwZSBuLCBwYXJhbV90eXBlIGQpOwoKICAgIC8vIEFjY2VzcyB0byByZXByZXNlbnRhdGlvbgogICAgSW50VHlwZSBudW1lcmF0b3IoKSBjb25zdCB7IHJldHVybiBudW07IH0KICAgIEludFR5cGUgZGVub21pbmF0b3IoKSBjb25zdCB7IHJldHVybiBkZW47IH0KCiAgICAvLyBBcml0aG1ldGljIGFzc2lnbm1lbnQgb3BlcmF0b3JzCiAgICByYXRpb25hbCYgb3BlcmF0b3IrPSAoY29uc3QgcmF0aW9uYWwmIHIpOwogICAgcmF0aW9uYWwmIG9wZXJhdG9yLT0gKGNvbnN0IHJhdGlvbmFsJiByKTsKICAgIHJhdGlvbmFsJiBvcGVyYXRvcio9IChjb25zdCByYXRpb25hbCYgcik7CiAgICByYXRpb25hbCYgb3BlcmF0b3IvPSAoY29uc3QgcmF0aW9uYWwmIHIpOwoKICAgIHJhdGlvbmFsJiBvcGVyYXRvcis9IChwYXJhbV90eXBlIGkpOwogICAgcmF0aW9uYWwmIG9wZXJhdG9yLT0gKHBhcmFtX3R5cGUgaSk7CiAgICByYXRpb25hbCYgb3BlcmF0b3IqPSAocGFyYW1fdHlwZSBpKTsKICAgIHJhdGlvbmFsJiBvcGVyYXRvci89IChwYXJhbV90eXBlIGkpOwoKICAgIC8vIEluY3JlbWVudCBhbmQgZGVjcmVtZW50CiAgICBjb25zdCByYXRpb25hbCYgb3BlcmF0b3IrKygpOwogICAgY29uc3QgcmF0aW9uYWwmIG9wZXJhdG9yLS0oKTsKCiAgICAvLyBPcGVyYXRvciBub3QKICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gIW51bTsgfQoKICAgIC8vIEJvb2xlYW4gY29udmVyc2lvbgogICAgCiNpZiBCT09TVF9XT1JLQVJPVU5EKF9fTVdFUktTX18sPD0weDMwMDMpCiAgICAvLyBUaGUgIklTTyBDKysgVGVtcGxhdGUgUGFyc2VyIiBvcHRpb24gaW4gQ1cgOC4zIGNob2tlcyBvbiB0aGUKICAgIC8vIGZvbGxvd2luZywgaGVuY2Ugd2Ugc2VsZWN0aXZlbHkgZGlzYWJsZSB0aGF0IG9wdGlvbiBmb3IgdGhlCiAgICAvLyBvZmZlbmRpbmcgbWVtZnVuLgojcHJhZ21hIHBhcnNlX21mdW5jX3RlbXBsIG9mZgojZW5kaWYKCiAgICBvcGVyYXRvciBib29sX3R5cGUoKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciAhKCkgPyAwIDogJmhlbHBlcjo6cGFydHM7IH0KCiNpZiBCT09TVF9XT1JLQVJPVU5EKF9fTVdFUktTX18sPD0weDMwMDMpCiNwcmFnbWEgcGFyc2VfbWZ1bmNfdGVtcGwgcmVzZXQKI2VuZGlmCgogICAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMKICAgIGJvb2wgb3BlcmF0b3I8IChjb25zdCByYXRpb25hbCYgcikgY29uc3Q7CiAgICBib29sIG9wZXJhdG9yPT0gKGNvbnN0IHJhdGlvbmFsJiByKSBjb25zdDsKCiAgICBib29sIG9wZXJhdG9yPCAocGFyYW1fdHlwZSBpKSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3I+IChwYXJhbV90eXBlIGkpIGNvbnN0OwogICAgYm9vbCBvcGVyYXRvcj09IChwYXJhbV90eXBlIGkpIGNvbnN0OwoKcHJpdmF0ZToKICAgIC8vIEltcGxlbWVudGF0aW9uIC0gbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciAobm9ybWFsaXplZCkuCiAgICAvLyBPdGhlciBwb3NzaWJpbGl0aWVzIC0gc2VwYXJhdGUgd2hvbGUtcGFydCwgb3Igc2lnbiwgZmllbGRzPwogICAgSW50VHlwZSBudW07CiAgICBJbnRUeXBlIGRlbjsKCiAgICAvLyBSZXByZXNlbnRhdGlvbiBub3RlOiBGcmFjdGlvbnMgYXJlIGtlcHQgaW4gbm9ybWFsaXplZCBmb3JtIGF0IGFsbAogICAgLy8gdGltZXMuIG5vcm1hbGl6ZWQgZm9ybSBpcyBkZWZpbmVkIGFzIGdjZChudW0sZGVuKSA9PSAxIGFuZCBkZW4gPiAwLgogICAgLy8gSW4gcGFydGljdWxhciwgbm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhYnMoKSBiZWxvdyByZWxpZXMKICAgIC8vIG9uIGRlbiBhbHdheXMgYmVpbmcgcG9zaXRpdmUuCiAgICBib29sIHRlc3RfaW52YXJpYW50KCkgY29uc3Q7CiAgICB2b2lkIG5vcm1hbGl6ZSgpOwp9OwoKLy8gQXNzaWduIGluIHBsYWNlCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgppbmxpbmUgcmF0aW9uYWw8SW50VHlwZT4mIHJhdGlvbmFsPEludFR5cGU+Ojphc3NpZ24ocGFyYW1fdHlwZSBuLCBwYXJhbV90eXBlIGQpCnsKICAgIG51bSA9IG47CiAgICBkZW4gPSBkOwogICAgbm9ybWFsaXplKCk7CiAgICByZXR1cm4gKnRoaXM7Cn0KCi8vIFVuYXJ5IHBsdXMgYW5kIG1pbnVzCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgppbmxpbmUgcmF0aW9uYWw8SW50VHlwZT4gb3BlcmF0b3IrIChjb25zdCByYXRpb25hbDxJbnRUeXBlPiYgcikKewogICAgcmV0dXJuIHI7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgppbmxpbmUgcmF0aW9uYWw8SW50VHlwZT4gb3BlcmF0b3ItIChjb25zdCByYXRpb25hbDxJbnRUeXBlPiYgcikKewogICAgcmV0dXJuIHJhdGlvbmFsPEludFR5cGU+KC1yLm51bWVyYXRvcigpLCByLmRlbm9taW5hdG9yKCkpOwp9CgovLyBBcml0aG1ldGljIGFzc2lnbm1lbnQgb3BlcmF0b3JzCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgpyYXRpb25hbDxJbnRUeXBlPiYgcmF0aW9uYWw8SW50VHlwZT46Om9wZXJhdG9yKz0gKGNvbnN0IHJhdGlvbmFsPEludFR5cGU+JiByKQp7CiAgICAvLyBUaGlzIGNhbGN1bGF0aW9uIGF2b2lkcyBvdmVyZmxvdywgYW5kIG1pbmltaXNlcyB0aGUgbnVtYmVyIG9mIGV4cGVuc2l2ZQogICAgLy8gY2FsY3VsYXRpb25zLiBUaGFua3MgdG8gTmlja29sYXkgTWxhZGVub3YgZm9yIHRoaXMgYWxnb3JpdGhtLgogICAgLy8KICAgIC8vIFByb29mOgogICAgLy8gV2UgaGF2ZSB0byBjb21wdXRlIGEvYiArIGMvZCwgd2hlcmUgZ2NkKGEsYik9MSBhbmQgZ2NkKGIsYyk9MS4KICAgIC8vIExldCBnID0gZ2NkKGIsZCksIGFuZCBiID0gYjEqZywgZD1kMSpnLiBUaGVuIGdjZChiMSxkMSk9MQogICAgLy8KICAgIC8vIFRoZSByZXN1bHQgaXMgKGEqZDEgKyBjKmIxKSAvIChiMSpkMSpnKS4KICAgIC8vIE5vdyB3ZSBoYXZlIHRvIG5vcm1hbGl6ZSB0aGlzIHJhdGlvLgogICAgLy8gTGV0J3MgYXNzdW1lIGggfCBnY2QoKGEqZDEgKyBjKmIxKSwgKGIxKmQxKmcpKSwgYW5kIGggPiAxCiAgICAvLyBJZiBoIHwgYjEgdGhlbiBnY2QoaCxkMSk9MSBhbmQgaGVuY2UgaHwoYSpkMStjKmIxKSA9PiBofGEuCiAgICAvLyBCdXQgc2luY2UgZ2NkKGEsYjEpPTEgd2UgaGF2ZSBoPTEuCiAgICAvLyBTaW1pbGFybHkgaHxkMSBsZWFkcyB0byBoPTEuCiAgICAvLyBTbyB3ZSBoYXZlIHRoYXQgaCB8IGdjZCgoYSpkMSArIGMqYjEpICwgKGIxKmQxKmcpKSA9PiBofGcKICAgIC8vIEZpbmFsbHkgd2UgaGF2ZSBnY2QoKGEqZDEgKyBjKmIxKSwgKGIxKmQxKmcpKSA9IGdjZCgoYSpkMSArIGMqYjEpLCBnKQogICAgLy8gV2hpY2ggcHJvdmVzIHRoYXQgaW5zdGVhZCBvZiBub3JtYWxpemluZyB0aGUgcmVzdWx0LCBpdCBpcyBiZXR0ZXIgdG8KICAgIC8vIGRpdmlkZSBudW0gYW5kIGRlbiBieSBnY2QoKGEqZDEgKyBjKmIxKSwgZykKCiAgICAvLyBQcm90ZWN0IGFnYWluc3Qgc2VsZi1tb2RpZmljYXRpb24KICAgIEludFR5cGUgcl9udW0gPSByLm51bTsKICAgIEludFR5cGUgcl9kZW4gPSByLmRlbjsKCiAgICBJbnRUeXBlIGcgPSBtYXRoOjpnY2QoZGVuLCByX2Rlbik7CiAgICBkZW4gLz0gZzsgIC8vID0gYjEgZnJvbSB0aGUgY2FsY3VsYXRpb25zIGFib3ZlCiAgICBudW0gPSBudW0gKiAocl9kZW4gLyBnKSArIHJfbnVtICogZGVuOwogICAgZyA9IG1hdGg6OmdjZChudW0sIGcpOwogICAgbnVtIC89IGc7CiAgICBkZW4gKj0gcl9kZW4vZzsKCiAgICByZXR1cm4gKnRoaXM7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgpyYXRpb25hbDxJbnRUeXBlPiYgcmF0aW9uYWw8SW50VHlwZT46Om9wZXJhdG9yLT0gKGNvbnN0IHJhdGlvbmFsPEludFR5cGU+JiByKQp7CiAgICAvLyBQcm90ZWN0IGFnYWluc3Qgc2VsZi1tb2RpZmljYXRpb24KICAgIEludFR5cGUgcl9udW0gPSByLm51bTsKICAgIEludFR5cGUgcl9kZW4gPSByLmRlbjsKCiAgICAvLyBUaGlzIGNhbGN1bGF0aW9uIGF2b2lkcyBvdmVyZmxvdywgYW5kIG1pbmltaXNlcyB0aGUgbnVtYmVyIG9mIGV4cGVuc2l2ZQogICAgLy8gY2FsY3VsYXRpb25zLiBJdCBjb3JyZXNwb25kcyBleGFjdGx5IHRvIHRoZSArPSBjYXNlIGFib3ZlCiAgICBJbnRUeXBlIGcgPSBtYXRoOjpnY2QoZGVuLCByX2Rlbik7CiAgICBkZW4gLz0gZzsKICAgIG51bSA9IG51bSAqIChyX2RlbiAvIGcpIC0gcl9udW0gKiBkZW47CiAgICBnID0gbWF0aDo6Z2NkKG51bSwgZyk7CiAgICBudW0gLz0gZzsKICAgIGRlbiAqPSByX2Rlbi9nOwoKICAgIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CnJhdGlvbmFsPEludFR5cGU+JiByYXRpb25hbDxJbnRUeXBlPjo6b3BlcmF0b3IqPSAoY29uc3QgcmF0aW9uYWw8SW50VHlwZT4mIHIpCnsKICAgIC8vIFByb3RlY3QgYWdhaW5zdCBzZWxmLW1vZGlmaWNhdGlvbgogICAgSW50VHlwZSByX251bSA9IHIubnVtOwogICAgSW50VHlwZSByX2RlbiA9IHIuZGVuOwoKICAgIC8vIEF2b2lkIG92ZXJmbG93IGFuZCBwcmVzZXJ2ZSBub3JtYWxpemF0aW9uCiAgICBJbnRUeXBlIGdjZDEgPSBtYXRoOjpnY2QobnVtLCByX2Rlbik7CiAgICBJbnRUeXBlIGdjZDIgPSBtYXRoOjpnY2Qocl9udW0sIGRlbik7CiAgICBudW0gPSAobnVtL2djZDEpICogKHJfbnVtL2djZDIpOwogICAgZGVuID0gKGRlbi9nY2QyKSAqIChyX2Rlbi9nY2QxKTsKICAgIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CnJhdGlvbmFsPEludFR5cGU+JiByYXRpb25hbDxJbnRUeXBlPjo6b3BlcmF0b3IvPSAoY29uc3QgcmF0aW9uYWw8SW50VHlwZT4mIHIpCnsKICAgIC8vIFByb3RlY3QgYWdhaW5zdCBzZWxmLW1vZGlmaWNhdGlvbgogICAgSW50VHlwZSByX251bSA9IHIubnVtOwogICAgSW50VHlwZSByX2RlbiA9IHIuZGVuOwoKICAgIC8vIEF2b2lkIHJlcGVhdGVkIGNvbnN0cnVjdGlvbgogICAgSW50VHlwZSB6ZXJvKDApOwoKICAgIC8vIFRyYXAgZGl2aXNpb24gYnkgemVybwogICAgaWYgKHJfbnVtID09IHplcm8pCiAgICAgICAgdGhyb3cgYmFkX3JhdGlvbmFsKCk7CiAgICBpZiAobnVtID09IHplcm8pCiAgICAgICAgcmV0dXJuICp0aGlzOwoKICAgIC8vIEF2b2lkIG92ZXJmbG93IGFuZCBwcmVzZXJ2ZSBub3JtYWxpemF0aW9uCiAgICBJbnRUeXBlIGdjZDEgPSBtYXRoOjpnY2QobnVtLCByX251bSk7CiAgICBJbnRUeXBlIGdjZDIgPSBtYXRoOjpnY2Qocl9kZW4sIGRlbik7CiAgICBudW0gPSAobnVtL2djZDEpICogKHJfZGVuL2djZDIpOwogICAgZGVuID0gKGRlbi9nY2QyKSAqIChyX251bS9nY2QxKTsKCiAgICBpZiAoZGVuIDwgemVybykgewogICAgICAgIG51bSA9IC1udW07CiAgICAgICAgZGVuID0gLWRlbjsKICAgIH0KICAgIHJldHVybiAqdGhpczsKfQoKLy8gTWl4ZWQtbW9kZSBvcGVyYXRvcnMKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CmlubGluZSByYXRpb25hbDxJbnRUeXBlPiYKcmF0aW9uYWw8SW50VHlwZT46Om9wZXJhdG9yKz0gKHBhcmFtX3R5cGUgaSkKewogICAgcmV0dXJuIG9wZXJhdG9yKz0gKHJhdGlvbmFsPEludFR5cGU+KGkpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CmlubGluZSByYXRpb25hbDxJbnRUeXBlPiYKcmF0aW9uYWw8SW50VHlwZT46Om9wZXJhdG9yLT0gKHBhcmFtX3R5cGUgaSkKewogICAgcmV0dXJuIG9wZXJhdG9yLT0gKHJhdGlvbmFsPEludFR5cGU+KGkpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CmlubGluZSByYXRpb25hbDxJbnRUeXBlPiYKcmF0aW9uYWw8SW50VHlwZT46Om9wZXJhdG9yKj0gKHBhcmFtX3R5cGUgaSkKewogICAgcmV0dXJuIG9wZXJhdG9yKj0gKHJhdGlvbmFsPEludFR5cGU+KGkpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CmlubGluZSByYXRpb25hbDxJbnRUeXBlPiYKcmF0aW9uYWw8SW50VHlwZT46Om9wZXJhdG9yLz0gKHBhcmFtX3R5cGUgaSkKewogICAgcmV0dXJuIG9wZXJhdG9yLz0gKHJhdGlvbmFsPEludFR5cGU+KGkpKTsKfQoKLy8gSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CmlubGluZSBjb25zdCByYXRpb25hbDxJbnRUeXBlPiYgcmF0aW9uYWw8SW50VHlwZT46Om9wZXJhdG9yKysoKQp7CiAgICAvLyBUaGlzIGNhbiBuZXZlciBkZW5vcm1hbGlzZSB0aGUgZnJhY3Rpb24KICAgIG51bSArPSBkZW47CiAgICByZXR1cm4gKnRoaXM7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgppbmxpbmUgY29uc3QgcmF0aW9uYWw8SW50VHlwZT4mIHJhdGlvbmFsPEludFR5cGU+OjpvcGVyYXRvci0tKCkKewogICAgLy8gVGhpcyBjYW4gbmV2ZXIgZGVub3JtYWxpc2UgdGhlIGZyYWN0aW9uCiAgICBudW0gLT0gZGVuOwogICAgcmV0dXJuICp0aGlzOwp9CgovLyBDb21wYXJpc29uIG9wZXJhdG9ycwp0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50VHlwZT4KYm9vbCByYXRpb25hbDxJbnRUeXBlPjo6b3BlcmF0b3I8IChjb25zdCByYXRpb25hbDxJbnRUeXBlPiYgcikgY29uc3QKewogICAgLy8gQXZvaWQgcmVwZWF0ZWQgY29uc3RydWN0aW9uCiAgICBpbnRfdHlwZSBjb25zdCAgemVybyggMCApOwoKICAgIC8vIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIGNsYXNzLXdpZGUgaW52YXJpYW50LiAgVGhlIHJlYXNvbiBmb3IgdGhlc2UKICAgIC8vIGNoZWNrcyBpcyB0aGF0IGZvciAyJ3MgY29tcGxlbWVudCBzeXN0ZW1zLCBJTlRfTUlOIGhhcyBubyBjb3JyZXNwb25kaW5nCiAgICAvLyBwb3NpdGl2ZSwgc28gbmVnYXRpbmcgaXQgZHVyaW5nIG5vcm1hbGl6YXRpb24ga2VlcHMgaXQgSU5UX01JTiwgd2hpY2gKICAgIC8vIGlzIGJhZCBmb3IgbGF0ZXIgY2FsY3VsYXRpb25zIHRoYXQgYXNzdW1lIGEgcG9zaXRpdmUgZGVub21pbmF0b3IuCiAgICBCT09TVF9BU1NFUlQoIHRoaXMtPmRlbiA+IHplcm8gKTsKICAgIEJPT1NUX0FTU0VSVCggci5kZW4gPiB6ZXJvICk7CgogICAgLy8gRGV0ZXJtaW5lIHJlbGF0aXZlIG9yZGVyIGJ5IGV4cGFuZGluZyBlYWNoIHZhbHVlIHRvIGl0cyBzaW1wbGUgY29udGludWVkCiAgICAvLyBmcmFjdGlvbiByZXByZXNlbnRhdGlvbiB1c2luZyB0aGUgRXVjbGlkaWFuIEdDRCBhbGdvcml0aG0uCiAgICBzdHJ1Y3QgeyBpbnRfdHlwZSAgbiwgZCwgcSwgcjsgfSAgdHMgPSB7IHRoaXMtPm51bSwgdGhpcy0+ZGVuLCB0aGlzLT5udW0gLwogICAgIHRoaXMtPmRlbiwgdGhpcy0+bnVtICUgdGhpcy0+ZGVuIH0sIHJzID0geyByLm51bSwgci5kZW4sIHIubnVtIC8gci5kZW4sCiAgICAgci5udW0gJSByLmRlbiB9OwogICAgdW5zaWduZWQgIHJldmVyc2UgPSAwdTsKCiAgICAvLyBOb3JtYWxpemUgbmVnYXRpdmUgbW9kdWxpIGJ5IHJlcGVhdGVkbHkgYWRkaW5nIHRoZSAocG9zaXRpdmUpIGRlbm9taW5hdG9yCiAgICAvLyBhbmQgZGVjcmVtZW50aW5nIHRoZSBxdW90aWVudC4gIExhdGVyIGN5Y2xlcyBzaG91bGQgaGF2ZSBhbGwgcG9zaXRpdmUKICAgIC8vIHZhbHVlcywgc28gdGhpcyBvbmx5IGhhcyB0byBiZSBkb25lIGZvciB0aGUgZmlyc3QgY3ljbGUuICAoVGhlIHJ1bGVzIG9mCiAgICAvLyBDKysgcmVxdWlyZSBhIG5vbm5lZ2F0aXZlIHF1b3RpZW50ICYgcmVtYWluZGVyIGZvciBhIG5vbm5lZ2F0aXZlIGRpdmlkZW5kCiAgICAvLyAmIHBvc2l0aXZlIGRpdmlzb3IuKQogICAgd2hpbGUgKCB0cy5yIDwgemVybyApICB7IHRzLnIgKz0gdHMuZDsgLS10cy5xOyB9CiAgICB3aGlsZSAoIHJzLnIgPCB6ZXJvICkgIHsgcnMuciArPSBycy5kOyAtLXJzLnE7IH0KCiAgICAvLyBMb29wIHRocm91Z2ggYW5kIGNvbXBhcmUgZWFjaCB2YXJpYWJsZSdzIGNvbnRpbnVlZC1mcmFjdGlvbiBjb21wb25lbnRzCiAgICB3aGlsZSAoIHRydWUgKQogICAgewogICAgICAgIC8vIFRoZSBxdW90aWVudHMgb2YgdGhlIGN1cnJlbnQgY3ljbGUgYXJlIHRoZSBjb250aW51ZWQtZnJhY3Rpb24KICAgICAgICAvLyBjb21wb25lbnRzLiAgQ29tcGFyaW5nIHR3byBjLmYuIGlzIGNvbXBhcmluZyB0aGVpciBzZXF1ZW5jZXMsCiAgICAgICAgLy8gc3RvcHBpbmcgYXQgdGhlIGZpcnN0IGRpZmZlcmVuY2UuCiAgICAgICAgaWYgKCB0cy5xICE9IHJzLnEgKQogICAgICAgIHsKICAgICAgICAgICAgLy8gU2luY2UgcmVjaXByb2NhdGlvbiBjaGFuZ2VzIHRoZSByZWxhdGl2ZSBvcmRlciBvZiB0d28gdmFyaWFibGVzLAogICAgICAgICAgICAvLyBhbmQgYy5mLiB1c2UgcmVjaXByb2NhbHMsIHRoZSBsZXNzL2dyZWF0ZXItdGhhbiB0ZXN0IHJldmVyc2VzCiAgICAgICAgICAgIC8vIGFmdGVyIGVhY2ggaW5kZXguICAoU3RhcnQgdy8gbm9uLXJldmVyc2VkIEAgd2hvbGUtbnVtYmVyIHBsYWNlLikKICAgICAgICAgICAgcmV0dXJuIHJldmVyc2UgPyB0cy5xID4gcnMucSA6IHRzLnEgPCBycy5xOwogICAgICAgIH0KCiAgICAgICAgLy8gUHJlcGFyZSB0aGUgbmV4dCBjeWNsZQogICAgICAgIHJldmVyc2UgXj0gMXU7CgogICAgICAgIGlmICggKHRzLnIgPT0gemVybykgfHwgKHJzLnIgPT0gemVybykgKQogICAgICAgIHsKICAgICAgICAgICAgLy8gQXQgbGVhc3Qgb25lIHZhcmlhYmxlJ3MgYy5mLiBleHBhbnNpb24gaGFzIGVuZGVkCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgdHMubiA9IHRzLmQ7ICAgICAgICAgdHMuZCA9IHRzLnI7CiAgICAgICAgdHMucSA9IHRzLm4gLyB0cy5kOyAgdHMuciA9IHRzLm4gJSB0cy5kOwogICAgICAgIHJzLm4gPSBycy5kOyAgICAgICAgIHJzLmQgPSBycy5yOwogICAgICAgIHJzLnEgPSBycy5uIC8gcnMuZDsgIHJzLnIgPSBycy5uICUgcnMuZDsKICAgIH0KCiAgICAvLyBDb21wYXJlIGluZmluaXR5LXZhbHVlZCBjb21wb25lbnRzIGZvciBvdGhlcndpc2UgZXF1YWwgc2VxdWVuY2VzCiAgICBpZiAoIHRzLnIgPT0gcnMuciApCiAgICB7CiAgICAgICAgLy8gQm90aCByZW1haW5kZXJzIGFyZSB6ZXJvLCBzbyB0aGUgbmV4dCAoYW5kIHN1YnNlcXVlbnQpIGMuZi4KICAgICAgICAvLyBjb21wb25lbnRzIGZvciBib3RoIHNlcXVlbmNlcyBhcmUgaW5maW5pdHkuICBUaGVyZWZvcmUsIHRoZSBzZXF1ZW5jZXMKICAgICAgICAvLyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMgYXJlIGVxdWFsLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UKICAgIHsKI2lmZGVmIEJPT1NUX01TVkMKI3ByYWdtYSB3YXJuaW5nKHB1c2gpCiNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ4MDApCiNlbmRpZgogICAgICAgIC8vIEV4YWN0bHkgb25lIG9mIHRoZSByZW1haW5kZXJzIGlzIHplcm8sIHNvIGFsbCBmb2xsb3dpbmcgYy5mLgogICAgICAgIC8vIGNvbXBvbmVudHMgb2YgdGhhdCB2YXJpYWJsZSBhcmUgaW5maW5pdHksIHdoaWxlIHRoZSBvdGhlciB2YXJpYWJsZQogICAgICAgIC8vIGhhcyBhIGZpbml0ZSBuZXh0IGMuZi4gY29tcG9uZW50LiAgU28gdGhhdCBvdGhlciB2YXJpYWJsZSBoYXMgdGhlCiAgICAgICAgLy8gbGVzc2VyIHZhbHVlIChtb2R1bG8gdGhlIHJldmVyc2FsIGZsYWchKS4KICAgICAgICByZXR1cm4gKCB0cy5yICE9IHplcm8gKSAhPSBzdGF0aWNfY2FzdDxib29sPiggcmV2ZXJzZSApOwojaWZkZWYgQk9PU1RfTVNWQwojcHJhZ21hIHdhcm5pbmcocG9wKQojZW5kaWYKICAgIH0KfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CmJvb2wgcmF0aW9uYWw8SW50VHlwZT46Om9wZXJhdG9yPCAocGFyYW1fdHlwZSBpKSBjb25zdAp7CiAgICAvLyBBdm9pZCByZXBlYXRlZCBjb25zdHJ1Y3Rpb24KICAgIGludF90eXBlIGNvbnN0ICB6ZXJvKCAwICk7CgogICAgLy8gQnJlYWsgdmFsdWUgaW50byBtaXhlZC1mcmFjdGlvbiBmb3JtLCB3LyBhbHdheXMtbm9ubmVnYXRpdmUgcmVtYWluZGVyCiAgICBCT09TVF9BU1NFUlQoIHRoaXMtPmRlbiA+IHplcm8gKTsKICAgIGludF90eXBlICBxID0gdGhpcy0+bnVtIC8gdGhpcy0+ZGVuLCByID0gdGhpcy0+bnVtICUgdGhpcy0+ZGVuOwogICAgd2hpbGUgKCByIDwgemVybyApICB7IHIgKz0gdGhpcy0+ZGVuOyAtLXE7IH0KCiAgICAvLyBDb21wYXJlIHdpdGgganVzdCB0aGUgcXVvdGllbnQsIHNpbmNlIHRoZSByZW1haW5kZXIgYWx3YXlzIGJ1bXBzIHRoZQogICAgLy8gdmFsdWUgdXAuICBbU2luY2UgcSA9IGZsb29yKG4vZCksIGFuZCBpZiBuL2QgPCBpIHRoZW4gcSA8IGksIGlmIG4vZCA9PSBpCiAgICAvLyB0aGVuIHEgPT0gaSwgaWYgbi9kID09IGkgKyByL2QgdGhlbiBxID09IGksIGFuZCBpZiBuL2QgPj0gaSArIDEgdGhlbgogICAgLy8gcSA+PSBpICsgMSA+IGk7IHRoZXJlZm9yZSBuL2QgPCBpIGlmZiBxIDwgaS5dCiAgICByZXR1cm4gcSA8IGk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgpib29sIHJhdGlvbmFsPEludFR5cGU+OjpvcGVyYXRvcj4gKHBhcmFtX3R5cGUgaSkgY29uc3QKewogICAgLy8gVHJhcCBlcXVhbGl0eSBmaXJzdAogICAgaWYgKG51bSA9PSBpICYmIGRlbiA9PSBJbnRUeXBlKDEpKQogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAvLyBPdGhlcndpc2UsIHdlIGNhbiB1c2Ugb3BlcmF0b3I8CiAgICByZXR1cm4gIW9wZXJhdG9yPChpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CmlubGluZSBib29sIHJhdGlvbmFsPEludFR5cGU+OjpvcGVyYXRvcj09IChjb25zdCByYXRpb25hbDxJbnRUeXBlPiYgcikgY29uc3QKewogICAgcmV0dXJuICgobnVtID09IHIubnVtKSAmJiAoZGVuID09IHIuZGVuKSk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgppbmxpbmUgYm9vbCByYXRpb25hbDxJbnRUeXBlPjo6b3BlcmF0b3I9PSAocGFyYW1fdHlwZSBpKSBjb25zdAp7CiAgICByZXR1cm4gKChkZW4gPT0gSW50VHlwZSgxKSkgJiYgKG51bSA9PSBpKSk7Cn0KCi8vIEludmFyaWFudCBjaGVjawp0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50VHlwZT4KaW5saW5lIGJvb2wgcmF0aW9uYWw8SW50VHlwZT46OnRlc3RfaW52YXJpYW50KCkgY29uc3QKewogICAgcmV0dXJuICggdGhpcy0+ZGVuID4gaW50X3R5cGUoMCkgKSAmJiAoIG1hdGg6OmdjZCh0aGlzLT5udW0sIHRoaXMtPmRlbikgPT0KICAgICBpbnRfdHlwZSgxKSApOwp9CgovLyBOb3JtYWxpc2F0aW9uCnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgp2b2lkIHJhdGlvbmFsPEludFR5cGU+Ojpub3JtYWxpemUoKQp7CiAgICAvLyBBdm9pZCByZXBlYXRlZCBjb25zdHJ1Y3Rpb24KICAgIEludFR5cGUgemVybygwKTsKCiAgICBpZiAoZGVuID09IHplcm8pCiAgICAgICAgdGhyb3cgYmFkX3JhdGlvbmFsKCk7CgogICAgLy8gSGFuZGxlIHRoZSBjYXNlIG9mIHplcm8gc2VwYXJhdGVseSwgdG8gYXZvaWQgZGl2aXNpb24gYnkgemVybwogICAgaWYgKG51bSA9PSB6ZXJvKSB7CiAgICAgICAgZGVuID0gSW50VHlwZSgxKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgSW50VHlwZSBnID0gbWF0aDo6Z2NkKG51bSwgZGVuKTsKCiAgICBudW0gLz0gZzsKICAgIGRlbiAvPSBnOwoKICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBkZW5vbWluYXRvciBpcyBwb3NpdGl2ZQogICAgaWYgKGRlbiA8IHplcm8pIHsKICAgICAgICBudW0gPSAtbnVtOwogICAgICAgIGRlbiA9IC1kZW47CiAgICB9CgogICAgQk9PU1RfQVNTRVJUKCB0aGlzLT50ZXN0X2ludmFyaWFudCgpICk7Cn0KCm5hbWVzcGFjZSBkZXRhaWwgewoKICAgIC8vIEEgdXRpbGl0eSBjbGFzcyB0byByZXNldCB0aGUgZm9ybWF0IGZsYWdzIGZvciBhbiBpc3RyZWFtIGF0IGVuZAogICAgLy8gb2Ygc2NvcGUsIGV2ZW4gaW4gY2FzZSBvZiBleGNlcHRpb25zCiAgICBzdHJ1Y3QgcmVzZXR0ZXIgewogICAgICAgIHJlc2V0dGVyKHN0ZDo6aXN0cmVhbSYgaXMpIDogaXNfKGlzKSwgZl8oaXMuZmxhZ3MoKSkge30KICAgICAgICB+cmVzZXR0ZXIoKSB7IGlzXy5mbGFncyhmXyk7IH0KICAgICAgICBzdGQ6OmlzdHJlYW0mIGlzXzsKICAgICAgICBzdGQ6OmlzdHJlYW06OmZtdGZsYWdzIGZfOyAgICAgIC8vIG9sZCBHTlUgYysrIGxpYiBoYXMgbm8gaW9zX2Jhc2UKICAgIH07Cgp9CgovLyBJbnB1dCBhbmQgb3V0cHV0CnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgpzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4gKHN0ZDo6aXN0cmVhbSYgaXMsIHJhdGlvbmFsPEludFR5cGU+JiByKQp7CiAgICBJbnRUeXBlIG4gPSBJbnRUeXBlKDApLCBkID0gSW50VHlwZSgxKTsKICAgIGNoYXIgYyA9IDA7CiAgICBkZXRhaWw6OnJlc2V0dGVyIHNlbnRyeShpcyk7CgogICAgaXMgPj4gbjsKICAgIGMgPSBpcy5nZXQoKTsKCiAgICBpZiAoYyAhPSAnLycpCiAgICAgICAgaXMuY2xlYXIoc3RkOjppc3RyZWFtOjpiYWRiaXQpOyAgLy8gb2xkIEdOVSBjKysgbGliIGhhcyBubyBpb3NfYmFzZQoKI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDMpKSB8fCBkZWZpbmVkIF9fU0dJX1NUTF9QT1JUCiAgICBpcyA+PiBzdGQ6Om5vc2tpcHdzOwojZWxzZQogICAgaXMudW5zZXRmKGlvczo6c2tpcHdzKTsgLy8gY29tcGlsZXMsIGJ1dCBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdC4KI2VuZGlmCiAgICBpcyA+PiBkOwoKICAgIGlmIChpcykKICAgICAgICByLmFzc2lnbihuLCBkKTsKCiAgICByZXR1cm4gaXM7Cn0KCi8vIEFkZCBtYW5pcHVsYXRvcnMgZm9yIG91dHB1dCBmb3JtYXQ/CnRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IHJhdGlvbmFsPEludFR5cGU+JiByKQp7CiAgICBvcyA8PCByLm51bWVyYXRvcigpIDw8ICcvJyA8PCByLmRlbm9taW5hdG9yKCk7CiAgICByZXR1cm4gb3M7Cn0KCi8vIFR5cGUgY29udmVyc2lvbgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW50VHlwZT4KaW5saW5lIFQgcmF0aW9uYWxfY2FzdCgKICAgIGNvbnN0IHJhdGlvbmFsPEludFR5cGU+JiBzcmMgQk9PU1RfQVBQRU5EX0VYUExJQ0lUX1RFTVBMQVRFX1RZUEUoVCkpCnsKICAgIHJldHVybiBzdGF0aWNfY2FzdDxUPihzcmMubnVtZXJhdG9yKCkpL3N0YXRpY19jYXN0PFQ+KHNyYy5kZW5vbWluYXRvcigpKTsKfQoKLy8gRG8gbm90IHVzZSBhbnkgYWJzKCkgZGVmaW5lZCBvbiBJbnRUeXBlIC0gaXQgaXNuJ3Qgd29ydGggaXQsIGdpdmVuIHRoZQovLyBkaWZmaWN1bHRpZXMgaW52b2x2ZWQgKEtvZW5pZyBsb29rdXAgcmVxdWlyZWQsIHRoZXJlIG1heSBub3QgKmJlKiBhbiBhYnMoKQovLyBkZWZpbmVkLCBldGMgZXRjKS4KdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+CmlubGluZSByYXRpb25hbDxJbnRUeXBlPiBhYnMoY29uc3QgcmF0aW9uYWw8SW50VHlwZT4mIHIpCnsKICAgIGlmIChyLm51bWVyYXRvcigpID49IEludFR5cGUoMCkpCiAgICAgICAgcmV0dXJuIHI7CgogICAgcmV0dXJuIHJhdGlvbmFsPEludFR5cGU+KC1yLm51bWVyYXRvcigpLCByLmRlbm9taW5hdG9yKCkpOwp9Cgp9IC8vIG5hbWVzcGFjZSBib29zdAoKI2VuZGlmICAvLyBCT09TVF9SQVRJT05BTF9IUFAKCg==