Ly8NCi8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi8vDQovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gDQovLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCi8vDQoNCnVzaW5nIFN5c3RlbTsNCnVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsNCg0KbmFtZXNwYWNlIERvdFpMaWINCnsNCg0KCS8vLyA8c3VtbWFyeT4NCgkvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgY2lyY3VsYXIgYnVmZmVyDQoJLy8vIDwvc3VtbWFyeT4NCglpbnRlcm5hbCBjbGFzcyBDaXJjdWxhckJ1ZmZlcg0KCXsNCiAgICAgICAgI3JlZ2lvbiBQcml2YXRlIGRhdGENCiAgICAgICAgcHJpdmF0ZSBpbnQgX2NhcGFjaXR5Ow0KICAgICAgICBwcml2YXRlIGludCBfaGVhZDsNCiAgICAgICAgcHJpdmF0ZSBpbnQgX3RhaWw7DQogICAgICAgIHByaXZhdGUgaW50IF9zaXplOw0KICAgICAgICBwcml2YXRlIGJ5dGVbXSBfYnVmZmVyOw0KICAgICAgICAjZW5kcmVnaW9uDQoNCiAgICAgICAgcHVibGljIENpcmN1bGFyQnVmZmVyKGludCBjYXBhY2l0eSkNCiAgICAgICAgeyAgICANCiAgICAgICAgICAgIERlYnVnLkFzc2VydCggY2FwYWNpdHkgPiAwICk7DQogICAgICAgICAgICBfYnVmZmVyID0gbmV3IGJ5dGVbY2FwYWNpdHldOw0KICAgICAgICAgICAgX2NhcGFjaXR5ID0gY2FwYWNpdHk7DQogICAgICAgICAgICBfaGVhZCA9IDA7DQogICAgICAgICAgICBfdGFpbCA9IDA7DQogICAgICAgICAgICBfc2l6ZSA9IDA7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgaW50IFNpemUgeyBnZXQgeyByZXR1cm4gX3NpemU7IH0gfQ0KDQogICAgICAgIHB1YmxpYyBpbnQgUHV0KGJ5dGVbXSBzb3VyY2UsIGludCBvZmZzZXQsIGludCBjb3VudCkNCiAgICAgICAgew0KICAgICAgICAgICAgRGVidWcuQXNzZXJ0KCBjb3VudCA+IDAgKTsNCiAgICAgICAgICAgIGludCB0cnVlQ291bnQgPSBNYXRoLk1pbihjb3VudCwgX2NhcGFjaXR5IC0gU2l6ZSk7DQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRydWVDb3VudDsgKytpKQ0KICAgICAgICAgICAgICAgIF9idWZmZXJbKF90YWlsK2kpICUgX2NhcGFjaXR5XSA9IHNvdXJjZVtvZmZzZXQraV07DQogICAgICAgICAgICBfdGFpbCArPSB0cnVlQ291bnQ7DQogICAgICAgICAgICBfdGFpbCAlPSBfY2FwYWNpdHk7DQogICAgICAgICAgICBfc2l6ZSArPSB0cnVlQ291bnQ7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZUNvdW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIGJvb2wgUHV0KGJ5dGUgYikNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKFNpemUgPT0gX2NhcGFjaXR5KSAvLyBubyByb29tDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgX2J1ZmZlcltfdGFpbCsrXSA9IGI7DQogICAgICAgICAgICBfdGFpbCAlPSBfY2FwYWNpdHk7DQogICAgICAgICAgICArK19zaXplOw0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgaW50IEdldChieXRlW10gZGVzdGluYXRpb24sIGludCBvZmZzZXQsIGludCBjb3VudCkNCiAgICAgICAgew0KICAgICAgICAgICAgaW50IHRydWVDb3VudCA9IE1hdGguTWluKGNvdW50LFNpemUpOw0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnVlQ291bnQ7ICsraSkNCiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbltvZmZzZXQgKyBpXSA9IF9idWZmZXJbKF9oZWFkK2kpICUgX2NhcGFjaXR5XTsNCiAgICAgICAgICAgIF9oZWFkICs9IHRydWVDb3VudDsNCiAgICAgICAgICAgIF9oZWFkICU9IF9jYXBhY2l0eTsNCiAgICAgICAgICAgIF9zaXplIC09IHRydWVDb3VudDsNCiAgICAgICAgICAgIHJldHVybiB0cnVlQ291bnQ7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgaW50IEdldCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChTaXplID09IDApDQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KDQogICAgICAgICAgICBpbnQgcmVzdWx0ID0gKGludClfYnVmZmVyW19oZWFkKysgJSBfY2FwYWNpdHldOw0KICAgICAgICAgICAgLS1fc2l6ZTsNCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0NCg0KICAgIH0NCn0NCg==