Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKICAgY29udGVudHMvZGVzY3JpcHRpb246IEh1ZmZtYW4gQml0Y291bnRlciAmIGNvZGVyCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiYml0X2NudC5oIgoKI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKCiNkZWZpbmUgSElfTFRBQihhKSAoYT4+MTYpCiNkZWZpbmUgTE9fTFRBQihhKSAoYSAmIDB4ZmZmZikKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExCiAgICBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgMS0xMQogICAgcmV0dXJuczoKICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCiAgICBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgMS0xMQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpiaXRDb3VudCkKewoKICBJTlQgaTsKICBJTlQgYmMxXzIsYmMzXzQsYmM1XzYsYmM3XzgsYmM5XzEwLGJjMTEsc2M7CiAgSU5UIHQwLHQxLHQyLHQzOwogIGJjMV8yPTA7CiAgYmMzXzQ9MDsKICBiYzVfNj0wOwogIGJjN184PTA7CiAgYmM5XzEwPTA7CiAgYmMxMT0wOwogIHNjPTA7CgogIGZvcihpPTA7aTx3aWR0aDtpKz00KXsKCiAgICB0MD0gdmFsdWVzW2krMF07CiAgICB0MT0gdmFsdWVzW2krMV07CiAgICB0Mj0gdmFsdWVzW2krMl07CiAgICB0Mz0gdmFsdWVzW2krM107CgogICAgLyogMSwyICovCgogICAgYmMxXzIrPUZES2FhY0VuY19odWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV07CgogICAgLyogNSw2ICovCiAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XTsKICAgIGJjNV82Kz1GREthYWNFbmNfaHVmZl9sdGFiNV82W3QyKzRdW3QzKzRdOwoKICAgIHQwPWZpeHBfYWJzKHQwKTsKICAgIHQxPWZpeHBfYWJzKHQxKTsKICAgIHQyPWZpeHBfYWJzKHQyKTsKICAgIHQzPWZpeHBfYWJzKHQzKTsKCgogICAgYmMzXzQrPSBGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXTsKCiAgICBiYzdfOCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdOwogICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDJdW3QzXTsKCiAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV07CiAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QyXVt0M107CgogICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdOwogICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0Ml1bdDNdOwoKICAgIHNjKz0odDA+MCkrKHQxPjApKyh0Mj4wKSsodDM+MCk7CiAgfQoKICBiaXRDb3VudFsxXT1ISV9MVEFCKGJjMV8yKTsKICBiaXRDb3VudFsyXT1MT19MVEFCKGJjMV8yKTsKICBiaXRDb3VudFszXT1ISV9MVEFCKGJjM180KStzYzsKICBiaXRDb3VudFs0XT1MT19MVEFCKGJjM180KStzYzsKICBiaXRDb3VudFs1XT1ISV9MVEFCKGJjNV82KTsKICBiaXRDb3VudFs2XT1MT19MVEFCKGJjNV82KTsKICBiaXRDb3VudFs3XT1ISV9MVEFCKGJjN184KStzYzsKICBiaXRDb3VudFs4XT1MT19MVEFCKGJjN184KStzYzsKICBiaXRDb3VudFs5XT1ISV9MVEFCKGJjOV8xMCkrc2M7CiAgYml0Q291bnRbMTBdPUxPX0xUQUIoYmM5XzEwKStzYzsKICBiaXRDb3VudFsxMV09YmMxMStzYzsKCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3VudDNfNF81XzZfN184XzlfMTBfMTEKICAgIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyAzLTExCiAgICByZXR1cm5zOgogICAgaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KICAgIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyAzLTExCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDNfNF81XzZfN184XzlfMTBfMTEoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKmJpdENvdW50KQp7CgogIElOVCBpOwogIElOVCBiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTAsYmMxMSxzYzsKICBJTlQgdDAsdDEsdDIsdDM7CgogIGJjM180PTA7CiAgYmM1XzY9MDsKICBiYzdfOD0wOwogIGJjOV8xMD0wOwogIGJjMTE9MDsKICBzYz0wOwoKICBmb3IoaT0wO2k8d2lkdGg7aSs9NCl7CgogICAgdDA9IHZhbHVlc1tpKzBdOwogICAgdDE9IHZhbHVlc1tpKzFdOwogICAgdDI9IHZhbHVlc1tpKzJdOwogICAgdDM9IHZhbHVlc1tpKzNdOwoKICAgIGJjNV82Kz1GREthYWNFbmNfaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdOwogICAgYmM1XzYrPUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDIrNF1bdDMrNF07CgogICAgdDA9Zml4cF9hYnModDApOwogICAgdDE9Zml4cF9hYnModDEpOwogICAgdDI9Zml4cF9hYnModDIpOwogICAgdDM9Zml4cF9hYnModDMpOwoKICAgIGJjM180Kz0gRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M107CgogICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXTsKICAgIGJjN184Kz1GREthYWNFbmNfaHVmZl9sdGFiN184W3QyXVt0M107CgogICAgYmM5XzEwKz1GREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdOwogICAgYmM5XzEwKz1GREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0Ml1bdDNdOwoKICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXTsKICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDJdW3QzXTsKCiAgICBzYys9KHQwPjApKyh0MT4wKSsodDI+MCkrKHQzPjApOwogIH0KCiAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzNdPUhJX0xUQUIoYmMzXzQpK3NjOwogIGJpdENvdW50WzRdPUxPX0xUQUIoYmMzXzQpK3NjOwogIGJpdENvdW50WzVdPUhJX0xUQUIoYmM1XzYpOwogIGJpdENvdW50WzZdPUxPX0xUQUIoYmM1XzYpOwogIGJpdENvdW50WzddPUhJX0xUQUIoYmM3XzgpK3NjOwogIGJpdENvdW50WzhdPUxPX0xUQUIoYmM3XzgpK3NjOwogIGJpdENvdW50WzldPUhJX0xUQUIoYmM5XzEwKStzYzsKICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOwogIGJpdENvdW50WzExXT1iYzExK3NjOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NvdW50NV82XzdfOF85XzEwXzExCiAgICBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNS0xMQogICAgcmV0dXJuczoKICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCiAgICBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgNS0xMQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50NV82XzdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqYml0Q291bnQpCnsKCiAgSU5UIGk7CiAgSU5UIGJjNV82LGJjN184LGJjOV8xMCxiYzExLHNjOwogIElOVCB0MCx0MTsKICBiYzVfNj0wOwogIGJjN184PTA7CiAgYmM5XzEwPTA7CiAgYmMxMT0wOwogIHNjPTA7CgogIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKCiAgICB0MCA9IHZhbHVlc1tpKzBdOwogICAgdDEgPSB2YWx1ZXNbaSsxXTsKCiAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XTsKCiAgICB0MD1maXhwX2Ficyh0MCk7CiAgICB0MT1maXhwX2Ficyh0MSk7CgogICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXTsKICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXTsKICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXTsKCiAgICBzYys9KHQwPjApKyh0MT4wKTsKICB9CiAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7CiAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFs1XT1ISV9MVEFCKGJjNV82KTsKICBiaXRDb3VudFs2XT1MT19MVEFCKGJjNV82KTsKICBiaXRDb3VudFs3XT1ISV9MVEFCKGJjN184KStzYzsKICBiaXRDb3VudFs4XT1MT19MVEFCKGJjN184KStzYzsKICBiaXRDb3VudFs5XT1ISV9MVEFCKGJjOV8xMCkrc2M7CiAgYml0Q291bnRbMTBdPUxPX0xUQUIoYmM5XzEwKStzYzsKICBiaXRDb3VudFsxMV09YmMxMStzYzsKCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3VudDdfOF85XzEwXzExCiAgICBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNy0xMQogICAgcmV0dXJuczoKICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCiAgICBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgNy0xMQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpiaXRDb3VudCkKewoKICBJTlQgaTsKICBJTlQgYmM3XzgsYmM5XzEwLGJjMTEsc2M7CiAgSU5UIHQwLHQxOwoKICBiYzdfOD0wOwogIGJjOV8xMD0wOwogIGJjMTE9MDsKICBzYz0wOwoKICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CiAgICB0MD1maXhwX2Ficyh2YWx1ZXNbaSswXSk7CiAgICB0MT1maXhwX2Ficyh2YWx1ZXNbaSsxXSk7CgogICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXTsKICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXTsKICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXTsKICAgIHNjKz0odDA+MCkrKHQxPjApOwogIH0KCiAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7CiAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7CiAgYml0Q291bnRbN109SElfTFRBQihiYzdfOCkrc2M7CiAgYml0Q291bnRbOF09TE9fTFRBQihiYzdfOCkrc2M7CiAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOwogIGJpdENvdW50WzEwXT1MT19MVEFCKGJjOV8xMCkrc2M7CiAgYml0Q291bnRbMTFdPWJjMTErc2M7Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3VudDlfMTBfMTEKICAgIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyA5LTExCiAgICByZXR1cm5zOgogICAgaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KICAgIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyA5LTExCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50OV8xMF8xMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqYml0Q291bnQpCnsKCiAgSU5UIGk7CiAgSU5UIGJjOV8xMCxiYzExLHNjOwogIElOVCB0MCx0MTsKCiAgYmM5XzEwPTA7CiAgYmMxMT0wOwogIHNjPTA7CgogIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKICAgIHQwPWZpeHBfYWJzKHZhbHVlc1tpKzBdKTsKICAgIHQxPWZpeHBfYWJzKHZhbHVlc1tpKzFdKTsKCiAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV07CiAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07CgogICAgc2MrPSh0MD4wKSsodDE+MCk7CiAgfQoKICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7CiAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7CiAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzhdPUlOVkFMSURfQklUQ09VTlQ7CiAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOwogIGJpdENvdW50WzEwXT1MT19MVEFCKGJjOV8xMCkrc2M7CiAgYml0Q291bnRbMTFdPWJjMTErc2M7Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3VudDExCiAgICBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZSAxMQogICAgcmV0dXJuczoKICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCiAgICBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZSAxMQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQxMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqYml0Q291bnQpCnsKCiAgSU5UIGk7CiAgSU5UIGJjMTEsc2M7CiAgSU5UIHQwLHQxOwoKICBiYzExPTA7CiAgc2M9MDsKICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CiAgICB0MD1maXhwX2Ficyh2YWx1ZXNbaSswXSk7CiAgICB0MT1maXhwX2Ficyh2YWx1ZXNbaSsxXSk7CiAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07CiAgICBzYys9KHQwPjApKyh0MT4wKTsKICB9CgogIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7CiAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7CiAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7CiAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsKICBiaXRDb3VudFs5XT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzEwXT1JTlZBTElEX0JJVENPVU5UOwogIGJpdENvdW50WzExXT1iYzExK3NjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3VudEVzYwogICAgZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGUgMTEgKHdpdGggRXNjKQogICAgcmV0dXJuczoKICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCiAgICBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgMTEgKHdpdGggRXNjKQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnRFc2MoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpSRVNUUklDVCBiaXRDb3VudCkKewoKICBJTlQgaTsKICBJTlQgYmMxMSxlYyxzYzsKICBJTlQgdDAsdDEsdDAwLHQwMTsKCiAgYmMxMT0wOwogIHNjPTA7CiAgZWM9MDsKICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CiAgICB0MD1maXhwX2Ficyh2YWx1ZXNbaSswXSk7CiAgICB0MT1maXhwX2Ficyh2YWx1ZXNbaSsxXSk7CgogICAgc2MrPSh0MD4wKSsodDE+MCk7CgogICAgdDAwID0gZml4TWluKHQwLDE2KTsKICAgIHQwMSA9IGZpeE1pbih0MSwxNik7CiAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwMF1bdDAxXTsKCiAgICBpZih0MD49MTYpewogICAgICBlYys9NTsKICAgICAgd2hpbGUoKHQwPj49MSkgPj0gMTYpCiAgICAgICAgZWMrPTI7CiAgICB9CgogICAgaWYodDE+PTE2KXsKICAgICAgZWMrPTU7CiAgICAgIHdoaWxlKCh0MT4+PTEpID49IDE2KQogICAgICAgIGVjKz0yOwogICAgfQogIH0KCiAgZm9yIChpPTA7IGk8MTE7IGkrKykKICAgIGJpdENvdW50W2ldPUlOVkFMSURfQklUQ09VTlQ7CgogIGJpdENvdW50WzExXT1iYzExK3NjK2VjOwp9CgoKdHlwZWRlZiB2b2lkICgqQ09VTlRfRlVOQ1RJT04pKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpSRVNUUklDVCBiaXRDb3VudCk7CgpzdGF0aWMgY29uc3QgQ09VTlRfRlVOQ1RJT04gY291bnRGdW5jVGFibGVbQ09ERV9CT09LX0VTQ19MQVYrMV0gPQp7CgogRkRLYWFjRW5jX2NvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEsICAvKiAwICAqLwogRkRLYWFjRW5jX2NvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEsICAvKiAxICAqLwogRkRLYWFjRW5jX2NvdW50M180XzVfNl83XzhfOV8xMF8xMSwgICAgICAvKiAyICAqLwogRkRLYWFjRW5jX2NvdW50NV82XzdfOF85XzEwXzExLCAgICAgICAgICAvKiAzICAqLwogRkRLYWFjRW5jX2NvdW50NV82XzdfOF85XzEwXzExLCAgICAgICAgICAvKiA0ICAqLwogRkRLYWFjRW5jX2NvdW50N184XzlfMTBfMTEsICAgICAgICAgICAgICAvKiA1ICAqLwogRkRLYWFjRW5jX2NvdW50N184XzlfMTBfMTEsICAgICAgICAgICAgICAvKiA2ICAqLwogRkRLYWFjRW5jX2NvdW50N184XzlfMTBfMTEsICAgICAgICAgICAgICAvKiA3ICAqLwogRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiA4ICAqLwogRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiA5ICAqLwogRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiAxMCAqLwogRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiAxMSAqLwogRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiAxMiAqLwogRkRLYWFjRW5jX2NvdW50MTEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxMyAqLwogRkRLYWFjRW5jX2NvdW50MTEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxNCAqLwogRkRLYWFjRW5jX2NvdW50MTEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxNSAqLwogRkRLYWFjRW5jX2NvdW50RXNjICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiAqLwp9OwoKCgpJTlQgICAgRkRLYWFjRW5jX2JpdENvdW50KGNvbnN0IFNIT1JUICp2YWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbWF4VmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgKmJpdENvdW50KQp7CgogIC8qCiAgICBjaGVjayBpZiB3ZSBjYW4gdXNlIGNvZGVib29rIDAKICAqLwoKICBpZihtYXhWYWwgPT0gMCkKICAgIGJpdENvdW50WzBdID0gMDsKICBlbHNlCiAgICBiaXRDb3VudFswXSA9IElOVkFMSURfQklUQ09VTlQ7CgogIG1heFZhbCA9IGZpeE1pbihtYXhWYWwsKElOVClDT0RFX0JPT0tfRVNDX0xBVik7CiAgY291bnRGdW5jVGFibGVbbWF4VmFsXSh2YWx1ZXMsd2lkdGgsYml0Q291bnQpOwogIHJldHVybigwKTsKfQoKCgoKLyoKICBjb3VudCBkaWZmZXJlbmNlIGJldHdlZW4gYWN0dWFsIGFuZCB6ZXJvZWQgbGluZXMKKi8KSU5UIEZES2FhY0VuY19jb3VudFZhbHVlcyhTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLCBJTlQgd2lkdGgsIElOVCBjb2RlQm9vaykKewoKICBJTlQgaSx0MCx0MSx0Mix0Myx0MDAsdDAxOwogIElOVCBjb2RlTGVuZ3RoOwogIElOVCBzaWduTGVuZ3RoOwogIElOVCBiaXRDbnQ9MDsKCiAgc3dpdGNoKGNvZGVCb29rKXsKICBjYXNlIENPREVfQk9PS19aRVJPX05POgogICAgYnJlYWs7CgogIGNhc2UgQ09ERV9CT09LXzFfTk86CiAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CiAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwogICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07CiAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXTsKICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7CiAgICAgIGJpdENudCs9IGNvZGVMZW5ndGg7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfMl9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOwogICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07CiAgICAgIHQyICAgICAgICAgPSB2YWx1ZXNbaSsyXTsKICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdOwogICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdKTsKICAgICAgYml0Q250Kz0gY29kZUxlbmd0aDsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIENPREVfQk9PS18zX05POgogICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewogICAgICBzaWduTGVuZ3RoPTA7CiAgICAgIHQwID0gdmFsdWVzW2krMF07CiAgICAgIGlmKHQwICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICB0MD1maXhwX2Ficyh0MCk7CiAgICAgIH0KICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKICAgICAgaWYodDEgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKICAgICAgfQogICAgICB0MiA9IHZhbHVlc1tpKzJdOwogICAgICBpZih0MiAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgdDI9Zml4cF9hYnModDIpOwogICAgICB9CiAgICAgIHQzID0gdmFsdWVzW2krM107CiAgICAgIGlmKHQzICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICB0Mz1maXhwX2Ficyh0Myk7CiAgICAgIH0KCiAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoK3NpZ25MZW5ndGg7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfNF9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKICAgICAgc2lnbkxlbmd0aD0wOwogICAgICB0MCA9IHZhbHVlc1tpKzBdOwogICAgICBpZih0MCAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgdDA9Zml4cF9hYnModDApOwogICAgICB9CiAgICAgIHQxID0gdmFsdWVzW2krMV07CiAgICAgIGlmKHQxICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICB0MT1maXhwX2Ficyh0MSk7CiAgICAgIH0KICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKICAgICAgaWYodDIgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHQyPWZpeHBfYWJzKHQyKTsKICAgICAgfQogICAgICB0MyA9IHZhbHVlc1tpKzNdOwogICAgICBpZih0MyAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgdDM9Zml4cF9hYnModDMpOwogICAgICB9CiAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoK3NpZ25MZW5ndGg7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfNV9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOwogICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07CiAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDArNF1bdDErNF0pOwogICAgICBiaXRDbnQrPWNvZGVMZW5ndGg7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfNl9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOwogICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07CiAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDArNF1bdDErNF0pOwogICAgICBiaXRDbnQrPWNvZGVMZW5ndGg7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfN19OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpewogICAgICBzaWduTGVuZ3RoPTA7CiAgICAgIHQwID0gdmFsdWVzW2krMF07CiAgICAgIGlmKHQwICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICB0MD1maXhwX2Ficyh0MCk7CiAgICAgIH0KCiAgICAgIHQxID0gdmFsdWVzW2krMV07CiAgICAgIGlmKHQxICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICB0MT1maXhwX2Ficyh0MSk7CiAgICAgIH0KICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoICtzaWduTGVuZ3RoOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgQ09ERV9CT09LXzhfTk86CiAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7CiAgICAgIHNpZ25MZW5ndGg9MDsKICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKICAgICAgaWYodDAgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKICAgICAgfQoKICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKICAgICAgaWYodDEgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKICAgICAgfQogICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV0pOwogICAgICBiaXRDbnQrPWNvZGVMZW5ndGggK3NpZ25MZW5ndGg7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfOV9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKICAgICAgc2lnbkxlbmd0aD0wOwogICAgICB0MCA9IHZhbHVlc1tpKzBdOwogICAgICBpZih0MCAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgdDA9Zml4cF9hYnModDApOwogICAgICB9CiAgICAgIHQxID0gdmFsdWVzW2krMV07CiAgICAgIGlmKHQxICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICB0MT1maXhwX2Ficyh0MSk7CiAgICAgIH0KICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7CiAgICAgIGJpdENudCs9Y29kZUxlbmd0aCArc2lnbkxlbmd0aDsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIENPREVfQk9PS18xMF9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKICAgICAgc2lnbkxlbmd0aD0wOwogICAgICB0MCA9IHZhbHVlc1tpKzBdOwogICAgICBpZih0MCAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgdDA9Zml4cF9hYnModDApOwogICAgICB9CgogICAgICB0MSA9IHZhbHVlc1tpKzFdOwogICAgICBpZih0MSAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgdDE9Zml4cF9hYnModDEpOwogICAgICB9CiAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0pOwogICAgICBiaXRDbnQrPWNvZGVMZW5ndGggK3NpZ25MZW5ndGg7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfRVNDX05POgogICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewogICAgICBzaWduTGVuZ3RoPTA7CiAgICAgIHQwID0gdmFsdWVzW2krMF07CiAgICAgIGlmKHQwICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICB0MD1maXhwX2Ficyh0MCk7CiAgICAgIH0KICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKICAgICAgaWYodDEgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKICAgICAgfQogICAgICB0MDAgPSBmaXhNaW4odDAsMTYpOwogICAgICB0MDEgPSBmaXhNaW4odDEsMTYpOwoKICAgICAgY29kZUxlbmd0aCA9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MDBdW3QwMV07CiAgICAgIGJpdENudCs9Y29kZUxlbmd0aCArc2lnbkxlbmd0aDsKICAgICAgaWYodDAgPj0xNil7CiAgICAgICAgSU5UIG4scDsKICAgICAgICBuPTA7CiAgICAgICAgcD10MDsKICAgICAgICB3aGlsZSgocD4+PTEpID49MTYpewogICAgICAgICAgYml0Q250Kys7CiAgICAgICAgICBuKys7CiAgICAgICAgfQogICAgICAgIGJpdENudCs9KG4rNSk7CiAgICAgIH0KICAgICAgaWYodDEgPj0xNil7CiAgICAgICAgSU5UIG4scDsKICAgICAgICBuPTA7CiAgICAgICAgcD10MTsKICAgICAgICB3aGlsZSgocD4+PTEpID49MTYpewogICAgICAgICAgYml0Q250Kys7CiAgICAgICAgICBuKys7CiAgICAgICAgfQogICAgICAgIGJpdENudCs9KG4rNSk7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgYnJlYWs7CiAgfQoKICByZXR1cm4oYml0Q250KTsKfQoKCgpJTlQgRkRLYWFjRW5jX2NvZGVWYWx1ZXMoU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywgSU5UIHdpZHRoLCBJTlQgY29kZUJvb2ssICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKQp7CgogIElOVCBpLHQwLHQxLHQyLHQzLHQwMCx0MDE7CiAgSU5UIGNvZGVXb3JkLGNvZGVMZW5ndGg7CiAgSU5UIHNpZ24sc2lnbkxlbmd0aDsKCiAgc3dpdGNoKGNvZGVCb29rKXsKICBjYXNlIENPREVfQk9PS19aRVJPX05POgogICAgYnJlYWs7CgogIGNhc2UgQ09ERV9CT09LXzFfTk86CiAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CiAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXSsxOwogICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV0rMTsKICAgICAgdDIgICAgICAgICA9IHZhbHVlc1tpKzJdKzE7CiAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXSsxOwogICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjFbdDBdW3QxXVt0Ml1bdDNdOwogICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwXVt0MV1bdDJdW3QzXSk7CiAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgQ09ERV9CT09LXzJfTk86CiAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CiAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXSsxOwogICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV0rMTsKICAgICAgdDIgICAgICAgICA9IHZhbHVlc1tpKzJdKzE7CiAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXSsxOwogICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjJbdDBdW3QxXVt0Ml1bdDNdOwogICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwXVt0MV1bdDJdW3QzXSk7CiAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgQ09ERV9CT09LXzNfTk86CiAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CiAgICAgIHNpZ249MDsKICAgICAgc2lnbkxlbmd0aD0wOwogICAgICB0MCA9IHZhbHVlc1tpKzBdOwogICAgICBpZih0MCAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgc2lnbjw8PTE7CiAgICAgICAgaWYodDAgPCAwKXsKICAgICAgICAgIHNpZ258PTE7CiAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHQxID0gdmFsdWVzW2krMV07CiAgICAgIGlmKHQxICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICBzaWduPDw9MTsKICAgICAgICBpZih0MSA8IDApewogICAgICAgICAgc2lnbnw9MTsKICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKICAgICAgaWYodDIgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHNpZ248PD0xOwogICAgICAgIGlmKHQyIDwgMCl7CiAgICAgICAgICBzaWdufD0xOwogICAgICAgICAgdDI9Zml4cF9hYnModDIpOwogICAgICAgIH0KICAgICAgfQogICAgICB0MyA9IHZhbHVlc1tpKzNdOwogICAgICBpZih0MyAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgc2lnbjw8PTE7CiAgICAgICAgaWYodDMgPCAwKXsKICAgICAgICAgIHNpZ258PTE7CiAgICAgICAgICB0Mz1maXhwX2Ficyh0Myk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjNbdDBdW3QxXVt0Ml1bdDNdOwogICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7CiAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwogICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgQ09ERV9CT09LXzRfTk86CiAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CiAgICAgIHNpZ249MDsKICAgICAgc2lnbkxlbmd0aD0wOwogICAgICB0MCA9IHZhbHVlc1tpKzBdOwogICAgICBpZih0MCAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgc2lnbjw8PTE7CiAgICAgICAgaWYodDAgPCAwKXsKICAgICAgICAgIHNpZ258PTE7CiAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHQxID0gdmFsdWVzW2krMV07CiAgICAgIGlmKHQxICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICBzaWduPDw9MTsKICAgICAgICBpZih0MSA8IDApewogICAgICAgICAgc2lnbnw9MTsKICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKICAgICAgaWYodDIgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHNpZ248PD0xOwogICAgICAgIGlmKHQyIDwgMCl7CiAgICAgICAgICBzaWdufD0xOwogICAgICAgICAgdDI9Zml4cF9hYnModDIpOwogICAgICAgIH0KICAgICAgfQogICAgICB0MyA9IHZhbHVlc1tpKzNdOwogICAgICBpZih0MyAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgc2lnbjw8PTE7CiAgICAgICAgaWYodDMgPCAwKXsKICAgICAgICAgIHNpZ258PTE7CiAgICAgICAgICB0Mz1maXhwX2Ficyh0Myk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiNFt0MF1bdDFdW3QyXVt0M107CiAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfNV9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdKzQ7CiAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXSs0OwogICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjVbdDBdW3QxXTsKICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MF1bdDFdKTsKICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfNl9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdKzQ7CiAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXSs0OwogICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjZbdDBdW3QxXTsKICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MF1bdDFdKTsKICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfN19OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpewogICAgICBzaWduPTA7CiAgICAgIHNpZ25MZW5ndGg9MDsKICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKICAgICAgaWYodDAgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHNpZ248PD0xOwogICAgICAgIGlmKHQwIDwgMCl7CiAgICAgICAgICBzaWdufD0xOwogICAgICAgICAgdDA9Zml4cF9hYnModDApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKICAgICAgaWYodDEgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHNpZ248PD0xOwogICAgICAgIGlmKHQxIDwgMCl7CiAgICAgICAgICBzaWdufD0xOwogICAgICAgICAgdDE9Zml4cF9hYnModDEpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjdbdDBdW3QxXTsKICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfOF9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKICAgICAgc2lnbj0wOwogICAgICBzaWduTGVuZ3RoPTA7CiAgICAgIHQwID0gdmFsdWVzW2krMF07CiAgICAgIGlmKHQwICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICBzaWduPDw9MTsKICAgICAgICBpZih0MCA8IDApewogICAgICAgICAgc2lnbnw9MTsKICAgICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHQxID0gdmFsdWVzW2krMV07CiAgICAgIGlmKHQxICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICBzaWduPDw9MTsKICAgICAgICBpZih0MSA8IDApewogICAgICAgICAgc2lnbnw9MTsKICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWI4W3QwXVt0MV07CiAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSk7CiAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwogICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgQ09ERV9CT09LXzlfTk86CiAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7CiAgICAgIHNpZ249MDsKICAgICAgc2lnbkxlbmd0aD0wOwogICAgICB0MCA9IHZhbHVlc1tpKzBdOwogICAgICBpZih0MCAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgc2lnbjw8PTE7CiAgICAgICAgaWYodDAgPCAwKXsKICAgICAgICAgIHNpZ258PTE7CiAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHQxID0gdmFsdWVzW2krMV07CiAgICAgIGlmKHQxICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICBzaWduPDw9MTsKICAgICAgICBpZih0MSA8IDApewogICAgICAgICAgc2lnbnw9MTsKICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWI5W3QwXVt0MV07CiAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0pOwogICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIENPREVfQk9PS18xMF9OTzoKICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKICAgICAgc2lnbj0wOwogICAgICBzaWduTGVuZ3RoPTA7CiAgICAgIHQwID0gdmFsdWVzW2krMF07CiAgICAgIGlmKHQwICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICBzaWduPDw9MTsKICAgICAgICBpZih0MCA8IDApewogICAgICAgICAgc2lnbnw9MTsKICAgICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHQxID0gdmFsdWVzW2krMV07CiAgICAgIGlmKHQxICE9IDApewogICAgICAgIHNpZ25MZW5ndGgrKzsKICAgICAgICBzaWduPDw9MTsKICAgICAgICBpZih0MSA8IDApewogICAgICAgICAgc2lnbnw9MTsKICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWIxMFt0MF1bdDFdOwogICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBDT0RFX0JPT0tfRVNDX05POgogICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewogICAgICBzaWduPTA7CiAgICAgIHNpZ25MZW5ndGg9MDsKICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKICAgICAgaWYodDAgIT0gMCl7CiAgICAgICAgc2lnbkxlbmd0aCsrOwogICAgICAgIHNpZ248PD0xOwogICAgICAgIGlmKHQwIDwgMCl7CiAgICAgICAgICBzaWdufD0xOwogICAgICAgICAgdDA9Zml4cF9hYnModDApOwogICAgICAgIH0KICAgICAgfQogICAgICB0MSA9IHZhbHVlc1tpKzFdOwogICAgICBpZih0MSAhPSAwKXsKICAgICAgICBzaWduTGVuZ3RoKys7CiAgICAgICAgc2lnbjw8PTE7CiAgICAgICAgaWYodDEgPCAwKXsKICAgICAgICAgIHNpZ258PTE7CiAgICAgICAgICB0MT1maXhwX2Ficyh0MSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHQwMCA9IGZpeE1pbih0MCwxNik7CiAgICAgIHQwMSA9IGZpeE1pbih0MSwxNik7CgogICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjExW3QwMF1bdDAxXTsKICAgICAgY29kZUxlbmd0aCA9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MDBdW3QwMV07CiAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwogICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwogICAgICBpZih0MCA+PTE2KXsKICAgICAgICBJTlQgbixwOwogICAgICAgIG49MDsKICAgICAgICBwPXQwOwogICAgICAgIHdoaWxlKChwPj49MSkgPj0xNil7CiAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwxLDEpOwogICAgICAgICAgbisrOwogICAgICAgIH0KICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwwLDEpOwogICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHQwLSgxPDwobis0KSksbis0KTsKICAgICAgfQogICAgICBpZih0MSA+PTE2KXsKICAgICAgICBJTlQgbixwOwogICAgICAgIG49MDsKICAgICAgICBwPXQxOwogICAgICAgIHdoaWxlKChwPj49MSkgPj0xNil7CiAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwxLDEpOwogICAgICAgICAgbisrOwogICAgICAgIH0KICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwwLDEpOwogICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHQxLSgxPDwobis0KSksbis0KTsKICAgICAgfQogICAgfQogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICBicmVhazsKICB9CiAgcmV0dXJuKDApOwp9CgpJTlQgRkRLYWFjRW5jX2NvZGVTY2FsZWZhY3RvckRlbHRhKElOVCBkZWx0YSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkKewogIElOVCBjb2RlV29yZCxjb2RlTGVuZ3RoOwoKICBpZihmaXhwX2FicyhkZWx0YSkgPkNPREVfQk9PS19TQ0ZfTEFWKQogICAgcmV0dXJuKDEpOwoKICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYnNjZltkZWx0YStDT0RFX0JPT0tfU0NGX0xBVl07CiAgY29kZUxlbmd0aCA9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZltkZWx0YStDT0RFX0JPT0tfU0NGX0xBVl07CiAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgcmV0dXJuKDApOwp9CgoKCg==