LS11c2UKCnVzZSBtYXN0ZXIKZ28KCi0tc2VsZWN0CgpzZWxlY3QgKiBmcm9tIGRiby5pamRiY19mdW5jdGlvbl9lc2NhcGVzCgpzZWxlY3QgKiBmcm9tIG1hc3Rlci5kYm8uc3lzb2JqZWN0cwl3aGVyZSBuYW1lID0gInRlc3QxIgoKLyogZGlzcGxheSB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGNvbmZpZyBwYXJhbWV0ZXIgKi8Kc2VsZWN0ICJQYXJhbWV0ZXIgTmFtZSIgPSBjb252ZXJ0KGNoYXIoMzApLCBuYW1lKSwKCSJEZWZhdWx0IiA9IGNvbnZlcnQoY2hhcigxMSksIHNwYWNlKDExLWNoYXJfbGVuZ3RoKAoJICBjb252ZXJ0KHZhcmNoYXIoMTEpLCBkZWZ2YWx1ZSkpKSArCgkgIGNvbnZlcnQodmFyY2hhcigxMSksIGRlZnZhbHVlKSksCgkiTWVtb3J5IFVzZWQiID0gY29udmVydChjaGFyKDExKSwgc3BhY2UoMTEtY2hhcl9sZW5ndGgoCgkgIGNvbnZlcnQodmFyY2hhcigxMSksIGMuY29tbWVudCkpKSArCgkgIGNvbnZlcnQodmFyY2hhcigxMSksIGMuY29tbWVudCkpLAoJIkNvbmZpZyBWYWx1ZSIgPSBjb252ZXJ0KGNoYXIoMTEpLCBzcGFjZSgxMS1jaGFyX2xlbmd0aCgKIAkgIGlzbnVsbChiLnZhbHVlMiwgY29udmVydChjaGFyKDMyKSwgYi52YWx1ZSkpKSkgKwogCSAgaXNudWxsKGIudmFsdWUyLCBjb252ZXJ0KGNoYXIoMzIpLCBiLnZhbHVlKSkpLAoJIlJ1biBWYWx1ZSIgID0gY29udmVydChjaGFyKDExKSwgc3BhY2UoMTEtY2hhcl9sZW5ndGgoCgkgIGlzbnVsbChjLnZhbHVlMiwgY29udmVydChjaGFyKDMyKSwgYy52YWx1ZSkpKSkgKwoJICBpc251bGwoYy52YWx1ZTIsIGNvbnZlcnQoY2hhcigzMiksIGMudmFsdWUpKSksCgkiVW5pdCIgPSBjb252ZXJ0KGNoYXIoMjApLCBjLnVuaXQpLAoJIlR5cGUiID0gY29udmVydChjaGFyKDEwKSwgYy50eXBlKQpmcm9tIG1hc3Rlci5kYm8uc3lzY29uZmlndXJlcyBiLAoJbWFzdGVyLmRiby5zeXNjdXJjb25maWdzIGMKd2hlcmUgCgliLmNvbmZpZyAqPSBjLmNvbmZpZwoJYW5kIG5hbWUgbGlrZSAiJSIgKyBAY29uZmlnbmFtZSArICIlIgoJYW5kIGIuY29uZmlnICE9IDE5CglhbmQgcGFyZW50ICE9IDE5CgpzZWxlY3QgZGF0ZSwKICAgICAgIHNhbGVzLm9yZF9udW0sCiAgICAgICBxdHksCiAgICAgICBzYWxlc2RldGFpbC50aXRsZV9pZCwKICAgICAgIGRpc2NvdW50LAogICAgICAgcHJpY2UsCiAgICAgICB0b3RhbCA9IHF0eSAqIHByaWNlICogKDEgLSBkaXNjb3VudC8xMDApCmZyb20gc2FsZXMsIHNhbGVzZGV0YWlsLCB0aXRsZXMKd2hlcmUgc2FsZXMuc3Rvcl9pZCA9IEBzdG9yX2lkCmFuZCBzYWxlcy5vcmRfbnVtID0gc2FsZXNkZXRhaWwub3JkX251bQphbmQgdGl0bGVzLnRpdGxlX2lkID0gc2FsZXNkZXRhaWwudGl0bGVfaWQKb3JkZXIgYnkgZGF0ZSBkZXNjLCBzYWxlcy5vcmRfbnVtCgpzZWxlY3QgcHViX2lkLCB0b3RhbCA9IHN1bSAodG90YWxfc2FsZXMpCmludG8gI2FkdmFuY2VfcnB0CmZyb20gdGl0bGVzCndoZXJlIGFkdmFuY2UgPCAkMTAwMDAKYW5kIHRvdGFsX3NhbGVzIGlzIG5vdCBudWxsCmdyb3VwIGJ5IHB1Yl9pZApoYXZpbmcgY291bnQoKikgPiAxCgoKc2VsZWN0IHR5cGUsIHByaWNlLCBhZHZhbmNlIGZyb20gdGl0bGVzCm9yZGVyIGJ5IHR5cGUgZGVzYwpjb21wdXRlIGF2ZyhwcmljZSksIHN1bShhZHZhbmNlKSBieSB0eXBlCmNvbXB1dGUgc3VtKHByaWNlKSwgc3VtKGFkdmFuY2UpCgpzZWxlY3QgYXVfaWQsIHRpdGxlcy50aXRsZV9pZCwgdGl0bGUsIHByaWNlCmZyb20gdGl0bGVhdXRob3IgaW5uZXIgam9pbiB0aXRsZXMKb24gdGl0bGVhdXRob3IudGl0bGVfaWQgPSB0aXRsZXMudGl0bGVfaWQKYW5kIHByaWNlID4gMTUKCgpzZWxlY3QgYXVfZm5hbWUsIGF1X2xuYW1lLCBwdWJfbmFtZQpmcm9tIGF1dGhvcnMgbGVmdCBqb2luIHB1Ymxpc2hlcnMKb24gYXV0aG9ycy5jaXR5ID0gcHVibGlzaGVycy5jaXR5CgoKc2VsZWN0IHggPSBjb252ZXJ0KGRhdGV0aW1lIG51bGwsIGdldGRhdGUoKSkgaW50bwpteXRhYmxlCgoKLS1jb21wb3VuZAoJCmJlZ2luCglzZWxlY3QgKiBmcm9tIG1hc3Rlci5kYm8uc3lzZGF0YWJhc2VzCgkJd2hlcmUgbmFtZSA9ICJwdWJzMiIKZW5kCmdvCgotLWluc2VydAoKaW5zZXJ0IGF1dGhvcnMKdmFsdWVzKCc3MjItNTEtNTQ1NCcsICdEZUZyYW5jZScsICdNaWNoZWwnLAonMjE5IDU0Ny05OTgyJywgJzMgQmFsZGluZyBQbC4nLCAnR2FyeScsICdJTicsICdVU0EnLCAnNDY0MDMnKQoKaW5zZXJ0IGFkdmFuY2VzCnNlbGVjdCBwdWJfaWQsIGlzbnVsbChhZHZhbmNlLCAwKSBmcm9tIHRpdGxlcwoKaW5zZXJ0IHRpdGxlcwoodGl0bGVfaWQsIHRpdGxlLCB0eXBlLCBwdWJfaWQsIG5vdGVzLCBwdWJkYXRlLApjb250cmFjdCkKdmFsdWVzICihr0JVMTIzN6GvLCChr0dldCBHb2luZyGhrywgoa9idXNpbmVzc6GvLAqhrzEzODmhrywgoa9ncmVhdKGvLCChrzA2LzE4Lzg2oa8sIDEpCgppbnNlcnQgbmV3YXV0aG9ycwpzZWxlY3QgKgpmcm9tIGF1dGhvcnMKd2hlcmUgY2l0eSA9ICJTYW4gRnJhbmNpc2NvIgoKCmdvCgotLXVwZGF0ZQoKLyogYWRkIGFsbCB0aGUgbmV3IHZhbHVlcyAqLwovKiB1c2UgaXNudWxsOiAgYSBudWxsIHZhbHVlIGluIHRoZSB0aXRsZXMgdGFibGUgbWVhbnMgCioqICAgICAgICAgICAgICAibm8gc2FsZXMgeWV0IiBub3QgInNhbGVzIHVua25vd24iCiovCnVwZGF0ZSB0aXRsZXMKICAgICAgICBzZXQgdG90YWxfc2FsZXMgPSBpc251bGwodG90YWxfc2FsZXMsIDApICsgKHNlbGVjdCBzdW0ocXR5KQoJCWZyb20gaW5zZXJ0ZWQKCQl3aGVyZSB0aXRsZXMudGl0bGVfaWQgPSBpbnNlcnRlZC50aXRsZV9pZCkKCXdoZXJlIHRpdGxlX2lkIGluIChzZWxlY3QgdGl0bGVfaWQgZnJvbSBpbnNlcnRlZCkKCi8qIHJlbW92ZSBhbGwgdmFsdWVzIGJlaW5nIGRlbGV0ZWQgb3IgdXBkYXRlZCAqLwp1cGRhdGUgdGl0bGVzCiAgICAgICAgc2V0IHRvdGFsX3NhbGVzID0gaXNudWxsKHRvdGFsX3NhbGVzLCAwKSAtIChzZWxlY3Qgc3VtKHF0eSkKCQlmcm9tIGRlbGV0ZWQKCQl3aGVyZSB0aXRsZXMudGl0bGVfaWQgPSBkZWxldGVkLnRpdGxlX2lkKQoJd2hlcmUgdGl0bGVfaWQgaW4gKHNlbGVjdCB0aXRsZV9pZCBmcm9tIGRlbGV0ZWQpCgp1cGRhdGUgdGl0bGVzIHNldCB0b3RhbF9zYWxlcyA9IHRvdGFsX3NhbGVzICsKKHNlbGVjdCBpc251bGwoc3VtKHF0eSksMCkKZnJvbSBzYWxlc2RldGFpbCBzZAp3aGVyZSB0LnRpdGxlX2lkID0gc2QudGl0bGVfaWQpCmZyb20gdGl0bGVzIHQKCgoKLS1kZWxldGUKCmRlbGV0ZSBhdXRob3JzCgpkZWxldGUgZnJvbSBhdXRob3JzCndoZXJlIGF1X2xuYW1lID0gIk1jQmFkZGVuIgoKZGVsZXRlIHRpdGxlcwpmcm9tIHRpdGxlcywgYXV0aG9ycywgdGl0bGVhdXRob3IKd2hlcmUgYXV0aG9ycy5hdV9sbmFtZSA9IKGvQmVubmV0oa8KYW5kIGF1dGhvcnMuYXVfaWQgPSB0aXRsZWF1dGhvci5hdV9pZAphbmQgdGl0bGVhdXRob3IudGl0bGVfaWQgPSB0aXRsZXMudGl0bGVfaWQKCmRlbGV0ZSB0aXRsZXMgd2hlcmUgY3VycmVudCBvZiB0aXRsZV9jcnNyCgoKLS1pZiwgcHJpbnQKCmlmIChAcGFydGl0aW9uX251bWJlciA8PSAwKSBPUgoJKEBwYXJ0aXRpb25fbnVtYmVyID4gNjQpCmJlZ2luCglzZWxlY3QgQGNhY2hlX3BhcnRfdGVtcCA9IDIKCXByaW50IEBtc2csICBAZnVsbGNvbmZpZ25hbWUKZW5kCgppZiBleGlzdHMgKHNlbGVjdCBwb3N0YWxjb2RlIGZyb20gYXV0aG9ycwp3aGVyZSBwb3N0YWxjb2RlID0gIjk0NzA1IikKcHJpbnQgIkJlcmtlbGV5IGF1dGhvciIKCmlmIChzZWxlY3QgbWF4KGlkKSBmcm9tIHN5c29iamVjdHMpIDwgMTAwCnByaW50ICJObyB1c2VyLWNyZWF0ZWQgb2JqZWN0cyBpbiB0aGlzIGRhdGFiYXNlIgplbHNlCmJlZ2luCnByaW50ICJUaGVzZSBhcmUgdGhlIHVzZXItY3JlYXRlZCBvYmplY3RzIgpzZWxlY3QgbmFtZSwgdHlwZSwgaWQKZnJvbSBzeXNvYmplY3RzCndoZXJlIGlkID4gMTAwCmVuZAoK