JW1vZHVsZSAiZW51bV90aG9yb3VnaCIKCi8vIFN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0aGUgUnVieSBtb2R1bGUgZm9yIGFsbCBvZiB0aGUKLy8gZm9sbG93aW5nLi4uCgojcHJhZ21hIFNXSUcgbm93YXJuPVNXSUdXQVJOX1BBUlNFX0tFWVdPUkQKCiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSk7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgcmVkOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIGJsdWU7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgZ3JlZW47CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgU3BlZWRDbGFzczo6c2xvdzsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBTcGVlZENsYXNzOjptZWRpdW07CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgU3BlZWRDbGFzczo6ZmFzdDsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBTcGVlZENsYXNzOjpsaWdodG5pbmc7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgVGVtcGxhdGVDbGFzczo6ZWluc3RlaW47CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgVGVtcGxhdGVDbGFzczo6Z2FsaWxlbzsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBOYW1lOjpUQ2xhc3M6OmZhcmFkYXk7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgTmFtZTo6VENsYXNzOjpiZWxsOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIGFyZ2g7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgZWVrOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9sZE5hbWVTdHJ1Y3Q6OndoaXp6Owold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9sZE5hbWVTdHJ1Y3Q6OmtlcmJvb207CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgT2xkTmFtZVN0cnVjdDo6cG9wOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9sZE5hbWVTdHJ1Y3Q6OnNpbXBsZTE7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgT2xkTmFtZVN0cnVjdDo6c2luZ2xlbmFtZTE7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgT2xkTmFtZVN0cnVjdDo6ZG91YmxlbmFtZTE7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgVHJlZXNDbGFzczo6b2FrOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIFRyZWVzQ2xhc3M6OmZpcjsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBUcmVlc0NsYXNzOjpwaW5lOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmJsb25kZTsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpnaW5nZXI7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgT2JzY3VyZTo6b25lOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9ic2N1cmU6Om9uZXRyYWlsOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9ic2N1cmU6OnR3bzsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBPYnNjdXJlOjp0d29hZ2FpbjsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBPYnNjdXJlOjp0d290cmFpbDsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBPYnNjdXJlOjp0d290cmFpbGFnYWluOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIGdsb2JhbGluc3RhbmNlMTsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBnbG9iYWxpbnN0YW5jZTI7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgZ2xvYmFsaW5zdGFuY2UzOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIEluc3RhbmNlczo6bWVtYmVyaW5zdGFuY2UxOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIEluc3RhbmNlczo6bWVtYmVyaW5zdGFuY2UyOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIEluc3RhbmNlczo6bWVtYmVyaW5zdGFuY2UzOwoKJXdhcm5maWx0ZXIoU1dJR1dBUk5fR09fTkFNRV9DT05GTElDVCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmluZyAnb25lJyBkdWUgdG8gR28gbmFtZSAoJ09ic2N1cmVPbmUnKSBjb25mbGljdCB3aXRoICdPYnNjdXJlOjpPbmUnICovCgolaW5saW5lICV7CgojaWYgX19HTlVDX18gPj0gNSB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA4KQovKiBmb3IgYW5vbnltb3VzIGVudW1zICovCi8qIGRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyBbLVdlcnJvcj1zdHJpY3QtYWxpYXNpbmddICovCiNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCiNlbmRpZgoKZW51bSB7IEFub25FbnVtMSwgQW5vbkVudW0yID0gMTAwIH07CmVudW0geyBSZWFsbHlBbkludGVnZXIgPSAyMDAgfTsKLy9lbnVtIHsgQW5vbkVudW0zLCBBbm9uRW51bTQgfSBpbnN0YW5jZTsKbmFtZXNwYWNlIEFub25TcGFjZSB7CiAgZW51bSB7IEFub25TcGFjZUVudW0xLCBBbm9uU3BhY2VFbnVtMiA9IDMwMCB9OwogIHN0cnVjdCBBbm9uU3RydWN0IHsKICAgIGVudW0geyBBbm9uU3RydWN0RW51bTEsIEFub25TdHJ1Y3RFbnVtMiA9IDQwMCB9OwogIH07Cn0KCgplbnVtIGNvbG91ciB7IHJlZD0tMSwgYmx1ZSwgZ3JlZW4gPSAxMCB9Owpjb2xvdXIgY29sb3VyVGVzdDEoY29sb3VyIGUpIHsgcmV0dXJuIGU7IH0KZW51bSBjb2xvdXIgY29sb3VyVGVzdDIoZW51bSBjb2xvdXIgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBjb2xvdXIgY29sb3VyVGVzdDMoY29uc3QgY29sb3VyIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgZW51bSBjb2xvdXIgY29sb3VyVGVzdDQoY29uc3QgZW51bSBjb2xvdXIgZSkgeyByZXR1cm4gZTsgfQoKY29sb3VyIG15Q29sb3VyOwoKc3RydWN0IFNwZWVkQ2xhc3MgewogIGVudW0gc3BlZWQgeyBzbG93PTEwLCBtZWRpdW09MjAsIGZhc3Q9MzAsIGxpZ2h0bmluZyB9OwogIHR5cGVkZWYgZW51bSBzcGVlZCBzcGVlZHRkMTsKCiAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRUZXN0MChpbnQgcykgeyByZXR1cm4gczsgfQogIHNwZWVkICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkVGVzdDEoc3BlZWQgcykgeyByZXR1cm4gczsgfQogIGVudW0gc3BlZWQgICAgICAgICAgICAgICAgICAgIHNwZWVkVGVzdDIoZW51bSBzcGVlZCBzKSB7IHJldHVybiBzOyB9CiAgY29uc3Qgc3BlZWQgICAgICAgICAgICAgICAgICAgc3BlZWRUZXN0Myhjb25zdCBzcGVlZCBzKSB7IHJldHVybiBzOyB9CiAgY29uc3QgZW51bSBzcGVlZCAgICAgICAgICAgICAgc3BlZWRUZXN0NChjb25zdCBlbnVtIHNwZWVkIHMpIHsgcmV0dXJuIHM7IH0KICBzcGVlZHRkMSAgICAgICAgICAgICAgICAgICAgICBzcGVlZFRlc3Q1KHNwZWVkdGQxIHMpIHsgcmV0dXJuIHM7IH0KICBjb25zdCBzcGVlZHRkMSAgICAgICAgICAgICAgICBzcGVlZFRlc3Q2KGNvbnN0IHNwZWVkdGQxIHMpIHsgcmV0dXJuIHM7IH0KICBjb25zdCBzcGVlZCAmICAgICAgICAgICAgICAgICBzcGVlZFRlc3Q3KGNvbnN0IHNwZWVkICZzKSB7IHJldHVybiBzOyB9CiAgY29uc3QgZW51bSBzcGVlZCAmICAgICAgICAgICAgc3BlZWRUZXN0OChjb25zdCBlbnVtIHNwZWVkICZzKSB7IHJldHVybiBzOyB9CgogIGNvbnN0IGNvbG91ciBteUNvbG91cjI7CiAgc3BlZWR0ZDEgbXlTcGVlZHRkMTsKICBTcGVlZENsYXNzKCkgOiBteUNvbG91cjIocmVkKSwgbXlTcGVlZHRkMShzbG93KSB7IH0KcHJpdmF0ZToKICBTcGVlZENsYXNzJiBvcGVyYXRvcj0oY29uc3QgU3BlZWRDbGFzcyYpOwp9OwoKaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkVGVzdDAoaW50IHMpIHsgcmV0dXJuIHM7IH0KU3BlZWRDbGFzczo6c3BlZWQgICAgICAgICAgICAgIHNwZWVkVGVzdDEoU3BlZWRDbGFzczo6c3BlZWQgcykgeyByZXR1cm4gczsgfQplbnVtIFNwZWVkQ2xhc3M6OnNwZWVkICAgICAgICAgc3BlZWRUZXN0MihlbnVtIFNwZWVkQ2xhc3M6OnNwZWVkIHMpIHsgcmV0dXJuIHM7IH0KY29uc3QgU3BlZWRDbGFzczo6c3BlZWQgICAgICAgIHNwZWVkVGVzdDMoY29uc3QgU3BlZWRDbGFzczo6c3BlZWQgcykgeyByZXR1cm4gczsgfQpjb25zdCBlbnVtIFNwZWVkQ2xhc3M6OnNwZWVkICAgc3BlZWRUZXN0NChjb25zdCBlbnVtIFNwZWVkQ2xhc3M6OnNwZWVkIHMpIHsgcmV0dXJuIHM7IH0KY29uc3QgU3BlZWRDbGFzczo6c3BlZWQgJiAgICAgIHNwZWVkVGVzdDUoY29uc3QgU3BlZWRDbGFzczo6c3BlZWQgJnMpIHsgcmV0dXJuIHM7IH0KCgp0eXBlZGVmIGVudW0geyBOYW1lZEFub24xLCBOYW1lZEFub24yIH0gbmFtZWRhbm9uOwoKbmFtZWRhbm9uICAgICAgICAgICAgICAgICAgICAgICBuYW1lZGFub25UZXN0MShuYW1lZGFub24gZSkgeyByZXR1cm4gZTsgfSAKCnR5cGVkZWYgZW51bSB0d29uYW1lc3RhZyB7IFR3b05hbWVzMSwgVHdvTmFtZXMyLCBUd29OYW1lczMgPSAzMyB9IHR3b25hbWVzOwoKdHdvbmFtZXMgICAgICAgICAgICAgICAgICAgICAgICB0d29uYW1lc1Rlc3QxKHR3b25hbWVzIGUpIHsgcmV0dXJuIGU7IH0gCnR3b25hbWVzdGFnICAgICAgICAgICAgICAgICAgICAgdHdvbmFtZXNUZXN0Mih0d29uYW1lc3RhZyBlKSB7IHJldHVybiBlOyB9IAplbnVtIHR3b25hbWVzdGFnICAgICAgICAgICAgICAgIHR3b25hbWVzVGVzdDMoZW51bSB0d29uYW1lc3RhZyBlKSB7IHJldHVybiBlOyB9IAoKc3RydWN0IFR3b05hbWVzU3RydWN0IHsKICB0eXBlZGVmIGVudW0gdHdvbmFtZXN0YWcgeyBUd29OYW1lc1N0cnVjdDEsIFR3b05hbWVzU3RydWN0MiB9IHR3b25hbWVzOwogIHR3b25hbWVzICAgICAgICAgICAgICAgICAgICAgIHR3b25hbWVzVGVzdDEodHdvbmFtZXMgZSkgeyByZXR1cm4gZTsgfSAKICB0d29uYW1lc3RhZyAgICAgICAgICAgICAgICAgICB0d29uYW1lc1Rlc3QyKHR3b25hbWVzdGFnIGUpIHsgcmV0dXJuIGU7IH0gCiAgZW51bSB0d29uYW1lc3RhZyAgICAgICAgICAgICAgdHdvbmFtZXNUZXN0MyhlbnVtIHR3b25hbWVzdGFnIGUpIHsgcmV0dXJuIGU7IH0gCn07CgpuYW1lc3BhY2UgQW5vblNwYWNlewogIHR5cGVkZWYgZW51bSB7IE5hbWVkQW5vblNwYWNlMSwgTmFtZWRBbm9uU3BhY2UyIH0gbmFtZWRhbm9uc3BhY2U7CiAgbmFtZWRhbm9uc3BhY2UgICAgICAgICAgICAgICAgbmFtZWRhbm9uc3BhY2VUZXN0MShuYW1lZGFub25zcGFjZSBlKSB7IHJldHVybiBlOyB9IAogIEFub25TcGFjZTo6bmFtZWRhbm9uc3BhY2UgICAgIG5hbWVkYW5vbnNwYWNlVGVzdDIoQW5vblNwYWNlOjpuYW1lZGFub25zcGFjZSBlKSB7IHJldHVybiBlOyB9IAp9CkFub25TcGFjZTo6bmFtZWRhbm9uc3BhY2UgICAgICAgbmFtZWRhbm9uc3BhY2VUZXN0MyhBbm9uU3BhY2U6Om5hbWVkYW5vbnNwYWNlIGUpIHsgcmV0dXJuIGU7IH0gCnVzaW5nIG5hbWVzcGFjZSBBbm9uU3BhY2U7Cm5hbWVkYW5vbnNwYWNlICAgICAgICAgICAgICAgICAgbmFtZWRhbm9uc3BhY2VUZXN0NChuYW1lZGFub25zcGFjZSBlKSB7IHJldHVybiBlOyB9IAoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBUZW1wbGF0ZUNsYXNzIHsKICBlbnVtIHNjaWVudGlzdHMgeyBlaW5zdGVpbiwgZ2FsaWxlbyA9IDEwIH07IAogIHR5cGVkZWYgZW51bSBzY2llbnRpc3RzIHNjaWVudGlzdHN0ZDE7CiAgdHlwZWRlZiBzY2llbnRpc3RzIHNjaWVudGlzdHN0ZDI7CiAgdHlwZWRlZiBzY2llbnRpc3RzdGQxIHNjaWVudGlzdHN0ZDM7CiAgc2NpZW50aXN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c1Rlc3QxKHNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGVudW0gc2NpZW50aXN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNUZXN0MihlbnVtIHNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHNjaWVudGlzdHMgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNUZXN0Myhjb25zdCBzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBlbnVtIHNjaWVudGlzdHMgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzVGVzdDQoY29uc3QgZW51bSBzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICB0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzPFQ+OjpzY2llbnRpc3RzICAgICBzY2llbnRpc3RzVGVzdDUodHlwZW5hbWUgVGVtcGxhdGVDbGFzczxUPjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgdHlwZW5hbWUgVGVtcGxhdGVDbGFzczxUPjo6c2NpZW50aXN0cyAgICAgICAgc2NpZW50aXN0c1Rlc3Q2KGNvbnN0IHR5cGVuYW1lIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGVudW0gVGVtcGxhdGVDbGFzczxUPjo6c2NpZW50aXN0cyAgICAgICAgIHNjaWVudGlzdHNUZXN0NyhlbnVtIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IGVudW0gVGVtcGxhdGVDbGFzczxUPjo6c2NpZW50aXN0cyAgIHNjaWVudGlzdHNUZXN0OChjb25zdCBlbnVtIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIHR5cGVuYW1lIFRlbXBsYXRlQ2xhc3M6OnNjaWVudGlzdHMgICAgICAgIHNjaWVudGlzdHNUZXN0OSh0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzOjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KLy8gIGVudW0gVGVtcGxhdGVDbGFzczo6c2NpZW50aXN0cyAgICAgICAgICAgIHNjaWVudGlzdHNUZXN0QShlbnVtIFRlbXBsYXRlQ2xhc3M6OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHR5cGVuYW1lIFRlbXBsYXRlQ2xhc3M6OnNjaWVudGlzdHMgIHNjaWVudGlzdHNUZXN0Qihjb25zdCB0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzOjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KLy8gIGNvbnN0IGVudW0gVGVtcGxhdGVDbGFzczo6c2NpZW50aXN0cyAgICAgIHNjaWVudGlzdHNUZXN0Qyhjb25zdCBlbnVtIFRlbXBsYXRlQ2xhc3M6OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIHNjaWVudGlzdHN0ZDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNUZXN0RChzY2llbnRpc3RzdGQxIGUpIHsgcmV0dXJuIGU7IH0KICBzY2llbnRpc3RzdGQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzVGVzdEUoc2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9CiAgc2NpZW50aXN0c3RkMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c1Rlc3RGKHNjaWVudGlzdHN0ZDMgZSkgeyByZXR1cm4gZTsgfQogIHR5cGVuYW1lIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDEgIHNjaWVudGlzdHNUZXN0Ryh0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzPFQ+OjpzY2llbnRpc3RzdGQxIGUpIHsgcmV0dXJuIGU7IH0KICB0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzPFQ+OjpzY2llbnRpc3RzdGQyICBzY2llbnRpc3RzVGVzdEgodHlwZW5hbWUgVGVtcGxhdGVDbGFzczxUPjo6c2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9CiAgdHlwZW5hbWUgVGVtcGxhdGVDbGFzczxUPjo6c2NpZW50aXN0c3RkMyAgc2NpZW50aXN0c1Rlc3RJKHR5cGVuYW1lIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHNjaWVudGlzdHMgJiAgICAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNUZXN0Sihjb25zdCBzY2llbnRpc3RzICZlKSB7IHJldHVybiBlOyB9Cn07CgpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgICAgIHNjaWVudGlzdHNUZXN0MShUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgIHNjaWVudGlzdHNUZXN0Mihjb25zdCBUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQplbnVtIFRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgIHNjaWVudGlzdHNUZXN0MyhlbnVtIFRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CmNvbnN0IGVudW0gVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgc2NpZW50aXN0c1Rlc3Q0KGNvbnN0IGVudW0gVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQxICAgICAgICAgICBzY2llbnRpc3RzVGVzdDUoVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQxIGUpIHsgcmV0dXJuIGU7IH0KVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQyICAgICAgICAgICBzY2llbnRpc3RzVGVzdDYoVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQyIGUpIHsgcmV0dXJuIGU7IH0KVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzICAgICAgICAgICBzY2llbnRpc3RzVGVzdDcoVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzICYgICBzY2llbnRpc3RzVGVzdDgoY29uc3QgVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzICZlKSB7IHJldHVybiBlOyB9CgoKbmFtZXNwYWNlIE5hbWUgewp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgVENsYXNzIHsKICBlbnVtIHNjaWVudGlzdHMgeyBmYXJhZGF5LCBiZWxsID0gMjAgfTsgCiAgdHlwZWRlZiBlbnVtIHNjaWVudGlzdHMgc2NpZW50aXN0c3RkMTsKICB0eXBlZGVmIHNjaWVudGlzdHMgc2NpZW50aXN0c3RkMjsKICB0eXBlZGVmIHNjaWVudGlzdHN0ZDEgc2NpZW50aXN0c3RkMzsKICBzY2llbnRpc3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3QxKHNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGVudW0gc2NpZW50aXN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDIoZW51bSBzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBzY2llbnRpc3RzICAgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3QzKGNvbnN0IHNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IGVudW0gc2NpZW50aXN0cyAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDQoY29uc3QgZW51bSBzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICB0eXBlbmFtZSBUQ2xhc3M8VD46OnNjaWVudGlzdHMgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3Q1KHR5cGVuYW1lIFRDbGFzczxUPjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgdHlwZW5hbWUgVENsYXNzPFQ+OjpzY2llbnRpc3RzICAgICAgc2NpZW50aXN0c05hbWVUZXN0Nihjb25zdCB0eXBlbmFtZSBUQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGVudW0gVENsYXNzPFQ+OjpzY2llbnRpc3RzICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDcoZW51bSBUQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IGVudW0gVENsYXNzPFQ+OjpzY2llbnRpc3RzICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDgoY29uc3QgZW51bSBUQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIHR5cGVuYW1lIFRDbGFzczo6c2NpZW50aXN0cyAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDkodHlwZW5hbWUgVENsYXNzOjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KLy8gIGVudW0gVENsYXNzOjpzY2llbnRpc3RzICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdEEoZW51bSBUQ2xhc3M6OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHR5cGVuYW1lIFRDbGFzczo6c2NpZW50aXN0cyAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdEIoY29uc3QgdHlwZW5hbWUgVENsYXNzOjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KLy8gIGNvbnN0IGVudW0gVENsYXNzOjpzY2llbnRpc3RzICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdEMoY29uc3QgZW51bSBUQ2xhc3M6OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIHNjaWVudGlzdHN0ZDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdEQoc2NpZW50aXN0c3RkMSBlKSB7IHJldHVybiBlOyB9CiAgc2NpZW50aXN0c3RkMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0RShzY2llbnRpc3RzdGQyIGUpIHsgcmV0dXJuIGU7IH0KICBzY2llbnRpc3RzdGQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3RGKHNjaWVudGlzdHN0ZDMgZSkgeyByZXR1cm4gZTsgfQogIHR5cGVuYW1lIFRDbGFzczxUPjo6c2NpZW50aXN0c3RkMSAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdEcodHlwZW5hbWUgVENsYXNzPFQ+OjpzY2llbnRpc3RzdGQxIGUpIHsgcmV0dXJuIGU7IH0KICB0eXBlbmFtZSBUQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDIgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3RIKHR5cGVuYW1lIFRDbGFzczxUPjo6c2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9CiAgdHlwZW5hbWUgVENsYXNzPFQ+OjpzY2llbnRpc3RzdGQzICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0SSh0eXBlbmFtZSBUQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDMgZSkgeyByZXR1cm4gZTsgfQoKICB0eXBlbmFtZSBOYW1lOjpUQ2xhc3M8VD46OnNjaWVudGlzdHMgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDEodHlwZW5hbWUgTmFtZTo6VENsYXNzPFQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCB0eXBlbmFtZSBOYW1lOjpUQ2xhc3M8VD46OnNjaWVudGlzdHMgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDIoY29uc3QgdHlwZW5hbWUgTmFtZTo6VENsYXNzPFQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBlbnVtIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0cyAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDMoZW51bSBOYW1lOjpUQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IGVudW0gTmFtZTo6VENsYXNzPFQ+OjpzY2llbnRpc3RzICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0NChjb25zdCBlbnVtIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgdHlwZW5hbWUgTmFtZTo6VENsYXNzPFQ+OjpzY2llbnRpc3RzdGQxICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3Q1KHR5cGVuYW1lIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0c3RkMSBlKSB7IHJldHVybiBlOyB9CiAgdHlwZW5hbWUgTmFtZTo6VENsYXNzPFQ+OjpzY2llbnRpc3RzdGQyICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3Q2KHR5cGVuYW1lIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9CiAgdHlwZW5hbWUgTmFtZTo6VENsYXNzPFQ+OjpzY2llbnRpc3RzdGQzICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3Q3KHR5cGVuYW1lIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0c3RkMyBlKSB7IHJldHVybiBlOyB9CgogIC8vIFRlc3QgVGVtcGxhdGVDbGFzczo6c2NpZW50aXN0cyByYXRoZXIgdGhlbiBUQ2xhc3M6OnNjaWVudGlzdHMKICA6OlRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgICAgICAgc2NpZW50aXN0c090aGVyVGVzdDEoOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IDo6VGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICBzY2llbnRpc3RzT3RoZXJUZXN0Mihjb25zdCA6OlRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgZW51bSA6OlRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgIHNjaWVudGlzdHNPdGhlclRlc3QzKGVudW0gOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IGVudW0gOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgICBzY2llbnRpc3RzT3RoZXJUZXN0NChjb25zdCBlbnVtIDo6VGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICA6OlRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMSAgICAgICAgICAgc2NpZW50aXN0c090aGVyVGVzdDUoOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgZSkgeyByZXR1cm4gZTsgfQogIDo6VGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQyICAgICAgICAgICBzY2llbnRpc3RzT3RoZXJUZXN0Nig6OlRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9CiAgOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHN0ZDMgICAgICAgICAgIHNjaWVudGlzdHNPdGhlclRlc3Q3KDo6VGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KfTsKClRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0MShUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CmNvbnN0IFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0Mihjb25zdCBUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CmVudW0gVENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0MyhlbnVtIFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgZW51bSBUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3Q0KGNvbnN0IGVudW0gVENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMSAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDUoVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgZSkgeyByZXR1cm4gZTsgfQpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDYoVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDIgZSkgeyByZXR1cm4gZTsgfQpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDcoVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDMgZSkgeyByZXR1cm4gZTsgfQoKTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDEoTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0Mihjb25zdCBOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CmVudW0gTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3QzKGVudW0gTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBlbnVtIE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0NChjb25zdCBlbnVtIE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDUoTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgZSkgeyByZXR1cm4gZTsgfQpOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0NihOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9Ck5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3Q3KE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KfQoKTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDgoTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0OShjb25zdCBOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CmVudW0gTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3RBKGVudW0gTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBlbnVtIE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0Qihjb25zdCBlbnVtIE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdEMoTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgZSkgeyByZXR1cm4gZTsgfQpOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0RChOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9Ck5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3RFKE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KCnVzaW5nIG5hbWVzcGFjZSBOYW1lOwpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0RihUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CmNvbnN0IFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3RHKGNvbnN0IFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KZW51bSBUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdEgoZW51bSBUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CmNvbnN0IGVudW0gVENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3RJKGNvbnN0IGVudW0gVENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMSAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0SihUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMSBlKSB7IHJldHVybiBlOyB9ClRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQyICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3RLKFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQyIGUpIHsgcmV0dXJuIGU7IH0KVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDMgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdEwoVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDMgZSkgeyByZXR1cm4gZTsgfQoKJX0KCiV0ZW1wbGF0ZShUZW1wbGF0ZUNsYXNzSW50KSBUZW1wbGF0ZUNsYXNzPGludD47CiV0ZW1wbGF0ZShUQ2xhc3NJbnQpIE5hbWU6OlRDbGFzczxpbnQ+OwoKCi8vICVyZW5hbWUgdGVzdHMKJXJlbmFtZShOZXdOYW1lU3RydWN0KSBPbGROYW1lU3RydWN0OwolcmVuYW1lKG5ld25hbWUpIG9sZF9uYW1lOwolcmVuYW1lKGRvdWJsZW5hbWVyZW5hbWVkKSBkb3VibGVuYW1lOwolcmVuYW1lKHNpbXBsZXJlbmFtZWQpIHNpbXBsZTsKJXJlbmFtZShzaW5nbGVuYW1lcmVuYW1lZCkgc2luZ2xlbmFtZTsKJXJlbmFtZShiYW5nKSBPbGROYW1lU3RydWN0OjprZXJib29tOwoKJWlubGluZSAlewplbnVtIG9sZF9uYW1lIHsgYXJnaCwgZWVrID0gLTEgfTsKdHlwZWRlZiBvbGRfbmFtZSBvbGRfbmFtZXRkOwpvbGRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVUZXN0MShvbGRfbmFtZSBlKSB7IHJldHVybiBlOyB9Cm9sZF9uYW1ldGQgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVRlc3QyKG9sZF9uYW1ldGQgZSkgeyByZXR1cm4gZTsgfQoKc3RydWN0IE9sZE5hbWVTdHJ1Y3QgewogIGVudW0gZW51bWVyYXRpb24ge3doaXp6LCBrZXJib29tLCBwb3B9OwogIGVudW1lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVUZXN0MShlbnVtZXJhdGlvbiBlKSB7IHJldHVybiBlOyB9CiAgT2xkTmFtZVN0cnVjdDo6ZW51bWVyYXRpb24gICAgICAgIHJlbmFtZVRlc3QyKE9sZE5hbWVTdHJ1Y3Q6OmVudW1lcmF0aW9uIGUpIHsgcmV0dXJuIGU7IH0KCiAgZW51bSBzaW1wbGUge3NpbXBsZTF9OwogIHR5cGVkZWYgZW51bSBkb3VibGVuYW1ldGFnIHtkb3VibGVuYW1lMX0gZG91YmxlbmFtZTsKICB0eXBlZGVmIGVudW0ge3NpbmdsZW5hbWUxfSBzaW5nbGVuYW1lOwoKICBzaW1wbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lVGVzdDMoc2ltcGxlIGUpIHsgcmV0dXJuIGU7IH0KICBkb3VibGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lVGVzdDQoZG91YmxlbmFtZSBlKSB7IHJldHVybiBlOyB9CiAgZG91YmxlbmFtZXRhZyAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVRlc3Q1KGRvdWJsZW5hbWV0YWcgZSkgeyByZXR1cm4gZTsgfQogIHNpbmdsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVUZXN0NihzaW5nbGVuYW1lIGUpIHsgcmV0dXJuIGU7IH0KfTsKCk9sZE5hbWVTdHJ1Y3Q6OmVudW1lcmF0aW9uICAgICAgICAgIHJlbmFtZVRlc3QzKE9sZE5hbWVTdHJ1Y3Q6OmVudW1lcmF0aW9uIGUpIHsgcmV0dXJuIGU7IH0KT2xkTmFtZVN0cnVjdDo6c2ltcGxlICAgICAgICAgICAgICAgcmVuYW1lVGVzdDQoT2xkTmFtZVN0cnVjdDo6c2ltcGxlIGUpIHsgcmV0dXJuIGU7IH0KT2xkTmFtZVN0cnVjdDo6ZG91YmxlbmFtZSAgICAgICAgICAgcmVuYW1lVGVzdDUoT2xkTmFtZVN0cnVjdDo6ZG91YmxlbmFtZSBlKSB7IHJldHVybiBlOyB9Ck9sZE5hbWVTdHJ1Y3Q6OmRvdWJsZW5hbWV0YWcgICAgICAgIHJlbmFtZVRlc3Q2KE9sZE5hbWVTdHJ1Y3Q6OmRvdWJsZW5hbWV0YWcgZSkgeyByZXR1cm4gZTsgfQpPbGROYW1lU3RydWN0OjpzaW5nbGVuYW1lICAgICAgICAgICByZW5hbWVUZXN0NyhPbGROYW1lU3RydWN0OjpzaW5nbGVuYW1lIGUpIHsgcmV0dXJuIGU7IH0KJX0KCiVyZW5hbWUoQ2xhc2gxX2RpMSkgQ2xhc2gxOjpkaTE7CiVyZW5hbWUoQ2xhc2gxX2RpMikgQ2xhc2gxOjpkaTI7CiVyZW5hbWUoQ2xhc2gxX2RpMykgQ2xhc2gxOjpkaTM7CiVpbmxpbmUgJXsKbmFtZXNwYWNlIENsYXNoMSB7CiAgZW51bSBEdXBsaWNhdGVJdGVtczEgeyBkaTEsIGRpMiA9IDEwLCBkaTMgfTsKfQpuYW1lc3BhY2UgQ2xhc2gyIHsKICBlbnVtIER1cGxpY2F0ZUl0ZW1zMiB7IGRpMSwgZGkyID0gMTAsIGRpMyB9Owp9CiV9CgolaW5saW5lICV7CnN0cnVjdCBUcmVlc0NsYXNzIHsKICBlbnVtIHRyZWVzIHtvYWssIGZpciwgcGluZSB9OwogIHR5cGVkZWYgZW51bSB0cmVlcyB0cmVlc3RkMTsKICB0eXBlZGVmIHRyZWVzIHRyZWVzdGQyOwogIHR5cGVkZWYgdHJlZXN0ZDEgdHJlZXN0ZDM7CiAgdHlwZWRlZiBUcmVlc0NsYXNzOjp0cmVlcyB0cmVlc3RkNDsKICB0eXBlZGVmIHRyZWVzdGQxIHRyZWVzdGQ1OwoKICB0cmVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0MSh0cmVlcyBlKSB7IHJldHVybiBlOyB9CiAgdHJlZXN0ZDEgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdDIodHJlZXN0ZDEgZSkgeyByZXR1cm4gZTsgfQogIHRyZWVzdGQyICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3QzKHRyZWVzdGQyIGUpIHsgcmV0dXJuIGU7IH0KICB0cmVlc3RkMyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0NCh0cmVlc3RkMyBlKSB7IHJldHVybiBlOyB9CiAgdHJlZXN0ZDQgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdDUodHJlZXN0ZDQgZSkgeyByZXR1cm4gZTsgfQogIHRyZWVzdGQ1ICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3Q2KHRyZWVzdGQ1IGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCB0cmVlcyAgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0Nyhjb25zdCB0cmVlcyBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgdHJlZXN0ZDEgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdDgoY29uc3QgdHJlZXN0ZDEgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHRyZWVzdGQyICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3Q5KGNvbnN0IHRyZWVzdGQyIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCB0cmVlc3RkMyAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0QShjb25zdCB0cmVlc3RkMyBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgdHJlZXN0ZDQgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdEIoY29uc3QgdHJlZXN0ZDQgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHRyZWVzdGQ1ICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3RDKGNvbnN0IHRyZWVzdGQ1IGUpIHsgcmV0dXJuIGU7IH0KICBUcmVlc0NsYXNzOjp0cmVlcyAgICAgICAgICAgICAgICAgdHJlZXNUZXN0RChUcmVlc0NsYXNzOjp0cmVlcyBlKSB7IHJldHVybiBlOyB9CiAgVHJlZXNDbGFzczo6dHJlZXN0ZDEgICAgICAgICAgICAgIHRyZWVzVGVzdEUoVHJlZXNDbGFzczo6dHJlZXN0ZDEgZSkgeyByZXR1cm4gZTsgfQogIFRyZWVzQ2xhc3M6OnRyZWVzdGQyICAgICAgICAgICAgICB0cmVlc1Rlc3RGKFRyZWVzQ2xhc3M6OnRyZWVzdGQyIGUpIHsgcmV0dXJuIGU7IH0KICBUcmVlc0NsYXNzOjp0cmVlc3RkMyAgICAgICAgICAgICAgdHJlZXNUZXN0RyhUcmVlc0NsYXNzOjp0cmVlc3RkMyBlKSB7IHJldHVybiBlOyB9CiAgVHJlZXNDbGFzczo6dHJlZXN0ZDQgICAgICAgICAgICAgIHRyZWVzVGVzdEgoVHJlZXNDbGFzczo6dHJlZXN0ZDQgZSkgeyByZXR1cm4gZTsgfQogIFRyZWVzQ2xhc3M6OnRyZWVzdGQ1ICAgICAgICAgICAgICB0cmVlc1Rlc3RJKFRyZWVzQ2xhc3M6OnRyZWVzdGQ1IGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBUcmVlc0NsYXNzOjp0cmVlcyAgICAgICAgICAgdHJlZXNUZXN0Sihjb25zdCBUcmVlc0NsYXNzOjp0cmVlcyBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDEgICAgICAgIHRyZWVzVGVzdEsoY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDEgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQyICAgICAgICB0cmVlc1Rlc3RMKGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQyIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMyAgICAgICAgdHJlZXNUZXN0TShjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMyBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDQgICAgICAgIHRyZWVzVGVzdE4oY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDQgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQ1ICAgICAgICB0cmVlc1Rlc3RPKGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQ1IGUpIHsgcmV0dXJuIGU7IH0KfTsKClRyZWVzQ2xhc3M6OnRyZWVzICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdDEoVHJlZXNDbGFzczo6dHJlZXMgZSkgeyByZXR1cm4gZTsgfQpUcmVlc0NsYXNzOjp0cmVlc3RkMSAgICAgICAgICAgICAgICB0cmVlc1Rlc3QyKFRyZWVzQ2xhc3M6OnRyZWVzdGQxIGUpIHsgcmV0dXJuIGU7IH0KVHJlZXNDbGFzczo6dHJlZXN0ZDIgICAgICAgICAgICAgICAgdHJlZXNUZXN0MyhUcmVlc0NsYXNzOjp0cmVlc3RkMiBlKSB7IHJldHVybiBlOyB9ClRyZWVzQ2xhc3M6OnRyZWVzdGQzICAgICAgICAgICAgICAgIHRyZWVzVGVzdDQoVHJlZXNDbGFzczo6dHJlZXN0ZDMgZSkgeyByZXR1cm4gZTsgfQpUcmVlc0NsYXNzOjp0cmVlc3RkNCAgICAgICAgICAgICAgICB0cmVlc1Rlc3Q1KFRyZWVzQ2xhc3M6OnRyZWVzdGQ0IGUpIHsgcmV0dXJuIGU7IH0KVHJlZXNDbGFzczo6dHJlZXN0ZDUgICAgICAgICAgICAgICAgdHJlZXNUZXN0NihUcmVlc0NsYXNzOjp0cmVlc3RkNSBlKSB7IHJldHVybiBlOyB9CmNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzICAgICAgICAgICAgIHRyZWVzVGVzdDcoY29uc3QgVHJlZXNDbGFzczo6dHJlZXMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMSAgICAgICAgICB0cmVlc1Rlc3Q4KGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQxIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDIgICAgICAgICAgdHJlZXNUZXN0OShjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMiBlKSB7IHJldHVybiBlOyB9CmNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQzICAgICAgICAgIHRyZWVzVGVzdEEoY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkNCAgICAgICAgICB0cmVlc1Rlc3RCKGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQ0IGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDUgICAgICAgICAgdHJlZXNUZXN0Qyhjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkNSBlKSB7IHJldHVybiBlOyB9Cgp0eXBlZGVmIGVudW0gVHJlZXNDbGFzczo6dHJlZXMgdHJlZXNnbG9iYWx0ZDE7CnR5cGVkZWYgVHJlZXNDbGFzczo6dHJlZXMgdHJlZXNnbG9iYWx0ZDI7CnR5cGVkZWYgVHJlZXNDbGFzczo6dHJlZXN0ZDEgdHJlZXNnbG9iYWx0ZDM7CnR5cGVkZWYgVHJlZXNDbGFzczo6dHJlZXN0ZDIgdHJlZXNnbG9iYWx0ZDQ7CnR5cGVkZWYgdHJlZXNnbG9iYWx0ZDQgdHJlZXNnbG9iYWx0ZDU7Cgp0cmVlc2dsb2JhbHRkMSAgICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3REKHRyZWVzZ2xvYmFsdGQxIGUpIHsgcmV0dXJuIGU7IH0KdHJlZXNnbG9iYWx0ZDIgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0RSh0cmVlc2dsb2JhbHRkMiBlKSB7IHJldHVybiBlOyB9CnRyZWVzZ2xvYmFsdGQzICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdEYodHJlZXNnbG9iYWx0ZDMgZSkgeyByZXR1cm4gZTsgfQp0cmVlc2dsb2JhbHRkNCAgICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3RHKHRyZWVzZ2xvYmFsdGQ0IGUpIHsgcmV0dXJuIGU7IH0KdHJlZXNnbG9iYWx0ZDUgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0SCh0cmVlc2dsb2JhbHRkNSBlKSB7IHJldHVybiBlOyB9CmNvbnN0IHRyZWVzZ2xvYmFsdGQxICAgICAgICAgICAgICAgIHRyZWVzVGVzdEkoY29uc3QgdHJlZXNnbG9iYWx0ZDEgZSkgeyByZXR1cm4gZTsgfQpjb25zdCB0cmVlc2dsb2JhbHRkMiAgICAgICAgICAgICAgICB0cmVlc1Rlc3RKKGNvbnN0IHRyZWVzZ2xvYmFsdGQyIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgdHJlZXNnbG9iYWx0ZDMgICAgICAgICAgICAgICAgdHJlZXNUZXN0Syhjb25zdCB0cmVlc2dsb2JhbHRkMyBlKSB7IHJldHVybiBlOyB9CmNvbnN0IHRyZWVzZ2xvYmFsdGQ0ICAgICAgICAgICAgICAgIHRyZWVzVGVzdEwoY29uc3QgdHJlZXNnbG9iYWx0ZDQgZSkgeyByZXR1cm4gZTsgfQpjb25zdCB0cmVlc2dsb2JhbHRkNSAgICAgICAgICAgICAgICB0cmVlc1Rlc3RNKGNvbnN0IHRyZWVzZ2xvYmFsdGQ1IGUpIHsgcmV0dXJuIGU7IH0KCnR5cGVkZWYgY29uc3QgZW51bSBUcmVlc0NsYXNzOjp0cmVlcyB0cmVlc2dsb2JhbHRkNjsKdHlwZWRlZiBjb25zdCBUcmVlc0NsYXNzOjp0cmVlcyB0cmVlc2dsb2JhbHRkNzsKdHlwZWRlZiBjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMSB0cmVlc2dsb2JhbHRkODsKdHlwZWRlZiBjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMiB0cmVlc2dsb2JhbHRkOTsKdHlwZWRlZiBjb25zdCB0cmVlc2dsb2JhbHRkNCB0cmVlc2dsb2JhbHRkQTsKCi8vdHJlZXNnbG9iYWx0ZDYgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0Tih0cmVlc2dsb2JhbHRkNiBlKSB7IHJldHVybiBlOyB9IC8vIGNhc3RpbmcgdXNpbmcgYW4gaW50IGluc3RlYWQgb2YgdHJlZXNnbG9iYWx0ZDYKdHJlZXNnbG9iYWx0ZDcgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0Tyh0cmVlc2dsb2JhbHRkNyBlKSB7IHJldHVybiBlOyB9CnRyZWVzZ2xvYmFsdGQ4ICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdFAodHJlZXNnbG9iYWx0ZDggZSkgeyByZXR1cm4gZTsgfQp0cmVlc2dsb2JhbHRkOSAgICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3RRKHRyZWVzZ2xvYmFsdGQ5IGUpIHsgcmV0dXJuIGU7IH0KdHJlZXNnbG9iYWx0ZEEgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0Uih0cmVlc2dsb2JhbHRkQSBlKSB7IHJldHVybiBlOyB9CgpuYW1lc3BhY2UgY3VybHkgewogIG5hbWVzcGFjZSBncmVhc3kgewogICAgc3RydWN0IEhhaXJTdHJ1Y3QgewogICAgICBlbnVtIGhhaXIgeyBibG9uZGU9MHhGRjAsIGdpbmdlciB9OwogICAgICB0eXBlZGVmIGhhaXIgaGFpcnRkMTsKICAgICAgdHlwZWRlZiBIYWlyU3RydWN0OjpoYWlyIGhhaXJ0ZDI7CiAgICAgIHR5cGVkZWYgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlyIGhhaXJ0ZDM7CiAgICAgIHR5cGVkZWYgY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpciBoYWlydGQ0OwogICAgICB0eXBlZGVmIDo6Y3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpciBoYWlydGQ1OwogICAgICB0eXBlZGVmIGhhaXJ0ZDEgaGFpcnRkNjsKICAgICAgdHlwZWRlZiBIYWlyU3RydWN0OjpoYWlydGQxIGhhaXJ0ZDc7CiAgICAgIHR5cGVkZWYgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQxIGhhaXJ0ZDg7CiAgICAgIHR5cGVkZWYgY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMSBoYWlydGQ5OwogICAgICB0eXBlZGVmIDo6Y3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMSBoYWlydGRBOwogICAgICBoYWlyICAgICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdDEoaGFpciBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDEgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0MihoYWlydGQxIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkMiAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3QzKGhhaXJ0ZDIgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQzICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdDQoaGFpcnRkMyBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDQgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0NShoYWlydGQ0IGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkNSAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3Q2KGhhaXJ0ZDUgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQ2ICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdDcoaGFpcnRkNiBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDcgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0OChoYWlydGQ3IGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkOCAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3Q5KGhhaXJ0ZDggZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQ5ICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEEoaGFpcnRkOSBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZEEgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0QihoYWlydGRBIGUpIHsgcmV0dXJuIGU7IH0KCiAgICAgIDo6Y29sb3VyICAgICAgICAgICAgICAgICAgICAgIGNvbG91clRlc3QxKDo6Y29sb3VyIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgZW51bSBjb2xvdXIgICAgICAgICAgICAgICAgICAgY29sb3VyVGVzdDIoZW51bSBjb2xvdXIgZSkgeyByZXR1cm4gZTsgfQogICAgICBuYW1lZGFub24gICAgICAgICAgICAgICAgICAgICBuYW1lZGFub25UZXN0MShuYW1lZGFub24gZSkgeyByZXR1cm4gZTsgfQogICAgICBBbm9uU3BhY2U6Om5hbWVkYW5vbnNwYWNlICAgICAgbmFtZWRhbm9uc3BhY2VUZXN0MShBbm9uU3BhY2U6Om5hbWVkYW5vbnNwYWNlIGUpIHsgcmV0dXJuIGU7IH0KCiAgICAgIHRyZWVzZ2xvYmFsdGQxICAgICAgICAgICAgICAgIHRyZWVzR2xvYmFsVGVzdDEodHJlZXNnbG9iYWx0ZDEgZSkgeyByZXR1cm4gZTsgfQogICAgICB0cmVlc2dsb2JhbHRkMiAgICAgICAgICAgICAgICB0cmVlc0dsb2JhbFRlc3QyKHRyZWVzZ2xvYmFsdGQyIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgdHJlZXNnbG9iYWx0ZDMgICAgICAgICAgICAgICAgdHJlZXNHbG9iYWxUZXN0Myh0cmVlc2dsb2JhbHRkMyBlKSB7IHJldHVybiBlOyB9CiAgICAgIHRyZWVzZ2xvYmFsdGQ0ICAgICAgICAgICAgICAgIHRyZWVzR2xvYmFsVGVzdDQodHJlZXNnbG9iYWx0ZDQgZSkgeyByZXR1cm4gZTsgfQogICAgICB0cmVlc2dsb2JhbHRkNSAgICAgICAgICAgICAgICB0cmVlc0dsb2JhbFRlc3Q1KHRyZWVzZ2xvYmFsdGQ1IGUpIHsgcmV0dXJuIGU7IH0KCiAgICB9OwogICAgSGFpclN0cnVjdDo6aGFpciAgICAgICAgICAgICAgICBoYWlyVGVzdDEoSGFpclN0cnVjdDo6aGFpciBlKSB7IHJldHVybiBlOyB9CiAgICBIYWlyU3RydWN0OjpoYWlydGQxICAgICAgICAgICAgIGhhaXJUZXN0MihIYWlyU3RydWN0OjpoYWlydGQxIGUpIHsgcmV0dXJuIGU7IH0KICAgIEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDIgICAgICAgICAgICAgaGFpclRlc3QzKEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDIgZSkgeyByZXR1cm4gZTsgfQogICAgSGFpclN0cnVjdDo6aGFpcnRkMyAgICAgICAgICAgICBoYWlyVGVzdDQoSGFpclN0cnVjdDo6aGFpcnRkMyBlKSB7IHJldHVybiBlOyB9CiAgICBIYWlyU3RydWN0OjpoYWlydGQ0ICAgICAgICAgICAgIGhhaXJUZXN0NShIYWlyU3RydWN0OjpoYWlydGQ0IGUpIHsgcmV0dXJuIGU7IH0KICAgIEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDUgICAgICAgICAgICAgaGFpclRlc3Q2KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDUgZSkgeyByZXR1cm4gZTsgfQogICAgSGFpclN0cnVjdDo6aGFpcnRkNiAgICAgICAgICAgICBoYWlyVGVzdDcoSGFpclN0cnVjdDo6aGFpcnRkNiBlKSB7IHJldHVybiBlOyB9CiAgICBIYWlyU3RydWN0OjpoYWlydGQ3ICAgICAgICAgICAgIGhhaXJUZXN0OChIYWlyU3RydWN0OjpoYWlydGQ3IGUpIHsgcmV0dXJuIGU7IH0KICAgIEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDggICAgICAgICAgICAgaGFpclRlc3Q5KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDggZSkgeyByZXR1cm4gZTsgfQogICAgSGFpclN0cnVjdDo6aGFpcnRkOSAgICAgICAgICAgICBoYWlyVGVzdEEoSGFpclN0cnVjdDo6aGFpcnRkOSBlKSB7IHJldHVybiBlOyB9CiAgICBIYWlyU3RydWN0OjpoYWlydGRBICAgICAgICAgICAgIGhhaXJUZXN0QihIYWlyU3RydWN0OjpoYWlydGRBIGUpIHsgcmV0dXJuIGU7IH0KICAgIGNvbnN0IEhhaXJTdHJ1Y3Q6OmhhaXIgJiAgICAgICAgaGFpclRlc3RDKGNvbnN0IEhhaXJTdHJ1Y3Q6OmhhaXIgJmUpIHsgcmV0dXJuIGU7IH0KICB9CiAgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlyICAgICAgICAgIGhhaXJUZXN0QTEoZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlyIGUpIHsgcmV0dXJuIGU7IH0KICBncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDEgICAgICAgaGFpclRlc3RBMihncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDEgZSkgeyByZXR1cm4gZTsgfQogIGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMiAgICAgICBoYWlyVGVzdEEzKGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMiBlKSB7IHJldHVybiBlOyB9CiAgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQzICAgICAgIGhhaXJUZXN0QTQoZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQzIGUpIHsgcmV0dXJuIGU7IH0KICBncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDQgICAgICAgaGFpclRlc3RBNShncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDQgZSkgeyByZXR1cm4gZTsgfQogIGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkNSAgICAgICBoYWlyVGVzdEE2KGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkNSBlKSB7IHJldHVybiBlOyB9CiAgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ2ICAgICAgIGhhaXJUZXN0QTcoZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ2IGUpIHsgcmV0dXJuIGU7IH0KICBncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDcgICAgICAgaGFpclRlc3RBOChncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDcgZSkgeyByZXR1cm4gZTsgfQogIGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkOCAgICAgICBoYWlyVGVzdEE5KGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkOCBlKSB7IHJldHVybiBlOyB9CiAgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ5ICAgICAgIGhhaXJUZXN0QUEoZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ5IGUpIHsgcmV0dXJuIGU7IH0KICBncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgICAgICAgaGFpclRlc3RBQihncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkQSAmICAgICBoYWlyVGVzdEFDKGNvbnN0IGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkQSAmZSkgeyByZXR1cm4gZTsgfQp9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXIgICAgIGhhaXJUZXN0QjEoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpciBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDEgIGhhaXJUZXN0QjIoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMSBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDIgIGhhaXJUZXN0QjMoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMiBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDMgIGhhaXJUZXN0QjQoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMyBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDQgIGhhaXJUZXN0QjUoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkNCBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDUgIGhhaXJUZXN0QjYoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkNSBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDYgIGhhaXJUZXN0QjcoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkNiBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDcgIGhhaXJUZXN0QjgoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkNyBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDggIGhhaXJUZXN0QjkoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkOCBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDkgIGhhaXJUZXN0QkEoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkOSBlKSB7IHJldHVybiBlOyB9CmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgIGhhaXJUZXN0QkIoY3VybHk6OmdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkQSBlKSB7IHJldHVybiBlOyB9CmNvbnN0IGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgJiBoYWlyVGVzdEJDKGNvbnN0IGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgJmUpIHsgcmV0dXJuIGU7IH0KCnVzaW5nIGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q7CkhhaXJTdHJ1Y3Q6OmhhaXIgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0QzEoSGFpclN0cnVjdDo6aGFpciBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDEgICAgICAgICAgICAgICAgIGhhaXJUZXN0QzIoSGFpclN0cnVjdDo6aGFpcnRkMSBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDIgICAgICAgICAgICAgICAgIGhhaXJUZXN0QzMoSGFpclN0cnVjdDo6aGFpcnRkMiBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDMgICAgICAgICAgICAgICAgIGhhaXJUZXN0QzQoSGFpclN0cnVjdDo6aGFpcnRkMyBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDQgICAgICAgICAgICAgICAgIGhhaXJUZXN0QzUoSGFpclN0cnVjdDo6aGFpcnRkNCBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDUgICAgICAgICAgICAgICAgIGhhaXJUZXN0QzYoSGFpclN0cnVjdDo6aGFpcnRkNSBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDYgICAgICAgICAgICAgICAgIGhhaXJUZXN0QzcoSGFpclN0cnVjdDo6aGFpcnRkNiBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDcgICAgICAgICAgICAgICAgIGhhaXJUZXN0QzgoSGFpclN0cnVjdDo6aGFpcnRkNyBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDggICAgICAgICAgICAgICAgIGhhaXJUZXN0QzkoSGFpclN0cnVjdDo6aGFpcnRkOCBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDkgICAgICAgICAgICAgICAgIGhhaXJUZXN0Q0EoSGFpclN0cnVjdDo6aGFpcnRkOSBlKSB7IHJldHVybiBlOyB9CkhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgICAgICAgICAgICAgICAgIGhhaXJUZXN0Q0IoSGFpclN0cnVjdDo6aGFpcnRkQSBlKSB7IHJldHVybiBlOyB9CmNvbnN0IEhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgJiAgICAgICAgIGhhaXJUZXN0Q0MoY29uc3QgSGFpclN0cnVjdDo6aGFpcnRkQSAmZSkgeyByZXR1cm4gZTsgfQoKbmFtZXNwYWNlIGN1cmx5IHsKICBuYW1lc3BhY2UgZ3JlYXN5IHsKICAgIHN0cnVjdCBGaXJTdHJ1Y3QgOiBIYWlyU3RydWN0IHsKICAgICAgaGFpciAgICAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3RGaXIxKGhhaXIgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQxICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEZpcjIoaGFpcnRkMSBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDIgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0RmlyMyhoYWlydGQyIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkMyAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3RGaXI0KGhhaXJ0ZDMgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQ0ICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEZpcjUoaGFpcnRkNCBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDUgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0RmlyNihoYWlydGQ1IGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkNiAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3RGaXI3KGhhaXJ0ZDYgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQ3ICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEZpcjgoaGFpcnRkNyBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDggICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0RmlyOShoYWlydGQ4IGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkOSAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3RGaXJBKGhhaXJ0ZDkgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGRBICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEZpckIoaGFpcnRkQSBlKSB7IHJldHVybiBlOyB9CiAgICB9OwogIH0KfQoKc3RydWN0IE9ic2N1cmUgewogIGVudW0gWmVybyB7fTsKICBlbnVtIE9uZSB7b25lfTsKICBlbnVtIFR3byB7dHdvLCB0d29hZ2Fpbn07CiNpZiBkZWZpbmVkKFNXSUcpCiAgLy8gZysrLTQuMyB3YXJucyBhYm91dCB0aGlzCiAgdHlwZWRlZiBlbnVtIEVtcHR5IHt9OwojZW5kaWYKICB0eXBlZGVmIGVudW0ge30gQWxzb0VtcHR5Owp9OwoKLy8gVW5uYW1lZCBlbnVtIGluc3RhbmNlCmV4dGVybiAiQyIgewplbnVtIHsgZ2xvYmFsaW5zdGFuY2UxLCBnbG9iYWxpbnN0YW5jZTIsIGdsb2JhbGluc3RhbmNlMyA9IDMwIH0gR2xvYmFsSW5zdGFuY2U7Cn0KCnN0cnVjdCBJbnN0YW5jZXMgewogIGVudW0geyBtZW1iZXJpbnN0YW5jZTEsIG1lbWJlcmluc3RhbmNlMiwgbWVtYmVyaW5zdGFuY2UzID0gMzAwIH0gTWVtYmVySW5zdGFuY2U7CiAgSW5zdGFuY2VzKCkgOiBNZW1iZXJJbnN0YW5jZShtZW1iZXJpbnN0YW5jZTMpIHt9Cn07CgolfQoKLy8gUmVwZWF0ZWQgdmFsdWVzCiNpZiBkZWZpbmVkKFNXSUdKQVZBKQolamF2YWNvbnN0KDEpOwovLyBuZWVkZWQgZm9yIHR5cGVzYWZlIGFuZCBwcm9wZXIgZW51bXMgb25seQolamF2YWNvbnN0KDApIGlnbm9yZUFfdGhyZWU7CiVqYXZhY29uc3QoMCkgaWdub3JlQV90aGlydGVlbjsKI2VsaWYgZGVmaW5lZChTV0lHQ1NIQVJQKQovLyBuZWVkZWQgZm9yIHR5cGVzYWZlIGVudW1zIG9ubHkKI2lmZGVmIFNXSUdfVEVTVF9OT0NTQ09OU1QKICAlY3Njb25zdCgwKSBpZ25vcmVBX3RocmVlOwogICVjc2NvbnN0KDApIGlnbm9yZUFfdGhpcnRlZW47CiNlbmRpZgolY3Njb25zdCgxKTsKI2VuZGlmCgolaWdub3JlIGlnbm9yZUFfb25lOwolaWdub3JlIGlnbm9yZUFfdHdvOwolaWdub3JlIGlnbm9yZUFfdHdlbHZlOwolaWdub3JlIGlnbm9yZUFfdGhpcnR5X29uZTsKCiVpZ25vcmUgaWdub3JlQl90ZW47CiVpZ25vcmUgaWdub3JlQl90d2VudHk7CiVpZ25vcmUgaWdub3JlQl90aGlydHk7CiVpZ25vcmUgaWdub3JlQl9mb3J0eTsKCiVpZ25vcmUgaWdub3JlQ19lbGV2ZW47CiVpZ25vcmUgaWdub3JlQ190aGlydHlfb25lOwolaWdub3JlIGlnbm9yZUNfZm9ydHlfb25lOwoKJWlnbm9yZSBpZ25vcmVEX3RlbjsKJWlnbm9yZSBpZ25vcmVEX3R3ZW50eTsKCiVpZ25vcmUgaWdub3JlRV90d2VudHk7CgolaW5saW5lICV7CnN0cnVjdCBJZ25vcmVUZXN0IHsKICBlbnVtIElnbm9yZUEgeyBpZ25vcmVBX3plcm8sIGlnbm9yZUFfb25lLCBpZ25vcmVBX3R3bywgaWdub3JlQV90aHJlZSwgaWdub3JlQV90ZW49MTAsIGlnbm9yZUFfZWxldmVuLCBpZ25vcmVBX3R3ZWx2ZSwgaWdub3JlQV90aGlydGVlbiwgaWdub3JlQV9mb3VydGVlbiwgaWdub3JlQV90d2VudHk9MjAsIGlnbm9yZUFfdGhpcnR5PTMwLCBpZ25vcmVBX3RoaXJ0eV9vbmUsIGlnbm9yZUFfdGhpcnR5X3R3bywgaWdub3JlQV90aGlydHlfdGhyZWUgfTsKICBlbnVtIElnbm9yZUIgeyBpZ25vcmVCX3Rlbj0xMCwgaWdub3JlQl9lbGV2ZW4sIGlnbm9yZUJfdHdlbHZlLCBpZ25vcmVCX3R3ZW50eT0yMCwgaWdub3JlQl90aGlydHk9MzAsIGlnbm9yZUJfdGhpcnR5X29uZSwgaWdub3JlQl90aGlydHlfdHdvLCBpZ25vcmVCX2ZvcnR5PTQwLCBpZ25vcmVCX2ZvcnR5X29uZSwgaWdub3JlQl9mb3J0eV90d28gfTsKICBlbnVtIElnbm9yZUMgeyBpZ25vcmVDX3Rlbj0xMCwgaWdub3JlQ19lbGV2ZW4sIGlnbm9yZUNfdHdlbHZlLCBpZ25vcmVDX3R3ZW50eT0yMCwgaWdub3JlQ190aGlydHk9MzAsIGlnbm9yZUNfdGhpcnR5X29uZSwgaWdub3JlQ190aGlydHlfdHdvLCBpZ25vcmVDX2ZvcnR5PTQwLCBpZ25vcmVDX2ZvcnR5X29uZSwgaWdub3JlQ19mb3J0eV90d28gfTsKICBlbnVtIElnbm9yZUQgeyBpZ25vcmVEX3Rlbj0xMCwgaWdub3JlRF90d2VudHk9MjAsIGlnbm9yZURfdHdlbnR5X29uZSwgaWdub3JlRF90d2VudHlfdHdvIH07CiAgZW51bSBJZ25vcmVFIHsgaWdub3JlRV96ZXJvLCBpZ25vcmVFX3R3ZW50eT0yMCwgaWdub3JlRV90d2VudHlfb25lLCBpZ25vcmVFX3R3ZW50eV90d28gfTsKfTsKCklnbm9yZVRlc3Q6Oklnbm9yZUEgaWdub3JlQVRlc3QoSWdub3JlVGVzdDo6SWdub3JlQSBuKSB7IHJldHVybiBuOyB9Cklnbm9yZVRlc3Q6Oklnbm9yZUIgaWdub3JlQlRlc3QoSWdub3JlVGVzdDo6SWdub3JlQiBuKSB7IHJldHVybiBuOyB9Cklnbm9yZVRlc3Q6Oklnbm9yZUMgaWdub3JlQ1Rlc3QoSWdub3JlVGVzdDo6SWdub3JlQyBuKSB7IHJldHVybiBuOyB9Cklnbm9yZVRlc3Q6Oklnbm9yZUQgaWdub3JlRFRlc3QoSWdub3JlVGVzdDo6SWdub3JlRCBuKSB7IHJldHVybiBuOyB9Cklnbm9yZVRlc3Q6Oklnbm9yZUUgaWdub3JlRVRlc3QoSWdub3JlVGVzdDo6SWdub3JlRSBuKSB7IHJldHVybiBuOyB9CiV9CgolaW5saW5lICV7Cm5hbWVzcGFjZSBSZXBlYXRTcGFjZSB7CnR5cGVkZWYgZW51bQp7CiAgIG9uZSA9IDEsCiAgIGluaXRpYWwgPSBvbmUsCiAgIHR3bywKICAgdGhyZWUsCiAgIGxsYXN0ID0gdGhyZWUsCiAgIGVuZCA9IGxsYXN0Cn0gcmVwZWF0OwpyZXBlYXQgcmVwZWF0VGVzdChyZXBlYXQgZSkgeyByZXR1cm4gZTsgfQp9CiV9CgolaW5saW5lICV7Cm5hbWVzcGFjZSBFbnVtV2l0aE1hY3JvIHsKI2RlZmluZSBQQUNLKEMxLEMyLEMzLEM0KSAoKEMxPDwyNCl8KEMyPDwxNil8KEMzPDw4KXxDNCkKdHlwZWRlZiBlbnVtIHsKICBBQkNEID0gUEFDSygnQScsJ0InLCdDJywnRCcpLAogIEFCQ0QyID0gQUJDRAp9IGVudW1XaXRoTWFjcm87CmVudW1XaXRoTWFjcm8gZW51bVdpdGhNYWNyb1Rlc3QoZW51bVdpdGhNYWNybyBlKSB7IHJldHVybiBlOyB9Cn0KJX0KCiVpbmxpbmUgJXsKbmFtZXNwYWNlIERpZmZlcmVudFNwYWNlIHsKZW51bSBEaWZmZXJlbnRUeXBlcyB7CiAgdHlwZWludCA9IDEwLAogIHR5cGVib29sZmFsc2UgPSBmYWxzZSwKICB0eXBlYm9vbHRydWUgPSB0cnVlLAogIHR5cGVib29sdHdvLAogIHR5cGVjaGFyID0gJ0MnLAogIHR5cGVkZWZhdWx0aW50LAogIHR5cGVjaGFyY29tcG91bmQ9J0EnKzEsCiAgdHlwZWNoYXJjb21wb3VuZDI9J0InIDw8IDIKfTsKRGlmZmVyZW50VHlwZXMgZGlmZmVyZW50VHlwZXNUZXN0KERpZmZlcmVudFR5cGVzIG4pIHsgcmV0dXJuIG47IH0KCmVudW0gewogIGdsb2JhbF90eXBlaW50ID0gMTAsCiAgZ2xvYmFsX3R5cGVib29sZmFsc2UgPSBmYWxzZSwKICBnbG9iYWxfdHlwZWJvb2x0cnVlID0gdHJ1ZSwKICBnbG9iYWxfdHlwZWJvb2x0d28sCiAgZ2xvYmFsX3R5cGVjaGFyID0gJ0MnLAogIGdsb2JhbF90eXBlZGVmYXVsdGludCwKICBnbG9iYWxfdHlwZWNoYXJjb21wb3VuZD0nQScrMSwKICBnbG9iYWxfdHlwZWNoYXJjb21wb3VuZDI9J0InIDw8IDIKfTsKaW50IGdsb2JhbERpZmZlcmVudFR5cGVzVGVzdChpbnQgbikgeyByZXR1cm4gbjsgfQp9CiV9CgojaWYgZGVmaW5lZChTV0lHQ1NIQVJQKQolY3Njb25zdHZhbHVlKCIxIikgZ2xvYmFsZW51bWNoYXIxOwolY3Njb25zdHZhbHVlKCInQiciKSBnbG9iYWxlbnVtY2hhckI7CiVjc2NvbnN0dmFsdWUoIjEiKSBlbnVtY2hhcjE7CiVjc2NvbnN0dmFsdWUoIidCJyIpIGVudW1jaGFyQjsKI2VuZGlmCiVpbmxpbmUgJXsKI2lmIGRlZmluZWQoX19jbGFuZ19fKQojcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAovLyBTdXBwcmVzczogaWxsZWdhbCBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gY2hhcmFjdGVyIGxpdGVyYWwKI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XaW52YWxpZC1zb3VyY2UtZW5jb2RpbmciCiNlbmRpZgoKZW51bSB7CiAgZ2xvYmFsZW51bWNoYXIwID0gJ1wwJywKICBnbG9iYWxlbnVtY2hhcjEgPSAnXDEnLAogIGdsb2JhbGVudW1jaGFyMiA9ICdcbicsCiAgZ2xvYmFsZW51bWNoYXJBID0gJ0EnLAogIGdsb2JhbGVudW1jaGFyQiA9ICdcMTAyJywgLy8gQgogIGdsb2JhbGVudW1jaGFyQyA9ICdceDQzJywgLy8gQwogIGdsb2JhbGVudW1jaGFyRCA9IDB4NDQsIC8vIEQKICBnbG9iYWxlbnVtY2hhckUgPSA2OSwgIC8vIEUKICBnbG9iYWxlbnVtY2hhckFFMSA9ICfGJywgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQogIGdsb2JhbGVudW1jaGFyQUUyID0gJ1wzMDYnLCAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgZ2xvYmFsZW51bWNoYXJBRTMgPSAnXHhDNicgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQp9OwplbnVtIEVudW1DaGFyIHsKICBlbnVtY2hhcjAgPSAnXDAnLAogIGVudW1jaGFyMSA9ICdcMScsCiAgZW51bWNoYXIyID0gJ1xuJywKICBlbnVtY2hhckEgPSAnQScsCiAgZW51bWNoYXJCID0gJ1wxMDInLCAvLyBCCiAgZW51bWNoYXJDID0gJ1x4NDMnLCAvLyBDCiAgZW51bWNoYXJEID0gMHg0NCwgLy8gRAogIGVudW1jaGFyRSA9IDY5LCAvLyBFCiAgZW51bWNoYXJBRTEgPSAnxicsIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICBlbnVtY2hhckFFMiA9ICdcMzA2JywgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQogIGVudW1jaGFyQUUzID0gJ1x4QzYnIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKfTsKc3RydWN0IEVudW1DaGFyU3RydWN0IHsKICBlbnVtIEVudW1DaGFyIHsKICAgIGVudW1jaGFyMCA9ICdcMCcsCiAgICBlbnVtY2hhcjEgPSAnXDEnLAogICAgZW51bWNoYXIyID0gJ1xuJywKICAgIGVudW1jaGFyQSA9ICdBJywKICAgIGVudW1jaGFyQiA9ICdcMTAyJywgLy8gQgogICAgZW51bWNoYXJDID0gJ1x4NDMnLCAvLyBDCiAgICBlbnVtY2hhckQgPSAweDQ0LCAvLyBECiAgICBlbnVtY2hhckUgPSA2OSwgLy8gRQogICAgZW51bWNoYXJBRTEgPSAnxicsIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICAgIGVudW1jaGFyQUUyID0gJ1wzMDYnLCAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgICBlbnVtY2hhckFFMyA9ICdceEM2JyAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgfTsKfTsKJX0KCiNpZiBkZWZpbmVkKFNXSUdKQVZBKQolamF2YWNvbnN0KDApOwojZWxpZiBkZWZpbmVkKFNXSUdDU0hBUlApCiVjc2NvbnN0KDApOwojZW5kaWYKCiVpbmxpbmUgJXsKZW51bSB7CiAgeF9nbG9iYWxlbnVtY2hhcjAgPSAnXDAnLAogIHhfZ2xvYmFsZW51bWNoYXIxID0gJ1wxJywKICB4X2dsb2JhbGVudW1jaGFyMiA9ICdcbicsCiAgeF9nbG9iYWxlbnVtY2hhckEgPSAnQScsCiAgeF9nbG9iYWxlbnVtY2hhckIgPSAnXDEwMicsIC8vIEIKICB4X2dsb2JhbGVudW1jaGFyQyA9ICdceDQzJywgLy8gQwogIHhfZ2xvYmFsZW51bWNoYXJEID0gMHg0NCwgLy8gRAogIHhfZ2xvYmFsZW51bWNoYXJFID0gNjksICAvLyBFCiAgeF9nbG9iYWxlbnVtY2hhckFFMSA9ICfGJywgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQogIHhfZ2xvYmFsZW51bWNoYXJBRTIgPSAnXDMwNicsIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICB4X2dsb2JhbGVudW1jaGFyQUUzID0gJ1x4QzYnIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKfTsKZW51bSBYX0VudW1DaGFyIHsKICB4X2VudW1jaGFyMCA9ICdcMCcsCiAgeF9lbnVtY2hhcjEgPSAnXDEnLAogIHhfZW51bWNoYXIyID0gJ1xuJywKICB4X2VudW1jaGFyQSA9ICdBJywKICB4X2VudW1jaGFyQiA9ICdcMTAyJywgLy8gQgogIHhfZW51bWNoYXJDID0gJ1x4NDMnLCAvLyBDCiAgeF9lbnVtY2hhckQgPSAweDQ0LCAvLyBECiAgeF9lbnVtY2hhckUgPSA2OSwgLy8gRQogIHhfZW51bWNoYXJBRTEgPSAnxicsIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICB4X2VudW1jaGFyQUUyID0gJ1wzMDYnLCAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgeF9lbnVtY2hhckFFMyA9ICdceEM2JyAvLyBBRSAobGF0aW4xIGVuY29kZWQpCn07CnN0cnVjdCBYX0VudW1DaGFyU3RydWN0IHsKICBlbnVtIFhfRW51bUNoYXIgewogICAgZW51bWNoYXIwID0gJ1wwJywKICAgIGVudW1jaGFyMSA9ICdcMScsCiAgICBlbnVtY2hhcjIgPSAnXG4nLAogICAgZW51bWNoYXJBID0gJ0EnLAogICAgZW51bWNoYXJCID0gJ1wxMDInLCAvLyBCCiAgICBlbnVtY2hhckMgPSAnXHg0MycsIC8vIEMKICAgIGVudW1jaGFyRCA9IDB4NDQsIC8vIEQKICAgIGVudW1jaGFyRSA9IDY5LCAvLyBFCiAgICBlbnVtY2hhckFFMSA9ICfGJywgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQogICAgZW51bWNoYXJBRTIgPSAnXDMwNicsIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICAgIGVudW1jaGFyQUUzID0gJ1x4QzYnIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICB9Owp9OwojaWYgZGVmaW5lZChfX2NsYW5nX18pCiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKI2VuZGlmCiV9CgolaW5saW5lICV7Cm5hbWVzcGFjZSBEaWZmZXJlbnRTcGFjZSB7CmVudW0gRGlmZmVyZW50VHlwZXNOb0NvbnN0IHsKICB0eXBlaW50X25vY29uc3QgPSAxMCwKICB0eXBlYm9vbGZhbHNlX25vY29uc3QgPSBmYWxzZSwKICB0eXBlYm9vbHRydWVfbm9jb25zdCA9IHRydWUsCiAgdHlwZWJvb2x0d29fbm9jb25zdCwKICB0eXBlY2hhcl9ub2NvbnN0ID0gJ0MnLAogIHR5cGVkZWZhdWx0aW50X25vY29uc3QKfTsKCmVudW0gewogIGdsb2JhbF90eXBlaW50X25vY29uc3QgPSAxMCwKICBnbG9iYWxfdHlwZWJvb2xmYWxzZV9ub2NvbnN0ID0gZmFsc2UsCiAgZ2xvYmFsX3R5cGVib29sdHJ1ZV9ub2NvbnN0ID0gdHJ1ZSwKICBnbG9iYWxfdHlwZWJvb2x0d29fbm9jb25zdCwKICBnbG9iYWxfdHlwZWNoYXJfbm9jb25zdCA9ICdDJywKICBnbG9iYWxfdHlwZWRlZmF1bHRpbnRfbm9jb25zdAp9Owp9CiV9Cg==