ZGlmZiAtLWdpdCBhL09ETC5weSBiL09ETC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQ0YzY3Ci0tLSAvZGV2L251bGwKKysrIGIvT0RMLnB5CkBAIC0wLDAgKzEsNTEwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogdXRmLTggLSotCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKycnJworSW1wbGVtZW50IHRoZSBwbHVnZ2luZyBmb3IgT3BlbmRheUxpZ2h0IG9wZW5mbG93IGNvbnRyb2xsZXIKK0l0IGNyZWF0ZXMgdGhlIGNsYXNzIE9GX2Nvbm4gdG8gY3JlYXRlIGRhdGFwbGFuZSBjb25uZWN0aW9ucword2l0aCBzdGF0aWMgcnVsZXMgYmFzZWQgb24gcGFja2V0IGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisnJycKKworX19hdXRob3JfXz0iUGFibG8gTW9udGVzLCBBbGZvbnNvIFRpZXJubyIKK19fZGF0ZV9fID0iJDI4LW9jdC0yMDE0IDEyOjA3OjE1JCIKKworCitpbXBvcnQganNvbgoraW1wb3J0IHJlcXVlc3RzCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgbG9nZ2luZworCitjbGFzcyBPRl9jb25uKCk6CisgICAgJycnT3BlbkRheUxpZ2h0IGNvbm5lY3Rvci4gTm8gTUFDIGxlYXJuaW5nIGlzIHVzZWQnJycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyYW1zKToKKyAgICAgICAgJycnIENvbnN0cnVjdG9yLiAKKyAgICAgICAgICAgIFBhcmFtczogZGljdGlvbmFyeSB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKKyAgICAgICAgICAgICAgICBvZl9kcGlkOiAgICAgRFBJRCB0byB1c2UgZm9yIHRoaXMgY29udHJvbGxlcgorICAgICAgICAgICAgICAgIG9mX2lwOiAgICAgICBjb250cm9sbGVyIElQIGFkZHJlc3MKKyAgICAgICAgICAgICAgICBvZl9wb3J0OiAgICAgY29udHJvbGxlciBUQ1AgcG9ydAorICAgICAgICAgICAgICAgIG9mX3VzZXI6ICAgICB1c2VyIGNyZWRlbnRpYWxzLCBjYW4gYmUgbWlzc2luZyBvciBOb25lCisgICAgICAgICAgICAgICAgb2ZfcGFzc3dvcmQ6IHBhc3N3b3JkIGNyZWRlbnRpYWxzCisgICAgICAgICAgICAgICAgb2ZfZGVidWc6ICAgIGRlYnVnIGxldmVsIGZvciBsb2dnaW5nLiBEZWZhdWx0IHRvIEVSUk9SCisgICAgICAgICAgICAgICAgb3RoZXIga2V5cyBhcmUgaWdub3JlZAorICAgICAgICAgICAgUmFpc2UgYW4gZXhjZXB0aW9uIGlmIHNhbWUgcGFyYW1ldGVyIGlzIG1pc3Npbmcgb3Igd3JvbmcKKyAgICAgICAgJycnCisgICAgICAgICNjaGVjayBwYXJhbXMKKyAgICAgICAgaWYgIm9mX2lwIiBub3QgaW4gcGFyYW1zIG9yIHBhcmFtc1sib2ZfaXAiXT09Tm9uZSBvciAib2ZfcG9ydCIgbm90IGluIHBhcmFtcyBvciBwYXJhbXNbIm9mX3BvcnQiXT09Tm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIklQIGFkZHJlc3MgYW5kIHBvcnQgbXVzdCBiZSBwcm92aWRlZCIpCisgICAgICAgICNpbnRlcm5hbCB2YXJpYWJsZXMKKyAgICAgICAgc2VsZi5uYW1lID0gIk9wZW5EYXlMaWdodCIKKyAgICAgICAgc2VsZi5oZWFkZXJzID0geydjb250ZW50LXR5cGUnOidhcHBsaWNhdGlvbi9qc29uJywgCisgICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0JzonYXBwbGljYXRpb24vanNvbicKKyAgICAgICAgfQorICAgICAgICBzZWxmLmF1dGg9Tm9uZQorICAgICAgICBzZWxmLnBwMm9maT17fSAgIyBGcm9tIFBoeXNpY2FsIFBvcnQgdG8gT3BlbkZsb3cgSW5kZXgKKyAgICAgICAgc2VsZi5vZmkycHA9e30gICMgRnJvbSBPcGVuRmxvdyBJbmRleCB0byBQaHlzaWNhbCBQb3J0CisKKyAgICAgICAgc2VsZi5kcGlkID0gc3RyKHBhcmFtc1sib2ZfZHBpZCJdKQorICAgICAgICBzZWxmLmlkID0gJ29wZW5mbG93Oicrc3RyKGludChzZWxmLmRwaWQucmVwbGFjZSgnOicsICcnKSwgMTYpKQorICAgICAgICBzZWxmLnVybCA9ICJodHRwOi8vJXM6JXMiICUoIHN0cihwYXJhbXNbIm9mX2lwIl0pLCBzdHIocGFyYW1zWyJvZl9wb3J0Il0gKSApCisgICAgICAgIGlmICJvZl91c2VyIiBpbiBwYXJhbXMgYW5kIHBhcmFtc1sib2ZfdXNlciJdIT1Ob25lOgorICAgICAgICAgICAgaWYgbm90IHBhcmFtcy5nZXQoIm9mX3Bhc3N3b3JkIik6CisgICAgICAgICAgICAgICAgb2ZfcGFzc3dvcmQ9IiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2ZfcGFzc3dvcmQ9c3RyKHBhcmFtc1sib2ZfcGFzc3dvcmQiXSkKKyAgICAgICAgICAgIHNlbGYuYXV0aCA9IGJhc2U2NC5iNjRlbmNvZGUoc3RyKHBhcmFtc1sib2ZfdXNlciJdKSsiOiIrb2ZfcGFzc3dvcmQpCisgICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9ICdCYXNpYyAnK3NlbGYuYXV0aAorICAgICAgICAgICAgCisKKyAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigndmltLk9GLk9ETCcpCisgICAgICAgIHNlbGYubG9nZ2VyLnNldExldmVsKCBnZXRhdHRyKGxvZ2dpbmcsIHBhcmFtcy5nZXQoIm9mX2RlYnVnIiwgIkVSUk9SIikpICkKKworICAgIGRlZiBnZXRfb2Zfc3dpdGNoZXMoc2VsZik6CisgICAgICAgICcnJyBPYnRhaW4gYSBhIGxpc3Qgb2Ygc3dpdGNoZXMgb3IgRFBJRCBkZXRlY3RlZCBieSB0aGlzIGNvbnRyb2xsZXIKKyAgICAgICAgICAgIFJldHVybgorICAgICAgICAgICAgICAgID49MCwgbGlzdDogICAgICBsaXN0IGxlbmd0aCwgYW5kIGEgbGlzdCB3aGVyZSBlYWNoIGVsZW1lbnQgYSB0dXBsZSBwYWlyIChEUElELCBJUCBhZGRyZXNzKQorICAgICAgICAgICAgICAgIDwwLCB0ZXh0X2Vycm9yOiBpZiBmYWlscworICAgICAgICAnJycgIAorICAgICAgICB0cnk6CisgICAgICAgICAgICBvZl9yZXNwb25zZSA9IHJlcXVlc3RzLmdldChzZWxmLnVybCsiL3Jlc3Rjb25mL29wZXJhdGlvbmFsL29wZW5kYXlsaWdodC1pbnZlbnRvcnk6bm9kZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1zZWxmLmhlYWRlcnMpCisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gIk9wZW5mbG93IHJlc3BvbnNlICVkOiAlcyIgJSAob2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIG9mX3Jlc3BvbnNlLnRleHQpCisgICAgICAgICAgICBpZiBvZl9yZXNwb25zZS5zdGF0dXNfY29kZSAhPSAyMDA6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIud2FybmluZygiZ2V0X29mX3N3aXRjaGVzICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMSAsIGVycm9yX3RleHQKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJnZXRfb2Zfc3dpdGNoZXMgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICBpbmZvID0gb2ZfcmVzcG9uc2UuanNvbigpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIHR5cGUoaW5mbykgIT0gZGljdDoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiZ2V0X29mX3N3aXRjaGVzLiBVbmV4cGVjdGVkIHJlc3BvbnNlLCBub3QgYSBkaWN0OiAlcyIsIHN0cihpbmZvKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJVbmV4cGVjdGVkIHJlc3BvbnNlLCBub3QgYSBkaWN0LiBXcm9uZyB2ZXJzaW9uPyIKKworICAgICAgICAgICAgbm9kZXMgPSBpbmZvLmdldCgnbm9kZXMnKQorICAgICAgICAgICAgaWYgdHlwZShub2RlcykgaXMgbm90IGRpY3Q6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoImdldF9vZl9zd2l0Y2hlcy4gVW5leHBlY3RlZCByZXNwb25zZSBhdCAnbm9kZXMnLCBub3QgZm91bmQgb3Igbm90IGEgZGljdDogJXMiLCBzdHIodHlwZShpbmZvKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAiVW5leHBlY3RlZCByZXNwb25zZSBhdCAnbm9kZXMnLCBub3QgZm91bmQgb3Igbm90IGEgZGljdC4gV3JvbmcgdmVyc2lvbj8iCisKKyAgICAgICAgICAgIG5vZGVfbGlzdCA9IG5vZGVzLmdldCgnbm9kZScpCisgICAgICAgICAgICBpZiB0eXBlKG5vZGVfbGlzdCkgaXMgbm90IGxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoImdldF9vZl9zd2l0Y2hlcy4gVW5leHBlY3RlZCByZXNwb25zZSwgYXQgJ25vZGVzJzonbm9kZScsIG5vdCBmb3VuZCBvciBub3QgYSBsaXN0OiAlcyIsIHN0cih0eXBlKG5vZGVfbGlzdCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMSwgIlVuZXhwZWN0ZWQgcmVzcG9uc2UsIGF0ICdub2Rlcyc6J25vZGUnLCBub3QgZm91bmQgb3Igbm90IGEgbGlzdC4gV3JvbmcgdmVyc2lvbj8iCisKKyAgICAgICAgICAgIHN3aXRjaF9saXN0PVtdCisgICAgICAgICAgICBmb3Igbm9kZSBpbiBub2RlX2xpc3Q6CisgICAgICAgICAgICAgICAgbm9kZV9pZCA9IG5vZGUuZ2V0KCdpZCcpCisgICAgICAgICAgICAgICAgaWYgbm9kZV9pZCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiZ2V0X29mX3N3aXRjaGVzLiBVbmV4cGVjdGVkIHJlc3BvbnNlIGF0ICdub2Rlcyc6J25vZGUnW106J2lkJywgbm90IGZvdW5kOiAlcyIsIHN0cihub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAiVW5leHBlY3RlZCByZXNwb25zZSBhdCAnbm9kZXMnOidub2RlJ1tdOidpZCcsIG5vdCBmb3VuZCAuIFdyb25nIHZlcnNpb24/IgorCisgICAgICAgICAgICAgICAgaWYgbm9kZV9pZCA9PSAnY29udHJvbGxlci1jb25maWcnOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgbm9kZV9pcF9hZGRyZXNzID0gbm9kZS5nZXQoJ2Zsb3ctbm9kZS1pbnZlbnRvcnk6aXAtYWRkcmVzcycpCisgICAgICAgICAgICAgICAgaWYgbm9kZV9pcF9hZGRyZXNzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJnZXRfb2Zfc3dpdGNoZXMuIFVuZXhwZWN0ZWQgcmVzcG9uc2UgYXQgJ25vZGVzJzonbm9kZSdbXTonZmxvdy1ub2RlLWludmVudG9yeTppcC1hZGRyZXNzJywgbm90IGZvdW5kOiAlcyIsIHN0cihub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAiVW5leHBlY3RlZCByZXNwb25zZSBhdCAnbm9kZXMnOidub2RlJ1tdOidmbG93LW5vZGUtaW52ZW50b3J5OmlwLWFkZHJlc3MnLCBub3QgZm91bmQuIFdyb25nIHZlcnNpb24/IgorCisgICAgICAgICAgICAgICAgbm9kZV9pZF9oZXg9aGV4KGludChub2RlX2lkLnNwbGl0KCc6JylbMV0pKS5zcGxpdCgneCcpWzFdLnpmaWxsKDE2KQorICAgICAgICAgICAgICAgIHN3aXRjaF9saXN0LmFwcGVuZCggKCc6Jy5qb2luKGErYiBmb3IgYSxiIGluIHppcChub2RlX2lkX2hleFs6OjJdLCBub2RlX2lkX2hleFsxOjoyXSkpLCBub2RlX2lwX2FkZHJlc3MpKQorCisgICAgICAgICAgICByZXR1cm4gbGVuKHN3aXRjaF9saXN0KSwgc3dpdGNoX2xpc3QKKyAgICAgICAgZXhjZXB0IChyZXF1ZXN0cy5leGNlcHRpb25zLlJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAjVmFsdWVFcnJvciBpbiB0aGUgY2FzZSB0aGF0IEpTT04gY2FuIG5vdCBiZSBkZWNvZGVkCisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gdHlwZShlKS5fX25hbWVfXyArICI6ICIgKyBzdHIoZSkKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJnZXRfb2Zfc3dpdGNoZXMgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX3RleHQKKyAgICAgICAgCisgICAgZGVmIG9idGFpbl9wb3J0X2NvcnJlc3BvbmRlbmNlKHNlbGYpOgorICAgICAgICAnJydPYnRhaW4gdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gcGh5c2ljYWwgYW5kIG9wZW5mbG93IHBvcnQgbmFtZXMKKyAgICAgICAgcmV0dXJuOgorICAgICAgICAgICAgIDAsIGRpY3Rpb25hcnk6IHdpdGggcGh5c2ljYWwgbmFtZSBhcyBrZXksIG9wZW5mbG93IG5hbWUgYXMgdmFsdWUKKyAgICAgICAgICAgIC0xLCBlcnJvcl90ZXh0OiBpZiBmYWlscworICAgICAgICAnJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2ZfcmVzcG9uc2UgPSByZXF1ZXN0cy5nZXQoc2VsZi51cmwrIi9yZXN0Y29uZi9vcGVyYXRpb25hbC9vcGVuZGF5bGlnaHQtaW52ZW50b3J5Om5vZGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9c2VsZi5oZWFkZXJzKQorICAgICAgICAgICAgZXJyb3JfdGV4dCA9ICJPcGVuZmxvdyByZXNwb25zZSAlZDogJXMiICUgKG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlLCBvZl9yZXNwb25zZS50ZXh0KQorICAgICAgICAgICAgaWYgb2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUgIT0gMjAwOgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcoIm9idGFpbl9wb3J0X2NvcnJlc3BvbmRlbmNlICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMSAsIGVycm9yX3RleHQKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJvYnRhaW5fcG9ydF9jb3JyZXNwb25kZW5jZSAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIGluZm8gPSBvZl9yZXNwb25zZS5qc29uKCkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgdHlwZShpbmZvKSAhPSBkaWN0OgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJvYnRhaW5fcG9ydF9jb3JyZXNwb25kZW5jZS4gVW5leHBlY3RlZCByZXNwb25zZSBub3QgYSBkaWN0OiAlcyIsIHN0cihpbmZvKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJVbmV4cGVjdGVkIG9wZW5mbG93IHJlc3BvbnNlLCBub3QgYSBkaWN0LiBXcm9uZyB2ZXJzaW9uPyIKKworICAgICAgICAgICAgbm9kZXMgPSBpbmZvLmdldCgnbm9kZXMnKQorICAgICAgICAgICAgaWYgdHlwZShub2RlcykgaXMgbm90IGRpY3Q6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoIm9idGFpbl9wb3J0X2NvcnJlc3BvbmRlbmNlLiBVbmV4cGVjdGVkIHJlc3BvbnNlIGF0ICdub2RlcycsIG5vdCBmb3VuZCBvciBub3QgYSBkaWN0OiAlcyIsIHN0cih0eXBlKG5vZGVzKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAiVW5leHBlY3RlZCByZXNwb25zZSBhdCAnbm9kZXMnLG5vdCBmb3VuZCBvciBub3QgYSBkaWN0LiBXcm9uZyB2ZXJzaW9uPyIKKworICAgICAgICAgICAgbm9kZV9saXN0ID0gbm9kZXMuZ2V0KCdub2RlJykKKyAgICAgICAgICAgIGlmIHR5cGUobm9kZV9saXN0KSBpcyBub3QgbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigib2J0YWluX3BvcnRfY29ycmVzcG9uZGVuY2UuIFVuZXhwZWN0ZWQgcmVzcG9uc2UsIGF0ICdub2Rlcyc6J25vZGUnLCBub3QgZm91bmQgb3Igbm90IGEgbGlzdDogJXMiLCBzdHIodHlwZShub2RlX2xpc3QpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJVbmV4cGVjdGVkIHJlc3BvbnNlLCBhdCAnbm9kZXMnOidub2RlJywgbm90IGZvdW5kIG9yIG5vdCBhIGxpc3QuIFdyb25nIHZlcnNpb24/IgorCisgICAgICAgICAgICBmb3Igbm9kZSBpbiBub2RlX2xpc3Q6CisgICAgICAgICAgICAgICAgbm9kZV9pZCA9IG5vZGUuZ2V0KCdpZCcpCisgICAgICAgICAgICAgICAgaWYgbm9kZV9pZCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigib2J0YWluX3BvcnRfY29ycmVzcG9uZGVuY2UuIFVuZXhwZWN0ZWQgcmVzcG9uc2UgYXQgJ25vZGVzJzonbm9kZSdbXTonaWQnLCBub3QgZm91bmQ6ICVzIiwgc3RyKG5vZGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJVbmV4cGVjdGVkIHJlc3BvbnNlIGF0ICdub2Rlcyc6J25vZGUnW106J2lkJywgbm90IGZvdW5kIC4gV3JvbmcgdmVyc2lvbj8iCisKKyAgICAgICAgICAgICAgICBpZiBub2RlX2lkID09ICdjb250cm9sbGVyLWNvbmZpZyc6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyB0aGUgYXBwcm9wcmlhdGUgc3dpdGNoLiBUaGUgJ2lkJyBpcyAnb3BlbmZsb3c6JyBwbHVzIHRoZSBkZWNpbWFsIHZhbHVlCisgICAgICAgICAgICAgICAgIyBvZiB0aGUgZHBpZAorICAgICAgICAgICAgICAgICMgIEluIGNhc2UgdGhpcyBpcyBub3QgdGhlIGRlc2lyZWQgc3dpdGNoLCBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHNlbGYuaWQgIT0gbm9kZV9pZDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIG5vZGVfY29ubmVjdG9yX2xpc3QgPSBub2RlLmdldCgnbm9kZS1jb25uZWN0b3InKQorICAgICAgICAgICAgICAgIGlmIHR5cGUobm9kZV9jb25uZWN0b3JfbGlzdCkgaXMgbm90IGxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJvYnRhaW5fcG9ydF9jb3JyZXNwb25kZW5jZS4gVW5leHBlY3RlZCByZXNwb25zZSBhdCAnbm9kZXMnOidub2RlJ1tdOidub2RlLWNvbm5lY3RvcicsIG5vdCBmb3VuZCBvciBub3QgYSBsaXN0OiAlcyIsIHN0cihub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAiVW5leHBlY3RlZCByZXNwb25zZSBhdCAnbm9kZXMnOidub2RlJ1tdOidub2RlLWNvbm5lY3RvcicsIG5vdCBmb3VuZCAgb3Igbm90IGEgbGlzdC4gV3JvbmcgdmVyc2lvbj8iCisKKyAgICAgICAgICAgICAgICBmb3Igbm9kZV9jb25uZWN0b3IgaW4gbm9kZV9jb25uZWN0b3JfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcDJvZmlbIHN0cihub2RlX2Nvbm5lY3RvclsnZmxvdy1ub2RlLWludmVudG9yeTpuYW1lJ10pIF0gPSBzdHIobm9kZV9jb25uZWN0b3JbJ2lkJ10gKQorICAgICAgICAgICAgICAgICAgICBzZWxmLm9maTJwcFsgbm9kZV9jb25uZWN0b3JbJ2lkJ10gXSA9ICBzdHIobm9kZV9jb25uZWN0b3JbJ2Zsb3ctbm9kZS1pbnZlbnRvcnk6bmFtZSddKQorCisKKyAgICAgICAgICAgICAgICBub2RlX2lwX2FkZHJlc3MgPSBub2RlLmdldCgnZmxvdy1ub2RlLWludmVudG9yeTppcC1hZGRyZXNzJykKKyAgICAgICAgICAgICAgICBpZiBub2RlX2lwX2FkZHJlc3MgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoIm9idGFpbl9wb3J0X2NvcnJlc3BvbmRlbmNlLiBVbmV4cGVjdGVkIHJlc3BvbnNlIGF0ICdub2Rlcyc6J25vZGUnW106J2Zsb3ctbm9kZS1pbnZlbnRvcnk6aXAtYWRkcmVzcycsIG5vdCBmb3VuZDogJXMiLCBzdHIobm9kZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSwgIlVuZXhwZWN0ZWQgcmVzcG9uc2UgYXQgJ25vZGVzJzonbm9kZSdbXTonZmxvdy1ub2RlLWludmVudG9yeTppcC1hZGRyZXNzJywgbm90IGZvdW5kLiBXcm9uZyB2ZXJzaW9uPyIKKyAgICAgICAgICAgICAgICBzZWxmLmlwX2FkZHJlc3MgPSBub2RlX2lwX2FkZHJlc3MKKworICAgICAgICAgICAgICAgICNJZiB3ZSBmb3VuZCB0aGUgYXBwcm9wcmlhdGUgZHBpZCBubyBuZWVkIHRvIGNvbnRpbnVlIGluIHRoZSBmb3IgbG9vcAorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICNwcmludCBzZWxmLm5hbWUsICI6IG9idGFpbl9wb3J0X2NvcnJlc3BvbmRlbmNlIHBvcnRzOiIsIHNlbGYucHAyb2ZpCisgICAgICAgICAgICByZXR1cm4gMCwgc2VsZi5wcDJvZmkKKyAgICAgICAgZXhjZXB0IChyZXF1ZXN0cy5leGNlcHRpb25zLlJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAjVmFsdWVFcnJvciBpbiB0aGUgY2FzZSB0aGF0IEpTT04gY2FuIG5vdCBiZSBkZWNvZGVkCisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gdHlwZShlKS5fX25hbWVfXyArICI6ICIgKyBzdHIoZSkKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJvYnRhaW5fcG9ydF9jb3JyZXNwb25kZW5jZSAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dAorICAgICAgICAKKyAgICBkZWYgZ2V0X29mX3J1bGVzKHNlbGYsIHRyYW5zbGF0ZV9vZl9wb3J0cz1UcnVlKToKKyAgICAgICAgJycnIE9idGFpbiB0aGUgcnVsZXMgaW5zZXJ0ZWQgYXQgb3BlbmZsb3cgY29udHJvbGxlcgorICAgICAgICAgICAgUGFyYW1zOgorICAgICAgICAgICAgICAgIHRyYW5zbGF0ZV9vZl9wb3J0czogaWYgVHJ1ZSBpdCB0cmFuc2xhdGVzIHBvcnRzIGZyb20gb3BlbmZsb3cgaW5kZXggdG8gcGh5c2ljYWwgc3dpdGNoIG5hbWUKKyAgICAgICAgICAgIFJldHVybjoKKyAgICAgICAgICAgICAgICAwLCBkaWN0IGlmIG9rOiB3aXRoIHRoZSBydWxlIG5hbWUgYXMga2V5IGFuZCB2YWx1ZSBpcyBhbm90aGVyIGRpY3Rpb25hcnkgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnQ6CisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBydWxlIHByaW9yaXR5CisgICAgICAgICAgICAgICAgICAgIG5hbWU6ICAgICAgICAgcnVsZSBuYW1lIChwcmVzZW50IGFsc28gYXMgdGhlIG1hc3RlciBkaWN0IGtleSkKKyAgICAgICAgICAgICAgICAgICAgaW5ncmVzc19wb3J0OiBtYXRjaCBpbnB1dCBwb3J0IG9mIHRoZSBydWxlCisgICAgICAgICAgICAgICAgICAgIGRzdF9tYWM6ICAgICAgbWF0Y2ggZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIHJ1bGUsIGNhbiBiZSBtaXNzaW5nIG9yIE5vbmUgaWYgbm90IGFwcGx5CisgICAgICAgICAgICAgICAgICAgIHZsYW5faWQ6ICAgICAgbWF0Y2ggdmxhbiB0YWcgb2YgdGhlIHJ1bGUsIGNhbiBiZSBtaXNzaW5nIG9yIE5vbmUgaWYgbm90IGFwcGx5CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6ICAgICAgbGlzdCBvZiBhY3Rpb25zLCBjb21wb3NlZCBieSBhIHBhaXIgdHVwbGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgKHZsYW4sIE5vbmUvaW50KTogZm9yIHN0cmlwcGluZy9zZXR0aW5nIGEgdmxhbiB0YWcKKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXQsIHBvcnQpOiAgICAgIHNlbmQgdG8gdGhpcyBwb3J0IAorICAgICAgICAgICAgICAgICAgICBzd2l0Y2g6ICAgICAgIERQSUQsIGFsbCAKKyAgICAgICAgICAgICAgICAtMSwgdGV4dF9lcnJvciBpZiBmYWlscworICAgICAgICAnJycgICAKKyAgICAgICAgCisgICAgICAgIGlmIGxlbihzZWxmLm9maTJwcCkgPT0gMDoKKyAgICAgICAgICAgIHIsYyA9IHNlbGYub2J0YWluX3BvcnRfY29ycmVzcG9uZGVuY2UoKQorICAgICAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgICAgIHJldHVybiByLGMKKyAgICAgICAgI2dldCBydWxlcworICAgICAgICB0cnk6CisgICAgICAgICAgICBvZl9yZXNwb25zZSA9IHJlcXVlc3RzLmdldChzZWxmLnVybCsiL3Jlc3Rjb25mL2NvbmZpZy9vcGVuZGF5bGlnaHQtaW52ZW50b3J5Om5vZGVzL25vZGUvIiArIHNlbGYuaWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi90YWJsZS8wIiwgaGVhZGVycz1zZWxmLmhlYWRlcnMpCisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gIk9wZW5mbG93IHJlc3BvbnNlICVkOiAlcyIgJSAob2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIG9mX3Jlc3BvbnNlLnRleHQpCisKKyAgICAgICAgICAgICMgVGhlIGNvbmZpZ3VyZWQgcGFnZSBkb2VzIG5vdCBleGlzdCBpZiB0aGVyZSBhcmUgbm8gcnVsZXMgaW5zdGFsbGVkLiBJbiB0aGF0IGNhc2Ugd2UgcmV0dXJuIGFuIGVtcHR5IGRpY3QKKyAgICAgICAgICAgIGlmIG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlID09IDQwNDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMCwge30KKworICAgICAgICAgICAgZWxpZiBvZl9yZXNwb25zZS5zdGF0dXNfY29kZSAhPSAyMDA6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIud2FybmluZygiZ2V0X29mX3J1bGVzICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMSAsIGVycm9yX3RleHQKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJnZXRfb2ZfcnVsZXMgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8gPSBvZl9yZXNwb25zZS5qc29uKCkKKworICAgICAgICAgICAgaWYgdHlwZShpbmZvKSAhPSBkaWN0OgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJnZXRfb2ZfcnVsZXMuIFVuZXhwZWN0ZWQgcmVzcG9uc2Ugbm90IGEgZGljdDogJXMiLCBzdHIoaW5mbykpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAiVW5leHBlY3RlZCBvcGVuZmxvdyByZXNwb25zZSwgbm90IGEgZGljdC4gV3JvbmcgdmVyc2lvbj8iCisKKyAgICAgICAgICAgIHRhYmxlID0gaW5mby5nZXQoJ2Zsb3ctbm9kZS1pbnZlbnRvcnk6dGFibGUnKQorICAgICAgICAgICAgaWYgdHlwZSh0YWJsZSkgaXMgbm90IGxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoImdldF9vZl9ydWxlcy4gVW5leHBlY3RlZCByZXNwb25zZSBhdCAnZmxvdy1ub2RlLWludmVudG9yeTp0YWJsZScsIG5vdCBhIGxpc3Q6ICVzIiwgc3RyKHR5cGUodGFibGUpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJVbmV4cGVjdGVkIHJlc3BvbnNlIGF0ICdmbG93LW5vZGUtaW52ZW50b3J5OnRhYmxlJywgbm90IGEgbGlzdC4gV3JvbmcgdmVyc2lvbj8iCisKKyAgICAgICAgICAgIGZsb3dfbGlzdCA9IHRhYmxlWzBdLmdldCgnZmxvdycpCisgICAgICAgICAgICBpZiBmbG93X2xpc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMCwge30KKworICAgICAgICAgICAgaWYgdHlwZShmbG93X2xpc3QpIGlzIG5vdCBsaXN0OgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJnZXRfb2ZfcnVsZXMuIFVuZXhwZWN0ZWQgcmVzcG9uc2UgYXQgJ2Zsb3ctbm9kZS1pbnZlbnRvcnk6dGFibGUnWzBdOidmbG93Jywgbm90IGEgbGlzdDogJXMiLCBzdHIodHlwZShmbG93X2xpc3QpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJVbmV4cGVjdGVkIHJlc3BvbnNlIGF0ICdmbG93LW5vZGUtaW52ZW50b3J5OnRhYmxlJ1swXTonZmxvdycsIG5vdCBhIGxpc3QuIFdyb25nIHZlcnNpb24/IgorCisgICAgICAgICAgICAjVE9ETyB0cmFuc2xhdGUgcG9ydHMgYWNjb3JkaW5nIHRvIHRyYW5zbGF0ZV9vZl9wb3J0cyBwYXJhbWV0ZXIKKworICAgICAgICAgICAgcnVsZXMgPSBkaWN0KCkKKyAgICAgICAgICAgIGZvciBmbG93IGluIGZsb3dfbGlzdDoKKyAgICAgICAgICAgICAgICBpZiBub3QgKCdpZCcgaW4gZmxvdyBhbmQgJ21hdGNoJyBpbiBmbG93IGFuZCAnaW5zdHJ1Y3Rpb25zJyBpbiBmbG93IGFuZCBcCisgICAgICAgICAgICAgICAgICAgJ2luc3RydWN0aW9uJyBpbiBmbG93WydpbnN0cnVjdGlvbnMnXSBhbmQgJ2FwcGx5LWFjdGlvbnMnIGluIGZsb3dbJ2luc3RydWN0aW9ucyddWydpbnN0cnVjdGlvbiddWzBdIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICdhY3Rpb24nIGluIGZsb3dbJ2luc3RydWN0aW9ucyddWydpbnN0cnVjdGlvbiddWzBdWydhcHBseS1hY3Rpb25zJ10pOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAidW5leHBlY3RlZCBvcGVuZmxvdyByZXNwb25zZSwgb25lIG9yIG1vcmUgZWxlbWVudHMgYXJlIG1pc3NpbmcuIFdyb25nIHZlcnNpb24/IgorCisgICAgICAgICAgICAgICAgZmxvd1snaW5zdHJ1Y3Rpb25zJ11bJ2luc3RydWN0aW9uJ11bMF1bJ2FwcGx5LWFjdGlvbnMnXVsnYWN0aW9uJ10KKworICAgICAgICAgICAgICAgIHJ1bGUgPSBkaWN0KCkKKyAgICAgICAgICAgICAgICBydWxlWydzd2l0Y2gnXSA9IHNlbGYuZHBpZAorICAgICAgICAgICAgICAgIHJ1bGVbJ3ByaW9yaXR5J10gPSBmbG93LmdldCgncHJpb3JpdHknKQorICAgICAgICAgICAgICAgICNydWxlWyduYW1lJ10gPSBmbG93WydpZCddCisgICAgICAgICAgICAgICAgI3J1bGVbJ2Nvb2tpZSddID0gZmxvd1snY29va2llJ10KKyAgICAgICAgICAgICAgICBpZiAnaW4tcG9ydCcgaW4gZmxvd1snbWF0Y2gnXToKKyAgICAgICAgICAgICAgICAgICAgaW5fcG9ydCA9IGZsb3dbJ21hdGNoJ11bJ2luLXBvcnQnXQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaW5fcG9ydCBpbiBzZWxmLm9maTJwcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSwgIkVycm9yOiBJbmdyZXNzIHBvcnQgIitpbl9wb3J0KyIgaXMgbm90IGluIHN3aXRjaCBwb3J0IGxpc3QiCisKKyAgICAgICAgICAgICAgICAgICAgaWYgdHJhbnNsYXRlX29mX3BvcnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5fcG9ydCA9IHNlbGYub2ZpMnBwW2luX3BvcnRdCisKKyAgICAgICAgICAgICAgICAgICAgcnVsZVsnaW5ncmVzc19wb3J0J10gPSBpbl9wb3J0CisKKyAgICAgICAgICAgICAgICAgICAgaWYgJ3ZsYW4tbWF0Y2gnIGluIGZsb3dbJ21hdGNoJ10gYW5kICd2bGFuLWlkJyBpbiBmbG93WydtYXRjaCddWyd2bGFuLW1hdGNoJ10gYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZsYW4taWQnIGluIGZsb3dbJ21hdGNoJ11bJ3ZsYW4tbWF0Y2gnXVsndmxhbi1pZCddIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2bGFuLWlkLXByZXNlbnQnIGluIGZsb3dbJ21hdGNoJ11bJ3ZsYW4tbWF0Y2gnXVsndmxhbi1pZCddIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dbJ21hdGNoJ11bJ3ZsYW4tbWF0Y2gnXVsndmxhbi1pZCddWyd2bGFuLWlkLXByZXNlbnQnXSA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgcnVsZVsndmxhbl9pZCddID0gZmxvd1snbWF0Y2gnXVsndmxhbi1tYXRjaCddWyd2bGFuLWlkJ11bJ3ZsYW4taWQnXQorCisgICAgICAgICAgICAgICAgICAgIGlmICdldGhlcm5ldC1tYXRjaCcgaW4gZmxvd1snbWF0Y2gnXSBhbmQgJ2V0aGVybmV0LWRlc3RpbmF0aW9uJyBpbiBmbG93WydtYXRjaCddWydldGhlcm5ldC1tYXRjaCddIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgaW4gZmxvd1snbWF0Y2gnXVsnZXRoZXJuZXQtbWF0Y2gnXVsnZXRoZXJuZXQtZGVzdGluYXRpb24nXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVbJ2RzdF9tYWMnXSA9IGZsb3dbJ21hdGNoJ11bJ2V0aGVybmV0LW1hdGNoJ11bJ2V0aGVybmV0LWRlc3RpbmF0aW9uJ11bJ2FkZHJlc3MnXQorCisgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zPWZsb3dbJ2luc3RydWN0aW9ucyddWydpbnN0cnVjdGlvbiddWzBdWydhcHBseS1hY3Rpb25zJ11bJ2FjdGlvbiddCisKKyAgICAgICAgICAgICAgICBtYXhfaW5kZXg9MAorICAgICAgICAgICAgICAgIGZvciBpbnN0cnVjdGlvbiBpbiBpbnN0cnVjdGlvbnM6CisgICAgICAgICAgICAgICAgICAgIGlmIGluc3RydWN0aW9uWydvcmRlciddID4gbWF4X2luZGV4OgorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2luZGV4ID0gaW5zdHJ1Y3Rpb25bJ29yZGVyJ10KKworICAgICAgICAgICAgICAgIGFjdGlvbnM9W05vbmVdKihtYXhfaW5kZXgrMSkKKyAgICAgICAgICAgICAgICBmb3IgaW5zdHJ1Y3Rpb24gaW4gaW5zdHJ1Y3Rpb25zOgorICAgICAgICAgICAgICAgICAgICBpZiAnb3V0cHV0LWFjdGlvbicgaW4gaW5zdHJ1Y3Rpb246CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgJ291dHB1dC1ub2RlLWNvbm5lY3RvcicgaW4gaW5zdHJ1Y3Rpb25bJ291dHB1dC1hY3Rpb24nXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJ1bmV4cGVjdGVkIG9wZW5mbG93IHJlc3BvbnNlLCBvbmUgb3IgbW9yZSBlbGVtZW50YSBhcmUgbWlzc2luZy4gV3JvbmcgdmVyc2lvbj8iCisKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wb3J0ID0gaW5zdHJ1Y3Rpb25bJ291dHB1dC1hY3Rpb24nXVsnb3V0cHV0LW5vZGUtY29ubmVjdG9yJ10KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvdXRfcG9ydCBpbiBzZWxmLm9maTJwcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJFcnJvcjogT3V0cHV0IHBvcnQgIitvdXRfcG9ydCsiIGlzIG5vdCBpbiBzd2l0Y2ggcG9ydCBsaXN0IgorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cmFuc2xhdGVfb2ZfcG9ydHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3BvcnQgPSBzZWxmLm9maTJwcFtvdXRfcG9ydF0KKworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uc1tpbnN0cnVjdGlvblsnb3JkZXInXV0gPSAoJ291dCcsb3V0X3BvcnQpCisKKyAgICAgICAgICAgICAgICAgICAgZWxpZiAnc3RyaXAtdmxhbi1hY3Rpb24nIGluIGluc3RydWN0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uc1tpbnN0cnVjdGlvblsnb3JkZXInXV0gPSAoJ3ZsYW4nLCBOb25lKQorCisgICAgICAgICAgICAgICAgICAgIGVsaWYgJ3NldC1maWVsZCcgaW4gaW5zdHJ1Y3Rpb246CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgKCd2bGFuLW1hdGNoJyBpbiBpbnN0cnVjdGlvblsnc2V0LWZpZWxkJ10gYW5kICd2bGFuLWlkJyBpbiAgaW5zdHJ1Y3Rpb25bJ3NldC1maWVsZCddWyd2bGFuLW1hdGNoJ10gYW5kICd2bGFuLWlkJyBpbiBpbnN0cnVjdGlvblsnc2V0LWZpZWxkJ11bJ3ZsYW4tbWF0Y2gnXVsndmxhbi1pZCddKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJ1bmV4cGVjdGVkIG9wZW5mbG93IHJlc3BvbnNlLCBvbmUgb3IgbW9yZSBlbGVtZW50cyBhcmUgbWlzc2luZy4gV3JvbmcgdmVyc2lvbj8iCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaW5zdHJ1Y3Rpb25bJ29yZGVyJ11dID0gKCd2bGFuJywgaW5zdHJ1Y3Rpb25bJ3NldC1maWVsZCddWyd2bGFuLW1hdGNoJ11bJ3ZsYW4taWQnXVsndmxhbi1pZCddKQorCisgICAgICAgICAgICAgICAgYWN0aW9ucyA9IFt4IGZvciB4IGluIGFjdGlvbnMgaWYgeCAhPSBOb25lXQorCisgICAgICAgICAgICAgICAgcnVsZVsnYWN0aW9ucyddID0gbGlzdChhY3Rpb25zKQorICAgICAgICAgICAgICAgIHJ1bGVzW2Zsb3dbJ2lkJ11dID0gZGljdChydWxlKQorCisgICAgICAgICAgICAgICAgI2Zsb3dbJ2lkJ10KKyAgICAgICAgICAgICAgICAjZmxvd1sncHJpb3JpdHknXQorICAgICAgICAgICAgICAgICNmbG93Wydjb29raWUnXQorICAgICAgICAgICAgICAgICNmbG93WydtYXRjaCddWydpbi1wb3J0J10KKyAgICAgICAgICAgICAgICAjZmxvd1snbWF0Y2gnXVsndmxhbi1tYXRjaCddWyd2bGFuLWlkJ11bJ3ZsYW4taWQnXQorICAgICAgICAgICAgICAgICMgbWF0Y2ggLT4gaW4tcG9ydAorICAgICAgICAgICAgICAgICMgICAgICAtPiB2bGFuLW1hdGNoIC0+IHZsYW4taWQgLT4gdmxhbi1pZAorICAgICAgICAgICAgICAgICNmbG93WydtYXRjaCddWyd2bGFuLW1hdGNoJ11bJ3ZsYW4taWQnXVsndmxhbi1pZC1wcmVzZW50J10KKyAgICAgICAgICAgICAgICAjVE9ETyBzZSBhc3VtZSBxdWUgbm8gc2UgdXNhbiByZWdsYXMgY29uIHZsYW4taWQtcHJlc2VudDpmYWxzZQorICAgICAgICAgICAgICAgICNpbnN0cnVjdGlvbnMgLT4gaW5zdHJ1Y3Rpb24gLT4gYXBwbHktYWN0aW9ucyAtPiBhY3Rpb24KKyAgICAgICAgICAgICAgICAjaW5zdHJ1Y3Rpb25zPWZsb3dbJ2luc3RydWN0aW9ucyddWydpbnN0cnVjdGlvbiddWzBdWydhcHBseS1hY3Rpb25zJ11bJ2FjdGlvbiddCisgICAgICAgICAgICAgICAgI0VzIHVuYSBsaXN0YS4gUG9zaWJsZXMgZWxlbWVudG9zOgorICAgICAgICAgICAgICAgICNtYXhfaW5kZXg9MAorICAgICAgICAgICAgICAgICNmb3IgaW5zdHJ1Y3Rpb24gaW4gaW5zdHJ1Y3Rpb25zOgorICAgICAgICAgICAgICAgICMgIGlmIGluc3RydWN0aW9uWydvcmRlciddID4gbWF4X2luZGV4OgorICAgICAgICAgICAgICAgICMgICAgbWF4X2luZGV4ID0gaW5zdHJ1Y3Rpb25bJ29yZGVyJ10KKyAgICAgICAgICAgICAgICAjYWN0aW9ucz1bTm9uZV0qKG1heF9pbmRleCsxKQorICAgICAgICAgICAgICAgICNmb3IgaW5zdHJ1Y3Rpb24gaW4gaW5zdHJ1Y3Rpb25zOgorICAgICAgICAgICAgICAgICMgICBpZiAnb3V0cHV0LWFjdGlvbicgaW4gaW5zdHJ1Y3Rpb246CisgICAgICAgICAgICAgICAgIyAgICAgYWN0aW9uc1tpbnN0cnVjdGlvblsnb3JkZXInXV0gPSAoJ291dCcsaW5zdHJ1Y3Rpb25bJ291dHB1dC1hY3Rpb24nXVsnb3V0cHV0LW5vZGUtY29ubmVjdG9yJ10pCisgICAgICAgICAgICAgICAgIyAgIGVsaWYgJ3N0cmlwLXZsYW4tYWN0aW9uJyBpbiBpbnN0cnVjdGlvbjoKKyAgICAgICAgICAgICAgICAjICAgICBhY3Rpb25zW2luc3RydWN0aW9uWydvcmRlciddXSA9ICgndmxhbicsIE5vbmUpCisgICAgICAgICAgICAgICAgIyAgIGVsaWYgJ3NldC1maWVsZCcgaW4gaW5zdHJ1Y3Rpb246CisgICAgICAgICAgICAgICAgIyAgICAgYWN0aW9uc1tpbnN0cnVjdGlvblsnb3JkZXInXV0gPSAoJ3ZsYW4nLCBpbnN0cnVjdGlvblsnc2V0LWZpZWxkJ11bJ3ZsYW4tbWF0Y2gnXVsndmxhbi1pZCddWyd2bGFuLWlkJ10pCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICNhY3Rpb25zID0gW3ggZm9yIHggaW4gYWN0aW9ucyBpZiB4ICE9IE5vbmVdCisgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBvdXRwdXQtYWN0aW9uIC0+IG91dHB1dC1ub2RlLWNvbm5lY3RvcgorICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gcG9wLXZsYW4tYWN0aW9uCisKKyAgICAgICAgICAgIHJldHVybiAwLCBydWxlcworICAgICAgICBleGNlcHQgKHJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVxdWVzdEV4Y2VwdGlvbiwgVmFsdWVFcnJvcikgYXMgZToKKyAgICAgICAgICAgICNWYWx1ZUVycm9yIGluIHRoZSBjYXNlIHRoYXQgSlNPTiBjYW4gbm90IGJlIGRlY29kZWQKKyAgICAgICAgICAgIGVycm9yX3RleHQgPSB0eXBlKGUpLl9fbmFtZV9fICsgIjogIiArIHN0cihlKQorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoImdldF9vZl9ydWxlcyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dAorICAgICAgICAgICAgCisgICAgZGVmIGRlbF9mbG93KHNlbGYsIGZsb3dfbmFtZSk6CisgICAgICAgICcnJyBEZWxldGUgYW4gZXhpc3RpbmcgcnVsZQorICAgICAgICAgICAgUGFyYW1zOiBmbG93X25hbWUsIHRoaXMgaXMgdGhlIHJ1bGUgbmFtZQorICAgICAgICAgICAgUmV0dXJuCisgICAgICAgICAgICAgICAgMCwgTm9uZSBpZiBvaworICAgICAgICAgICAgICAgIC0xLCB0ZXh0X2Vycm9yIGlmIGZhaWxzCisgICAgICAgICcnJyAgICAgICAgICAgCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9mX3Jlc3BvbnNlID0gcmVxdWVzdHMuZGVsZXRlKHNlbGYudXJsKyIvcmVzdGNvbmYvY29uZmlnL29wZW5kYXlsaWdodC1pbnZlbnRvcnk6bm9kZXMvbm9kZS8iICsgc2VsZi5pZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3RhYmxlLzAvZmxvdy8iK2Zsb3dfbmFtZSwgaGVhZGVycz1zZWxmLmhlYWRlcnMpCisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gIk9wZW5mbG93IHJlc3BvbnNlICVkOiAlcyIgJSAob2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIG9mX3Jlc3BvbnNlLnRleHQpCisgICAgICAgICAgICBpZiBvZl9yZXNwb25zZS5zdGF0dXNfY29kZSAhPSAyMDA6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIud2FybmluZygiZGVsX2Zsb3cgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xICwgZXJyb3JfdGV4dAorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoImRlbF9mbG93IE9LICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgcmV0dXJuIDAsIE5vbmUKKworICAgICAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gdHlwZShlKS5fX25hbWVfXyArICI6ICIgKyBzdHIoZSkKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJkZWxfZmxvdyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dAorCisgICAgZGVmIG5ld19mbG93KHNlbGYsIGRhdGEpOgorICAgICAgICAnJycgSW5zZXJ0IGEgbmV3IHN0YXRpYyBydWxlCisgICAgICAgICAgICBQYXJhbXM6IGRhdGE6IGRpY3Rpb25hcnkgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnQ6CisgICAgICAgICAgICAgICAgcHJpb3JpdHk6ICAgICBydWxlIHByaW9yaXR5CisgICAgICAgICAgICAgICAgbmFtZTogICAgICAgICBydWxlIG5hbWUKKyAgICAgICAgICAgICAgICBpbmdyZXNzX3BvcnQ6IG1hdGNoIGlucHV0IHBvcnQgb2YgdGhlIHJ1bGUKKyAgICAgICAgICAgICAgICBkc3RfbWFjOiAgICAgIG1hdGNoIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBydWxlLCBtaXNzaW5nIG9yIE5vbmUgaWYgbm90IGFwcGx5CisgICAgICAgICAgICAgICAgdmxhbl9pZDogICAgICBtYXRjaCB2bGFuIHRhZyBvZiB0aGUgcnVsZSwgbWlzc2luZyBvciBOb25lIGlmIG5vdCBhcHBseQorICAgICAgICAgICAgICAgIGFjdGlvbnM6ICAgICAgbGlzdCBvZiBhY3Rpb25zLCBjb21wb3NlZCBieSBhIHBhaXIgdHVwbGVzIHdpdGggdGhlc2UgcG9zaWJpbGl0aWVzOgorICAgICAgICAgICAgICAgICAgICAoJ3ZsYW4nLCBOb25lL2ludCk6IGZvciBzdHJpcHBpbmcvc2V0dGluZyBhIHZsYW4gdGFnCisgICAgICAgICAgICAgICAgICAgICgnb3V0JywgcG9ydCk6ICAgICAgc2VuZCB0byB0aGlzIHBvcnQKKyAgICAgICAgICAgIFJldHVybgorICAgICAgICAgICAgICAgIDAsIE5vbmUgaWYgb2sKKyAgICAgICAgICAgICAgICAtMSwgdGV4dF9lcnJvciBpZiBmYWlscworICAgICAgICAnJycgICAKKyAgICAgICAgaWYgbGVuKHNlbGYucHAyb2ZpKSA9PSAwOgorICAgICAgICAgICAgcixjID0gc2VsZi5vYnRhaW5fcG9ydF9jb3JyZXNwb25kZW5jZSgpCisgICAgICAgICAgICBpZiByPDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHIsYworICAgICAgICB0cnk6CisgICAgICAgICAgICAjV2UgaGF2ZSB0byBidWlsZCB0aGUgZGF0YSBmb3IgdGhlIG9wZW5kYXlsaWdodCBjYWxsIGZyb20gdGhlIGdlbmVyaWMgZGF0YQorICAgICAgICAgICAgc2RhdGEgPSBkaWN0KCkKKyAgICAgICAgICAgIHNkYXRhWydmbG93LW5vZGUtaW52ZW50b3J5OmZsb3cnXSA9IGxpc3QoKQorICAgICAgICAgICAgc2RhdGFbJ2Zsb3ctbm9kZS1pbnZlbnRvcnk6ZmxvdyddLmFwcGVuZChkaWN0KCkpCisgICAgICAgICAgICBmbG93ID0gc2RhdGFbJ2Zsb3ctbm9kZS1pbnZlbnRvcnk6ZmxvdyddWzBdCisgICAgICAgICAgICBmbG93WydpZCddID0gZGF0YVsnbmFtZSddCisgICAgICAgICAgICBmbG93WydmbG93LW5hbWUnXSA9IGRhdGFbJ25hbWUnXQorICAgICAgICAgICAgZmxvd1snaWRsZS10aW1lb3V0J10gPSAwCisgICAgICAgICAgICBmbG93WydoYXJkLXRpbWVvdXQnXSA9IDAKKyAgICAgICAgICAgIGZsb3dbJ3RhYmxlX2lkJ10gPSAwCisgICAgICAgICAgICBmbG93Wydwcmlvcml0eSddID0gZGF0YS5nZXQoJ3ByaW9yaXR5JykKKyAgICAgICAgICAgIGZsb3dbJ21hdGNoJ10gPSBkaWN0KCkKKyAgICAgICAgICAgIGlmIG5vdCBkYXRhWydpbmdyZXNzX3BvcnQnXSBpbiBzZWxmLnBwMm9maToKKyAgICAgICAgICAgICAgICBlcnJvcl90ZXh0ID0gJ0Vycm9yLiBQb3J0ICcrZGF0YVsnaW5ncmVzc19wb3J0J10rJyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3dpdGNoJworICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcoIm5ld19mbG93ICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dAorICAgICAgICAgICAgZmxvd1snbWF0Y2gnXVsnaW4tcG9ydCddID0gc2VsZi5wcDJvZmlbZGF0YVsnaW5ncmVzc19wb3J0J11dCisgICAgICAgICAgICBpZiAnZHN0X21hYycgaW4gZGF0YToKKyAgICAgICAgICAgICAgICBmbG93WydtYXRjaCddWydldGhlcm5ldC1tYXRjaCddID0gZGljdCgpCisgICAgICAgICAgICAgICAgZmxvd1snbWF0Y2gnXVsnZXRoZXJuZXQtbWF0Y2gnXVsnZXRoZXJuZXQtZGVzdGluYXRpb24nXSA9IGRpY3QoKQorICAgICAgICAgICAgICAgIGZsb3dbJ21hdGNoJ11bJ2V0aGVybmV0LW1hdGNoJ11bJ2V0aGVybmV0LWRlc3RpbmF0aW9uJ11bJ2FkZHJlc3MnXSA9IGRhdGFbJ2RzdF9tYWMnXQorICAgICAgICAgICAgaWYgZGF0YS5nZXQoJ3ZsYW5faWQnKToKKyAgICAgICAgICAgICAgICBmbG93WydtYXRjaCddWyd2bGFuLW1hdGNoJ10gPSBkaWN0KCkKKyAgICAgICAgICAgICAgICBmbG93WydtYXRjaCddWyd2bGFuLW1hdGNoJ11bJ3ZsYW4taWQnXSA9IGRpY3QoKQorICAgICAgICAgICAgICAgIGZsb3dbJ21hdGNoJ11bJ3ZsYW4tbWF0Y2gnXVsndmxhbi1pZCddWyd2bGFuLWlkLXByZXNlbnQnXSA9IFRydWUKKyAgICAgICAgICAgICAgICBmbG93WydtYXRjaCddWyd2bGFuLW1hdGNoJ11bJ3ZsYW4taWQnXVsndmxhbi1pZCddID0gaW50KGRhdGFbJ3ZsYW5faWQnXSkKKyAgICAgICAgICAgIGZsb3dbJ2luc3RydWN0aW9ucyddID0gZGljdCgpCisgICAgICAgICAgICBmbG93WydpbnN0cnVjdGlvbnMnXVsnaW5zdHJ1Y3Rpb24nXSA9IGxpc3QoKQorICAgICAgICAgICAgZmxvd1snaW5zdHJ1Y3Rpb25zJ11bJ2luc3RydWN0aW9uJ10uYXBwZW5kKGRpY3QoKSkKKyAgICAgICAgICAgIGZsb3dbJ2luc3RydWN0aW9ucyddWydpbnN0cnVjdGlvbiddWzBdWydvcmRlciddID0gMQorICAgICAgICAgICAgZmxvd1snaW5zdHJ1Y3Rpb25zJ11bJ2luc3RydWN0aW9uJ11bMF1bJ2FwcGx5LWFjdGlvbnMnXSA9IGRpY3QoKQorICAgICAgICAgICAgZmxvd1snaW5zdHJ1Y3Rpb25zJ11bJ2luc3RydWN0aW9uJ11bMF1bJ2FwcGx5LWFjdGlvbnMnXVsnYWN0aW9uJ10gPSBsaXN0KCkKKyAgICAgICAgICAgIGFjdGlvbnMgPSBmbG93WydpbnN0cnVjdGlvbnMnXVsnaW5zdHJ1Y3Rpb24nXVswXVsnYXBwbHktYWN0aW9ucyddWydhY3Rpb24nXQorCisgICAgICAgICAgICBvcmRlciA9IDAKKyAgICAgICAgICAgIGZvciBhY3Rpb24gaW4gZGF0YVsnYWN0aW9ucyddOgorICAgICAgICAgICAgICAgIG5ld19hY3Rpb24gPSB7ICdvcmRlcic6IG9yZGVyIH0KKyAgICAgICAgICAgICAgICBpZiAgYWN0aW9uWzBdID09ICJ2bGFuIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYWN0aW9uWzFdID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAjc3RyaXAgdmxhbgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FjdGlvblsnc3RyaXAtdmxhbi1hY3Rpb24nXSA9IGRpY3QoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FjdGlvblsnc2V0LWZpZWxkJ10gPSBkaWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hY3Rpb25bJ3NldC1maWVsZCddWyd2bGFuLW1hdGNoJ10gPSBkaWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hY3Rpb25bJ3NldC1maWVsZCddWyd2bGFuLW1hdGNoJ11bJ3ZsYW4taWQnXSA9IGRpY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FjdGlvblsnc2V0LWZpZWxkJ11bJ3ZsYW4tbWF0Y2gnXVsndmxhbi1pZCddWyd2bGFuLWlkLXByZXNlbnQnXSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hY3Rpb25bJ3NldC1maWVsZCddWyd2bGFuLW1hdGNoJ11bJ3ZsYW4taWQnXVsndmxhbi1pZCddID0gaW50KGFjdGlvblsxXSkKKyAgICAgICAgICAgICAgICBlbGlmIGFjdGlvblswXSA9PSAnb3V0JzoKKyAgICAgICAgICAgICAgICAgICAgbmV3X2FjdGlvblsnb3V0cHV0LWFjdGlvbiddID0gZGljdCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBhY3Rpb25bMV0gaW4gc2VsZi5wcDJvZmk6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tc2ogPSAnUG9ydCAnK2FjdGlvblsxXSsnIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzd2l0Y2gnCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX21zagorCisgICAgICAgICAgICAgICAgICAgIG5ld19hY3Rpb25bJ291dHB1dC1hY3Rpb24nXVsnb3V0cHV0LW5vZGUtY29ubmVjdG9yJ10gPSBzZWxmLnBwMm9maVsgYWN0aW9uWzFdIF0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcl9tc2ogPSAiVW5rbm93biBpdGVtICclcycgaW4gYWN0aW9uIGxpc3QiICUgYWN0aW9uWzBdCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJuZXdfZmxvdyAiICsgZXJyb3JfbXNqKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX21zagorCisgICAgICAgICAgICAgICAgYWN0aW9ucy5hcHBlbmQobmV3X2FjdGlvbikKKyAgICAgICAgICAgICAgICBvcmRlciArPSAxCisKKyAgICAgICAgICAgICNwcmludCBqc29uLmR1bXBzKHNkYXRhKQorICAgICAgICAgICAgb2ZfcmVzcG9uc2UgPSByZXF1ZXN0cy5wdXQoc2VsZi51cmwrIi9yZXN0Y29uZi9jb25maWcvb3BlbmRheWxpZ2h0LWludmVudG9yeTpub2Rlcy9ub2RlLyIgKyBzZWxmLmlkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi90YWJsZS8wL2Zsb3cvIiArIGRhdGFbJ25hbWUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1zZWxmLmhlYWRlcnMsIGRhdGE9anNvbi5kdW1wcyhzZGF0YSkgKQorICAgICAgICAgICAgZXJyb3JfdGV4dCA9ICJPcGVuZmxvdyByZXNwb25zZSAlZDogJXMiICUgKG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlLCBvZl9yZXNwb25zZS50ZXh0KQorICAgICAgICAgICAgaWYgb2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUgIT0gMjAwOgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcoIm5ld19mbG93ICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMSAsIGVycm9yX3RleHQKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJuZXdfZmxvdyBPSyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiAwLCBOb25lCisKKyAgICAgICAgZXhjZXB0IHJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVxdWVzdEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgZXJyb3JfdGV4dCA9IHR5cGUoZSkuX19uYW1lX18gKyAiOiAiICsgc3RyKGUpCisgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigibmV3X2Zsb3cgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX3RleHQKKworICAgIGRlZiBjbGVhcl9hbGxfZmxvd3Moc2VsZik6CisgICAgICAgICcnJyBEZWxldGUgYWxsIGV4aXN0aW5nIHJ1bGVzCisgICAgICAgICAgICBSZXR1cm46CisgICAgICAgICAgICAgICAgMCwgTm9uZSBpZiBvaworICAgICAgICAgICAgICAgIC0xLCB0ZXh0X2Vycm9yIGlmIGZhaWxzCisgICAgICAgICcnJyAgICAgICAgICAgCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9mX3Jlc3BvbnNlID0gcmVxdWVzdHMuZGVsZXRlKHNlbGYudXJsKyIvcmVzdGNvbmYvY29uZmlnL29wZW5kYXlsaWdodC1pbnZlbnRvcnk6bm9kZXMvbm9kZS8iICsgc2VsZi5pZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvdGFibGUvMCIsIGhlYWRlcnM9c2VsZi5oZWFkZXJzKQorICAgICAgICAgICAgZXJyb3JfdGV4dCA9ICJPcGVuZmxvdyByZXNwb25zZSAlZDogJXMiICUgKG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlLCBvZl9yZXNwb25zZS50ZXh0KQorICAgICAgICAgICAgaWYgb2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUgIT0gMjAwIGFuZCBvZl9yZXNwb25zZS5zdGF0dXNfY29kZSAhPSA0MDQ6ICNIVFRQX05vdF9Gb3VuZAorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcoImNsZWFyX2FsbF9mbG93cyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEgLCBlcnJvcl90ZXh0CisgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygiY2xlYXJfYWxsX2Zsb3dzIE9LICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgcmV0dXJuIDAsIE5vbmUKKyAgICAgICAgZXhjZXB0IHJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVxdWVzdEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgZXJyb3JfdGV4dCA9IHR5cGUoZSkuX19uYW1lX18gKyAiOiAiICsgc3RyKGUpCisgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiY2xlYXJfYWxsX2Zsb3dzICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgcmV0dXJuIC0xLCBlcnJvcl90ZXh0CmRpZmYgLS1naXQgYS9jaGFybS9SRUFETUUubWQgYi9jaGFybS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkODAzZgotLS0gL2Rldi9udWxsCisrKyBiL2NoYXJtL1JFQURNRS5tZApAQCAtMCwwICsxLDQ1IEBACisjIEp1anUgQ2hhcm1zIGZvciBkZXBsb3lpbmcgT3BlblZJTQorCisjIyBPdmVydmlldworVGhlc2UgYXJlIHRoZSBjaGFybSBsYXllcnMgdXNlZCB0byBidWlsZCBKdWp1IGNoYXJtcyBmb3IgZGVwbG95aW5nIE9wZW5WSU0gY29tcG9uZW50cy4gVGhlc2UgY2hhcm1zIGFyZSBhbHNvIHB1Ymxpc2hlZCB0byB0aGUgW0p1anUgQ2hhcm0gU3RvcmVdKGh0dHBzOi8vanVqdWNoYXJtcy5jb20vKSBhbmQgY2FuIGJlIGRlcGxveWVkIGRpcmVjdGx5IGZyb20gdGhlcmUgdXNpbmcgdGhlIFtldHNpLW9zbV0oaHR0cHM6Ly9qdWp1Y2hhcm1zLmNvbS91L25mdi9ldHNpLW9zbSksIG9yIHRoZXkgY2FuIGJlIGJ1aWxkIGZyb20gdGhlc2UgbGF5ZXJzIGFuZCBkZXBsb3llZCBsb2NhbGx5LgorCisjIyBCdWlsZGluZyB0aGUgT3BlblZJTSBDaGFybXMKKworVG8gYnVpbGQgdGhlc2UgY2hhcm1zLCB5b3Ugd2lsbCBuZWVkIFtjaGFybS10b29sc11bXS4gWW91IHNob3VsZCBhbHNvIHJlYWQKK292ZXIgdGhlIGRldmVsb3BlciBbR2V0dGluZyBTdGFydGVkXVtdIHBhZ2UgZm9yIGFuIG92ZXJ2aWV3IG9mIGNoYXJtcyBhbmQKK2J1aWxkaW5nIHRoZW0uIFRoZW4sIGluIGFueSBvZiB0aGUgY2hhcm0gbGF5ZXIgZGlyZWN0b3JpZXMsIHVzZSBgY2hhcm0gYnVpbGRgLgorRm9yIGV4YW1wbGU6CisKKyAgICBleHBvcnQgSlVKVV9SRVBPU0lUT1JZPSRIT01FL2NoYXJtcworICAgIG1rZGlyICRIT01FL2NoYXJtcworCisgICAgY2Qgb3BlbnZpbS9jaGFybXMvaGFkb29wL2xheWVyLW9wZW52aW0KKyAgICBjaGFybSBidWlsZAorCitUaGlzIHdpbGwgYnVpbGQgdGhlIE9wZW5WSU0gY29udHJvbGxlciBjaGFybSwgcHVsbGluZyBpbiB0aGUgYXBwcm9wcmlhdGUgYmFzZSBhbmQKK2ludGVyZmFjZSBsYXllcnMgZnJvbSBbaW50ZXJmYWNlcy5qdWp1LnNvbHV0aW9uc11bXS4gWW91IGNhbiBnZXQgbG9jYWwgY29waWVzCitvZiB0aG9zZSBsYXllcnMgYXMgd2VsbCB1c2luZyBgY2hhcm0gcHVsbC1zb3VyY2VgOgorCisgICAgZXhwb3J0IExBWUVSX1BBVEg9JEhPTUUvbGF5ZXJzCisgICAgZXhwb3J0IElOVEVSRkFDRV9QQVRIPSRIT01FL2ludGVyZmFjZXMKKyAgICBta2RpciAkSE9NRS97bGF5ZXJzLGludGVyZmFjZXN9CisKKyAgICBjaGFybSBwdWxsLXNvdXJjZSBsYXllcjpvcGVudmltLWNvbXB1dGUKKyAgICBjaGFybSBwdWxsLXNvdXJjZSBpbnRlcmZhY2U6b3BlbnZpbS1jb21wdXRlCisKK1lvdSBjYW4gdGhlbiBkZXBsb3kgdGhlIGxvY2FsbHkgYnVpbHQgY2hhcm1zIGluZGl2aWR1YWxseToKKworICAgIGp1anUgZGVwbG95IGxvY2FsOmV4ZW5pYWwvb3BlbnZpbQorCitZb3UgY2FuIGFsc28gdXNlIHRoZSBsb2NhbCB2ZXJzaW9uIG9mIGEgYnVuZGxlOgorCisgICAganVqdSBkZXBsb3kgb3BlbnZpbS9jaGFybXMvYnVuZGxlcy9vcGVubWFuby55YW1sCisKKz4gTm90ZTogV2l0aCBKdWp1IHZlcnNpb25zIDwgMi4wLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBbanVqdS1kZXBsb3llcl1bXSB0bworZGVwbG95IHRoZSBsb2NhbCBidW5kbGUuCisKKworW2NoYXJtLXRvb2xzXTogaHR0cHM6Ly9qdWp1Y2hhcm1zLmNvbS9kb2NzL3N0YWJsZS90b29scy1jaGFybS10b29scworW0dldHRpbmcgU3RhcnRlZF06IGh0dHBzOi8vanVqdWNoYXJtcy5jb20vZG9jcy9kZXZlbC9kZXZlbG9wZXItZ2V0dGluZy1zdGFydGVkCitbaW50ZXJmYWNlcy5qdWp1LnNvbHV0aW9uc106IGh0dHA6Ly9pbnRlcmZhY2VzLmp1anUuc29sdXRpb25zLworW2p1anUtZGVwbG95ZXJdOiBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL2p1anUtZGVwbG95ZXIvCmRpZmYgLS1naXQgYS9jaGFybS9idW5kbGVzL29wZW5tYW5vLnlhbWwgYi9jaGFybS9idW5kbGVzL29wZW5tYW5vLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlMDlhNgotLS0gL2Rldi9udWxsCisrKyBiL2NoYXJtL2J1bmRsZXMvb3Blbm1hbm8ueWFtbApAQCAtMCwwICsxLDU2IEBACitzZXJpZXM6IHhlbmlhbAorc2VydmljZXM6CisgIG1hcmlhZGI6CisgICAgY2hhcm06ICJjczp0cnVzdHkvbWFyaWFkYi0zIgorICAgIG51bV91bml0czogMQorICAgIGFubm90YXRpb25zOgorICAgICAgImd1aS14IjogIjUzOSIKKyAgICAgICJndWkteSI6ICI0OTQuNzA1MDgwNzU2ODg3NyIKKyAgICB0bzoKKyAgICAgIC0gIjAiCisgIG9wZW5tYW5vOgorICAgIGNoYXJtOiAiY3M6fm5mdi9vcGVubWFuby0zIgorICAgIG51bV91bml0czogMQorICAgIGFubm90YXRpb25zOgorICAgICAgImd1aS14IjogIjkzOSIKKyAgICAgICJndWkteSI6ICI0OTQuNzA1MDgwNzU2ODg3NyIKKyAgICB0bzoKKyAgICAgIC0gIjEiCisgICJvcGVudmltLWNvbnRyb2xsZXIiOgorICAgIGNoYXJtOiAiY3M6fm5mdi9vcGVudmltLWNvbnRyb2xsZXItMiIKKyAgICBudW1fdW5pdHM6IDEKKyAgICBhbm5vdGF0aW9uczoKKyAgICAgICJndWkteCI6ICI3MzkiCisgICAgICAiZ3VpLXkiOiAiMTQ4LjI5NDkxOTI0MzExMjI1IgorICAgIHRvOgorICAgICAgLSAiMiIKKyAgIm9wZW52aW0tY29tcHV0ZSI6CisgICAgY2hhcm06ICJjczp+bmZ2L29wZW52aW0tY29tcHV0ZS0yIgorICAgIG51bV91bml0czogMQorICAgIGFubm90YXRpb25zOgorICAgICAgImd1aS14IjogIjMzOSIKKyAgICAgICJndWkteSI6ICIxNDguMjk0OTE5MjQzMTEyMjUiCisgICAgdG86CisgICAgICAtICIzIgorcmVsYXRpb25zOgorICAtIC0gIm9wZW5tYW5vOmRiIgorICAgIC0gIm1hcmlhZGI6ZGIiCisgIC0gLSAib3BlbnZpbS1jb250cm9sbGVyOmRiIgorICAgIC0gIm1hcmlhZGI6ZGIiCisgIC0gLSAib3Blbm1hbm86b3BlbnZpbS1jb250cm9sbGVyIgorICAgIC0gIm9wZW52aW0tY29udHJvbGxlcjpvcGVudmltLWNvbnRyb2xsZXIiCisgIC0gLSAib3BlbnZpbS1jb250cm9sbGVyOmNvbXB1dGUiCisgICAgLSAib3BlbnZpbS1jb21wdXRlOmNvbXB1dGUiCittYWNoaW5lczoKKyAgIjAiOgorICAgIHNlcmllczogdHJ1c3R5CisgICAgY29uc3RyYWludHM6IGFyY2g9YW1kNjQKKyAgIjEiOgorICAgIHNlcmllczogeGVuaWFsCisgICAgY29uc3RyYWludHM6IGFyY2g9YW1kNjQKKyAgIjIiOgorICAgIHNlcmllczogeGVuaWFsCisgICAgY29uc3RyYWludHM6IGFyY2g9YW1kNjQKKyAgIjMiOgorICAgIHNlcmllczogeGVuaWFsCisgICAgY29uc3RyYWludHM6IGFyY2g9YW1kNjQKZGlmZiAtLWdpdCBhL2NoYXJtL29wZW52aW0vaW50ZXJmYWNlLW9wZW52aW0tY29tcHV0ZS9pbnRlcmZhY2UueWFtbCBiL2NoYXJtL29wZW52aW0vaW50ZXJmYWNlLW9wZW52aW0tY29tcHV0ZS9pbnRlcmZhY2UueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmY3ZjhhCi0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS1jb21wdXRlL2ludGVyZmFjZS55YW1sCkBAIC0wLDAgKzEsMyBAQAorbmFtZTogb3BlbnZpbS1jb21wdXRlCit2ZXJzaW9uOiAwCitkZXNjcmlwdGlvbjogQ29ubmVjdGlvbiB0byBhbiBPcGVuVklNIGNvbXB1dGUgaG9zdApkaWZmIC0tZ2l0IGEvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS1jb21wdXRlL3Byb3ZpZGVzLnB5IGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS1jb21wdXRlL3Byb3ZpZGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjA4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2ludGVyZmFjZS1vcGVudmltLWNvbXB1dGUvcHJvdmlkZXMucHkKQEAgLTAsMCArMSwyOCBAQAorZnJvbSBjaGFybXMucmVhY3RpdmUgaW1wb3J0IGhvb2sKK2Zyb20gY2hhcm1zLnJlYWN0aXZlIGltcG9ydCBSZWxhdGlvbkJhc2UKK2Zyb20gY2hhcm1zLnJlYWN0aXZlIGltcG9ydCBzY29wZXMKKworCitjbGFzcyBQcm92aWRlc09wZW5WSU1Db21wdXRlKFJlbGF0aW9uQmFzZSk6CisgICAgc2NvcGUgPSBzY29wZXMuR0xPQkFMCisKKyAgICBhdXRvX2FjY2Vzc29ycyA9IFsnc3NoX2tleSddCisKKyAgICBAaG9vaygne3Byb3ZpZGVzOm9wZW52aW0tY29tcHV0ZX0tcmVsYXRpb24te2pvaW5lZCxjaGFuZ2VkfScpCisgICAgZGVmIGNoYW5nZWQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3N0YXRlKCd7cmVsYXRpb25fbmFtZX0uY29ubmVjdGVkJykKKyAgICAgICAgaWYgc2VsZi5zc2hfa2V5KCk6CisgICAgICAgICAgICBzZWxmLnNldF9zdGF0ZSgne3JlbGF0aW9uX25hbWV9LmF2YWlsYWJsZScpCisKKyAgICBAaG9vaygne3Byb3ZpZGVzOm9wZW52aW0tY29tcHV0ZX0tcmVsYXRpb24te2Jyb2tlbixkZXBhcnRlZH0nKQorICAgIGRlZiBkZXBhcnRlZChzZWxmKToKKyAgICAgICAgc2VsZi5yZW1vdmVfc3RhdGUoJ3tyZWxhdGlvbl9uYW1lfS5jb25uZWN0ZWQnKQorICAgICAgICBzZWxmLnJlbW92ZV9zdGF0ZSgne3JlbGF0aW9uX25hbWV9LmF2YWlsYWJsZScpCisKKyAgICBkZWYgc3NoX2tleV9pbnN0YWxsZWQoc2VsZik6CisgICAgICAgIGNvbnZvID0gc2VsZi5jb252ZXJzYXRpb24oKQorICAgICAgICBjb252by5zZXRfcmVtb3RlKCdzc2hfa2V5X2luc3RhbGxlZCcsIFRydWUpCisKKyAgICBkZWYgc2VuZF91c2VyKHNlbGYsIHVzZXIpOgorICAgICAgICBjb252byA9IHNlbGYuY29udmVyc2F0aW9uKCkKKyAgICAgICAgY29udm8uc2V0X3JlbW90ZSgndXNlcicsIHVzZXIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS1jb21wdXRlL3JlcXVpcmVzLnB5IGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS1jb21wdXRlL3JlcXVpcmVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZGQ2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2ludGVyZmFjZS1vcGVudmltLWNvbXB1dGUvcmVxdWlyZXMucHkKQEAgLTAsMCArMSwzMSBAQAorZnJvbSBjaGFybXMucmVhY3RpdmUgaW1wb3J0IGhvb2sKK2Zyb20gY2hhcm1zLnJlYWN0aXZlIGltcG9ydCBSZWxhdGlvbkJhc2UKK2Zyb20gY2hhcm1zLnJlYWN0aXZlIGltcG9ydCBzY29wZXMKKworCitjbGFzcyBSZXF1aXJlc09wZW5WSU1Db21wdXRlKFJlbGF0aW9uQmFzZSk6CisgICAgc2NvcGUgPSBzY29wZXMuVU5JVAorCisgICAgQGhvb2soJ3tyZXF1aXJlczpvcGVudmltLWNvbXB1dGV9LXJlbGF0aW9uLXtqb2luZWQsY2hhbmdlZH0nKQorICAgIGRlZiBjaGFuZ2VkKHNlbGYpOgorICAgICAgICBzZWxmLnNldF9zdGF0ZSgne3JlbGF0aW9uX25hbWV9LmNvbm5lY3RlZCcpCisgICAgICAgIGlmIHNlbGYucmVhZHlfdG9fc3NoKCk6CisgICAgICAgICAgICBzZWxmLnNldF9zdGF0ZSgne3JlbGF0aW9uX25hbWV9LmF2YWlsYWJsZScpCisKKyAgICBAaG9vaygne3JlcXVpcmVzOm9wZW52aW0tY29tcHV0ZX0tcmVsYXRpb24te2Jyb2tlbixkZXBhcnRlZH0nKQorICAgIGRlZiBkZXBhcnRlZChzZWxmKToKKyAgICAgICAgc2VsZi5yZW1vdmVfc3RhdGUoJ3tyZWxhdGlvbl9uYW1lfS5jb25uZWN0ZWQnKQorICAgICAgICBzZWxmLnJlbW92ZV9zdGF0ZSgne3JlbGF0aW9uX25hbWV9LmF2YWlsYWJsZScpCisKKyAgICBkZWYgc2VuZF9zc2hfa2V5KHNlbGYsIGtleSk6CisgICAgICAgIGZvciBjIGluIHNlbGYuY29udmVyc2F0aW9ucygpOgorICAgICAgICAgICAgYy5zZXRfcmVtb3RlKCdzc2hfa2V5Jywga2V5KQorCisgICAgZGVmIGF1dGhvcml6ZWRfbm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbeworICAgICAgICAgICAgJ3VzZXInOiBjLmdldF9yZW1vdGUoJ3VzZXInKSwKKyAgICAgICAgICAgICdhZGRyZXNzJzogYy5nZXRfcmVtb3RlKCdwcml2YXRlLWFkZHJlc3MnKSwKKyAgICAgICAgfSBmb3IgYyBpbiBzZWxmLmNvbnZlcnNhdGlvbnMoKSBpZiBjLmdldF9yZW1vdGUoJ3NzaF9rZXlfaW5zdGFsbGVkJyldCisKKyAgICBkZWYgcmVhZHlfdG9fc3NoKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuYXV0aG9yaXplZF9ub2RlcygpKSA+IDAKZGlmZiAtLWdpdCBhL2NoYXJtL29wZW52aW0vaW50ZXJmYWNlLW9wZW52aW0vUkVBRE1FLm1kIGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NoYXJtL29wZW52aW0vaW50ZXJmYWNlLW9wZW52aW0vUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2ludGVyZmFjZS1vcGVudmltL2ludGVyZmFjZS55YW1sIGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS9pbnRlcmZhY2UueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U1NTc3Ci0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS9pbnRlcmZhY2UueWFtbApAQCAtMCwwICsxLDMgQEAKK25hbWU6IG9wZW52aW0KK3N1bW1hcnk6IEJhc2ljIE9wZW5WSU0gaW50ZXJmYWNlCit2ZXJzaW9uOiAxCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2ludGVyZmFjZS1vcGVudmltL3Byb3ZpZGVzLnB5IGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS9wcm92aWRlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGFkZTNmCi0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS9wcm92aWRlcy5weQpAQCAtMCwwICsxLDI0IEBACitmcm9tIGNoYXJtaGVscGVycy5jb3JlIGltcG9ydCBob29rZW52Citmcm9tIGNoYXJtcy5yZWFjdGl2ZSBpbXBvcnQgaG9vaworZnJvbSBjaGFybXMucmVhY3RpdmUgaW1wb3J0IFJlbGF0aW9uQmFzZQorZnJvbSBjaGFybXMucmVhY3RpdmUgaW1wb3J0IHNjb3BlcworCisKK2NsYXNzIE9wZW5WaW1Qcm92aWRlcyhSZWxhdGlvbkJhc2UpOgorICAgIHNjb3BlID0gc2NvcGVzLkdMT0JBTAorCisgICAgQGhvb2soJ3twcm92aWRlczpvcGVudmltfS1yZWxhdGlvbi17am9pbmVkLGNoYW5nZWR9JykKKyAgICBkZWYgY2hhbmdlZChzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfc3RhdGUoJ3tyZWxhdGlvbl9uYW1lfS5hdmFpbGFibGUnKQorCisgICAgQGhvb2soJ3twcm92aWRlczpvcGVudmltfS1yZWxhdGlvbi17YnJva2VuLGRlcGFydGVkfScpCisgICAgZGVmIGJyb2tlbihzZWxmKToKKyAgICAgICAgc2VsZi5yZW1vdmVfc3RhdGUoJ3tyZWxhdGlvbl9uYW1lfS5hdmFpbGFibGUnKQorCisgICAgZGVmIGNvbmZpZ3VyZShzZWxmLCBwb3J0LCB1c2VyKToKKyAgICAgICAgcmVsYXRpb25faW5mbyA9IHsKKyAgICAgICAgICAgICdob3N0bmFtZSc6IGhvb2tlbnYudW5pdF9nZXQoJ3ByaXZhdGUtYWRkcmVzcycpLAorICAgICAgICAgICAgJ3BvcnQnOiBwb3J0LAorICAgICAgICAgICAgJ3VzZXInOiB1c2VyLAorICAgICAgICB9CisgICAgICAgIHNlbGYuc2V0X3JlbW90ZSgqKnJlbGF0aW9uX2luZm8pCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2ludGVyZmFjZS1vcGVudmltL3JlcXVpcmVzLnB5IGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS9yZXF1aXJlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RhOWNhCi0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9pbnRlcmZhY2Utb3BlbnZpbS9yZXF1aXJlcy5weQpAQCAtMCwwICsxLDYxIEBACitmcm9tIGNoYXJtcy5yZWFjdGl2ZSBpbXBvcnQgaG9vaworZnJvbSBjaGFybXMucmVhY3RpdmUgaW1wb3J0IFJlbGF0aW9uQmFzZQorZnJvbSBjaGFybXMucmVhY3RpdmUgaW1wb3J0IHNjb3BlcworCisKK2NsYXNzIE9wZW5WaW1SZXF1aXJlcyhSZWxhdGlvbkJhc2UpOgorICAgIHNjb3BlID0gc2NvcGVzLlVOSVQKKworICAgIEBob29rKCd7cmVxdWlyZXM6b3BlbnZpbX0tcmVsYXRpb24te2pvaW5lZCxjaGFuZ2VkfScpCisgICAgZGVmIGNoYW5nZWQoc2VsZik6CisgICAgICAgIGNvbnYgPSBzZWxmLmNvbnZlcnNhdGlvbigpCisgICAgICAgIGlmIGNvbnYuZ2V0X3JlbW90ZSgncG9ydCcpOgorICAgICAgICAgICAgIyB0aGlzIHVuaXQncyBjb252ZXJzYXRpb24gaGFzIGEgcG9ydCwgc28KKyAgICAgICAgICAgICMgaXQgaXMgcGFydCBvZiB0aGUgc2V0IG9mIGF2YWlsYWJsZSB1bml0cworICAgICAgICAgICAgY29udi5zZXRfc3RhdGUoJ3tyZWxhdGlvbl9uYW1lfS5hdmFpbGFibGUnKQorCisgICAgQGhvb2soJ3tyZXF1aXJlczpvcGVudmltfS1yZWxhdGlvbi17ZGVwYXJ0ZWQsYnJva2VufScpCisgICAgZGVmIGJyb2tlbihzZWxmKToKKyAgICAgICAgY29udiA9IHNlbGYuY29udmVyc2F0aW9uKCkKKyAgICAgICAgY29udi5yZW1vdmVfc3RhdGUoJ3tyZWxhdGlvbl9uYW1lfS5hdmFpbGFibGUnKQorCisgICAgZGVmIHNlcnZpY2VzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgYXZhaWxhYmxlIG9wZW52aW0gc2VydmljZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgaG9zdHMKKyAgICAgICAgYW5kIHBvcnRzLgorCisgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBsaXN0IG9mIGRpY3RzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybTo6CisKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICdzZXJ2aWNlX25hbWUnOiBuYW1lX29mX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICdob3N0cyc6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9zdG5hbWUnOiBhZGRyZXNzX29mX2hvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnOiBwb3J0X2Zvcl9ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJzogdXNlcl9mb3JfaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAjIC4uLgorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIyAuLi4KKyAgICAgICAgICAgIF0KKyAgICAgICAgIiIiCisgICAgICAgIHNlcnZpY2VzID0ge30KKyAgICAgICAgZm9yIGNvbnYgaW4gc2VsZi5jb252ZXJzYXRpb25zKCk6CisgICAgICAgICAgICBzZXJ2aWNlX25hbWUgPSBjb252LnNjb3BlLnNwbGl0KCcvJylbMF0KKyAgICAgICAgICAgIHNlcnZpY2UgPSBzZXJ2aWNlcy5zZXRkZWZhdWx0KHNlcnZpY2VfbmFtZSwgeworICAgICAgICAgICAgICAgICdzZXJ2aWNlX25hbWUnOiBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgJ2hvc3RzJzogW10sCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgaG9zdCA9IGNvbnYuZ2V0X3JlbW90ZSgnaG9zdG5hbWUnKSBvciBcCisgICAgICAgICAgICAgICAgY29udi5nZXRfcmVtb3RlKCdwcml2YXRlLWFkZHJlc3MnKQorICAgICAgICAgICAgcG9ydCA9IGNvbnYuZ2V0X3JlbW90ZSgncG9ydCcpCisgICAgICAgICAgICB1c2VyID0gY29udi5nZXRfcmVtb3RlKCd1c2VyJykKKyAgICAgICAgICAgIGlmIGhvc3QgYW5kIHBvcnQ6CisgICAgICAgICAgICAgICAgc2VydmljZVsnaG9zdHMnXS5hcHBlbmQoeworICAgICAgICAgICAgICAgICAgICAnaG9zdG5hbWUnOiBob3N0LAorICAgICAgICAgICAgICAgICAgICAncG9ydCc6IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICd1c2VyJzogdXNlciwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICByZXR1cm4gW3MgZm9yIHMgaW4gc2VydmljZXMudmFsdWVzKCkgaWYgc1snaG9zdHMnXV0KZGlmZiAtLWdpdCBhL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS1jb21wdXRlL1JFQURNRS5tZCBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS1jb21wdXRlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmEyMDNjCi0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltLWNvbXB1dGUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTggQEAKKyMgT3ZlcnZpZXcKKworTGF1bmNoZXMgYW4gT3BlblZJTSBjb21wdXRlIG5vZGUuCisKKyMgUHJlcGFyYXRpb24KKworV2hlbiBydW5uaW5nIHdpdGggYW4gTFhEIGNsb3VkLCB0aGUgb3BlbnZpbS1jb21wdXRlIG5vZGVzIG5lZWRzIHRvIGhhdmUgc29tZQorZGV2aWNlcyBhZGRlZCBhbmQgYmUgcnVuIHdpdGggZXh0cmEgcHJpdmlsZWdlcy4gQSBxdWljay1hbmQtZGlydHkgd2F5IG9mCithY2NvbXBsaXNoaW5nIHRoaXMgaXMgdG8gZWRpdCB0aGUganVqdS1kZWZhdWx0IExYRCBwcm9maWxlOgorCisgICAgbHhjIHByb2ZpbGUgZWRpdCBqdWp1LWRlZmF1bHQKKyAgICAKK2NoYW5nZSBpdCB0bzoKKworICAgIG5hbWU6IGp1anUtZGVmYXVsdAorICAgIGNvbmZpZzoKKyAgICAgIGJvb3QuYXV0b3N0YXJ0OiAidHJ1ZSIKKyAgICAgIHNlY3VyaXR5Lm5lc3Rpbmc6ICJ0cnVlIgorICAgICAgc2VjdXJpdHkucHJpdmlsZWdlZDogInRydWUiCisgICAgZGVzY3JpcHRpb246ICIiCisgICAgZGV2aWNlczoKKyAgICAgIGt2bToKKyAgICAgICAgcGF0aDogL2Rldi9rdm0KKyAgICAgICAgdHlwZTogdW5peC1jaGFyCisgICAgICB0dW46CisgICAgICAgIHBhdGg6IC9kZXYvbmV0L3R1bgorICAgICAgICB0eXBlOiB1bml4LWNoYXIKKworIyBVc2FnZQorCisgICAganVqdSBkZXBsb3kgbXlzcWwKKyAgICBqdWp1IGRlcGxveSBvcGVudmltLWNvbnRyb2xsZXIKKyAgICBqdWp1IGRlcGxveSBvcGVudmltLWNvbXB1dGUKKyAgICBqdWp1IHJlbGF0ZSBteXNxbCBvcGVudmltLWNvbnRyb2xsZXIKKyAgICBqdWp1IHJlbGF0ZSBvcGVudmltLWNvbXB1dGUgb3BlbnZpbS1jb250cm9sbGVyCisgICAgCisjIENyZWF0aW5nIGFuZCBzdGFydGluZyBhIFZNCisKK1RoZSBvcGVudmltLWNvbnRyb2xsZXIgY2hhcm0gd2lsbCBjcmVhdGUgYSBkZWZhdWx0IHRlbmFudCwgaW1hZ2UsIGZsYXZvciwKK2FuZCBuZXR3b3JrcywgYnV0IHlvdSdsbCB3YW50IHRvIGFkZCB5b3VyIG93biBWTSB3aGVuIHlvdSdyZSByZWFkeSB0byBkZXBsb3kuCitUaGlzIGNoYXJtIGdlbmVyYXRlcyBhIGJhc2ljIFZNIHlhbWwgZGVmaW5pdGlvbiBmb3IgeW91IGlmIHlvdSdkIGxpa2UgdG8gbGF1bmNoCitvbmUgcXVpY2tseS4gRmlyc3QsIHNzaCBpbnRvIHlvdXIgb3BlbnZpbS1jb250cm9sbGVyIGJveDoKKworICAgIGp1anUgc3NoIG9wZW52aW0tY29udHJvbGxlci8wICMgbWF5IG5vdCBiZSB6ZXJvLCBmaW5kIGluc3RhbmNlIGlkIHdpdGggYGp1anUgc3RhdHVzYC4KKworVGhlbiBjcmVhdGUgeW91ciBWTSBhbmQgZ2V0IGl0cyB1dWlkOgorCisgICAgL2hvbWUvdWJ1bnR1L29wZW5tYW5vL29wZW52aW0vb3BlbnZpbSB2bS1jcmVhdGUgL3RtcC9zZXJ2ZXIueWFtbAorICAgIAorQW5kIGZpbmFsbHkgc3RhcnQgaXQ6CisKKyAgICAvaG9tZS91YnVudHUvb3Blbm1hbm8vb3BlbnZpbS9vcGVudmltIHZtLXN0YXJ0IDx2bS11dWlkPgorICAgIAorCisjIENvbnRhY3QgSW5mb3JtYXRpb24KKworUnllIFRlcnJlbGwgcnllLnRlcnJlbGxAY2Fub25pY2FsLmNvbQorR2VvcmdlIEtyYWZ0IGdlb3JnZS5rcmFmdEBjYW5vbmljYWwuY29tCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0tY29tcHV0ZS9pY29uLnN2ZyBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS1jb21wdXRlL2ljb24uc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMmE0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0tY29tcHV0ZS9pY29uLnN2ZwpAQCAtMCwwICsxLDEyODQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+CisKKzxzdmcKKyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKKyAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCisgICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCisgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCisgICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKKyAgIHdpZHRoPSI5NiIKKyAgIGhlaWdodD0iOTYiCisgICBpZD0ic3ZnNjUxNyIKKyAgIHZlcnNpb249IjEuMSIKKyAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgorICAgc29kaXBvZGk6ZG9jbmFtZT0iaWNvbi5zdmciPgorICA8ZGVmcworICAgICBpZD0iZGVmczY1MTkiPgorICAgIDxsaW5lYXJHcmFkaWVudAorICAgICAgIGlkPSJCYWNrZ3JvdW5kLTAiPgorICAgICAgPHN0b3AKKyAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiOGI4Yjg7c3RvcC1vcGFjaXR5OjEiCisgICAgICAgICBvZmZzZXQ9IjAiCisgICAgICAgICBpZD0ic3RvcDQyNDUiIC8+CisgICAgICA8c3RvcAorICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC45ODAzOTIxNiIKKyAgICAgICAgIG9mZnNldD0iMSIKKyAgICAgICAgIGlkPSJzdG9wNDI0NyIgLz4KKyAgICA8L2xpbmVhckdyYWRpZW50PgorICAgIDxsaW5lYXJHcmFkaWVudAorICAgICAgIGlkPSJCYWNrZ3JvdW5kIj4KKyAgICAgIDxzdG9wCisgICAgICAgICBpZD0ic3RvcDQxNzgiCisgICAgICAgICBvZmZzZXQ9IjAiCisgICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjhiOGI4O3N0b3Atb3BhY2l0eToxIiAvPgorICAgICAgPHN0b3AKKyAgICAgICAgIGlkPSJzdG9wNDE4MCIKKyAgICAgICAgIG9mZnNldD0iMSIKKyAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjOWM5Yzk7c3RvcC1vcGFjaXR5OjEiIC8+CisgICAgPC9saW5lYXJHcmFkaWVudD4KKyAgICA8ZmlsdGVyCisgICAgICAgc3R5bGU9ImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpzUkdCOyIKKyAgICAgICBpbmtzY2FwZTpsYWJlbD0iSW5uZXIgU2hhZG93IgorICAgICAgIGlkPSJmaWx0ZXIxMTIxIj4KKyAgICAgIDxmZUZsb29kCisgICAgICAgICBmbG9vZC1vcGFjaXR5PSIwLjU5OTk5OTk5OTk5OTk5OTk4IgorICAgICAgICAgZmxvb2QtY29sb3I9InJnYigwLDAsMCkiCisgICAgICAgICByZXN1bHQ9ImZsb29kIgorICAgICAgICAgaWQ9ImZlRmxvb2QxMTIzIiAvPgorICAgICAgPGZlQ29tcG9zaXRlCisgICAgICAgICBpbj0iZmxvb2QiCisgICAgICAgICBpbjI9IlNvdXJjZUdyYXBoaWMiCisgICAgICAgICBvcGVyYXRvcj0ib3V0IgorICAgICAgICAgcmVzdWx0PSJjb21wb3NpdGUxIgorICAgICAgICAgaWQ9ImZlQ29tcG9zaXRlMTEyNSIgLz4KKyAgICAgIDxmZUdhdXNzaWFuQmx1cgorICAgICAgICAgaW49ImNvbXBvc2l0ZTEiCisgICAgICAgICBzdGREZXZpYXRpb249IjEiCisgICAgICAgICByZXN1bHQ9ImJsdXIiCisgICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXIxMTI3IiAvPgorICAgICAgPGZlT2Zmc2V0CisgICAgICAgICBkeD0iMCIKKyAgICAgICAgIGR5PSIyIgorICAgICAgICAgcmVzdWx0PSJvZmZzZXQiCisgICAgICAgICBpZD0iZmVPZmZzZXQxMTI5IiAvPgorICAgICAgPGZlQ29tcG9zaXRlCisgICAgICAgICBpbj0ib2Zmc2V0IgorICAgICAgICAgaW4yPSJTb3VyY2VHcmFwaGljIgorICAgICAgICAgb3BlcmF0b3I9ImF0b3AiCisgICAgICAgICByZXN1bHQ9ImNvbXBvc2l0ZTIiCisgICAgICAgICBpZD0iZmVDb21wb3NpdGUxMTMxIiAvPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXIKKyAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0I7IgorICAgICAgIGlua3NjYXBlOmxhYmVsPSJEcm9wIFNoYWRvdyIKKyAgICAgICBpZD0iZmlsdGVyOTUwIj4KKyAgICAgIDxmZUZsb29kCisgICAgICAgICBmbG9vZC1vcGFjaXR5PSIwLjI1IgorICAgICAgICAgZmxvb2QtY29sb3I9InJnYigwLDAsMCkiCisgICAgICAgICByZXN1bHQ9ImZsb29kIgorICAgICAgICAgaWQ9ImZlRmxvb2Q5NTIiIC8+CisgICAgICA8ZmVDb21wb3NpdGUKKyAgICAgICAgIGluPSJmbG9vZCIKKyAgICAgICAgIGluMj0iU291cmNlR3JhcGhpYyIKKyAgICAgICAgIG9wZXJhdG9yPSJpbiIKKyAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMSIKKyAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTk1NCIgLz4KKyAgICAgIDxmZUdhdXNzaWFuQmx1cgorICAgICAgICAgaW49ImNvbXBvc2l0ZTEiCisgICAgICAgICBzdGREZXZpYXRpb249IjEiCisgICAgICAgICByZXN1bHQ9ImJsdXIiCisgICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI5NTYiIC8+CisgICAgICA8ZmVPZmZzZXQKKyAgICAgICAgIGR4PSIwIgorICAgICAgICAgZHk9IjEiCisgICAgICAgICByZXN1bHQ9Im9mZnNldCIKKyAgICAgICAgIGlkPSJmZU9mZnNldDk1OCIgLz4KKyAgICAgIDxmZUNvbXBvc2l0ZQorICAgICAgICAgaW49IlNvdXJjZUdyYXBoaWMiCisgICAgICAgICBpbjI9Im9mZnNldCIKKyAgICAgICAgIG9wZXJhdG9yPSJvdmVyIgorICAgICAgICAgcmVzdWx0PSJjb21wb3NpdGUyIgorICAgICAgICAgaWQ9ImZlQ29tcG9zaXRlOTYwIiAvPgorICAgIDwvZmlsdGVyPgorICAgIDxjbGlwUGF0aAorICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIgorICAgICAgIGlkPSJjbGlwUGF0aDg3MyI+CisgICAgICA8ZworICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMC42NjY2NjY2NywwLjY2NjA0NDc5LDAsLTI1OC4yNTk5Miw2NzcuMDAwMDEpIgorICAgICAgICAgaWQ9Imc4NzUiCisgICAgICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKKyAgICAgICAgIHN0eWxlPSJmaWxsOiNmZjAwZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiPgorICAgICAgICA8cGF0aAorICAgICAgICAgICBzdHlsZT0iZmlsbDojZmYwMGZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIgorICAgICAgICAgICBkPSJtIDQ2LjcwMjcwMyw4OTguMjI3NzUgNTAuNTk0NTk0LDAgQyAxMzguMTYyMTYsODk4LjIyNzc1IDE0NCw5MDQuMDY0OTcgMTQ0LDk0NC45MjU4MyBsIDAsNTAuNzM4NDYgYyAwLDQwLjg2MDcxIC01LjgzNzg0LDQ2LjY5NzkxIC00Ni43MDI3MDMsNDYuNjk3OTEgbCAtNTAuNTk0NTk0LDAgQyA1LjgzNzgzNzgsMTA0Mi4zNjIyIDAsMTAzNi41MjUgMCw5OTUuNjY0MjkgTCAwLDk0NC45MjU4MyBDIDAsOTA0LjA2NDk3IDUuODM3ODM3OCw4OTguMjI3NzUgNDYuNzAyNzAzLDg5OC4yMjc3NSBaIgorICAgICAgICAgICBpZD0icGF0aDg3NyIKKyAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKKyAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJzc3Nzc3Nzc3MiIC8+CisgICAgICA8L2c+CisgICAgPC9jbGlwUGF0aD4KKyAgICA8ZmlsdGVyCisgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgorICAgICAgIGlkPSJmaWx0ZXI4OTEiCisgICAgICAgaW5rc2NhcGU6bGFiZWw9IkJhZGdlIFNoYWRvdyI+CisgICAgICA8ZmVHYXVzc2lhbkJsdXIKKyAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKKyAgICAgICAgIHN0ZERldmlhdGlvbj0iMC43MTk5OTk2MiIKKyAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjg5MyIgLz4KKyAgICA8L2ZpbHRlcj4KKyAgPC9kZWZzPgorICA8c29kaXBvZGk6bmFtZWR2aWV3CisgICAgIGlkPSJiYXNlIgorICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCisgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgorICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCisgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCisgICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCisgICAgIGlua3NjYXBlOnpvb209IjQuMDc0NTM2MiIKKyAgICAgaW5rc2NhcGU6Y3g9IjEwOS41Njc5OCIKKyAgICAgaW5rc2NhcGU6Y3k9IjM5LjIwMTEwMSIKKyAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgorICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCisgICAgIHNob3dncmlkPSJ0cnVlIgorICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKKyAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgorICAgICBmaXQtbWFyZ2luLXJpZ2h0PSIwIgorICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIKKyAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNjAwIgorICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzYiCisgICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgorICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMjQiCisgICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCisgICAgIHNob3dib3JkZXI9InRydWUiCisgICAgIHNob3dndWlkZXM9InRydWUiCisgICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCisgICAgIGlua3NjYXBlOnNob3dwYWdlc2hhZG93PSJmYWxzZSI+CisgICAgPGlua3NjYXBlOmdyaWQKKyAgICAgICB0eXBlPSJ4eWdyaWQiCisgICAgICAgaWQ9ImdyaWQ4MjEiIC8+CisgICAgPHNvZGlwb2RpOmd1aWRlCisgICAgICAgb3JpZW50YXRpb249IjEsMCIKKyAgICAgICBwb3NpdGlvbj0iMTYsNDgiCisgICAgICAgaWQ9Imd1aWRlODIzIiAvPgorICAgIDxzb2RpcG9kaTpndWlkZQorICAgICAgIG9yaWVudGF0aW9uPSIwLDEiCisgICAgICAgcG9zaXRpb249IjY0LDgwIgorICAgICAgIGlkPSJndWlkZTgyNSIgLz4KKyAgICA8c29kaXBvZGk6Z3VpZGUKKyAgICAgICBvcmllbnRhdGlvbj0iMSwwIgorICAgICAgIHBvc2l0aW9uPSI4MCw0MCIKKyAgICAgICBpZD0iZ3VpZGU4MjciIC8+CisgICAgPHNvZGlwb2RpOmd1aWRlCisgICAgICAgb3JpZW50YXRpb249IjAsMSIKKyAgICAgICBwb3NpdGlvbj0iNjQsMTYiCisgICAgICAgaWQ9Imd1aWRlODI5IiAvPgorICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KKyAgPG1ldGFkYXRhCisgICAgIGlkPSJtZXRhZGF0YTY1MjIiPgorICAgIDxyZGY6UkRGPgorICAgICAgPGNjOldvcmsKKyAgICAgICAgIHJkZjphYm91dD0iIj4KKyAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CisgICAgICAgIDxkYzp0eXBlCisgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CisgICAgICAgIDxkYzp0aXRsZSAvPgorICAgICAgPC9jYzpXb3JrPgorICAgIDwvcmRmOlJERj4KKyAgPC9tZXRhZGF0YT4KKyAgPGcKKyAgICAgaW5rc2NhcGU6bGFiZWw9IkJBQ0tHUk9VTkQiCisgICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCisgICAgIGlkPSJsYXllcjEiCisgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2OCwtNjM1LjI5MDc2KSIKKyAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KKyAgICA8cGF0aAorICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOiNkOWZmZDk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyMTEyMSkiCisgICAgICAgZD0ibSAtMjY4LDcwMC4xNTU2MyAwLC0zMy43Mjk3MyBjIDAsLTI3LjI0MzI0IDMuODg3ODUsLTMxLjEzNTEzIDMxLjEwMzAyLC0zMS4xMzUxMyBsIDMzLjc5NDA4LDAgYyAyNy4yMTUwNywwIDMxLjEwMjksMy44OTE4OSAzMS4xMDI5LDMxLjEzNTEzIGwgMCwzMy43Mjk3MyBjIDAsMjcuMjQzMjUgLTMuODg3ODMsMzEuMTM1MTQgLTMxLjEwMjksMzEuMTM1MTQgbCAtMzMuNzk0MDgsMCBjIC0yNy4yMTUxNywwIC0zMS4xMDMwMiwtMy44OTE4OSAtMzEuMTAzMDIsLTMxLjEzNTE0IHoiCisgICAgICAgaWQ9InBhdGg2NDU1IgorICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCisgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJzc3Nzc3Nzc3MiIC8+CisgIDwvZz4KKyAgPGcKKyAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKKyAgICAgaWQ9ImxheWVyMyIKKyAgICAgaW5rc2NhcGU6bGFiZWw9IlBMQUNFIFlPVVIgUElDVE9HUkFNIEhFUkUiCisgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKKyAgICAgc29kaXBvZGk6aW5zZW5zaXRpdmU9InRydWUiPgorICAgIDxpbWFnZQorICAgICAgIHk9IjE5Ljg0MDU0NiIKKyAgICAgICB4PSIxNSIKKyAgICAgICBpZD0iaW1hZ2UzNDMyIgorICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBMk1BQUFMVENBWUFBQUNiak5ySUFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6CitBQUFOMXdBQURkY0JRaWliZUFBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFDQUFTVVJCCitWSGljN04xcG1GWFZsVGZ3LzlybjFzUWtvRGdCVlFYaWJEU0tzeVlXUTQwSU1iR3I0bXlNQTRsSnpOeDUrODNiM1RkREo1MU9kOUpKCit4eWlUUkFLRlhYUzZrNmlGVUlWRk9vNVJNaG1TbUtDQzRvZ2lNbGZkZS9aNlB3Q0dJRU1ONTV5MXp6N3I5NkdmSjAvRE9YK3N1dmZzCitkZmJlYXdOS0thV1VVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTU2ltbGxGSktLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wCitwWlJTU2ltbGxGSktLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTU2ltbGxGSktLYVdVCitVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTU2ltbGxGSktLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wcFpSU1NpbWxsRkpLCitLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTU2ltbGxGSktLYVdVVWtvcHBaUlNTaW1sCitsRkpLS2FXVVVrb3BwWlJTU2ltbGxGSktLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTCitTaW1sbEZKS0thV1VVa29wcFpTelNEcUFVaW9iOHZtOHFiejQ4Wk9LQ0UrSDVhTU0wUkVnTG1HTHpVVFVZd2t2TTl0MUFKNS9PVmQ4CitLVDlwWlZFNnMxTEtJelZkdWZGRE54eGJMQlFyaWJnS01NY0F0cFJnaGpIYkFodThidGk4d29aK3UrNmNQejZOZk41S1IxWksrVStMCitNYVZVYk81cWJ4d1Zsb2J2QjlNSEFMNFF3TkJlL3RVaWdMVU1mdHF3ZVpvTlAyMkpuc1Jocno4MTgreFZoUmdqSzZWU2J1TEVXU1ViCitqaDV5T2l3bUV0T0pJSndFMEFrQVZ3UEk5Zkl5VzBCNG5Ca2R1Vnp1bm1mdmJYayt4c2hLcVF6VFlreWx5bmZiRzh0eTFnd3FHV3dICitCMkdobEl2QjBHSUpnaElPTjNXVDdlWWRGZHVQMkQ1b2MwdkxrbEE2YTViTldsRi9sbUhPZzlFRUlJancwanZBK0JVRFB3dU11ZmVGCitoODUvUEs5dnI1WEt0dWEyb0dwN2VCNkhmQ2tCbDRCd0ZvRHlDTzlnQ2JnUHhQKzR0djNxWDBkNFhkVlh6VzFCNWZiQ01Fc2xnd3dYCit5cWdZRERkQUdPYkNMYUhsbnNEUXRsSTdZdnVhcFUzZDBsR1Y2aTB0eHBUVDJ0cWFTemVOZkt1WlFPOGo4RG5NcUFSZ2V2RlhReUs4Cit3RXpQTU93ZkRNeWp4dkxQUDF5Ly9JVzRNMmZaL0s2YThtS3g5T3NBYmtQdmZrNER0UUhBUGRiaSt6UHJsLzh4Z2ZzcHBSeFJYZGQ2CitFaHYrT0loYUFJeEs0SlloR044cG9lSC9Wd2Y3OFJvL3ZhMHlETU9Md2JnQXNDY0RkQnlBc2VqZHl6MExvblZrK1FrMjlKTWpYdDI4CitaTldxbWJxaVFqbExpekhsckRtZDllOGg4QUptVkVkM1Zmb1Z3RDhxbXVJUFBqcmx3UmVqdTY2YTB6bmxLTmpncHlDY0szQjdacUFECit6Ris0cGE1RDMxd3I1YkdxeHNWbk11dy9FNmdXSXVNWWVpd1hGdDczelBMclhrdiszdjRhYzJuYjZDQXNmZ2pBNVFET2pQRFN6OExRCit0ZXZ1di9LUkNLK3BWR1MwR0ZOT210UFI4QUhBM2dPZ0pLWmJGRUQwWTRUOGpadnJsNitLNlI2Wk1hdXI1Z2dxbHZ5TVFLY0lSd21aCitNVGNZVlA3NUd5Lys2UmJoTEVxcENFMW9YRGlzQVBPdkFHNUVNalB2QjdPNmtFUE5TL2RlOWJwd2p0UWIyN1Q0Yk1QOEJRQ1hvZmQ3CisrdnFxaDRoYjFyWmYvWk9ZcnE5VXYya3hwcHd6ZDNudFJVejBJSURTQkc3SEFINXFZZjkrWm0zblV3bmN6enY1Zk42TXZ1alJkb0RyCitwYlBzNVkvVzR2MjZkRkVwUDFRMkxqeUZZUDRid0luU1dkN0dlR0RkK1grYXBsMFgrMmRjUSt2cFRQZ0tBOU9SekhpMEc0WW02d3laCitjbzBXWThvcDM3OXYyb2lTc3NKcUFNY2tmT3NRd094U0N2LysrcWtyM2tqNDNxazJwNlB1aXdDK0twMWpQN1lRYytOTmRSMFBTd2RSCitTdlhmMlByRjd6R0c3MGZ2dTdFbWlMKzRidW5WWDVOT2tTYWpwOXg5ZUZDYSt5cUJia2EwRFo1NjQyVTJmT3J6OTEvOVpzTDNWZXFBCitwS2Y1bGZvckplWEZmMEh5aFJpdzY0SHcwUjRPL2pTM3MzWm1QcC9YejBZdnpGbFdOeEhBbDZSekhNQlFTOVErdTdQaEhPa2dTcW4rCitxVzVhZko0eGZCK2NMTVFBZ0w1VVZYL1BXZElwVWlHZk45VU5yVE56cFNWL0p0QkhrSHdoQmdESGtLVnZDTnhYcVFQU0FhZHl4dXpsCit0WmVBK1ViaEdDT1o2YzdSRnozeThMd0g2czhRenVJOE52Z21aQjZvdlVMQU1HSnV2MnRaM1ZqcExFcXB2aG5YdEtpS21lOEhNRXc2Cit5MEhrWU93M3BVTzRycnBwMGJ1ckhqL3hZU2JjQ1dDRWNKeWJLaHRhTHhiT29OVGJ0QmhUVG1BR0VkRy93NTJscytmYmdKK2N1N3orCiszMjd2cWhraUhjWkY4NWJYMWhFd1NUckhvZkVSb1VGYlcxdHpFbnNRbFZJUk9MVzVyZFF5L1NlQXc2V3o5TUxreXZwRlU2VkR1T2pFCitHZk9HVmpVdCtoWXpQUUh3K2RKNWRpTWkvRHZBcm93M1ZNWnBNYWFjTUtlamRqcUFkMHZuMkVlT2lUOVRXaXo5L2V6T3VrdWx3N2lHCitRWitTenRBSDUyOGV1ZW5MMGlHVVVyMnpiV3Z4S3dET2s4N1JXeFNrNnZzd0VaV05yZE4zRmlwK0Q2WlBJNzR1aWYwMXNiSnAwVFRwCitFRW9CN3N4Q3FJeWIwMUg3QzRCYzM5c3plMGNodU8yMnBxV1pQK3p6enVXMXh3ZEVmMFM2WHVnVW1ma2NQWWRNS2JlTmFWcjRyb0ROCitLc1IzdEVrY09DQnowclB0Vi94Sk9vaTBDWTN0WlVWNjgxK1k2Uk53ZTV5NWF0M1NLODhCaUtXRHFHeEwwMEJLZVdyTzh0cW1GQlJpCitBSEJMUlVuNHlKM0xhNCtYRGlMTkVOMkM5SDEvNUFoME83UFRnd09sTW80cDRHQTIwbFdJQVFCWnR0Sjduc1dOYjdybmhBSTJQY3BNCit0OEh0UWd3QUpsWTNMWGJwU0JhVlVXa2JUQ2tQTWRIbnBEUDB3VmtCMFJOek9xYTZzdlk5Y2ZsODNoQndwWFNPZmlGY09HOUYzZnVrCitZeWlsOXErcWFmRUhITnBiMUNjV3VCSVo3c1JiTlczeGhTSGJYd0E0VXpwTGJ6Rnptc1lmeWxPWi9kSlFicmlycy9FVUFtcWtjL1RSCitZWUI1WU5heXVwT2tnMGdZZmNFak5RQkdTK2ZvTDJaOFJZOHVVTXBCelcwQjJObWpNZzZKZ0xIamZuRjhKcnYwVlRZdVBBV1dId0J3CittSFNXdnFISjFYV3RtWHlXSzNmb2dFU0pDbUZ2aGZ0TEdmYm5NR1BRbHUrcWNXMVRjdndJVjBsSEdLRFRqcjM0a1NicEVFcXB2MWE5CityWEFwZ0ZPbGN3eEVDRXI3OTJPZlRadzRxNFJnbHNEWnMrQU9pampBcmRJaFZMWnBNYWJFM041Vk00U1pyNVhPTVFEdkdsMG9tU2tkCitJa2x0YmMwQmlGSy96SThZSDVQT29KVDZhd3o2dUhTR2dTTEcrN08yVkhIRHFHRWZCWENLZEk0QitOQ0pNK2Fsc1pCVW5zalVGNFp5CitTMm14OUZweSt6RFBReVA2eDFrZFUxTzJMS1AvTmcvZmREN0FSMGpuaUVEZDNCVk5WZElobEZLN1ZFNWJOQjZNS2RJNUluQms5ZU1UCit6cFVPa1pUcXkrWVBKK0svbDg0eFFFTzdleW95TjZPcDNLSEZtQkpFTjBzbmlNQW9BL041NlJCSnNUQXpwRE5FeEZndVhDNGRRaW0xCitDNFYwT2RLNVpQMGRMSm5Vcng3b0xlNHUreHlBMUwrZ1k0SVA0eEdWVWxxTUtSRnpsOVdkQm5CcU9pNGRGT0hXMjd0cWhrakhTQUlSCitUNWZPRUJXeXBNV1lVcTRnK29CMGhLZ1F3NWVYVmdlMWUybWZML3V0SmxiV3Q2WjZ2NkpLTHkzR2xBZzJ1RTQ2UTJRWUkwb0tKZDZmCitMek9yWTJvbGdKT2xjMFNHY043QzlzWjBMNU5WeWdQVmw4MGZEckJQUy90T09hNXU4VmpwRUhIcjdobDBFNEFSMGptaVlneWxlUSs3CitTakV0eGxUaTh2bThBYWYwbktvRElLSVBTbWVJbTBIZ3czNk92UVhkdVdJcXp6TlN5aWU4cy9SQ2VEWWVLUVIya25TRzJKSDE2am5PCis0R3ZRM0JaSTUxRFo0OVdYbjBxSHNSYytQQldFTWRJNUluYnUzWjFURHBjT0VTK3VrVTRRdGREZ0l1a01TbVVlMFlYU0VhSkhrNlVUCit4R2xDWTlzb0JrMlV6aEd4MFpYYmlsNy8zSlNidEJoVGliTkUvaXhSL0l1Z1lJM2ZCMGN5dkh0SWthVTB0Mk5XeWhjKzd0WHg3dnR5CitieUVWVG9hSFkwaXlxVDV1UjZXVWR4OGs1YlpaOTA0ZkJPQXk2Unl4TURSS09rSmNabmRPT2NIRDJVekFwejF3U3FVVndic1hXUVNNCitIVlAvd3duU09lSmk0ZW56am5ENVVYVUxCa3ZIVU5taXhaaEtGSlgzTkFMdzhvdU9BWCtYS2RxY24yOTVDUk9ZL1dpbnJWUTZNWUV4CitYanBGSEl3eGZuNXZBbUNta2RJWjRrR0R5azFRTDUxQ1pZc1dZeXBSQk5zaW5TRXVCTTVKWjRnTGtiZWIwY3Z1dUgvYWNPa1FTbVhWCitzZE1YSHc2Z1ZEcEhIQWprNi9jbWlMbEVPa05zRFAyTmRBU1ZMVnFNcWNUc1dxSklUZEk1Vk4vc21qbWlTNlJ6eEtWc1VIaWtkQWFsCitzaXBYdEQ1Ly9pWURyRFB2YWNPWVBxYTVyVUk2aHNvT0xjWlVZbll2VWZUMmNHUm04dkx6TkhkRnc3c0FIQ1dkSXpZV25pNjNVU29WCit2RG1uYWorT0hEdnRQMzFzVHVLN0ljR1dzRUU2aE1vT0x3ZVB5azBFYnBiT29QcU9iZWp0VXB0ZHVGdzZnVktaeFlIWG56K3kzaTd4Cis5aHRaWGFxb0VxUEZtRXJFdHg2NW9BTEFOT2tjY1NMbWduU0dXQkRWU0VlSVUwaGFqQ2tsaFlpODNDKzJCL242L1duUUl4MGhYalM5Cit1bWErUGh0VUlyUVlVNGtZc25WSUxUeGVvZ2dBSUxOZE9rSWNDRGhmT2tPc1FvODNvaXZsT090ekl3Z0FZUGJ6KzVONWgzU0VtQTNsCitzdklwMGlGVU5tZ3hwaEpCb0JuU0dXSkg3RjB4ZHNmU2htb0FSMHZuaUZNQTdKVE9vRlJXQmJEZDBobGlkdXo0NlcyVjBpRWl4L0M5CitHQU1IUEYwNmc4b0dMY1pVN1BMNXZBSDV2VVFSQU1qNlY0d0ZKZGJQdDdwN3NjWjRQNmhReWxWay9CL1VGd3VGODZRelJJME1lZmU4CisyeGN4Wm1nM1RKVUVMY1pVN0VaZjlOQzU4SHgyWmJlTjBnR2lSZ3p2QmhIN010WjZQeGhVeWxtaC96UFRST1RoOXlpOUtaMGdBY2VNCitiVmgwdG5RSTVUOHR4bFQ4S01qRVZEOHh2U3FkSVFZZURpTCtXcGpUbVRHbHBCUUM3L2NlQVNEL1ZoaFkrUGk4ZXdlVGtmR0xrcVhGCittSW9mcy8vN3hRRGVHZ2F2U1llSVVsdGJjeW1BTTZWenhDMW53d3dNQnBWeVZKaUZZb3dubnRyYzVsZlh5SjA3WDVHT2tBakt4UGhGCitDZE5pVE1WcXpySzZjUUJPazg0Uk84S20yNXFXZXJVUmZkUElMV2NBOEw2MUx3V2wzdTk5VU1wVlpITlorUHlWYjk0V25pNGRJa3ByCitWOTZ3RThCYjBqbGl4emhqWE5PaUt1a1l5bTlhaktsWXNjR2wwaGtTWWZHU2RJU29HV2J2bHlnQ0tBN2VNSGlEZEFpbHN1cUZ3dEd2CitBUWlsYzhUTnNKZk5rTHg3N3UyUGhjbkdPRWFKMFdKTXhjb3dHcVV6Sk1MZ1dla0lVV1B3QmRJWjRrYUU5UzB0Uzd3ZkNDcmxySldUCitpcHlGUWIyWFRUenduSFNBUkRBYXBDTW92Mmt4cG1JenY2dW1uQW1YU09kSUJPTVo2UWd4OEhIdzhGZVk4WUowQnFXeWprRFBTMmVJCitIWHZZeEFQazNVdkkvZU5KRXhyYnk2UlRLSDlwTWFaaVl3c2w3d1V3U0RwSEVnamtWVEYyZCtlVXd3R01sODZSQVA4SGdVbzVqelB3CitVb1NQTzNaNjZ4SFNLYUpFWUsrZWV3Y3h1SWZmdWxnNmhQS1hGbU1xTmd4VEw1MGhLZGI0OVZEcVJuQUJBTzhQdTJUV1lrd3BhWlNOCitseUpVMHVQWFVrVUxMMWVFN0JjWnpzeDRSaVZQaXpFVkcwczJNK3VzQXpKZUxkY2dTK2RLWjBnQ2dWK1V6cUJVMW5FbVpzWUFHTitXCitmdHZNRkdQSXl2NTNKVUtMTVJXTFdSMVRLd2wwaW5TT2hIUy9RRHY5ZWlnUk1sR01zYUYxMGhtVXlqcEdOajZIRFBicWUzWFVhOXYrCitES0FnblNNaHA0MXVYRGhHT29UeWt4WmpLaGFHVEdabXhRRDhLVDlwWlZFNlJGU1lRUUNmTFowakNUblkzMHRuVUNycnJBMy9JSjBoCitDUVNjQTdBM3k3OVhyWnBaQVBCbjZSeEp5VEhwVWtVVkN5M0dWRHc0VSt1cnZSclF6MXRXZnh5QXc2VnpKR0RyOHc5ZHZGWTZoRkpaCit0LzZDWjU0RnNFMDZSd0pHanFsZmVKeDBpQ2dSMFdycERJa2h5dEpMWnBVZ0xjWlU1TnJhbWdNUVRaTE9rUmhpcng1R05wZUp3NTVCCit3T3A4UG0rbGN5aVZlZm04SmJCWEw3VU9KQWh5WGkxVnRCWmVQZjhPWVRMeWVSMDNxOGpwTDVXSzNLYVJXODRDWTRSMGpxUXdHNjhHCitFUVowam5TR0pERFJVOUlabEZLN01MTHhlV1Jtdjc1ZktWUEYyTWlxUjA5NnQzUUk1Ujh0eGxUMExFK1dqcEFrUXVoVk1jYldzOEhDCitBYkMxdjVQT29KVGFoWUJNRkdQRWZqVkhJcE9oWllvQVFIYUtkQVRsSHkzR1ZQUW9VOFhZamhkelJXODJNTTk2Y21JSkNHZEs1MGhDCitZTXh2cFRNb3BYYXhuSTJaTVJET21qaHhWb2wwaktpc0cyVCtCR0NIZEk0RVpXbDhveEtTa3c3Z3Nya2RVODhFVVMzREhBL3c0V0FNCitCVkFFMFJZd3Z3bmlMY3kwQ1lRMWdlVTFwcVN3NW9aSkt6ZEo1NWJVMXRaYytoWXlkVkw5YXA4NktRWnZqamlOZ1FycEhFbWdIcU16CitZMG81SWlqbDM5bHNORWt2Zi8zSVlhY0IrSlYwa0Vnc2FRblIyUHA3QUJPbG95U0M4SjVUbTl0S1Z5OXA2WkdPSXFuNnN2bkR3NTd5CitDWUcxRTVod1BKaUdFOUVRRUVhdzVhRXd5SUd4Qll3M21QQm5RN3g4YmZ2VnY1Yk83U290eHZaamJzZlVNeG5tMnd4Y0FnYXc2Ly84CitCZS8rMzB5ZzNmOXZTd1JiTE1XY2pyb05BSjRBODhPVytONlp0WjNaZU51MzI2YmhteTRnMENEcEhFbGh3Sy9aRmFKejkvMTE5OVFyCitIMjVhdWtFNmhGSnFsK2QrZXRXclZZMnRyd0U0VWpwTDNCajJIUGhTak8zeUcyU2xHQU1HYjk5V09CL0EvMG9IU2RLNGh0YlRMZkdsCitBRjBFNEJ6dXhpZ0RCdFB1a3hvSVlQQ3U0VExoTDhObTJ2MC9tYjVSMWRpNjBsanpxZWVXWGZFYmtYK0V3N1FZMjhlY3pycmJtUEZOCitBS1g5dk1Rb0FFMGdhaktnZjVyVFVmYzdFUDVqUjA5dzkyMU5TN3Nqak9vbWc4a1pHY3dEQUlqZzFaZUtaVHJYbTBOd0RvYXpzVDlGCitxWFRocHdEeWZrOE9rVGtYd0d6cEhGRmhwdDhRWmVmQno3dVdLbnBmakZYWHpDOUhlZG4xVFBpNEJVN2JWVllOU0kwMTl2R3FodGJQCitySHZncXU5SGtkRVh1bWRzTDNNN2EvOFpqTytnLzRYWS9wd0d4cXlLa3VMVGN6dnFyNHJ3dWs0eWJESzFucG90ZTFXTTdUcVUxSC9zCitXUkd0bEJlWU12RzVKR2F2bW5nWTh1czVlQ2pNL3I4d3FHcGNkRFZYbEQ3TmhEc0JuQmJocGN0QXVMMnFzZldyRVY0ejlYUm1iTGZaCitIWFgvanhsZmlPOE9WTVhnUlhNNjZxN081WEkzM2pDcC9aWDQ3aVhqOXE2YUlWek14aGxWdTNHeHA5U2JaWXEzZDlVTVFSR25TT2RJCitBaEdlbE02UU5yTTZwaDVtRUx3UHNEVmdPaFdFS2hCS2Q2MU53V3NndkFiR3kwejhDd3JwWjRlOWRkaXZXMXFXaE5LNUk5UGNGb3pkCitGcDVwbUM5aDhEa0FIVU9FSThFNEVydGVHZmN3WVIweFZqTlJWeW1IUDFtejlKck4wckhUaElBbnN6Qy93c0FwUjlVdEdQenE4dXU4CitPT2phR3Y0dDJVeXNxZGpqdkZFMWJVTTJyR3paS2gwa2FsWDFQendHRk53RklPNERycjlZM2RDNmRlMERWLzF6elBkSmhVeDllZzVrCitkbWZkRmNSb1JYTC9QVjYwRnBmUHJGLytlRUwzUzhTY3pycGFNSlpMNTBnT3I3dTV0cU5hT2tWVVppK3Z2WVNJVmtyblNJSTF3WVNaCitVNVkrSTUwakRlN3VuSEo0TndkZkpHQW1nRjd2QjJWZ000QUhEV2hKZDY3N3B4K2J0REoxQTVkUk5XMURCZzBLWjRDNUdidVdKZzNyCisvZC9tN1NETUNzT1NyNjVmMXJJeHJvdytHWFBwb3VPRGtQNGtuU01KaHZpUzU5cXY5bWFwVzFYam9uVUFWVXJuU0FvVDZwNXZ2NnBECitPa2VVcWhwYUx3RGh2d0FjbTlBdEdZVG1kZTFYL1NpaCt6a3I4OHNVNXozWWNDSXhaaVBad25TME1WZ3h1Mk5xZllMM2pKK2w5MGhICitTQlNSTjdOaUFHQW9HNGM5QTloNHkrU2x6MHFIU0lPNW5YWFg5M0N3aG9CUG93K0ZHQUFRTUl5QXl4aThxTFJZK3VxY2p2clcyY3RyCitMNGtwYXFTcUd4YlhWRFcyTGg1VVVYd056SXNBWElZK0ZXSUFRSVBBOU9uQUZOZFVOaTY2TG82Y3ZsbC8zMVZyQUdTaUk3Rmx2NzV2CitDZGxZWXJvSHNWL2puYXJHZXhwQjNJbmtDakVBSUREbWphbi80WVFFNytta1RCZGp6Q0FiMm5rQWhncmNmakRCL0hoT1IwT053TDNqCitRZGFyTDZkRElmWnIzeEVUZWJXUDRZQVlxNGl5MUdhbTcyN3ZxaGt5cDZOdUlUTitBR0I0QkpjY0JQQ1ZSTFJ5VGtmZFUzTTc2cS9LCis1L051UFgveWVWUFZ1T2pxcXNiVzN6RnhGNEFyRU0weER5TUlkSGRWVStzUGo2cGJNRGlDNjNtTUdPQlYwaW1TNE52aHo4eloyamNHCitabStPOEtsc1dEd0ZzUDhEbVU3WWh3VW1tQXR3cGxmcXVmVXdUTmk4enJvYkFGd2tHS0djWVg4eTc4R0dFd1V6UktLdHJia1VvQ3p0CitGL092Q1lUbEM2UWpKSUtRaWNGZWY4M3ZhanE2TkN4ZENlRHFtRzV4R29NWGpiN28wU2RuZHpZNE1UdFEzYlQ0dktySFQxZ0YwRUlBCitwOFp5RThZMUZVSFFOVzVHNjFHeFhOOFRCSk9KL1p5VzROWDNyWGZIdkJ3SzhYbW5OcmRGMmV4TlJOVzBlMDRtNHY4QlVDWVk0NUxLCit4dFpyQmU4dkxyUEYyTjJkVXc1bjBEZWtjeEF3eklhMmRWY3hrMTZiRG4vcmJHVGtzT0E5UW84NktkNjFyRzRzQ0dPa2N5U0JRWmtZCis3UFhIbmN0cmp5OFdpNCtBa3pnemlNOGt0Zy9ONmF5N0xmNTdIVmgxWSt1bm1QbC9BYnc3N25zeDZCeGJ3Q05qRys4NUx1NTdwWlZGCitOcHJyRURCMmRPTkNiNzV6Y3lidzVubllPelJvMjlhZXM2UlRETVNFeHZZeVdOc0ttZFZoZjRWQTN4eFQzelpTT29lVXpCWmpQVGI0CitCc0JIU09mWTdhek53emQvWFRyRWdJUityWi91aGEydlBIS1JOdzBnaW9hOGVrdDdNTVlFbVJqczlkVmRuVlBIQjZBSEFZeEw4TGFsCitZSHhuN3ZMNmYwandubStyYm16OUVnUGZSclRIbVJ6S2VJTHRxcXBia09SLzU5UXduSTFpREFBQzl1ZDc5OWx6LzdnR2dCZmRJWHVMCisyYVI2M05PRFRmK01CRjVDOWRLUk9ST21leHc4QUprc3h1WTkySEFpQ0IrU3pyRTNKdjcwM09XMTZUMjdJbVA3eFFBOGxjL25yWFNJCitxQkF5c2tRUjJIRFRsUFoxMGlGY00zZEZVMVhJOUtEVTdDZ1RmMm5POHRxUEpYblB5cVpGbjJSQXBBZ2tZQ3lDM0lQanA3ZGxwdnRjCitiNjE5NE1xMUFEWkk1MGdDR1krV0t1YnpGcUNucEdNa2lRaXAzVGRXMmRSYVM4QW5wWFBzamNFM2pybDAwZkhTT1NSa3NoaXpSZnQzCitBQUxwSFBzZ0p2cTJjNXZhZXlHZnp4dUNQMi80ZXNlZkpZb0FBTWFGMGhFUzhvUjBBTmZNNnBoNkdOdmlmUUJWaVFZaCt2YXNaWFdKCis3RHV0bkxab0lqSDlTeEwzT29qcXNGaDhvSExhb2hIQ09kekRHZG5YeWNhcjV5WmxiTjhZQXhjamhXTTI1UE9HZ0cvQ3ZlT3Rnc0NhCitHTS83ZFZmNmZva0dhTzZLcGlvUXJwTE9jUUR2R24zaHc2NW1PNkRSRno5MkdvQ01yZlgxcDYzOS9LNmFjcEF6U3hYaXhaU05RVjR2Cit0YlUxbHhyUWp3R2NKcDBGUUlreHRHQitWMDE1bkRlcHJwbGZEa3VMa2V6U3hBTTVtU3o5MThTSnMwcWtnN2lGTTdKVWtjK3FycGtmCis2Kzk3a2pMWFVSRVlXZm5vQ1NkTGgraXI2c2RPdUJhTU02Uno3QmZ6dGNmVkxSNHJIU05wbVN2R1lJdC9DOERkQngvUmw5UFd6SU9aCitNOVZGRVFEWStOTkpNU3lVVElRYkE5UFlNV3hHQm5tOXMzbms1bGtBMVVqbitBcytvUmlXZkQ3T085ank4aThRNE5KU21NbXZqeHI2CitmZWtRTGlHVG1YMWpwVHk0UE5WTklQYkdaTDE1THZZV0VaOHZuYUV2SmpTMmx6SGhTOUk1RHFLMEdIQ3N6d0FYWmFvWW05TTU1U2dHCitQaXlkNHhER2JSNjU2UWJwRUgxQjJTdkdiRkJXN3MvYWVNck9FdE13Q0hWbWJMZTVuYlV6bWZsRDBqbmVnZW52N2xqYVVCM0hwYXZxCitGb3dqWXZlV3dSQnVxbXBZZEtOMERGY1VUVWxXaWpHdmpoUXBCWjRDc25XR0k1RkoxWGx4QlhyckpnQ3lTOUlQaVcrYzBOZzJTanBGCitrakpWaklHRDZ3QTR2eVRBZ2o0cW5hRlB5Sy9ESzN2aDJSc3YvdWtXNlJCUjRldzA3M2o1bzFNZWZGRTZoQXZtTGE4OW01bStJNTNqCitBQ3B5T2Z0UHNWdzV5SDBOcmg3QlFmUzlxdnA3dkprbEdZajE5N1c4Q09CbDZSd0o4ZWI3ZDgzU2F6WURlRlk2UjVJWW5LN3hEL05ICitwQ01jR2cwcWNuaU5kSW9rWmFvWVl6ajRGbmcvaUhGR1VodlpCK3IycnBvaEFFNlJ6cEVzOW1hL0dETUlJTW1EenhQRHdPUFNHVnl3CitzTDF4bUNWcWcrd2huNGR5eGV6bHRaSHVZNnh1V3ZSdUFDMVJYak5pNVRDMmJWUk4yeERwSUk3SXl1ZjFZb0JkYTZRd0VONDhIM3ZwCit0S1BxRmd5V0R0RWJWZE1XWHdnMzlnY2ZFbE02eHV0UnlVd3hObXRaM1hrRVNrM1JZQWczUzJmb2pmS3c3Qnk0MTVreVhvUmZTMGVJCit5cHlPMmpNQUhDV2RJd21HK0ZIcERDN1lXV3EvZzJUUEV1c1BZMEJmaS9LQ2JPbnJjUCtaZDl5Zzh1SzNwVU80Z0RnenhkaFI0K3IvCis4M1RwRUZGaHBxenRHOHVWVWtrcVpyVFo4aTNTR2ZyZzlDeXRGSEQ5d1JRWlkzQzlkSVkrSVZ5eHNMMXhtSFNNUTJIWWM2UXpKSTZOCitOMi8rakVHZGRJYWtXSnVad2QwQnpWNWUrMzRuOTRudEJ4TWFaM1ZNamVRY244cUcxb3RCYUlqaVdyRWozRFMyWWZFTTZSank2REhwCitCRW14WkwzNUhqYVV1WTZLTU1iOXBZcmpwN1lkUnVCbTZSeDlZamhWL1JNR0loUEYyTzdXM1ZkSTUraWp3VHRLdzBicEVJZkU1UHlYCitVTlNLUlgvZS9ERWJid1lCaDFBc1o4cE9VNEQ5dUx0enl1RkVORXM2UjE4WU1wRjAvU0szdTRlOWd5R2VQYWErTFdQSGhmeTFiVHVECitKd0dFMGprUzRkRkxNUTZMM2p3ZmU0dUluTjlXWW5QRkpvQUdTZWZvRzc1eVFtTzd5OHZwSTVPSllxeFlMS3NISTQwSGExNHFIZUJRCitHSmxyM3JIcEl3MFBySk1PRVlVRnkrb0dBeHpKekVNSy9PNjYrdVhicEVOSTZySEJOd0NrcTBNVlkvTHM1YldYRE9RUzFZMnRsd0NZCitIRkdpcEJ3Vm1PSS9TNGVRdEdGbHkxWVFmaWVkSXhHTWk4YzB0N25aV0thUDFpMi9kaTJBemRJNWtzVHMvc3dZRXpzL250eVB3M3RvCitZNjEwaUNSa29oZ2o4RFRwRFAzQzFORFcxdXpzZnF6NVhVMUhBOGpXNFh5RTN4TDUwYnEzbS9nU3VOM0VJVUtjbVNWUCt6T25zLzQ5CitJT2VQOWRndk12VGxnZng5Q3d6bzd3dTZxYktoTlNzdlMvYUxnYXg4YnN0eld3cnZsUTRSRFdKa3I0bEgxWEYxQzQ2VURuRkFOVjA1CitnTkt4VEh0ZlRPa2N2L2VSOThVWU00aUJKdWtjL2NOSGJCNit5ZGtEQmNNd2pMVGJXUm93ZTlSSmtlRCtNdGlJY0hhYUFieER2cXNtCitCOHQzQUVobnh6YkdlK2N1cjUzU243OWEyYkI0Q2dGcEhlUVNFZTdjTlpES0pwT2Rqb29Ba1QvZng1eTlmV00yS0hWMlBEUzI3SlVMCitBS1IwMmJNV1kxNlkxem4xM1FCR1MrZm9MK3YwTHlLZktaMGdhWWJoelVPR25QN2RpaFp6ZHBvQjdHdE1XSElqQ0tkSzV4Z0lSdjltCit4d2ljMWxteFBVNnRySGdwbFRPYVVXQXltZm5jc2tmZngwekdtK2RrYjRVSW5SMFBCU2FWU3hRQkFBU01IZGZRNmsyMzBRUHh2aGhqCitvdFQrRWdJQWtidHZkUm5rN0pkUFhBaCt0TFdmdTZ6dU5MamYzandxbTI2cFcvNjBkQWdKdDNmVkRHR21mNVRPTVdDRUMyZDNUSzN2Cit5MStwYm1wdEFPSEN1Q0lsaFVCZk9YSEd2S0hTT1NTc3UvK0Rmd1R3cG5TT1pQQ0U2cnJXazZSVFJDR3dOblBGR0lHY25SbGpZRUQ3CiticVd4Z1RjdktnN0UrMklNVENsZG92aTJzMlk5T2JGRU9zVCtFTE96WHo0eENkOGFzblcxZElnb1dQTG5MZXloMGVPKzdQUHJxOUppCis2V2NCSENPZEl3b0U4N20rL0hrR1BodFhsb1FkdWJOUS9pbnBFREtJR2Z5RWRJcWtjSkR1bDhkN2RKY08reDJ5MGduekw1eDhPWDFxCitjMXNwZ0RPa2N3d0VaMkRmbU5mRjJMeUhaZ3dGa1BaenNDcHlHMGM2OTBHYTk5Q01vUXdjSjUwallYLzZ6SVdQN3BBT0VRV2lsRGExCis2WmRzTnUvWWZVN2hwNlZ6UkljTzc5TWZaL1R0enp1TlBwM1YyVEdDeWM2K01hUjNPZG5lWHJwM2J2K1ROd0FBSUFCSlJFRlUrbllBCithNlJ6Sk96NG8rb1dESllPc2EvTlczck9BRkF1bldOZytEd1gvOXRHeWV0aWpMZnZPQmVBczkwSWU4c0N6cDFoVWR5eC9ReDQvdnV6CitML0prdjlqY0IrcEhBcmhBT2tkU2lMSzVYMnhIU1hncmdNT2tjNmhJak5qWlUvRVI2UkFpc25WWSs4V2pwOXp0eFVzRUl2S20yVlV2CittWEtUYzI1dkU1Rnh0Z2xjSCtRcVRFbmFKMVlPeXV2Qk5CUDU4RXNJSnZlS01ZSnhja28rVGt4K0ZHTnNiQk9BckhSb1l4VHhDK2tRCitTWnZmVlZNTzREYnBIQ3BDaE0vNmNoWlZYeFNMUFk4Qm1WbG1ISlNVbEhoeEFEUm5zS01pSEZ5cVNBNit6TzhmOW1JOGZ5QmVGMk1FCitjdjRndnQ0ZzBOblNHZlpGbk80MXlQM2lTVnY3TEhWUkJQQ25teHFXYlpRT2tiUmlzZlFHZUxKWFRMM3RxTnkyOEhycEVFbDdjY1gxCitiM0NHbHJ5bDlIRGVkMkRLWGhNUEVGemNSMytXZElBb1dQZ3h1WElnWGhkakRQYmtqUURHTVR0MlJoQzU5d1lvYnRhYVgwbG5HS2kyCit0dWJTTEowdkJzN01vYkZ2eTNmVjVBQjhYanFIaWg0emZ6Nkw1NDRSWldtcElqWHRicnFRYXRhVXB2NTUyUStPall1WTRFblhaQ0p2Cit4dlA3NVcweE5tZFozVGdBUjBubmlFajVEMVkyT2ZOdmFXdHJEZ0NjSXAwallhL01iRmoyc25TSWdkbzhjdk5rWkdrZlVhWUdjYnNjCitHNWIrRFR4NUFLdDNHRjlkOGNybDBpR1NsNmw5bjhPM2I3VTEwaUVHYXYxOUxTOENlRTA2UjhKT1JYT2JNMzBLcXVvWEhvM1VOKzk0CisyOUZWZFF1OGZhNTVXNHl4SWE4Mit4V0xQZFhTR2ZaNDg3QzNqb2MvSC9EZStxVjBnQ2d3OC91bE15U0pZTE0waUFNQUdFWkcyNkJuCitBeU43UDErTGJMMVVDUkg2OFQzTmZqdzMrNkJpL0RiclRwZHBDcXFsSTBTSmN6bXZ4dlY3ODdZWUk3QlhNemVNb0ZJNnd4NEI4YnVrCitNeVNOUENqRzh2bThBVEJET2tlQ3RxN1BGWitTRHBHa2VaME5GN0EzRzdiM3hUdjcrQmY2K3VkVGdzK3ZibHpvOWY2SmZSMzU2dWJmCitBTHhkT2tkU0NQUSs3UHErVGplaTFEODMreXFFZFdaOFJPQXE2UXhSTXA2TjYvZVcvZy83Z1hseGt2MGVodXdJNlF4N1dJUFRwRE1rCit6VEtuL3FGeXpFVVBYUWpnYU9rY3lhSEg4NU5XRnFWVEpNbUNQVHBYN0IyMjllMlBleng0WitQenova2RWcTJhV1FBb000Yy9BemltCis2ckVUVXY5U2hZSE03UnRqUzg2TWp4ZzBVanBEbEpqcFJPa01jZkc1R0R0Wk9rQ1VtR21ZZElZOUNPVE1tNStrbUtBazljVll3SUVmCitTMTk2aWNrK0xKMGhTWE5YTkZYQjQyV29CT3BqY1dXOE9LQjlmNWh3dWMvN0ovYVBNdlY1aGtINlA4dkdwdjY1MlZmazBNb2hBcHdaCitOMGJFcTBtV3ZYbFpqTzFlam5XOGRJNG91ZlNoSXM3Y3pOakdHeWUzUHk4ZFlxQ1krSDNTR1JMRi9JaDBoQ1JaVy93NGZENC9qdnMyCiswMFY5L1BNcEV5Q1grNmgwaUVSeHRsNnVNT015NlF3RDlmejlWejBIWUpOMGpvUTVVNHd4MFZEcERCRTcwWXZsdS92aDVUOXE5TVUvCitId1hBcjhNeEhmbFFmZXVSQ3lvWUdDK2RJMkcvSkVyM29hUHpIcWcvQTRBN0c0dmpaeG5aYVd0L2UxZk5FQUp1a3M0UkorN2pNa1ZyCisranFUbGpLTW0wZlZ0QTJSanBFVUt1OTVCSUNWenBFVUFvNGZPKzJlbEwvNEpBWm5icW5pY2NkT3YzZVFkSWpkbkhtSkg1R0tDWStmCitjcmgwaURoNFdZeXh5UjBoblNFR1RyUWpQMnpya0ZNQk9OTzZOU0dwZjVqWWdGUC9scldQZmplenR2TXQ2UkJKS1N1V2ZRakFjT2tjCitjV0xDbTMzNTgyVFo5OE8raHc4YWxKMURvTmYrK0laTkFQNGduU05KeG5yUVZaSFMzL3lxajRLYzNlekVOaGtDKzFhTW9RYzlvNlF6Cit4TUhMWWl5d09GSTZRK1NZblpnWnMyU2NtWUpQQ3Z2eE1QbUFkSUFrRWZDUWRJYWs1UE41dytDUFMrZUlHekd2N2N1Zlo4T3BYMXA4CitLTXo4U1YrWDdld1BaVzNmR0NqOXhSZzQ5Uzh6KzhxRWJqVHhZUDlteG1CZ3RCaExDN2JXdTVreFpqYytWQm5jTDRiQW1GUS9USFlmCitnSDY2ZEk0a01mT2owaG1TY3V5RkQxOEt3TnN1VTNzUW1iVjkrZk5zelhNeFJYRUdBY2RYUG43Q05Pa2NTYkhJMXI0eEFPK3VibGhjCitMUjFpUUV6Z3c4dk1QbUZ5WmQrWUd5L3hvMlJCV295bEJSTjVWNHlCM0RoazJSSm5yUmpiOHNML252OW42UkFEd1lHL0hmWU9pRFAwCitCcDBvRTRjQUY0cTB1azkvZ2ZyNDUxT0tNblFJdExVMlUwMTVBQkFvM1V2TTF3MHlmMEtmajZWSU40WWpIUldaL09xZEFNQVEvQnZmCit3OU5pREV5dWJKNk1Vb2wwQUFBZ1pHdG1qRUMveWVmenFkNDBUa3lwZnBqM3c4czMxeS8zZmxZRTJOV1loWUJKMGpsaVIzanpJdzBQCityT3ZMWDNsaDZRZWZCWkNGZllPVHg5WGZjNFowaUNTc1gzYnRHZ0N2U3VkSUVpUGxYUldYdElSZy9FWTZScElJYml4VEJLRk1Pa0xVCitHT3pqK043VFlneld1MTlBa0h3eE5yK3JaamlBWTZWekpJbFRmdGp6bk00cFJ3RzRVRHBIb2hpWm1SWGpYR1ptUlg3Vjk0Nm14QUIrCitIVXNheDRRQlorWDNBS0FNelhydmN2R0V4clowTDgwaVN2Vnp0QitPcmI1c3Znc05sYndiQzVPSC95YkExMktNcUZRNlF1Ull2aGdyCisyTkpUcERNa2pVeTZtM2N3NTJZZ2E5MHZNekpZbTkvVmREUXpYeW1kSXhtOHNsOS9pNmtyNGlCT0l1WXJ4ODFvUFVvNlJ5SXlkbjRnCitnS0RBaFJuU0lRYUNLTjB2TmZ1RGQ1YUpkMVJrRHdzWGF6MGMzOFBYWXN6RFgwQTRzRXpSaEp5NVlzd2dlRUk2dzBBWXp0NStNYzVJCitNVllzaExmQ3orKzZkekFJT3Z2M04zbEZ0RW1jVmNaRnpzUWgwSlM5Smg0QW1WUXZWU3pDUGltZElYbnk0eVVDZS9kOElJSVdZMm5oCis0OXNBd0lWZlFDUCtwaWRoVzRkc0hQSzBkSWorbXZmUWpLRk1HZGhQOU5kMkROODQxUHY5Q2Q5dGJ5d0Q4UzNTT1JLeXBUaDhRNzhHCitjOC92UE9ZeEFKc2p6dU1rWnJxMXVtYStFNDJlNG5UNGE5dFdBZXozZ2Q3dndMVW56cGlYMnM1NDZ3ZVgvaDRaYStJQklnZkdTK1RoCitXTmkvQWhQd3RCZ2pINWNwT2pBenhpVC9waWRSaEYrMnRDd0pwV1AwVjdoejV6VEFqUzZjQ2ZwRlM4dVNIdWtRY1J0VUVsNE5JQlBMCiswZ2pVTmZQc1ZZVisvZVdWazRvQS9XL0VrVncxaWl2S3I1SU9FYmRWcTJZV2lHaVZkSTZFbGUwb1ZqUktoK2kzSlMwaGdGUWZFZE4zCitUb3lYUEJ3TCsxaGdlbHFNZ1ZtOGNJbUJBLzhtZHVCTlQzTElVcXFYVmhEUUlwMGhjUmxZb3NnTTRpeTFNd2YzYzRuaUxreDJRSDgvCitYZmlUQUpOMGlyaFpaS2RKeng3RUtmOCtKMDcxa3YrK2MyRm16TDlaSkNZdngvZWVGbU5FUHY2N1JOOXczTjVWTXdTZ1Nza01TV1BECit2NURPMEYvekhwb3hGSXdHNlJ4SlkrS0hwRFBFYmU2S3VxbUFLNGVLeG84d3NHS0tLY2pLdmpFQU9MMnk0WjdKMGlIaWw4RjlZK0RHCitVVFZ0UTZSVDlCZFp5bGd4aGlyNW41ZC9zMGlHeWN1WFRUNFdMVjVpNFpteGtyRDhaQUJlZmdnT2hJcnBYUXJETzdxbkEvRHV3TWRECitzTVVkSlk5Smg0Z2JNMzlTT2tPQ1hyaTV0dk1QQTdyQS9SOWNEV0I5UkhtY1I0WS9MWjBoYmpZc2ZRUkFxczkvN0RzYU5MaThjS2wwCitpdjRxNWpqVkswMzZnU29HRjA0VXUzdE5WdzRlZGxKbVppL3JGaS8vVVQ3K3NFaTRHRE93THF4L1R0TEdHK3VYUFNNZG9yOFluTzRsCitMZjN6MjFzdnZmOU42UkJ4bXQwNTVRUUNwWGZ2U0Y4eC9tZmdGeUVHODA4R2ZwMlVZRFJWMTdXZUpCMGpUdXVYdFd3a1lMVjBqcVN4CitNYzNTR2Zwci9YMVhyUUh3aG5TT1JMRVJHemNkVmZxQ2Q3TmlQdk91YUFFQThuUE52UEE2Mld6dEYyUGd5YjRmTXV1R2VRL05HQXFnCitYanBINGhqZU4yb2dEajRGVDcrMzk0dE1CTVVZd0lqbU9pbEJuTU1ucEVQRWpabTkvN3kvQTNQVGhNYUZ3NlJqOUE4eElkM25kdmFaCitsUnMzbFpVRUhqYnZBR0IwbVdKcUVCa2ZmMWk1ZkQ0djl2TmlVS1pteGdoSTdmcDJ1MzNIKzVDOUxvcUF3YytsSThUcCsvZE5Hd0hnCitPdWtjQ1hyanhkek9TUFlBUGo4MFdBbmc5U2l1bFFyTUh4bzk1ZTdEcFdQRWljaDQvWGsvZ1BJaW0yblNJZnFMa2ExOVkwUVFLOFpLCitiVWxPNnQ2eFlpOG5XL3dzeHRqNitjTTY1WlRWY2g4dVJxYUtNYVQ0b1VHVTNxVXNBOEJBNlBYZ3JLU3NNQlBBWU9rY2lXSDhPRDlwCitaVEdTYSsxcXJYMXZKTmRLQlJvVWxPWnVrazRSS3dwK0poMUJBaFBTKy8zT3lOcStNYkZ4VThGMisxbU1lZHE3d010aXpGY2JSbTBRCittWGFlMzFWVERxQmE0dDVTaXFhUXlvZkd3dmJHWVF5dWs4NGg0T21icDY1NFZUcEVYUEpkTlRrQXQwcm5TQklSUmJxMGtCSEYvclAwCitJTkFuSms2YzVXVWJhQUJZMjk3eUNnTi9sczRob0RHdFN4V0xGS2IySldjL0hUZWhzVjFrNzFhT2MxNFdZMHk2VERFOXlNL0t1YXk3CitUS1FZczkxbEo4TERyandIOGZKSHB6ejRvblNJL3RpUks4NUFGcGNvd3UvOVlzZUdwWDhEWUt4MGpnUnRDWExka2Jha056dTZPd0JzCitqZkthamh2OXhxZ2hsMHVIaUJOUlpnNzAzbHQ1Z1lKVWRsVjhjZWsxNndHOExKMGpRY0ZPMm5pQ3hJMUQ0K2VZelhqWW9BL3d0QmhqCitQeHQ0b0VBczhxYkQ1dGpyemx6N2tkcnp4VUQwUWVrSUVwajhMc1lNWitlUTU5M2FiNWkwY21lVUYxeTc4b2FkeEdpUDhwcXVZNkxQCitTbWVJRTFuMmVtbnlnYkJON3dIUWhHd3RWVFFjaUxTM0wrYXN0N1BpUHZLeUdQTlZybFNxT3c2THZObVJ3aWw5V016cW1Ib1lnRnJwCitIQktZcmJlRHNybkxheTlpNER6cEhJbWl1SllVY3FhV0tnSTR1MnJhNGd1bFE4U0ZiZEhybHpBSFFzVDFhVjJxeU9CTUxWVWtzRWd4CitGbkRnNXpKRmJlQ1JIc1RrNTJHUVBhSE1tdzRtdVlNTEJRVE1xWndaQzhoY0JpQ0xaNHM4TjdPMjgzbnBFTEVoOHY0UTMzMTBWL1FFCitTK080OExhZEpmY0JpSFRHelhuVzMwT2cxeTIvN2prR1hwRE9JYUM4aDgwTTZSRDlRWlRlNWxqOVFZRE1Na1V1K2xtTUdSTktaNGlECitsOFVZaUwwc3hreUowWm14K0hITzJGWFNJZnFER1g4am5VR0l0N05pZHl4dHFHYmdNdWtjU1NMUXNtdWFsbTZPNDlvYlZyWnNKV0I1CitITmQyMlB1ckd4WlhTNGVJQzNtK1gvUkFURXE3S2hhNkMwOEE2VHpEc3o4WTBKbXhDQkd6bDc4N2ZoWmpuczZNaFpEWk04YkkxTXpZCitNOWRQWGZHR2RJaSttdDlWTXh4QUZyc29BaDd2Rjh2bDdDZVJyZVk1WU9MV2VHL0FpMk85dm5zQ0JudDdDRFFSUlhJV1hkb3dVRDkrCithdHRoMGpuNjZzVVYxNzhCNERucEhBa1NHVDlaRHIwc3hzRFFtYkcwSUlLWHhaZ0p3OFJueG1ZOVVIOE1BYWxjbTk0LzZWeENVU3lXCit2UitBME15cHJOQ3lsOFhZdklkbURBVndnM1NPaEcwckMzRmZuRGZvS1JuMlUyU3JxeUpBdURtTkEvZmVzQng2K2ZudmhiSmlTZUY5CiswaUg2STJQN3hvWWZWN2ZneUtSdmFvTEF5d1llYkxRWVN3M0xmaFpqTU1sL3VNallMQzFSQktYMElVSE1xVnl5RW9GWFBsTFg0ZVZaCitRK0hPSFRjRDhISUFmU0FNL3UvcjZwZHZpL01lTDkwN2ZUc0lQNDd6SGc0YVdpd3RmRWc2UkJ5ZVgzcjFId0M4SnAxREFzR2s4bnVmCitVdnJTczc5NnFDVHgyVEhEMXN1Wk1WOTdRbmhaalBrNk00WXcrVmFsWkRLMVJCRWhiT29lRXZPN2FvWXpZWXAwRGlFL2t3NFFoN2EyCis1b0NZUGlhZEkzR0drbGxDYURPM1ZCSEU5Q2swdDNtNDVKVVlHVjJxQ0hCZDViUkZJNlJUOUpXaGRMNzA3QzhUSk45UjBUSjVXWXlCCityWmZqZXkrTE1aQ2ZsVE1aaVFZZW1XcmVFVlpZOHl2cEVIMVZERXN2UjBhWEtJTDlQR2RvOC9CTkh3QXdYanBId2phOFpIbzZrcmpSCitFUnUyZGdCNFBZbDdPYVM2YWx2UnkyWXdESnZWcFlxbGhpbDFQOU90MjB0K0NmaTUzR3kvT1BsaWpNblR2Y2FlanUvOUxNWXMrL2toCit0d0tIK0dXcnJmM3Y0MTRpRlF2bWE2UWpTTEhrNTM0eE52UUY2UXlKSTJyTFQxcFpUT0pXcTFiTkxBQzBKSWw3dVlTWXZmeTlJalplCitmZy8wQmpOUzkvMi9ZV1hMVmdCL2xNNlJGQkpvZ2tac3ZKd1pJL2k1OHMzTFlvd01lZG42a3NsSWJNZzhTZUNlTWhpcE8xOXNWc2ZVCitTb0RlSzUxRHlCc3ZQM3p4YXVrUVVadTN2TFlPakluU09aSkcxaWE2ZE5CYVpHNnBJb1BPcVd4WTdOMlM1blhuUGYwYkFLbnJnaHVSCittdVBxRm8rVkR0RlhuS0h6eGxqZ3JESEw3R2NERCsybW1DTFd6eCtXWlp2b1VyUzJ0dVpTQU5WSjNsTVNnNTZVenRCWEFabXI0ZXZuCisrRkFZWGZsODNydTNaRGFEczJKRVdIdGpiY2NqU2Q3emhXVlhQQVN3djRlRkh3Q1IvVHZwREpIYjlUMlExZGt4RXhxK1dqcEVYNUhOCisxTDZ4OFJNbnprcTBPREsrSG9sQ2ZwNVI1K1Vnem5wNjZETVNuaG5iTkhKak5RQXZwN3IzaDRQMHpZeXhSZW9ld3BFaFBDZ2RJV3B6CitWOVNmQzhaazZSeEpZMUFySmY2UUpTYVl6TTJPQVRTbHVuSGgrZElwb3NaTUs2VXpTR0hDdGRJWitzcW1zRm5XQUpTOGR1UmhsVW5lCitrTWpQZmVUazZWNURMNHN4WHc5OXBvUm54c0EwTHRIN3llb2U4Y2F3MzBtSDZJczV5K29tZ25DcWRBNDVkcVYwZ3FoWnkvN05XdlNDCis1ZkFla1J1VGxibXZNS2JnODlJWm9zWUJlZmR5cGc5T3FhcS81eXpwRUgxUlJpTi9DNkJIT2tkU2NzQnhTZDdQZWxxTVdVKzdwWHRaCitqSkduTTJORWxPaUhpMkN5MU0zdER5MHRTMUwxWUtDQVV2YzJORUl2M3pTMTA2c040SE02cHA1TXdBenBIQUtlbWxuYitaVEVqZGUyCitYLzFyQUwrWHVMY281c3VxcHQxenNuU01LTDF3L3dkWEk2UG5qUUVBRzV1cTU4R2FwVTNkeUZBVER5Wk9kRHhGREMvM2pPazVZeW5DCit4S2thVlBlVzVXU0xNYzVRYTIwR2l3d0creXZmVlpOajVpdWtjd2pxU241Wlc5ek0vNEduMzhrSFIzY0pCNUMrdndURDFucTJONUdZCitHQ3VsVTBnaDRFclVkS1Z0VzBHcW5yc0R3VWk0R1BOMFpvelp6OWxVTHgvOFpORXRuU0VXbEd4M0hLSmtwOVVsRVNoVkQ0VXh4Yko2CitBRWRKNTVCQ3pGM1NHYUkwNzhHR0V3RmNKWjFEUUU5UU1Jc2tBeFJ5dUJ2dzlKbHhFQVJjNDl2c0dBeDU5YjNRUjBkVlZieGFLeDJpCitMNGlScXEwQkE4SklkTnVIaFMxTDhuNkpJYnRUT2tJYy9DekdpSFpJWjRnRDZjeFliSWpTVll3eE9GVkxVcUlXQmptdkJsMDJETCtHCitERFhMK1F2KzhZZWJsbTZRVFBEU3ZWZTlEcUw3SlRNSUNXRHRsNlZEUklsczBhdnZoVDZqZEMxVlpFN1hjM2RnRXA0WnM4bU9GeE5ECiswR0lzTFJoKy9yREljTUlOUEpKOWt5T0pBNU9hTjNRTDJ4dUhBWmd1blVQUUN6T25MSDFHT2tSVVpuYzJuQVBRKzZWelNEQ01lZElaCitBQURXdXBFamVaZFhOeTArVHpwRVZKNTc0TnFuQWJ3b25VTU00N0x4VTlzT2s0N1JXMEZwa0tGaWpKSmRhZVRwTWtVd3ZKeHM4YklZCitBOGpMWW93NXVRL1hYZTJOb3dnWWx0VDloRzI2cVdacGFoN2dPMHJzNVFBR1NlY1F3MzYxdENmbXJ3TWc2UndDWGhpNmFmZ0s2UkFBCitzTzc4UHorUXhUUEhBQkNZdnlJZElsS0VMTStPVmRoY0lUVXZkcDY5dC9rRkFKdWtjeVRrc0RIMWJTT1R1aGtsdkswbFFWNk83NzBzCit4cGpZeThvWlNLNDdUaUVJTTdORUVjQlRhV29Ha2ZVbGltVDhHV3pONmF5ckJYaUtkQTRoODFwYWxyaHhaa3crYndGenQzUU1DUXpVCitWallzOXVkM2tETzlid3hNYWVxeVN3elFhdWtVU2FFRXgxWE15WjVMbXhqeWM3TEZ5MkxNZUZvNUE4bk5qSm1FMjdCS29oUjFkSnJWCitNYldTZ0V1a2MwZ0syWG94MkdJR2dmbWZwSE1Jc1JaMnZuU0l2eElXNWdOK25tRnpTSWEvQnJBZnM3Tmh3WXZ2aHdHb0dUKzlMZEVECitoZ2VDWVZQei9CMm9nSk5zaXBid3ViUUpZYXZGV0dwWXRsN09qQ1Y2emhoUlpvb3hSbm82T2hITUorRHA1N2FYbnBsWjIrbkZjcks1CitLK291QitnYzZSd3lxTU8xbitPNjVkYzlCL0pyQ1d4dkVlUGNxb2JXMUN4dk81aGRQMGQ2VGpxSElCTVdDNStRRHRGYlJPblpyejFnCitDYjdrOXJXMWZVNW54bEtFL2Z4aE1TZmF3Q00xYjlZR3loQ2w0dURKV1IxVER3TndpM1FPVWVUSEVxUnZQWEpCQlJqL0lwMURDckdiCitEVFBJc3BPNUVrSDB6ZXFhK2VYU01TTGgyZEVYZlVlM3BLYVJCL01mcENNa3hUSW5OcTZ5Q2ZZWVNCU0ZYbzd2dlN6RzJOTmlERVNKCityUUVteHRpazdpV3RwNUNPdDZqRXdVY3kxRlJsLzZ6MVl1Wml5UFloL3dmSVRyZlNmYnl4dlpqN3FYU0kvUms4dE9TL0Fid3VuVVBJCitlRnRlN3NWQjBFeTBVanFEc0dGaHJwaUtGM2NXWnAxMGhxUVF6SmprN3VWbmEvdWk5Yk1uaEpmRldNN1hZaXpCbVRFbWpFN3FYc0tLCityNWJ2WEM4ZDRsRGEycHBMaWZnMjZSekMyRnF6VWpyRVFOM1ZPWFU4TWYydGRBNHBEQ3k0cldtcGs0Y3NyMTdTMGtQRXJkSTVwQkR4CitGNnJxRnFUK0pZRTFnUmN2YlFhRThNbFRtOXVjSDVBZitkcGJ6d053bzVGUDdEaXhZZ3pzWnpkRk5uNzJoUEN5R0F0elJTOHJaMHAyCisyam01THcxQlJGaWZuN1N5S0ozalVEYVBlT3NhQU1kSzV4QzJlbWJEc3BlbFF3eFV5T1k3QVB4WUR0WVBPUXJtU21jNG1DTFk2WHd4CitxNkFnOSsvU0lRWnEvWDB0THdMSXpQSzNBeGk5YlZ2eGF1a1FoN0pxMWN3Q0F5OUo1MGhJWXVNcTluVFBHSXlma3kxZUZtT0d5cHg4Cis2enBnbEV4cit3WEw2Z1lEU093OERFbHMzWDhJekhweVlna0RYNVRPSVkyQkR1a01Belc3WTJvOWdFdWxjMGhob092RFU1ZitYanJICit3YXh2ditZcEl2eGNPb2NVQm1aVTFTK2VKcDFqb0lnNDlkOFhBOFdNZjBqRDdCZ0lxWC9KMWt0SGpHbHVxMGppUnI0dVV5enJNVnFNCitwWVhwNXUzU0dlTEFRRmtTOTlrWmhGbFpvZ2dZdkNFZDRWQm80eEUzQXNoTWQ4c0RJZVpPNlF3RE1iK3JwcHhndmkrZFF4YmRMcDJnCitOeXp3UGVrTW9neC9KKzNOUEN5MEdBTlF2VzFMOFFicEVJZEN3QWJwREluWjNKM00rTXJUbWJFZFpicG5MRFUyRGQrMFZUcERQSkpwCis0R0dzeVV6ekRsaThKaDNoWUhZTjREbnpzMklBZW5wS0N2OHJIV0lnaXNYU0x5RGJSZlVMTCtXNmZ5SWRvamVlMzM3TWZ3TndmaTlwCitqSTdqaXRMUFM0Y1lpSXBjOTg4QUZLUnpTR1BDUHlRMUc5TmZ6TmxwbXBPalhDSkxGUlBlMXBLWVFjWGhXNlF6eE1ITFl1d3pGejY2CitBNER6KzRENmlwRk1BdzhtazVtWk1TYThLWjNoWUFwaHlhMmdiT3pmT3poKzVHT1RWcWIySmN0ZG5WUEhBL0NpVTEyL01kK1podjJaCitBSUNWazRvQXo1YU9JWXYrTHMzTlBKNys2WTFiR0hoVU9vY0RqczF0Q1Q4aUhlSmdpTjFmb1JJVm0xQVRENGFYeFZoaHpkSW1MN2NoCitlVm1NQVFBSTNsWFBKcUdaTVlBek16Tm00RzVubnR1N2FvWVFVN1lIOEh0d2V2ZUxNWU5DYSs0RTRQVGI2WmgxRjVsUzFSaWpCQ1YzCitBdkR5d2Q5TEZUQzVlUUNUZEpEK0lxUjdhWE5VbVBqL25qaGozbERwSEFmQ0dmcWNHWlBZc1VFK0ZtT2JwUVBFeGQ5aWpObTdIeHJECitKckpuakxMVXRZL0oyV1VzcGNYU1R3STRVanFIQ3lnd3FSMVV6ZXVvdlJHRVd1a2N3djd6by9YTG5WNFN2SzgxUzFzMkFQZ3Y2UnlpCitDSk9xR2xvL0xCMmp2MGozamUxeHhNNUNoYk5Ib3hqRFBkSVprc0tXazFwNTVHTnJlKzhtV2Zid3R4Z0RlZmhEUzJabWpKR1pNOFlBCit3MDRXWTkrL2I5b0lBSitUenVHSWpjUGVHTFpLT2tSLzNMRmk4bWdtK2xmcEhOS1lUQ29iWWhCc0tuTkhpdWhmeDlZdVR1VUx1clZECitTcDhBc0VrNmh5TStWemx0MFFqcEVQdkRqTXdVWXlCS2FuemwzY3dZYVRHV1N0NzkwSkxhTXdiZ3FJVHVJNDR0T2ZrUXlKVVdQZzlnCit1SFFPSnpBZWJHbFprc3BEUVFPYit4NkF3NlJ6Q0h2c2xxa1BQQ0Vkb2ovV0xyM21NUUtuTW51RWhwdVNsTzZmVzlJU0F1aVNqdUdJCis0V1RwczlJaDlzdmhGU3FSNDRSV3UzallUWkZCM3ExNDI4UGJZb3c5TE1hUzJ6T0dVUW5kUnh5VGU4c2o3bXB2SEVXRWowdm5jSVpKCis1MzZ4dVIzMVZ4RndtWFFPYVV3cGJ4UFA2V2pISHl2R3RPckd4UitVanRFZnVsVHhyM3hxM0l4VzUxNjJNaWd6ZThhWUVocGZlZGxOCiswV294bGpiRS9tMzBTM0JtTERQN2xJeUR4Wmd0dFY4RTRPeG02OFNGNlN2R1puWFZITUhnYjB2bmNNQ0duVDFCcXZkZDVXajRQWURiCitSMkFrZ2NIZk82NXVRZXFlRFVWclUvZjlFYVBCdGdkL0t4MWlYOFprWjVraUpUZSs4cTRZSS9aeCs5RXUzaFpqSVBid2gwYXhOL0Q0CitibnRqR1RKVUNEQWJweDRDYzdvYXh6RHpUT2tjRG5ubTV2cmx6MG1INkt1Z1VQb2Z5TkJMalFNaFlOWnRUVXRUL2RaN3pkS21ibWJNCitrODdoZ0NPS1FaQzZGd3pybDEyN0JrU3ArdzZKRGVIV01aZTJPYlV2UEZON3hvQmhwemEzSlZFb2VWZU1zZEZpTEhXSWpJY3pZeGdVCis5ejBxS3JLelJCRUFtQzFMWjlnYkY4TC9CNkJjT29jNzByZkVhUGJ5MmhsTXVFSTZod09LbkF0bVNZZUlRcTRrZHljOFBMdXk3K2lxCit5cWFGbDBxbjZEUFdGdmQ3S1EvQzhJdlNJZlpHeEU0OWgyTkdiKzFJWkp3ViszZ3hhY3crVHJMczRtMHhCZzkvYUFRTWp2c2UxdHBNCit2YzAzUk01OEJ1N3VuSEk0RWE2VHp1R1dJRlhGMlB5dW11RkVkSWQwRGtmODZPWkpTOWRMaDRqQ3MvZTJQQS9neDlJNVhFQnM3aHcvCit0UzFWVFdtWTAvZFNKMTcyK2pIMWJTT2xVK3pCVEtrOXk2NC9jcllRY3pIR0JBK0xNYVBuaktXUWw4c1VFY3p2cW9sMTFvUnNtSzJaCitNWUl6RDRGdW03c0oyVDRZZUY5aExyZnpRZWtRZlJHR1pkOUdsczdwT3dqRDdGVkxmOUlqQ3ZZWUhaWVV2eVVkb2k4c2w2d0FrTXFPCityUEdnUVFFVmI1Uk84VFppZjhlaSswRWN4UHJTKzlqcDkxWEF3L0U5ZTNsazFTN2UvYkQyWUU4MytvWGRaYkcrN1NBRXpuVmFpaE5aCitkcUlZYTJ0ckRvemhqMGpuY014ak4weGFtWm96Z21ZdnI1M0J6QitTenVFQ0JycHVyT3Q0VWpwSGxOYTJYL2s0RVg0dW5jTVJINjVxCitXUFFCNlJDOXRYNVp5MFlBWHYwK0RoamhZMmh1QzZSakFBQnp0b294aTNoZmVnOHE3b2g5RlpVRTFtNktLZVRoTWtVQU1NVHhmc2c0CitXM3ZHTEJrbmlyRzNSbXg1SHpPcXBYTTRacWwwZ042YTFWVnpCQkY1c1Q4cUN1VFpyTmdlbHZGTjZRek9JTG96VGQwVm1TazEzeWNKCitxYXJlV3B3dUhRSUFEQmwveDZMN1FhQll4MWxGRHIwc3hveW5reXlBeDhVWWU3cTJORFIyU0t3M0lENGkxdXU3aGppcHM5c09pbUgxCitYTEY5V1R3Z0hhRzNnbUxwblFDT2xzN2hBZ2IvL3FiYURpOEh2cytmOTZmN0FmeEJPb2NqUm9XNWt0U2NJUmV3OWZKM2NpQVkrSVIwCitCZ0JndGpucERFbmltSXN4eXpHL3RCZGlqZFZpTEcwQ1k3ejhvUm1tdUQ5a3ptenFUWUlCeERlaTM5WFplQW9CazZSek9PYlZGeCs5Cis4RmZTSVhwamRtZmQxUXhjTHAzREZRYjBiMFR3c3p0YVBtOUJTTlYrcVRneGMzTjFRK3VWMGpsNjQ3a0wvdndrZ0EzU09Sd3pxYkp4Cis0U25TSVFBU2Z3NG5pV0ZqSFdjRjhMTVlNK3pudUI3d3VCaXpJZnM1TXhaL1I4Vk1mU2xhUzhPbE00U3dWMHRuY05DeWZENXZwVU1jCit5aDBySm84bTREK2tjemprNWUyRllKRjBpRGlWOFBBZkFuaEZPb2NybVBDOXNiV0wzVzlhczZ1UVhpWWR3ekZFTUZkSmh3QlkvRG1jCitKS0o0aTArYmk3L3p0Z1FHZVRtdUJ6d3V4a0x5c3hoRFFMRTI4R0JnUkp6WGR3L0xGNS9NTGRJUm5FTm9sNDV3S015Z2tqQTNCNXkxCit6OHhCZlRmdGh6d2Z5cHFsVGQwQVVyTThMd0VqZ3h6L1lIYzdiYmN4cDJicGM0TGt6MFJrK1plaWllSjRpMCsyRk85MkZpRnM3RnZTCitHZUxpYlRGV1dzeWxwZ3RiWHhCaldLelhSN3pYZHcwWkVsMldPV3RGL1ZrQUpraG1jRkJJUlhMK1hLQTVIZlV6bWRBb25jTWhXd3ZkCitKWmxvWWhMYTNCMEF0a3JuY0FVRHRaV05yVGRMNXppVVFvNldBWEIreGoxaHgxVTFMajRmL05RYUFBQWdBRWxFUVZSVE5BRmw3SVVXCit4enN6UmtSRDQ3eStsSEJuVVl1eHRDa2MrWnFYeFJnNDlqMWRHWHREWmFzbGIwOGhQaWg1ZnljeEhyK3BZZGxHNlJnSE0yZFozVGdpCisvaGZwSEM1aFlNNnRsOTcvcG5TT0pLeGYxcktSaU8rU3p1RVNBbjFyVFAwUG5YNng5Tks5VjczT3BDM3U5OFVrdlRxRHg4bmVQMkVVCis4emlMNDkyVEpvUmZIRm5oNTdnZUhoZGpNODllVlFDd1RUcEhETFFZaXhTZElIcDNZbTM4c0E4bXQxdmE1L041Z3dBL0FPRGwyOGQrCitLaHFUKzQ1MGlFUlo4MjBBUmVrWURoa2NtTndQWERtNzZrQU0yT252RndrRStxRHNNbE55dW9pUFFhd3pZd3paRlQ4eDJZSWxMZDRlCiszTzV0TWJhYmYxVTBjZHpUK2ZKN3FKSjEyS3l1R3BGMi9yT1cxWjBINERpSmU3dU1yTnZGMkppTEgvNGNHTytWenVHWXRwdW10SytUCitEcEdrdFE5Y3VaYkJQNUxPNFJhK3FHcHIrR25wRkFkbm5QNStFY0U4Ym16VFBSTWxibDNkMUhZME1yWTlBdkcvOVBadzJTZjdONTdmCitpOS9GR0h0WWpNVzRUSEhXa3hOTEFGVEVkWDFYa1MwVm1SMGpnNytSdUsvalhuTzVwZjNjWlhXbk1kT1hwWE80eGhyNk4ra01FcGlNCitsNGRiRHd4L3BiSys5VlRwRkFleTl0eW5uNEMydUgrSGdMbFo0cjVoR0I0dmNWOWhnMUhURmQvWmF1UmZReFFDZWJ0ZkRQQzlHQ1AvCitpakVHeGZmR1k4dlFyTTJLQVFBTTg3c2s3a3ZBZEluN3VvekJ6cmEwYjJ0ckxtV0R1d0dVU1dkeFRPZk1LY3QrS1IxQ3dndnRWejRKCis4QXJwSEk0cEo4TUxKazZjVlNJZFpMOTJmYjhzbDQ3aEdoWjZIZ1hHbmlaeFgybWpnK2RqRzI4Wlp2K1dLWG80bnQrYjM4VVk0TjFtCitjcUw0WnNhNFVPTGgxSFl2TUNXK1BHUE9zcnB4QUU1TStyN09JM0sycGYxYkk5NzZFb0N6cEhPNGhwbS9LcDFCbE1FL1NVZHdENTMxCisrcEhEOHRJcERrejNqZTNIeVpYVEZvMVArcVlNT2p2cGU3b2dLTS9GVm94eC9MMEZrc2YramVmMzVuc3g1dCswWm96TEZBT21ySzNiCitCZ0F3Q1F5d2lac1N2NmY3d2pLRVRyYTBuOU5aL3g0QW41Zk80Um9DUFhSTFhjZlBwSE5JV25mLzFWMEFQU3lkd3ozOGhiSDFpOThqCituV0ovdE1YOS9sRklEUUszbFcyckw0U0tRWnhMQ2IxN3NjN00vbzNuOStKM01VYms0N1RtcU5pdWJFdzJ1OE14M3ZYZDlzWmtsNTRSCithVEcyTDhiajEwOWQ4WVowakgwdGJHOGNSdUFGQUp6dUVpZkJJc3oyck5qYlNHZkgzaWt3aGhkTWFGem8zRXUrbCs2OTZuV0FmaUdkCit3emtHaVQ2WEpqUzJsd0Z3ZG45aG5NallPTWRiOFkwVHBaRFJZaXl0aU5uSGFjMGo0eW9jQ0R3NGp1dW1RR2xGRUNhMmJuMStWMDA1CitnSnFrN3BjV0RQcXBkSWI5MlY1Uy9CNHpxcVZ6T09pWE4wL3QxTDAzQU5ZdHZXSXBnWitRenVHZzZoNlk3MHFIMkQ5N3IzUUM1ekFtCitqMmx1UzZ5SlZ6ZHZQQjFBYVZMM2N3bkRESXJqdXJzTFhPK0tNUUk3ZmZib1FIbGRqTUhIWllvQURTcWpvMk81TXR0WXZoeFNJVUJpCisrOGJDc0t3R1FIYi9XeDlJRHZkSlI5alg3STc2RmdKZEs1M0RUZlJsSXJCMENsY3dtNjlMWjNBUkFkZFhOaXdTNmRSM01DR3hGbVB2CitWSkhiVnJ3a3Fac1JVU2FYS0FJQXgvVHl1eEMrZml3QXdUUGo0c0hBWnVrTWNmSzdHR00venlXd0tJNk80N3BNWmtnYzEwMEZUcTRZCitZOWI5WXZ2eHpDMlRsNjJXRHJHM08xWk1IazNnTzZSek9JbXgrc1dITDlEQjdGN1dQWERGandsNFNqcUhpNGhvOXZqcGJaWFNPZmEyCit2djJhcDBEMG5IUU81ekFTMnpkR1RPY2tkUy8zeFBQeTIxTEptRGl1SzQ5OFhPbjJOcStMTVRaZTdoa0RMTVh5WVNNZ3E4c1VBU0RKCitqazZOQ2Q0ckZSaHdhb2tpTXlobmMzUGhZMWVxQ0REUmwxMDlna0FPTVJnNk83Wi93OE93T0E5Z3A5N1lreTVWZklkRVc5eFRvczlkCitwNWlZeGxzQjJWaGUxb3RqNitkNGZqZS9pekg0V1l3WmNDd2ZOc3VaTHNiZXRYc3ZWNnhtZDA0NUFjQ0V1TytUTmdHUlU0T2lPU3RxCitQdzBrOTRZNFRRajQ4L0EzaC8xSU9vZUwxZzdOdFFGNFdqcUhreGhUcXhzWGYxSTZ4dDVzQ0tlK2R4d3hmc3lsaTJJL2lMbTZabjQ1CitNdHE4QXdBWUpwYnhGcFB4YzJiTXo0WjhiL082R0F1c241VTBVenpGR0V5Rzk0d0JKYUV0T3ozMnUzQlFIL3M5MG1kVGNmanJEMG1ICisyR05XeDlSM0VXdDN2QU5oMEZkYldwYUUwam1jdEtRbEpNSTNwR080aW9Hdmo1MTJqek9IL0k1NmZldlA0T2ZlOGdFeFNiUzRIMVIrCitCZ0EzRHdaUEFNZjE4cHZzc2JGY1Z4Z2JiVzJmV215Tmw4VVlRTEVjekpqeFpZcXd6TEV2bVNDZGJkbWY5cGxucnlwSWh3Q0E3N1kzCitsaEdaSHdLSWZaWTBwWjU5TWRmZEtoM0NaWWUvdW1XaDdrVTZvSEpqN1QyN1owWEVyVm8xczhEZ0I2Unp1SVlJc2I4MFpMWVozaThHCitHT0pZWG40VDAzRnhYTmNCdW1jc3JjS3liaitMTWNaSk1WMDMwOFdZWWJ3N3p1dnZQcElnc1U1VnFjSHNUQmZGOHBMd3E4UTRRenFICitzd2pmeUU5YVdaU080YkpWcTJZV2lPMDNwWE00N0ZTdUtQMktkSWc5Q0xwVThSMFlOYnRicE1lSFRLelBXOWN4eDlOTmtZRVQ0N2l1Cit0S0loN2FhWVZpOERtd0F2V3k4ZmwrK3F5VVY5VWM3NHpCaURZMTBuWDE1cTM0T00vemZlajBLdXBMQlVPZ1FBekYxVzkxNENQaU9kCit3MW1NOVR0NmdydWxZNlJCRGlQdUF2Q2lkQTUzMFdlcUdsc25TNmNBQUNycnVSK0FFelB6RGhsY3dLYUw0cndCZ1UrSTgvck9JNHA4CitabXppeEZrbEFHSlpPU1dNWDlweWpKK1RLN3Q1WFl6dGZvTzdUVHBIREVxUExwU01pL3FpQnRGL09hUUx4VnFNRVhOZG5OZFBKY0xQCitiNWkwVXZ4TDl2djNUUnZCQmd2aCtYZmlnQmg4ODdhbXBkM1NNZEpnemRLbWJtTDZOK2tjRGpNTS9LRDZzdm5EcFlPcy9mRU5td0E4CitMSjNETllSNGx5b3laN3VSRlJGRmZwVFF4bEdEeHNQUGZYamJzSEtTMXlzeS9COTRNTVFIZW5ISWtZbjhyUklqK2krSGxEbDJ3Yks2CitPR2V1ZEwvWVB0aXlFeTN0UzBzTDN3Y3dWanFIdzE3ZU1takxIT2tRcWJKejV4M1EyYkVESW1Bc2Q1Zk5sYzRCQUNCZHFyZ3ZqbkhmCisyS2lhdGlFQWpvN3IrbW5BaUg3UFdCRTVMNWNvc3VmN3hZQXNGR1BrWnpIR2Nld2JJNjZJL0pycFFqdGlHcERQVzE1N0xBQm51b2k1CitJbWRZZkJBMHU3UHVhaVpjSVozRFpVejQ2bWN1ZkhTSGRJNDBXYnZ5aHAwTTdheDRDSmRYTlM2NldqcEVHSVpPdkJSeUN1UDBxdm9mCitIaFBIcFNzcWVpb0JPSFhtWE9Jc0lpL0dETmpMWW93eTBQSFUrMktNUEQxckRNVFJ0MkczMmtFdU1EYVdnalFFNnBEMWg4KytHS3MvCitQTFh6V2NrSXN6cW1WaExqZTVJWlV1RDVuVDNCUE9rUWFWU0s0Yk1aZUVFNmg5dm9lK09udDFWS0psaS83Tm8xQVA0Z21jRkJSQlRFCitzN1RlVU5aZi9BSVV3M2pMSVA3amVXVDRPWTdmaS9mRkdJUDkvQ0V5SmtaK3pUaStIRkltdEtZMGp1c1NKWEJ1UytyUWYwdmVQWi9QCitHNEw1QVFEeGZTc3VJK2F2NkY2eC9sbXp0S25iRUgxTk9vZmpodHV3dUJETmJZRnNEUG9mMmZ1N2h5bWVmYzRFRTIrbnhuU0lZN3dWCisrL0U4RWtpWEthWWZnLzM4SVJKT3VyMnJKdW85WHBuL2dqUUJSVjZNdGJVMUJ3Q21SbjNkdENNS1JRYy9ZeTUrK0hNRVRKTE1rQUxQCitoQ00zYWdmRkFSZzhPTGhMengwN09HYThwM0pyOGJPaUlTejlTUFQrVHFKYTVQT1JqeFBKc285Tkp2b3EwbUxzeEJuemhvTGhaWWRLCitaazhuVmZiaWZURm15R3lVemhDVElGZk1SWHhPQjJkK1pneE1rYitkM1h6NDVva0FEby82dWluMzdFMjFuYitTdXZuczViWHZaaVpuCit6anB5RlJHKzRzcUIzR20xZWtsTER4aGZsYzdoT2dLK1V0MjBTT3pzcVhYTHJ2aWxGczN2TUdyc0wwNDhLK3FMTWlBOEMrb0Fva2pICitXOTJGaXJQZzZaaWVpSHdkeDcvTnl4L2MzaGoyRGVrTWNURUlJcDZTMW5YY1pIaDc1QmNOdFl2aXZwanB2NlR1UGIrcnBweUlGZ0NJCitaVW1xTHdqNDgvcWdaNUYwRGgrc0d4TGNEZUJwNlJ5T0syV20xakhOYlhMUElXYlJwZE11TW15alg2ckkwR1pBSE8zTGJ3YWRFK1gxCitYTUpNcjB0bmlKdjN4UmdzUEs2b09lcjF3WmxmcG9oaTlNVVlFMnN4dGcvSkpZckZRdWszQUx4TDZ2NXB3Y3ovdVB1c1JqVlFTMXBDCisxdG14M2pnNXQ3WDRkYkc3TTNTcDRqdFFZOVJYREkzZEd2VTFVeWppbFVnY2ZSOEJaN0RINC9oZHZDL0cySkMzTTJNQUxvejRlcGxmCitwc2dSSHhJKzk0SDZrUURPamZLYUhuanhwcW1kajB2Y2VFNW5YUzBJbjVDNGQ2b3dWci80eUVYL0tSM0RKODhQL2YvczNYbDRsT1c5CitQLzczNTVtWmhDM3NBZ0ltQVJjUUZSZlVDbTRnWkxJZzFDNUVGc1VxVzIyL2JXMTd6dWxxVGZ0cmU5cWVjMnhyYTIwSVNrRUlHcm9KCitRc2lDMEtyZ0FscTE3Z2dKZ3NvdWEwSm01dm44L29DZWc2ekp6RE56UDh2N2RWMjllbDJUbWZ0K2t6Z3p6K2U1dC9BaWNNZStNMUxnCitxM2xGQzB0TTlOMjRZdEp6M1AzeUJNUDdqWjduNkRSN1M4VFI3MWx2VW9kdmZxdlQxNE91SWVMcjYzZ0FBU2pHUXJhdksrb0I1WFZqCitITmtTV0JVQ1R0dEMzT0ZpVEMyN0JKd2YvMG1LUDRsQU05M3Q3NTRjMncyS2g4RWpCczVJUmU0ckt5dXpUZWZ3bGNXbENSV1VtWTdoCitBUUtSQ3FjTGdGWjJyUUo1SXZQOXVsb29FZ2tYT05wZ2lNVVk0Tnlhc2Z5aVJmbUFHRDBlSXAxczI3L0xqZjdGOThXWXJmNnVxRVdzCis2NTFvNXcrclIyYURGNm5vNkhBeEJyR00zT0YxTXpFMEZTaVMzZko3cE9sUWI1OTU3WU5uaDNPYjd6VFl2SHpTWWdoZU1aM0RBL3FHCitzeUp6VEhSczZ2UEp6ZFNTc1U2MmQyQmZtTVVZWUYwMG9jcVJHK0MyQlVldUE5MUtMTXZYMS9GQUFJb3h3TTlyeGdCUjNPQlFVNEdmCitvZ2hBTjY0ZDRkakM0aU5iMm11aFUrMzV4UGJPZTdzOG0rbE9LK29LN3dTa05OUDllcEdxZnArall1a2lLc3JSc1ZhNkpiOW80UmN5CiszV2xEVHVocEFOc3ozYStyS1lxY1BBZHV4OGczRGdHWm54M2hOazE3NE1obU5hTHE3MkpNZWM2WTU3VlBoUHhlVVR2MEp1ekFZZ3c0Cis0T1JGNko1dWU0WUQ2TzVVZTM2Z2lyK1VsaTVPWkxMUGlwcm9BSVgrS3BOOWVwWmcvWXlDdXFXbVkvaFpRL1hrdjZyZ0JkTTV2RUJGCitmdFAvNW9Yblo3VFR4YVVKZ2Z3MW8zMjZYOC84QXkzTzdkWjM1SHZXK1oyTFBVYXNacWZXalRsMVU5NlZEamFIdUp1aTEwMHBydDRQCit3TS9uNUF4K3FDYmFLOVZHRWpaM1VnVGc2QTVQbG9RYzM0WEs2MExJN05iUlZWVVRRckR3cUFDZE05bXZWd25rK3liVzh3V04yUHBECisweGs4b2xNb1ljMTFjbFNtVmRUbUZ2ZkhVWFYycWlLQWZRNjM1emwyT0pUeXlOaUE4Wlc5QVg4ZTlueFV5NDdWcGI3ZmZkUDN4ZGpSCitDd3MvRDNGS1dIUjB5bzJJSGZpUk1YRzRHRk9vMDE5ZTNpYllFKysrZTFVbXUveTQyOTd2QUxnMmszMTYyTlBUeDlTc01CMGlDQnBYCitURmtPU01hbjYzcVRYcHUzUC9HZFRQYllZOGVCcCtEdjY0YTJFemk2L2xrZC9yNzFJa0VvNVp2ZzJvS2I0Ty8xL3I1ZWF2UXZ2aS9HCitqdkwzVkVXUjFNK3hhbkgyQUVJdlVtQy9VMjFWckNydUw0cWhUclhuQndKNVl0YVY2ek0yU2oyN3Z1Z3FBWDZRcWY2OFRpMTgyM1NHCitJRkZWL3I1YlMvUUg1NVFzY3ZwY3pWTmF2MzVXVElXN0tuNlNYSDVPd2FLK2pyWEdZZ3hxTzNBVFhPRDNjMHhaalBtSTMvK1kwYU5iCisweWN0TGl6RzRHQXhKb240V1BqN2JsV2JpVzB2eWxSZjVVdkhkUkMxSHdVUXlWU2ZIdmZFek5HMWEweUhDSkxOS3lZL0l3RFg1N1ZPCit4RkpkMEhmYzBnNlo2akNra3JIUEs0OFFDY094MlI1TzN2ejBLclVrdFdtS1pXV1dBcjdlSkV6RTU0TXBSd1dpR0JQNGUzdDdBSDBxCis2Z291VGFXQmNFZ3k5aVhuWW81OU9haks1NTFxeXllMnZ4K0pQWldwenF4MnpmOERZRkNtK3ZPNGhJYmtlNlpEQkZJQy93RWdianFHCitSd3lLeEEvOGQ2WTYyOVRKV2duZ28wejE1d1dpK2xuSDJ1TElHR0NudHB0aTdvdm5YdzZndDBOcFhFa1Z2dCs4QXdoSU1RYngvY2dZCitKTVdwaXJadE83TEZxcGVKT3ZQbE1HZEZZWGNBTnpyUmxsK0l5S0t5VWFzemN0RTVwNjV3TENDek10R1hIeWd3YitaTk5hK2J6aEZFCitEYldUMzFLUkJhWnplSWQrTWE5d1VXYlc0aTR1VFlob1ZVYjY4Z3JCVGZtM3pPM3FSRk1LNWNnWTdKUnVnb3Z0d0JJVjl3dkUyczFBCitGR08ySFlnelEyNU81Y1VxVnVDTE1Wc2MybW8zck9QQTZYR2ZrRWhvUnFiOFBGUVQ3YVhRaDhFcG9xM1ZITFo1N3BWSjRWRG9QZ0ROCitwbk40aE1EU2g4K056azk1QitGVzBjeDhibmxJbHQyY25kSzF4cjhJSlBCYjJ5UFZhWW9RUi80V2JxWVNpT3YzWUJSakl2alFkSVlNCitHRDUzVlVtZlpGOXNLUUkvVFZHQXcwNjBvd3BPVWZ5azkyWkdhek55cmxJNGhEbncrYlFOaC8zbXJzTGE5MDJIQ0xLTlMwczNRL0U3Ciswems4cEhjOEZQb0RvR20vNGRKUWZkdHpnR3hJZHo5ZUlnSkhwaW9xMUpIdlcwL1Q1TmZxSDluU1hxOTJNbzRyS1Q0d0hTRVRBbEdNCitRVFFJeFpnVlA3SnBSSkt2VG0yNDNDZFMvbko0Y05YSVRnREdPSkRGUDFRcU0zRjIxWno2Z2xsUWpFdDNQejd5Y1pZa2ZtNDZCQUVhCiswaDhqSU5OeG5DSEZ1Y1dWTXpMVGx6NmVtWDQ4bzZoM2RIN0hWQnV4SUlFdnhoUlcwdGRkMm9KYkVJaHJlQW5DOVhzUS9wQ0FKQUl4CitNZ1lBbjA3MmhhcWNwaWlTK3AyNlNDTHJaZ0RjbWZJWUljdDZMTjE5bEs4c1BsZFYvaXZkL2ZpSnF2enNqakVyL2I2NWtTZHNYalpsCitENkFaMjV6Q0R3UnkvNENpUjlPL1NZOWxMVXg3SDk3U1Bqc1VLWGFnbmNBWFk5RGtOL0JRMGFTdjk3d2xFWWpyOTBBVVkvRmdqSXdCCitpakh6YTZKSjNiRVMwY0FYWTJwYkxhazNnbHNkaU9JbjYrNGFVLzFHT2pzb1d6VXliQ1VTbFFCeTB0bVB6M3lnaDdOK1l6b0UvWi9tCitST0xYUUdCdUhEcWhZOElLemNmSVZlRjBkdEs0Yk9LYmdMNlV6ajY4UnFBcGY4OHBSOFpnUVpNYUdUdHJaRlVuUUVZNW5jZU5iRnUzCittYzZRQ1lFb3hoS1JXRkMrNE5vM1c4bnRycU4ycWd0SmZTREZrYkdLK3RHOUJjNmR3K0lIQ3BtZDdqNzZKaUwzUXVEL3VmTk9Fdnh3CisxcmlsWEVEdkl0dHFweDRVa1IrWnp1RWxvcmc2di8ySDk2YS9uL1Ivam5uTStQT0txODVLclFtdUdZTWtOekxXdmtPOEJBR1pnUlBUCitZQXltQktJWSsvS28xUWNRa0FNR1JYVmlVaS9rbWpFQVNHMWtURU5Ud1YwVS81Y0MrMkxodzJuZGplemgrcUxob3ZMZGRQYmhRMjl2CitEYlU4WWpvRW5hakh0bjBQQTNqSGRBNHZVZUM3ZVVXVnc5UFpSM1pXVXlVQ2NnM1JTbGt4aWQrZVVndWE0dmV0RDJpU3haZ29rcnZPCis4NTU5MjJxbkhqUWRJaE1DVVl3QmdBVGw4RWJCelF1V0YzZHU4OHVVSTJPUyt1R3Jkem9TeENjRVdubjBSa2hheksrSmRsUzE1d0ZJCis2elFsLzdHK202a3ozNmh0MXErZkZWUFY3NXZPNFRGaENCWU1Hdjl3MnFZcHY3MWsybjRBYVYvNzZqRXpVdHJSMGtMQ3dTemVsTVIxCisxM25GQ3pvRGNHTE5uaGNFWWxRTUNGQXhwc0hZM2g0QTJqV0Y0K1BiL0NxUndJK01xU1QvNVZCUlgzZzlnQXNkak9ONXRtVlZwTFA5Cit3NEpmSzNCK092dndIMzF4K3BnVmZ6R2RnazV0ODRySmZ3VGtPZE01UEdaZ2MwdjcrOVBaZ1lqeStJRmpLUWJualgwczZSRkpoYklZCitTMkprTEs3eVdRUmtpaUpZalBtUUJ1ZVBxdEwySVd4VmJ1QUJPNFV2QjlVdk81akUreFF2ekJwZGs3WkY3M1BxbzdkQU1DMWQ3ZnVWCitKZGEzTW5ITUFLVkNWQlVjSFdzcndmVDg0c3BiMHRWOHcvSXAvd0N3TGwzdGU1THEvMHYycFFLTG8vTnF0L202U3lIQjJTUXNPSU1vCit3U25HUkdXcjZReVpJcERvdlByUlBkcjRtc0FYWXdxclV6S3ZLNitKRGdZd3dlRTRuaWFDOG5TMVBYZFZTUjlWY0VGOUd5bDAyYlF4CitOYXRNNTZBejI3eGkwa3BBcTAzbjhCb0ZadWVYVlBWSld3ZHAvRnp6SkVWcC81c1hKalU3UWRWTzZ2dldYOW8ySTZudnVNcWVFSXhPCitWeHJYQ2NpQnowQ0FpakhiMHZkTVo4aWdTQXRDbjJ2TEN6VEpMVmI5UkVSL05MdXVzRTIvTndBSVdmSnpCT2k5MUFyYjluWGNuNWFOCitPMVFoc1hoc0RvQVVkL0lLbkFSQzFyZE1oNkEyc0VMZlJPcnJXSVBtTEZ0ajgxSmF5M1FhY3Vqd0FnUm82bFFyaEVJSitXbGJYNVJiCitzdUJtZ1pTbElZKzNhTnVtRzJiRmRRSUN0RW1ZaUd3d25TRlRBbk1CYWRuNnR1a01tYVJ0MzIwbjhDTmpBTElFK3Rqcyt1aVUxcjVnCitkbTNCWnhUYTlqVjYvdlkvM3hpeHRpa2REYytwSy9pU1FIaDhRSnRweGN5YmFsNDNuWUphcjNIWnhEZFY4TERwSEY0amtHaGV5V05mCitTa2ZiRGF2dmJCYkZBK2xvMjhNK24xdXk0T2JXUGptdmVPRVVVZXN2Q002NnAxTlNRWnR1Z2dkcWlpSUFWUTNNenJMQktjWlVBdk5ICitCUUFCYmloZlVYaDJhNSt2QWs0Wk9DSXNpdmtWZFlYM25PbUpGWFZqTGhRUmJoRitMTUVlcTMyNzM2ZWo2ZkthNkdDSS9DSWRiZnVaCitBdnZpdHR4bk9nZTFYU2lNKzhBdDFkdE83Vi9rUnlzSHA2UHBzTmkvQS9CeE90cjJLbEhyRHdOTEhydmdUTS9MTDY2OEI1RDU0QTY0CitBQUNCdHZxNnEvL05WZjBBWEovR09LNFRoeDJZNi9iQUZHTjNSbXUzQUFqU0lhY2hzZXpTMWo3WkFycWtNNHpIV0lEK2NuWmQ5T0hmCitQVG0yMjhtZU1Mcytlak5nclFiUU5iUFJYTTZXMzA2N2JvbmpGNC9sNjRaRnJCQVdBRzI3azBpQUpmalozWVcxMjAzbm9MYmJ0R1R5CitOa0IvWmpxSDkwZ0hEV0hCc0dIbGprL3AybEI5Mno1QXVMUGlKL1ZJcVAzM3ZLS0ZKU2Y3WWU3WWhkMXlTeGJOVmVDWENOQjE1NWxKCitxNis3d3ZGRUtZTDF1enU0dFhwS1lQWjZDTXpkQ1JGb1JSMDJBQmhxT2t1bWlNaEVBTDl1elhOVldWUWNUNEM3SXRteHoxYlVSNStFCis0ajJvdG9oSVB3V3VoK0lTMC9sYzZLQWRPWnlXS1R6V3h6M0xvRG9zSFczNzNPWjlIZmIveW5RSVNsNmlVK1NYMW9INEZ3VTR4M1FXCitqeG0yczFmbk1nRGZjN3JoY0NMMjYzZ29kRTliTjJEd3VkNFFXWlpYWFBrcVZKOFdTN1lDbXEwcTU4SEdXRUI1alhHaVZ2OU9iRXNuCitTcEQyd1JWc0FJTHpMdzVTbFEwb0FqUGtlZFNuSG42cWFOQ1pubFJXVm1ZQmFQTkIwUUhSRllyYkFOd0hrWjhvOENXQWhkZ3BWTXdhCit0WHFuMDQyVzE0MjVEcXJjZkNJSkt2aHV1dGJ2VVdac1dWemFCQkhIQzRwZzBHL2xGbFZlNTNTcjc5Vk8zUTRJMS9PZDNGQ0lmRmtWCitQMVdWK3dCTUFXZVFuRXFYMW13Mmt6ZjJzUXRGY1hVbUFybUZJRmhMaTRKVmpGbkIrdU1DRUxVVGQ1N3BTWGszcnU2TW9QMjNRRTQ3CitHQTZIZis1MG93K3VHdG5KZ2pVWFFNanB0djFQWHY3Z21SRnAyZFdTTW12ejhva0x3RE91a2hFU1MrYWZWN3pBK1p1TmR1SS9BUngwCit2RjBLa3ZCWkl4ZDNQT096N01SZEdjamlLbXJiZ2RwMEwxQVg0SUxnN016eUw2b3l0V3pWeU5OT1IyMXVic2U3VnBRU0FYNTU1NmpsCitIem5kYmxZczY3Y0F6bk82M1NBUVcrOHBLeXV6VGVjZ0o0Z0s4RyttVTNpUzZvQVdXSTVQbjI2c3VmMUQ1YzZLbEtMT1dZbVRya3YvCitseVBySHVYMlRPVnhDeFc4YXpwREpnV3FHTE50ZmNWMEJnUE83dCtTVlh5NkowUkNpWDZaQ2tOK0pEdmJ4VUwvNVhTcnMyc0xQZ1BCCitIVTYzR3dpQ3Ywd3ZyUDI3NlJqa25JYnF5WDlUbFNkTTUvQWlBZTdJTDE3aytMYmc0WGo0NXdCMk9kMHVCVWZpRE5kZk84L3FmRE9BCiszaG1LNHhvaGxYK1l6cEJKZ1NyR3RQdnUxd0VFYnYyRWhqRGpkRCszTGVIQ2NFcWFRSDk2VzBuMVBpZmJmR2psVGYxRXBNTEpOZ01rCitwa2g4MjNRSWNsN1lrdjhBRURPZHc0c1UrdURSN2NFZHM3RytkQytBLzNTeVRRcWFVTjVwZnl3NlBVTkIzS1JwVS9QWmI1Z09rVW1CCitLc1ptWGJrK0JpQlExVFlBUUZGU1VSTWRjS29mQy9US1RNWWhQOUhHUTdHUW85czhxMEpDZHZnUkFEMmNiRGN3RkEvTkhMTXljRk95CitnMkRqOG9udkFFakxPWDRCME1OS3hCNXB6WVlKYlNGTmh4OEVkTE9UYlZKd0tQU3FVLzNzbk9MSHpnVlFsTUU0N3FCNEdhdEh4VTNICit5S1JBRldOSEJYRVJkQWdXN2o3WkQ4cVhqdXNBbFM5a09BLzVodldEcjVaVUgzYXl4VG4xaFY4VElPcGttd0h5Y1phVitKSHBFSlErCithdWw5QUhhYnp1RkZBb25tbGxSKzFjazJHMWJmMlN3S0hxcE95YnFyNzdpbEp6MGl3Vkw3U3dqZ2Rib0lYalNkSWRPQzkwZFdDZHdmCisrYWhwOTY4WjN2NzRCMFB0bS84Zk9BSkJ5VkM4M21WUDU0Vk9Oam43cWNLTEFPVzBueVFKOEpNN3hxemtHaFlmMjd4c3loNUErQjVKCitrcWo4TExldzhpSW4yMnpJaVR3SzRIVW4yNlRBNkJhSkgvalM4US8ySGJlMEF3Um4zQTNiajJ5UjlhWXpaRnJnaWpHVlJCQkh4Z0NnCitlNmVET1orWWV6eG5aVW1lcXZ6QVZDRHlOb1YrdDdSMGNjS3A5aDVZWHB3dENWMEFvSjFUYlFiTXBrT3gwRzlNaDZEMDY5UXA5QUFnCitHMHpuOEtoMll1R3gvSkZ6bmZ1Y1dWeWFFT0Q3anJWSEFXUC9NSGZzd29ISFBwSVYzejhUd0dsM1d2UXJLNjZCR3pRSlhERzI5ZG5yCiszZ2F3MzNRT0V3VDR6cjlHeCthdUd0bE9FL0ZLQUdjKzQ0TG9STS9Oak5ZdGNiTEJkbUg3UndBdWM3TE5JQkhWYnprOVpaVGM2ZlhGCitwUzJxOW5kTjUvQ3dpOUUrKzRkT050aFFQZWtKQU04NzJTWUZoWFFRMjVwL1h2SHliT0RJcUpnQzN6S2R5cEQ5RFNQZUNkeWE1OEFWCitZMGZQM1huSmRBNUR6czQ1ME9ucjVldUdSZUtKN1BrUWpEQWRpTHpKRW5IMFFuQjJiY0dOSXNwemxKTDN0K25SdXNXbVExRG1iRjR4CitaVEdBdjVuTzRWVUsvRnQrY2VXTnpyVW9xaXJmYzY0OUNoYTl0Z1Y3NW1Ia3FuQWtkdUFiQVBxWVRtVElTd2pnK1ppQks4WUFRQkc4Cit4WUgvUytTSDFwNGViMEoxZ3VrbzVFMEsxRTRiVTdQS3FmYm1yaHJaVlVUbUk2Q2ZSdzVJUUN4SE55VWdiN0JzNjJzQUhKc3FIRENXCitRdWZuM3pLM3ExTU5ibDR4YVNVRTlVNjFSOEVpa0Z2ejJuLzBKa1FEdkNGTThLWW9Bb0c5K0Fuc0poNEFFQVp3cnVrUTVGMGhWVWZ2Cisvc2JqV2I4RmtPdGttMEVpUVBtTU1TdGVOWjJETW05VHpjUlhGTXJ6K0pJbXVYbzQrN2VPdGdqaDJqRktnWjZISTlkcGdhU0tGMHhuCitNQ0dReFZnaUxvSDhZeE01NEcvVG9uV09iWUl6dTY3d2N3Q21PTlZlNEFqMkpNSXRBYjZMU3JZZCtSNEE3cUNadkNuNVJaV1RuR3FzCitZZm1rNXdGNTFxbjJpSUlrSElrRWN0MWxJSXV4dTR0WE5BRFlZVG9Ia2Rjb3hMRURuaCtwaVo0andydjZLYkgxM2xtalZ1ODBIWVBNCisyVkpUdWxzQlJ6ZWpDQm9WUEhodWRORTVqalVvY094emtpaEF0bTFjV2hySUE5UURXWXdCZ0FJdm04NUE1REZON1d4ZDVrUkRaV1ZsCitWaUtFUDBDRHVYV3ZRMTdiR29tVm13NUI1bTF1T3ZzaEFQODBuY1BEdXNWRCtnZVVsVGx5VFhUb1VHZ0pnR1luMmlJS0RBM3VkWGxnCitpekVSZWRkMEJpSnYwZWVuRnRZZWRLS2xmaVBXZmgyS201eG9LNmdza2ErVmpWb2RONTJEWEdEMXFMaXEzR002aHNmZGxQZjhCVjkzCitvcUVkcTBzUGdOdmNFN1dOSUxEWDVjRXR4bFRmTTUyQnlFdEVyQVluMnFtb0x4b0swWjg0MFZaZ0tmN281STZXNUgxSGR2S1RQNXZPCis0WEUvNlYreTRCSW5HaEtnMFlsMmlJSkNKYmpYNVlFdHhtd1dZMFJ0WXF0OVZxcHRsQzhkMXdGcUx3U1E3VUNrUUZKZ1h6d1U1eWdJCituU0FjeHowQTlwdk80V0haSWJVVzlKOVExVDdWaGhTYTh1Y2xVYkFFOTdvOHNNVVlyTkNIcGlNUWVZbEFDbjVmVzNCK3NxOVhoVmpaCitoK2NCdU5qQldJRWpxdCs5ZS9SVFcwM25JUGQ1cjNiUys2cmNXajFGUThNSEV3czdKeEVBQUNBQVNVUkJWUE1BbFdRYkdGankyQVdBCitqSEV5RkpIdmlRVDJ1ank0eFJoaWUwMG5JUEtZckpESWl2SzZNVzJleGxPK2Jsams0ZnBvT1FTZlQwZXdBSGx1NjVwckh6SWRndHhyCitjMDdvUVpWZ250WGpGRldka0Z1eTZDR01YTlhtODU0R0ZGVU9UYWhkRFNDU2htaEV2bVhIN2NCZWx5ZDk1OGZyNXE0cTZST1B4d05iCitoUk9sNEJDQVgxanQyOTAvN2JvbFo1d1NOV2RsNGRXdzhUOEt2UzREMmZ3c1pzTWVOcXVnL2pYVFFjamRCaFErZHFsdDJlc1E0TU5qCituU0NDcHlXaC83YXBac29aaTl0QjR4L09PUnh2OTAxVitROEFLVTl6SkFxYWNDTGUrNzNhcWR0TjV6QWhzTVhZL1d1R3Q4ODVtSFBJCitkQTRpRDlzUDRDK0FySVRJUCt5NDdtZ1hqcmMwMlZiM3NHV2RxN0N2Z3NwNEFNTVE0TThhcDZqaVAyZEdhNzlyT2dkNVEzN3hvcDhwCis5RnVtYy9pQUFsZ1A2QklSZVRGdTZYdmFGTjhkRGx0WmxvVE9VdUJ5aFk2R3lHY0FkRElkbHNpckl1amFia04xeVdIVE9Vd0k5QVZTCitSVjAwZ1VCUDFTUWlqOWl3ditQK29kOFlzYmJKZEJEeWhyN2psbmFJeFBlL0N1QmMwMW1JaU00ZzNsZzlPYkJUZTROZWlDUk1CeUFpCitPZ01WMVMreUVLTzIrR0RwdUVNcXVCdEhSbmFJaU56TU5oM0FwS0FYWTRIKzR4T1IrNG5JQTlPamRTdE41eUR2MmJ4OGNoMGdENXJPCitRVVIwQm9FZUhHRXhSa1RrVWdwOVkxK0hmZDh4bllPOFM1cWEvMTBBYnZwQ1JHNFc2T3Z4b0JkamdhN0VpY2pWRGtNeGhkTVRLUlVOCitxKzlzVnNnZEFGcE1aeUVpT29WQVg0OEh2UmlMbXc1QVJIUXlJdnFEbWRHNmY1ak9RZDdYV0QzcFpWSGNaem9IRWRFcGNHUXNxRFRnCisvMzRpY3Eybk8rL3UraittUTVCL05Genp6aThBckRhZGc0aUlQaW5ReFlnRS9OOVBSSzYwVjZ6dzdhV2xpd005YllNY1ZsWm14MkhmCitEbUNQNlNoRVJNY0ptUTVnVXRDTGthRC8rNG5JYlZUdm5qNTZlYVBwR09RL1c2dHYyd0xvVjB6bklDSTZUcUN2eHdQOWp3Y1FOaDJBCitpT2hmVkZFK0kxcTN5SFFPOHEvRzZpa0xvWmhqT2djUjBURTRNaFpnUWYvM0U1RkxxT0NWU0tUbEh0TTV5UDhTT2VHdkFualZkQTRpCitvcU1DZlQwZTJILzhBOHVMczhHUk1TSnlod09hd01RN1I2MXVOaDJFL0cvTDR0S21SRWcvRDJDZjZTeEVSQUN5aGcwcmo1Z09ZVXBnCitpN0ZJS05IRmRBWWlJZ0NBNnQyekNtdmZNaDJEZ21QTGsxUGVWY0VNMHptSWlBRGdvNjd0T3B2T1lFcHdpekdWd1A3UmljaFZIcG9SCityVnRnT2dRRnorYmxrNnRVVUc0NkJ4RlJPQlRjNi9MQUZtTXF5cEV4SWpMdDFmMGQ5My9UZEFnS3JpenQralZBWHpLZGc0aUNUY0toCit3RjZYQjdZWUU5R3Vwak1RVVhBcHNFOFM4cmx2akZqYlpEb0xCZGVHNnBMRENkdStGVncvUmtRR3FhQ2I2UXltQkxZWXM0RnpUR2NnCitvdUN5VktkUEw2clpZRG9IMFphYTJ6ZHcvUmdSbWFSMmNLL0xBMXVNaVVpZTZReEVGRmkvbVI2dFcydzZCTkcvYkY0K3VRcXFENXJPCitRVVRCSkdybG1zNWdTbUNMTVdod0szQWlNa2xmYklxRi90MTBDcUxqOWR4eDRPc0ExcHJPUVVUQkl4TGM2L0xnRm1OQVlDdHdJakxtCitZOWh5NjFkTHFnK2JEa0owdlBYclo4VkM0ZkJFQUx0TVp5R2lZRkhWd0Y2WEI3Y1lFd3cwSFlHSUFrVlY5WTRaaGJXYlRBY2hPcFdOCitTMHMzaStnMEFHbzZDeEVGU0lDdnl3TlpqSlV2SGRjQndBRFRPWWdvVVA1N1pyUnVpZWtRUkdmU3NIektFMUQ4MG5RT0lncVVjL3RQCitxR3B2T29RSmdTekdwSDNzSWdUMDMwNUVSanpYWlUrWDc1c09RZFJhamMxbmZ3dVFaMDNuSUtMQUNGbUhZa05NaHpBaGtBV0pwZllsCitwak1RVVdEc0ZpczhzYlIwY1l2cElFU3R0bnBVUEk3RVJBQTdUVWNob21Dd0Vnams5WGtnaXpFYnVOaDBCaUlLQklYcTdkTkhMMjgwCitIWVNvcmJaVzM3WkZnYnZBOVdORWxBRXFFc2pyODBBV1k2SXN4b2dvQTBSK055TmF0OXgwREtKa2JhNmV2RlNoNWFaekVKSC9LWlFqCitZMEdnQ29HRkswM25JQ0xmZTlOdXl2b1AweUdJVWhVUGQvNG1CRytaemtGRS9pYVFLd0VWMHpreUxYREYySno2TVlPaDZHWTZCeEg1CitXa3pGdW1QV3VLV0hUQWNoU3RVSFM4Y2RRc0thQW9Eckhva29uYm9QTEhuOGZOTWhNaTF3eFJnUXVzWjBBaUx5dmUvTkhMUGlSZE1oCitpSnpTV0RQeEpWSGNaem9IRWZsYkhQb3AweGt5TFhERm1Hcncvc2hFbEZGUGQ5blQ1WDdUSVlpYzFuRE5PNzhBOEpUcEhFVGtYMkxiCitnYnRPRDF3eEpvTEEvWkdKS0dNT2lCVyt2YlIwY2NKMEVDTEhsWlhab2pJTndFSFRVWWpJcDBRQ040TXRVTVhZL0pwb1IzQmJleUpLCitFd0Yrd0czc3ljOGFWa3hxQURoZGtZalNabWpmY1VzN21BNlJTWUVxeGc1YjFsVUF3cVp6RUpFUENkWjMzdFBsQWRNeGlOS3RzZW5zCitYd040MlhRT0l2S2xTRGkyL3dyVElUSXBVTVdZcU41Z09nTVIrVklDQ2N6aTlFUUtoTldqNHJiSVRBRDg3NTJJSEdkWnVONTBoa3dLCitWREdtQWhaalJPUTgwVi9OS0t4ZGJ6b0dVYWE4djN6U09nRithem9IRWZtUHJialJkSVpNQ2t3eFZyNXVXQVRRNGFaekVKSHZmSmlkCitFSzZob2NESmpqVGRDK0FqMHptSXlGOEV1QllqVndWbVdWRmdpakhaMitNcUFJRmFFRWhFR1NBb20xcFl5OTNsS0hEZVhqSnR2MEIvCitaRG9IRWZsT3AzUGFiYjNjZEloTUNVNHhabk9LSWhFNVRkN1pHbXA1eEhRS0lsTWFtdnBXQUhqVGRBNGk4aGRMUW9HWnFoaWNZa3haCitqQkdSMCtRN1phTld4MDJuSURKbTlhaTRRbjVnT2dZUitZc2dPSnZ1aWVrQW1WQlZOU0cwdDl2ZVhRQzZtTTVDUkQ2aGVHRjZRZTAxCitJbERUVVloTXl5dXVYQU9BNjdLSnlDbDdHenVGZTJCeHFlOTNiUTNFeU5qZUxuc3ZBd3N4SW5LUUJiMlhoUmpSRWFMNlE5TVppTWhYCit1dVFkU0F3MUhTSVRBbEdNaVlWUnBqTVFrYS84NDY2Q3VqclRJWWpjb21IRmxCb0FQTjZCaUJ3amlwR21NMlJDSUlveEJVYWJ6a0JFCitQaUw0Q1VmRmlENUpCYjh3bllHSS9FTXREY1QxdSsrTHNhcXFDVmtBcmpPZGc0aDg0NzB1dTd2OHhYUUlJcmZaM0RIOEp3WGVOWjJECitpSHhDY2NPd1llVVIwekhTemZmRjJMNHVlNjhCME1sMERpTHlDY0YvbHBZdTl2MkNZcUkyVzF5YUFQUy9UY2NnSXQvSTJkR3I0OVdtCitRNlNiNzRzeHRYQ1Q2UXhFNUJ0Ym0xcENDMHlISUhLckxIU2JCK0FEMHptSXlDYzBOTVowaEhUemZURUd3UGQvUkNMS21JZStXbEo5CisySFFJSXJmYVVGMXlXSUZ5MHptSXlDZEVmVCtvNHV0aTdNRlZJenNCOFAzd0poRmxSQXNrTWNkMENDSzNpeVRpdndmQW14WkVsRElCCityamxyWkpXdmx4djV1aGpMam1mZkNNRDNDLytJS1AwVSt2aU1NU3UzbWM1QjVIYnYxVTdkRHVpZlRPY2dJbC9JNnRnaDd1dU4rSHhkCitqTmtJeHBhWVJKUithc3VEcGpNUWVZWmw4ZjFDUkk1UTlmZjF2SytMTWVINVlrVGtqSmRtRmRZK2J6b0VrVmMwTHB1MEJzQTYwem1JCit5QS9FMS9zLytMWVllNmdtMmd2QUphWnpFSkgzaWVBQjB4bUl2RWNlTXAyQWlIemgwdk9LcTg0eUhTSmRmRnVNaFVNWUJVQk01eUFpCitqeFBzMmRkaGY1WHBHRVJlaytnVVdnUmdyK2tjUk9SNTBpTHhVYVpEcEl0dml6Ry9EMmtTVWFaSTVUZEdyRzB5bllMSWE3WXNMbTFTCis2Q0xUT1lqSSt5d1YzeTQ5OG04eDV2UEZma1NVR2JiZ0VkTVppTHdxWkdPdTZReEU1SDNxNDAzNWZEbU5iODdLa2p5MTR3Mm1jeENSCis1NzAybzZCMnFPa1FSRjZXVjF6NUNnQytqNGdvTlluNHdNYmFxWnRNeDNDYUwwZkdiRHNSTloyQmlIeEF3RU9laVZJa0tuOHduWUdJCitmTUFLM1dRNlFqcjRzaGdUSHc5bEVsSEd0TmlobGtyVElZaThMaFpybVEvZ3NPa2NST1J4bGovWGpmbXVHRk9GQVBEdGppdEVsQ242CisxMW1qVnU4MG5ZTEk2N2F1dkdNWGdDZE41eUFpajFPTUJ0UjNTNng4VjR6TldWbDBDWUJlcG5NUWtiZXB5S09tTXhENWhRQUxUR2NnCitJcy9yMWI5azRjV21RempOZDhXWUlzRXQ3WWtvTllJOVhYZDNxVFVkZzhndk9uWUtMd2V3MjNRT0l2SzJzRnErbTZyb3UySk1mSHdPCitBUkZsaUdKeGFlbmlGdE14aVB6aTljV2xMUkQ1aStrY1JPUnRDdjlkNS91cUdDdGJOVEtzd0hXbWN4Q1IxMWs4cUpiSVlXcUQ3eXNpCitTcEhlT0d4WWVjUjBDaWY1cWhqckg0dDhTb0RPcG5NUWthZDkwR1ZQenRPbVF4RDV6ZVpyM2w0RllLdnBIRVRrYVRrNyszUyt5blFJCitKL21xR0FQOE40K1VpREpMVkI0ckxWMmNNSjJEeUhmS3lteUlWcG1PUVVUZXByYjZhbjhJWHhWakt1ckx3K0NJS0hOc1N4NHpuWUhJCityNndFK1A0aW9wUUk0S3ZyZmQvczFWKytkRndIcTkzaDNRQ3lUV2NoSW04U1FjTzAwYlVEUmFDbXN4RDVWVjdKb28xUUhXQTZCeEY1CitWa3Nzbk5QdGc2WGpEcGtPNGdUZmpJeFo3UTlmQ3haaVJKUUNXL0VYRm1KRTZTV3dsNXJPUUVTZWxoVnUyVGZDZEFpbitLWVlVeHVqCitUR2NnSW04VGJyMU5sSDYyeGZjWkVhVkVMTXMzMS8yK0tjWXM4ZGY4VVNMS3VPMWRkbmRlWXpvRWtkODE1SVNlQnJERGRBNGk4akpsCitNZVltRHo4elBrZUJZYVp6RUpHbi9aVzdLQkpsd09MU0JBQk9WU1NpVkZ4MVh2RUNYeHhuNVl0aVRBODJqd1FRTnAyRGlMeUxVeFNKCitNa2ZGNXZ1TmlGSVJqdG1oNjAySGNJSXZpakhiNG5veElrcWVBdnM2Nys3OGxPa2NSRUZoSFlyVkF6aGdPZ2NSZVpqbGo2bUt2aWpHCit3UFZpUkpRQ0M2Z3JMVjNjWWpvSFVWQTByTDZ6V1FEZUFDR2lGTEFZYzRWNTlhTjdpT0lTMHptSXlNTlVWNWlPUUJRNEl0V21JeENSCitsOGxsZmNkVjlqU2RJbFdlTDhZT2EzZ2tmUER2SUNKek5CSm1NVWFVWVFLYnhSZ1JwY0tLeE1UejY4WThYOFNJNmcybU14Q1JwNzAyCitZMVQxRnRNaGlJSm0wL0lwalFEZU5KMkRpRHpNc2xtTUdXZmhXdE1SaU1pN1ZEbFZpc2dZQmQ5L1JKUTBoWGkrRHZCME1UYS9KdG9SCitpa3RONXlBaTd3cFo0QlJGSWtOVWxjVVlFU1ZORkpmM0hiZTBnK2tjcWZCME1SWUx5ZFhnK1dKRWxMd0RPYnM3UDJzNkJGRlFaVm5kCituZ1p3MEhRT0l2S3NTRlo4LzFXbVE2VEMwOFZZUXRYelE1TkVaTlF6M05LZXlKd04xU1dIQlZoak9nY1JlWmZDMi9XQXA0c3hBZGVMCitFVkZLL21ZNkFGSFFLZCtIUkpRU2I2OGI4Mnd4VmxaV1prSHdLZE01aU1qTDdOV21FeEFGbmZKOVNFU3BHWUd5TXMvV05KNE5mdmExCit6MXdFUlRmVE9ZaklzdzdZM2Zhc054MkNLT2h5T21XOUNLNGJJNkxrZGMxZGU4R0Zwa01reTdQRm1HakkwME9TUkdTYVBEdnJ5dlV4CisweW1JZ3U3MXhhVXRFS3cxbllPSVBNenk3cm94N3haam9zTk5aeUFpN3hKUnJsTWhjZ3ZGYXRNUmlNakxaSVRwQk1ueWJERUc0R3JUCitBWWpJdTJ4YnVZTWJrVnRZZkQ4U1VmTEV3M1dCSjR1eEIxZU43QVRnQXRNNWlNaXo3RkNIOWkrWkRrRkVSN1FMTmE4RFlKdk9RVVNlCitOV2pRK0lkelRJZEloaWVMc2V5V3JDdmcwZXhFWko1QzM1cDIzWkw5cG5NUTBSRnZMNW0ySDRKM1RPY2dJcyt5bWxyYVgybzZSREs4CitXZEJZR0dZNkFoRjVsMERXbWM1QVJDZmcrNUtJa21lcEorc0RUeFpqS3JqQ2RBWWk4akFCdDdRbmNobUZzaGdqb3FSWktwNnNEenhaCitqRUU1TWtaRXlWUGhIWGdpMTFFV1kwU1VQSVUzNndQUEZXUHphNklkd2MwN2lDaDVHc3B1OTVycEVFVDBTZTBqaDE4Rm9LWnpFSkZuCitEZTQ3Ym1rSDB5SGF5blBGV0pObFh3NGdaRG9IRVhuV0I5eThnOGg5M2w0eWJUK0FEMDNuSUNMUENrVmkrejIzaVlmbmlqRlI4ZVFRCitKQkc1aE9CdDB4R0k2SlM0b3lJUkpVKzh0NG1IOTRveDhlYmlQQ0p5Q1ZWZTdCRzVsRUQ0L2lTaUZIaXZUdkJjTVFaZ3FPa0FST1JkCit2TmdqY2k4VjVjZzFFYVZBT1UweG5hcXFKb1FBRERLZGc0aThTNVVYZTBSdXBiQjVzNFNJVWpFWVpXV2VxbTg4RlhaZjUzMERBTFEzCituWU9JdkV0VU5wdk9RRVFuRjBxRTN6ZWRnWWk4VERya3ZuaCt2dWtVYmVHcFlzeTI3Q0dtTXhDUnQ4V0E3YVl6RU5ISjJZangvVWxFCitxVkgxVkwwUU5oMmdMVVRFVTc5Y0luSWR1OGZlTHJ0TWgyaXI4NHFYWjhmc1hkMDFiUDN2ekFDSmg3cHFPQ0VBb0FnZEZpUU9oVUp5CitNSkhRbHMxWHZic1haV1cydWNTVURtVmxaVmF2SzEvc0VtblhuQldDZExRVFZnY0ZzZ0hBRG90R05QSHh2NTRiaTRlYUR0dlc3cStXCitWQjgybDdqdGV1NDh0SE5ucnh3RklLYXpFSkZIcVRVRXdKT21ZN1NXcHo3c1p0Y1Z6QmZJN2FaekVKRm43WmhSVU52TGRJaGpuVk93CitxQzhzbkJzU0hRakJRQlVNVk1WWkF2VEVrZi8xQU5BcGlhWVBBN29Oa0sycXNsMHMzYXFLYlFMWm9xcnZKR0t4TjdldXZNTnpoYWxmCitsYThhMlJQeDhHQkxyRUZROUFmUUcwRGZvLy9mRDBBdkhDMjgydWdBb0xzQTJRRmdwMEozUUxESmdteE1xUDFlV0dYanRHamRCODc5CitTMUtYVjF5NUUwZit1eWNpYWpNRjVtMnVudndGMHpsYXkxc2pZNUFMVFdjZ0l1OVM2QTVUZlE4YlZoN1oyYXZ6eFFwY2FRRlhLblFZCitnSXNBYlhjazIvK0dkT291V1RZZ3VRQnlSZlNZZGhVaVFEZ3JncnppeXAwaWVGTVZieW53R2l4ZHMvbGczMWV3ZWxUY21RaDB2TEpWCitJOFBueENLWDJaYU1FTVhGQ2d3RzVFTEV0U2VBWS81RGNFd25RRG9CeUFNQWdRQkgvbk9BQlF1MkFCVjEwU1lJM2xBYjZ5em9Pb2l1CitUM1RiODg5WlY2NlBPWjZtTlFRN29DekdpQ2c1RnJ3MVRkRXpJMk5sWldWV3Yydlg3QVBRMFhRV0l2SW93ZDluakttOU1TTjlUYWdLCis1UjlNWEduYktCSm9GSUpoU0c1a0k5TU9RdkVDUko0QlpHMXpvdVh2MjJxbkhqUWR5cXZtMTBRN05vZHhnMlZqaEVLdkErUXFlT043CityQm5BZWxHcFRhaldkTnZiWlYxcDZlSkVKanJPSzY1OEdzQjFtZWlMaUh6cFFHUDFwTTZBT0g5N0t3MDhVNHc5VkYyVUh3N2JtMHpuCitJQ0lQVTlUTmlOWkcwOVY4L3dsVjdVTUhFNTlSdGNjTHBBQkE5M1QxbFVGTkF0U3I2aE5oTzdIMHZkcXAzR0RoREI2cWlmYUtpSTVYCitrVThER0FPZ25lbE1EdGdsaWpxRkx0bmY2Y0JmdnpGaWJWTzZPc29ycmx3SjRLWjB0VTlFL21lSjVtOWFQcVhSZEk3VzhNdzB4WEFvCitNY1JEdFNNUnVaRWdMWGYyODRvcWg0dklGL1JBL0ZZQVhjUmZuMVh0RlJnSGtYSHhVTmpPSzE2MFZzVmViR1cxekd2NDY1MGZuL25sCit3ZkM3SjhkMmkyVEg3d0QwOHdDR0s4UlR1eFczUWc4VlRBUmtZczdCbkk5bjEwWWZGN0gvTUtPZy9qbW5PMUpvM0dmdklTTEtNRnRECitRd0N3R0hPU2lBenh4RmdqRWJtWmMydWhKbFNGY2c4bUpvdnFkd0JjcUdsWTdPTkNGcURYaXNxMWVqanJwM25GbFkvWklnKzl2M3pTCitPdFBCVEpsZFgzU1ZhT0p1SURZUndUa0hzNnNJWmdIV3JJcmE2T3RxNFQrNzd1N3ltRlBUR0FYQ05ZdEVsQ0o3Q0lCcTB5bGF3elBGCittRUxQNWNnWUVhVkNuU2pHeXNxc3ZPZlBuNFFEOFhzQkRFbzlsVmRKQndCM1dhcDM1UlZYcmxQRnJ6Zm5oQmRoY1dsRzFoV1pWRlUxCitJYlMzNjhlVElQSTFxSDFsb0wrYkJCZUpZc0hlYm51L1YxRmI4UDl0WFhQdDQyVXBIcXNnUUNJUXR6YUlLSTNrWE5NSldzczcweWpVCitPNzlVSW5JbjBkU0tzYnl4aTBia1BYL0JLNEFzUUtBTHNSTmNLWUpIOHc3RVg4c3RXamdCVUY5V0o2cVEyWFdGcFh1NzdYME5JbzhDCit1TkowSmhlNUVDS1YvYTVkODNKNVRmUlRxVFRreUUwVElnbzBoZTJadXNFN3haaGdvT2tJUk9SeGt0eEdDc09HbFVmeWloZitGMng5CitHc0RGRHFmeWt3dEZwQ3F2ZU5GTHVjV1Y0MHlIY2RLY211aTRpcFhSbHdYNk9BQWVzM0pxUXkwTGErYlVGL3lzYk5YSVpHZmZlR0hYCitVU0p5TVlIbG1ickJFOFhZMFEvMFhOTTVpTWpiQk5LMXJhL3BOM3BlajUyOWNwNEM1Ti9na2M5TUY3aE1nQ1Y1SlpWMS9Rc2ZQYzkwCittRlQ4dnJiZy9JcjY2RXExc0VRVWw1ck80eEdXcW55clh5SnI1WndWaFczZlVWVFI1dmNwRWRFbmFSNG1WSVZNcDJnTlQxeFk1Q2JDCit1UUFpcG5NUWtiY3B0RTBYZWYxdnJ1b1h6bzQ4QTU1NWxCekZtSkFWZWpXL3BQSTd3NGFWZStvenZIemRzRWhGWGZSN0laRlhvZHhtCitQU21LRyt5US9mVGNWU1Y5MnZRNllURkdSQ21MNU85UG5HTTZSR3Q0b2hpTEkrU1pvVVlpY3JFMjNIRS9yM2hCNTVBZFh3YkY0SFJHCitDb0QycXZqcHJsNDU2L09MRjF4ak9reHJQRnhmTk56YTArTWxBRCtHUDg0SU0wWWdRK0x4eFBLSG54bWYwNGFYZFVsYklDSUtEQnZ3Cit4TG94VHhSakFtVXhSa1NwYThNZDk1aFlENExUMGh5andDVUs2OW5jNHNwZjVvK2M2OG9DWis2cWtlM20xQmYreWxiN0dYQnRvSVAwCitjdnRRODIvYThBS09qQkZSNmp5eTM0UW5pakcxdVpNaUVUbWlZL25TY1IzTzlLVDhvb1dGVU55V2lVQUJZd2x3ajdiUGZqNjNlTUVRCiswMkdPTmZ1cHdvdmk4YXpuVmZWcjhNaDNvNmNJN3Fpb2p4YWM2V2xuamF6cUJLQmpCaElSa2QrSk53WnpQUEdGdzVFeEluS0lvRjNUCitHVy91S09RSG1RZ1RZRU1GMXJyOGtrVmZOQjBFQUNycW9uZExRbDhFTU5SMEZsK3pVWGFtcDNUSzlzNTIxRVRrYnBiTmtUSG5DRWZHCitpTWdab25MYTNmM3lvdk1IUURBaVUza0NyTDJxUHBSYnRPaXZmY2RWOWpRUm9IelZ5SjV6NmdxZkFQQTdBTzFOWkFnVXdZanlsY1duCisvVDVQV0hwK3B1SVFrYjhwcHlrNmlTTmpST1FNa2RNWFl3aEZQcGVoS0FSQVJEOGRpZU1mZWNXVkdkMnhjRTV0d1dncm52V0tRc2RuCitzdCtnRTQxLyt2VFA0TWdZRVRuR0U1OG5yaS9HZnZmazJHN2d6a3BFNUp3em5IdWxudGp4ejJmNkFhakxLMTcwbzNTZkMxTlZOU0ZVCitVUmY5c1lyVUF1aWJ6cjdvUkFMcnRPOHZFWXNqWTBUa2xHNER4MVM1dm9ad2ZURVd5ajdjMzNRR0l2S1ZRV2Y0K1dVWlNVSEhzd0M5CitOKzlBck9iYzZQeGU2ZWlnb241MDc3M2Q5OVlDK0I0ODhQM25SNko2K3ZlWDZwbmVuMFJFclJZUHhWMWZSN2oreTBnc3kvVy9SQ0x5CitsR0ZscTBhR1QvcVRrYXZDQUFaa05nNTlrb3lPaDhJdjVSWlZPbnJRZGtWOTRmWFEwRXM4d05rc0JRYVdsWldkOU5yanlNSGdla1dtCitNeEdSZjFtaXJxOGozRitNS1R4eGVqWVJlVWFudnJISVNjK1F5dSt3b3ljODhMa1lBUDFFc0NxL1pHRVpUbkhoM2xxcWtObTFCVitECis2a3B3V3FJYmhNNitjWFgzay8xZ2UrL09sd0p5eHFNbmlJaGFTd0VXWTZsU2FEL1RHWWpJWDBSaytNa2V0eFB4SHBuT1FxY1VWcFg3Cis4cDYvNEUvSnp2bWZ1MnBrMTRyNjZKOUY1RmNBSWc3bm8yUzFaSjEwOTB4TGJhN1hKQ0pIS2R3L3c4NzF4UmhVWFA5TEpDSnZVZWhKCitpN0dRSUsyYlIxQlNia2xFNHE4TUtGeDRkVnRlTkx1MjRMSjRQT3RGQVc1SlZ6QktUaVFVT3ZtMWh3aVBsQ0FpUjRtNGYxREgvY1dZCitCNFlYaWNoYkJDY2ZHWXVITER2VFdhaFY4bXhML3BaWFVqbTlOVStlVTFzd1hVVFc0b3c3WjVLN0NFZkdpTWhaSGxqdTVJRml6UDBMCis3NGpJYzg2YnM2THdoQXQxamNlYVRZU2hWbWtIUlVWdWNlVWYrbzViZXRKMVJlVkx4M1dvcUl2T1U1RUtBTzB5bkk5YUtaRklOQjMvCisySUNpUndkQmxadm5FSkd6eFAyRE9xNHZ4Z1RpK29xV2lEd29wT09PZjZoamRzczJFMUdvOVFTNEk1TFl2ejYzc1BLaVl4K2ZYVC82CitBcXZkNGJVQXBocUtScTFrdDJTZjhENnpFZUxoMjBTVURpekdVckZnZVhGbkFEbW1jeENSLzZqZzV1TWZlM3ZKdFAyQUhqS1JoOXBBCitNVmdzck0wdldqZ1JBR2JYUnllS2h0WUJHR280R1oyQkF2dG1qVnQ2NG50TU1OWkFIQ0x5djY1bmphenFaRHJFNmJpNkdEdlV6dWFvCitHQkdsaCtMNnVhdEdkajN4Qi9KbTVzTlFFbkpVWk5FTk0rNS9NeEVMTHdKdjNIbUNCWnp3L3NvZHU3QWJnR3NOeENHaUFPaVk1ZTZECituMTFkaklYaXR1dDNRQ0VpejRyRTR0blJrenorU3NhVFVOSWF0L1FaUEwrcUNIdjN1ZnJHSi8yZlY0OS93RXBJRVlDVEg4Uk9SSlFpCisyK1VIUDd1NkdGUGh0dlpFbEQ0Qys5WVRIbFJkWXlBS3BlQ0RqM3Bpem9KeGVHY2pKMU80blVMV252Q1lvTlJFRmlJS0JzdmxtM2k0Cit1eGdEemphZGdZajhURzZlVnovNkV3YzlpeFZaQm9CYjNIdE1VM00yRmo5eEU1NTZlaGdTdHF1LzJvTE1qdHU2N05nSCtvNnI3QW1nCit4RkFlSWdvQ1MxeGRUN2o2RzB1aGZVeG5JQ0pmeTJxeHJZbkhQdEN3dlBRakFLdk54S0ZVcUFyV3ZIZ0pIbGw0TTdidjdHWTZEcDNvCitxYnNMYTdjZiswQWtyaE1CWkJuS1EwU0I0TzU2d3RYRm1LaTQrcGRIUkg0Z0oyeUZic0g2dVlrazVJeHRPN3BqenNKeCtQdmF5MkNyCittSTVEUjZuSVNkNVhja2Zta3hCUmtOaUszcVl6bkk2cml6R0l1Mzk1Uk9RRGdxc3I2c1pjZU94RG02b24xa0t3N0ZRdklmZXpFeGIrCit2dll5UFBwNE1mWjh6STBXWGVESm1XTnE2bzk5SUxkNHdSQUFWeHJLUTBRQklSQlgxeFB1THNaYy9zc2pJcDhRbVhiOFF4RU4zNm5BCit1eWJpa0hQZS82QVhLaDc5Tk5hL01naktVVEpUM3JiRExYY2UvNkRBdXN0RUdDSUtHSUdyWjlxNXVoamptakVpeWdpVjZROC9NLzRUCit3eWNicWt0M1JCTHg2NkJZWVNvV09hTWxGa2IxeXVGWStNY29kdXc4eWRGeWxFN0xRN0hROWJOR3JkNTU3SVBuRlMvb0RHQzZvVXhFCitGQ1F1bjZibzJ0dUU5NjhaM2o3bllNNGgwem1JS0NqazZ6TUthbjUxc3Ava0YxZmVDT0F1QllvQTlNcHNMbktTWmRrWU52UWQzRERpCitaYlJ2ZDloMEhML2FMaUxMa2RDNTB3dHIvMzZ5SitRWExmcTZpdDZmNldCRUZFZ2FRZGYyRzZwTFhQbWg3OXBpcktJbU9nQVdOcHJPCitRVVRCSUlLR0xhR1c4OHRHclk2Zitsa3FlV01mSDZ5SnhNVVF1UkRRSVNJeUdJcEJBTnBsTEN5bHJIMjd3N2hoeE1zWU52UWRXQlpQCitNa2hTTTRDM0FMd3RLbThBOXBzcStzL3BZK3JmRW9HZThsVWpWNFh6Mm4rNEFVQmVwb0lTVWJDRnd1RzhqVXRMTjV2T2NUTHVQZkhlCitzbnU3ZkJZbEVmbUlLdkw3eHJNL0M2RHExTThTYlZ5R053RzgrWW1IeThxcy9PY0c1WXJJQlNyMk1OdVdUNG5vY0hBVXpiV2Ftck5SCis4OVExZU9uVndTaTQ4UVVNelB2QWRDUzMyNmJBV2dHZXQxUmZha21FM3RuMi9EV2J5OHJLVHFoa1o1eWhvZngySDA1UUZtSkVsRUhhCitFdXNEZ01WWVc0aFlmZlRVOTlXSWlCd25xdC9FYVl1eFV5Z3JzeHVBQmh6NVgrM1J4Nno4RndaZHBZcnhnRTRCTHo1ZGFjZk9ycWo4CitVeFRuRDl5Q0cwYThqTE43N1RJZHlVMDJBYWdVUzVac2VYcjR1aE1McitTV1U2cmdtNmxISXlKcXZZVGwzazBCWFR0TmNVNTl3U3hWCisrYjNwSEVRVUxLcjY2Wm5SdWlXT05scFdadVU5UDdnUVluOFppaEs0K0xNM3lFUVU1dy9jZ2h0SHZJemVaKzAySGNjVUJiQk1SQjdjCis4c3p3MnBPTmZLVWlyMmpSWnlENlp5ZmJKQ0k2RTRYTTNGdzlxY0owanBOeDdRVkJSVjIwRE1COXBuTVFVZUM4dlRYY2N2SHAxNDRsCitiMEJSNVZDMTVQdXErbm00K0RNNHlFUVU1dzNZaWh1SHY0dyt2UU16VXFZQWxxbFlQNW81WnNXTGFlbGhRbFVvNzBEOFZRQkQwdEkrCitFZEdwcU56YnVHTFNqMDNIT0JuWFRsTUV0RGV2VTRqSWdFRjk0OWwzQWtqTEhiUk5LeWEvQ3FEMG5KSkZWMXFLWHdGNmJUcjZvZVNwCitDdDdkMkI4Yk52WERlUU8yWXVTMUwvbDhwRXhmVkV2dW1UbTZkazA2ZThuZkg1K3V3a0tNaUF3UTkyNXY3OXBxcDZJKyttY29QbU02CitCeEVGMGdkMmMvYjVzOFl0VGZQeEdpcDV4WldUQWZrRmdMN3A3WXVTSlFDR0RONkk2ejcxQ3M3cXNkZDBIQ2R0aGVxL1R5K29lK3kwCit1eDg2b0hkMGZzZDJvZkM3QU01T1p6OUVSS2Z3eDhicXlSTk1oemdaNmY4bFFRQUFJQUJKUkVGVTkyNVhhTHUzZ2lVaTMrdHJ0VHY4Cis3K252UnJTeGVzckNVQ3c4UkFYbFFIb3ZpQ2s1Q3VEMXR3Wmk5cnpQb09xSjBkanl3Vm1tSTZWS0FmMjlEZnVpR2RHNlJla3V4QUNnCitmVGowNzJBaFJrU0dDRWZHMnE2aUx2b3VnUE5NNXlDaXdHcXhZVjg1cTZEK3RVeDFtRnU4NEZxQlZRSGd3a3oxU2NrNXArOTJETC82CitOWncvWUF0RVBGVkRiNENOV1RNS2E1L0tWSWU1eFF1R0NLejE0Rmw4UkdTSzRLM0c1Wk5kK2QzcTNwRXh3UE8zSG9uSTA3SXNoT2FWCityeHNXeVZTSG02dHZlN2JuOXYyWEt2VGJBRm95MVMrMTNmc2Y5RUxWWDBlajR0SHhlUFdOYzJIYmJ2NDZCUURFUmZUbjRYRExKWmtzCit4REJ5VlZoZ3pRTUxNU0l5U2QxYlY3aHlaS3g4M2JDSXRhZkhZYmcwSHhFRnl2ZG5GTlQrSk5PZDlpOVpjSWtGYTQ0b3JzNTAzOVIyCitYVG9md0RWWC9oT1hYclFCV1pHMGJNU1pQTVVMdHRqVE16bksreTk1eFF2dkJlUkhtZTZYaU9nNGRtT25jQllXbHlaTUJ6bWVLNHVkCit1YXRLK3NUajhROU41eUFpQW5CWVZhK1pHYTM3UjhaN25sQVZ5ajhRLzRvQ1B3WFFQdVA5VTV0bFo3Zmdrc0h2NFlwTDMwR3ZubnRNCit4MmtDNUx0ZDluVCtUV25wNG94ZmdPU09YVGhNYkZrRElDdlRmUk1SSFMrY2lQZCtyM2JxZHRNNWp1ZktZcXk4YnN3bEZxeFhUZWNnCitJanBDRzBPeDhGVjNsVlR2TU5GNzd0aUZBOFcyNW5NYmZHODV1OWN1WEQ3MGJWd3laQ01pNFV5UGx1bUx0aTFUWnhYV3ZwWGhqZ0VBCisvVWJQNnhIT3pub1JxZ05NOUU5RWREeUZmZEhtNnR2ZU1KM2plSzZjNUI2V1VFL1RHWWlJL28vazJSSDd6K1ZMeDNVdzBmdm1aVk0yCis5dHkrYjVRQVB3TGdzamx3ZENvZmJ1K0I1ZlVqOE92eVV0U3V2aG83ZG5YSlJMZHhBRC9jR282Tk1GV0k5WTdPN3hpT1JKYXdFQ01pCitON0ZndVhMZG1DdEh4dWJVRmt4UWtTclRPWWlJanFWQWJTemM4cmt2ajFwOXdGU0dBWVVMcjdZdGVSVEFCYVl5VVBKNm43VWJRd1kxCitZTWdGbTlDdDYzNm5tMzliTEprNmZYVE5DMDQzM0ZwbmphenExTEY5L004S0ZKaktRRVIwVW9MUE55NmYvQ2ZUTVk3bnlwRXhGZUhJCitHQkc1amdEUlNDTHJtZks2TWJtbU1teXFtZkpDTEp4ek9RUy9BODhsODV4dE83cGoxVE5YNE1GSFBvZlo4ejZOcDU2K0VwdTM5azUxCitOMGFGeUlOMmMvWVZKZ3V4QVNVTDh6cDBpRC9EUW95STNFZ2dIQmxyclRtMWhUOVEwUithemtGRWRBcmJ4TWFNNllXMVMwMkd5QzlhCitXS2dpandEb2F6SUhwUzRySzRiK1oyL0hPZjIyNDV4KzIzQjJyOTNJem03VjZRWmJMZFc3cGtYcmF0T2Q4WFR5U3haK1dsVm1BK2hsCitNZ2NSMFNtcDNOdTRZdEtQVGNjNG5pdUxzWXE2NkFNQXZtSTZCeEhSNmNtaVVNejZtcW1OUFFDZ2YyRlY5N0RFSDFKQnFha001RHdSCitSZGN1QjNCMnIxM28zV3MzK3ZUYWhUNjlkcU5qaDZaam4vYTRKT1JMMDR0cWRwdktlVzUwZnE5WUtQU0FRRzQxbFlHSXFEVkU5SUdHCis1Vk8rWmpySDhWeGFqQlZXQWpySmRBNGlvbGJZcThCL3g4SXR2eksxbHV6aDJvSytmNnE1OGNkdnZwVS8xYmF0a0lrTWxCbGRPaDlBCitidi90aVVnNE5tL2RTNFB2ZmI5dTBnY21jZ3dhLzNCT1U2ejkxd1g0Qm9DTTdFeENSSlFhcld5c25qTEZkSXJqdWJRWWk5WUJHR002CitCeEZSRyt3UTBmOUczSnFUaVpHS1IycWk1eVJFU2lINk9RRFhBSkJ0TzdyalQwL2VpTjE3ZUcwY0VEWVV6OEhDbitKcVYyMnR2bTFMCit1anZzTjNwZWowZ2tNa01GM3dEZ3l2VVhSRVFuSTBCZFEvWGtxT2tjeDNOck1mWXlnTXRNNXlBaVNrSVRSQllpb2IrZlVWaTczc21HCit5OHJLclA3WHJZMUNjYmRDeHdJNFlSU3NwU1dNSit1dnhSdHZjVmZ4Z0VrSXNBeUNoeHF1ZnFjV1pXVzJrNDNuamwwNFROUzZHNnFUCit3UVBJaWNpYlhtNnNubnlGNlJESGMyY3hWaHQ5SDRMK3BuTVFFYVZDZ0hkeFpGM1BINmNWMWJ5U2JEdmxxMGIydE9KWmR3TDRJb0NCCityWG5OK2xjR29lNXZWeU1lNTZ6RkFOb0l4ZS9qc2RnalcxZmVzU3U1SmxRR0ZENCsxTGJzQ1FxVUNuQytzeEdKaURKdVMyUDE1SE5NCitoemllTzR1eHVtZ1RnSGFtY3hBUk9lZ2pRRllwc0VvdHJNZWhyTGRtalZ0NjZGUlBMcThiMDBYRUtyWVVuMWRnTEpMNFRQeG9ldy84CisrY21SMlAxeFRrckJ5Yk9hQVN3VHlHSXJGbHF4c2I1MDc2bWUySGZjMGc1aGU5K0ZzSzByQkhvVGdGRUFlbWNzS1JGUitqVTNWazkyCiszY2krNjRxeGg1OFpuMk0zTmU4em5ZT0lLTTFzQUpzQWZWOGhIMXNpSDZ1cUpaQ3VDaDJFSXlNUktaOEZlYmdsZ2o4dnV4SHZiZUprCitnNEN6QWJ3cndOc0FQclpGYkZIdENxQWJnUDRBQnNDbFo0OFNFVG1sWGFTcDg5dExwdTAzbmVOWVlkTUJqbWNmYk83SnJ3TWlDZ0FMCit3TG1BbkNzQVZJK2MzNndPbitPY25SWERyYmVzUk8xVFYyUGRLeGM2MmpaNWlnVmdrQUtEQUVDVTU0VVRVZkEwTjBkNkFuQlZNZWJHCitzcWU3NlFCRVJINWlpYUpvOVBNb0diTUdsdVhvdmc1RVJFVGVJVm5kVEVjNG51dUtNUTJKNjM1SlJFUitjTVhRZDNEckxTdVJuUlV6CitIWVdJaUNqalZOUjFkWWJyaWpITHRsMzNTeUlpOG90ejg3Zmk5Z2tyMEtsamsra29SRVJFbVNWd1haM2h1bUpNTFk2TUVSR2xVNS9lCit1ekQxMW1ya2REcG9PZ29SRVZFbXVhN09jRjB4SnRDdXBqTVFFZmxkOTY3N2NQdUVXbzZRRVJGUmdIQ2FZbXR3QXc4aW9nem8zbTB2CitKdDVTajZ4STNIUVVJaUtpOUZPNGJ0REhkY1dZYll2cmZrbEVSSDdWcC9jdTNGTHlOL2NkT2tsRVJPUTBidUJ4WmdMME1KMkJpQ2hJCitMamozZmR3dzRtWFRNWWlJaU5LTnhkZ1pDVGZ3SUNMS3RPcys5U3FHWE5CZ09nWVJFVkU2dWE3T2NGOHg1c0tGZFVSRWZpZWlHRi8wCitEUHIwM21VNkNoRVJVVnBZTE1aYXBZdnBBRVJFUVJRT3h6RmgzRlBvbkhQSWRCUWlJaUxIS1N3V1k2M0FOV05FUklaMDZYd1F0MDFZCitnWTRkdU9VOUVSSDVqZnRtNExteEdNc3hIWUNJS01pNmQ5MkhXeit6RXRsWk1kTlJpSWlJbk9TNkdYaXVLc2JtcmhyWkRrRElkQTRpCitvcURyMjNzbmJyMWxKYkt5ZUFZWkVSSDVSdmlpQ1ZWWnBrTWN5MVhGbUpVSWRUU2RnWWlJanNqdC94RytNSEVaY2pvZE5CMkZpSWpJCitFUWRqQnp1WXpuQXNWeFZqelNvc3hvaUlYS1JYenoyNDQ5WnFkTysyMTNRVUlpS2lsTVhqSFYxVmI3aXFHSU50dWFwU0pTSWlvR3VYCitBL2pDcmRYbzIyZUg2U2hFUkVRcHliSnRGbU9uWWdHdSt1VVFFZEVSSFRvMDR3c1RxekhpcW4rYWprSkVSSlEwR3dsWERmNjRxaGhECitTRnoxeXlFaW92OWpXVFp1dW40ZEpveC9DdTJ5VzB6SElTSWlhak1WZDgzRWMxVXhKaHdaSXlKeXZVSG5iY1pkazVlaDExbDdURWNoCitJaUpxRTFWMVZiM2hxbUpNbFNOalJFUmUwTDNiWHR3MWFSbXVHZlk2eEhRWUlpS2lWckxVWFlNL3Jpckd4R1dWS2hFUm5WbzRITWVZCitHMS9FRnlZdFE0L3UzRzJSaUlqY1Q4VmRneit1S3Nac1RsTWtJdktjZm1mdndJemJsbURFVmYrRUpXbzZEaEVSMFNrcFI4Wk96Ukp0Citiem9ERVJHMVhUaWN3RTNYcjhQdFBKT01pSWpjVEd5T2pKMlNhTVIwQkNJaVN0NDVmYmZqaTFPZndFM1hyME00bkRBZGg0aUk2Qk5FCitKV3c2dzdIY1ZZeEJRcVlURUJGUmFxeVFqUkZYL1JPenB2NFY1K1p2TlIySGlJam9meW5ncW5yRFZjV1lyZTc2NVJBUlVmSzZkZDJQCitTWit0UStrdEs5RTU1NkRwT0VSRVJMRFVYZldQdTRicFZDemw0bThpSWwrNVlPRDd5RC9uUXp6ejNHVjRidDFGc0pXYjRSTVJrUmtxCis3aHI4Y1ZWbHFLS3V5a05FUk03SWlzUngwL1hyY05lVUo1SGJiNXZwT0VSRUZGQ2NwbmdhNHJKZkRoRVJPYXRQcjEyWWVtczFTbTlaCitpYTVkRHBpT1EwUkVBV081YlBESFZkTVViVVZJT0h1RmlNajNMaGo0UHM3TjM0cjFyd3pHNm1ldlFFdUxxNzZPaUlqSXAxUXRGbU9uCitZbGxxS2RjU0VCRUZRc2l5Y2ZYbGIrREM4eHZ3OUhPWDRlVlhMd0JYRFJNUlVYcTVhMlRNVldGczVkYjJSRVJCazlQcEVFckdyTUdkCitVNTVFLzc3YlRjY2hJaUlmNHdZZXArZXFYdzRSRVdWTzM5NDdjY2V0MWZqc3phdlJPWWZyeVlpSXlIbHUyNlBDVmRNVUFTUk1CeUFpCitJbk5FRkVNdWFNRDVBN2RnN1lzWFk4MkxseUFlZDlYM0poRVJlWmk2ck41dzFjaVlBSWROWnlBaUl2TWk0VGh1R1A0UGZPbk9QMkhvCitoZTlCZUFZbEVSRTV3SUs2cXQ1d1ZURUdjZGN2aDRpSXpPcWNjd2pqaTUvRzdSTnEwUHVzM2FiakVCR1I1NG1yNmcxM0ZXTXF6YVlqCitFQkdSKytUMi93alRiMStDOFVWUG8yT0hKdE54aUlqSXEyeDMxUnZ1V2pNbU9NeDlqWW1JNkdRRXdOQWg3Mkh3ZVp2eDNQcUw4T3dMCitseUNSNEhveUlpSnFQZVUweGROeVZhVktSRVR1azVVVnd3M0QvNEZaZHp5QmdYa2Ziak9kaDRpSXZJVEYyS2x4bWlJUkViV0NRdC9vCisxdlhqb2xXLy8yWWZFUlFEZU1OMEppSWljai9sbXJGVFU5RVcweG1JaU1qVmRxdkt0N3Z1NlhyNXpJTDZHZ0JvV0Q1NVJXUFQyWmNxCitkQllBbmhwTlJFU25KdTRhL0hIVm1qRUxhT2FTTVNJaU9va1lnTGwydU9WN3MwYXQzbm5DVDFlUGltOEdadWZmTXJjS2g5dDlXNkgzCitBTWpPZUVvaUluSTVkMDFUZEZVeFprTU9DSGZ3SUNLaVl3aGtTVnp0Zi90aXRPN2RNejIzNGE5M2Znemcyd05MSG52RVZ2dS9GQmlmCitnWWhFUk9RUkFodzBuZUZZcmlyR1lOczdJV0k2QlJFUnVjT2JhdUdiTTBiWFZMZjFoUnVYVDN3SHdLZnppaXR2Z3VCK0tDNU5RejRpCitJdktZaE5nN1RHYzRscXZXaklWVmRwbk9RRVJFeHUxUzFYdTY3T2x5eWN6UnRXMHV4STdWV0QzNXFjYXIzN2xDb1hjQTRNNkxSRVFCCitGMHJvaVZQZERYTFZNTlQ5YTRhM3p6bVljOGgwRGlJaU1pSUcwUWZhdDRSL2RGdEo5VDZuR3g4NHBxcExJaHovQVFSZkFSQnh1bjBpCitJbksvQ0xxMjIxQmQ0cHAxWTY0cXhnQ2dvaTU2QUVCSDB6bUlpQ2lUZExYWThwWHBoYlgvVEhkUEEwc2V1eUJoMjcrR29DamRmUkVSCitrYXZzYmF5ZTNOVjBpR081YTgzWUVidkFZb3lJS0NpMkF2TGRHUVcxOHpQVjRkSDFaTVc1eFpYakJIZ0FRSDZtK2lZaUlxTmNOVVVSCitjTm1hc2FOYzkwc2lJaUxIeGFCNG9DWGNNbmhHUVUzR0NyRmpiYTZldkRRV3pybElSSDhJd0ZYbnpoQVJVVnE0cnM1dzNjaVlBanRkCitOM2VTaUlpY1ZBL1lYNTBSclgvVGRKQVBsbzQ3QktEc25PTEhIcldndndMMFp0T1ppSWdvVFlURjJCa0o4SkhwREVSRWxCYnZBL0tWCitHUVUxVDVnT2NyejNxeWUrQjJCY2ZzbkNUNnZLYndIME41MkppSWdjcHU3YlZkZDEweFJGNVQzVEdZaUl5RkUyZ05udFk2R0wzVmlJCitIYXRoK1pRbll1R2NRUUw1T1lDRTZUeEVST1FrZFYyZDRicVJNUWcybUk1QVJFU09lZFcyTVhOV1llM3pwb08wMXRHcGk5L09LMTcwCit1TUF1VjhoVnBqTVJFVkhxVk1SMWRZYnJSc1pnc1Jnakl2S0JKZ0EvN0xLbnkxVmVLc1NPMVZnOTZlV0dwcjRqVlBRZUFBZE01eUVpCitvdFJJd25KZG5lRzZrYkdXcHZDN2tleVk2UmhFUkpTODVmRzQ5ZVc3aTFjMG1BNlNzdFdqNHB1QlgvZS91ZXFQb1VUOE53QStZem9TCitFUkVsSjVTd1hEZE4wWlViRjFiVUZlNEF0S2ZwSEVSRTFDWTdWUERWbVdOcUh6TWRKRjN5aXlvbnFlRFhBTTR5bllXSWlOcGtlMlAxCis1TjZtUXh6UGZkTVVBWWdMRjljUkVkRnBpQ3dPeFVJWCtia1FBNENHRlpNWHFhV0RCRExiZEJZaUltb0xlZGQwZ3BOeDNUUkZBRkRvCitHNEI4eW5RT0lpSTZvdzlVOWU2WkJiVkxUQWZKbE0zTHB1d0JNQ3UvWk9GeVZma2RnTDZtTXhFUjBSa0kzaklkNFdSY09USUdrZWRNCitSeUFpb2pNUVdad2xpYUV6bzNXQktjU08xYkI4eWhPaFdIakkwVkV5TloySGlJaE93N2JYbW81d01xNGNHWk1FMXFnN3kwUWlJb0kyCitXb3FaMHdwcWEwMG5NVzFqZmVsZUFMTUdsQ3hjYUt2MU1LRG5tYzVFUkVRbkVRcXRNUjNoWkZ4WjhreUwxcjRPd1I3VE9ZaUk2Qk1VCit3R3lyZmZ0THBrWHJBbCtJSFd2VDhpbC9qNFU3WFhyMHNHamJkQjRpSXZxRVBZMVh2ZlcyNlJBbjQ4cmRGQUdnb3E1d0JhQ0Zwbk1RCitFUkVBWUtNbE1uM2FtSnIvbjcwN2o0K3FPdnNBL252T25jbkNEb29JaENRbzdsWkZ0QmJReXBMTUpHR3BiU1hLWmxVSWFCZTN0eTV2CitXK3UwMXJaYVc1VmFMUVN3b2trd3RGVkJza3lHeFFWY1hsSHJVb3VpRUFqaWd1eGJtTG5uZWY4QUxTaExNbk5temt6bStYNCtmajRxCitNOC85SlNSMzduUFB1ZWNzc1IwazJlV05xQm9FNWxsZ25HbzdpeEJDQ0FDRWhZMDE0MGJham5Fb1NUa3l0ZzhuNWJ4T0lZUklNeEZtCit1bWQ3KysxblNpUFdNbzBMeHk1MzIzdk9CZUVQQUNLMjh3Z2hSTnJUeWJzZVJWSStNd1lBaXVnNXpmSTh0QkJDMk1LRWY1R0xTVlA4Cis5U3RzWjBrMVRmTktkd080SlhkRXhSUEVOQXVNczIxbkVrS0lkS1dVZnM1MmhzTkoycEd4ZFU3ejgvTGNtQkJDV0JFbTRydTdiT3I4Cit6VEovVUJxeEdLeGRPSDVGNDY2ZTV6SDROZ0I3Yk9jUlFvZzA5UG5xWGIyU2N2RU9JSW1mR1FPQThnYmY0d0RHMjg0aGhCQnBnN0VjCitwQ2VYRlliZXRSMmxyY254UDliUElXY0dDRU50WnhGQ2lIVEJ3S05yYThkZGFUdkg0U1R0eUJnQU1HR3U3UXhDQ0pFbWRqSFRiWjIzCitkUDYyTkdMeDBWUS9jVlZqM2RqaERKNEtZTHZ0UEVJSWtRNEk2Z25iR1k0a3FadXhqNXk5ZFFBK3NwMURDQ0hhdURwU250T24rT3J2CitMaTJkNTlvTzA3WVJyNjBkUDBOSDZGUUFUOWxPSTRRUWJkeEhqUjFVVW0vRmt0VFRGQUdndk1IM0d3QS90NTFEQ0NIYUh0b0kxamVXCisrUm9ldDUwa1hlV1dWRTBrNXZzQUhHTTdpeEJDdERuTXYybXNHMys3N1JoSGt0UWpZd0RnaEowSEFPeXluVU1JSWRxWUNpZXNUcGRHCit6SzYxTldNZjg3aVIwMEdvc3AxRkNDSGFtSjFlOGs2ekhlSm9rbjVrREFES0czejNBYmpCZGc0aGhFaDFCTHhQekQrZTVHdEk2bWtiCis2U2kvdVBKaUJ2NEM0QXpiV1lRUW9nMzRZMlB0dUovYURuRTBTVDh5QmdBUkZia1hRTFB0SEVJSWtjSjJBZmpmVHBzN255bU5XSEphCitVenZ1MlE0ZFBPY1M0V2NBeTR3UUlZU0kzaDVvOTQrMlE3UkVTb3lNQWNDTW9QOXVJcjdGZGc0aGhFaEJ6MFFpNmlmWEZ0ZXRzUjFFCit0RXpPeU9yZVRpVDhPeEJOdEoxRkNDRlNELzIyc1hac1NxdzVrVExOMkt3WFJuZlV1L2Y4QjBBdjIxbUVFQ0pGZkVpZzZ5WVgxaSswCitIVVJFSjdmazhaRUVaeHFZKzlyT0lvUVFLV0w5cnQyZVV6OWJXcnJEZHBDV1NJbHBpZ0F3NmNMNTI4RjhxKzBjUWdpUi9HZ2pBVGR2CitiNy85VEduRVV0dmFtZ25QdU8yZE13QzZHY0JHMjNtRUVDTHBFZDJTS28wWWtFSWpZd0RBREpvWjhqMFBZTER0TEVJSWtZUzJndmlQCitLaXY3L2trWHpwZE5oZHVZVTBiUDZyZzduSDBqQVRjQjZHdzdqeEJDSkJzaVBMK21adXpGQUxIdExDMlZVczBZQUV5djk1MnFGRjRICitrR1U3aXhCQ0pJbWRZTXlLTU82NjFoLzgxSFlZRVY4NS91cHVIaWQ4SFRQZENLQ1Q3VHhDQ0pFa21sbGp3TnI2Y2UvWUR0SWFLZGVNCitBVUI1Zys4MkFMK3puVU1JSVN4YkIrYS9PaEZQK2RVbHRaL1pEaU1TNjBUZm5PTWlqcWNNd0RVQWNtem5FVUlJbXhpNGRXM3R1SHRzCis1Mml0bEd6R0FrdUdlSHFITTVhQjhFM2JXWVFRSXVFSUs4QTBUWGZkV0RYMXZCVmgyM0dFWllHQXluMzU1QkZFdUE2TTRValJ6M1loCitoSWpCeTQwZFBJTXhyOVMxSGFTMVV2YUVQV094L3d4eWVRV0FUTnRaaEJBaUFYWVJVTUdrSGl3cnFIdlRkaGlSblBvV1ZaNmxDVDhHCitlRHhBN1d6bkVVS0lCTmhETHZxdkNZNzdqKzBnMFVqWlpnd0Fab1FLYnlLbWxOalFUUWdob3ZRaG1CNEs3L1hNL3VISWhadHRoeEdwCitJWGRFUlZmU2FoTEExd0k0d1hZZUlZU0lGMmE2Zm0zZDJHbTJjMFFycFpzeFp0Q3NrUDhwQm8rMm5VVUlJUXhiUnN3UGROclM1WitsCitwZk5TYnRxRlNCS0JnTXA5OGFSaHBOVDFBSTlBaW4vdUN5SEVWOVEwMW80ZG1VcXJKMzVWeXArVVo5Y1VkM2U5N2h1UXphQ0ZFS2t2Cit6TUJqanFQdW1UU3NicVh0TUtKdHlmZFZuc29PYmdFd0FZRFhkaDRoaEloUlUyUnYrSnoxaTM3d3VlMGdzVWo1Wmd3QVpnUUxMeWFpCitSUUFjMjFtRUVDSUtZUWJQMVl3N3IvRTF2Rzg3akdqYitwWlU1REZ3RXpOTmdXd1RJNFJJVFJwQVlXUHR1TVcyZzhTcVRUUmpBRkRlCis0THNEUU1CMkRpR0VhSVZtQW1hNTBIZFBMUXl0dFIxR3BKZStKUlY1THVNMkFsMEZXUXhMQ0pGUytKZU50ZVB2dEozQ2hEYlRqQVVDCitBZFg3d3VWUGdUSEtkaFloaERpS3ZReWVRUjdQM1dWRGE1dHNoeEhwclhmeDR6a2VwdHRBVkFZZ3czWWVJWVE0aXFjYWE4ZCtMNVdmCitFenRRbTJuR0FHRFdDNk03dXJ0M3YwU2cwMjFuRVVLSVEyQVEvWjBpK05ua292cFZ0c01JY2FBVFJsWG51dUh3YjBBMEFXM3Mra0FJCiswV2FzZE1LZUN6NE1sVzYxSGNTVU5uZXluYlc0NkJUdDZwY0JkTGFkUlFnaER2QWlNZDg4MmRld3pIWVFJWTZrVDlIajV5dFM5d0FZCitZanVMRUVJY1lEdERmMnR0N1lSLzJ3NWlVcHRyeGdCZ1JyQndOQkU5Q1VEWnppS0VTRzhNL3JmU2ROdGtmM0NCN1N4Q3RFYWZvcXJSCitpdmozQUU2em5VVUlrZlpjYVBwT1kvM1loYmFEbU5ZbW01VXB2b2I1QlB6VWRnNGhSRnI3akpsditNZ1RQbHNhTVpHSzF0V05uZDk0Cit3WHRuTXZnSEFEYll6aU9FU0YvTWRGTmJiTVNBTmpveTlvWHlvTzhCRUs2em5VTUlrVloyQWJnblUrUGVLL3pCbmJiRENHRkNEOStjCis5dGtlNTJabTNBeFFPOXQ1aEJCcGhQaSt4cHJ4TjltT0VTOXRjbVRzQyt1WEQ3b1I0SC9hemlHRVNBc01vbm1rUEtlWEZRWi9KWTJZCithRXMrQ1Y2eGMwM04rSURyZUU4RzgyTUEyc1FxWmtLSTVFYkFnc2IyM3B0dDU0aW5OajB5QmdEVEY0eHFwN0thRndINGx1MHNRb2cyCitpdkdLVXVxR1NRVjFMOXFPSWtRaTVJMm9Ha1JhMzgrZzgyMW5FVUswVVl6bGJrZFBRZE84MHQyMm84UlRtMi9HQUdCNlEwRm5SV29SCitHQU5zWnhGQ3RDa2ZnZkNyOVM4TW1oa0lCTFR0TUVJa0ZsTnVVZVdsUkxnWG9GemJhWVFRYlFqaFg2N3JHZFpVWDdySmRwUjRTNHRtCitEQUJtMXhSM2R6M3VFaERPc0oxRkNKSHk5b0x4VjlVdTZ4ZVRMcHkvM1hZWUlXenFOV3BCdXd4MzJ5M01kQXVBYk50NWhCQXBiNlh5Cis0dUxWODhkOVlqdElJcVJOTXdZQTVhSGhQY0RPVWdDbjJzNGloRWhaejBEanVqSi9jTFh0SUVJa2s5N0ZqK2Q0bUg0cm0wWUxJYUpICitxNkFqMzI2c241ZzJLN2ltM2NseWVrTkJyb0xUQVBESnRyTUlJVkxLYTZSeDQyUi84RG5iUVlSSVpuMUxLcjZ0bWU0SDBOOTJGaUZFCitTbG5wY2Fud2crRFlkYmFESkZLYlhrM3hVS1lXaHRaR05GOEUwT3Uyc3dnaFVzSW5JRXhldjJ6UStkS0lDWEYwcTJ2R1A5ZDR3WHZuCitnWGt5Z0xTWVppU0VpQlcvNW9Ybm9uUnJ4SUEwSEJuN3dsK1dET21RRWNsNEVrQ0I3U3hDaUtRVUJ1TmhUZnFYVXd0RFcyMkhFU0lWCisvWGQvTXJvVlFKYnRQRUtJNU1QQWM1NndaL1NIb2RLMC9LeE4yMllNQVA2MGZHQjJ4eDBkNTRCd3FlMHNRb2drUW5oU2szUHoxT0cxCitIOWlPSWtSYjBLZDQ3b2tLK2w0QWw5ak9Jb1JJS245M08zaXVhT3ZMMXg5SldqZGpBTUFNS20vdzMwTEVkd0Z3Yk9jUlFsajFMaEhkCitOTG1ndnM1MkVDSGFvcndSRlVQQmRCOFlaOXZPSW9Td2lnbDB6NW9MVnY0TWFiNDFUTm8zWTErWUdmSVhNYmdTaks2MnN3Z2hFbTRUCitNLys2eTVZdUQ1YVd6bk50aHhHaVRRc0VWTzdMSjAwZzBCOEFIR2M3amhBaTRiWVI4UlZyYXNZL2JUdElNcEJtN0FEVEZ4V2ZxTFQ3CitPSUJ2MmM0aWhFaUlNREg5MmZFMjMzblYwS1ZiYkljUklwM2tYL0pJRjkyY2VRY0JQd0xndFoxSENKRUFqT1hRa1FtTndTdGtlNWo5CitwQm43aXNDU0laNWU0Y3ovSWVJN0lSOE9RclJsSVhib2hpbkQ2dCt4SFVTSWRKWXpzdUlrajFaM01mTVkyMW1FRUhFVElkQWZqL2wwCisyKzByVmt3TjJ3NlRUS1FaTzR4Wm9hS0Jtdmx2c2grWkVHM09HMHgwODVTQytwRHRJRUtJLytwYlBOZW5TZDhqejVNSjBlYXNKT2dyCisxOVJPZU1sMmtHU1VkdnVNdGRTa2dyb1hkZGVOWnpMVGJRRDIyTTRqaElqWmVoQ21kdDdjK1R4cHhJUklQcXRyTHc4MmZ2TzljNW01CitGTUFhMjNtRUVERUxFK2h1TDdxY0xZM1k0Y25JV0F2TUNBMC9tZGp6RU1ERGJXY1JRclFPQTlzVTRmZmIybTIvLzZaQkw2YnQwcmxDCitwSkplb3hhMDgwYTIzd2pnVmdBZGJlY1JRclFPZzRQYXdZK2JuaG4vdnUwc3lVNmFzVmFZRWZJWEVQTWZBSnhqTzRzUTRxZ2lBR2FECiszRitXRlN6NnhIWVlJVVRyOVI3KzZESGVqSXliR1h3amdBemJlWVFRUi9WdlpnNnNyUnMvejNhUVZDSE5XQ3NGQWdHVmMrSHlpUUFDCit6TWkzblVjSThYVU1QT1U0NnJaSncrcFcyczRpaEloZHZxL3lWRGk0bTRIUnRyTUlJUTVwRFlQdldIdkIrNCtuKzc1aHJTWE5XSlFDCitnWURLR2JoOEJDdStIYUR6YmVjUlFnQUFYbVhtbjA3eE5UeHJPNGdRd3J6ODRzZS94WER1QlhpdzdTeENDQURBbXd6KzQ5cmR2U3F4CitkR2pFZHBoVUpNMVlqSmhCc3hiNS9jejhFd0IrQUk3dFRFS2tvWGNaZEh0WlFmMC9pY0Myd3dnaDRva3B0Nmp5VWxMMGF6Qk90WjFHCitpRFRrQWxTclFIOWVYWHQ1MEhhWVZDZk5tRUd6Z29XOVhLaUpSRHdGd0FtMjh3aVJCdGFDY05kNlorL3N3TkNsY2tkT2lIUVNDS2pjCitsMDc2UGhIOURzQ0p0dU1Ja1FhYUNGUkJwQjllWFRPKzBYYVl0a0thc1RpWnNkaC9Ccms4QnNCbGdOeTVFOEt3ejVqcGoxNXY4d05YCitEVjBxVzA4SWtjWUdESmp1L2V5NERsY1JLQUNncCswOFFyUXhhNGg0dnRZMGIrMjMzbHN1ejRPWko4MVlBa3h2S1BnR0VSVVNhQWdZCitGd0hvWWp1VEVDbHFFNEEvNkQyWjA2YU9XckRMZGhnaFJQTG80WnZUUHN0eHJnZm9wd0M2MnM0alJJcmFRc0R6WUZyaU90U3didUhsCitiOXNPMU5aSk01WmcxZFZqbkcxZE41OEZwZ0VNK2dZVXpnVGpiQURIMk00bVJCTGJBZUFCajJmdnZWY05YYnJGZGhnaFJQTEtIVkhSCitGUzdkVElUckFMUzNuVWVJSlBZNWdIOFI4ZHNNZWd0TUt4bzdPRzlpWHFsck8xZzZrV1lzU1V5djgvZjBLUDBOVitGTVlzb25VQjZECitjd0hrQXVobU81OFFsdXdBOEhCRTQ5NXIvY0ZQYlljUlFxU092cU1yZStnd2JnWndEYVFwRStsckU0QzFCS3dGOFJvR05TcFdiMnNkCitmcXV4ZnVJRzIrR0VOR01wNFM5TGhuVElkck56SStUbUtlWmNNT1V3Y0J3RHh5blFzUXcrRnFCakFUN1dkbFloVEdCZ0d3Ri8xcDY5Cis5MDhkdW5TajdUeENpTlRWYTFUbHNaNHdiaUxDandCMHNwMUhDRU0yZ3JBUmpJMEFOaExvVXdZK0llYjFUR290STlMWTdPckdUNEpYCis3TFFkVkJ5Wk5HTnRTSFgxR0dkcnQwM0hzdkljU3k1MUozYTdNM0FjZ000TTFabUl1d0RjQlZDZEFlNE00TUIvNUs2aHNJK3dHWXdICit3czNlYVQ4Y3VYQ3o3VGhDaUxZamQwUkZWOFc0bnBtdWd6eFRKcExEVGdCYjkvMURXeG04VlRHMmdtZ0x3RnNZdkJXa3RyTFdueXFpCitUN1hHUmljVEcxZG5lamJLVk1LMlE1b3hBUUFJTEJuaTZlczZuVjFRNXpBNVhUeU16cTdXWFFCMEpsTDdtemgwSnFJdW12Zi9PMmpmCisveWQwQWFNTDVPZEpSSTAyZ3ZWOTJSSFBneE5LYXJmWlRpT0VhTHY2RlQvZUtRejFFd0EzQUpBWkpTSmFER0FMZ00wQXRvS3hCWVN0CitUTFFGekZzVThWYnd2bjlucUsxdzlCWkVuSzNzY2Jmb2lIZFZSLy9wQUFBZ0FFbEVRVlJMVTNQM2JiSkpzZ0RrNGxrWU5MMmhvTE9qCitNcm93Njg3azdtdmtRTlJGRTNjQjhiRUUxUXZNeDRQUUU0eWUyRGRxNTdFY1c5aTFub0Q3bXoxNy8vcWpvVXQzMkE0amhFZ2YzWWRVCitkMmlYRmJrV2hPc0I5TGFkUjFnVkFmQXBnSThBK2hqZ0RRUnMwTUJHN0crdUhPS3QwTFNGdko0dDJJMnRINFpLdDlvT0xkb0dhY2FFCitOWUZBUU9WZC9NcHhPaHpPY1JYMUE2TWZNZm9CT0FtRWZ0alhySWsyaVY0SDZ6L3BicHVlbUhyZWlyRHRORUtJOUhYR21PcU03VHZkCit5NGo1UmdEOWJlY1JjZk1wUU84emVCVUI3eE5vbFZaNmxXTHYralUxWXo0QmlHMEhGT2xKbWpHUnRLWTNGSFIydERxYkZaMExjSDhBCis1MkxmQnRveW1wYWFOSUFhUmZTblNRWDFTMnlIRVVLSXI4b3JyaHdHd2sxZ2xFQ3VrVkpWaElCM0FieXVpVjl6Z05kcHIvZGZNcElsCitrcFdjYUVSSytkUHlnZG50dDNjOFN5a2FDUEFRQUJkQzltaExkcnVaTWNmeHFQc21EYXRiYVR1TUVFSWNUYjZ2OGxRNGRDT0RKd0xJCit0cDFISE5GR0FDOFE4Q3hwWGg3dTVIMnJhVjdwYnR1aGhHZ3BhY1pFU21NR3pRcjZ6bURpaTBGMEVZQ0xBUnh2TzVjQUFId0FZS2IyCis3SjBweTlNTElWSlJ2K0xxN2hHS1RHYkdaQUFuMk00akFBQWJHUHdjTVQzSGpHZlgxby85dDB3eEZLbE1takhSNXN3T0ZaemdRaFdBCitNUXBBQVlBczI1blNpQXRnQ1RIUDZMU2x5ejlMUytmSjBydENpTlFYQ0tqY0YwOGFwaHcxaFprdkFlQzFIU21OUkFCNm1hRVhRQ0cwCitkdUc0MTZUNUVtMkpOR09pVGZ2VDhvSFpIWFoxR3F5Z0N4aFVBTWE1a0o5Nzh4aE5wTGhDdWZTWHEvM0JkYmJqQ0NGRXZPU1hWQit2CitPZndEQWsyQmpKYkZ5NGNFQ21uV29leU1QWFVyNTAvYWJqdVFFUEVpRjZVaXJjeGNWSktuT1RLQ0dDTUFESVU4Q3hDTFhRQTlyVmovCitiZDN5d2FGQUlLQnRCeEpDaUlRSkJGVCtTeWNWTXRHVkFJOEdxSjN0U0Nsc053aUxpWGtoRVdwVzE0eHZ0QjFJaUVTUlpreWtyUzlHCit6VWp6S0JBdUFaQnJPMU1LY0FFc0FlZ3hsWjM1NUtRTDU4dmRTaUZFMnNzWlU1MnRka1FLRk5GRVp2NE9nQXpibVZMQUoyQU9NckJBCitScjlFT3BObVRJajl5a05GWjRGMUNZRkdNSGdnQU1kMnBpU2hBU3hqcHNwTUZabjNnNEpGbjlzT0pJUVF5YXJYcU1wak15SThCa1JqCittWEVoNUZyckN5NkFGNG14TUtMMHdxYWFDVy9aRGlSRU1wQVRoQkNITUxQTzM0MlY5b05vSkFBLzBtLzUvR1lHbmlYbStRN1RmSGtPCitUQWdoV3U5RVgxV2ZpQWVqbWZWb0FnMUIrbzJZZlE1d1BURTlFMkZQZlZOOTZTYmJnWVJJTnRLTUNYRVVnVUJBOVI2NHZEOFVSb0V3CitzZzB2QXJJSlJJdkFlRWJEZlhwcVlVZzJ5QlJDQ0VONmpWclF6aFBaUGx5QlJqSjROTnJ1Tml3ZkV2RXoyc1dDN2h0M1BMdGl4ZFN3Cis3VUJDSkxPMmVFRXBSRnlWTHluT0lUY3lncG1LR1JoS1FDZmJtYUxrQXZ3YVFJdEFWTk41VTZmbHNoUzlFRUlrd0pocXA4ODJkeEE1CitYRUtNQWdEOWticFQ0N2N4MHhLUXJuSEJOZXRySnpUWkRpUkVLcEZtVElnWUJKWU04ZlJ4czg3WHJJY3hNSnlBZ1VqZWZjMll3ZThTCis2RmxBaGNMTnpwSWZqbHk0MlhZb0lZUklkem4rNm02T0V4a0twdUVBWHd6Z05DVHZOZG9lTUY0RVlSRkJMMXF6dS9lcldEbzBZanVVCitFS2txV1gvUmhVaEpYNjdReUR3RW9QTUE3Zy9nT0J0WkdOaEdoRGZBV002RVpTcEN5eWNYMWN0OGZTR0VTSEk1L3VwdVNrVUdLOUJnCitEUjVJd0Rtd053dmpVd1plSitCVjFyeFVkL0l1YTVwWHV0dFNGaUhhSEduR2hJaXpoeGNONisyd3B6K0Ird04wTWpIbE0zTStDRDFoCitabHJLTGlhOFR4cnZnN0NTbVA4RnJWNmY1Sy8vZ0Foc29MNFFRZ2lybUhMOGo1K29TUFVuVXVjQWZESUlKNEg1SkVQN203a0FOZ0JZCitBOElhYUZySnluMURxNHpYbTU0cFhXK2d2aERpTUtRWkU4S1M2YThPOEhxM2RPMmpYWlhERG5xQzBZMkJZeFJ4QjBCbE1mT0JHMUp2CitCVkdZTmJZcDRzODA0Vk5IODhjQVBwcmthL2pJMXRjZ2hCRENyajZGVmIzZ3VMMUpvUWV4Y3h4RGR5ZW9UaUQyRWxQbi83NlNkd08wCitoeGs3aVBUbmdOcEVwRGU0aEtidUgrOVlKd3R0Q0NHRUVFSUlJWVFRUWdnaGhCQkNDQ0dFRUVJSUlZUVFRZ2doaEJCQ0NDR0VFRUlJCitJWVFRUWdnaGhCQkNDQ0dFRUVJSUlZUVFRZ2doaEJCQ0NDR0VFRUlJSVlRUVFnZ2hoQkJDQ0NHRUVFSUlJWVFRUWdnaGhCQkNDQ0dFCitFRUlJSVlRUVFnZ2hoQkJDQ0NHRUVFSUlJWVFRUWdnaGhCQkNDQ0dFRUVJSUlZUVFRZ2doaEJCQ0NDR0VFRUlJSVlRUVFnZ2hoQkJDCitDQ0dFRUVJSUlZUVFRZ2doaEJCQ0NDR0VFRUlJSVlRUVFnZ2hoQkJDQ0NHRUVFSUlJWVFRUWdnaGhCQkNDQ0dFRUVJSUlZUm9LYklkCitRS1NmRTBaVjU3cHU1SHd3OVFYcmZDaktCK040QUYwQjlnRFU4WUNYN3dTd0Y4QU9nTmNEMU1SQUV4R3RvZ2kvdG1iUWUrOGhFTkJXCit2cEFrTTJEQWRPL254M1VjQktBL0U1MEo1dE1CZEFQUUVVRDIvcGR0Sm1DbkJtOGdwcmNCL2pjVHY3aTJkc0svclFXUGc3NmpLM3ZvCit2VFNJd0tjdzRRU0FUd0NvQjRCMkFEb0JjUGEvZERlQVBRQzJFYkNPZ1RVZ3JGR3MzbllRZVdsVjdZUnR0cjZHWkhHaXI2cFBXUEhGCitSSHcyaU00Qm95ZUF6Z0RhNzNzRmIyZFFNeEVhR2ZoQWFWcnB3bjFoWGNlTTF6Q3YxTFdaUFJFZVdUSWtLeHp4WEV4UTV4SFFYeFA2CitFWE1YRUhVQ0FEQzJNR0ViTVc5bTRHMEZlbDB6di9iUjhzRnZCaEowN3FxdUh1TnM3cnA1b0dMbkFoQ2ZDOElwWUhRRG9jditqUHQrCitEd2hOekZoRndQc2ErZ1YwM2Z6eTFQTldoQk9STVY3S1E4TjdLSzNPMWtRbk1uQUNnVThBVXc0SW5RQmtmdms5MkkrQXJacDVGNEUrCitBL2dUZ0Q0QzhCNHh2eGRtZXV0YWYvQlRPMTlKOG5pNHRpamY0K0Z2RStOc0pwek4wRDBKMUJtRWRnQUF4bmFBOW9DNUVZUlZ6THlTCitIZlg4aHVjSHZwR29uL2xFbWhVczdLVkpuYytrVHlTbWZCRHk5NThuOTEzVGZIRXVBUDc3dXdic1pHQURNZGFCc0k2WVB0UWV2TlpsCitZNmYvbEpiT2EvUG5UWEV3YWNaRTNPMjdNTWIzUVJnR1lDQ0FYZ2JMYndOakJRRkJndnZrNnJxSkt3M1dqbHJPbU9wc1ozdDRLQWpuCitNTkNIZ0U0ZzZneEdld0xDSU5vQ3htWUdmd2J3dTE1NGc2dHFTejlyL1pHWTh2eHpTK0R3NVdDTUFOQTF5c2dmZ0hnK3lDbHZYSGo1Cit1MUhXc0dmSUVrOSt1dzBGRExvVXpCY0JPTmxBVlUzQU84eG9VTXhQcks0Zi80cUJtakhwVjF6ZFBVeHVJWmhQSjFCM0VMcHE1azRFCitaQUs4bTRGdENtb3JBNTh3OGR1ZXZaNzZEME9sVzF0N25QeVM2dU9CeUZYTStCNkFBWWp1czJJckNBc1V1SHgxemZqbm9uaC9WTXJyCitmWDJKZURnVG5ReEdOeWpxQk9ZdmJ2VHNBTEFONEcwQU5SSG9qVjFoRmJxdXBMYTVOY2RnQnBVdjloV1J4Z1FHUnRLK0JyKzFQbUx3CitQNGxVZFZsQi9mTlJ2UCtveWtQK2k1ajVTZ0tOQnZqWUtFcnNBRkV0YVQxOVVtSERZaUt3OFpBR0JRSUIxZXZDbHdhUWRndUoxQVhNCitmQzRJT1dhUFF1OEJlaG1JNmxWV1ZzMmtDK2R2TjF1L2RjcER3M3VROXZnMCtEUkZPSmFKdWpCelp3Sm5FTk51Sm13RHNKV0pQd2FyCitONTNzekdBMG1jdVhGT2RRV0YvTmhFc0E3aDlsM0UxRU5KOUFNeVlWMUwwWVpRM3JIZzBOUDZhWlBkOVR6TU9ZTUFoQXJzSHlPMEI0CitEZUNRWm41cWFtSG9MWU8xUlpLU1prekVSZjZRUjdJNEsyTThpTVlCdUJqL0hZbUl0M2NCZnR6anVqTS9DRjVoNVE1bVhuRlZmNENmCitRZXVhemozTWRPdmF1ckhUV3ZMaUFRT21lei92M25FY0UyNEdjRVpVUVE5TkEzaWFGZCsxZHVINEZRYnJ4a1dPLzdGK2p2SmNEL0JsCitBTHJIOTJpMGlzSGxHZEIvdFRGaWxsdFVkUjBSM3dNZ3N4VnYyd0tvY1kyMWw5ZTI1TVY1SSthZUJxMS9DbUI4SzQ5elpJUi9nZFgvCit0alJITkpoQk0wT0ZEd0UwRmEzNmJPTkdoendsVnhmVUhuVjBPQkFJcUp6QkwxN080RnNCbkJWOTJvTVI2QVVtL014RVU4WU1LbThvCit2SVNJYmdId0xRUHg5aGZHTyt6ZzVpbkRnM0g3TzR6R3RKcml6Q3hQcElSSWpRRlFHR1hUR2EwOUFPcVo2TUd5NGZXTEV0MnNsamY0CitiZ1B3S3dBWnJYamI1NHBvektTQytpVXRPa2FvNkN4QTN3ekdaUUM4MGVROGpGZWhjV3VaUDdqWVlNMjRxYTRlazdHMXk1WlNBbzFqCitRZ0hNZmkrTzVBTW1ybkEwcGsveU5YeVVvR09LQkpObVRCaVZmOGtqWGJnNTQ0Y0FYUWVnaDhVb3pRUThBUmUvV3hNYzk1OUVIaml2Cit1S0lHb09JbzNocDJ3cDd1Unh2SnlDK3E4TE9pKzhFNE5jcUlMYUVCZXNnTDkrZkpPRlV2MTE5NUJpbitHVUNYSVhHTi9oZTJnUG5CCitySXc5OTZ5Y1B5a2hkOFgzL1Y1bGZnYkFFOFhiMzJ1c0hYZktrVjZRTzZLaUsybjFhNEN2aWZJWUxjSkF2WFk4azVxZUtWMXZ1dmJNCitZT0ZnSm5vaHFqY1R6U3NycUM4OTBrdks2MzBEb1BoaGdNNlA2aGd0ekVFUlhETzVxSDVUTkcrZkVTdzhoNGltQWJqSWNMSURQUlBSCittR1I3dXQ2TVlPRTVwTlNQd0h3cGNQQlVRMHZlSXFKYkpoZlUxeVhpWU5Qci9EMlZ3MDBBVk92ZlRhK1hGZGFmZTZSWHpLNHA3cTY5Cis3bDBNVElydUdDMU1BcHJQRkpsU1ZyRG9rM2dkSXhaL1dUS2tnOWYxVGlGTk41b2ZaVzJWTUlCL012UHZwL2dhM3JDWVE4U0JOR1BDCitqREhWVHQ2TzhMVUEzWW5rK0dEOFFwaUlIOWFFd05xRjR6Y240b0I1eFpXdkF6Z25tdmU2MmoycHFYN2lxa1A5V1g1SjlmRmF1MzhsCis0dS9FRkxBVkdGakhyTCsvcm03Qy95WHFtRWZTd3plbmZaYmpCQUM2QVhGc0dscW9DVXpYTmRhTmZUTGVCOG9aV1hHUzQ5SjdVYjU5CitlMlB0dU1OT284c3JxUm9INWdjQUpHcEVZUk1EVjY2dEhiZkFaTkh5a085U01PWkY4MTRDdlRDNXNQNlFEY3kwbXVMTWJLLzdld0EvCitRU0lhZjBZVGd5ZE04VFU4MjlLM0pEd2o4REV6WDk2YWpLYk1EQllPWjZMYkFCUWsrdGd0OUhSRVkwcThtOVg5amZmclViNzk0N0xDCitZTS9EL2VITUJ0L1ZUTGdYSFBXMDk5YjZGSVFKWlFYQmhnUWQ3NmoyamJUN3J3VDRic1I5MWtXcnVBVE1abkp2VDlZR1ZyUmUzTzUyCitpUFRScDZUcXZMd2Q0VmNBK2pPU3F4RURBQzh6WFVlYVZ1YjVxMGJZRGhPdDNKTEtRdWJJRzRsc3hBQ0FnRDZLMUxQNVJaVmpFM25jCitRK2xiVXZIdExNZnpOa0EvaGYxR0RBQnlRUHpQdk9LS2lsNmpGclN6SGFhMWV2am10TTh0cVhvRXpCVklYQ01HQU4wSWVES3ZxR0pTCitBbzhabGRtaGdoT3lNOXhsQUc1QW9rWmdDVGxFVkQrendkK2k4OVgwZXQrcDJWNzNKU1F5STNBOEVkWE5DUGxHSnVoNEtBOFZuVFdqCit3VmZQUkNFa2J5TUdBTi94RUZaTXIvZGRZRHRJYXoxZVU5eHBadEJYeGNDc0JEWmlBSEFjR0F0bk52akhKZkNZaHpWanNmK01tU0hmCis4d0RQUm5JMVlnRGdNRkFHZGxhV2gzeVgyUTRqekpCbVRNUWtyNlRxUjRwNUdVQkhuUEtRQkxwRDhZSzhrc3A3TUdSSk1sekl0eEJUCitmbkhscjRoUkIzdlRQck9aVUpGZlZIR2xwZU1qcjZUcVI1b3BCQ0RmVm9iRG8zRmVkL3Z5UE4rY3ZyYVR0RlNPLzdGK1dSN1BxOFI4CitwYVVJRG9qSzg0c3FmMkRwK0VjMU0rUXZjbG05QnNZQUM0ZlBaUEEvWm9iOFJVZDZVWGxEMGZlVXdxdUljaVErUmxuRStPZXNrSDlvCit2QTgwbzhGZkJ0Yi9SNEF2M3NjeWdwQ2pGQmFYMS91RzJZN1NVck5EeGFmdjlycXZNZUZ5U3hHOERINXNSb1AvaU5PRjQyMW0wRCtSCitYSDRGd0dDYk9WcWdNeGh6eXh0OER6MnlaRWlXN1RBaU50S01pYWprRDNra0s2K2s4akV3UDRqV1BUeHNFNEZ4YzM3MmhuLzBLNjR4Cit0emhCbk9RUGVTUXJyN2lxa29GZnd2N3ZLakhSekx5U3l1OG45S2lCZ01vdHFmenIvcCt6UkQwdzNYcU1zOW54UEpzN291SUUyMUdPCitKbTlFMVNCSE9TL0crWm5EbGlBbVRNOHRxcnpRY282dm1kbmd1NXFaRjJEZkV2NjJaREp6MWN4RkpYbUgrc1B5a084NlFNL0RsMXNNCitXT0hWak9xSGE0dnk0M1dBbVNIZkR3ZzhBNm56T2ZPRmRsQllNR09SYjVEdElFY3pLK1FmNnJLN0RNQ0pscU1vQXY5dFZyRHd2RVFmCitPTEJraUtjODVIK1FpZWNBU0tXWkR0ZEczSXlGYytwOU5zOERJa2EyTC9CRUN0cTNVbUxtazJCTXNKMGxHZ3lNRG1QemsvbERIa25hCit1MG05aHo5NkRHZG5oUUJyZHlrUHhRSHpuRngvcGNuVkc0K0FLZS9say85S2pLbUpPVjVzQ09oRG1oYWZNS3JhNURMSFJ1VVZWWDBYCittaGNoc2RNU2p5U1RDRlg1bHp5U05OT2J5ME9GdHpNd0U4a3hGYllMNjBoRllNbVFMN013ZzhwRGhmZUM4UUNTNGpPY2ovVjQ5SnhBCitJR0E4eTZ3WFJuZlVqQmF0TUp1azJwR0xKeDRORFQvR2RwRERtZG5nSDZlWjY1QThqeGhrYTZLNWlXd3VBa3VHZUhwSHZCVmcvbEdpCitqbWtVWTFpelF1MnNGMFozUFBxTFJUSktnaE81U0NYNVF4N0owdG1aVDRGd3hPa3p5WStLT1R2ek1ZQ1RiaEdiRTMxemp2TmtlQmNECituSVRUSktnZEtjek5HVk9kZmZUWHhpYXZxUExQQU1yaWZSekQ4dHhJNUtsRWZIOWFLNitvNG5zZ2ZnSkFzdDJFeUVGejVnTzJRd0JBCitlWVB2RGpEOUdzbTF1TlhnWG03R2xDLytZMmFENzM0dy9ZL05RSWR3VWEvQnk0MWZ5THA3OW95SWNnKzM1RUhJMmN2cUlkc3hEbVZHCit5RGVld1hPUWZLT09KKzVWdUNjUkJ3b3NHZUxwN1daV0FtUjFlcVFCRjdtNzkveTl1bnBNb2xjWEZnWklNeVphZ1FsWm1ZOFM0TGVkCit4SkJMODRybS90eDJpQU1wY282UE9KNGxNTGlIVVJ5YzZka1JDY1R6QUhrbFZUOENVV3JlcFFUNnE1MXVVbDE4NVJkWFhnS2l1VWpTCitxWjRNVE96cnIvaW16UXpsd2NLZkFRall6SEE0eExqOUwwdUdkSmdaOVA4UmhPdHM1emtVQWdMVEd3cU1UdXNrMERkTTFyT0h4c3dLCitGUTIwbmVKQU0wSyt5NG54S0JLL05VaUxNREIxeG1KLzNHZGg5QXBuUEFqbU1mRStUaUlRNE52V1pWdENtbGhobGpSam9zWHlpcXQrCit4b1JVdjN0ME1PSmY1WlpVRnRxTzhRVWkvQVBBNmJaekhBMERONXhRTXZma2VOVHU0Nis2Q016M3hhTjJvaER6bGZuRmxaZll6ckZmCitPd2FlUUpJMll2dVJWdml0cllNemVBQ0k3ckoxL0JZNFBpT1NzWnlKYjdJZDVBaTZLYWdialZia2hHN2dIRStrbWUrMEhlSUF4eERqCitNU1JwSTdhZlF5N0g5WGV5dk1GM0xWRnFUSU52S1NhK3FUemt1OVIyRHRFNjBveUpGc2t2cVN3QzhHdmJPZUpBRWVPdlNiUTArWEcyCitBN1JRaHN2OFI5TkYreFUvM2trcHJvTDV4cUdaQ2ErQStURUFmd2J4ZldCK0RQdFdxWHdYZ0RaOFBHaGdXdmNoMVIxTTE0MkNnK1NiCitoblFJTkx4dlVhV3RFZUdrbTFaNkNLa3dTblROOUZjSG1QdmRwWlJhU09Fb2VOaU0wUEM0M01DS2doZko4VXprMFl5ZVdlZnZGNC9DCisrMGNxazJKNnRIR01Qei8wekloRWJrMGdZcFFLdjR6Q3NsTkd6K3E0TzR3WjFIYWI5eE15SXR2dkFIQ3I3U0NwaFVmbUZWZjFiNndkCitHKzNHbzE4VGhuTVh3TDFOMVNQQzg1cHBXck1icnYwa2VNWE93NzB1eDEvZHpYRWkzd1BqSnpBMFJaU0FQdTJ5d3JjQ3VOMUV2WFNnCitGYVlDU05YcHFRTG9RWnU2alFSZ1pDTjAxdGhKcHA3ZUkyd0dZd1dBVHdGc0plSnRXcXZOU3JFQ3VMUFcxQVdFdmtRNFAwNTdiQkd4CitjeFdBLzQxRDdiYUsyT0VwQUc0eFdYUmFUWEdtWm5jV2tudTJRQ3lPOTJaRjdrSHFQWE9kdHFRWkUwZTFKOXp1dHdUdUU0L2FETHdQCitZQ0VSWG1BWC80R0hQK3IrOFk0ZEczcjE4dEt1VGRuZVRFOGZhSnpLaWk0Q1l3U0FReTd6YkNESERTZjZxaDc4SURoMlhUenF0MTE4CitDd0FqRzBMMzlWZDhVNE4vYUtJV2dNM0VmTk9hMnZGL2E4bUxtK3BMTndHWUNmQ3N2T0s1VndGOEgwd3NIRUQwNDM3RmovOWhWZTJFCitiVEhYU2dlTVVveXB2Zzd6U2wzYlVVUjBpT2hTR0dyR0FHeUs0YjNyQ1hpYUNVdmdZa1daUDdpNnBXK2NzZGgvQmtWNENoT3VOTHlBCit5QWhJTTlaYWx6UGpWaUt3cVlKWkdaR2ZnZWswVS9VT1JJUTFERnJJak9lSTZEL2hQYzY2WTNlMTI5bVUwK1IwMnRZcG16MlVROW85CitCVW9OWnVhUmlOZDJBc3hYenc0VjMzZDFRZTIvNDFKZkdDWE5tRGlpdmtXVlp4bThRUDRTQTg5Qjg1MXI2OGN0QXVpZ2sreGFBRmlCCitNSUJkQUQ0SDhBYUF1UWdFZnBMMzBpbmZnZUk3d0RqYmNLU01pTU0zQThuNWNQeFJOSUg1YVFKZWdGS3JJMjdrYzBkNU9qSTRoNWkvCit5VVNYRVhCU25JNDlwazloMWYrc2F4ajdVYXlGdEtMZndjem82OXM2UXY1MURlT2l5RVRjV0l2WmZZc3FYOVdFZWdESHg1aWx5MTZvCithNERFckF4bTJHY0FGaEh3SG9ETkRPckdoRDRFN2grSDM3OHZISnU3WSsrMzFnTEw0bFRmcEREQXk0andNcGcrWWFBVEFiMEJuTVhBCisrVWlPbVFSN1FYaUJOVjVXaE04WTZBeWkzbUErQjhBQXhHWFZTUElGQWdFVkNBUmludnBMUkoraWRkZmduek13aHpXZW1PSUx2aEx0CitCZnlVWWZYdkFMaiswZER3WDRmWk01dkJvNk9wY3dobnpnb1c5cHJrYTRqNWZHbkpKd0JDQUZZQnRBWGdZOEhJQVhBZUNQRmFiS1BQCis3SHIvV1VEOXYwd1VlN2kyS0o5WTMyYWkxa0VZcjdEQ25ldGZHRlJ6aEovOTNkaDNnK0ZOQVBPWWNlT3NSWDQvbUFNTVhHQTRrWExaCisvUm1RbWxzUXBSdHB4c1FSYVRLKzRmQTJZcDdhV0RkKzdyNy9ITi95ZHdZQ3VoRjRFa09XTE1qTDNuQXJnRi9CN0FQSWswLzB6Zm5OCitCOEVyUGpWWU0zNEkvMkxvWDZ4dG4xRjdtSkdFMXdFc0FQaVgrY1Z6U3hsOFAySnZMcjdLVVI0ZUN5Q201OGR5aXg4ZkRHQ1lnVHp2CitFWGtLMXpXVWZoeExrZFYxNDk3TUhWRXhralE5ajlpZko1cU1sR3JHYUpsbTNMUHVXeXVmd1dFdUt2cU1tSHVtby9WZERKaTZTUDJTCitndklodVp1eDdRUThvTUxPdEt0TGFqODcxQXRtaElhZkRIYnVKc0RXSWk3YndYUy85alpQbXpwMDZjWkR2V0JtdmU5TUp2d0pCTU1MCitHUEd4UFM5NjhSd0FyOFZjU2ZFcjFKS1didCtGOERTdnMvY2ZWdzFkdWdlQWtWVVpmbEN3NlBQcTZqSGYyOXB0NjVOZ2pESlFrclNpCitRUUQrYnFCV0F2RlNWblJQMmJCZzNlRWEzSmtOQmYwMTFDL2o4VFBQSHUwSFlLUVo4M3Iwejlqc003UzdpUG42U1lVTnMvWjliNEl0CitmdU8rMTlmWEJRS0JZTzhMbC84WWpEL0FiTGJMcGk4cXZtUHE4Tm9QRE5ZVWNaQU1kKzVFa3RyL01QMzNESlpzVXV4K2M4MlhqVmlVCitsZzZOTk5hT3U0dUI3d0pvTmhNTkFKQWRjVHdURGRhTGx6MEEvNlN4dldmQTJwb0p6eHg5U2hmeG10cXhUeEI1K2dONE1RNTVZcjd6CitScXgrWVNESFRyaVJvalUxc1RWaVgxaTdjUHdLZ0g4VGF4MENUcks5YkhzTGZVNk1LeHRyTDc5b1hkM1krWWRyeEFCZzNjTEwzMTVUCitPKzQ3SUJvUDRMRFA0a1dEd2VlYnJHY1VZWEVrb3M2YVhCaTgvWENOR0FCTUtWajAzcFRDNEhkQm1Bd2duTUNFQUdFeEtjODN5bnoxCit2enhjSXdZQWsvM0J0eWNYQnYwRTNBVERDOWdvNXZOTTFPSE9uLzhmZ0IySGZRSGhPUkI4WmI3Z0JWTUtnaFZmTkdJbWxaYk9jN1d6Cis5Mm9BWmthek5DWHp0aVZmOVFrVHhwWVZOZ3lkTWp4WWU2U1J4c21Gb2RlbkZBYS95NkRMQUJqOWUyQk5SczRKRDljVzVUTndwWWxhCisrOUJHZ3I1d3NxOWhaaXpUS0FPQmdDNHJDRTREbEI5SCtubHZQWTlpZmJYQmVpSk9wQmtUaCtVU2JvSzVhU3liWFllSHJhNmJ1TkpRCitQYXl0SGJjQWhQRXdleUdSM0VQNlJLdWgxZURHMnZFUHR2YTVtalUxcFI5bmVYZjdBYnhzT05VNWViNDVmYU45YzU1dlRsK1FrYjNyCis3bWdNWHRIaTUwSmF3b3V1ZndRUTg4K3NkbkM1Z1RoeHc0UlhQQzcxWDFNMzd0R3ZUaHMra3NhYXNaVzg3NWxCZzg5NGtaRUwrVGo0CitRK2ROblgzWEZ0ZXRhZWtieWdxQ3N3QmNINzlJQjJPbWU5YS9NS2h3OHZDYXhwYThuZ2c4dVRCNEg0QmZHczJoY2E2Sk9sUFBXeEVHCisweUcydWFCNkVIMjdyQ0I0Y1ZsQnNNSEVzWTZZWStqU2pjeHNablNiT0ZXYXNlZTFTLzJuRkFSYmRmTjBTbUY5TllOK0FJT2Z5NlJnCis1SnpnOGVqcllXN1JqcDNNdW5CeVljallBbFpsaFhWTG1laTdNSGtEaC9WNDVxVGF4RjRjZ2pSajRwQk9HVDJySXdIRzlxclFURmMyCitQVFArZlZQMXZ0QllNKzRmSURhNVBPMDVmVWJNUGROZ1BXTUllQXR1WkhCai9lVlJULzlaT1gvU2RoMmg3d0U0N0IzemFMRGpMWWo2Cit2Y3A3QldKdit2L2R1THVuOFdXS1Y5V1dOTE9KL2FlWWttWXZ1ME9ZbThGZHZoM3Q0alZyYThjdEFGUEFZSjd1dlVaVkp0UCtVaHFFCitxV1dGd1Z0S1MrZTF1dWtzS3d3K1RJellaZ01jblF2QzVDbSsrbHVqZVZacmNrSHd0d0RxVElVaHdxbW1hblhlMHVsWEFINUJqRm93CitwaEgwdVdXRjlVVmxCZlhQbXpwR1M3QTNYQUZncjRGU2NWbUV5aXgrUkhmOWZQalVvdm9OMGJ4N1NtRjlOUXhPeldaRzN2UUZvMkxhCis1cUM2ZWt3R1d2VmN4SkVSNFVkVGZBMXZtS3IzaFNrRjlTRTJ1bzBRNWMwSytpNHlWMC9FZ3pSajRwRDJoTnVOQWREZVREV3VYRmMzCitkcjZaV2wvbnR2ZituQUZqcXlBNnJoNXBxcFpCSzdUaWl4dnJKMGIxNFhpZ2RRMWpQMkx3LzVnSTlRWEZIR1V6eGtURXNVOE5KWG9JCitTNGRHWXE1ekNMdDNPVThpOXFsNFo1em9tNU4wZThneFlYcmpCZStOWDFWYkV0TjBYOXF6NTE2QTE1cktsYm1YVHpCVkswWXVNVjFaCitWaENjRVV1UkNQaVhBT0x5ODdtdlBFL2NQd29YRlNLd2hyNEY1a1k0amUwTlZWbzZ6eTByRE40MTJSY3NLZk1GcnpjNUV0RWErNmQ4CittcGhWME5OQWpiaGg0TDdKQlEyVHBwNjNJcWJSR1pXZDlWdnNXL0REQktMMmU2T2VmUUVBVzdwc0dRR2d1NUV3ak5ySkJjRkhUZFE2CitsSTg4ZTMvUFlHT3JJTEpDTWw3VGlBTklNeVlPamRuVWRMMDlydU0xdWtmSVZ6WE5LOTFOekw4eVZwQ01MQ1JoMGtvdlBNVnJGNDdmCitiS3JnMmd2ZWY1eUF0MHpWWTBKVWQ5N3kvRS8wUjh4TCsvSXV5dGhURVZ1TncvdHNhZWtPZ0orT3NReEZsSE9oa1VDbUVNMWFXelAyCisyaU05RzlaU2E1WmV0WWVBMzV1SUJRQ3NWRXdYWHFZUTZJYkp2dnJIWXExemphL2hmUUQvTUJEcGE0ajUyakpmUTFXc2RhWVdodDRpCis0Q2tUbVFEMENpd1owaFlYQ0Z0aG9FYjM2dW94SmhlZU1vY3hiVXBoOENZVHk4aFB1bkQrZHNTNHNOTkJOTWQwVGlBeTlnaUM2ekp1CitNbFRya0FKRGwwWUlqc245S1ljYXJDWGlRSm94OFRYZGgxUjNBR0d3aVZvTS9sdlRNNlhyVGRRNkV0cXp0d0tHcHQ0eGVQQVpZNnBOCitybWdVaXcySzJMK3F0dlN3aXdWRUpSRFFBRDlzc0dMUC9KTHFWcS9VU0k0MjhLd1kxYXg1NnFvdHNkYzV3aEdBRjJLdW9jeHNKbTNJCiszeHZiTzFOYjgzelkwWGpnL1RzTWpheG9zUFZSUkFidW0xeFkvNkN4ZW1TczBUbXc2SjJUZlEwenpSV2tmNW9xZE56TzloME4xVW9lCitoTGNOVkZHZmRmOHMxaFZhNDJITzVNTGdEU1lMa3ZKVW81VjdFeHlPWWtSOVR0aDNZNENHbThnQjhEK20rb1AvTVZQcjhOWXYrOVpUCitBRXc5QTkzL2tTVkR1aGlxSmVKQW1qSHhOZG50OWc2Qm9lVlZIU2FURi95SHRmL092S0hSRVdxM2M2ZmIzMHl0bU95Rm9rdFgxNHh2CiswY1A0cmVVQlY4RGd5azNNdXRYZk0rYllGKzZnQkN5RDdtb1Y4MFVZUTMzRFJCWURYcWJkelJOTmI2eThxcmIwTXpDZU0xRkxFUjlqCitvazdVQ0U5K3RHelFUMDJXOURwNzYyQjJxdUtjeVlYMWR4aXNoNzNObmxvWXlwaVJ6U1kzUzA0S3JEbVdUYWkvNUFHeVROUXg2Rm5kCis5ZlBKSmpkV0JvQjlDOG53cXlacU1SRDFPU0VuN0lLejU5Z0FBQjVtU1VSQlZMMEFRR2NUT1FBbklkYzBnVUJBRTlQZkRKVnp3anBqCitvS0ZhSWc2a0dSTmZvMkJzc1lFM1Z0ZU5lOU5RcmFOak1uYm5tY0hXTDV3SmZFUGp3ckhMNDFWL1ZlMkViVXhrYkw4YmhtN1Y5NnpYCitxQVh0QUF5SytjQkU4Vml1LytCRGVIVHNkOFNaVHpNUUpWWk4wTzUzMXl5OXl2Z1M0QURBeXN4S25jelV6VVNkYUJEd3N0NmRPY0hFCitwc1VIdW1ybzBpMEFUQzFpRklySHhmTVBSeTdjREZNWkk1RTJOekpHVEZ0TjFQSHV6VWlta2JFUHRXZnZwYkUrSTNaNDlKS2hRbEdmCitFNWhNWGROdzQrU0N1bWZOMUdyQjBaUzVheHJTU01xRnljUSswb3lKcjJGV3B2WkVXbWlvVG9zYzg5bTJaZGkzdzMzTW1IR0dpVG94CithRnBUT3o3dWQrQ1U1cVhHYW9GYTlleFhocnZqRzRoOW1XSEdyajFHTmdNOWt2M1A2OFhhd09TWXlCSWJubXRpRVpqRElXWVQwN2dBCitqbm1qN1JpT1RYK1pPbXJCcnJqVUpqTDAvZUg3NG5ieGJDaWo5cUROall4QmFTTS9GOXJqU2FacnI4ZU90QjlkcklqNEhUTjFLT3B6CitBakdNWE5NUWFLSHBHeUJIVWxaUTl5YUFUdzJWazJZc2lTWFRDVUVrZzBCQXdkU29rT0pGUnVxMDBJb1ZVOE13ODRBMWlLeWZ1SXhPCitJVHVjaUllTmpid3h0VzRGUE0zNmJBT0gvVHhlb3p5SEVPdHhPcDR5ZWxhYkd5MDRFQkVNWFhpWm1TYWRiQmo2WGRzWmpzWlVSc2ZsCitEaWJxaU5UbXNwbG1qSm1qUGljd3djUm5EUmdxb2RjMEFFRG1SaFp0WDlPSUk1Qm1UQnpraEZkTzdRZERTOXA3dGRmTVhlQldJU01yCitCREtud2w0d3NXdDZadHdxQUdZV0IyRzBhclVySWpMeEFmbXhnUm90RlhQVHQ3TTVvNGVKSU1uS0RTc2pkM0haMERPcnlVWXh4WFdoCitHUk5NWlhRZFNzNFZBMFZDTVpPWjVlMDV1blBDN0pyaTdnQjZtWWpnc210c0JlS1dZckNwWStZYnFpUGlvQzB1UFN0aW9GbWZicWpVCitwOFpYQUd3QllyelBCdmFhcHlUZkM4WWNZcUR5TGNESWN2NnRXKzJLK1pSWTkzcG1vSE4rY1pXeEpkV1BmQ3lPYWROUkFQQ1NFM09OCitaT1psWjZkcllQMEhvclo1SWMrRWJZbWI1QlNkVk1nWWI5TnFpak05V24zOWQ1WENIZFA5ZTlOYVhtQ25pWWN2U1VWM1RvaDRJcWRUCitqSjh6KyszcHRxWExoeVlLdFFZenJ5SXlrci9ydEpyaXpPdEthbVBhVTFMRWh6Umo0aUNhS1pkTXJIYk5acVlydFpZbVhtWGt0QVYwCis2RDZrdXNPK1BhYmF2RFdHNm5Uc1YxeVQyZklOaEtsUHJBY2tvQStEYjQyMVRzSXdKOXNxYWtaOUdPbStNODhidDBmUzJvSlVPSitrCitRc1lXKzlQeWdkbnRkM2M2VGJuNkZGTG93NXA2TXlHWDlxM08xd1dNcmlCMEFIREEwdDh1RGpsVFhCcXhWb3NRNzFSbW1xSG9LTW94Cis5UGYyWG1ucHZJUThQbkFnSmw1bHFKbWtURys0QjRDMUpvb0pzNlFaRXdkUmhGNG16bHVzOEo2Qk1xMm1YTHpQaHU2cFoyWTJIdzlnCitsWmxxU1l4cHRhbnRwcG9qVzQ4QjhGRUxYMjVrNmtncVlSWDlRK2dwWWVuUUNJb3Jtd0ZrMm82U2pFaXpaak4zdWVNbUZUSWVUaUFRCitVTDB2Zk9sTWFQY2lrQm9NOFBuWWliNEFPeUFDTXdENnluaDhhbjZwS1dPREo3S3pkOFRlckdNRjdzMG0vcEtKVnNaZXBQVVU4ZnVtCitiZ0k0eWprZTBvd2xKV25HeEVHWXVMZUpYM3hiejBab0wzOUMyc3lucXhkZUk4L09KVHRXYURTMTlhL0hhZGx5MWljVVZIZDJFVW03CitCL3haY1RvOHB4dUdOR01pUVFLQmdPbzljUGtRVXZnK1kva2xZUFFDRVdRWUt6a0VoaTZObERmNDlyZkJpY2VhZWh2cHhaaXRYTk5NCitIcjdvMDVraE05OC9ZalByQVFqenBCa1RCMk0reHNRNWs5bk9WSmVPN2J3N2Qrd3dzNjhxTzIxN1N0a1h5TVVtVTB2NWhCVzE2QmFvCis5cmhkelJ4UkNKR09wamNVZENhaVNjVExmd2pnUkdtOXhDRlI5SnRGSDBoYm1yNUxCQzV2d0M0WVdGak5wZlM0cGtsRjBveUpnekZsCittUm5SWnlzbnJuZm1sZTdOSzY0TUkvYjlxOXI4OHoxZjh1aGRNRFNhU0hCYU5DTENEbVZEcDkvbEUya3l1cEd3RU9sbStxc0R2R3JMCitNVmVCOFJzd3V0dk9JNUlkWnhzWmxDUGVIbnVScUJscHh1Q215VFZOQ3BKbVRCeU1LTnZFOUE1bXF5ZXVIUUJpSG5raHFMU1lhcVVpCisyS2tOall3NTdMYnNuS0xUODBPQlFkdHNaeEFpVmMwS0ZRM2t6ZnBSQms2eW5VV2tDakx5V1VOTU5oZTIyUUVZdVBHZ0tDMnVhVkpSCitPankvSUZyRnpFVXlFOEltNmtUSnlOS3RHdHJNZk1ja0YzWjR0NmxhckQxN1cvYkN0R3pHbUpWZVl6dUVFS21HR1ZRZUtyeGRzMzVPCitHakhSS2dSRG56Vms4NW9tNWowdUFZQmdZTjhSRVJjeU1pYmlRaG5hT0RwS1p2WnlZaGhyVXBJWmFSaVptZ29BRE4yaVJwaEpLMHEvCitlMEd2clYwNGZyUHRFRUtra3VycU1jN00wTmFIQUV5eG5VV2tIbWFZV1J1VXRjMDlJczFjVDJuZVphU09NQzd0cm9iRTBaQ1JPekFNCitaYWtaWXdKZ1pKVStVdVpHakpJWndlbGtxaFlyMWJLZkgyWG01eXlWRU9nUHRqTUlrV3EyZE4wNkE5S0lpU2dwTmpPcXhDQ2JxLythCitPVGFuMytkdXFwQm1USHdGRzVuaXg1YVdVTzNoZTZ3ZERQMWNLemhwY1JlSkFHUE5HQ0l0YTJBWmpwR2ZzMVJCd0QxcmFzYytZVHVICitFS2xrWm9QdnB3UmNiVHVIU0Yyc2pFM3hzem5ieDB3enBuUmFYTk9rSXBtbUtBN0N3QjRUUS9wRTJzcGRwR3hQVmtkbVE5T2k5NnBQCit6QlJLYmt5Nk81bVpwOGlkdWpnYlczWk10OW5RdGpPN0FXd3dVY2cwSm13a3hqdUsrRytyYThZL1p6dVBFS21rUEZSMEZyUCtyZTBjCitJc1V4N1RHeUtCa1phb2hhYVZwTmNTYmdtdGsxVzZmSE5VMHFrbVpNZkFWdk1YR1JURXk1QnNLMC9yaXU3bUZvVzkwZEg0Wkt0eHFwCitsT1NJY0txaC9WRzN2RE92dEVVTGVEaGh2UVBLTVhCSWVxMnhkdXlGQmdvSklaSUVNMmhtU1A4VkpyWW8rYm9JZ1Y0QytFMEFxd0I2CitqelYvckx4cUIrbEllTStlek1NKzErbk5DcDhIUmpBT21VVGNtTm1zbVFBcjF6U1ozbkFQUTVOOWVMZnJmR1Npa0RCUG1qSHhGV1JrCitsSUdKKzVtbzAvcmo2dE1ObFZwdnFFN3kwM1Nha1VFcVFvdnZ1alYyeXZ3MGIwZkVCUkJqUjhhZFkzdS9FQ0xabEMvMkZSRXcwR3hWCitXc1RBREsrbk9YalYwS1ZSWGFDWE54UnNsNmM3VWdzeGZjd1UrOTFHSWxpNXBpSGdORU9sTmw1WFVwdFdqd2VrRW1uR3hGZnd4MmFtCitqNUdsWm94T016RWxnWUMxQnVLa0JqSjBzbWQ4M09MWHppdDFVVno1R1lEall6c2twQmtUb28waEZ6ZWFXdUVWd0Z1azhlUEovbnFaCitLcHlHTkdHRGlSOGxadlNaVmxPY21laUdodUFZdWFZQnBkRTFUUXFTV3p6aVlLUk1EV04zeWkrcGp1bENPenBzcExGZzRFMFRkWkpkCis3K0xIY3dEa21hakZoSld0ZkV2TG03ZkRJQU9iZXdzaGtrZDVhSGdQRUlZYkt2Zk1Ycy9lUVpQOVFXbkUwaFd4cVdlS25Vekg3V3VvCitWaXVZdWFZQmMxcGMwNlFxYWNiRVFSUzc3NXVxeFlnTU5sV3I1ZWdjRTFXWTZGOG02aVE3TDFPQnFWcEtVNnVhTVVPamp4MzZsbFFZCithU2FGRUVtQVBYNll1VFo1VFhmOS9Icy9HcnAwaDRGYUlrVTVTaG03cGlGRkY1bXExV0lNSTljMElIckRTQjBSRjlLTWlZTmtlcHZmCitnWkV4Y1FBTXY1RTZMWlE3b3VJRXdNeXphbzVtMjgxWVFxWVFNNWxyeHBqb1A2MTV2V2E4WStLNFdxdHpUZFFSUXRqSDRJc05sSEhaCitvU3VtbnJjaWJLQ1dTR0VkTjNaY0JSaGEzcDdaWjZKT1N6MGFHbjRNQ0FOTTFHTDcxelRpQ0tRWkV3ZFpPWC9TZGdDTmhzb2w5TVNsCitYUFVkUTZVMnIrN29NZElveEtCM2ZrbmwvOGJ6QVBsREhza0NVR1Nxbm82MDdtUlBpdDQyZEdScHhvUm9Jd2lJZVJFbUJwNmJNcXplCis5amxjSklIUzBua3VRTzhhS2FZd3ZMcDZqSWxsZ0Z1a1dhdFJpSG1ScTMybHVEbnIvd3pVRVhFaXpaZzRGRlBEMlhsOWl5clBNbFRyCitxSmo0Q2tPbEZtTmVxV3VvVnRTWWNWZCtVY1hsY2F1ZmxURWV3REZHaWhHdFh0Y3d0bFhQR3lyTlpwb3hvaUZHNmdnaDdDT2NFbk1KCit3bE1tb29pMlFwdTVwbUYwM2RKbFM4SzJVaUZGRTgwVXdyS3BveGJJaHM5SlRKb3g4VFZNdk5SVUxRMmVZcXJXa2VRWFYxNE1tSmxiCitUWXdHRTNVTUlDYjZXeDkvVlh6bXFSTmRaNjRZTDJ2dE8xYnY2Zmx2QU5zTUhIeHdubStPaFFlcmhSQW1CUUlCQlVhWFdPc1Ewd2NtCis4b2kyZ1lpZU5WZExUVFZWNjBobTFmblBCbU9va1dMSmMwMGpEa09hTWZFMUdyellXREdpSy91T3J1eGhyTjVoTUJBd1ZFb3JyNmZXCitVQzBUTXBYaXAvb1dQUmJ6M2VJRDVSWlhqZ0pnYk5TU05GNW85WnVXRG8wUVlPSkRrdUI0YmpSUVJ3aGhVYjl2dnR3QkJ2WldJZFl0Ciszdk5RdEgzc09Jc01WcnQwK3FMaUU4M1ZPelR0NFR0Z1pwOGhnRlNOa1RvaWJxUVpFMS9UVkRQK2JhRGxHL2dlUlhzM3pBRkR0UTVwCisvMVMrSVliS0xmMXdRV215N2NmUnpTV25JV2RreFVrbWlwMHllbFpIQXFhWnFMVWZoMGt2ak9hTm10alVoMlJabitLNWNmK0FGRUxFCit6MTRnMDBRZHJWUzJpVHBmNThtS1QxMFJUMlZEYTVzQWVzOVFPYS9TN2wyR2FoM1NyR0NoRDR6dkdpcjNSbGxCblN4cm4rU2tHUk9ICitRQXpDUDR4VkEwM3RXenczTG90NTVQbm05R1dpQjAzVlkvQ2pwbXFaUkVBZng2Vm4rNHlZZTJac2xaaWFJKzFtQWNnM2tXdS8xOWJYCitUbWlLNW8wZU9LWkdJYk1jNkljUkNNZzVUWWdVNVhGY0k4KzFrTmJHOTdnc0R3M3ZBZkIwMDNWRm92QThnOFV1bTlIZ0x6Vlk3MHVQCitMQ2s1WGhQTk5sV1BtZjltcXBhSUg3bHdFWWRHVkdHeW1vYXVpcjJST0ZpLzR1cnVjRHp6WVdvUkNtQnpzK3NhYTBMam9LZlNlbGxlCis4ZHppNk43T2xGYzhkeG96anpFYmk1K085cDBmMWx6K0hvQVhqYVFBQ3ZOZVB2blhKbW9KSVJMdnd4Y0g3UWFnWTYyakNkODJFT2RMCitEOWY3amdNN1FZQlBObGxYSkpJMmVVMERBcytlWHUrN3dHVE42UTBGbmQxSTVDa0F2UTJWM00zZXNOR3ZXOFNITkdQaWtCb1hYdjRpCitBSk1QUVhkVFdpL0tHMUUxeUVTeG5KRVZKNFVSV1FyQVdJTkh4Tk0rQ1Y2eDAxUzlPT2tFNkFYNXhWVy96eGxUM2VLcE9EMThjOXJuCitGbGRXQWZ4anczazBzWG9zbGdJTWVzUlVHQUEvenl1cXVCTmdNM1B0VzZGZmNVMW1uNktxMFhrbGxaVjV4WlVmNUJWWHJzNHZycndrCiswVG1FU0ZXQlFFQ0QwYXBWV1ErRlFOOTlaTWtRSTFNS1o5ZjcrbmdVbm9QQloyeEY0cFVWaHQ0RjhLckJrdTJWUWwxNXlGZG9vdGpzCitlbDhmQlJWaXdGaURSMFF6cGc1ZHV0RlVQUkUvMG95Snd5Qm00QUhEUlkrRDVzVjVSVlcvR0RCZ3VqZXFDbU9xbmZ5U3Ftc2NsMTZGCitnZjFvRHJCVmsvR3ZOMTRjQnQvcTdJaThsVnRjVmJaL3Y3QkRHakJndWplL3FPTHlMTWZ6Tm9FdWkwT1d1alYxWTlmRVVpQUQ3aE13CitzNnJpUGtTL3lDdXVYSmd6c3RyVTNjWERHN0xFazE5VTRjOHJycHdkeHBhUEZmSFRZSXdGY0FLQWZBWWVrcW1UUXJRQ0dia0oyTnQxCit2VEd2Rmp0amtXK1FxL0F5RVB0eSs4SStKdHh2dUdRWE1HcktHM3kvKzlQeWdWRTlwOGdNbWhuMFQzUVZ2UWJnUElQWjlwRFc5eGlzCitKK0xJWXp1QVNGNjZnMmVtc3lQeWN3QW1WMFBNQlBHZEc0L3JPRG0zdVBJaGNpUHpHb05YckQ3YW0vTDhqL1ZrOG95aEhaRnJHRGpOCitZSjc5K0k5ckY0N2ZiTDV1WEoxSTRCbWNuWGx2YmxIVkVnSmVoZUtQd2FRWnVqc1JuYjJSTVF4bS8vNE9vcGxpZm9aaVZlMkViZm5GCitsZmN6OEVzVG1mYWhZc2VOck13cnJyd2YydjFMWS8zRURhWXE5eDFkMlVPSHVZQkJoWVFOSlF6cWZvU1g5OHg1OWZTZVRjQjZVOGNYCitvaTBqb2plWStlSlk2ekRUYjJZMEZQeHJTbUdvdnJYdnJhNGU0MnpydHVWL1dPTk9BQm14WmhISjRTTm43eE85SXhrQkFQME1sdlVBCit1SzNqem80L0tBOFZQc3pRVDB3cFdIVFV4VUllcnZjZDUzWDR1ek5EZEEySWpXekxjeUFHSHA3a2E0aDVsRmtraGpSajRyQ2E1cFh1Cit6aXV1dWhmZ1A4U2hmQjRCZDhQeDNKMVhYTFVLNExmQitCQ2d6VXc2ckppSUNjY0N5QU53Qm9EVENCeUhHQUFJLy9GeTExUytnOVNKCitpTDhENER2N3ZrVU1BaUZlMzY0RHZMR3U3dklGd05qWUsyVTIzNGZtek91QTJQY1lPa0I3QUQrSGNtN09LNjRNRWRFQ2N1bkYxYzA5Ciszc0hTb1pHanZqc1FVTDFmN3RmTFlaV3ZGSjBKNW9FTVhLRERPQVg3dnNNdDR0SGg3cEJtVElnVzBWby9TMFRYR3lqbEphaW5aemI0CitmdEcwYk5DZkFvRkFpNTVGSzYvM0RkdXF0dndlVE9jYnlDQ1NTR0RvMHNqTUJ0L3ZHSmdWaC9JOXdmUnJndlByOG9iQ1JoQzlDY1lICitJTjdFV3UwRkFDSStCa0F1OWwzVG5NRk04WnBPdjg3Snpyb2pUclZGSEVnekpvNm9Rd2RuMm80ZGtTdXg3K1FSSjl3UFFMOTlWN2Y3CitHb2tFUHZIRENqeDFWVzFKYzhLTzJFWXc2ZHNCTXRMeXJYbnFxaTE1UlpXL0JTRWVUWEVHZ0JKbUxtSEZ5TXZlMEl6aXl2VkVXSzhaCit1eFRSTmdZY2dEc3hJNE9BOWdCMXhzdWNDeUFEQkRCSC8yVzZydXBvN0NzUm9vMWo0c1VFMmdQQXhETmZtUXo4b2ZmZy8yL3Yzb1BqCityTTQ3anYrZXN5dmZKTitnR1FZYjI4Rm1PZ2xwUzVOQVd3eVQraUxMeUJNM0tRUUZTYTViZ2k5SjZZVEFUS2NrVFl0S1N4Z3lVN2NoCitUUXVEU1RNdFRSTjVwaUU0NkxKeWlpZkdocVloTkFRd0ZCdTB3aGlJTWJac0MyRkplNTcrNFpoQWlvMVcrKzYrSy9IOS9PTS9yUGVjCiszKzdPWHA1enpudk9ycy9jMWROd2g3djN6RG84NjZkTlRWc0tKLytndmYzS3pKR1ovZS8zakpZcHFsV20zMHJxZUNkVW4zMDdGMzlqCis3aVc3MWttNnVIeTkyQUs1RmtpUzNHVEpmRTJPdnZlb2E2KzU5TDZqRmUwVUphRVl3Mms5c2FWcGFIN2pQUnRONFFlYW1QY1libnF1CitvL1VIYVljWWI4eTBJOSt4NW50SnRwbWZudDIwNE5qSUZVcndCdVpUbUN4cG9ic1dtdDVhYVAzaUoxaHlYNTRoV0YxaWpRRVQzTVlWCisyL28zNXhydWRkTlZDVGE3VU5LWHpVejlzL3NINytwcE9DVHBxS1JwL2VwL2o2UXBjbEdEdlF1MHRiWEZ6ZDBOR3p6b3g1TEdkdTk2CitGWFBwNit0WDVyYW1uUVBGbVlnL3JwR3d2czQxTzJYNjI3UnpsTUYvNWdmUHZqSHRFT1BRNnhyUmhzUmIzZEpVVUFoWFMzbzk4YmJUCis1QVYrNGdGRktGajhXaG1ibnlwcGprNXN5akZQeWN6QVlSeFp0ekwzdUJLOVI3bEt1SDVZa3gyNk51MFlLQjdGR0VZbFg1djl2RXRGCiszd2hkeFo0ZHp1cVRvN3AzQ0c5aHBwdDdjeTFQbGFQdC9QMVg3VGIzcTFXSk85NHF4QlZZQWdzVVllT0tiUSs2bEVzN0J5YXVkZlc1CisyeVJ2VHp0SGdsNVVUZWFLcTVkdW4xaURtZThTRkdNWW5TMU5CUVZ2bHZSazJsRVNzRGVUelM3ZHY3V0Y4emVLMTlGYm15M3JaaWU5CitYYTNmTXRPZmw3T1BTcktNQnRQT0FJdzdHYnRCVWpVUFpFeVlBYU4zSXpONWZIM0sxWkwvZDlwWkVyQS9aTUxTOVVzNzk2VWRCR05ECitNWVpSNjd1LzlWQzJNTEpVcHAra25XV3NYSHBtUkhISnMxdWIrdExPOGc3MnliVTU3UkMvWkhkbU9OdWlMVTJGZC83VDB2UjJ0TnpxCitybHZMM1U4bFdLSDBRMnlCZDVzTnk3cWZrUFRYYWVjNGhjZk03UGEwUTZBMEcxZHZmUzNLVjhpMUsrMHNZK2JhVjNCZmNzMnlycWZUCitqb0t4b3hoRFVmYm0xdjZzVU1ndWsvUlEybG1LNWZMY1NGYUxYK2hjTXg1R2p3cjVydVlOSnJzdDdTQS90emVZTno2N3JhbS9VaDMyCitkYlY4d2FYUFNoclZsdFJWNnRpWkI0NndyVDB3Qmkvc1hIeXJTL2VtbmVNdFRJOU1zc0l5ZHorUWRoU1VidU9LYmYxRE5VTXI1ZXBKCitPOHNZN0F6eTMvNTBRODh6YVFkQmFTakdVTFI5M1UydjF0VmxsN2owOXhvZlN6V2kzUCttcjY1bTFmaGFtbWplMjlsOG84bi9XTkp3Citpa0YyeHhIN3lITWRyZmxLZDl6WDJmSlZLWHhVMGt1Vjdqc1JwcTJQUExJeHpkY09HTGZhMnRyaWxLZzFrbTlQTzRza3lXekw1SUorCis5dy9ydjM4dzdTaEl6clZMdHgrYmVYaG1vNXZmclBFeStPZTZQYzQrdUpTRG5TY0dpakdNeVJOYm1vYjZPbHV1ajI0ZmwxVE5NMDJQCittdUlsK2E3V3Y2akU4cnB5Nk8xcy9TZHphNUJVOFVMU3BLMkZtTDMwK1o3bTFEN3c4NTFYZGRZbyt4dVN2cE5XaGpIYUc3SzZQdTBRCit3SGkyZG1WdTRHanRzVldTdnB0aWpDRjN1M0hkOHU1UHJsMlpHMGd4Qjhxa3FXbExZVU45ejAzbTNpQnBiOXA1VG1OM01GdTJ2aUYzCiszY1lMSDJHZ2I0S2dHRU5KbnU5cXZ1LzF3c2o3VExwWnFxcU5DbDZXMlovazY3SVg5WGF1ZVRqdE1LWHE3V3JlSGtmc0FwZFhhb2V4CitRWE83b2JleitXUDd1cHRlclZDZnA3U25zK2xBdnJQbGNqYzFTSG9rN1R6djRCVXovNnNheFE4OWQxL0x5MGswYUlWTUlxTzFKcXZFCitxRy9KZlVTUHhiZmhJWm5IWmlyYm9JMWJKcEcyTFNUMFdOOUd0SVRham1ONERVL2hoc1VQRGE2cnovMit1MzlPMG10SnRUdEtQNHFLCitGMjVvNkw3TjdFMHJRVW81Q1Q0QkZoTDZUUER4OHBuZ0ZabXhXdGZROC8zQjRjd0gzTzFHblRpTHJsb2NOUE0vaTdNUFhuQk5mZmNECithWWRCc2lqR1VMS1hjMnNIZWp0YmJsSXNMSkowaTZRVTE5TGJIbk45MmdhUHZ6ZmYwZnkxOFRvYjluYWU3Mm5lMzlmWmN0blBseTBlCitLbE0zN3ZKdkIvUDM5M1kxLzUxa1ZiVU10YStqcFNmZjJYeVJUSitRNndGVnp6TFpJWm51TjlsVmhicnMvTjZPMXJZOW5XdU9KTlg0CitqTHJ3dkJKWXFobmRmNVJBbkhkU2NoK21VSFFiR1J2NUgwbWxIbFVSWFlWSFMyempsQkxLZU54aWZDeUpQRy9IVkhoU3BiK3ZqbWZjCitmcHBFbnBQTTVCc2FlcjVpSVh1K3pMYW8zTzk5MXo1elgvOUNkdWppalN1Mi9mL0hZbUdzSzBJR1poeXNmYkcwY05Ma1F0d3JxZVNCCitNbGNzKzJlQ0pmS1pVSG9iby9YWlZaM0hOelIwM3hhelF3c2xmVkZTeWE5WENmcmMvWE9Ub3hhc3ErLzVNck5oRXhPSGtTSng1MXpaCitQalY3ZEtSSnBzdGRXcUVUaDJ5VzB5c20rNC9vYXUrYm50bWVkZ0cyb1BHYmowcjZ6UktieWVjN1c5NTdxditjcy9xYnYxSXpZamRKCisva2VTNmtyc1M1SUczZXpic3ZnUGZmZTNWdnZNMHhzV3J2cldyNDRvWG0ydWowcjZ0UXAyN1pLZWtmU2dUQjFUc29PNXArKzdwcXlqCitxUE1iN3puZkZHNlJ2RUd5YVVWYzZwSitZdTVmNmUxcS9VYVo0cjNodk1iMjl3ejd5SmRrdWtMUzdDSXZmMWF1Ty9MVHM1dkc4ajYrCitxN3RobVRLNlNhN0ZrckpGWERyaTBnNHozYnErUGxmV0cvazM1MVlzOTJCL09ZYU14eVhiN3NGdjNyQThWOWJkM3paM042ejJvQzlJCit1a2hTcG9oTGgyWGFJVm5iK3ZydUhXV0tKMG42K3JiRzh3dUsxN3Q3azBrekVtejZjYm5ma2EwWnZ2dDBaemJkM3RFNGVlcWsrSzl5Cit2MXlqZjQ2ZWRkTjFHK3B6MzBzaTZOMWRLeThvWk9JdEpsdW00cjVubzZRZnkzM1Qrb2FlZjA4aXkrbmNuVnN4SjhxK0pOUEhKYzBzCis3bXI3WC9mNGovdDNYZkxWdHJhMlZPN25hbSsvY3RMaE0vb3ZENjVQdUhTWnBOcXlkbWc2WkxMdlJ2TjJuM2x3R3dYWXhFY3hockk2CitxK0ZmYXFlRW1nWlpYQ3paUlpJK0pHbDZpYzIrWXRKRExuL1laRHQ3QjgvZVdVMkhOMWVpR0R2cHZNWjdaZ3g3V09QbUh6UFpSeVJOCitLYUtQUTJhMnpWMWRoWmk1dHhxV0k1WmlidU05NTJTVmFaRDhkeVI5VUNlS3MyS2VqMU01SnVrcGs1NlVhN2ZrajhhTWZ0aDNmMnU1CitaaWRQNjhNZnZyUG00Sm5URjhWZ2M2VjRSZ2hXNSs2MUx0V2FiTVRsUjROQ2Y3VENnRWU5YkJuYmswcld0cll3NzcvZWQyN0dmWjRICitQOVBkYTROVUc2VVpKMlpjL1hCd08xcVFEWVNNWGdrWjM1dlVzczQ3dDY2ZUZxWU9uMmZ5T1lweHVxU1pVYXFWd2hRcHZoNmtBVW45CitDdUdveS9iSHdabzlHMWR2cmVqeXQ5Rm1qT1pIUWd3dlpDWU43YW4wZ2E1M1AvaDcwd3V2RFM1U3hzNE9CYStMRm1iSjQ3UnFlaDQzCis3YnA0YXQzQWpGVkJ2dEtsNVpJV0Z0bUV1K2t4YytXQ2hlOWNVOTlWMUU3QmQvYlV6OHpFY0lHYnovZGdNeFR0amU4M014MDMrUkdaCis3UjhldHFjKzA5alZXMlMyVVdsdnYzTFNzVE9PblRlaU9DZkVPTnN0MUpsVUcxMjFDbkhZWk1mYzdYQ1FCano2U3pIRVBSdFhiS3ZZCit6cmh2eXBsNWRkYmhoVFVobkJQbFo5cUp6NE5hUlp0dTVsR21mcGVPaElJR1BNUURtZUdhdlo5YTFWbFZ1MWIrOHdOTHBoUkdKaTkzCisrYVVuZnRQNGhTcTZ3UHdscGtNVzliQUhmOGlpZHMwNFBHdEhVOU9Xb1dRU1l6eWdHRU5sWGRtZW1mL2E4SUlRYlY0MG0yL3U4MDAyCitYZEpzTjJWT2puQzYrMkdaaHMzdGFGUThGQlI2cFVKZU5xbTN0Nk9wcW5mV3EyUXg5bVp6Vm0rZFZqTjg5QUkzLy9VZ1d5VFpyS2c0CiswOHlpdVIxMTgzNUZIWERUVXpFV2R1K2JNZm01dEdjUnkyckpBOWx6cCt4YkZDMHoxODNteXVPY29EQmJKMmRyN01TLzBmMjFJRHZ1Cis3c2Y4eE96RFM4RzhyK0R4aGVDK0w5LzlCMmt1VVFGUWhNMWRLODlRaUIvMFlJdmttaVA1V1hLYnFtRFRKRDh1OTJPeThLcmtlWS8rCis5T1FRSDJkM1JJeVZ1K3lPcnNzV1pHdDhubUpjWU1IbVNUNHpScHRsd1RMNlJhSFdML2RoTXo4aVdiL2M4akY0YjZiZ3ZaOWEwZlBpCitXKzVIeExzT3hSaVFzTFNLTVFBQUFJd3ZiT0FCQUFBQUFDbWdHQU1BQUFDQUZGQ01BUUFBQUVBS0tNWUFBQUFBSUFVVVl3QUFBQUNRCitBb294QUFBQUFFZ0J4UmdBQUFBQXBJQmlEQUFBQUFCU1FERUdBQUFBQUNtZ0dBTUFBQUNBRkZDTUFRQUFBRUFLS01ZQUFBQUFJQVVVCitZd0FBQUFDUUFvb3hBQUFBQUVnQnhSZ0FBQUFBcElCaURBQUFBQUJTUURFR0FBQUFBQ21nR0FNQUFBQ0FGRkNNQVFBQUFFQUtLTWFBCis1STFVU1JzQUFBQ29ZaFJqUU1MY3RLM2tOdVE5U1dRQkFBQkE5YUlZQXhMV1Y1djlvbVIvS3RtZTRxKzJQZWI2L1BTNm11dVNUd1lBCitBSUJxWW1rSEFDYXljMWY5MjRJWTlRRUxkcGE3MTdwVUd4Um1TNUxjRDBmVGdNa0czQW8vczVINFJENjM5cm1VSXdNQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCitBUHdmbGdBeFVzb25ya2NBQUFBQVNVVk9SSzVDWUlJPQorIgorICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiCisgICAgICAgaGVpZ2h0PSI1NC4yMDQxNTEiCisgICAgICAgd2lkdGg9IjY1IiAvPgorICA8L2c+CisgIDxnCisgICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCisgICAgIGlkPSJsYXllcjIiCisgICAgIGlua3NjYXBlOmxhYmVsPSJCQURHRSIKKyAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSIKKyAgICAgc29kaXBvZGk6aW5zZW5zaXRpdmU9InRydWUiPgorICAgIDxnCisgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgorICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zNDAuMDAwMDEsLTU4MSkiCisgICAgICAgaWQ9Imc0Mzk0IgorICAgICAgIGNsaXAtcGF0aD0ibm9uZSI+CisgICAgICA8ZworICAgICAgICAgaWQ9Imc4NTUiPgorICAgICAgICA8ZworICAgICAgICAgICBpbmtzY2FwZTpncm91cG1vZGU9Im1hc2toZWxwZXIiCisgICAgICAgICAgIGlkPSJnODcwIgorICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4NzMpIgorICAgICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7ZmlsdGVyOnVybCgjZmlsdGVyODkxKSI+CisgICAgICAgICAgPGNpcmNsZQorICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuNDk5OTk5MiwwLDAsMS40OTk5OTkyLC0yOS45OTk3OTUsLTIzNy41NDI4MikiCisgICAgICAgICAgICAgaWQ9InBhdGg4NDQiCisgICAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDo0O21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCisgICAgICAgICAgICAgY3g9IjI1MiIKKyAgICAgICAgICAgICBjeT0iNTUyLjM2MjE4IgorICAgICAgICAgICAgIHI9IjEyIiAvPgorICAgICAgICA8L2c+CisgICAgICAgIDxnCisgICAgICAgICAgIGlkPSJnODYyIj4KKyAgICAgICAgICA8Y2lyY2xlCisgICAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojZjVmNWY1O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDo0O21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCisgICAgICAgICAgICAgaWQ9InBhdGg0Mzk4IgorICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuNDk5OTk5MiwwLDAsMS40OTk5OTkyLC0yOS45OTk3OTUsLTIzOC41NDI4MikiCisgICAgICAgICAgICAgY3g9IjI1MiIKKyAgICAgICAgICAgICBjeT0iNTUyLjM2MjE4IgorICAgICAgICAgICAgIHI9IjEyIiAvPgorICAgICAgICAgIDxjaXJjbGUKKyAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjI1LDAsMCwxLjI1LDMzLC0xMDAuNDUyNzMpIgorICAgICAgICAgICAgIGlkPSJwYXRoNDQwMCIKKyAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtmaWxsOiNkZDQ4MTQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjQ7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKKyAgICAgICAgICAgICBjeD0iMjUyIgorICAgICAgICAgICAgIGN5PSI1NTIuMzYyMTgiCisgICAgICAgICAgICAgcj0iMTIiIC8+CisgICAgICAgICAgPHBhdGgKKyAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJzdGFyIgorICAgICAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO2ZpbGw6I2Y1ZjVmNTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MzttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgorICAgICAgICAgICAgIGlkPSJwYXRoNDQ1OSIKKyAgICAgICAgICAgICBzb2RpcG9kaTpzaWRlcz0iNSIKKyAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iNjY2LjE5NTc0IgorICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSI1ODkuNTAzODUiCisgICAgICAgICAgICAgc29kaXBvZGk6cjE9IjcuMjQzMTE3OCIKKyAgICAgICAgICAgICBzb2RpcG9kaTpyMj0iNC4zNDU4NzA1IgorICAgICAgICAgICAgIHNvZGlwb2RpOmFyZzE9IjEuMDQ3MTk3NiIKKyAgICAgICAgICAgICBzb2RpcG9kaTphcmcyPSIxLjY3NTUxNjEiCisgICAgICAgICAgICAgaW5rc2NhcGU6ZmxhdHNpZGVkPSJmYWxzZSIKKyAgICAgICAgICAgICBpbmtzY2FwZTpyb3VuZGVkPSIwLjEiCisgICAgICAgICAgICAgaW5rc2NhcGU6cmFuZG9taXplZD0iMCIKKyAgICAgICAgICAgICBkPSJtIDY2OS44MTczLDU5NS43NzY1NyBjIC0wLjM5MTMyLDAuMjI1OTMgLTMuNjI2NDUsLTEuOTAzNDMgLTQuMDc1ODMsLTEuOTUwNjYgLTAuNDQ5MzgsLTAuMDQ3MiAtNC4wNTY1MywxLjM2Mjk3IC00LjM5MjMyLDEuMDYwNjIgLTAuMzM1OCwtMC4zMDIzNSAwLjY4OTYzLC00LjAzNzE1IDAuNTk1NjksLTQuNDc5MTMgLTAuMDkzOSwtMC40NDE5OCAtMi41NDk4LC0zLjQzNjgxIC0yLjM2NjAyLC0zLjg0OTYgMC4xODM3OSwtMC40MTI3OSA0LjA1MjY3LC0wLjU5MTY2IDQuNDQzOTgsLTAuODE3NTkgMC4zOTEzMiwtMC4yMjU5MyAyLjQ4MDY3LC0zLjQ4NzA0IDIuOTMwMDUsLTMuNDM5OCAwLjQ0OTM4LDAuMDQ3MiAxLjgxNTA1LDMuNjcxNDcgMi4xNTA4NCwzLjk3MzgyIDAuMzM1OCwwLjMwMjM2IDQuMDgyOTQsMS4yODE3IDQuMTc2ODksMS43MjM2OSAwLjA5MzksMC40NDE5OCAtMi45MzA5LDIuODYwNzYgLTMuMTE0NjksMy4yNzM1NSAtMC4xODM3OSwwLjQxMjc5IDAuMDQyNyw0LjI3OTE3IC0wLjM0ODU5LDQuNTA1MSB6IgorICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuNTExNDIzLC0wLjE2MzY2Mzc3LDAuMTYzNjYzNzcsMS41MTE0MjMsLTc1NS4zNzM0NiwtMTkxLjkzNjUxKSIgLz4KKyAgICAgICAgPC9nPgorICAgICAgPC9nPgorICAgIDwvZz4KKyAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0tY29tcHV0ZS9sYXllci55YW1sIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltLWNvbXB1dGUvbGF5ZXIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzQ2NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltLWNvbXB1dGUvbGF5ZXIueWFtbApAQCAtMCwwICsxLDEyIEBACitpbmNsdWRlczoKKyAgLSAnbGF5ZXI6YmFzaWMnCisgIC0gJ2ludGVyZmFjZTpvcGVudmltLWNvbXB1dGUnCitvcHRpb25zOgorICBiYXNpYzoKKyAgICBwYWNrYWdlczoKKyAgICAgIC0gcWVtdS1rdm0KKyAgICAgIC0gbGlidmlydC1iaW4KKyAgICAgIC0gYnJpZGdlLXV0aWxzCisgICAgICAtIHZpcnQtdmlld2VyCisgICAgICAtIHZpcnQtbWFuYWdlcgorICAgICAgLSBodWdlcGFnZXMKZGlmZiAtLWdpdCBhL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS1jb21wdXRlL21ldGFkYXRhLnlhbWwgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0tY29tcHV0ZS9tZXRhZGF0YS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzQ0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0tY29tcHV0ZS9tZXRhZGF0YS55YW1sCkBAIC0wLDAgKzEsMTkgQEAKK25hbWU6IG9wZW52aW0tY29tcHV0ZQorc3VtbWFyeTogT3BlbiBWaXJ0dWFsIEluZnJhc3RydWN0dXJlIE1hbmFnZXIKK21haW50YWluZXJzOgorICAtIFJ5ZSBUZXJyZWxsIDxyeWUudGVycmVsbEBjYW5vbmljYWwuY29tPgorICAtIEdlb3JnZSBLcmFmdCA8Z2VvcmdlLmtyYWZ0QGNhbm9uaWNhbC5jb20+CitkZXNjcmlwdGlvbjogfAorICBJbnN0YWxscyBhbmQgY29uZmlndXJlcyBhIGNvbXB1dGUgbm9kZSBmb3IgT3BlblZJTQordGFnczoKKyAgLSBuZnYKKyAgLSB0ZWxjbworICAtIG9zbQorc2VyaWVzOgorICAtIHhlbmlhbAorZXh0cmEtYmluZGluZ3M6CisgIHB1YmxpYzoKKyAgaW50ZXJuYWw6Citwcm92aWRlczoKKyAgY29tcHV0ZToKKyAgICBpbnRlcmZhY2U6IG9wZW52aW0tY29tcHV0ZQpkaWZmIC0tZ2l0IGEvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltLWNvbXB1dGUvcmVhY3RpdmUvb3BlbnZpbS5weSBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS1jb21wdXRlL3JlYWN0aXZlL29wZW52aW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2OTM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS1jb21wdXRlL3JlYWN0aXZlL29wZW52aW0ucHkKQEAgLTAsMCArMSw3NCBAQAorZnJvbSBvcyBpbXBvcnQgY2htb2QKK2Zyb20gY2hhcm1zLnJlYWN0aXZlIGltcG9ydCB3aGVuLCB3aGVuX25vdCwgc2V0X3N0YXRlCitmcm9tIGNoYXJtaGVscGVycy5jb3JlLmhvb2tlbnYgaW1wb3J0IHN0YXR1c19zZXQKK2Zyb20gY2hhcm1oZWxwZXJzLmNvcmUudW5pdGRhdGEgaW1wb3J0IGt2Citmcm9tIGNoYXJtaGVscGVycy5jb3JlLmhvc3QgaW1wb3J0IG1rZGlyLCBzeW1saW5rLCBjaG93bnIsIGFkZF91c2VyX3RvX2dyb3VwCitmcm9tIGNoYXJtaGVscGVycy5mZXRjaC5hcmNoaXZldXJsIGltcG9ydCBBcmNoaXZlVXJsRmV0Y2hIYW5kbGVyCitmcm9tIGNoYXJtaGVscGVycy5jb250cmliLnVuaXNvbiBpbXBvcnQgZW5zdXJlX3VzZXIKKworZGVmIGNyZWF0ZV9vcGVudmltX3VzZXIoKToKKyAgICBzdGF0dXNfc2V0KCJtYWludGVuYW5jZSIsICJDcmVhdGluZyBPcGVuVklNIHVzZXIiKQorICAgIGVuc3VyZV91c2VyKCdvcGVudmltJykKKworZGVmIGdyb3VwX29wZW52aW1fdXNlcigpOgorICAgIHN0YXR1c19zZXQoIm1haW50ZW5hbmNlIiwgIkFkZGluZyBPcGVuVklNIHVzZXIgdG8gZ3JvdXBzIikKKyAgICBhZGRfdXNlcl90b19ncm91cCgnb3BlbnZpbScsICdsaWJ2aXJ0ZCcpCisgICAgYWRkX3VzZXJfdG9fZ3JvdXAoJ29wZW52aW0nLCAnc3VkbycpCisKK2RlZiBub3Bhc3N3ZF9vcGVudmltX3N1ZG8oKToKKyAgICBzdGF0dXNfc2V0KCJtYWludGVuYW5jZSIsICJBbGxvd2luZyBub3Bhc3N3ZCBzdWRvIGZvciBPcGVuVklNIHVzZXIiKQorICAgIHdpdGggb3BlbignL2V0Yy9zdWRvZXJzJywgJ3IrJykgYXMgZjoKKyAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgIGlmICdvcGVudmltIEFMTD0oQUxMKSBOT1BBU1NXRDpBTEwnIG5vdCBpbiBkYXRhOgorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICBmLnRydW5jYXRlKCkKKyAgICAgICAgICAgIGRhdGEgKz0gJ1xub3BlbnZpbSBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMXG4nCisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisKK2RlZiBzZXR1cF9xZW11X2JpbmFyeSgpOgorICAgIHN0YXR1c19zZXQoIm1haW50ZW5hbmNlIiwgIlNldHRpbmcgdXAgcWVtdS1rdm0gYmluYXJ5IikKKyAgICBta2RpcignL3Vzci9saWJleGVjJywgb3duZXI9J3Jvb3QnLCBncm91cD0ncm9vdCcsIHBlcm1zPTBvNzc1LCBmb3JjZT1GYWxzZSkKKyAgICBzeW1saW5rKCcvdXNyL2Jpbi9rdm0nLCAnL3Vzci9saWJleGVjL3FlbXUta3ZtJykKKworZGVmIHNldHVwX2ltYWdlc19mb2xkZXIoKToKKyAgICBzdGF0dXNfc2V0KCJtYWludGVuYW5jZSIsICJTZXR0aW5nIHVwIFZNIGltYWdlcyBmb2xkZXIiKQorICAgIG1rZGlyKCcvb3B0L1ZORicsIG93bmVyPSdvcGVudmltJywgZ3JvdXA9J29wZW52aW0nLCBwZXJtcz0wbzc3NSwgZm9yY2U9RmFsc2UpCisgICAgc3ltbGluaygnL3Zhci9saWIvbGlidmlydC9pbWFnZXMnLCAnL29wdC9WTkYvaW1hZ2VzJykKKyAgICBjaG93bnIoJy9vcHQvVk5GJywgb3duZXI9J29wZW52aW0nLCBncm91cD0nb3BlbnZpbScsIGZvbGxvd19saW5rcz1GYWxzZSwgY2hvd250b3BkaXI9VHJ1ZSkKKyAgICBjaG93bnIoJy92YXIvbGliL2xpYnZpcnQvaW1hZ2VzJywgb3duZXI9J3Jvb3QnLCBncm91cD0nb3BlbnZpbScsIGZvbGxvd19saW5rcz1GYWxzZSwgY2hvd250b3BkaXI9VHJ1ZSkKKyAgICBjaG1vZCgnL3Zhci9saWIvbGlidmlydC9pbWFnZXMnLCAwbzc3NSkKKworZGVmIGRvd25sb2FkX2RlZmF1bHRfaW1hZ2UoKToKKyAgICBzdGF0dXNfc2V0KCJtYWludGVuYW5jZSIsICJEb3dubG9hZGluZyBkZWZhdWx0IGltYWdlIikKKyAgICBmZXRjaGVyID0gQXJjaGl2ZVVybEZldGNoSGFuZGxlcigpCisgICAgZmV0Y2hlci5kb3dubG9hZCgKKyAgICAgICAgc291cmNlPSJodHRwczovL2Nsb3VkLWltYWdlcy51YnVudHUuY29tL3JlbGVhc2VzLzE2LjA0L3JlbGVhc2UvdWJ1bnR1LTE2LjA0LXNlcnZlci1jbG91ZGltZy1hbWQ2NC1kaXNrMS5pbWciLAorICAgICAgICBkZXN0PSIvb3B0L1ZORi9pbWFnZXMvdWJ1bnR1LTE2LjA0LXNlcnZlci1jbG91ZGltZy1hbWQ2NC1kaXNrMS5pbWciCisgICAgICAgICMgVE9ETzogYWRkIGNoZWNrc3VtCisgICAgKQorCitAd2hlbl9ub3QoJ29wZW52aW0tY29tcHV0ZS5pbnN0YWxsZWQnKQorZGVmIHByZXBhcmVfb3BlbnZpbV9jb21wdXRlKCk6CisgICAgY3JlYXRlX29wZW52aW1fdXNlcigpCisgICAgZ3JvdXBfb3BlbnZpbV91c2VyKCkKKyAgICBub3Bhc3N3ZF9vcGVudmltX3N1ZG8oKQorICAgIHNldHVwX3FlbXVfYmluYXJ5KCkKKyAgICBzZXR1cF9pbWFnZXNfZm9sZGVyKCkKKyAgICBkb3dubG9hZF9kZWZhdWx0X2ltYWdlKCkKKyAgICBzdGF0dXNfc2V0KCJhY3RpdmUiLCAiUmVhZHkiKQorICAgIHNldF9zdGF0ZSgnb3BlbnZpbS1jb21wdXRlLmluc3RhbGxlZCcpCisKK0B3aGVuKCdjb21wdXRlLmF2YWlsYWJsZScsICdvcGVudmltLWNvbXB1dGUuaW5zdGFsbGVkJykKK2RlZiBpbnN0YWxsX3NzaF9rZXkoY29tcHV0ZSk6CisgICAgY2FjaGUgPSBrdigpCisgICAgaWYgY2FjaGUuZ2V0KCJzc2hfa2V5OiIgKyBjb21wdXRlLnNzaF9rZXkoKSk6CisgICAgICAgIHJldHVybgorICAgIG1rZGlyKCcvaG9tZS9vcGVudmltLy5zc2gnLCBvd25lcj0nb3BlbnZpbScsIGdyb3VwPSdvcGVudmltJywgcGVybXM9MG83NzUpCisgICAgd2l0aCBvcGVuKCIvaG9tZS9vcGVudmltLy5zc2gvYXV0aG9yaXplZF9rZXlzIiwgJ2EnKSBhcyBmOgorICAgICAgICBmLndyaXRlKGNvbXB1dGUuc3NoX2tleSgpICsgJ1xuJykKKyAgICBjb21wdXRlLnNzaF9rZXlfaW5zdGFsbGVkKCkKKyAgICBjYWNoZS5zZXQoInNzaF9rZXk6IiArIGNvbXB1dGUuc3NoX2tleSgpLCBUcnVlKQorCitAd2hlbignY29tcHV0ZS5jb25uZWN0ZWQnKQorZGVmIHNlbmRfdXNlcihjb21wdXRlKToKKyAgICBjb21wdXRlLnNlbmRfdXNlcignb3BlbnZpbScpCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vUkVBRE1FLm1kIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjE2OTM0Ci0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL1JFQURNRS5tZApAQCAtMCwwICsxLDU4IEBACisjIE92ZXJ2aWV3CisKK0xhdW5jaGVzIGFuIE9wZW5WSU0gY29udHJvbGxlci4KKworIyBQcmVwYXJhdGlvbgorCitXaGVuIHJ1bm5pbmcgd2l0aCBhbiBMWEQgY2xvdWQsIHRoZSBvcGVudmltLWNvbXB1dGUgbm9kZXMgbmVlZHMgdG8gaGF2ZSBzb21lCitkZXZpY2VzIGFkZGVkIGFuZCBiZSBydW4gd2l0aCBleHRyYSBwcml2aWxlZ2VzLiBBIHF1aWNrLWFuZC1kaXJ0eSB3YXkgb2YKK2FjY29tcGxpc2hpbmcgdGhpcyBpcyB0byBlZGl0IHRoZSBqdWp1LWRlZmF1bHQgTFhEIHByb2ZpbGU6CisKKyAgICBseGMgcHJvZmlsZSBlZGl0IGp1anUtZGVmYXVsdAorICAgIAorY2hhbmdlIGl0IHRvOgorCisgICAgbmFtZToganVqdS1kZWZhdWx0CisgICAgY29uZmlnOgorICAgICAgYm9vdC5hdXRvc3RhcnQ6ICJ0cnVlIgorICAgICAgc2VjdXJpdHkubmVzdGluZzogInRydWUiCisgICAgICBzZWN1cml0eS5wcml2aWxlZ2VkOiAidHJ1ZSIKKyAgICBkZXNjcmlwdGlvbjogIiIKKyAgICBkZXZpY2VzOgorICAgICAga3ZtOgorICAgICAgICBwYXRoOiAvZGV2L2t2bQorICAgICAgICB0eXBlOiB1bml4LWNoYXIKKyAgICAgIHR1bjoKKyAgICAgICAgcGF0aDogL2Rldi9uZXQvdHVuCisgICAgICAgIHR5cGU6IHVuaXgtY2hhcgorCisjIFVzYWdlCisKKyAgICBqdWp1IGRlcGxveSBteXNxbAorICAgIGp1anUgZGVwbG95IG9wZW52aW0KKyAgICBqdWp1IGRlcGxveSBvcGVudmltLWNvbXB1dGUKKyAgICBqdWp1IHJlbGF0ZSBteXNxbCBvcGVudmltCisgICAganVqdSByZWxhdGUgb3BlbnZpbS1jb21wdXRlIG9wZW52aW0KKyAgICAKKyMgQ3JlYXRpbmcgYW5kIHN0YXJ0aW5nIGEgVk0KKworVGhlIG9wZW52aW0gY2hhcm0gd2lsbCBjcmVhdGUgYSBkZWZhdWx0IHRlbmFudCwgaW1hZ2UsIGZsYXZvciwKK2FuZCBuZXR3b3JrcywgYnV0IHlvdSdsbCB3YW50IHRvIGFkZCB5b3VyIG93biBWTSB3aGVuIHlvdSdyZSByZWFkeSB0byBkZXBsb3kuCitUaGlzIGNoYXJtIGdlbmVyYXRlcyBhIGJhc2ljIFZNIHlhbWwgZGVmaW5pdGlvbiBmb3IgeW91IGlmIHlvdSdkIGxpa2UgdG8gbGF1bmNoCitvbmUgcXVpY2tseS4gRmlyc3QsIHNzaCBpbnRvIHlvdXIgb3BlbnZpbSBib3g6CisKKyAgICBqdWp1IHNzaCBvcGVudmltLWNvbnRybGxlci8wICMgbWF5IG5vdCBiZSB6ZXJvLCBmaW5kIGluc3RhbmNlIGlkIHdpdGggYGp1anUgc3RhdHVzYC4KKworVGhlbiBjcmVhdGUgeW91ciBWTSBhbmQgZ2V0IGl0cyB1dWlkOgorCisgICAgL2hvbWUvdWJ1bnR1L29wZW5tYW5vL29wZW52aW0vb3BlbnZpbSB2bS1jcmVhdGUgL3RtcC9zZXJ2ZXIueWFtbAorICAgIAorQW5kIGZpbmFsbHkgc3RhcnQgaXQ6CisKKyAgICAvaG9tZS91YnVudHUvb3Blbm1hbm8vb3BlbnZpbS9vcGVudmltIHZtLXN0YXJ0IDx2bS11dWlkPgorICAgIAorCisjIENvbnRhY3QgSW5mb3JtYXRpb24KKworUnllIFRlcnJlbGwgcnllLnRlcnJlbGxAY2Fub25pY2FsLmNvbQorR2VvcmdlIEtyYWZ0IGdlb3JnZS5rcmFmdEBjYW5vbmljYWwuY29tCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vaWNvbi5zdmcgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vaWNvbi5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwMzYxNQotLS0gL2Rldi9udWxsCisrKyBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS9pY29uLnN2ZwpAQCAtMCwwICsxLDI4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT4KKworPHN2ZworICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgorICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKKyAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKKyAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKKyAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgorICAgd2lkdGg9Ijk2IgorICAgaGVpZ2h0PSI5NiIKKyAgIGlkPSJzdmc2NTE3IgorICAgdmVyc2lvbj0iMS4xIgorICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MSByMTM3MjUiCisgICBzb2RpcG9kaTpkb2NuYW1lPSJpY29uLnN2ZyI+CisgIDxkZWZzCisgICAgIGlkPSJkZWZzNjUxOSI+CisgICAgPGxpbmVhckdyYWRpZW50CisgICAgICAgaWQ9IkJhY2tncm91bmQtMCI+CisgICAgICA8c3RvcAorICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2I4YjhiODtzdG9wLW9wYWNpdHk6MSIKKyAgICAgICAgIG9mZnNldD0iMCIKKyAgICAgICAgIGlkPSJzdG9wNDI0NSIgLz4KKyAgICAgIDxzdG9wCisgICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjk4MDM5MjE2IgorICAgICAgICAgb2Zmc2V0PSIxIgorICAgICAgICAgaWQ9InN0b3A0MjQ3IiAvPgorICAgIDwvbGluZWFyR3JhZGllbnQ+CisgICAgPGxpbmVhckdyYWRpZW50CisgICAgICAgaWQ9IkJhY2tncm91bmQiPgorICAgICAgPHN0b3AKKyAgICAgICAgIGlkPSJzdG9wNDE3OCIKKyAgICAgICAgIG9mZnNldD0iMCIKKyAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiOGI4Yjg7c3RvcC1vcGFjaXR5OjEiIC8+CisgICAgICA8c3RvcAorICAgICAgICAgaWQ9InN0b3A0MTgwIgorICAgICAgICAgb2Zmc2V0PSIxIgorICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M5YzljOTtzdG9wLW9wYWNpdHk6MSIgLz4KKyAgICA8L2xpbmVhckdyYWRpZW50PgorICAgIDxmaWx0ZXIKKyAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0I7IgorICAgICAgIGlua3NjYXBlOmxhYmVsPSJJbm5lciBTaGFkb3ciCisgICAgICAgaWQ9ImZpbHRlcjExMjEiPgorICAgICAgPGZlRmxvb2QKKyAgICAgICAgIGZsb29kLW9wYWNpdHk9IjAuNTk5OTk5OTk5OTk5OTk5OTgiCisgICAgICAgICBmbG9vZC1jb2xvcj0icmdiKDAsMCwwKSIKKyAgICAgICAgIHJlc3VsdD0iZmxvb2QiCisgICAgICAgICBpZD0iZmVGbG9vZDExMjMiIC8+CisgICAgICA8ZmVDb21wb3NpdGUKKyAgICAgICAgIGluPSJmbG9vZCIKKyAgICAgICAgIGluMj0iU291cmNlR3JhcGhpYyIKKyAgICAgICAgIG9wZXJhdG9yPSJvdXQiCisgICAgICAgICByZXN1bHQ9ImNvbXBvc2l0ZTEiCisgICAgICAgICBpZD0iZmVDb21wb3NpdGUxMTI1IiAvPgorICAgICAgPGZlR2F1c3NpYW5CbHVyCisgICAgICAgICBpbj0iY29tcG9zaXRlMSIKKyAgICAgICAgIHN0ZERldmlhdGlvbj0iMSIKKyAgICAgICAgIHJlc3VsdD0iYmx1ciIKKyAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjExMjciIC8+CisgICAgICA8ZmVPZmZzZXQKKyAgICAgICAgIGR4PSIwIgorICAgICAgICAgZHk9IjIiCisgICAgICAgICByZXN1bHQ9Im9mZnNldCIKKyAgICAgICAgIGlkPSJmZU9mZnNldDExMjkiIC8+CisgICAgICA8ZmVDb21wb3NpdGUKKyAgICAgICAgIGluPSJvZmZzZXQiCisgICAgICAgICBpbjI9IlNvdXJjZUdyYXBoaWMiCisgICAgICAgICBvcGVyYXRvcj0iYXRvcCIKKyAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMiIKKyAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTExMzEiIC8+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlcgorICAgICAgIHN0eWxlPSJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6c1JHQjsiCisgICAgICAgaW5rc2NhcGU6bGFiZWw9IkRyb3AgU2hhZG93IgorICAgICAgIGlkPSJmaWx0ZXI5NTAiPgorICAgICAgPGZlRmxvb2QKKyAgICAgICAgIGZsb29kLW9wYWNpdHk9IjAuMjUiCisgICAgICAgICBmbG9vZC1jb2xvcj0icmdiKDAsMCwwKSIKKyAgICAgICAgIHJlc3VsdD0iZmxvb2QiCisgICAgICAgICBpZD0iZmVGbG9vZDk1MiIgLz4KKyAgICAgIDxmZUNvbXBvc2l0ZQorICAgICAgICAgaW49ImZsb29kIgorICAgICAgICAgaW4yPSJTb3VyY2VHcmFwaGljIgorICAgICAgICAgb3BlcmF0b3I9ImluIgorICAgICAgICAgcmVzdWx0PSJjb21wb3NpdGUxIgorICAgICAgICAgaWQ9ImZlQ29tcG9zaXRlOTU0IiAvPgorICAgICAgPGZlR2F1c3NpYW5CbHVyCisgICAgICAgICBpbj0iY29tcG9zaXRlMSIKKyAgICAgICAgIHN0ZERldmlhdGlvbj0iMSIKKyAgICAgICAgIHJlc3VsdD0iYmx1ciIKKyAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjk1NiIgLz4KKyAgICAgIDxmZU9mZnNldAorICAgICAgICAgZHg9IjAiCisgICAgICAgICBkeT0iMSIKKyAgICAgICAgIHJlc3VsdD0ib2Zmc2V0IgorICAgICAgICAgaWQ9ImZlT2Zmc2V0OTU4IiAvPgorICAgICAgPGZlQ29tcG9zaXRlCisgICAgICAgICBpbj0iU291cmNlR3JhcGhpYyIKKyAgICAgICAgIGluMj0ib2Zmc2V0IgorICAgICAgICAgb3BlcmF0b3I9Im92ZXIiCisgICAgICAgICByZXN1bHQ9ImNvbXBvc2l0ZTIiCisgICAgICAgICBpZD0iZmVDb21wb3NpdGU5NjAiIC8+CisgICAgPC9maWx0ZXI+CisgICAgPGNsaXBQYXRoCisgICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCisgICAgICAgaWQ9ImNsaXBQYXRoODczIj4KKyAgICAgIDxnCisgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLC0wLjY2NjY2NjY3LDAuNjY2MDQ0NzksMCwtMjU4LjI1OTkyLDY3Ny4wMDAwMSkiCisgICAgICAgICBpZD0iZzg3NSIKKyAgICAgICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgorICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmMDBmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSI+CisgICAgICAgIDxwYXRoCisgICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZjAwZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiCisgICAgICAgICAgIGQ9Im0gNDYuNzAyNzAzLDg5OC4yMjc3NSA1MC41OTQ1OTQsMCBDIDEzOC4xNjIxNiw4OTguMjI3NzUgMTQ0LDkwNC4wNjQ5NyAxNDQsOTQ0LjkyNTgzIGwgMCw1MC43Mzg0NiBjIDAsNDAuODYwNzEgLTUuODM3ODQsNDYuNjk3OTEgLTQ2LjcwMjcwMyw0Ni42OTc5MSBsIC01MC41OTQ1OTQsMCBDIDUuODM3ODM3OCwxMDQyLjM2MjIgMCwxMDM2LjUyNSAwLDk5NS42NjQyOSBMIDAsOTQ0LjkyNTgzIEMgMCw5MDQuMDY0OTcgNS44Mzc4Mzc4LDg5OC4yMjc3NSA0Ni43MDI3MDMsODk4LjIyNzc1IFoiCisgICAgICAgICAgIGlkPSJwYXRoODc3IgorICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgorICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9InNzc3Nzc3NzcyIgLz4KKyAgICAgIDwvZz4KKyAgICA8L2NsaXBQYXRoPgorICAgIDxmaWx0ZXIKKyAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCisgICAgICAgaWQ9ImZpbHRlcjg5MSIKKyAgICAgICBpbmtzY2FwZTpsYWJlbD0iQmFkZ2UgU2hhZG93Ij4KKyAgICAgIDxmZUdhdXNzaWFuQmx1cgorICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgorICAgICAgICAgc3RkRGV2aWF0aW9uPSIwLjcxOTk5OTYyIgorICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyODkzIiAvPgorICAgIDwvZmlsdGVyPgorICA8L2RlZnM+CisgIDxzb2RpcG9kaTpuYW1lZHZpZXcKKyAgICAgaWQ9ImJhc2UiCisgICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKKyAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCisgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKKyAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKKyAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKKyAgICAgaW5rc2NhcGU6em9vbT0iNC4wNzQ1MzYyIgorICAgICBpbmtzY2FwZTpjeD0iMTE5LjM4NTA1IgorICAgICBpbmtzY2FwZTpjeT0iMzkuMjAxMTAxIgorICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCisgICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKKyAgICAgc2hvd2dyaWQ9InRydWUiCisgICAgIGZpdC1tYXJnaW4tdG9wPSIwIgorICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCisgICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCisgICAgIGZpdC1tYXJnaW4tYm90dG9tPSIwIgorICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE2MDAiCisgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijg3NiIKKyAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCisgICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKKyAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKKyAgICAgc2hvd2JvcmRlcj0idHJ1ZSIKKyAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKKyAgICAgaW5rc2NhcGU6Z3VpZGUtYmJveD0idHJ1ZSIKKyAgICAgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9ImZhbHNlIj4KKyAgICA8aW5rc2NhcGU6Z3JpZAorICAgICAgIHR5cGU9Inh5Z3JpZCIKKyAgICAgICBpZD0iZ3JpZDgyMSIgLz4KKyAgICA8c29kaXBvZGk6Z3VpZGUKKyAgICAgICBvcmllbnRhdGlvbj0iMSwwIgorICAgICAgIHBvc2l0aW9uPSIxNiw0OCIKKyAgICAgICBpZD0iZ3VpZGU4MjMiIC8+CisgICAgPHNvZGlwb2RpOmd1aWRlCisgICAgICAgb3JpZW50YXRpb249IjAsMSIKKyAgICAgICBwb3NpdGlvbj0iNjQsODAiCisgICAgICAgaWQ9Imd1aWRlODI1IiAvPgorICAgIDxzb2RpcG9kaTpndWlkZQorICAgICAgIG9yaWVudGF0aW9uPSIxLDAiCisgICAgICAgcG9zaXRpb249IjgwLDQwIgorICAgICAgIGlkPSJndWlkZTgyNyIgLz4KKyAgICA8c29kaXBvZGk6Z3VpZGUKKyAgICAgICBvcmllbnRhdGlvbj0iMCwxIgorICAgICAgIHBvc2l0aW9uPSI2NCwxNiIKKyAgICAgICBpZD0iZ3VpZGU4MjkiIC8+CisgIDwvc29kaXBvZGk6bmFtZWR2aWV3PgorICA8bWV0YWRhdGEKKyAgICAgaWQ9Im1ldGFkYXRhNjUyMiI+CisgICAgPHJkZjpSREY+CisgICAgICA8Y2M6V29yaworICAgICAgICAgcmRmOmFib3V0PSIiPgorICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KKyAgICAgICAgPGRjOnR5cGUKKyAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KKyAgICAgICAgPGRjOnRpdGxlIC8+CisgICAgICA8L2NjOldvcms+CisgICAgPC9yZGY6UkRGPgorICA8L21ldGFkYXRhPgorICA8ZworICAgICBpbmtzY2FwZTpsYWJlbD0iQkFDS0dST1VORCIKKyAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKKyAgICAgaWQ9ImxheWVyMSIKKyAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjY4LC02MzUuMjkwNzYpIgorICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgorICAgIDxwYXRoCisgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2ZpbGw6I2QwZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXIxMTIxKSIKKyAgICAgICBkPSJtIC0yNjgsNzAwLjE1NTYzIDAsLTMzLjcyOTczIGMgMCwtMjcuMjQzMjQgMy44ODc4NSwtMzEuMTM1MTMgMzEuMTAzMDIsLTMxLjEzNTEzIGwgMzMuNzk0MDgsMCBjIDI3LjIxNTA3LDAgMzEuMTAyOSwzLjg5MTg5IDMxLjEwMjksMzEuMTM1MTMgbCAwLDMzLjcyOTczIGMgMCwyNy4yNDMyNSAtMy44ODc4MywzMS4xMzUxNCAtMzEuMTAyOSwzMS4xMzUxNCBsIC0zMy43OTQwOCwwIGMgLTI3LjIxNTE3LDAgLTMxLjEwMzAyLC0zLjg5MTg5IC0zMS4xMDMwMiwtMzEuMTM1MTQgeiIKKyAgICAgICBpZD0icGF0aDY0NTUiCisgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKKyAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9InNzc3Nzc3NzcyIgLz4KKyAgPC9nPgorICA8ZworICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgorICAgICBpZD0ibGF5ZXIzIgorICAgICBpbmtzY2FwZTpsYWJlbD0iUExBQ0UgWU9VUiBQSUNUT0dSQU0gSEVSRSIKKyAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgorICAgICBzb2RpcG9kaTppbnNlbnNpdGl2ZT0idHJ1ZSI+CisgICAgPGltYWdlCisgICAgICAgeT0iMTkuODQwNTQ2IgorICAgICAgIHg9IjE1IgorICAgICAgIGlkPSJpbWFnZTM0MzIiCisgICAgICAgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUEyTUFBQUxUQ0FZQUFBQ2JqTnJJQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHogQUFBTjF3QUFEZGNCUWlpYmVBQUFBQmwwUlZoMFUyOW1kSGRoY21VQWQzZDNMbWx1YTNOallYQmxMbTl5WjV2dVBCb0FBQ0FBU1VSQiBWSGljN04xcG1GWFZsVGZ3LzlybjFzUWtvRGdCVlFYaWJEU0tzeVlXUTQwSU1iR3I0bXlNQTRsSnpOeDUrODNiM1RkREo1MU9kOUpKIHh5aVRSQUtGWFhTNms2aUZVSVZGT281Uk1obVNtS0NDNG9naU1sZmRlL1o2UHdDR0lFTU41NXkxeno3cjk2R2ZKMC9ET1grc3V2ZnMgZGZiZWF3TktLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTU2ltbGxGSktLYVdVVWtvcCBwWlJTU2ltbGxGSktLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTU2ltbGxGSktLYVdVIFVrb3BwWlJTU2ltbGxGSktLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTU2ltbGxGSksgS2FXVVVrb3BwWlJTU2ltbGxGSktLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTU2ltbCBsRkpLS2FXVVVrb3BwWlJTU2ltbGxGSktLYVdVVWtvcHBaUlNTaW1sbEZKS0thV1VVa29wcFpSU1NpbWxsRkpLS2FXVVVrb3BwWlJTIFNpbWxsRkpLS2FXVVVrb3BwWlN6U0RxQVVpb2I4dm04cWJ6NDhaT0tDRStINWFNTTBSRWdMbUdMelVUVVl3a3ZNOXQxQUo1L09WZDggS1Q5cFpWRTZzMUxLSXpWZHVmRkROeHhiTEJRcmliZ0tNTWNBdHBSZ2hqSGJBaHU4YnRpOHdvWit1KzZjUHo2TmZONUtSMVpLK1UrTCBNYVZVYk81cWJ4d1Zsb2J2QjlNSEFMNFF3TkJlL3RVaWdMVU1mdHF3ZVpvTlAyMkpuc1Jocno4MTgreFZoUmdqSzZWU2J1TEVXU1ViIGpoNXlPaXdtRXRPSklKd0UwQWtBVndQSTlmSXlXMEI0bkJrZHVWenVubWZ2YlhrK3hzaEtxUXpUWWt5bHluZmJHOHR5MWd3cUdXd0ggQjJHaGxJdkIwR0lKZ2hJT04zV1Q3ZVlkRmR1UDJENW9jMHZMa2xBNmE1Yk5XbEYvbG1IT2c5RUVJSWp3MGp2QStCVURQd3VNdWZlRiBoODUvUEs5dnI1WEt0dWEyb0dwN2VCNkhmQ2tCbDRCd0ZvRHlDTzlnQ2JnUHhQKzR0djNxWDBkNFhkVlh6VzFCNWZiQ01Fc2xnd3dYIHlxZ1lERGRBR09iQ0xhSGxuc0RRdGxJN1l2dWFwVTNkMGxHVjZpMHR4cFRUMnRxYVN6ZU5mS3VaUU84ajhEbk1xQVJnZXZGWFF5Szggd0V6UE1Pd2ZETXlqeHZMUFAxeS8vSVc0TTJmWi9LNmE4bUt4OU9zQWJrUHZmazREdFFIQVBkYmkrelBybC84eGdmc3BwUnhSWGRkNiBFaHYrT0loYUFJeEs0SlloR044cG9lSC9Wd2Y3OFJvL3ZhMHlETU9Md2JnQXNDY0RkQnlBc2VqZHl6MExvblZrK1FrMjlKTWpYdDI4IFpOV3FtYnFpUWpsTGl6SGxyRG1kOWU4aDhBSm1WRWQzVmZvVndEOHFtdUlQUGpybHdSZWp1NjZhMHpubEtOamdweUNjSzNCN1pxQUQgekYrNHBhNUQzMXdyNWJHcXhzVm5NdXcvRTZnV0l1TVllaXdYRnQ3M3pQTHJYa3YrM3Y0YWMybmI2Q0FzZmdqQTVRRE9qUERTejhMUSB0ZXZ1di9LUkNLK3BWR1MwR0ZOT210UFI4QUhBM2dPZ0pLWmJGRUQwWTRUOGpadnJsNitLNlI2Wk1hdXI1Z2dxbHZ5TVFLY0lSd21aIE1UY1lWUDc1R3kvKzZSYmhMRXFwQ0Uxb1hEaXNBUE92QUc1RU1qUHZCN082a0VQTlMvZGU5YnB3anRRYjI3VDRiTVA4QlFDWG9mZDcgK3ZxcWg0aGIxclpmL1pPWXJxOVV2Mmt4cHB3emQzbnRSVXowSUlEU0JHN0hBSDVxWWY5K1ptM25Vd25jenp2NWZONk12dWpSZG9EciBwYlBzNVkvVzR2MjZkRkVwUDFRMkxqeUZZUDRid0luU1dkN0dlR0RkK1grYXBsMFgrMmRjUSt2cFRQZ0tBOU9SekhpMEc0WW02d3laIGNvMFdZOG9wMzc5djJvaVNzc0pxQU1ja2ZPc1F3T3hTQ3YvKytxa3Iza2o0M3FrMnA2UHVpd0MrS3AxalA3WVFjK05OZFIwUFN3ZFIgU3ZYZjJQckY3ekdHNzBmdnU3RW1pTCs0YnVuVlg1Tk9rU2FqcDl4OWVGQ2EreXFCYmthMERaNTY0MlUyZk9yejkxLzlac0wzVmVxQSBwS2Y1bGZvckplWEZmMEh5aFJpdzY0SHcwUjRPL2pTM3MzWm1QcC9YejBZdnpGbFdOeEhBbDZSekhNQlFTOVErdTdQaEhPa2dTcW4rIHFXNWFmSjR4ZkIrY0xNUUFnTDVVVlgvUFdkSXBVaUdmTjlVTnJUTnpwU1YvSnRCSGtId2hCZ0RIa0tWdkNOeFhxUVBTQWFkeXh1emwgdFplQStVYmhHQ09aNmM3UkZ6M3k4THdINnM4UXp1SThOdmdtWkI2b3ZVTEFNR0p1djJ0WjNWanBMRXFwdmhuWHRLaUttZThITUV3NiB5MEhrWU93M3BVTzRycnBwMGJ1ckhqL3hZU2JjQ1dDRWNKeWJLaHRhTHhiT29OVGJ0QmhUVG1BR0VkRy93NTJscytmYmdKK2N1N3orIDMyN3ZxaGtpSGNaRjg1YlgxaEV3U1RySG9mRVJvVUZiVzF0ekVuc1FsVklST0xXNXJkUXkvU2VBdzZXejlNTGt5dnBGVTZWRHVPakUgR2ZPR1ZqVXQraFl6UFFIdytkSjVkaU1pL0R2QXJvdzNWTVpwTWFhY01LZWpkanFBZDB2bjJFZU9pVDlUV2l6OS9lek91a3VsdzdpRyBRWitTenRBSDUyOGV1ZW5MMGlHVVVyMnpiV3Z4S3dET2s4N1JXeFNrNnZzd0VaV05yZE4zRmlwK0Q2WlBJNzR1aWYwMXNiSnAwVFRwIEVFb0I3c3hDcUl5YjAxSDdDNEJjMzlzemUwY2h1TzIycHFXWlArenp6dVcxeHdkRWYwUzZYdWdVbWZrY1BZZE1LYmVOYVZyNHJvRE4gS3NSM3RFa2NPQ0J6MHJQdFYveEpPb2kwQ1kzdFpVVjY4MStZNlJOd2U1eTVhdDNTSzg4QmlLV0RxR3hMMDBCS2VXck84dHFtRkJSaSBBSEJMUlVuNHlKM0xhNCtYRGlMTkVOMkM5SDEvNUFoME83UFRnd09sTW80cDRHQTIwbFdJQVFCWnR0Sjduc1dOYjdybmhBSTJQY3BNIHQ4SHRRZ3dBSmxZM0xYYnBTQmFWVVdrYlRDa1BNZEhucERQMHdWa0IwUk56T3FhNnN2WTljZmw4M2hCd3BYU09maUZjT0c5RjNmdWsgWXlpbDlxK3FhZkVISE5wYjFDY1d1QklaN3NSYk5XM3hoU0hiWHdBNFV6cExiekZ6bXNZZnlsT1ovZEpRYnJpcnMvRVVBbXFrYy9UUiBZWUI1WU5heXVwT2tnMGdZZmNFak5RQkdTK2ZvTDJaOFJZOHVVTXBCelcwQjJObWpNZzZKZ0xIamZuRjhKcnYwVlRZdVBBV1dId0J3IG1IU1d2cUhKMVhXdG1YeVdLM2ZvZ0VTSkNtRnZoZnRMR2Zibk1HUFFsdStxY1cxVGN2d0lWMGxIR0tEVGpyMzRrU2JwRUVxcHYxYTkgclhBcGdGT2xjd3hFQ0VyNzkyT2ZUWnc0cTRSZ2xzRFpzK0FPaWpqQXJkSWhWTFpwTWFiRTNONVZNNFNacjVYT01RRHZHbDBvbVNrZCBJa2x0YmMwQmlGSy96SThZSDVQT29KVDZhd3o2dUhTR2dTTEcrN08yVkhIRHFHRWZCWENLZEk0QitOQ0pNK2Fsc1pCVW5zalVGNFp5IFMybXg5RnB5K3pEUFF5UDZ4MWtkVTFPMkxLUC9OZy9mZEQ3QVIwam5pRURkM0JWTlZkSWhsRks3VkU1Yk5CNk1LZEk1SW5CazllTVQgenBVT2taVHF5K1lQSitLL2w4NHhRRU83ZXlveU42T3AzS0hGbUJKRU4wc25pTUFvQS9ONTZSQkpzVEF6cERORXhGZ3VYQzRkUWltMSBDNFYwT2RLNVpQMGRMSm5Vcng3b0xlNHUreHlBMUwrZ1k0SVA0eEdWVWxxTUtSRnpsOVdkQm5CcU9pNGRGT0hXMjd0cWhrakhTQUlSIFQ1Zk9FQld5cE1XWVVxNGcrb0IwaEtnUXc1ZVhWZ2UxZTJtZkwvdXRKbGJXdDZaNnY2SktMeTNHbEFnMnVFNDZRMlFZSTBvS0pkNmYgTHpPclkyb2xnSk9sYzBTR2NON0M5c1owTDVOVnlnUFZsODBmRHJCUFMvdE9PYTV1OFZqcEVISHI3aGwwRTRBUjBqbWlZZ3lsZVErNyBTakV0eGxUaTh2bThBYWYwbktvRElLSVBTbWVJbTBIZ3czNk92UVhkdVdJcXp6TlN5aWU4cy9SQ2VEWWVLUVIya25TRzJKSDE2am5PIDRHdlEzQlpJNTFEWjQ5V1huMHFIc1JjK1BCV0VNZEk1SW5idTNaMVREcGNPRVMrdWtVNFF0ZERnSXVrTVNtVWUwWVhTRWFKSGs2VVQgeEdsQ1k5c29CazJVemhHeDBaWGJpbDcvM0pTYnRCaFRpYk5FL2l4Ui9JdWdZSTNmQjBjeXZIdElrYVUwdDJOV3loYys3dFh4N3Z0eSBieUVWVG9hSFkwaXlxVDV1UjZXVWR4OGs1YlpaOTA0ZkJPQXk2Unl4TURSS09rSmNabmRPT2NIRDJVekFwejF3U3FVVndic1hXUVNNIEhWUC93d25TT2VKaTRlbnpqbkQ1VVhVTEJrdkhVTm1peFpoS0ZKWDNOQUx3OG91T0FYK1hLZHFjbjI5NUNST1kvV2luclZRNk1ZRXggWGpwRkhJd3hmbjV2QW1DbWtkSVo0a0dEeWsxUUw1MUNaWXNXWXlwUkJOc2luU0V1Qk01Slo0Z0xrYmViMGN2dXVIL2FjT2tRU21YViBzZE1YSHc2Z1ZEcEhIQWprNi9jbWlMbEVPa05zRFAyTmRBU1ZMVnFNcWNUc1dxSklUZEk1Vk4vc21qbWlTNlJ6eEtWc1VIaWtkQWFsIHNpcFh0RDUvL2lZRHJEUHZhY09ZUHFhNXJVSTZoc29PTGNaVVluWXZVZlQyY0dSbTh2THpOSGRGdzdzQUhDV2RJellXbmk2M1VTb1YgdkRtbmFqK09IRHZ0UDMxc1R1SzdJY0dXc0VFNmhNb09Md2VQeWswRWJwYk9vUHFPYmVqdFVwdGR1Rnc2Z1ZLWnhZSFhueit5M2k3eCA5aHRaWGFxb0VxUEZtRXJFdHg2NW9BTEFOT2tjY1NMbWduU0dXQkRWU0VlSVUwaGFqQ2tsaFlpODNDKzJCL242L1duUUl4MGhYalM5IHVtYStQaHRVSXJRWVU0a1lzblZJTFR4ZW9nZ0FJTE5kT2tJY0NEaGZPa09zUW84M29pdmxPT3R6SXdnQVlQYnorNU41aDNTRW1BM2wgc3ZJcDBpRlVObWd4cGhKQm9CblNHV0pIN0YweGRzZlNobW9BUjB2bmlGTUE3SlRPb0ZSV0JiRGQwaGxpZHV6NDZXMlYwaUVpeC9DOSBHQU1IUEYwNmc4b0dMY1pVN1BMNXZBSDV2VVFSQU1qNlY0d0ZKZGJQdDdwN3NjWjRQNmhReWxWay9CL1VGd3VGODZRelJJME1lZmU4IDJ4Y3habWczVEpVRUxjWlU3RVpmOU5DNThIeDJaYmVOMGdHaVJnenZCaEg3TXRaNlB4aFV5bG1oL3pQVFJPVGg5eWk5S1owZ0FjZU0gYlZoMHRuUUk1VDh0eGxUOEtNakVWRDh4dlNxZElRWWVEaUwrV3BqVG1UR2xwQlFDNy9jZUFTRC9WaGhZK1BpOGV3ZVRrZkdMa3FYRiBtSW9mcy8vN3hRRGVHZ2F2U1llSVVsdGJjeW1BTTZWenhDMW53d3dNQnBWeVZKaUZZb3dubnRyYzVsZlh5SjA3WDVHT2tBakt4UGhGIENkTmlUTVZxenJLNmNRQk9rODRSTzhLbTI1cVdlclVSZmRQSUxXY0E4TDYxTHdXbDN1OTlVTXBWWkhOWitQeVZiOTRXbmk0ZElrcHIgVjk2d0U4QmIwamxpeHpoalhOT2lLdWtZeW05YWpLbFlzY0dsMGhrU1lmR1NkSVNvR1didmx5Z0NLQTdlTUhpRGRBaWxzdXFGd3RHdiBBUWlsYzhUTnNKZk5rTHg3N3UyUGhjbkdPRWFKMFdKTXhjb3dHcVV6Sk1MZ1dla0lVV1B3QmRJWjRrYUU5UzB0Uzd3ZkNDcmxySldUIGlweUZRYjJYVFR6d25IU0FSREFhcENNb3Yya3hwbUl6djZ1bW5BbVhTT2RJQk9NWjZRZ3g4SEh3OEZlWThZSjBCcVd5amtEUFMyZUkgSFh2WXhBUGszVXZJL2VOSkV4cmJ5NlJUS0g5cE1hWmlZd3NsN3dVd1NEcEhFZ2prVlRGMmQrZVV3d0dNbDg2UkFQOEhnVW81anpQdyBVb1NQTzNaNjZ4SFNLYUpFWUsrZWV3Y3h1SWZmdWxnNmhQS1hGbU1xTmd4VEw1MGhLZGI0OVZEcVJuQUJBTzhQdTJUV1lrd3BhWlNOIGx5SlUwdVBYVWtVTEwxZUU3QmNaenN4NFJpVlBpekVWRzBzMk0rdXNBekplTGRjZ1MrZEtaMGdDZ1YrVXpxQlUxbkVtWnNZQUdOK1cgZnR2TUZHUEl5djUzSlVLTE1SV0xXUjFUS3dsMGluU09oSFMvUUR2OWVpZ1JNbEdNc2FGMTBobVV5anBHTmo2SERQYnFlM1hVYTl2KyBES0FnblNNaHA0MXVYRGhHT29UeWt4WmpLaGFHVEdabXhRRDhLVDlwWlZFNlJGU1lRUUNmTFowakNUblkzMHRuVUNycnJBMy9JSjBoIENRU2NBN0EzeTc5WHJacFpBUEJuNlJ4SnlUSHBVa1VWQ3kzR1ZEdzRVK3VydlJyUXoxdFdmeHlBdzZWekpHRHI4dzlkdkZZNmhGSlogdC82Q1o1NEZzRTA2UndKR2pxbGZlSngwaUNnUjBXcnBESWtoeXRKTFpwVWdMY1pVNU5yYW1nTVFUWkxPa1JoaXJ4NUdOcGVKdzU1QiB3T3A4UG0rbGN5aVZlZm04SmJCWEw3VU9KQWh5WGkxVnRCWmVQZjhPWVRMeWVSMDNxOGpwTDVXSzNLYVJXODRDWTRSMGpxUXdHNjhHIEVRWjBqblNHSkREUlU5SVpsRks3TUxMeGVXUm12NzVmS1ZQRjJNaXFSMDk2dDNRSTVSOHR4bFQwTEUrV2pwQWtRdWhWTWNiV3M4SEMgQWJDMXY1UE9vSlRhaFlCTUZHUEVmalZISXBPaFpZb0FRSGFLZEFUbEh5M0dWUFFvVThYWWpoZHpSVzgyTU05NmNtSUpDR2RLNTBoQyBZTXh2cFRNb3BYYXhuSTJaTVJET21qaHhWb2wwaktpc0cyVCtCR0NIZEk0RVpXbDhveEtTa3c3Z3Nya2RVODhFVVMzREhBL3c0V0FNIEJWQUUwUll3dnduaUxjeTBDWVExZ2VVMXBxU3c1b1pKS3pkSjU1YlUxdFpjK2hZeWRWTDlhcDg2S1FadmpqaU5nUXJwSEVtZ0hxTXogWTBvNUlpamwzOWxzTkVrdmYvM0lZYWNCK0pWMGtFZ3NhUW5SMlBwN0FCT2xveVNDOEo1VG05dEtWeTlwNlpHT0lxbjZzdm5EdzU3eSBDWUcxRTVod1BKaUdFOUVRRUVhdzVhRXd5SUd4Qll3M21QQm5RN3g4YmZ2VnY1Yk83U290eHZaamJzZlVNeG5tMnd4Y0FnYXc2Ly84IEJlLyszMHlnM2Y5dlN3UmJMTVdjanJvTkFKNEE4OE9XK042WnRaM1plTnUzMjZiaG15NGcwQ0RwSEVsaHdLL1pGYUp6OS8xMTk5UXIgSDI1YXVrRTZoRkpxbCtkK2V0V3JWWTJ0cndFNFVqcEwzQmoySFBoU2pPM3lHMlNsR0FNR2I5OVdPQi9BLzBvSFNkSzRodGJUTGZHbCBBRjBFNEJ6dXhpZ0RCdFB1a3hvSVlQQ3U0VExoTDhObTJ2MC9tYjVSMWRpNjBsanpxZWVXWGZFYmtYK0V3N1FZMjhlY3pycmJtUEZOIEFLWDl2TVFvQUUwZ2FqS2dmNXJUVWZjN0VQNWpSMDl3OTIxTlM3c2pqT29tZzhrWkdjd0RBSWpnMVplS1pUclhtME53RG9henNUOUYgcVhUaHB3RHlmazhPa1RrWHdHenBIRkZocHQ4UVplZkJ6N3VXS25wZmpGWFh6QzlIZWRuMVRQaTRCVTdiVlZZTlNJMDE5dkdxaHRiUCBySHZncXU5SGtkRVh1bWRzTDNNN2EvOFpqTytnLzRYWS9wd0d4cXlLa3VMVGN6dnFyNHJ3dWs0eWJESzFucG90ZTFXTTdUcVUxSC9zIFdSR3RsQmVZTXZHNUpHYXZtbmdZOHVzNWVDak0vcjh3cUdwY2REVlhsRDdOaERzQm5CYmhwY3RBdUwycXNmV3JFVjR6OVhSbWJMZlogSFhYL2p4bGZpTzhPVk1YZ1JYTTY2cTdPNVhJMzNqQ3AvWlg0N2lYajlxNmFJVnpNeGhsVnUzR3hwOVNiWllxM2Q5VU1RUkduU09kSSBBaEdlbE02UU5yTTZwaDVtRUx3UHNEVmdPaFdFS2hCS2Q2MU53V3NndkFiR3kwejhDd3JwWjRlOWRkaXZXMXFXaE5LNUk5UGNGb3pkIEZwNXBtQzloOERrQUhVT0VJOEU0RXJ0ZUdmY3dZUjB4VmpOUlZ5bUhQMW16OUpyTjBySFRoSUFuc3pDL3dzQXBSOVV0R1B6cTh1dTggT09qYUd2NHQyVXlzcWRqanZGRTFiVU0yckd6WktoMGthbFgxUHp3R0ZOd0ZJTzREcnI5WTNkQzZkZTBEVi8xenpQZEpoVXg5ZWc1ayBkbWZkRmNSb1JYTC9QVjYwRnBmUHJGLytlRUwzUzhTY3pycGFNSlpMNTBnT3I3dTV0cU5hT2tWVVppK3Z2WVNJVmtyblNJSTF3WVNaIFU1WStJNTBqRGU3dW5ISjROd2RmSkdBbWdGN3ZCMlZnTTRBSERXaEpkNjc3cHgrYnRESjFBNWRSTlcxREJnMEtaNEM1R2J1V0pnM3IgL2QvbTdTRE1Dc09TcjY1ZjFySXhyb3crR1hQcG91T0RrUDRrblNNSmh2aVM1OXF2OW1hcFcxWGpvblVBVlVyblNBb1Q2cDV2djZwRCBPa2VVcWhwYUx3RGh2d0FjbTlBdEdZVG1kZTFYL1NpaCt6a3I4OHNVNXozWWNDSXhaaVBad25TME1WZ3h1Mk5xZllMM2pKK2w5MGhIIFNCU1JON05pQUdBb0c0YzlBOWg0eStTbHowcUhTSU81blhYWDkzQ3dob0JQb3crRkdBQVFNSXlBeXhpOHFMUlkrdXFjanZyVzJjdHIgTDRrcGFxU3FHeGJYVkRXMkxoNVVVWHdOeklzQVhJWStGV0lBUUlQQTlPbkFGTmRVTmk2NkxvNmN2bGwvMzFWckFHU2lJN0Zsdjc1diBDZGxZWXJvSHNWL2puYXJHZXhwQjNJbmtDakVBSUREbWphbi80WVFFNytta1RCZGp6Q0FiMm5rQWhncmNmakRCL0hoT1IwT053TDNqIFFkYXJMNmRESWZacjN4RVRlYldQNFlBWXE0aXkxR2FtNzI3dnFoa3lwNk51SVROK0FHQjRCSmNjQlBDVlJMUnlUa2ZkVTNNNzZxL0sgNS9OdVBYL3llVlBWdU9qcXFzYlczekZ4RjRBckVNMHhEeU1JZEhkVlUrc1BqNnBiTURpQzYzbU1HT0JWMGltUzROdmh6OHpaMmpjRyBabStPOEtsc1dEd0ZzUDhEbVU3WWh3VW1tQXR3cGxmcXVmVXdUTmk4enJvYkFGd2tHS0djWVg4eTc4R0dFd1V6UktLdHJia1VvQ3p0IEYvT3ZDWVRsQzZRakpJS1FpY0ZlZjgzdmFqcTZOQ3hkQ2VEcW1HNXhHb01YamI3bzBTZG5kelk0TVR0UTNiVDR2S3JIVDFnRjBFSUEgcDhaeUU4WTFGVUhRTlc1RzYxR3hYTjhUQkpPSi9aeVc0TlgzclhmSHZCd0s4WG1uTnJkRjJleE5STlcwZTA0bTR2OEJVQ1lZNDVMSyB4dFpyQmU4dkxyUEYyTjJkVXc1bjBEZWtjeEF3eklhMmRWY3hrMTZiRG4vcmJHVGtzT0E5UW84NktkNjFyRzRzQ0dPa2N5U0JRWmtZIDdQWEhuY3Ryank4V2k0K0Fremd6aU04a3RnL042YXk3TGY1N0hWaDFZK3VubVBsL0Fidzc3bnN4NkJ4YndDTmpHKzg1THU1N3BaVkYgTnByckVEQjJkT05DYjc1emN5Ync1bm5ZT3pSbzI5YWVzNlJURE1TRXh2WXlXTnNLbWRWaGY0VkEzeHhUM3paU09vZVV6QlpqUFRiNCBCc0JIU09mWTdhek53emQvWFRyRWdJUityWi91aGEydlBIS1JOdzBnaW9hOGVrdDdNTVlFbVJqczlkVmRuVlBIQjZBSEFZeEw4TGFsIFlIeG43dkw2ZjBqd25tK3JibXo5RWdQZlJyVEhtUnpLZUlMdHFxcGJrT1IvNTlRd25JMWlEQUFDOXVkNzk5bHovN2dHZ0JmZElYdUwgMmFSNjNOT0RUZitNQkY1QzlkS1JPUk9tZXh3OEFKa3N4dVk5MkhBaUNCK1N6ckUzSnY3MDNPVzE2VDI3SW1QN3hRQThsYy9uclhTSSBxQkF5c2tRUjJIRFRsUFoxMGlGY00zZEZVMVhJOUtEVTdDZ1RmMm5POHRxUEpYblB5cVpGbjJSQXBBZ2tZQ3lDM0lQanA3ZGxwdnRjIGI2MTk0TXExQURaSTUwZ0NHWStXS3ViekZxQ25wR01raVFpcDNUZFcyZFJhUzhBbnBYUHNqY0UzanJsMDBmSFNPU1Jrc2hpelJmdDMgQUFMcEhQc2dKdnEyYzV2YWV5R2Z6eHVDUDIvNGVzZWZKWW9BQU1hRjBoRVM4b1IwQU5mTTZwaDZHTnZpZlFCVmlRWWgrdmFzWlhXSiA3RHV0bkxab0lqSDlTeEwzT29qcXNGaDhvSExhb2hIQ09kekRHZG5YeWNhcjV5WmxiTjhZQXhjamhXTTI1UE9HZ0cvQ3ZlT3Rnc0NhIEdNLzdkVmY2Zm9rR2FPNktwaW9RcnBMT2NRRHZHbjNodzY1bU82RFJGejkyR29DTXJmWDFwNjM5L0s2YWNwQXpTeFhpeFpTTlFWNHYgdGJVMWx4clFqd0djSnAwRlFJa3h0R0IrVjAxNW5EZXBycGxmRGt1TGtlelN4QU01bVN6OTE4U0pzMHFrZzdpRk03SlVrYytxcnBrZiA2Kzk3a2pMWFVSRVlXZm5vQ1NkTGgraXI2c2RPdUJhTU02Uno3QmZ6dGNmVkxSNHJIU05wbVN2R1lJdC9DOERkQngvUmw5UFd6SU9aIE05VkZFUURZK05OSk1TeVVUSVFiQTlQWU1XeEdCbm05czNuazVsa0ExVWpuK0FzK29SaVdmRDdPTzlqeThpOFE0TkpTbU1tdmp4cjYgZmVrUUxpR1RtWDFqcFR5NFBOVk5JUGJHWkwxNUx2WVdFWjh2bmFFdkpqUzJsekhoUzlJNURxSzBHSENzendBWFphb1ltOU01NVNnRyBQaXlkNHhER2JSNjU2UWJwRUgxQjJTdkdiRkJXN3MvYWVNck9FdE13Q0hWbWJMZTVuYlV6bWZsRDBqbmVnZW52N2xqYVVCM0hwYXZxIEZvd2pZdmVXd1JCdXFtcFlkS04wREZjVVRVbFdpakd2amhRcEJaNENzbldHSTVGSjFYbHhCWHJySmdDeVM5SVBpVytjME5nMlNqcEYga2pKVmpJR0Q2d0E0dnlUQWdqNHFuYUZQeUsvREszdmgyUnN2L3VrVzZSQlI0ZXcwNzNqNW8xTWVmRkU2aEF2bUxhODltNW0rSTUzaiBBQ3B5T2Z0UHNWdzV5SDBOcmg3QlFmUzlxdnA3dkprbEdZajE5N1c4Q09CbDZSd0o4ZWI3ZDgzU2F6WURlRlk2UjVJWW5LN3hEL05IIHBDTWNHZzBxY25pTmRJb2taYW9ZWXpqNEZuZy9pSEZHVWh2WkIrcjJycG9oQUU2UnpwRXM5bWEvR0RNSUlNbUR6eFBEd09QU0dWeXcgc0wxeG1DVnFnK3dobjRkeXhlemx0Wkh1WTZ4dVd2UnVBQzFSWGpOaTVUQzJiVlJOMnhEcElJN0l5dWYxWW9CZGE2UXdFTjQ4SDN2cCB0S1BxRmd5V0R0RWJWZE1XWHdnMzlnY2ZFbE02eHV0UnlVd3hObXRaM1hrRVNrM1JZQWczUzJmb2pmS3c3Qnk0MTVreVhvUmZTMGVJIHlweU8yak1BSENXZEl3bUcrRkhwREM3WVdXcS9nMlRQRXVzUFkwQmZpL0tDYk9ucmNQK1pkOXlnOHVLM3BVTzRnRGd6eGRoUjQrci8gODNUcEVGRmhwcXp0Rzh1VlVra3FaclRaOGkzU0dmcmc5Q3l0RkhEOXdSUVpZM0M5ZElZK0lWeXhzTDF4bUhTTVEySFljNlF6Skk2TiBOMi8rakVHZGRJYWtXSnVad2QwQnpWNWUrMzRuOTRudEJ4TWFaM1ZNamVRY244cUcxb3RCYUlqaVdyRWozRFMyWWZFTTZSank2REhwIEJFbXhaTDM1SGphVXVZNktNTWI5cFlyanA3WWRSdUJtNlJ4OVlqaFYvUk1HSWhQRjJPN1czVmRJNStpandUdEt3MGJwRUlmRTVQeVggVU5TS1JYL2UvREViYndZQmgxQXNaOHBPVTREOXVMdHp5dUZFTkVzNlIxOFlNcEYwL1NLM3U0ZTlneUdlUGFhK0xXUEhoZnkxYlR1RCBKd0dFMGprUzRkRkxNUTZMM2p3ZmU0dUluTjlXWW5QRkpvQUdTZWZvRzc1eVFtTzd5OHZwSTVPSllxeFlMS3NISTQwSGExNHFIZUJRIEdKbHIzckhwSXcwUHJKTU9FWVVGeStvR0F4ekp6RU1LL082Nit1WGJwRU5JNnJIQk53Q2txME1WWS9MczViV1hET1FTMVkydGx3Q1kgSEZHaXBCd1ZtT0kvUzRlUXRHRmx5MVlRZmllZEl4R01pOGMwdDduWldLYVAxaTIvZGkyQXpkSTVrc1RzL3N3WUV6cy9udHlQdzN0byBZNjEwaUNSa29oZ2o4RFRwRFAzQzFORFcxdXpzZnF6NVhVMUhBOGpXNFh5RTN4TDUwYnEzbS9nU3VOM0VJVUtjbVNWUCt6T25zLzQ5IElPZVA5ZGd2TXZUbGdmeDlDd3pvN3d1NnFiS2hOU3N2Uy9hTGdheDhic3R6V3dydmxRNFJEV0prcjRsSDFYRjFDNDZVRG5GQU5WMDUgZ05LeFRIdGZUT2tjdi9lUjk4VVlNNGlCSnVrYy9jTkhiQjYreWRrREJjTXdqTFRiV1Jvd2U5UkprZUQrTXRpSWNIYWFBYnhEdnFzbSBCOHQzQUVobnh6YkdlK2N1cjUzU243OWEyYkI0Q2dGcEhlUVNFZTdjTlpES0pwT2Rqb29Ba1QvZng1eTlmV00yS0hWMlBEUzI3SlVMIEFLUjAyYk1XWTE2WTF6bjEzUUJHUytmb0wrdjBMeUtmS1owZ2FZYmh6VU9HblA3ZGloWnpkcG9CN0d0TVdISWpDS2RLNXhnSVJ2OW0geHdpYzFsbXhQVTZ0ckhncGxUT2FVV0F5bWZuY3NrZmZ4MHpHbStka2I0VUluUjBQQlNhVlN4UUJBQVNNSGRmUTZrMjMwUVB4dmhoaiBvdFQrRWdJQWtidHZkUm5rN0pkUFhBaCt0TFdmdTZ6dU5MamYzandxbTI2cFcvNjBkQWdKdDNmVkRHR21mNVRPTVdDRUMyZDNUSzN2IHkxK3BibXB0QU9IQ3VDSWxoVUJmT1hIR3ZLSFNPU1NzdS8rRGZ3VHdwblNPWlBDRTZycldrNlJUUkNHd05uUEZHSUdjblJsallFRDcgYnFXeGdUY3ZLZzdFKzJJTVRDbGRvdmkyczJZOU9iRkVPc1QrRUxPelh6NHhDZDhhc25XMWRJZ29XUExuTGV5aDBlTys3UFBycTlKaSA2V2NCSENPZEl3b0U4N20rL0hrR1BodFhsb1FkdWJOUS9pbnBFREtJR2Z5RWRJcWtjSkR1bDhkN2RKY08reDJ5MGduekw1eDhPWDFxIGMxc3BnRE9rY3d3RVoyRGZtTmZGMkx5SFpnd0ZrUFp6c0NweUcwYzY5MEdhOTlDTW9Rd2NKNTBqWVgvNnpJV1A3cEFPRVFXaWxEYTEgNlpkc051L1lmVTdocDZWelJJY083OU1mWi9UdHp6dU5QcDNWMlRHQ3ljNitNYVIzT2RuZVhycDNiditUTndBQUlBQkpSRUZVK25ZQSBhNlJ6Sk96NG8rb1dESllPc2EvTlczck9BRkF1bldOZytEd1gvOXRHeWV0aWpMZnZPQmVBczkwSWU4c0N6cDFoVWR5eC9ReDQvdnV6IEwvSmt2OWpjQitwSEFyaEFPa2RTaUxLNVgyeEhTWGdyZ01Pa2M2aElqTmpaVS9FUjZSQWlzblZZKzhXanA5enR4VXNFSXZLbTJWVXYgbVhLVGMyNXZFNUZ4dGdsY0grUXFURW5hSjFZT3l1dkJOQlA1OEVzSUp2ZUtNWUp4Y2tvK1RreCtGR05zYkJPQXJIUm9ZeFR4QytrUSBTWnZmVlZNTzREYnBIQ3BDaE0vNmNoWlZYeFNMUFk4Qm1WbG1ISlNVbEhoeEFEUm5zS01pSEZ5cVNBNit6TzhmOW1JOGZ5QmVGMk1FIGN2NGd2dDRnME5uU0dmWkZuTzQxeVAzaVNWdjdMSFZSQlBDbm14cVdiWlFPa2JSaXNmUUdlTEpYVEwzdHFOeTI4SHJwRUVsN2NjWDEgYjNDR2xyeWw5SERlZDJES1hoTVBFRnpjUjMrV2RJQW9XUGd4dVhJZ1hoZGpEUGJralFER01UdDJSaEM1OXdZb2J0YWFYMGxuR0tpMiB0dWJTTEowdkJzN01vYkZ2eTNmVjVBQjhYanFIaWg0emZ6Nkw1NDRSWldtcElqWHRicnFRYXRhVXB2NTUyUStPall1WTRFblhaQ0p2IHh2UDc1VzB4Tm1kWjNUZ0FSMG5uaUVqNUQxWTJPZk52YVd0ckRnQ2NJcDBqWWEvTWJGajJzblNJZ2RvOGN2TmtaR2tmVWFZR2Nic2MgRzViK0RUeDVBS3QzR0Y5ZDhjcmwwaUdTbDZsOW44TzNiN1UxMGlFR2F2MTlMUzhDZUUwNlI4Sk9SWE9iTTMwS3F1b1hIbzNVTis5NCAyOUZWZFF1OGZhNTVXNHl4SWE4Mit4V0xQZFhTR2ZaNDg3QzNqb2MvSC9EZStxVjBnQ2d3OC91bE15U0pZTE0waUFNQUdFWkcyNkJuIEF5TjdQMStMYkwxVUNSSDY4VDNOZmp3Mys2QmkvRGJyVHBkcENxcWxJMFNKY3ptdnh2Vjc4N1lZSTdCWE16ZU1vRkk2d3g0QjhidWsgTXlTTlBDakc4dm04QVRCRE9rZUN0cTdQRlorU0RwR2tlWjBORjdBM0c3YjN4VHY3K0JmNit1ZFRncyt2Ymx6bzlmNkpmUjM1NnViZiBBTHhkT2tkU0NQUSs3UHErVGplaTFEODMreXFFZFdaOFJPQXE2UXhSTXA2TjYvZVcvZy83Z1hseGt2MGVodXdJNlF4N1dJUFRwRE1rIHpUS24vcUZ5ekVVUFhRamdhT2tjeWFISDg1TldGcVZUSk1tQ1BUcFg3QjIyOWUyUGV6eDRaK1B6ei9rZFZxMmFXUUFvTTRjL0F6aW0gNnJFVFV2OVNoWUhNN1J0alM4Nk1qeGcwVWpwRGxKanBST2tNY2ZHNUdEdFpPa0NVbUdtWWRJWTlDT1RNbTUra21LQWs5Y1ZZd0lFZiBTMTk2aWNrK0xKMGhTWE5YTkZYQjQyV29CT3BqY1dXOE9LQjlmNWh3dWMvN0ovYVBNdlY1aGtINlA4dkdwdjY1MlZmazBNb2hBcHdaIE4wYkVxMG1XdlhsWmpPMWVqblc4ZEk0b3VmU2hJczdjek5qR0d5ZTNQeThkWXFDWStIM1NHUkxGL0loMGhDUlpXL3c0ZkQ0L2p2czIgMDBWOS9QTXBFeUNYKzZoMGlFUnh0bDZ1TU9NeTZRd0Q5Zno5VnowSFlKTjBqb1E1VTR3eDBWRHBEQkU3MFl2bHUvdmg1VDlxOU1VLyBId1hBcjhNeEhmbFFmZXVSQ3lvWUdDK2RJMkcvSkVyM29hUHpIcWcvQTRBN0c0dmpaeG5aYVd0L2UxZk5FQUp1a3M0UkorN2pNa1ZyICtqcVRsaktNbTBmVnRBMlJqcEVVS3U5NUJJQ1Z6cEVVQW80Zk8rMmVsTC80SkFabmJxbmljY2RPdjNlUWRJamRuSG1KSDVHS0NZK2YgY3JoMGlEaDRXWXl4eVIwaG5TRUdUclFqUDJ6cmtGTUJPTk82TlNHcGY1allnRlAvbHJXUGZqZXp0dk10NlJCSktTdVdmUWpBY09rYyBjV0xDbTMzNTgyVFo5OE8raHc4YWxKMURvTmYrK0laTkFQNGduU05KeG5yUVZaSFMzL3lxajRLYzNlekVOaGtDKzFhTW9RYzlvNlF6IHhNSExZaXl3T0ZJNlErU1luWmdaczJTY21ZSlBDdnZ4TVBtQWRJQWtFZkNRZElhazVQTjV3K0NQUytlSUd6R3Y3Y3VmWjhPcFgxcDggS016OFNWK1g3ZXdQWlczZkdDajl4Umc0OVM4eis4cUVialR4WVA5bXhtQmd0QmhMQzdiV3U1a3haamMrVkJuY0w0YkFtRlEvVEhZZiBnSDY2ZEk0a01mT2owaG1TY3V5RkQxOEt3TnN1VTNzUW1iVjkrZk5zelhNeFJYRUdBY2RYUG43Q05Pa2NTYkhJMXI0eEFPK3VibGhjIExSMWlRRXpndzh2TVBtRnlaZCtZR3kveG8yUkJXb3lsQlJONVY0eUIzRGhrMlJKbnJSamI4c0wvbnY5bjZSQUR3WUcvSGZZT2lEUDAgQnAwb0U0Y0FGNHEwdWs5L2dmcjQ1MU9LTW5RSXRMVTJVMDE1QUJBbzNVdk0xdzB5ZjBLZmo2VklONFlqSFJXWi9PcWRBTUFRL0J2ZiB3OU5pREV5dWJKNk1Vb2wwQUFBZ1pHdG1qRUMveWVmenFkNDBUa3lwZnBqM3c4czMxeS8zZmxZRTJOV1loWUJKMGpsaVIzanpJdzBQIHJPdkxYM2xoNlFlZkJaQ0ZmWU9UeDlYZmM0WjBpQ1NzWDNidEdnQ3ZTdWRJRWlQbFhSV1h0SVJnL0VZNlJwSUliaXhUQktGTU9rTFUgR096aitON1RZZ3pXdTE5QWtId3hOcityWmppQVk2VnpKSWxUZnRqem5NNHBSd0c0VURwSG9oaVptUlhqWEdabVJYN1Y5NDZteEFCKyBIVXNheDRRQlorWDNBS0FNelhydmN2R0V4clowTDgwaVN2Vnp0QitPcmI1c3Znc05sYndiQzVPSC95YkExMktNcUZRNlF1Ull2aGdyIDJOSlRwRE1ralV5Nm0zY3c1MllnYTkwdk16SlltOS9WZERRelh5bWRJeG04c2w5L2k2a3I0aUJPSXVZcng4MW9QVW82UnlJeWRuNGcgZ0tEQWhSblNJUWFDS04wdk5mdURkNWFKZDFSa0R3c1hhejBjMzhQWFlzekRYMEE0c0V6UmhKeTVZc3dnZUVJNncwQVl6dDUrTWM1SSBNVllzaExmQ3orKzZkekFJT3Z2M04zbEZ0RW1jVmNaRnpzUWgwSlM5Smg0QW1WUXZWU3pDUGltZElYbnk0eVVDZS9kOElJSVdZMm5oIDQ5c0F3SVZmUUNQK3BpZGhXNGRzSFBLMGRJaittdmZRaktGTUdkaFA5TmQyRE44NDFQdjlDZDl0Ynl3RDhTM1NPUkt5cFRoOFE3OEcgYzgvdlBPWXhBSnNqenVNa1pycTF1bWErRTQyZTRuVDRhOXRXQWV6M2dkN3Z3TFVuenBpWDJzNTQ2d2VYL2g0WmErSUJJZ2ZHUytUaCBXTmkvQWhQd3RCZ2pINWNwT2pBenhpVC9waWRSaEYrMnRDd0pwV1AwVjdoejV6VEFqUzZjQ2ZwRlM4dVNIdWtRY1J0VUVsNE5JQlBMIDBnalVOZlBzVllWKy9lV1ZrNG9BL1cvRWtWdzFpaXZLcjVJT0ViZFZxMllXaUdpVmRJNkVsZTBvVmpSS2graTNKUzBoZ0ZRZkVkTjMgVG95WFBCd0wrMWhnZWxxTWdWbThjSW1CQS84bWR1Qk5UM0xJVXFxWFZoRFFJcDBoY1JsWW9zZ000aXkxTXdmM2M0bmlMa3gyUUg4LyBYZmlUQUpOMGlyaFpaS2RKeng3RUtmOCtKMDcxa3YrK2MyRm16TDlaSkNZdngvZWVGbU5FUHY2N1JOOXczTjVWTXdTZ1Nza01TV1BEIHY1RE8wRi96SHBveEZJd0c2UnhKWStLSHBEUEViZTZLdXFtQUs0ZUt4bzh3c0dLS0tjakt2akVBT0wyeTRaN0owaUhpbDhGOVkrREcgVVRWdFE2UlQ5QmRaeWxneGhpcjVuNWQvczBpR3ljdVhUVDRXTFY1aTRabXhrckQ4WkFCZWZnZ09oSXJwWFFyRE83cW5BL0R1d01kRCBzTVVkSlk5Smg0Z2JNMzlTT2tPQ1hyaTV0dk1QQTdyQS9SOWNEV0I5UkhtY1I0WS9MWjBoYmpZc2ZRUkFxczkvN0RzYU5MaThjS2wwIGl2NHE1ampWSzAzNmdTb0dGMDRVdTN0TlZ3NGVkbEptWmkvckZpLy9VVDcrc0VpNEdET3dMcXgvVHRMR0crdVhQU01kb3I4WW5PNGwgTGYzejIxc3Z2ZjlONlJCeG10MDU1UVFDcFhmdlNGOHgvbWZnRnlFRzgwOEdmcDJVWURSVjE3V2VKQjBqVHV1WHRXd2tZTFYwanFTeCBNYzNTR2Zwci9YMVhyUUh3aG5TT1JMRVJHemNkVmZxQ2Q3TmlQdk91YUFFQThuUE52UEE2Mld6dEYyUGd5YjRmTXV1R2VRL05HQXFnIFhqcEg0aGplTjJvZ0RqNEZUNyszOTR0TUJNVVl3SWptT2lsQm5NTW5wRVBFalptOS83eS9BM1BUaE1hRnc2Umo5QTh4SWQzbmR2YVogbFJzM2xaVUVIamJ2QUdCMG1XSnFFQmtmZjFpNWZENHY5dk5pVUtabXhnaEk3ZnAydTMzSCs1QzlMb3FBd2MrbEk4VHArL2ROR3dIZyBPdWtjQ1hyanhkek9TUFlBUGo4MFdBbmc5U2l1bFFyTUh4bzk1ZTdEcFdQRWljaDQvWGsvZ1BJaW0yblNJZnFMa2ExOVkwUVFLOFpLIGJVbE82dDZ4WWk4blcvd3N4dGo2K2NNNjVaVFZjaDh1UnFhS01hVDRvVUdVM3FVc0E4QkE2UFhncktTc01CUEFZT2tjaVdIOE9EOXAgWlRHU2ErMXFyWDF2Sk5kS0JSb1VsT1p1a2s0Ukt3cCtKaDFCQWhQUysvM095TnErTWJGeFU4RjIrMW1NZWRxN3dNdGl6RmNiUm0wUSBtWGFlMzFWVERxQmE0dDVTaXFhUXlvZkd3dmJHWVF5dWs4NGg0T21icDY1NFZUcEVYUEpkTlRrQXQwcm5TQklSUmJxMGtCSEYvclAwIElOQW5KazZjNVdVYmFBQlkyOTd5Q2dOL2xzNGhvREd0U3hXTEZLYjJKV2MvSFRlaHNWMWs3MWFPYzE0V1kweTZUREU5eU0vS3VheTcgVEtRWXM5MWxKOExEcmp3SDhmSkhweno0b25TSS90aVJLODVBRnBjb3d1LzlZc2VHcFg4RFlLeDBqZ1J0Q1hMZGtiYWtOenU2T3dCcyBqZkthamh2OXhxZ2hsMHVIaUJOUlpnNzAzbHQ1Z1lKVWRsVjhjZWsxNndHOExKMGpRY0ZPMm5pQ3hJMUQ0K2VZelhqWW9BL3d0QmhqIFB4dDRvRUFzOHFiRDV0anJ6bHo3a2RyenhVRDBRZWtJRXBqOExzWU1aK2VRNTkzYWI1aTBjbWVVRjF5NzhvYWR4R2lQOHBxdVk2TFAgU21lSUUxbjJlbW55Z2JCTjd3SFFoR3d0VlRRY2lMUzNMK2FzdDdQaVB2S3lHUE5WcmxTcU93Nkx2Tm1Sd2lsOVdNenFtSG9ZZ0ZycCBIQktZcmJlRHNybkxheTlpNER6cEhJbWl1SllVY3FhV0tnSTR1MnJhNGd1bFE4U0ZiZEhybHpBSFFzVDFhVjJxeU9CTUxWVWtzRWd4IEZuRGc1ekpGYmVDUkhzVGs1MkdRUGFITW13NG11WU1MQlFUTXFad1pDOGhjQmlDTFo0czhON08yODNucEVMRWg4djRRMzMxMFYvUUUgUytPNDhMYWRKZmNCaUhUR3pYblczME9nMXkyLzdqa0dYcERPSWFDOGg4ME02UkQ5UVpUZTVsajlRWURNTWtVdStsbU1HUk5LWjRpRCBsOFVZaUwwc3hreUowWm14K0hITzJGWFNJZnFER1g4am5VR0l0N05pZHl4dHFHYmdNdWtjU1NMUXNtdWFsbTZPNDlvYlZyWnNKV0I1IEhOZDIyUHVyR3haWFM0ZUlDM20rWC9SQVRFcTdLaGE2QzA4QTZUekRzejhZMEpteENCR3psNzg3Zmhaam5zNk1oWkRaTThiSTFNelkgTTlkUFhmR0dkSWkrbXQ5Vk14eEFGcnNvQWg3dkY4dmw3Q2VScmVZNVlPTFdlRy9BaTJPOXZuc0NCbnQ3Q0RRUlJYSVdYZG93VUQ5KyBhdHRoMGpuNjZzVVYxNzhCNERucEhBa1NHVDlaRHIwc3hzRFFtYkcwSUlLWHhaZ0p3OFJueG1ZOVVIOE1BYWxjbTk0LzZWeENVU3lXIHZSK0EwTXlwck5DeWw4WFl2SWRtREFWd2czU09oRzByQzNGZm5EZm9LUm4yVTJTcnF5SkF1RG1OQS9mZXNCeDYrZm52aGJKaVNlRjkgMGlINkkyUDd4b1lmVjdmZ3lLUnZhb0xBeXdZZWJMUVlTdzNMZmhaak1NbC91TWpZTEMxUkJLWDBJVUhNcVZ5eUVvRlhQbExYNGVWWiBRK0hPSFRjRDhISUFmU0FNL3UvcjZwZHZpL01lTDkwN2ZUc0lQNDd6SGc0YVdpd3RmRWc2UkJ5ZVgzcjFId0M4SnAxREFzR2s4bnVmIFV2clNzNzk2cUNUeDJUSEQxc3VaTVY5N1FuaFpqUGs2TTRZdytWYWxaREsxUkJFaGJPb2VFdk83YW9ZellZcDBEaUUva3c0UWg3YTIgNW9DWVBpYWRJM0dHa2xsQ2FETzNWQkhFOUNrMHQzbTQ1SlVZR1YycUNIQmQ1YlJGSTZSVDlKV2hkTDcwN0M4VEpOOVIwVEo1V1l5QiByWmZqZXkrTE1aQ2ZsVE1aaVFZZW1XcmVFVlpZOHl2cEVIMVZERXN2UjBhWEtJTDlQR2RvOC9CTkh3QXdYanBId2phOFpIbzZrcmpSIEVSdTJkZ0I0UFlsN09hUzZhbHZSeTJZd0RKdlZwWXFsaGlsMVA5T3QyMHQrQ2ZpNTNHeS9PUGxpak1uVHZjYWVqdS85TE1Zcysva2ggdHdLSCtHV3JyZjN2NDE0aUZRdm1hNlFqU0xIazUzNHhOdlFGNlF5SkkyckxUMXBaVE9KV3ExYk5MQUMwSklsN3VZU1l2Znk5SWpaZSBmZy8wQmpOUzkvMi9ZV1hMVmdCL2xNNlJGQkpvZ2tac3ZKd1pJL2k1OHMzTFlvd01lZG42a3NsSWJNZzhTZUNlTWhpcE8xOXNWc2ZVIFNvRGVLNTFEeUJzdlAzenhhdWtRVVp1M3ZMWU9qSW5TT1pKRzFpYTZkTkJhWkc2cElvUE9xV3hZN04yUzVuWG5QZjBiQUtucmdodVIgbXVQcUZvK1ZEdEZYbktIenhsamdyREhMN0djREQrMm1tQ0xXengrV1padm9VclMydHVaU0FOVkozbE1TZzU2VXp0QlhBWm1yNGV2biArRkFZWGZsODNydTNaRGFEczJKRVdIdGpiY2NqU2Q3emhXVlhQQVN3djRlRkh3Q1IvVHZwREpIYjlUMlExZGt4RXhxK1dqcEVYNUhOIDFMNng4Uk1uemtxME9ESytIb2xDZnA1UjUrVWd6bnA2NkRNU25obmJOSEpqTlFBdnA3cjNoNFAwell5eFJlb2V3cEVoUENnZElXcHogVjlTZkM4Wms2UnhKWTFBckpmNlFKU2FZek0yT0FUU2x1bkhoK2RJcG9zWk1LNlV6U0dIQ3RkSVorc3Ftc0ZuV0FKUzhkdVJobFVuZSBrTWpQZmVUazZWNURMNHN4WHc5OXBvUm54c0EwTHRIN3llb2U4Y2F3MzBtSDZJczV5K29tZ25DcWRBNDVkcVYwZ3FoWnkvN05XdlNDIDVmQWVrUnVUbGJtdk1LYmc4OUlab3NZQmVmZHlwZzlPcWFxLzV5enBFSDFSUmlOL0M2QkhPa2RTY3NCeFNkN1BlbHFNV1UrN3BYdFogakpHbk0yTkVsT2lIaTJDeTFNM3REeTB0UzFMMVlLQ0FVdmMyTkVJdjN6UzEwNnNONEhNNnBwNU13QXpwSEFLZW1sbmIrWlRFamRlMiBYLzFyQUwrWHVMY281c3VxcHQxenNuU01LTDF3L3dkWEk2UG5qUUVBRzV1cTU4R2FwVTNkeUZBVER5Wk9kRHhGREMvM2pPazVZeW5DIHhLa2FWUGVXNVdTTE1jNVFhMjBHaXd3Ryt5dmZWWk5qNWl1a2N3anFTbjVaVzl6TS80R24zOGtIUjNjSkI1Qyt2d1REMW5xMk41R1kgR0N1bFUwZ2g0RXJVZEtWdFcwR3FucnNEd1VpNEdQTjBab3paejlsVUx4LzhaTkV0blNFV2xHeDNIS0prcDlVbEVTaFZENFV4eGJKNiBBRWRKNTVCQ3pGM1NHYUkwNzhHR0V3RmNKWjFEUUU5UU1Jc2tBeFJ5dUJ2dzlKbHhFQVJjNDl2c0dBeDU5YjNRUjBkVlZieGFLeDJpIEw0aVJxcTBCQThKSWROdUhoUzFMOG42SklidFRPa0ljL0N6R2lIWklaNGdENmN4WWJJalNWWXd4T0ZWTFVxSVdCam12QmwwMkRMK0cgRERYTCtRdis4WWVibG02UVRQRFN2VmU5RHFMN0pUTUlDV0R0bDZWRFJJbHMwYXZ2aFQ2amRDMVZaRTdYYzNkZ0VwNFpzOG1PRnhORCAwR0lzTFJoKy9yREljTUlOUEpKOWt5T0pBNU9hTjNRTDJ4dUhBWmd1blVQUUN6T25MSDFHT2tSVVpuYzJuQVBRKzZWelNEQ01lZElaIEFBRFd1cEVqZVpkWE55MCtUenBFVko1NzROcW5BYndvblVNTTQ3THhVOXNPazQ3UlcwRnBrS0ZpakpKZGFlVHBNa1V3dkp4czhiSVkgQThqTFlvdzV1US9YWGUyTm93Z1lsdFQ5aEcyNnFXWnBhaDdnTzByczVRQUdTZWNRdzM2MXRDZm1yd01nNlJ3Q1hoaTZhZmdLNlJBQSBzTzc4UHorUXhUUEhBQkNZdnlJZElsS0VMTStPVmRoY0lUVXZkcDY5dC9rRkFKdWtjeVRrc0RIMWJTT1R1aGtsdkswbFFWNk83NzBzIHhwall5OG9aU0s0N1RpRUlNN05FRWNCVGFXb0drZlVsaW1UOEdXek42YXlyQlhpS2RBNGg4MXBhbHJoeFprdytid0Z6dDNRTUNRelUgVmpZczl1ZDNrRE85Ynd4TWFlcXlTd3pRYXVrVVNhRUV4MVhNeVo1TG14anljN0xGeTJMTWVGbzVBOG5OakptRTI3QktvaFIxZEpyViBNYldTZ0V1a2MwZ0syWG94MkdJR2dmbWZwSE1Jc1JaMnZuU0l2eElXNWdOK25tRnpTSWEvQnJBZnM3Tmh3WXZ2aHdHb0dUKzlMZEVEIGhnZUNZVlB6L0Iyb2dKTnNpcGJ3dWJRSllhdkZXR3BZdGw3T2pDVjZ6aGhSWm9veFJubzZPaEhNSitEcDU3YVhucGxaMituRmNySzUgSytvdUIrZ2M2Und5cU1PMW4rTzY1ZGM5Qi9KckNXeHZFZVBjcW9iVzFDeHZPNWhkUDBkNlRqcUhJQk1XQzUrUUR0RmJST25acnoxZyBDYjdrOXJXMWZVNW54bEtFL2Z4aE1TZmF3Q00xYjlZR3loQ2w0dURKV1IxVER3TndpM1FPVWVUSEVxUnZQWEpCQlJqL0lwMURDckdiIERUUElzcE81RWtIMHplcWErZVhTTVNMaDJkRVhmVWUzcEthUkIvTWZwQ01reFRJbk5xNnlDZllZU0JTRlhvN3Z2U3pHMk5OaURFU0ogclFFbXh0aWs3aVd0cDVDT3Q2akV3VWN5MUZSbC82ejFZdVppeVBZaC93ZklUcmZTZmJ5eHZaajdxWFNJL1JrOHRPUy9BYnd1blVQSSBlRnRlN3NWQjBFeTBVanFEc0dGaHJwaUtGM2NXWnAxMGhxUVF6SmprN3VWbmEvdWk5Yk1uaEpmRldNN1hZaXpCbVRFbWpFN3FYc0tLIHI1YnZYQzhkNGxEYTJwcExpZmcyNlJ6QzJGcXpVanJFUU4zVk9YVThNZjJ0ZEE0cERDeTRyV21wazRjc3IxN1Mwa1BFcmRJNXBCRHggRjZycUZxVCtKWUUxZ1JjdmJRYUU4TWxUbTl1Y0g1QWYrZHBiendOd281RlA3RGl4WWd6c1p6ZEZObjcyaFBDeUdBdHpSUzhyWjBwMiAyam01THcxQlJGaWZuN1N5S0ozalVEYVBlT3NhQU1kSzV4QzJlbWJEc3BlbFF3eFV5T1k3QVB4WUR0WVBPUXJtU21jNG1DTFk2WHd4IHE2QWc5Ky9TSVFacS9YMHRMd0xJelBLM0F4aTliVnZ4YXVrUWg3SnExY3dDQXk5SjUwaElZdU1xOW5UUEdJeWZreTFlRm1PR3lweDggNnpwZ2xFeHIrd1hMNmdZRFNPdzhERWxzM1g4SXpIcHlZZ2tEWDVUT0lZMkJEdWtNQXpXN1kybzlnRXVsYzBoaG9PdkRVNWYrWGpySCB3YXh2ditZcEl2eGNPb2NVQm1aVTFTK2VKcDFqb0lnNDlkOFhBOFdNZjBqRDdCZ0lxWC9KMWt0SGpHbHVxMGppUnI0dVV5enJNVnFNIHBZWHA1dTNTR2VMQVFGa1M5OWtaaEZsWm9nZ1l2Q0VkNFZCbzR4RTNBc2hNZDhzREllWk82UXdETWIrcnBweGd2aStkUXhiZExwMmcgTnl6d1Bla01vZ3gvSiszTlBDeTBHQU5RdlcxTDhRYnBFSWRDd0FicERJblozSjNNK01yVG1iRWRaYnBuTERVMkRkKzBWVHBEUEpKcCA0R0dzeVV6ekRsaThKaDNoWUhZTjREbnpzMklBZW5wS0N2OHJIV0lnaXNYU0x5RGJSZlVMTCtXNmZ5SWRvamVlMzM3TWZ3TndmaTlwIGpJN2ppdExQUzRjWWlJcGM5ODhBRktSelNHUENQeVExRzlOZnpObHBtcE9qWENKTEZSUGUxcEtZUWNYaFc2UXp4TUhMWXV3ekZ6NjYgQTREeis0RDZpcEZNQXc4bWs1bVpNU2E4S1ozaFlBcGh5YTJnYk96Zk96aCs1R09UVnFiMkpjdGRuVlBIQS9DaVUxMi9NZCtaaHYyWiBBSUNWazRvQXo1YU9JWXYrTHMzTlBKNys2WTFiR0hoVU9vY0RqczF0Q1Q4aUhlSmdpTjFmb1JJVm0xQVRENGFYeFZoaHpkSW1MN2NoIGVWbU1BUUFJM2xYUEpxR1pNWUF6TXpObTRHNW5udHU3YW9ZUVU3WUg4SHR3ZXZlTE1ZTkNhKzRFNFBUYjZaaDFGNWxTMVJpakJDVjMgQXZEeXdkOUxGVEM1ZVFDVGRKRCtJcVI3YVhOVW1Qai9uamhqM2xEcEhBZkNHZnFjR1pQWXNVRStGbU9icFFQRXhkOWlqTm03SHhyRCBKckpuakxMVXRZL0oyV1VzcGNYU1R3STRVanFIQ3lnd3FSMVV6ZXVvdlJHRVd1a2N3djd6by9YTG5WNFN2SzgxUzFzMkFQZ3Y2UnlpIENKT3FHbG8vTEIyanYwajNqZTF4eE01Q2hiTkhveGpEUGRJWmtzS1drMXA1NUdOcmUrOG1XZmJ3dHhnRGVmaERTMlptakpHWk04WUEgdzA0V1k5Ky9iOW9JQUorVHp1R0lqY1BlR0xaS09rUi8zTEZpOG1nbStsZnBITktZVENvYlloQnNLbk5IaXVoZng5WXVUdVVMdXJWRCBTcDhBc0VrNmh5TStWemx0MFFqcEVQdkRqTXdVWXlCS2FuemwzY3dZYVRHV1N0NzkwSkxhTXdiZ3FJVHVJNDR0T2ZrUXlKVVdQZzlnIHVIUU9KekFlYkdsWmtzcERRUU9iK3g2QXc2UnpDSHZzbHFrUFBDRWRvai9XTHIzbU1RS25NbnVFaHB1U2xPNmZXOUlTQXVpU2p1R0kgNFdUcHM5SWg5c3ZoRlNxUjQ0Uld1M2pZVFpGQjNxMTQyOFBiWW93OUxNYVMyek9HVVFuZFJ4eVRlOHNqN21wdkhFV0VqMHZuY0laSiA1MzZ4dVIzMVZ4RndtWFFPYVV3cGJ4UFA2V2pISHl2R3RPckd4UitVanRFZnVsVHhyM3hxM0l4VzUxNjJNaWd6ZThhWUVocGZlZGxOIDBXb3hsamJFL20zMFMzQm1MRFA3bEl5RHhaZ3R0VjhFNE94bTY4U0Y2U3ZHWm5YVkhNSGdiMHZuY01DR25UMUJxdmRkNVdqNFBZRGIgUjJBa2djSGZPNjV1UWVxZURVVnJVL2Y5RWFQQnRnZC9LeDFpWDhaa1o1a2lKVGUrOHE0WUkvWngrOUV1M2haaklQYndoMGF4Ti9ENCBibnRqR1RKVUNEQWJweDRDYzdvYXh6RHpUT2tjRG5ubTV2cmx6MG1INkt1Z1VQb2Z5TkJMalFNaFlOWnRUVXRUL2RaN3pkS21ibWJNIGs4N2hnQ09LUVpDNkZ3enJsMTI3QmtTcCt3NkpEZUhXTVplMk9iVXZQRk43eG9CaHB6YTNKVkVvZVZlTXNkRmlMSFdJakljell4Z1UgOXowcUtyS3pSQkVBbUMxTFo5Z2JGOEwvQjZCY09vYzcwcmZFYVBieTJobE11RUk2aHdPS25BdG1TWWVJUXE0a2R5YzhQTHV5NytpcSB5cWFGbDBxbjZEUFdGdmQ3S1EvQzhJdlNJZlpHeEU0OWgyTkdiKzFJWkp3ViszZ3hhY3crVHJMczRtMHhCZzkvYUFRTWp2c2UxdHBNIHZjMDNSTTU4QnU3dW5ISTRFYTZUenVHV0lGWEYyUHl1bXVGRWRJZDBEa2Y4Nk9aSlM5ZExoNGpDcy9lMlBBL2d4OUk1WEVCczdody8gdFMxVlRXbVkwL2RTSjE3MitqSDFiU09sVSt6QlRLazl5NjQvY3JZUWN6SEdCQStMTWFQbmpLV1FsOHNVRWN6dnFvbDExb1JzbUsyWiBNWUl6RDRGdW03c0oyVDRZZUY5aExyZnpRZWtRZlJHR1pkOUdsczdwT3dqRDdGVkxmOUlqQ3ZZWUhaWVV2eVVkb2k4c2w2d0FrTXFPIHJQR2dRUUVWYjVSTzhUWmlmOGVpKzBFY3hQclMrOWpwOTFYQXcvRTllM2xrMVM3ZS9iRDJZRTgzK29YZFpiRys3U0FFem5WYWloTlogZHFJWWEydHJEb3poajBqbmNNeGpOMHhhbVpvemdtWXZyNTNCekIrU3p1RUNCcnB1ck90NFVqcEhsTmEyWC9rNEVYNHVuY01SSDY1cSBXUFFCNlJDOXRYNVp5MFlBWHYwK0RoamhZMmh1QzZSakFBQnp0b294aTNoZmVnOHE3b2g5RlpVRTFtNktLZVRoTWtVQU1NVHhmc2c0IFczdkdMQmtuaXJHM1JteDVIek9xcFhNNFpxbDBnTjZhMVZWekJCRjVzVDhxQ3VUWnJOZ2VsdkZONlF6T0lMb3pUZDBWbVNrMTN5Y0ogcWFyZVdwd3VIUUlBREJsL3g2TDdRYUJZeDFsRkRyMHN4b3lua3l5QXg4VVllN3EyTkRSMlNLdzNJRDRpMXV1N2hqaXBzOXNPaW1IMSBYTEY5V1R3Z0hhRzNnbUxwblFDT2xzN2hBZ2IvL3FiYURpOEh2cytmOTZmN0FmeEJPb2NqUm9XNWt0U2NJUmV3OWZKM2NpQVkrSVIwIEJnQmd0am5wREVuaW1Jc3h5ekcvdEJkaWpkVmlMRzBDWTd6OG9SbW11RDlrem16cVRZSUJ4RGVpMzlYWmVBb0JrNlJ6T09iVkZ4KzkgOEZmU0lYcGpkbWZkMVF4Y0xwM0RGUWIwYjBUd3N6dGFQbTlCU05WK3FUZ3hjM04xUSt1VjBqbDY0N2tML3Z3a2dBM1NPUnd6cWJKeCA0U25TSVFBU2Z3NG5pV0ZqSFdjRjhMTVlNK3pudUI3d3VCaXpJZnM1TXhaL1I4Vk1mU2xhUzhPbE00U3dWMHRuY05DeWZENXZwVU1jIHloMHJKbzhtNEQra2N6ams1ZTJGWUpGMGlEaVY4UEFmQW5oRk9vY3JtUEM5c2JXTDNXOWFzNnVRWGlZZHd6RkVNRmRKaHdCWS9EbWMgSktKNGkwK2JpNy96dGdRR2VUbXVCend1eGtMeXN4aERRTEUyOEdCZ1JKelhkdy9MRjUvTUxkSVJuRU5vbDQ1d0tNeWdrakEzQjV5MSB6OHhCZlRmdGh6d2Z5cHFsVGQwQVVyTThMd0VqZ3h6L1lIYzdiYmN4cDJicGM0TGt6MFJrK1plaWllSjRpMCsyRk85MkZpRnM3RnZTIEdlTGliVEZXV3N5bHBndGJYeEJqV0t6WFI3elhkdzBaRWwyV09XdEYvVmtBSmtobWNGQklSWEwrWEtBNUhmVXptZEFvbmNNaFd3dmQgSlpsb1loTGEzQjBBdGtybmNBVUR0WldOclRkTDV6aVVRbzZXQVhCK3hqMWh4MVUxTGo0Zi9OUWFBQUFnQUVsRVFWUlROQUZsN0lVVyB4enN6UmtSRDQ3eStsSEJuVVl1eHRDa2MrWnFYeFJnNDlqMWRHWHREWmFzbGIwOGhQaWg1ZnljeEhyK3BZZGxHNlJnSE0yZFozVGdpIC9oZnBIQzVoWU02dGw5Ny9wblNPSkt4ZjFyS1JpTytTenVFU0FuMXJUUDBQblg2eDlOSzlWNzNPcEMzdTk4VWt2VHFEeDhuZVAyRVUgOHppTDQ5MlRKb1JmSEZuaDU3Z2VIaGRqTTg5ZVZRQ3dUVHBIRExRWWl4U2RJSHAzWW0zOHNBOG10MXZhNS9ONWd3QS9BT0RsMjhkKyBLaHFUKzQ1MGlFUlo4MjBBUmVrWURoa2NtTndQWERtNzZrQU0yT252RndrRStxRHNNbE55dW9pUFFhd3pZd3paRlQ4eDJZSWxMZDRlIDNPNXRNYmFiZjFVMGNkelQrZko3cUpKMTJLeXVHcEYyL3JPVzFaMEg0RGlKZTd1TXJOdkYySmlMSC80Y0dPK1Z6dUdZdHB1bXRLK1QgRHBHa3RROWN1WmJCUDVMTzRSYStxR3ByK0ducEZBZG5uUDUrRWNFOGJtelRQUk1sYmwzZDFIWTBNclk5QXZHLzlQWncyU2Y3TjU3ZiBpOS9GR0h0WWpNVzRUSEhXa3hOTEFGVEVkWDFYa1MwVm1SMGpnNytSdUsvalhuTzVwZjNjWlhXbk1kT1hwWE80eGhyNk4ra01FcGlNIGw0ZGJEd3gvcGJLKzlWVHBGQWV5OXR5bm40QzJ1SCtIZ0xsWjRyNWhHQjR2Y1Y5aGcxSFRGZC9aYXVSZlF4UUNlYnRmRFBDOUdDUC8gaWpFR3hmZkdZOHZRck0yS0FRQU04N3NrN2t2QWRJbjd1b3pCenJhMGIydHJMbVdEdXdHVVNXZHhUT2ZNS2N0K0tSMUN3Z3Z0Vno0SiA4QXJwSEk0cEo4TUxKazZjVlNJZFpMOTJmYjhzbDQ3aEdoWjZIZ1hHbmlaeFgybWpnK2RqRzI4Wlp2K1dLWG80bnQrYjM4VVk0TjFtIGNxTDRac2E0VU9MaDFIWXZNQ1crUEdQT3NycHhBRTVNK3I3T0kzSzJwZjFiSTk3NkVvQ3pwSE80aHBtL0twMUJsTUUvU1Vkd0Q1MzEgK3BIRDh0SXBEa3ozamUzSHlaWFRGbzFQK3FZTU9qdnBlN29nS00vRlZveHgvTDBGa3NmK2plZjM1bnN4NXQrMFpvekxGQU9tckszYiBCZ0F3Q1F5d2lac1N2NmY3d2pLRVRyYTBuOU5aL3g0QW41Zk80Um9DUFhSTFhjZlBwSE5JV25mLzFWMEFQU3lkd3ozOGhiSDFpOThqIG5XSi90TVg5L2xGSURRSzNsVzJyTDRTS1FaeExDYjE3c2M3TS9vM245K0ozTVViazQ3VG1xTml1YkV3MnU4TXgzdlhkOXNaa2w1NFIgYVRHMkw4YmoxMDlkOFlaMGpIMHRiRzhjUnVBRkFKenVFaWZCSXN6MnJOamJTR2ZIM2lrd2hoZE1hRnpvM0V1K2wrNjk2bldBZmlHZCB3emtHaVQ2WEpqUzJsd0Z3ZG45aG5NallPTWRiOFkwVHBaRFJZaXl0aU5uSGFjMGo0eW9jQ0R3NGp1dW1RR2xGRUNhMmJuMStWMDA1IGdKcWs3cGNXRFBxcGRJYjkyVjVTL0I0enFxVnpPT2lYTjAvdDFMMDNBTll0dldJcGdaK1F6dUdnNmg2WTcwcUgyRDk3cjNRQzV6QW0gajJsdVM2eUpWemR2UEIxQWFWTDNjd25ERElyanVyc0xYTytLTVFJN2ZmYm9RSGxkak1ISFpZb0FEU3FqbzJPNU10dFl2aHhTSVVCaSArOGJDc0t3R1FIYi9XeDlJRHZkSlI5alg3STc2RmdKZEs1M0RUZlJsSXJCMENsY3dtNjlMWjNBUkFkZFhOaXdTNmRSM01DR3hGbVB2IFZKSGJWcndrcVpzUlVTYVhLQUlBeC9UeXV4QytmaXdBd1RQajRzSEFadWtNY2ZLN0dHTS96eVd3S0k2TzQ3cE1aa2djMTAwRlRxNFkgWTliOVl2dnh6QzJUbDYyV0RyRzNPMVpNSGszZ082UnpPSW14K3NXSEw5REI3RjdXUFhERmp3bDRTanFIaTRobzl2anBiWlhTT2ZhMiB2djJhcDBEMG5IUU81ekFTMnpkR1RPY2tkUy8zeFBQeTIxTEptRGl1SzQ5OFhPbjJOcStMTVRaZTdoa0RMTVh5WVNNZ3E4c1VBU0RKIGprNk5DZDRyRlJod2Fva2lNeWhuYzNQaFkxZXFDRERSbDEwOWdrQU9NUmc2TzdaL3c4T3dPQTlncDk3WWt5NVZmSWRFVzl4VG9zOWQgcDVpWXhsc0IyVmhlMW90ajYrZDRmamUvaXpINFdZd1pjQ3dmTnN1WkxzYmV0WHN2VjZ4bWQwNDVBY0NFdU8rVE5nR1JVNE9pT1N0cSBQdzBrOTRZNFRRajQ4L0EzaC8xSU9vZUwxZzdOdFFGNFdqcUhreGhUcXhzWGYxSTZ4dDVzQ0tlK2R4d3hmc3lsaTJJL2lMbTZabjQ1IE10cThBd0FZSnBieEZwUHhjMmJNejRaOGIvTzZHQXVzbjVVMFV6ekZHRXlHOTR3QkphRXRPejMydTNCUUgvczkwbWRUY2ZqckQwbUggMkdOV3g5UjNFV3QzdkFOaDBGZGJXcGFFMGptY3RLUWxKTUkzcEdPNGlvR3ZqNTEyanpPSC9JNTZmZXZQNE9mZThnRXhTYlM0SDFSKyBCZ0EzRHdaUEFNZjE4cHZzc2JGY1Z4Z2JiVzJmV215Tmw4VVlRTEVjekpqeFpZcXd6TEV2bVNDZGJkbWY5cGxucnlwSWh3Q0E3N1kzIGxoR1pId0tJZlpZMHBaNTlNZGZkS2gzQ1pZZS91bVdoN2tVNm9ISmo3VDI3WjBYRXJWbzFzOERnQjZSenVJWUlzYjgwWkxZWjNpOEcgR09KWVhuNFQwM0Z4WE5jQnVtY3NyY0t5YmorTE1jWkpNVjAzMDhXWVlidzd6dXZ2UHBJZ3NVNVZxY0hzVEJmRjhwTHdxOFE0UXpxSCBzd2pmeUU5YVdaU080YkpWcTJZV2lPMDNwWE00N0ZTdUtQMktkSWc5Q0xwVThSMFlOYnRicE1lSFRLelBXOWN4eDlOTmtZRVQ0N2l1IHRLSWg3YWFZVmk4RG13QXZXeThmbCsrcXlVVjlVYzc0ekJpRFkxMG5YMTVxMzRPTS96ZmVqMEt1cExCVU9nUUF6RjFXOTE0Q1BpT2QgdzFtTTlUdDZncnVsWTZSQkRpUHVBdkNpZEE1MzBXZXFHbHNuUzZjQUFDcnJ1UitBRXpQekRobGN3S2FMNHJ3QmdVK0k4L3JPSTRwOCBabXppeEZrbEFHSlpPU1dNWDlweWpKK1RLN3Q1WFl6dGZvTzdUVHBIREVxUExwU01pL3FpQnRGL09hUUx4VnFNRVhOZG5OZFBKY0xQIGI1aTBVdnhMOXZ2M1RSdkJCZ3ZoK1hmaWdCaDg4N2FtcGQzU01kSmd6ZEttYm1MNk4ra2NEak1NL0tENnN2bkRwWU9zL2ZFTm13QTggTEozRE5ZUjRseW95Wjd1UkZSRkZmcFRReGxHRHhzUFBmWGpic0hLUzF5c3kvQjk0TU1RSGVuSElrWW44clJJaitpK0hsRGwyd2JLNiBPR2V1ZEwvWVB0aXlFeTN0UzBzTDN3Y3dWanFIdzE3ZU1takxIT2tRcWJKejV4M1EyYkVESW1Bc2Q1Zk5sYzRCQUNCZHFyZ3ZqbkhmIDJLaWF0aUVBam83cittbkFpSDdQV0JFNUw1Y29zdWY3eFlBc0ZHUGtaekhHY2V3Ykk2NkkvSnJwUWp0aUdwRFBXMTU3TEFCbnVvaTUgSW1kWWZCQTB1N1B1YWlaY0laM0RaVXo0Nm1jdWZIU0hkSTQwV2J2eWhwME03YXg0Q0pkWE5TNjZXanBFR0laT3ZCUnlDdVAwcXZvZiBIaFBIcFNzcWVpb0JPSFhtWE9Jc0lpL0dETmpMWW93eTBQSFUrMktNUEQxckRNVFJ0MkczMmtFdU1EYVdnalFFNnBEMWg4KytHS3MvIFBMWHpXY2tJc3pxbVZoTGplNUlaVXVENW5UM0JQT2tRYVZTSzRiTVplRUU2aDl2b2UrT250MVZLSmxpLzdObzFBUDRnbWNGQlJCVEUgczdUZVVOWmYvQUlVdzNqTElQN2plV1Q0T1k3ZmkvZkZHSVA5L0NFeUprWit6VGkrSEZJbXRLWTBqdXNTSlhCdVMrclFmMHZlUFovUCBHNEw1QVFEeGZTc3VJK2F2NkY2eC9sbXp0S25iRUgxTk9vZmpodHV3dUJETmJZRnNEUG9mMmZ1N2h5bWVmYzRFRTIrbnhuU0lZN3dWICsvRThFa2lYS2FZZmcvMzhJUkpPdXIyckp1bzlYcG4vZ2pRQlJWNk10YlUxQndDbVJuM2R0Q01LUlFjL1l5NSsrSE1FVEpMTWtBTFAgaENNM2FnZkZBUmc4T0xoTHp4MDdPR2E4cDNKcjhiT2lJU3o5U1BUK1RxSmE1UE9SanhQSnNvOU5Kdm9xMG1Mc3hCbnpob0xoWllkSyBaazhuVmZiaWZURm15R3lVemhDVElGZk1SWHhPQjJkK1pneE1rYitkM1h6NDVva0FEby82dWluMzdFMjFuYitTdXZuczViWHZaaVpuIHpqcHlGUkcrNHNxQjNHbTFla2xMRHhoZmxjN2hPZ0srVXQyMFNPenNxWFhMcnZpbEZzM3ZNR3JzTDA0OEsrcUxNaUE4QytvQW9rakggVzkyRmlyUGc2WmllaUh3ZHg3L055eC9jM2hqMkRla01jVEVJSXA2UzFuWGNaSGg3NUJjTnRZdml2cGpwdjZUdVBiK3JwcHlJRmdDSSBaVW1xTHdqNDgvcWdaNUYwRGgrc0d4TGNEZUJwNlJ5T0syV20xakhOYlhMUElXYlJwZE11TW15alg2ckkwR1pBSE8zTGJ3YWRFK1gxIFhNSk1yMHRuaUp2M3hSZ3NQSzZvT2VyMXdabGZwb2hpOU1VWUUyc3h0Zy9KSllyRlF1azNBTHhMNnY1cHdjei91UHVzUmpWUVMxcEMgMXRteDNqZzV0N1g0ZGJHN00zU3A0anRRWTlSWERJM2RHdlUxVXlqaWxVZ2NmUjhCWjdESDQvaGR2Qy9HMkpDM00yTUFMb3o0ZXBsZiBwc2dSSHhJKzk0SDZrUURPamZLYUhuanhwcW1kajB2Y2VFNW5YUzBJbjVDNGQ2b3dWci80eUVYL0tSM0RKODhQL2YvczNYbDRsT1c5IFAvNzM1NW1aaEMzc0FnSW1BUmNRRlJmVUNtNGdaTElnMUM1RUZzVXFXMjIvYlcxN3p1bHFUZnRyZTlxZWMyeHJhMjBJU2tFSUdyb0ogUXNpQzBLcmdBbHExN2dnSmdzb3VhMEptNXZuOC9vQ2VnNnpKekROelA4djdkVjI5ZWwyVG1mdCtremd6eitlNXQvQWljTWUrTTFMZyBxM2xGQzB0TTlOMjRZdEp6M1AzeUJNUDdqWjduNkRSN1M4VFI3MWx2VW9kdmZxdlQxNE91SWVMcjYzZ0FBU2pHUXJhdksrb0I1WFZqIEhOa1NXQlVDVHR0QzNPRmlUQzI3Qkp3Zi8wbUtQNGxBTTkzdDc1NGMydzJLaDhFakJzNUlSZTRyS3l1elRlZndsY1dsQ1JXVW1ZN2ggQVFLUkNxY0xnRloyclFKNUl2UDl1bG9vRWdrWE9OcGdpTVVZNE55YXNmeWlSZm1BR0QwZUlwMXMyNy9MamY3Rjk4V1lyZjZ1cUVXcyA2NTFvNXcrclIyYURGNm5vNkhBeEJyR00zT0YxTXpFMEZTaVMzZko3cE9sUWI1OTU3WU5uaDNPYjd6VFl2SHpTWWdoZU1aM0RBL3FHIHN5SnpUSFJzNnZQSnpkU1NzVTYyZDJCZm1NVVlZRjAwb2NxUkcrQzJCVWV1QTkxS0xNdlgxL0ZBQUlveHdNOXJ4Z0JSM09CUVU0R2Ygb2doQU42NGQ0ZGpDNGlOYjJtdWhVKzM1eFBiT2U3czhtK2xPSytvSzd3U2tOTlA5ZXBHcWZwK2pZdWtpS3NyUnNWYTZKYjlvNFJjeSAzV2xEVHVocEFOc3ozYStyS1lxY1BBZHV4OGczRGdHWm54M2hOazE3NE1obU5hTHE3MkpNZWM2WTU3VlBoUHhlVVR2MEp1ekFZZ3c0IDRPUkY2SjV1ZTRZRDZPNVVlMzZnaXIrVWxpNU9aTExQaXByb0FJWCtLcE45ZXBaZy9ZeUN1cVdtWS9oWlEvWGt2NnJnQmRNNXZFQkYgZnRQLzVvWG5aN1RUeGFVSmdmdzFvMzI2WDgvOEF5M083ZFozNUh2VytaMkxQVWFzWnFmV2pUbDFVOTZWRGphSHVKdWkxMDBwcnQ0UCB3TS9uNUF4K3FDYmFLOVZHRWpaM1VnVGc2QTVQbG9RYzM0WEs2MExJN05iUlZWVVRRckR3cUFDZE05bXZWd25rK3liVzh3V04yUHBEIDB4azhvbE1vWWMxMWNsU21WZFRtRnZmSFVYVjJxaUtBZlE2MzV6bDJPSlR5eU5pQThaVzlBWDhlOW54VXk0N1ZwYjdmZmRQM3hkalIgQ3dzL0QzRktXSFIweW8ySUhmaVJNWEc0R0ZPbzAxOWUzaWJZRSsrK2UxVW11L3k0Mjk3dkFMZzJrMzE2Mk5QVHg5U3NNQjBpQ0JwWCBURmtPU01hbjYzcVRYcHUzUC9HZFRQYllZOGVCcCtEdjY0YTJFemk2L2xrZC9yNzFJa0VvNVp2ZzJvS2I0Ty8xL3I1ZWF2UXZ2aS9HIGp2TDNWRVdSMU0reGFuSDJBRUl2VW1DL1UyMVZyQ3J1TDRxaFRyWG5Cd0o1WXRhVjZ6TTJTajI3dnVncUFYNlFxZjY4VGkxODIzU0cgSUZGVi9yNWJTL1FINTVRc2N2cGN6Vk5hdjM1V1RJVzdLbjZTWEg1T3dhSytqclhHWWd4cU8zQVRYT0QzYzB4WmpQbUkzLytZMGFOYiAweWN0TGl6RzRHQXhKb240V1BqN2JsV2JpVzB2eWxSZjVVdkhkUkMxSHdVUXlWU2ZIdmZFek5HMWEweUhDSkxOS3lZL0l3RFg1N1ZPIHhGSmQwSGZjMGc2WjZqQ2trckhQSzQ4UUNjT3gyUjVPM3Z6MEtyVWt0V21LWldXV0FyN2VKRXpFNTRNcFJ3V2lHQlA0ZTN0N0FIMHEgNmdvdVRhV0JjRWd5OWlYbllvNTlPYWpLNTUxcXl5ZTJ2eCtKUFpXcHpxeDJ6ZjhEWUZDbSt2TzRoSWJrZTZaREJGSUMvd0VnYmpxRyBSd3lLeEEvOGQ2WTYyOVRKV2duZ28wejE1d1dpK2xuSDJ1TElHR0NudHB0aTdvdm5YdzZndDBOcFhFa1Z2dCs4QXdoSU1RYngvY2dZIEpNV3Bpclp0TzdMRnFwZUpPdlBsTUdkRllYY0FOenJSbGwrSXlLS3lVYXN6Y3RFNXA2NXdMQ0N6TXRHWEh5Z3diK1pOTmErYnpoRkUgRGJXVDMxS1JCYVp6ZUlkK01hOXdVV2JXNGk0dVRZaG9WVWI2OGdyQlRmbTN6TzNxUkZNSzVjZ1k3SlJ1Z292dHdCSVY5d3ZFMnMxQSBGR08ySFlnelEyNU81Y1VxVnVDTE1Wc2MybW8zck9QQTZYR2ZrRWhvUnFiOFBGUVQ3YVhRaDhFcG9xM1ZITFo1N3BWSjRWRG9QZ0ROIHBuTjRoTURTaDgrTnprOTVCK0ZXMGN4OGJubElsdDJjbmRLMXhyOElKUEJiMnlQVmFZb1FSLzRXYnFZU2lPdjNZQlJqSXZqUWRJWU0gR0Q1M1ZVbWZaRjlzS1FJL1RWR0F3MDYwb3dwT1VmeWs5MlpHYXpOeXJsSTRoRG53K2JRTmgvM21yc0xhOTAySENMS05TMHMzUS9FNyAwems4cEhjOEZQb0RvR20vNGRKUWZkdHpnR3hJZHo5ZUlnSkhwaW9xMUpIdlcwL1Q1TmZxSDluU1hxOTJNbzRyS1Q0d0hTRVRBbEdNIFFUUUl4WmdWUDdKcFJKS3ZUbTI0M0NkUy9uSjRjTlhJVGdER09KREZQMVFxTTNGMjFaejZnbGxRakV0M1B6N3ljWllrZm00NkJBRWEgMGg4aklOTnhuQ0hGdWNXVk16TFRsejZlbVg0OG82aDNkSDdIVkJ1eElJRXZ4aFJXMHRkZDJvSmJFSWhyZUFuQzlYc1EvcENBSkFJeCBNZ1lBbjA3MmhhcWNwaWlTK3AyNlNDTHJaZ0RjbWZJWUljdDZMTjE5bEs4c1BsZFYvaXZkL2ZpSnF2enNqakVyL2I2NWtTZHNYalpsIEQ2QVoyNXpDRHdSeS80Q2lSOU8vU1k5bExVeDdIOTdTUGpzVUtYYWduY0FYWTlEa04vQlEwYVN2OTd3bEVZanI5MEFVWS9GZ2pJd0IgaWpIemE2SkozYkVTMGNBWFkycGJMYWszZ2xzZGlPSW42KzRhVS8xR09qc29XelV5YkNVU2xRQnkwdG1QejN5Z2g3TitZem9FL1ovbSBST0xYUUdCdUhEcWhZOElLemNmSVZlRjBkdEs0Yk9LYmdMNlV6ajY4UnFBcGY4OHBSOFpnUVpNYUdUdHJaRlVuUUVZNW5jZU5iRnUzIG1jNlFDWUVveGhLUldGQys0Tm8zVzhudHJxTjJxZ3RKZlNERmtiR0srdEc5QmM2ZHcrSUhDcG1kN2o3NkppTDNRdUQvdWZOT0V2eHcgMXJpbFhFRHZJdHRxcHg0VWtSK1p6dUVsb3JnNnYvMkg5NmEvbi9SL2pubk0rUE9LcTg1S3JRbXVHWU1rTnpMV3ZrTzhCQUdaZ1JQVCBZQXltQktJWSsvS28xUWNRa0FNR1JYVmlVaS9rbWpFQVNHMWtURU5Ud1YwVS81Y0MrMkxodzJuZGplemgrcUxob3ZMZGRQYmhRMjl2IERiVThZam9FbmFqSHRuMFBBM2pIZEE0dlVlQzdlVVdWdzlQWlIzWldVeVVDY2czUlNsa3hpZCtlVWd1YTR2ZXREMmlTeFpnb2tydk8gODU1OTIycW5IalFkSWhNQ1VZd0JnQVRsOEViQnpRdVdGM2R1ODh1VUkyT1MrdUdyZHpvU3hDY0VXbm4wUmtoYXpLK0pkbFMxNXdGSSA2elFsLzdHK202a3ozNmh0MXErZkZWUFY3NXZPNFRGaENCWU1Hdjl3MnFZcHY3MWsybjRBYVYvNzZqRXpVdHJSMGtMQ3dTemVsTVIxIDEzbkZDem9EY0dMTm5oY0VZbFFNQ0ZBeHBzSFkzaDRBMmpXRjQrUGIvQ3FSd0krTXFTVC81VkJSWDNnOWdBc2RqT041dG1WVnBMUDkgdzRKZkszQitPdnZ3SDMxeCtwZ1ZmekdkZ2s1dDg0ckpmd1RrT2RNNVBHWmdjMHY3KzlQWmdZankrSUZqS1FibmpYMHM2UkZKaGJJWSBTMkprTEs3eVdRUmtpaUpZalBtUUJ1ZVBxdEwySVd4VmJ1QUJPNFV2QjlVdk81akUreFF2ekJwZGs3WkY3M1BxbzdkQU1DMWQ3ZnVWIEpkYTNNbkhNQUtWQ1ZCVWNIV3Nyd2ZUODRzcGIwdFY4dy9JcC93Q3dMbDN0ZTVMcS8wdjJwUUtMby9OcXQvbTZTeUhCMlNRc09JTW8gd1NuR1JHV3I2UXlaSXBEb3ZQclJQZHI0bXNBWFl3cXJVekt2SzYrSkRnWXd3ZUU0bmlhQzhuUzFQWGRWU1I5VmNFRjlHeWwwMmJReCBOYXRNNTZBejI3eGkwa3BBcTAzbjhCb0ZadWVYVlBWSld3ZHAvRnp6SkVWcC81c1hKalU3UWRWTzZ2dldYOW8ySTZudnVNcWVFSXhPIFZ4clhDY2lCejBDQWlqSGIwdmRNWjhpZ1NBdENuMnZMQ3pUSkxWYjlSRVIvTkx1dXNFMi9Od0FJV2ZKekJPaTkxQXJiOW5YY241YU4gTzFRaHNYaHNEb0FVZC9JS25BUkMxcmRNaDZBMnNFTGZST3JyV0lQbUxGdGo4MUpheTNRYWN1andBZ1JvNmxRcmhFSUorV2xiWDVSYiBzdUJtZ1pTbElZKzNhTnVtRzJiRmRRSUN0RW1ZaUd3d25TRlRBbk1CYWRuNnR1a01tYVJ0MzIwbjhDTmpBTElFK3Rqcyt1aVUxcjVnIGRtM0JaeFRhOWpWNi92WS8zeGl4dGlrZERjK3BLL2lTUUhoOFFKdHB4Y3liYWw0M25ZSmFyM0haeERkVjhMRHBIRjRqa0doZXlXTmYgU2tmYkRhdnZiQmJGQStsbzI4TStuMXV5NE9iV1BqbXZlT0VVVWVzdkNNNjZwMU5TUVp0dWdnZHFpaUlBVlEzTXpyTEJLY1pVQXZOSCBCUUFCYmloZlVYaDJhNSt2QWs0Wk9DSXNpdmtWZFlYM25PbUpGWFZqTGhRUmJoRitMTUVlcTMyNzM2ZWo2ZkthNkdDSS9DSWRiZnVaIEF2dml0dHhuT2dlMVhTaU0rOEF0MWR0TzdWL2tSeXNIcDZQcHNOaS9BL0J4T3RyMktsSHJEd05MSHJ2Z1RNL0xMNjY4QjVENTRBNjQgQUFDQnR2cTZxLy9OVmYwQVhKL0dPSzRUaHgyWTYvYkFGR04zUm11M0FBalNJYWNoc2V6UzFqN1pBcnFrTTR6SFdJRCtjblpkOU9IZiBQVG0yMjhtZU1Mcytlak5nclFiUU5iUFJYTTZXMzA2N2JvbmpGNC9sNjRaRnJCQVdBRzI3azBpQUpmalozWVcxMjAzbm9MYmJ0R1R5IE5rQi9aanFIOTBnSERXSEJzR0hsamsvcDJsQjkyejVBdUxQaUovVklxUDMzdktLRkpTZjdZZTdZaGQxeVN4Yk5WZUNYQ05CMTU1bEogcTYrN3d2RkVLWUwxdXp1NHRYcEtZUFo2Q016ZENSRm9SUjAyQUJocU9rdW1pTWhFQUw5dXpYTlZXVlFjVDRDN0l0bXh6MWJVUjUrRSA0ajJvdG9oSVB3V3VoK0lTMC9sYzZLQWRPWnlXS1R6V3h6M0xvRG9zSFczNzNPWjlIZmIveW5RSVNsNmlVK1NYMW9INEZ3VTR4M1FXIGp4bTJzMWZuTWdEZmM3cmhjQ0wyNjNnb2RFOWJOMkR3dWQ0UVdaWlhYUGtxVko4V1M3WUNtcTBxNThIR1dFQjVqWEdpVnY5T2JFc24gU3BEMndSVnNBSUx6THc1U2xRMG9BalBrZWRTbkhuNnFhTkNabmxSV1ZtWUJhUE5CMFFIUkZZcmJBTndIa1o4bzhDV0FoZGdwVk13YSB0WHFuMDQyVzE0MjVEcXJjZkNJSkt2aHV1dGJ2VVdac1dWemFCQkhIQzRwZzBHL2xGbFZlNTNTcjc5Vk8zUTRJMS9PZDNGQ0lmRmtWIFAxV1Yrd0JNQVdlUW5FcVgxbXcya3pmMnNRdEZjWFVtQXJtRklGaExpNEpWakZuQit1TUNFTFVUZDU3cFNYazNydTZNb1AyM1FFNDcgR0E2SGYrNTBvdyt1R3RuSmdqVVhRTWpwdHYxUFh2N2dtUkZwMmRXU01tdno4b2tMd0RPdWtoRVNTK2FmVjd6QStadU5kdUkvQVJ4MCB2RjBLa3ZCWkl4ZDNQT096N01SZEdjamlLbXJiZ2RwMEwxQVg0SUxnN016eUw2b3l0V3pWeU5OT1IyMXVic2U3VnBRU0FYNTU1NmpsIEh6bmRibFlzNjdjQXpuTzYzU0FRVys4cEt5dXpUZWNnSjRnSzhHK21VM2lTNm9BV1dJNVBuMjZzdWYxRDVjNktsS0xPV1ltVHJrdi8gbHlQckh1WDJUT1Z4Q3hXOGF6cERKZ1dxR0xOdGZjVjBCZ1BPN3QrU1ZYeTZKMFJDaVg2WkNrTitKRHZieFVMLzVYU3JzMnNMUGdQQiBIVTYzR3dpQ3Ywd3ZyUDI3NlJqa25JYnF5WDlUbFNkTTUvQWlBZTdJTDE3aytMYmc0WGo0NXdCMk9kMHVCVWZpRE5kZk84L3FmRE9BIDNobUs0eG9obFgrWXpwQkpnU3JHdFB2dTF3RUVidjJFaGpEamREKzNMZUhDY0VxYVFIOTZXMG4xUGlmYmZHamxUZjFFcE1MSk5nTWsgcGtoODIzUUljbDdZa3Y4QUVET2R3NHNVK3VEUjdjRWRzN0crZEMrQS8zU3lUUXFhVU41cGZ5dzZQVU5CM0tScFUvUFpiNWdPa1VtQiBLc1ptWGJrK0JpQlExVFlBUUZGU1VSTWRjS29mQy9US1RNWWhQOUhHUTdHUW85czhxMEpDZHZnUkFEMmNiRGN3RkEvTkhMTXljRk95IGcyRGo4b252QUVqTE9YNEIwTU5LeEI1cHpZWUpiU0ZOaHg4RWRMT1RiVkp3S1BTcVUvM3NuT0xIemdWUWxNRTQ3cUI0R2F0SHhVM0ggeUtSQUZXTkhCWEVSZEFnVzdqN1pEOHFYanVzQWxTOWtPQS81aHZXRHI1WlVIM2F5eFRuMWhWOFRJT3BrbXdIeWNaYVYrSkhwRUpRKyBhdWw5QUhhYnp1RkZBb25tbGxSKzFjazJHMWJmMlN3S0hxcE95YnFyNzdpbEp6MGl3Vkw3U3dqZ2Rib0lYalNkSWRPQzkwZFdDZHdmICthaHA5NjhaM3Y3NEIwUHRtLzhmT0FKQnlWQzgzbVZQNTRWT05qbjdxY0tMQU9XMG55UUo4Sk03eHF6a0doWWYyN3hzeWg1QStCNUoga3FqOExMZXc4aUluMjJ6SWlUd0s0SFVuMjZUQTZCYUpIL2pTOFEvMkhiZTBBd1JuM0EzYmoyeVI5YVl6WkZyZ2lqR1ZSQkJIeGdDZyBlNmVET1orWWV6eG5aVW1lcXZ6QVZDRHlOb1YrdDdSMGNjS3A5aDVZWHB3dENWMEFvSjFUYlFiTXBrT3gwRzlNaDZEMDY5UXA5QUFnIEcwem44S2gyWXVHeC9KRnpuZnVjV1Z5YUVPRDdqclZIQVdQL01IZnN3b0hIUHBJVjN6OFR3R2wzV3ZRcks2NkJHelFKWERHMjlkbnIgM2dhdzMzUU9Fd1Q0enI5R3grYXVHdGxPRS9GS0FHYys0NExvUk0vTmpOWXRjYkxCZG1IN1J3QXVjN0xOSUJIVmJ6azlaWlRjNmZYRiBwUzJxOW5kTjUvQ3dpOUUrKzRkT050aFFQZWtKQU04NzJTWUZoWFFRMjVwL1h2SHliT0RJcUpnQzN6S2R5cEQ5RFNQZUNkeWE1OEFWIFkwZlAzWG5KZEE1RHpzNDUwT25yNWV1R1JlS0o3UGtRakRBZGlMekpFbkgwUW5CMmJjR05Jc3B6bEpMM3QrblJ1c1dtUTFEbWJGNHggWlRHQXY1bk80VlVLL0Z0K2NlV056clVvcWlyZmM2NDlDaGE5dGdWNzVtSGtxbkFrZHVBYkFQcVlUbVRJU3dqZytaaUJLOFlBUUJHOCB4WUgvUytTSDFwNGViMEoxZ3VrbzVFMEsxRTRiVTdQS3FmYm1yaHJaVlVUbUk2Q2ZSdzVJUUN4SE55VWdiN0JzNjJzQUhKc3FIRENXIFF1Zm4zekszcTFNTmJsNHhhU1VFOVU2MVI4RWlrRnZ6Mm4vMEprUUR2Q0ZNOEtZb0FvRzkrQW5zSmg0QUVBWndydWtRNUYwaFZVZnYgL3NialdiOEZrT3RrbTBFaVFQbU1NU3RlTloyRE1tOVR6Y1JYRk1yeitKSW11WG80KzdlT3RnamgyakZLZ1o2SEk5ZHBnYVNLRjB4biBNQ0dReFZnaUxvSDhZeE01NEcvVG9uV09iWUl6dTY3d2N3Q21PTlZlNEFqMkpNSXRBYjZMU3JZZCtSNEE3cUNadkNuNVJaV1RuR3FzIFlmbWs1d0Y1MXFuMmlJSWtISWtFY3QxbElJdXh1NHRYTkFEWVlUb0hrZGNveExFRG5oK3BpWjRqd3J2NktiSDEzbG1qVnU4MEhZUE0gMlZKVHVsc0JSemVqQ0JvVlBIaHVkTkU1ampVb2NPeHpraWhBdG0xY1docklBOVFEV1l3QmdBSXZtODVBNURGTjdXeGQ1a1JEWldWbCBWaUtFUDBDRHVYV3ZRMTdiR29tVm13NUI1bTF1T3ZzaEFQODBuY1BEdXNWRCtnZVVsVGx5VFhUb1VHZ0pnR1luMmlJS0RBM3VkWGxnIGl6RVJlZGQwQmlKdjBlZW5GdFllZEtLbGZpUFdmaDJLbTV4b0s2Z3NrYStWalZvZE41MkRYR0QxcUxpcTNHTTZoc2ZkbFBmOEJWOTMgb3FFZHEwc1BnTnZjRTdXTklMRFg1Y0V0eGxUZk01MkJ5RXRFckFZbjJxbW9MeG9LMFo4NDBWWmdLZjdvNUk2VzVIMUhkdktUUDV2TyA0WEUvNlYreTRCSW5HaEtnMFlsMmlJSkNKYmpYNVlFdHhtd1dZMFJ0WXF0OVZxcHRsQzhkMXdGcUx3U1E3VUNrUUZKZ1h6d1U1eWdJIG5TQWN4ejBBOXB2TzRXSFpJYlVXOUo5UTFUN1ZoaFNhOHVjbFViQUU5N284c01VWXJOQ0hwaU1RZVlsQUNuNWZXM0Irc3E5WGhWalogaCtjQnVOakJXSUVqcXQrOWUvUlRXMDNuSVBkNXIzYlMrNnJjV2oxRlE4TUhFd3M3SnhFQUFDQUFTVVJCVlBNQWxXUWJHRmp5MkFXQSBqSEV5RkpIdmlRVDJ1ank0eFJoaWUwMG5JUEtZckpESWl2SzZNVzJleGxPK2Jsams0ZnBvT1FTZlQwZXdBSGx1NjVwckh6SWRndHhyIGMwN29RWlZnbnRYakZGV2RrRnV5NkNHTVhOWG04NTRHRkZVT1RhaGREU0NTaG1oRXZtWEg3Y0JlbHlkOTU4ZnI1cTRxNlJPUHh3TmIgaFJPbDRCQ0FYMWp0MjkwLzdib2xaNXdTTldkbDRkV3c4VDhLdlM0RDJmd3Nac01lTnF1Zy9qWFRRY2pkQmhRK2RxbHQyZXNRNE1OaiBuU0NDcHlXaC83YXBac29aaTl0QjR4L09PUnh2OTAxVitROEFLVTl6SkFxYWNDTGUrNzNhcWR0TjV6QWhzTVhZL1d1R3Q4ODVtSFBJIGRBNGlEOXNQNEMrQXJJVElQK3k0N21nWGpyYzAyVmIzc0dXZHE3Q3Znc3A0QU1NUTRNOGFwNmppUDJkR2E3OXJPZ2Q1UTM3eG9wOHAgOUZ1bWMvaUFBbGdQNkJJUmVURnU2WHZhRk44ZERsdFpsb1RPVXVCeWhZNkd5R2NBZERJZGxzaXJJdWphYmtOMXlXSFRPVXdJOUFWUyBSVjAwZ1VCUDFTUWlqOWl3ditQK29kOFlzYmJKZEJEeWhyN2psbmFJeFBlL0N1QmMwMW1JaU00ZzNsZzlPYkJUZTROZWlDUk1CeUFpIE9nTVYxUyt5RUtPMitHRHB1RU1xdUJ0SFJuYUlpTnpNTmgzQXBLQVhZNEgrNHhPUis0bklBOU9qZFN0TjV5RHYyYng4Y2gwZ0Q1ck8gUVVSMEJvRWVIR0V4UmtUa1VncDlZMStIZmQ4eG5ZTzhTNXFhLzEwQWJ2cENSRzRXNk92eG9CZGpnYTdFaWNqVkRrTXhoZE1US1JVTiBxKzlzVnNnZEFGcE1aeUVpT29WQVg0OEh2UmlMbXc1QVJIUXlJdnFEbWRHNmY1ak9RZDdYV0QzcFpWSGNaem9IRWRFcGNHUXNxRFRnIC8zNGljcTJuTysvdStqK21RNUIvTkZ6enppOEFyRGFkZzRpSVBpblF4WWdFL045UFJLNjBWNnp3N2FXbGl3TTliWU1jVmxabXgySGYgRG1DUDZTaEVSTWNKbVE1Z1V0Q0xrYUQvKzRuSWJWVHZuajU2ZWFQcEdPUS9XNnR2MndMb1Ywem5JQ0k2VHFDdnh3UDlqd2NRTmgyQSBpT2hmVkZFK0kxcTN5SFFPOHEvRzZpa0xvWmhqT2djUjBURTRNaFpnUWYvM0U1RkxxT0NWU0tUbEh0TTV5UDhTT2VHdkFualZkQTRpIG9xTUNmVDBlMkgvOEE4dUxzOEdSTVNKeWh3T2F3TVE3UjYxdU5oMkUvRy9MNHRLbVJFZy9EMkNmNlN4RVJBQ3loZzByajVnT1lVcGcgaTdGSUtOSEZkQVlpSWdDQTZ0MnpDbXZmTWgyRGdtUExrMVBlVmNFTTB6bUlpQURnbzY3dE9wdk9ZRXB3aXpHVndQN1JpY2hWSHBvUiByVnRnT2dRRnorYmxrNnRVVUc0NkJ4RlJPQlRjNi9MQUZtTXF5cEV4SWpMdDFmMGQ5My9UZEFnS3JpenQralZBWHpLZGc0aUNUY0toIHdGNlhCN1lZRTlHdXBqTVFVWEFwc0U4UzhybHZqRmpiWkRvTEJkZUc2cExEQ2R1K0ZWdy9Sa1FHcWFDYjZReW1CTFlZczRGelRHY2cgb3VDeVZLZFBMNnJaWURvSDBaYWEyemR3L1JnUm1hUjJjSy9MQTF1TWlVaWU2UXhFRkZpL21SNnRXMnc2Qk5HL2JGNCt1UXFxRDVyTyBRVVRCSkdybG1zNWdTbUNMTVdod0szQWlNa2xmYklxRi90MTBDcUxqOWR4eDRPc0ExcHJPUVVUQkl4TGM2L0xnRm1OQVlDdHdJakxtIFk5aHk2MWRMcWcrYkRrSjB2UFhyWjhWQzRmQkVBTHRNWnlHaVlGSFZ3RjZYQjdjWUV3dzBIWUdJQWtWVjlZNFpoYldiVEFjaE9wV04gUzBzM2krZzBBR282Q3hFRlNJQ3Z5d05aakpVdkhkY0J3QURUT1lnb1VQNTdaclJ1aWVrUVJHZlNzSHpLRTFEODBuUU9JZ3FVYy90UCBxR3B2T29RSmdTekdwSDNzSWdUMDMwNUVSanpYWlUrWDc1c09RZFJhamMxbmZ3dVFaMDNuSUtMQUNGbUhZa05NaHpBaGtBV0pwZllsIHBqTVFVV0RzRmlzOHNiUjBjWXZwSUVTdHRucFVQSTdFUkFBN1RVY2hvbUN3RWdqazlYa2dpekVidU5oMEJpSUtCSVhxN2ROSEwyODAgSFlTb3JiWlczN1pGZ2J2QTlXTkVsQUVxRXNqcjgwQVdZNklzeG9nb0EwUitOeU5hdDl4MERLSmtiYTZldkZTaDVhWnpFSkgvS1pRaiBZMEdnQ29HRkswM25JQ0xmZTlOdXl2b1AweUdJVWhVUGQvNG1CRytaemtGRS9pYVFLd0VWMHpreUxYREYySno2TVlPaDZHWTZCeEg1IFdrekZ1bVBXdUtXSFRBY2hTdFVIUzhjZFFzS2FBb0RySG9rb25ib1BMSG44Zk5NaE1pMXd4UmdRdXNaMEFpTHl2ZS9OSExQaVJkTWggaUp6U1dEUHhKVkhjWnpvSEVmbGJIUG9wMHhreUxYREZtR3J3L3NoRWxGRlBkOW5UNVg3VElZaWMxbkROTzc4QThKVHBIRVRrWDJMYiBnYnRPRDF3eEpvTEEvWkdKS0dNT2lCVyt2YlIwY2NKMEVDTEhsWlhab2pJTndFSFRVWWpJcDBRQ040TXRVTVhZL0pwb1IzQmJleUpLIEV3Rit3RzNzeWM4YVZreHFBRGhka1lqU1ptamZjVXM3bUE2UlNZRXF4ZzViMWxVQXdxWnpFSkVQQ2RaMzN0UGxBZE14aU5LdHNlbnMgWHdONDJYUU9JdktsU0RpMi93clRJVElwVU1XWXFONWdPZ01SK1ZJQ0Njemk5RVFLaE5XajRyYklUQUQ4NzUySUhHZFp1TjUwaGt3SyBWREdtQWhaalJPUTgwVi9OS0t4ZGJ6b0dVYWE4djN6U09nRithem9IRWZtUHJialJkSVpNQ2t3eFZyNXVXQVRRNGFaekVKSHZmSmlkIEVLNmhvY0RKampUZEMrQWowem1JeUY4RXVCWWpWd1ZtV1ZGZ2lqSFoyK01xQUlGYUVFaEVHU0FvbTFwWXk5M2xLSERlWGpKdHYwQi8gWkRvSEVmbE9wM1BhYmIzY2RJaE1DVTR4Wm5PS0loRTVUZDdaR21wNXhIUUtJbE1hbXZwV0FIalRkQTRpOGhkTFFvR1pxaGljWWt4WiBqQkdSMCtRN1phTld4MDJuSURKbTlhaTRRbjVnT2dZUitZc2dPSnZ1aWVrQW1WQlZOU0cwdDl2ZVhRQzZtTTVDUkQ2aGVHRjZRZTAxIElsRFRVWWhNeXl1dVhBT0E2N0tKeUNsN0d6dUZlMkJ4cWU5M2JRM0V5TmplTG5zdkF3c3hJbktRQmIyWGhSalJFYUw2UTlNWmlNaFggdXVRZFNBdzFIU0lUQWxHTWlZVlJwak1Ra2EvODQ2NkN1anJUSVlqY29tSEZsQm9BUE42QmlCd2ppcEdtTTJSQ0lJb3hCVWFiemtCRSBQaUw0Q1VmRmlENUpCYjh3bllHSS9FTXREY1QxdSsrTHNhcXFDVmtBcmpPZGc0aDg0NzB1dTd2OHhYUUlJcmZaM0RIOEp3WGVOWjJEIGlIeENjY093WWVVUjB6SFN6ZmZGMkw0dWU2OEIwTWwwRGlMeUNjRi9scFl1OXYyQ1lxSTJXMXlhQVBTL1RjY2dJdC9JMmRHcjQ5V20gUTZTYjc0c3h0WENUNlF4RTVCdGJtMXBDQzB5SElIS3JMSFNiQitBRDB6bUl5Q2MwTk1aMGhIVHpmVEVHd1BkL1JDTEttSWUrV2xKOSAySFFJSXJmYVVGMXlXSUZ5MHptSXlDZEVmVCtvNHV0aTdNRlZJenNCOFAzd0poRmxSQXNrTWNkMENDSzNpeVRpdndmQW14WkVsRElCIHJqbHJaSld2bHh2NXVoakxqbWZmQ01EM0MvK0lLUDBVK3ZpTU1TdTNtYzVCNUhidjFVN2REdWlmVE9jZ0lsL0k2dGdoN3V1TitIeGQgak5rSXhwYVlSSlIrYXN1RHBqTVFlWVpsOGYxQ1JJNVE5ZmYxdksrTE1lSDVZa1RrakpkbUZkWStiem9Fa1ZjMExwdTBCc0E2MHptSSB5QS9FMS9zLytMWVllNmdtMmd2QUphWnpFSkgzaWVBQjB4bUl2RWNlTXAyQWlIemgwdk9LcTg0eUhTSmRmRnVNaFVNWUJVQk01eUFpIGp4UHMyZGRoZjVYcEdFUmVrK2dVV2dSZ3Ira2NST1I1MGlMeFVhWkRwSXR2aXpHL0Qya1NVYVpJNVRkR3JHMHluWUxJYTdZc0xtMVMgNkNMVE9ZakkreXdWM3k0OThtOHg1dlBGZmtTVUdiYmdFZE1aaUx3cVpHT3U2UXhFNUgzcTQwMzVmRG1OYjg3S2tqeTE0dzJtY3hDUiA1NzAybzZCMnFPa1FSRjZXVjF6NUNnQytqNGdvTlluNHdNYmFxWnRNeDNDYUwwZkdiRHNSTloyQmlIeEF3RU9laVZJa0tuOHduWUdJIGZNQUszV1E2UWpyNHNoZ1RIdzlsRWxIR3ROaWhsa3JUSVlpOExoWnJtUS9nc09rY1JPUnhsai9YamZtdUdGT0ZBUER0aml0RWxDbjYgMTFtalZ1ODBuWUxJNjdhdXZHTVhnQ2RONXlBaWoxT01CdFIzUzZ4OFY0ek5XVmwwQ1lCZXBuTVFrYmVweUtPbU14RDVoUUFMVEdjZyBJcy9yMWI5azRjV21RempOZDhXWUlzRXQ3WWtvTllJOVhYZDNxVFVkZzhndk9uWUtMd2V3MjNRT0l2SzJzRnErbTZyb3UySk1mSHdPIEFSRmxpR0p4YWVuaUZ0TXhpUHppOWNXbExSRDVpK2tjUk9SdEN2OWQ1L3VxR0N0Yk5US3N3SFdtY3hDUjExazhxSmJJWVdxRDd5c2kgU3BIZU9HeFllY1IwQ2lmNXFoanJINHQ4U29ET3BuTVFrYWQ5MEdWUHp0T21ReEQ1emVacjNsNEZZS3ZwSEVUa2FUazcrM1MreW5RSSBKL21xR0FQOE40K1VpREpMVkI0ckxWMmNNSjJEeUhmS3lteUlWcG1PUVVUZXByYjZhbjhJWHhWakt1ckx3K0NJS0hOc1N4NHpuWUhJIHI2d0UrUDRpb3BRSTRLdnJmZC9zMVYrK2RGd0hxOTNoM1FDeVRXY2hJbThTUWNPMDBiVURSYUNtc3hENVZWN0pvbzFRSFdBNkJ4RjUgVmtzc25OUHRnNlhqRHBrTzRnVGZqSXhaN1E5ZkN4WmlSSlFDVy9FWEZtSkU2U1d3bDVyT1FFU2VsaFZ1MlRmQ2RBaW4rS1lZVXh1aiBUR2NnSW04VGJyMU5sSDYyeGZjWkVhVkVMTXMzMS8yK0tjWXM4ZGY4VVNMS3VPMWRkbmRlWXpvRWtkODE1SVNlQnJERGRBNGk4akpsIE1lWW1Eejh6UGtlQllhWnpFSkduL1pXN0tCSmx3T0xTQkFCT1ZTU2lWRngxWHZFQ1h4eG41WXRpVEE4Mmp3UVFOcDJEaUx5TFV4U0ogTWtmRjV2dU5pRklSanRtaDYwMkhjSUl2aWpIYjRub3hJa3FlQXZzNjcrNzhsT2tjUkVGaEhZclZBemhnT2djUmVaamxqNm1LdmlqRyB3UFZpUkpRQ0M2Z3JMVjNjWWpvSFVWQTByTDZ6V1FEZUFDR2lGTEFZYzRWNTlhTjdpT0lTMHptSXlNTlVWNWlPUUJRNEl0V21JeENSIGw4bGxmY2RWOWpTZElsV2VMOFlPYTNna2ZQRHZJQ0p6TkJKbU1VYVVZUUtieFJnUnBjS0t4TVR6NjhZOFg4U0k2ZzJtTXhDUnA3MDIgWTFUMUZ0TWhpSUptMC9JcGpRRGVOSjJEaUR6TXNsbU1HV2ZoV3RNUmlNaTdWRGxWaXNnWUJkOS9SSlEwaFhpK0R2QjBNVGEvSnRvUiBpa3RONXlBaTd3cFo0QlJGSWtOVWxjVVlFU1ZORkpmM0hiZTBnK2tjcWZCME1SWUx5ZFhnK1dKRWxMd0RPYnM3UDJzNkJGRlFaVm5kIG5nWncwSFFPSXZLc1NGWjgvMVdtUTZUQzA4VllRdFh6UTVORVpOUXozTktleUp3TjFTV0hCVmhqT2djUmVaZkMyL1dBcDRzeEFkZUwgRVZGSy9tWTZBRkhRS2QrSFJKUVNiNjhiODJ3eFZsWldaa0h3S2RNNWlNakw3TldtRXhBRm5mSjlTRVNwR1lHeU1zL1dOSjROZnZhMSB6MXdFUlRmVE9ZaklzdzdZM2Zhc054MkNLT2h5T21XOUNLNGJJNkxrZGMxZGU4R0Zwa01reTdQRm1HakkwME9TUkdTYVBEdnJ5dlV4IDB5bUlndTcxeGFVdEVLdzFuWU9JUE16eTdyb3g3eFpqb3NOTlp5QWk3eEpScmxNaGNndkZhdE1SaU1qTFpJVHBCTW55YkRFRzRHclQgQVlqSXUyeGJ1WU1ia1Z0WWZEOFNVZkxFdzNXQko0dXhCMWVON0FUZ0F0TTVpTWl6N0ZDSDlpK1pEa0ZFUjdRTE5hOERZSnZPUVVTZSBOV2pRK0lkelRJZEloaWVMc2V5V3JDdmcwZXhFWko1QzM1cDIzWkw5cG5NUTBSRnZMNW0ySDRKM1RPY2dJcyt5bWxyYVgybzZSREs4IFdkQllHR1k2QWhGNWwwRFdtYzVBUkNmZys1S0lrbWVwSitzRFR4WmpLcmpDZEFZaThqQUJ0N1FuY2htRnNoZ2pvcVJaS3A2c0R6eFogakVFNU1rWkV5VlBoSFhnaTExRVdZMFNVUElVMzZ3UFBGV1B6YTZJZHdjMDdpQ2g1R3NwdTk1cnBFRVQwU2UwamgxOEZvS1p6RUpGbiBEZTQ3Ym1rSDB5SGF5blBGV0pObFh3NGdaRG9IRVhuV0I5eThnOGg5M2w0eWJUK0FEMDNuSUNMUENrVmkrejIzaVlmbmlqRlI4ZVFRIEpCRzVoT0J0MHhHSTZKUzRveUlSSlUrOHQ0bUg5NG94OGViaVBDSnlDVlZlN0JHNWxFRDQvaVNpRkhpdlR2QmNNUVpncU9rQVJPUmQgdk5namNpOFY1Y2cxRWFWQU9VMHhuYXFxSm9RQURES2RnNGk4UzVVWGUwUnVwYkI1czRTSVVqRVlaV1dlcW04OEZYWmY1MzBEQUxRMyBuWU9JdkV0VU5wdk9RRVFuRjBxRTN6ZWRnWWk4VERya3ZuaCt2dWtVYmVHcFlzeTI3Q0dtTXhDUnQ4V0E3YVl6RU5ISjJZangvVWxFIHFWSDFWTDBRTmgyZ0xVVEVVNzljSW5JZHU4ZmVMcnRNaDJpcjg0cVhaOGZzWGQwMWJQM3Z6QUNKaDdwcU9DRUFvQWdkRmlRT2hVSnkgTUpIUWxzMVh2YnNYWldXMnVjU1VEbVZsWlZhdksxL3NFbW5YbkJXQ2RMUVRWZ2NGc2dIQURvdEdOUEh4djU0Ymk0ZWFEdHZXN3ErVyBWQjgybDdqdGV1NDh0SE5ucnh3RklLYXpFSkZIcVRVRXdKT21ZN1NXcHo3c1p0Y1Z6QmZJN2FaekVKRm43WmhSVU52TGRJaGpuVk93IHFDOHNuQnNTSFFqQlFCVU1WTVZaQXZURWtmLzFBTkFwaWFZUEE3b05rSzJxc2wwczNhcUtiUUxab3FydkpHS3hON2V1dk1OemhhbGYgbGE4YTJSUHg4R0JMckVGUTlBZlFHMERmby8vZkQwQXZIQzI4MnVnQW9Mc0EyUUZncDBKM1FMREpnbXhNcVAxZVdHWGp0R2pkQjg3OSBTMUtYVjF5NUUwZit1eWNpYWpNRjVtMnVudndGMHpsYXkxc2pZNUFMVFdjZ0l1OVM2QTVUZlE4YlZoN1oyYXZ6eFFwY2FRRlhLblFZIGdJc0FiWGNrMi8rR2RPb3VXVFlndVFCeVJmU1lkaFVpUURncmdyeml5cDBpZUZNVmJ5bndHaXhkcy9sZzMxZXdlbFRjbVFoMHZMSlYgSThQbnhDS1gyWmFNRU1YRkNnd0c1RUxFdFNlQVkvNURjRXduUURvQnlBTUFnUUJIL25PQUJRdTJBQlYxMFNZSTNsQWI2eXpvT29pdSBUM1RiODg5WlY2NlBPWjZtTlFRN29DekdpQ2c1RnJ3MVRkRXpJMk5sWldWV3Yydlg3QVBRMFhRV0l2SW93ZDluakttOU1TTjlUYWdLIDVSOU1YR25iS0JKb0ZJSmhTRzVrSTlNT1F2RUNSSjRCWkcxem91WHYyMnFuSGpRZHlxdm0xMFE3Tm9keGcyVmpoRUt2QStRcWVPTjcgckJuQWVsR3BUYWpXZE52YlpWMXA2ZUpFSmpyT0s2NThHc0IxbWVpTGlIenBRR1AxcE02QU9IOTdLdzA4VTR3OVZGMlVIdzdibTB6biBJQ0lQVTlUTmlOWkcwOVY4L3dsVjdVTUhFNTlSdGNjTHBBQkE5M1QxbFVGTkF0U3I2aE5oTzdIMHZkcXAzR0RoREI2cWlmYUtpSTVYIGtVOERHQU9nbmVsTUR0Z2xpanFGTHRuZjZjQmZ2ekZpYlZPNk9zb3JybHdKNEtaMHRVOUUvbWVKNW05YVBxWFJkSTdXOE13MHhYQW8gTWNSRHRTTVJ1WkVnTFhmMjg0b3FoNHZJRi9SQS9GWUFYY1JmbjFYdEZSZ0hrWEh4VU5qT0sxNjBWc1ZlYkdXMXpHdjQ2NTBmbi9ubCB3ZkM3SjhkMmkyVEg3d0QwOHdDR0s4UlR1eFczUWc4VlRBUmtZczdCbkk5bjEwWWZGN0gvTUtPZy9qbW5PMUpvM0dmdklTTEtNRnREIFF3Q3dHSE9TaUF6eHhGZ2pFYm1aYzJ1aEpsU0ZjZzhtSm92cWR3QmNxR2xZN09OQ0ZxRFhpc3ExZWpqcnAzbkZsWS9aSWcrOXYzelMgT3RQQlRKbGRYM1NWYU9KdUlEWVJ3VGtIczZzSVpnSFdySXJhNk90cTRUKzc3dTd5bUZQVEdBWENOWXRFbENKN0NJQnEweWxhd3pQRiBtRUxQNWNnWUVhVkNuU2pHeXNxc3ZPZlBuNFFEOFhzQkRFbzlsVmRKQndCM1dhcDM1UlZYcmxQRnJ6Zm5oQmRoY1dsRzFoV1pWRlUxIEliUzM2OGVUSVBJMXFIMWxvTCtiQkJlSllzSGVibnUvVjFGYjhQOXRYWFB0NDJVcEhxc2dRQ0lRdHphSUtJM2tYTk1KV3NzNzB5alUgTzc5VUluSW4wZFNLc2J5eGkwYmtQWC9CSzRBc1FLQUxzUk5jS1lKSDh3N0VYOHN0V2pnQlVGOVdKNnFRMlhXRnBYdTc3WDBOSW84QyB1TkowSmhlNUVDS1YvYTVkODNKNVRmUlRxVFRreUUwVElnbzBoZTJadXNFN3haaGdvT2tJUk9SeGt0eEdDc09HbFVmeWloZitGMng5IEdzREZEcWZ5a3d0RnBDcXZlTkZMdWNXVjQweUhjZEtjbXVpNGlwWFJsd1g2T0FBZXMzSnFReTBMYStiVUYveXNiTlhJWkdmZmVHSFggVVNKeU1ZSGxtYnJCRThYWTBRLzBYTk01aU1qYkJOSzFyYS9wTjNwZWo1MjljcDRDNU4vZ2tjOU1GN2hNZ0NWNUpaVjEvUXNmUGM5MCBtRlQ4dnJiZy9JcjY2RXExc0VRVWw1ck80eEdXcW55clh5SnI1WndWaFczZlVWVFI1dmNwRWRFbmFSNG1WSVZNcDJnTlQxeFk1Q2JDIHVRQWlwbk1Ra2JjcHRFMFhlZjF2cnVvWHpvNDhBNTU1bEJ6Rm1KQVZlalcvcFBJN3c0YVZlK296dkh6ZHNFaEZYZlI3SVpGWG9keG0gUFNtS0creVEvZlRjVlNWOTJ2UTZZVEZHUkNtTDVPOVBuR002Ukd0NG9oaUxJK1Nab1VZaWNyRTIzSEUvcjNoQjU1QWRYd2JGNEhSRyBDb0QycXZqcHJsNDU2L09MRjF4ak9reHJQRnhmTk56YTArTWxBRCtHUDg0SU0wWWdRK0x4eFBLSG54bWYwNGFYZFVsYklDSUtEQnZ3IHhMb3hUeFJqQW1VeFJrU3BhOE1kOTVoWUQ0TFQwaHlqd0NVSzY5bmM0c3BmNW8rYzY4b0NaKzZxa2UzbTFCZit5bGI3R1hCdG9JUDAgY3Z0UTgyL2E4QUtPakJGUjZqeXkzNFFuaWpHMXVaTWlFVG1pWS9uU2NSM085S1Q4b29XRlVOeVdpVUFCWXdsd2o3YlBmajYzZU1FUSAwMkdPTmZ1cHdvdmk4YXpuVmZWcjhNaDNvNmNJN3Fpb2p4YWM2V2xuamF6cUJLQmpCaElSa2QrSk53WnpQUEdGdzVFeEluS0lvRjNUIEdXL3VLT1FIbVFnVFlFTUYxcnI4a2tWZk5CMEVBQ3Jxb25kTFFsOEVNTlIwRmwrelVYYW1wM1RLOXM1MjFFVGticGJOa1RIbkNFZkcgaU1nWm9uTGEzZjN5b3ZNSFFEQWlVM2tDckwycVBwUmJ0T2l2ZmNkVjlqUVJvSHpWeUo1ejZncWZBUEE3QU8xTlpBZ1V3WWp5bGNXbiAvVDVQV0hwK3B1SVFrYjhwcHlrNmlTTmpST1FNa2RNWFl3aEZQcGVoS0FSQVJEOGRpZU1mZWNXVkdkMnhjRTV0d1dncm52V0tRc2RuIHN0K2dFNDEvK3ZUUDRNZ1lFVG5HRTU4bnJpL0dmdmZrMkc3Z3prcEU1Snd6bkh1bG50anh6MmY2QWFqTEsxNzBvM1NmQzFOVk5TRlUgVVJmOXNZclVBdWlienI3b1JBTHJ0Tzh2RVlzalkwVGtsRzREeDFTNXZvWndmVEVXeWo3YzMzUUdJdktWUVdmNCtXVVpTVUhIc3dDOSBOKzlBck9iYzZQeGU2ZWlnb241MDc3M2Q5OVlDK0I0ODhQM25SNko2K3ZlWDZwbmVuMFJFclJZUHhWMWZSN2oreTBnc3kvVy9SQ0x5IGxHRmxxMGFHVC9xVGthdkNBQVprTmc1OWtveU9oOEl2NVJaVk9uclFka1Y5NGZYUTBFczh3TmtzQlFhV2xaV2Q5TnJqeU1IZ2VrV20gTXhHUmYxbWlycThqM0YrTUtUeHhlallSZVVhbnZySElTYytReXUrd295Yzg4TGtZQVAxRXNDcS9aR0VaVG5IaDNscXFrTm0xQlYrRCA2a3B3V3FJYmhNNitjWFgzay8xZ2UrL09sd0p5eHFNbmlJaGFTd0VXWTZsU2FEL1RHWWpJWDBSaytNa2V0eFB4SHBuT1FxY1VWcFg3IDhwNi80RS9KenZtZnUycGsxNHI2Nko5RjVGY0FJZzdubzJTMVpKMTA5MHhMYmE3WEpDSkhLZHcvdzg3MXhSaFVYUDlMSkNKdlVlaEogaTdHUUlLMmJSMUJTYmtsRTRxOE1LRng0ZFZ0ZU5MdTI0TEo0UE90RkFXNUpWekJLVGlRVU92bTFod2lQbENBaVI0bTRmMURIL2NXWSBCNFlYaWNoYkJDY2ZHWXVITER2VFdhaFY4bXhML3BaWFVqbTlOVStlVTFzd1hVVFc0b3c3WjVLN0NFZkdpTWhaSGxqdTVJRml6UDBMIDc0akljODZiczZMd2hBdDFqY2VhVFlTaFZta0hSVVZ1Y2VVZitvNWJldEoxUmVWTHgzV29xSXZPVTVFS0FPMHluSTlhS1pGSU5CMy8gMklDaVJ3ZEJsWnZuRUpHenhQMkRPcTR2eGdUaStvcVdpRHdvcE9PT2Y2aGpkc3MyRTFHbzlRUzRJNUxZdno2M3NQS2lZeCtmWFQvNiBBcXZkNGJVQXBocUtScTFrdDJTZjhENnpFZUxoMjBTVURpekdVckZnZVhGbkFEbW1jeENSLzZqZzV1TWZlM3ZKdFAyQUhqS1JoOXBBIE1WZ3NyTTB2V2pnUkFHYlhSeWVLaHRZQkdHbzRHWjJCQXZ0bWpWdDY0bnRNTU5aQUhDTHl2NjVuamF6cVpEckU2Ymk2R0R2VXp1YW8gR0JHbGgrTDZ1YXRHZGozeEIvSm01c05RRW5KVVpORU5NKzUvTXhFTEx3SnYzSG1DQlp6dy9zb2R1N0FiZ0dzTnhDR2lBT2lZNWU2RCBuMTFkaklYaXR1dDNRQ0VpejRyRTR0blJrenorU3NhVFVOSWF0L1FaUEwrcUNIdjN1ZnJHSi8yZlY0OS93RXBJRVlDVEg4Uk9SSlFpIDIrVUhQN3U2R0ZQaHR2WkVsRDRDKzlZVEhsUmRZeUFLcGVDRGozcGl6b0p4ZUdjakoxTzRuVUxXbnZDWW9OUkVGaUlLQnN2bG0zaTQgdXhnRHpqYWRnWWo4VEc2ZVZ6LzZFd2M5aXhWWkJvQmIzSHRNVTNNMkZqOXhFNTU2ZWhnU3RxdS8yb0xNanR1NjdOZ0grbzZyN0FtZyB4RkFlSWdvQ1MxeGRUN2o2RzB1aGZVeG5JQ0pmeTJxeHJZbkhQdEN3dlBRakFLdk54S0ZVcUFyV3ZIZ0pIbGw0TTdidjdHWTZEcDNvIHFic0xhN2NmKzBBa3JoTUJaQm5LUTBTQjRPNTZ3dFhGbUtpNCtwZEhSSDRnSjJ5RmJzSDZ1WWtrNUl4dE83cGp6c0p4K1B2YXkyQ3IgbUk1RFI2bklTZDVYY2tmbWt4QlJrTmlLM3FZem5JNnJpekdJdTM5NVJPUURncXNyNnNaY2VPeERtNm9uMWtLdzdGUXZJZmV6RXhiKyB2dll5UFBwNE1mWjh6STBXWGVESm1XTnE2bzk5SUxkNHdSQUFWeHJLUTBRQklSQlgxeFB1THNaYy9zc2pJcDhRbVhiOFF4RU4zNm5BIHV5YmlrSFBlLzZBWEtoNzlOTmEvTWdqS1VUSlQzcmJETFhjZS82REF1c3RFR0NJS0dJR3JaOXE1dWhqam1qRWl5Z2lWNlE4L00vNFQgd3ljYnFrdDNSQkx4NjZCWVlTb1dPYU1sRmtiMXl1RlkrTWNvZHV3OHlkRnlsRTdMUTdIUTliTkdyZDU1N0lQbkZTL29ER0M2b1V4RSBGQ1F1bjZibzJ0dUU5NjhaM2o3bllNNGgwem1JS0NqazZ6TUthbjUxc3Ava0YxZmVDT0F1QllvQTlNcHNMbktTWmRrWU52UWQzRERpIFpiUnZkOWgwSEwvYUxpTExrZEM1MHd0ci8zNnlKK1FYTGZxNml0NmY2V0JFRkVnYVFkZjJHNnBMWFBtaDc5cGlyS0ltT2dBV05wck8gUVVUQklJS0dMYUdXODh0R3JZNmYrbGtxZVdNZkg2eUp4TVVRdVJEUUlTSXlHSXBCQU5wbExDeWxySDI3dzdoaHhNc1lOdlFkV0JaUCBNa2hTTTRDM0FMd3RLbThBOXBzcStzL3BZK3JmRW9HZThsVWpWNFh6Mm4rNEFVQmVwb0lTVWJDRnd1RzhqVXRMTjV2T2NUTHVQZkhlIHNudTdmQllsRWZtSUt2TDd4ck0vQzZEcTFNOFNiVnlHTndHOCtZbUh5OHFzL09jRzVZcklCU3IyTU51V1Q0bm9jSEFVemJXYW1yTlIgODlRMWVPblZ3U2k0OFFVTXpQdkFkQ1MzMjZiQVdnR2V0MVJmYWttRTN0bjIvRFdieThyS1RxaGtaNXlob2Z4MkgwNVFGbUpFbEVIYSBFdXNEZ01WWVc0aFlmZlRVOTlXSWlCd25xdC9FYVl1eFV5Z3JzeHVBQmh6NVgrM1J4Nno4RndaZHBZcnhnRTRCTHo1ZGFjZk9ycWo4IFV4VG5EOXlDRzBhOGpMTjc3VElkeVUwMkFhZ1VTNVpzZVhyNHVoTUxyK1NXVTZyZ202bEhJeUpxdllUbDNrMEJYVHROY1U1OXdTeFYgK2IzcEhFUVVMS3I2NlpuUnVpV09ObHBXWnVVOVA3Z1FZbjhaaWhLNCtMTTN5RVFVNXcvY2dodEh2SXplWiswMkhjY1VCYkJNUkI3YyA4c3p3MnBPTmZLVWlyMmpSWnlENlp5ZmJKQ0k2RTRYTTNGdzlxY0owanBOeDdRVkJSVjIwRE1COXBuTVFVZUM4dlRYY2N2SHAxNDRsIGIwQlI1VkMxNVB1cStubTQrRE00eUVRVTV3M1lpaHVIdjR3K3ZRTXpVcVlBbHFsWVA1bzVac1dMYWVsaFFsVW83MEQ4VlFCRDB0SSsgRWRHcHFOemJ1R0xTajAzSE9CblhUbE1FdERldlU0aklnRUY5NDlsM0FrakxIYlJOS3lhL0NxRDBuSkpGVjFxS1h3RjZiVHI2b2VTcCBDdDdkMkI4Yk52WERlUU8yWXVTMUwvbDhwRXhmVkV2dW1UbTZkazA2ZThuZkg1K3V3a0tNaUF3UTkyNXY3OXBxcDZJKyttY29QbU02IEJ4RUYwZ2QyYy9iNXM4WXRUZlB4R2lwNXhaV1RBZmtGZ0w3cDdZdVNKUUNHRE42STZ6NzFDczdxc2RkMEhDZHRoZXEvVHkrb2UreTAgdXg4Nm9IZDBmc2Qyb2ZDN0FNNU9aejlFUktmd3g4YnF5Uk5NaHpnWjZmOGxRUUFBSUFCSlJFRlU5MjVYYUx1M2dpVWkzK3RydFR2OCA3K252UnJTeGVzckNVQ3c4UkFYbFFIb3ZpQ2s1Q3VEMXR3Wmk5cnpQb09xSjBkanl3Vm1tSTZWS0FmMjlEZnVpR2RHNlJla3V4QUNnIGZUajA3MkFoUmtTR0NFZkcycTZpTHZvdWdQTk01eUNpd0dxeFlWODVxNkQrdFV4MW1GdTg0RnFCVlFIZ3drejFTY2s1cCs5MkRMLzYgTlp3L1lBdEVQRlZEYjRDTldUTUthNS9LVkllNXhRdUdDS3oxNEZsOFJHU0s0SzNHNVpOZCtkM3EzcEV4d1BPM0hvbkkwN0lzaE9hViByeHNXeVZTSG02dHZlN2JuOXYyWEt2VGJBRm95MVMrMTNmc2Y5RUxWWDBlajR0SHhlUFdOYzJIYmJ2NDZCUURFUmZUbjRYRExKWmtzIHhEQnlWVmhnelFNTE1TSXlTZDFiVjdoeVpLeDgzYkNJdGFmSFliZzBIeEVGeXZkbkZOVCtKTk9kOWk5WmNJa0ZhNDRvcnM1MDM5UjIgWFRvZndEVlgvaE9YWHJRQldaRzBiTVNaUE1VTHR0alRNem5LK3k5NXhRdnZCZVJIbWU2WGlPZzRkbU9uY0JZV2x5Wk1Cem1lSzR1ZCB1YXRLK3NUajhROU41eUFpQW5CWVZhK1pHYTM3UjhaN25sQVZ5ajhRLzRvQ1B3WFFQdVA5VTV0bFo3Zmdrc0h2NFlwTDMwR3ZubnRNIHgya0M1THRkOW5UK1RXbnA0b3hmZ09TT1hUaE1iRmtESUN2VGZSTVJIUytjaVBkK3IzYnFkdE01anVmS1lxeThic3dsRnF4WFRlY2cgSWpwQ0cwT3g4RlYzbFZUdk1ORjc3dGlGQThXMjVuTWJmRzg1dTljdVhENzBiVnd5WkNNaTRVeVBsdW1MdGkxVFp4WFd2cFhoamdFQSAvVWJQNnhIT3pub1JxZ05NOUU5RWREeUZmZEhtNnR2ZU1KM2plSzZjNUI2V1VFL1RHWWlJL28vazJSSDd6K1ZMeDNVdzBmdm1aVk0yIDl0eStiNVFBUHdMZ3NqbHdkQ29mYnUrQjVmVWo4T3Z5VXRTdXZobzdkblhKUkxkeEFEL2NHbzZOTUZXSTlZN083eGlPUkphd0VDTWkgTjdGZ3VYTGRtQ3RIeHViVUZreFFrU3JUT1lpSWpxVkFiU3pjOHJrdmoxcDl3RlNHQVlVTHI3WXRlUlRBQmFZeVVQSjZuN1ViUXdZMSBZTWdGbTlDdDYzNm5tMzliTEprNmZYVE5DMDQzM0ZwbmphenExTEY5L004S0ZKaktRRVIwVW9MUE55NmYvQ2ZUTVk3bnlwRXhGZUhJIEdCRzVqZ0RSU0NMcm1mSzZNYm1tTW15cW1mSkNMSnh6T1FTL0E4OGw4NXh0TzdwajFUTlg0TUZIUG9mWjh6Nk5wNTYrRXB1MzlrNTEgTjBhRnlJTjJjL1lWSmd1eEFTVUw4enAwaUQvRFFveUkzRWdnSEJscnJUbTFoVDlRMFIrYXprRkVkQXJieE1hTTZZVzFTMDJHeUM5YSBXS2dpandEb2F6SUhwUzRySzRiK1oyL0hPZjIyNDV4KzIzQjJyOTNJem03VjZRWmJMZFc3cGtYcmF0T2Q4WFR5U3haK1dsVm1BK2hsIE1nY1IwU21wM051NFl0S1BUY2M0bml1THNZcTY2QU1Bdm1JNkJ4SFI2Y21pVU16Nm1xbU5QUUNnZjJGVjk3REVIMUpCcWFrTTVEd1IgUmRjdUIzQjJyMTNvM1dzMyt2VGFoVDY5ZHFOamg2WmpuL2E0Sk9STDA0dHFkcHZLZVc1MGZxOVlLUFNBUUc0MWxZR0lxRFZFOUlHRyA1Vk8rWmpySDhWeGFqQlZXQWpySmRBNGlvbGJZcThCL3g4SXR2eksxbHV6aDJvSytmNnE1OGNkdnZwVS8xYmF0a0lrTWxCbGRPaDlBIGJ2L3RpVWc0Tm0vZFM0UHZmYjl1MGdjbWNnd2EvM0JPVTZ6OTF3WDRCb0NNN0V4Q1JKUWFyV3lzbmpMRmRJcmp1YlFZaTlZQkdHTTYgQnhGUkcrd1EwZjlHM0pxVGlaR0tSMnFpNXlSRVNpSDZPUURYQUpCdE83cmpUMC9laU4xN2VHMGNFRFlVejhIQ24rSnFWMjJ0dm0xTCB1anZzTjNwZWowZ2tNa01GM3dEZ3l2VVhSRVFuSTBCZFEvWGtxT2tjeDNOck1mWXlnTXRNNXlBaVNrSVRSQllpb2IrZlVWaTczc21HIHk4cktyUDdYclkxQ2NiZEN4d0k0WVJTc3BTV01KK3V2eFJ0dmNWZnhnRWtJc0F5Q2h4cXVmcWNXWldXMms0M25qbDA0VE5TNkc2cVQgd1FQSWljaWJYbTZzbm55RjZSREhjMmN4Vmh0OUg0TCtwbk1RRWFWQ2dIZHhaRjNQSDZjVjFieVNiRHZscTBiMnRPSlpkd0w0SW9DQiByWG5OK2xjR29lNXZWeU1lNTZ6RkFOb0l4ZS9qc2RnalcxZmVzU3U1SmxRR0ZENCsxTGJzQ1FxVUNuQytzeEdKaURKdVMyUDE1SE5NIGh6aWVPNHV4dW1nVGdIYW1jeEFST2VnalFGWXBzRW90ck1laHJMZG1qVnQ2NkZSUExxOGIwMFhFS3JZVW4xZGdMSkw0VFB4b2V3LzggK2NtUjJQMXhUa3JCeWJPYUFTd1R5R0lyRmxxeHNiNTA3Nm1lMkhmYzBnNWhlOStGc0swckJIb1RnRkVBZW1jc0tSRlIralUzVms5MiAzY2krNjRxeGg1OFpuMk0zTmU4em5ZT0lLTTFzQUpzQWZWOGhIMXNpSDZ1cUpaQ3VDaDJFSXlNUktaOEZlYmdsZ2o4dnV4SHZiZUprIGc0Q3pBYndyd05zQVByWkZiRkh0Q3FBYmdQNEFCc0NsWjQ4U0VUbWxYYVNwODl0THB1MDNuZU5ZWWRNQmptY2ZiTzdKcndNaUNnQUwgd0xtQW5Dc0FWSStjMzZ3T24rT2NuUlhEcmJlc1JPMVRWMlBkS3hjNjJqWjVpZ1Zna0FLREFFQ1U1NFVUVWZBME4wZDZBbkJWTWViRyBzcWU3NlFCRVJINWlpYUpvOVBNb0diTUdsdVhvdmc1RVJFVGVJVm5kVEVjNG51dUtNUTJKNjM1SlJFUitjTVhRZDNEckxTdVJuUlV6IEhZV0lpQ2pqVk5SMWRZYnJpakhMdGwzM1N5SWk4b3R6ODdmaTlna3IwS2xqaytrb1JFUkVtU1Z3WFozaHVtSk1MWTZNRVJHbFU1L2UgdXpEMTFtcmtkRHBvT2dvUkVWRW11YTdPY0YweEp0Q3Vwak1RRWZsZDk2NzdjUHVFV282UUVSRlJnSENhWW10d0F3OGlvZ3pvM20wdiBKdDVTajZ4STNIUVVJaUtpOUZPNGJ0REhkY1dZYll2cmZrbEVSSDdWcC9jdTNGTHlOL2NkT2tsRVJPUTBidUJ4WmdMME1KMkJpQ2hJIExqajNmZHd3NG1YVE1ZaUlpTktOeGRnWkNUZndJQ0xLdE9zKzlTcUdYTkJnT2dZUkVWRTZ1YTdPY0Y4eDVzS0ZkVVJFZmllaUdGLzAgRFByMDNtVTZDaEVSVVZwWUxNWmFwWXZwQUVSRVFSUU94ekZoM0ZQb25IUElkQlFpSWlMSEtTd1dZNjNBTldORVJJWjA2WHdRdDAxWSBnWTRkdU9VOUVSSDVqZnRtNExteEdNc3hIWUNJS01pNmQ5MkhXeit6RXRsWk1kTlJpSWlJbk9TNkdYaXVLc2JtcmhyWkRrRElkQTRpIG9xRHIyM3NuYnIxbEpiS3llQVlaRVJINVJ2aWlDVlZacGtNY3kxWEZtSlVJZFRTZGdZaUlqc2p0L3hHK01IRVpjam9kTkIyRmlJakkgRVFkakJ6dVl6bkFzVnhWanpTb3N4b2lJWEtSWHp6MjQ0OVpxZE8rMjEzUVVJaUtpbE1YakhWMVZiN2lxR0lOdHVhcFNKU0lpb0d1WCBBL2pDcmRYbzIyZUg2U2hFUkVRcHliSnRGbU9uWWdHdSt1VVFFZEVSSFRvMDR3c1RxekhpcW4rYWprSkVSSlEwR3dsWERmNjRxaGhEIFNGejF5eUVpb3Y5aldUWnV1bjRkSm94L0N1MnlXMHpISVNJaWFqTVZkODNFYzFVeEpod1pJeUp5dlVIbmJjWmRrNWVoMTFsN1RFY2ggSWlKcUUxVjFWYjNocW1KTWxTTmpSRVJlMEwzYlh0dzFhUm11R2ZZNnhIUVlJaUtpVnJMVVhZTS9yaXJHeEdXVktoRVJuVm80SE1lWSBHMS9FRnlZdFE0L3UzRzJSaUlqY1Q4VmRneit1S3Nac1RsTWtJdktjZm1mdndJemJsbURFVmYrRUpXbzZEaEVSMFNrcFI4Wk96Ukp0IGJ6b0RFUkcxWFRpY3dFM1hyOFB0UEpPTWlJamNUR3lPakoyU2FNUjBCQ0lpU3Q0NWZiZmppMU9md0UzWHIwTTRuREFkaDRpSTZCTkUgSld3Nnc3SGNWWXhCUXFZVEVCRlJhcXlRalJGWC9ST3pwdjRWNStadk5SMkhpSWpvZnluZ3FuckRWY1dZcmU3NjVSQVJVZks2ZGQyUCBTWit0UStrdEs5RTU1NkRwT0VSRVJMRFVYZldQdTRicFZDemw0bThpSWwrNVlPRDd5RC9uUXp6ejNHVjRidDFGc0pXYjRSTVJrUmtxIDdocjhjVlZscUtLdXlrTkVSTTdJaXNSeDAvWHJjTmVVSjVIYmI1dnBPRVJFRkZDY3BuZ2E0ckpmRGhFUk9hdFByMTJZZW1zMVNtOVogaWE1ZERwaU9RMFJFQVdPNWJQREhWZE1VYlVWSU9IdUZpTWozTGhqNFBzN04zNHIxcnd6RzZtZXZRRXVMcTc2T2lJaklwMVF0Rm1PbiBZbGxxS2RjU0VCRUZRc2l5Y2ZYbGIrREM4eHZ3OUhPWDRlVlhMd0JYRFJNUlVYcTVhMlRNVldGczVkYjJSRVJCazlQcEVFckdyTUdkIFU1NUUvNzdiVGNjaElpSWY0d1llcCtlcVh3NFJFV1ZPMzk0N2NjZXQxZmpzemF2Uk9ZZnJ5WWlJeUhsdTI2UENWZE1VQVNSTUJ5QWkgSW5ORUZFTXVhTUQ1QTdkZzdZc1hZODJMbHlBZWQ5WDNKaEVSZVppNnJONXcxY2lZQUlkTlp5QWlJdk1pNFRodUdQNFBmT25PUDJIbyBoZTlCZUFZbEVSRTV3SUs2cXQ1d1ZURUdjZGN2aDRpSXpPcWNjd2pqaTUvRzdSTnEwUHVzM2FiakVCR1I1NG1yNmcxM0ZXTXF6YVlqIEVCR1IrK1QyL3dqVGIxK0M4VVZQbzJPSEp0TnhpSWpJcTJ4MzFSdnVXak1tT014OWpZbUk2R1FFd05BaDcySHdlWnZ4M1BxTDhPd0wgbHlDUjRIb3lJaUpxUGVVMHhkTnlWYVZLUkVUdWs1VVZ3dzNELzRGWmR6eUJnWGtmYmpPZGg0aUl2SVRGMktseG1pSVJFYldDUXQvbyAxdlhqb2xXLy8yWWZFUlFEZU1OMEppSWljai9sbXJGVFU5RVcweG1JaU1qVmRxdkt0N3Z1NlhyNXpJTDZHZ0JvV0Q1NVJXUFQyWmNxIGRCWUFuaHBOUkVTbkp1NGEvSEhWbWpFTGFPYVNNU0lpT29rWWdMbDJ1T1Y3czBhdDNubkNUMWVQaW04R1p1ZmZNcmNLaDl0OVc2SDMgQU1qT2VFb2lJbkk1ZDAxVGRGVXhaa01PQ0hmd0lDS2lZd2hrU1Z6dGYvdGl0TzdkTXoyMzRhOTNmZ3pnMndOTEhudkVWdnUvRkJpZiBnWWhFUk9RUkFodzBuZUZZcmlyR1lOczdJV0k2QlJFUnVjT2JhdUdiTTBiWFZMZjFoUnVYVDN3SHdLZnppaXR2Z3VCK0tDNU5RejRpIEl2S1loTmc3VEdjNGxxdldqSVZWZHBuT1FFUkV4dTFTMVh1NjdPbHl5Y3pSdFcwdXhJN1ZXRDM1cWNhcjM3bENvWGNBNE02TFJFUUIgRjByb2lWUGREWExWTU5UOWE0YTN6em1ZYzhoMERpSWlNaUlHMFFmYXQ0Ui9kRnRKOVQ2bkd4ODRwcXBMSWh6L0FRUmZBUkJ4dW4waSBJbksvQ0xxMjIxQmQ0cHAxWTY0cXhnQ2dvaTU2QUVCSDB6bUlpQ2lUZExYWThwWHBoYlgvVEhkUEEwc2V1eUJoMjcrR29DamRmUkVSIGthdnNiYXllM05WMGlHTzVhODNZRWJ2QVlveUlLQ2kyQXZMZEdRVzE4elBWNGRIMVpNVzV4WlhqQkhnQVFINm0raVlpSXFOY05VVVIgY05tYXNhTmM5MHNpSWlMSHhhQjRvQ1hjTW5oR1FVM0dDckZqYmE2ZXZEUVd6cmxJUkg4SXdGWG56aEFSVVZxNHJzNXczY2lZQWp0ZCBOM2VTaUlpY1ZBL1lYNTBSclgvVGRKQVBsbzQ3QktEc25PTEhIcldndndMMFp0T1ppSWdvVFlURjJCa0o4SkhwREVSRWxCYnZBL0tWIEdRVTFUNWdPY3J6M3F5ZStCMkJjZnNuQ1Q2dktid0gwTjUySmlJZ2NwdTdiVmRkMTB4UkY1VDNUR1lpSXlGRTJnTm50WTZHTDNWaUkgSGF0aCtaUW5ZdUdjUVFMNU9ZQ0U2VHhFUk9Ra2RWMmQ0YnFSTVFnMm1JNUFSRVNPZWRXMk1YTldZZTN6cG9PMDF0R3BpOS9PSzE3MCB1TUF1VjhoVnBqTVJFVkhxVk1SMWRZYnJSc1pnc1Jnakl2S0JKZ0EvN0xLbnkxVmVLc1NPMVZnOTZlV0dwcjRqVlBRZUFBZE01eUVpIG90Ukl3bkpkbmVHNmtiR1dwdkM3a2V5WTZSaEVSSlM4NWZHNDllVzdpMWMwbUE2U3N0V2o0cHVCWC9lL3VlcVBvVVQ4TndBK1l6b1MgRVJFbEo1U3dYRGROMFpVYkYxYlVGZTRBdEtmcEhFUkUxQ1k3VlBEVm1XTnFIek1kSkYzeWl5b25xZURYQU00eW5ZV0lpTnBrZTJQMSA1TjZtUXh6UGZkTVVBWWdMRjljUkVkRnBpQ3dPeFVJWCtia1FBNENHRlpNWHFhV0RCRExiZEJZaUltb0xlZGQwZ3BOeDNUUkZBRkRvIEc0Qjh5blFPSWlJNm93OVU5ZTZaQmJWTFRBZkpsTTNMcHV3Qk1DdS9aT0Z5VmZrZGdMNm1NeEVSMFJrSTNqSWQ0V1JjT1RJR2tlZE0gUnlBaW9qTVFXWndsaWFFem8zV0JLY1NPMWJCOHloT2hXSGpJMFZFeU5aMkhpSWhPdzdiWG1vNXdNcTRjR1pNRTFxZzd5MFFpSW9JMiBXb3FaMHdwcWEwMG5NVzFqZmVsZUFMTUdsQ3hjYUt2MU1LRG5tYzVFUkVRbkVRcXRNUjNoWkZ4WjhreUwxcjRPd1I3VE9ZaUk2Qk1VIHdHeXJmZnRMcGtYckFsK0lIV3ZUOGlsL2o0VTdYWHIwc0dqYmRCNGlJdnFFUFkxWHZmVzI2UkFuNDhyZEZBR2dvcTV3QmFDRnBuTVEgRVJFQVlLTWxNbjNhbUpyL243MDdqNCtxT3ZzQS9udk9uY25DRG9vSWhDUW83bFpGdEJiUXlwTE1KR0dwYlNYS1psVUlhQmUzdHk1diBXK3UwMXJaYVc1VmFMUVN3b2trd3RGVkJza3lHeFFWY1hsSHJVb3VpRUFqaWd1eGJtTG5uZWY4QUxTaExNbk5temt6bStYNCtmajRxIE04LzlKU1IzN25QUHVlY3NzUjBrMmVXTnFCb0U1bGxnbkdvN2l4QkNDQUNFaFkwMTQwYmFqbkVvU1RreXRnOG41YnhPSVlSSU14Rm0gdW1kNysrMW5TaVBXTW8wTHh5NTMyM3ZPQmVFUEFDSzI4d2doUk5yVHlic2VSVkkrTXdZQWl1ZzV6Zkk4dEJCQzJNS0VmNUdMU1ZQOCA5U3RzWjBrMVRmTktkd080SlhkRXhSUEVOQXVNczIxbkVrS0lkS1dVZnM1MmhzTkoycEd4ZFU3ejgvTGNtQkJDV0JFbTRydTdiT3I4IHpUSi9VQnF4R0t4ZE9INUY0NjZlNXpINE5nQjdiT2NSUW9nMDlQbnFYYjJTY3ZFT0lJbWZHUU9BOGdiZjR3REcyODRoaEJCcGc3RWMgcENlWEZZYmV0UjJscmNueFA5YlBJV2NHQ0VOdFp4RkNpSFRCd0tOcmE4ZGRhVHZINFNUdHlCZ0FNR0d1N1F4Q0NKRW1kakhUYloyMyBkUDYyTkdMeDBWUS9jVlZqM2RqaERKNEtZTHZ0UEVJSWtRNEk2Z25iR1k0a3FadXhqNXk5ZFFBK3NwMURDQ0hhdURwU250T24rT3J2IExpMmQ1OW9PMDdZUnI2MGRQME5INkZRQVQ5bE9JNFFRYmR4SGpSMVVVbS9Ga3RUVEZBR2d2TUgzR3dBL3Q1MURDQ0hhSHRvSTFqZVcgK1JvZXQ1MGtYZVdXVkUwazV2c0FIR003aXhCQ3REbk12Mm1zRzMrNzdSaEhrdFFqWXdEZ2hKMEhBT3l5blVNSUlkcVlDaWVzVHBkRyB6SzYxTldNZjg3aVIwMEdvc3AxRkNDSGFtSjFlOGs2ekhlSm9rbjVrREFES0czejNBYmpCZGc0aGhFaDFCTHhQekQrZTVHdEk2bWtiIDZTaS91UEppQnY0QzRBemJXWVFRb2czNFkyUHR1Si9hRG5FMFNUOHlCZ0FSRmJrWFFMUHRIRUlJa2NKMkFmamZUcHM3bnltTldISmEgVXp2dTJRNGRQT2NTNFdjQXk0d1FJWVNJM2g1bzk0KzJRN1JFU295TUFjQ01vUDl1SXI3RmRnNGhoRWhCejBRaTZpZlhGdGV0c1IxRSB0RXpPeU9yZVRpVDhPeEJOdEoxRkNDRlNELzIyc1hac1NxdzVrVExOMkt3WFJuZlV1L2Y4QjBBdjIxbUVFQ0pGZkVpZzZ5WVgxaSswIEhVUkVKN2ZrOFpFRVp4cVkrOXJPSW9RUUtXTDlydDJlVXo5YldyckRkcENXU0lscGlnQXc2Y0w1MjhGOHErMGNRZ2lSL0dnakFUZHYgYjcvOVRHbkVVdHZhbWduUHVPMmRNd0M2R2NCRzIzbUVFQ0xwRWQyU0tvMFlrRUlqWXdEQURKb1o4ajBQWUxEdExFSUlrWVMyZ3ZpUCBLaXY3L2trWHpwZE5oZHVZVTBiUDZyZzduSDBqQVRjQjZHdzdqeEJDSkJzaVBMK21adXpGQUxIdExDMlZVczBZQUV5djk1MnFGRjRIIGtHVTdpeEJDSkltZFlNeUtNTzY2MWgvODFIWVlFVjg1L3VwdUhpZDhIVFBkQ0tDVDdUeENDSkVrbWxsandOcjZjZS9ZRHRJYUtkZU0gQVVCNWcrODJBTCt6blVNSUlTeGJCK2EvT2hGUCtkVWx0Wi9aRGlNUzYwVGZuT01panFjTXdEVUFjbXpuRVVJSW14aTRkVzN0dUh0cyA1Mml0bEd6R0FrdUdlSHFITTVhQjhFM2JXWVFRSXVFSUs4QTBUWGZkV0RYMXZCVmgyM0dFWllHQXluMzU1QkZFdUE2TTRValJ6M1loIGhJakJ5NDBkUElNeHI5UzFIYVMxVXZhRVBXT3gvd3h5ZVFXQVROdFpoQkFpQVhZUlVNR2tIaXdycUh2VGRoaVJuUG9XVlo2bENUOEcgZUR4QTdXem5FVUtJQk5oREx2cXZDWTc3aiswZzBValpaZ3dBWm9RS2J5S21sTmpRVFFnaG92UWhtQjRLNy9YTS91SEloWnR0aHhHcCBJWGRFUlZmU2FoTEExd0k0d1hZZUlZU0lGMmE2Zm0zZDJHbTJjMFFycFpzeFp0Q3NrUDhwQm8rMm5VVUlJUXhiUnN3UGROclM1WitsIHBmTlNidHFGU0JLQmdNcDk4YVJocE5UMUFJOUFpbi91Q3lIRVY5UTAxbzRkbVVxckozNVZ5cCtVWjljVWQzZTk3aHVRemFDRkVLa3Ygek1CampxUHVtVFNzYnFYdE1LSnR5ZmRWbnNvT2JnRXdBWURYZGg0aGhJaFJVMlJ2K0p6MWkzN3d1ZTBnc1VqNVpnd0FaZ1FMTHlhaSBSUUFjMjFtRUVDSUtZUWJQMVl3N3IvRTF2Rzg3akdqYitwWlU1REZ3RXpOTmdXd1RJNFJJVFJwQVlXUHR1TVcyZzhTcVRUUmpBRkRlIDRMc0RRTUIyRGlHRWFJVm1BbWE1MEhkUExReXR0UjFHcEplK0pSVjVMdU0yQWwwRldReExDSkZTK0plTnRlUHZ0SjNDaERiVGpBVUMgQWRYN3d1VlBnVEhLZGhZaGhEaUt2UXllUVI3UDNXVkRhNXRzaHhIcHJYZng0emtlcHR0QVZBWWd3M1llSVlRNGlxY2FhOGQrTDVXZiBFenRRbTJuR0FHRFdDNk03dXJ0M3YwU2cwMjFuRVVLSVEyQVEvWjBpK05ua292cFZ0c01JY2FBVFJsWG51dUh3YjBBMEFXM3Mra0FJIDBXYXNkTUtlQ3o0TWxXNjFIY1NVTm5leW5iVzQ2QlR0NnBjQmRMYWRSUWdoRHZBaU1kODgyZGV3ekhZUUlZNmtUOUhqNXl0Uzl3QVkgWWp1TEVFSWNZRHREZjJ0dDdZUi8ydzVpVXB0cnhnQmdSckJ3TkJFOUNVRFp6aUtFU0c4TS9yZlNkTnRrZjNDQjdTeEN0RWFmb3FyUiBpdmozQUU2em5VVUlrZlpjYVBwT1kvM1loYmFEbU5ZbW01VXB2b2I1QlB6VWRnNGhSRnI3akpsditNZ1RQbHNhTVpHSzF0V05uZDk0IHdYdG5NdmdIQURiWXppT0VTRi9NZEZOYmJNU0FOam95OW9YeW9POEJFSzZ6blVNSWtWWjJBYmduVStQZUsvekJuYmJEQ0dGQ0Q5K2MgOXRrZTUyWm0zQXhRTzl0NWhCQnBoUGkreHByeE45bU9FUzl0Y21Uc0MrdVhEN29SNEgvYXppR0VTQXNNb25ta1BLZVhGUVovSlkyWSBhRXMrQ1Y2eGMwM04rSURyZUU4RzgyTUEyc1FxWmtLSTVFYkFnc2IyM3B0dDU0aW5OajB5QmdEVEY0eHFwN0thRndINGx1MHNRb2cyIGl2R0tVdXFHU1FWMUw5cU9Ja1FpNUkyb0drUmEzOCtnODIxbkVVSzBVWXpsYmtkUFFkTzgwdDIybzhSVG0yL0dBR0I2UTBGblJXb1IgR0FOc1p4RkN0Q2tmZ2ZDcjlTOE1taGtJQkxUdE1FSWtGbE51VWVXbFJMZ1hvRnpiYVlRUWJRamhYNjdyR2RaVVg3ckpkcFI0UzR0bSBEQUJtMXhSM2R6M3VFaERPc0oxRkNKSHk5b0x4VjlVdTZ4ZVRMcHkvM1hZWUlXenFOV3BCdXd4MzJ5M01kQXVBYk50NWhCQXBiNlh5IDR1TFY4OGQ5WWp0SUlxUk5Nd1lBNWFIaFBjRE9VZ0NuMnM0aWhFaFp6MERqdWpKL2NMWHRJRUlrazk3RmorZDRtSDRybTBZTElhSkggcTZBajMyNnNuNWcySzdpbTNjbHlla05Ccm9MVEFQREp0ck1JSVZMS2E2Ung0MlIvOERuYlFZUklabjFMS3I2dG1lNEgwTjkyRmlGRSBTbG5wY2Fud2crRFlkYmFESkZLYlhrM3hVS1lXaHRaR05GOEUwT3Uyc3dnaFVzSW5JRXhldjJ6UStkS0lDWEYwcTJ2R1A5ZDR3WHZuIGdYa3lnTFNZWmlTRWlCVy81b1hub25ScnhJQTBIQm43d2wrV0RPbVFFY2w0RWtDQjdTeENpS1FVQnVOaFRmcVhVd3REVzIySEVTSVYgL1hkL01yb1ZRSmJ0UEVLSTVNUEFjNTZ3Wi9TSG9kSzAvS3hOMjJZTUFQNjBmR0IyeHgwZDU0QndxZTBzUW9na1FuaFNrM1B6MU9HMSBIOWlPSWtSYjBLZDQ3b2tLK2w0QWw5ak9Jb1JJS245M08zaXVhT3ZMMXg5SldqZGpBTUFNS20vdzMwTEVkd0Z3Yk9jUlFsajFMaEhkIE5MbWd2czUyRUNIYW9yd1JGVVBCZEI4WVo5dk9Jb1N3aWdsMHo1b0xWdjRNYWI0MVRObzNZMStZR2ZJWE1iZ1NqSzYyc3dnaEVtNFQgTS8rNnk1WXVENWFXem5OdGh4R2lUUXNFVk83TEowMGcwQjhBSEdjN2poQWk0YllSOFJWcmFzWS9iVHRJTXBCbTdBRFRGeFdmcUxUNyBPSUJ2MmM0aWhFaUlNREg5MmZFMjMzblYwS1ZiYkljUklwM2tYL0pJRjkyY2VRY0JQd0xndFoxSENKRUFqT1hRa1FtTndTdGtlNWo5IHBCbjdpc0NTSVo1ZTRjei9JZUk3SVI4T1FyUmxJWGJvaGluRDZ0K3hIVVNJZEpZenN1SWtqMVozTWZNWTIxbUVFSEVUSWRBZmovbDAgMiswclZrd04ydzZUVEtRWk80eFpvYUtCbXZsdnNoK1pFRzNPRzB4MDg1U0MrcER0SUVLSS8rcGJQTmVuU2Q4ano1TUowZWFzSk9nciAxOVJPZU1sMmtHU1VkdnVNdGRTa2dyb1hkZGVOWnpMVGJRRDIyTTRqaElqWmVoQ21kdDdjK1R4cHhJUklQcXRyTHc4MmZ2TzljNW01IEZNQWEyM21FRURFTEUraHVMN3FjTFkzWTRjbklXQXZNQ0EwL21kanpFTUREYldjUlFyUU9BOXNVNGZmYjJtMi8vNlpCTDZidDBybEMgcEpKZW94YTA4MGEyM3dqZ1ZnQWRiZWNSUXJRT2c0UGF3WStibmhuL3Z1MHN5VTZhc1ZhWUVmSVhFUE1mQUp4ak80c1E0cWdpQUdhRCAzRitXRlN6NnhIWVlJVVRyOVI3KzZESGVqSXliR1h3amdBemJlWVFRUi9WdlpnNnNyUnMvejNhUVZDSE5XQ3NGQWdHVmMrSHlpUUFDIHpNaTNuVWNJOFhVTVBPVTQ2clpKdytwVzJzNGloSWhkdnEveVZEaTRtNEhSdHJNSUlRNXBEWVB2V0h2Qis0K24rNzVoclNYTldKUUMgZ1lES0diaDhCQ3UrSGFEemJlY1JRZ0FBWG1YbW4wN3hOVHhyTzRnUXdyejg0c2UveFhEdUJYaXc3U3hDQ0FEQW13eis0OXJkdlNxeCBkR2pFZHBoVUpNMVlqSmhCc3hiNS9jejhFd0IrQUk3dFRFS2tvWGNaZEh0WlFmMC9pY0Myd3dnaDRva3B0Nmp5VWxMMGF6Qk90WjFHIGlEVGtBbFNyUUg5ZVhYdDUwSGFZVkNmTm1FR3pnb1c5WEtpSlJEd0Z3QW0yOHdpUkJ0YUNjTmQ2Wisvc3dOQ2xja2RPaUhRU0NLamMgbDA3NlBoSDlEc0NKdHVNSWtRYWFDRlJCcEI5ZVhUTyswWGFZdGtLYXNUaVpzZGgvQnJrOEJzQmxnTnk1RThLd3o1anBqMTV2OHdOWCBEVjBxVzA4SWtjWUdESmp1L2V5NERsY1JLQUNncCswOFFyUXhhNGg0dnRZMGIrMjMzbHN1ejRPWko4MVlBa3h2S1BnR0VSVVNhQWdZIEZ3SG9ZanVURUNscUU0QS82RDJaMDZhT1dyRExkaGdoUlBMbzRadlRQc3R4cmdmb3B3QzYyczRqUklyYVFzRHpZRnJpT3RTd2J1SGwgYjlzTzFOWkpNNVpnMWRWam5HMWRONThGcGdFTStnWVV6Z1RqYkFESDJNNG1SQkxiQWVBQmoyZnZ2VmNOWGJyRmRoZ2hSUExLSFZIUiBGUzdkVElUckFMUzNuVWVJSlBZNWdIOFI4ZHNNZWd0TUt4bzdPRzlpWHFsck8xZzZrV1lzU1V5djgvZjBLUDBOVitGTVlzb25VQjZEIGN3SGtBdWhtTzU4UWx1d0E4SEJFNDk1ci9jRlBiWWNSUXFTT3ZxTXJlK2d3Ymdad0RhUXBFK2xyRTRDMUJLd0Y4Um9HTlNwV2Iyc2QgZnF1eGZ1SUcyK0dFTkdNcDRTOUxoblRJZHJOekkrVG1LZVpjTU9Vd2NCd0R4eW5Rc1F3K0ZxQmpBVDdXZGxZaFRHQmdHd0YvMXA2OSA5MDhkdW5TajdUeENpTlRWYTFUbHNaNHdiaUxDandCMHNwMUhDRU0yZ3JBUmpJMEFOaExvVXdZK0llYjFUR290STlMWTdPckdUNEpYIDdMUWRWQnlaTkdOdFNIWDFHR2RydDAzSHN2SWNTeTUxSjNhN00zQWNnTTRNMVptSXV3RGNCVkNkQWU0TTRNQi81SzZoc0krd0dZd0ggd3MzZWFUOGN1WEN6N1RoQ2lMWWpkMFJGVjhXNG5wbXVnenhUSnBMRFRnQmI5LzFEV3htOFZURzJnbWdMd0ZzWXZCV2t0ckxXbnlxaSBUN1hHUmljVEcxZG5lamJLVk1LMlE1b3hBUUFJTEJuaTZlczZuVjFRNXpBNVhUeU16cTdXWFFCMEpsTDdtemgwSnFJdW12Zi9PMmpmIC95ZDBBYU1MNU9kSlJJMDJndlY5MlJIUGd4TkthcmZaVGlPRWFMdjZGVC9lS1F6MUV3QTNBSkFaSlNKYURHQUxnTTBBdG9LeEJZU3QgVExRRnpGc1U4VmJ3dm45bnFLMXc5QlpFbkszc2NiZm9pSGRWUi8vcEFBQWdBRWxFUVZSTFUzUDNiYkpKc2dEazRsa1lOTDJob0xPaiBNcm93Njg3azdtdmtRTlJGRTNjQjhiRUUxUXZNeDRQUUU0eWUyRGRxNTdFY1c5aTFub0Q3bXoxNy8vcWpvVXQzMkE0amhFZ2YzWWRVIGQyaVhGYmtXaE9zQjlMYWRSMWdWQWZBcGdJOEEraGpnRFFSczBNQkc3Ryt1SE9LdDBMU0Z2SjR0MkkydEg0Wkt0OW9PTGRvR2FjYUUgTllGQVFPVmQvTXB4T2h6T2NSWDFBNk1mTWZvQk9BbUVmdGpYcklrMmlWNEg2ei9wYnB1ZW1IcmVpckR0TkVLSTlIWEdtT3FNN1R2ZCB5NGo1UmdEOWJlY1JjZk1wUU84emVCVUI3eE5vbFZaNmxXTHYralUxWXo0QmlHMEhGT2xKbWpHUnRLWTNGSFIydERxYkZaMExjSDhBIDUyTGZCdG95bXBhYU5JQWFSZlNuU1FYMVMyeUhFVUtJcjhvcnJod0d3azFnbEVDdWtWSlZoSUIzQWJ5dWlWOXpnTmRwci9kZk1wSWwga3BXY2FFUksrZFB5Z2RudHQzYzhTeWthQ1BBUUFCZEM5bWhMZHJ1Wk1jZnhxUHNtRGF0YmFUdU1FRUljVGI2djhsUTRkQ09ESndMSSB0cDFISE5GR0FDOFE4Q3hwWGg3dTVIMnJhVjdwYnR1aGhHZ3BhY1pFU21NR3pRcjZ6bURpaTBGMEVZQ0xBUnh2TzVjQUFId0FZS2IyIDdKMHB5OU1MSVZKUnYrTHE3aEdLVEdiR1pBQW4yTTRqQUFBYkdQd2NNVDNIakdmWDFvLzl0MHd4RktsTW1qSFI1c3dPRlp6Z1FoV0EgTVFwQUFZQXMyNW5TaUF0Z0NUSFA2TFNseXo5TFMrZkowcnRDaU5RWENLamNGMDhhcGh3MWhaa3ZBZUMxSFNtTlJBQjZtYUVYUUNHMCBkdUc0MTZUNUVtMkpOR09pVGZ2VDhvSFpIWFoxR3F5Z0N4aFVBTWE1a0o5Nzh4aE5wTGhDdWZTWHEvM0JkYmJqQ0NGRXZPU1hWQit2IE9md0RBazJCakpiRnk0Y0VDbW5Xb2V5TVBYVXI1MC9hYmp1UUVQRWlGNlVpcmN4Y1ZKS25PVEtDR0NNQURJVThDeENMWFFBOXJWai8gYmQzeXdhRkFJS0J0QnhKQ2lJUUpCRlQrU3ljVk10R1ZBSThHcUozdFNDbHNOd2lMaVhraEVXcFcxNHh2dEIxSWlFU1Jaa3lrclM5RyB6VWp6S0JBdUFaQnJPMU1LY0FFc0FlZ3hsWjM1NUtRTDU4dmRTaUZFMnNzWlU1MnRka1FLRk5GRVp2NE9nQXpibVZMQUoyQU9NckJBIFJyOUVPcE5tVElqOXlrTkZaNEYxQ1lGR01IZ2dBTWQycGlTaEFTeGpwc3BNRlpuM2c0SkZuOXNPSklRUXlhclhxTXBqTXlJOEJrUmogbVhFaDVGcnJDeTZBRjRteE1LTDB3cWFhQ1cvWkRpUkVNcEFUaEJDSE1MUE8zNDJWOW9Ob0pBQS8wbS81L0dZR25pWG0rUTdUZkhrTyBUQWdoV3U5RVgxV2ZpQWVqbWZWb0FnMUIrbzJZZlE1d1BURTlFMkZQZlZOOTZTYmJnWVJJTnRLTUNYRVVnVUJBOVI2NHZEOFVSb0V3IHNnMHZBcklKUkl2QWVFYkRmWHBxWVVnMnlCUkNDRU42alZyUXpoUFpQbHlCUmpKNE5OcnVOaXdmRXZFejJzV0M3aHQzUEx0aXhkU3cgN1VCQ0pMTzJlRUVwUkZ5Vkx5bk9JVGN5Z3BtS0dSaEtRQ2ZibWFMa0F2d2FRSXRBVk5ONVU2ZmxzaFM5RUVJa3dKaHFwODgyZHhBNSBYRUtNQWdEOWticFQ0N2N4MHhLUXJuSEJOZXRySnpUWkRpUkVLcEZtVElnWUJKWU04ZlJ4czg3WHJJY3hNSnlBZ1VqZWZjMll3ZThTIDZGbEFoY0xOenBJZmpseTQyWFlvSVlSSWR6bis2bTZPRXhrS3B1RUFYd3pnTkNUdk5kb2VNRjRFWVJGQkwxcXp1L2VyV0RvMFlqdVUgRUtrcVdYL1JoVWhKWDY3UXlEd0VvUE1BN2cvZ09CdFpHTmhHaERmQVdNNkVaU3BDeXljWDFjdDhmU0dFU0hJNS91cHVTa1VHSzlCZyBEUjVJd0Rtd053dmpVd1plSitCVjFyeFVkL0l1YTVwWHV0dFNGaUhhSEduR2hJaXpoeGNONisyd3B6K0Ird04wTWpIbE0zTStDRDFoIFpscktMaWE4VHhydmc3Q1NtUDhGclY2ZjVLLy9nQWhzb0w0UVFnaXJtSEw4ajUrb1NQVW5VdWNBZkRJSUo0SDVKRVA3bTdrQU5nQlkgQThJYWFGckp5bjFEcTR6WG01NHBYVytndmhEaU1LUVpFOEtTNmE4TzhIcTNkTzJqWFpYRERucUMwWTJCWXhSeEIwQmxNZk9CRzFKdiBCVkdZTmJZcDRzODA0Vk5IODhjQVBwcmthL2pJMXRjZ2hCRENyajZGVmIzZ3VMMUpvUWV4Y3h4RGR5ZW9UaUQyRWxQbi83NlNkd08wIGh4azdpUFRuZ05wRXBEZTRoS2J1SCs5WUp3dHRDQ0dFRUVJSUlZUVFRZ2doaEJCQ0NDR0VFRUlJSVlRUVFnZ2hoQkJDQ0NHRUVFSUkgSVlRUVFnZ2hoQkJDQ0NHRUVFSUlJWVFRUWdnaGhCQkNDQ0dFRUVJSUlZUVFRZ2doaEJCQ0NDR0VFRUlJSVlRUVFnZ2hoQkJDQ0NHRSBFRUlJSVlRUVFnZ2hoQkJDQ0NHRUVFSUlJWVFRUWdnaGhCQkNDQ0dFRUVJSUlZUVFRZ2doaEJCQ0NDR0VFRUlJSVlRUVFnZ2hoQkJDIENDR0VFRUlJSVlRUVFnZ2hoQkJDQ0NHRUVFSUlJWVFRUWdnaGhCQkNDQ0dFRUVJSUlZUVFRZ2doaEJCQ0NDR0VFRUlJSVlSb0tiSWQgUUtTZkUwWlY1N3B1NUh3dzlRWHJmQ2pLQitONEFGMEI5Z0RVOFlDWDd3U3dGOEFPZ05jRDFNUkFFeEd0b2dpL3RtYlFlKzhoRU5CVyB2cEFrTTJEQWRPL254M1VjQktBL0U1MEo1dE1CZEFQUUVVRDIvcGR0Sm1DbkJtOGdwcmNCL2pjVHY3aTJkc0svclFXUGc3NmpLM3ZvIHZUU0l3S2N3NFFTQVR3Q29CNEIyQURvQmNQYS9kRGVBUFFDMkViQ09nVFVnckZHczNuWVFlV2xWN1lSdHRyNkdaSEdpcjZwUFdQSEYgUkh3MmlNNEJveWVBemdEYTczc0ZiMmRRTXhFYUdmaEFhVnJwd24xaFhjZU0xekN2MUxXWlBSRWVXVElrS3h6eFhFeFE1eEhRWHhQNiBFWE1YRUhVQ0FEQzJNR0ViTVc5bTRHMEZlbDB6di9iUjhzRnZCaEowN3FxdUh1TnM3cnA1b0dMbkFoQ2ZDOElwWUhRRG9jditqUHQrIER3aE56RmhGd1BzYStnVjAzZnp5MVBOV2hCT1JNVjdLUThON0tLM08xa1FuTW5BQ2dVOEFVdzRJblFCa2Z2azkySStBclpwNUY0RSsgQS9nVGdENEM4QjR4dnhkbWV1dGFmL0JUTzE5SjhuaTR0aWpmNCtGdkUrTnNKcHpOMEQwSjFCbUVkZ0FBeG5hQTlvQzVFWVJWekx5UyBIZlg4aHVjSHZwR29uL2xFbWhVczdLVkpuYytrVHlTbWZCRHk5NThuOTEzVGZIRXVBUDc3dXdic1pHQURNZGFCc0k2WVB0UWV2TlpsIFk2Zi9sSmJPYS9QblRYRXdhY1pFM08yN01NYjNRUmdHWUNDQVhnYkxid05qQlFGQmd2dms2cnFKS3czV2psck9tT3BzWjN0NEtBam4gTU5DSGdFNGc2Z3hHZXdMQ0lOb0N4bVlHZndid3UxNTRnNnRxU3o5ci9aR1k4dnh6UytEdzVXQ01BTkExeXNnZmdIZyt5Q2x2WEhqNSB1MUhXc0dmSUVrOSt1dzBGRExvVXpCY0JPTmxBVlUzQU84eG9VTXhQcks0Zi80cUJtakhwVjF6ZFBVeHVJWmhQSjFCM0VMcHE1azRFIFpBSzhtNEZ0Q21vckE1OHc4ZHVldlo3NkQwT2xXMXQ3blB5UzZ1T0J5RlhNK0I2QUFZanVzMklyQ0FzVXVIeDF6Zmpub25oL1ZNcnIgZlgySmVEZ1RuUXhHTnlqcUJPWXZidlRzQUxBTjRHMEFOUkhvalYxaEZicXVwTGE1TmNkZ0JwVXY5aFdSeGdRR1J0SytCcisxUG1MdyBQNGxVZFZsQi9mTlJ2UCtveWtQK2k1ajVTZ0tOQnZqWUtFcnNBRkV0YVQxOVVtSERZaUt3OFpBR0JRSUIxZXZDbHdhUWRndUoxQVhNIGZDNElPV2FQUXU4QmVobUk2bFZXVnMya0MrZHZOMXUvZGNwRHczdVE5dmcwK0RSRk9KYUp1akJ6WndKbkVOTnVKbXdEc0pXSlB3YXIgTjUzc3pHQTBtY3VYRk9kUVdGL05oRXNBN2g5bDNFMUVOSjlBTXlZVjFMMFlaUTNySGcwTlA2YVpQZDlUek1PWU1BaEFyc0h5TzBCNCBEZUNRWm41cWFtSG9MWU8xUlpLU1prekVSZjZRUjdJNEsyTThpTVlCdUJqL0hZbUl0M2NCZnR6anVqTS9DRjVoNVE1bVhuRlZmNENmIFFldWF6ajNNZE92YXVySFRXdkxpQVFPbWV6L3YzbkVjRTI0R2NFWlVRUTlOQTNpYUZkKzFkdUg0RlFicnhrV08vN0YranZKY0QvQmwgQUxySDkyaTBpc0hsR2RCL3RURmlsbHRVZFIwUjN3TWdzeFZ2MndLb2NZMjFsOWUyNU1WNUkrYWVCcTEvQ21COEs0OXpaSVIvZ2RYLyB0alJITkpoQk0wT0ZEd0UwRmEzNmJPTkdoendsVnhmVUhuVjBPQkFJcUp6QkwxN080RnNCbkJWOTJvTVI2QVVtL014RVU4WU1LbThvIHZJU0liZ0h3TFFQeDloZkdPK3pnNWluRGczSDdPNHpHdEpyaXpDeFBwSVJJalFGUUdHWFRHYTA5QU9xWjZNR3k0ZldMRXQyc2xqZjQgYmdQd0t3QVpyWGpiNTRwb3pLU0MraVV0T2thbzZDeEEzd3pHWlFDODBlUThqRmVoY1d1WlA3allZTTI0cWE0ZWs3RzF5NVpTQW8xaiBRZ0hNZmkrTzVBTW1ybkEwcGsveU5YeVVvR09LQkpObVRCaVZmOGtqWGJnNTQ0Y0FYUWVnaDhVb3pRUThBUmUvV3hNYzk1OUVIaml2IHVLSUdvT0lvM2hwMndwN3VSeHZKeUMrcThMT2krOEU0TmNxSUxhRUJlc2dMOStmSk9GVXYxMTk1QmluK0dVQ1hJWEdOL2hlMmdQbkIgckl3OTk2eWNQeWtoZDhYMy9WNWxmZ2JBRThYYjMydXNIWGZLa1Y2UU82S2lLMm4xYTRDdmlmSVlMY0pBdlhZOGs1cWVLVjF2dXZiTSBZT0ZnSm5vaHFqY1R6U3NycUM4OTBrdks2MzBEb1BoaGdNNlA2aGd0ekVFUlhETzVxSDVUTkcrZkVTdzhoNGltQWJqSWNMSURQUlBSIG1HUjd1dDZNWU9FNXBOU1B3SHdwY1BCVVEwdmVJcUpiSmhmVTF5WGlZTlByL0QyVncwMEFWT3ZmVGErWEZkYWZlNlJYeks0cDdxNjkgN2wwTVRJcnVHQzFNQXByUEZKbFNWckRvazNnZEl4Wi9XVEtrZzlmMVRpRk5ONW9mWlcyVk1JQi9NdlB2cC9nYTNyQ1lROFNCTkdQQyBqREhWVHQ2TzhMVUEzWW5rK0dEOFFwaUlIOWFFd05xRjR6Y240b0I1eFpXdkF6Z25tdmU2MmoycHFYN2lxa1A5V1g1SjlmRmF1MzhsIDR1L0VGTEFWR0ZqSHJMKy9ybTdDL3lYcW1FZlN3emVuZlpiakJBQzZBWEZzR2xxb0NVelhOZGFOZlRMZUI4b1pXWEdTNDlKN1ViNTkgZTJQdHVNTk9vOHNycVJvSDVnY0FKR3BFWVJNRFY2NnRIYmZBWk5IeWtPOVNNT1pGODE0Q3ZUQzVzUDZRRGN5MG11TE1iSy83ZXdBLyBRU0lhZjBZVGd5ZE04VFU4MjlLM0pEd2o4REV6WDk2YWpLYk1EQllPWjZMYkFCUWsrdGd0OUhSRVkwcThtOVg5amZmclViNzk0N0xDIFlNL0QvZUhNQnQvVlRMZ1hIUFcwOTliNkZJUUpaUVhCaGdRZDc2ajJqYlQ3cndUNGJzUjkxa1dydUFUTVpuSnZUOVlHVnJSZTNPNTIgaVBUUnA2VHF2THdkNFZjQStqT1NxeEVEQUM4elhVZWFWdWI1cTBiWURoT3QzSkxLUXViSUc0bHN4QUNBZ0Q2SzFMUDVSWlZqRTNuYyBRK2xiVXZIdExNZnpOa0EvaGYxR0RBQnlRUHpQdk9LS2lsNmpGclN6SGFhMWV2am10TTh0cVhvRXpCVklYQ01HQU4wSWVES3ZxR0pTIEFvOFpsZG1oZ2hPeU05eGxBRzVBb2taZ0NUbEVWRCt6d2QraTg5WDBldCtwMlY3M0pTUXlJM0E4RWRYTkNQbEdKdWg0S0E4Vm5UV2ogd1ZmUFJDRWtieU1HQU4veEVGWk1yL2RkWUR0SWF6MWVVOXhwWnRCWHhjQ3NCRFppQUhBY0dBdG5OdmpISmZDWWh6VmpzZitNbVNIZiA4d0RQUm5JMVlnRGdNRkFHZGxhV2gzeVgyUTRqekpCbVRNUWtyNlRxUjRwNUdVQkhuUEtRQkxwRDhZSzhrc3A3TUdSSk1sekl0eEJUIGZuSGxyNGhSQjN2VFByT1pVSkZmVkhHbHBlTWpyNlRxUjVvcEJDRGZWb2JEbzNGZWQvdnlQTitjdnJhVHRGU08vN0YrV1I3UHE4UjggcGFVSURvaks4NHNxZjJEcCtFYzFNK1F2Y2xtOUJzWUFDNGZQWlBBL1pvYjhSVWQ2VVhsRDBmZVV3cXVJY2lRK1JsbkUrT2Vza0g5byB2QTgwbzhGZkJ0Yi9SNEF2M3NjeWdwQ2pGQmFYMS91RzJZN1NVck5EeGFmdjlycXZNZUZ5U3hHOERINXNSb1AvaU5PRjQyMW0wRCtSIFhINEZ3R0NiT1ZxZ014aHp5eHQ4RHoyeVpFaVc3VEFpTnRLTWlhamtEM2trSzYrazhqRXdQNGpXUFR4c0U0RnhjMzcyaG4vMEs2NHggdHpoQm5PUVBlU1FycjdpcWtvRmZ3djd2S2pIUnpMeVN5dThuOUtpQmdNb3RxZnpyL3ArelJEMHczWHFNczlueFBKczdvdUlFMjFHTyBKbTlFMVNCSE9TL0crWm5EbGlBbVRNOHRxcnpRY282dm1kbmd1NXFaRjJEZkV2NjJaREp6MWN4RkpYbUgrc1B5a084NlFNL0RsMXNNIFdPSFZqT3FIYTR2eTQzV0FtU0hmRHdnOEE2bnpPZk9GZGxCWU1HT1JiNUR0SUVjeksrUWY2cks3RE1DSmxxTW9Bdjl0VnJEd3ZFUWYgT0xCa2lLYzg1SCtRaWVjQVNLV1pEdGRHM0l5RmMrcDlOczhESWthMkwvQkVDdHEzVW1MbWsyQk1zSjBsR2d5TURtUHprL2xESGtuYSB1MG05aHo5NkRHZG5oUUJyZHlrUHhRSHpuRngvcGNuVkc0K0FLZS9say85S2pLbUpPVjVzQ09oRG1oYWZNS3JhNURMSFJ1VVZWWDBYIG1oY2hzZE1TanlTVENGWDVsenlTTk5PYnkwT0Z0ek13RThreEZiWUw2MGhGWU1tUUw3TXdnOHBEaGZlQzhRQ1M0ak9jai9WNDlKeEEgSUdBOHk2d1hSbmZVakJhdE1KdWsycEdMSng0TkRUL0dkcEREbWRuZ0g2ZVo2NUE4anhoa2E2SzVpV3d1QWt1R2VIcEh2QlZnL2xHaSBqbWtVWTFpelF1MnNGMFozUFBxTFJUSktnaE81U0NYNVF4N0owdG1aVDRGd3hPa3p5WStLT1R2ek1ZQ1RiaEdiRTMxemp2TmtlQmNEIG5JVFRKS2dkS2N6TkdWT2RmZlRYeGlhdnFQTFBBTXJpZlJ6RDh0eEk1S2xFZkg5YUs2K280bnNnZmdKQXN0MkV5RUZ6NWdPMlF3QkEgZVlQdkRqRDlHc20xdU5YZ1htN0dsQy8rWTJhRDczNHcvWS9OUUlkd1VhL0J5NDFmeUxwNzlveUljZyszNUVISTJjdnFJZHN4RG1WRyB5RGVld1hPUWZLT09KKzVWdUNjUkJ3b3NHZUxwN1daV0FtUjFlcVFCRjdtNzkveTl1bnBNb2xjWEZnWklNeVphZ1FsWm1ZOFM0TGVkIHhKQkw4NHJtL3R4MmlBTXBjbzZQT0o0bE1MaUhVUnljNmRrUkNjVHpBSGtsVlQ4Q1VXcmVwUVQ2cTUxdVVsMTg1UmRYWGdLaXVValMgcVo0TVRPenJyL2ltelF6bHdjS2ZBUWpZekhBNHhMajlMMHVHZEpnWjlQOFJoT3RzNXprVUFnTFRHd3FNVHVzazBEZE0xck9IeHN3SyBGUTIwbmVKQU0wSyt5NG54S0JLL05VaUxNREIxeG1KLzNHZGg5QXBuUEFqbU1mRStUaUlRNE52V1pWdENtbGhobGpSam9zWHlpcXQrIHhvUlV2M3QwTU9KZjVaWlVGdHFPOFFVaS9BUEE2Ylp6SEEwRE41eFFNdmZrZU5UdTQ2KzZDTXozeGFOMm9oRHpsZm5GbFpmWXpyRmYgT3dhZVFKSTJZdnVSVnZpdHJZTXplQUNJN3JKMS9CWTRQaU9Tc1p5SmI3SWQ1QWk2S2FnYmpWYmtoRzdnSEUra21lKzBIZUlBeHhEaiBNU1JwSTdhZlF5N0g5WGV5dk1GM0xWRnFUSU52S1NhK3FUemt1OVIyRHRFNjBveUpGc2t2cVN3QzhHdmJPZUpBRWVPdlNiUTArWEcyIEE3UlFoc3Y4UjlORit4VS8za2twcm9MNXhxR1pDYStBK1RFQWZ3YnhmV0IrRFB0V3FYd1hnRFo4UEdoZ1d2Y2gxUjFNMTQyQ2crU2IgaG5RSU5MeHZVYVd0RWVHa20xWjZDS2t3U25UTjlGY0htUHZkcFpSYVNPRW9lTmlNMFBDNDNNQ0tnaGZKOFV6azBZeWVXZWZ2RjQvQyArMGNxazJKNnRIR01Qei8wekloRWJrMGdZcFFLdjR6Q3NsTkd6K3E0TzR3WjFIYWI5eE15SXR2dkFIQ3I3U0NwaFVmbUZWZjFiNndkIEcrM0dvMThUaG5NWHdMMU4xU1BDODVwcFdyTWJydjBrZU1YT3c3MHV4MS9kelhFaTN3UGpKekEwUlpTQVB1Mnl3cmNDdU4xRXZYU2cgRmFZQ1NOWHBxUUxvUVp1NmpRUmdaQ04wMXRoSnBwN2VJMndHWXdXQVR3RnNKZUp0V3F2TlNyRUN1TFBXMUFXRXZrUTRQMDU3YkJHeCBjeFdBLzQxRDdiYUsyT0VwQUc0eFdYUmFUWEdtWm5jV2tudTJRQ3lPOTJaRjdrSHFQWE9kdHFRWkUwZTFKOXp1dHdUdUU0L2FETHdQIFlDRVJYbUFYLzRHSFArcis4WTRkRzNyMTh0S3VUZG5lVEU4ZmFKektpaTRDWXdTQVF5N3piQ0RIRFNmNnFoNzhJRGgyWFR6cXQxMTggQ3dBakcwTDM5VmQ4VTROL2FLSVdnTTNFZk5PYTJ2Ri9hOG1MbStwTE53R1lDZkNzdk9LNVZ3RjhIMHdzSEVEMDQzN0ZqLzloVmUyRSBiVEhYU2dlTVVveXB2Zzd6U2wzYlVVUjBpT2hTR0dyR0FHeUs0YjNyQ1hpYUNVdmdZa1daUDdpNnBXK2NzZGgvQmtWNENoT3VOTHlBIHlBaElNOVphbHpQalZpS3dxWUpaR1pHZmdlazBVL1VPUklRMURGcklqT2VJNkQvaFBjNjZZM2UxMjltVTArUjAydFlwbXoyVVE5bzkgQlVvTlp1YVJpTmQyQXN4WHp3NFYzM2QxUWUyLzQxSmZHQ1hObURpaXZrV1ZaeG04UVA0U0E4OUI4NTFyNjhjdEF1aWdrK3hhQUZpQiBNSUJkQUQ0SDhBYUF1UWdFZnBMMzBpbmZnZUk3d0RqYmNLU01pTU0zQThuNWNQeFJOSUg1YVFKZWdGS3JJMjdrYzBkNU9qSTRoNWkvIHlVU1hFWEJTbkk0OXBrOWgxZitzYXhqN1VheUZ0S0xmd2N6bzY5czZRdjUxRGVPaXlFVGNXSXZaZllzcVg5V0VlZ0RIeDVpbHkxNm8gYTRERXJBeG0yR2NBRmhId0hvRE5ET3JHaEQ0RTdoK0gzNzh2SEp1N1krKzMxZ0xMNGxUZnBEREF5NGp3TXBnK1lhQVRBYjBCbk1YQSArVWlPbVFSN1FYaUJOVjVXaE04WTZBeWkzbUErQjhBQXhHWFZTUElGQWdFVkNBUmludnBMUkoraWRkZmduek13aHpXZW1PSUx2aEx0IEJmeVVZZlh2QUxqKzBkRHdYNGZaTTV2Qm82T3Bjd2huemdvVzlwcmthNGo1ZkduSkp3QkNBRllCdEFYZ1k4SElBWEFlQ1BGYWJLUFAgN0hyL1dVRDl2MHdVZTdpMktKOVkzMmFpMWtFWXI3RENuZXRmR0ZSemhKLzkzZGgzZytGTkFQT1ljZU9zUlg0L21BTU1YR0E0a1hMWiAvUm1RbWxzUXBSdHB4c1FSYVRLKzRmQTJZcDdhV0RkKzdyNy9ITi95ZHdZQ3VoRjRFa09XTE1qTDNuQXJnRi9CN0FQSWswLzB6Zm5OIEI4RXJQalZZTTM0SS8yTG9YNnh0bjFGN21KR0Uxd0VzQVBpWCtjVnpTeGw4UDJKdkxyN0tVUjRlQ3lDbTU4ZHlpeDhmREdDWWdUenYgRVhrSzF6V1VmaHhMa2RWMTQ5N01IVkV4a2pROWo5aWZKNXFNbEdyR2FKbG0zTFB1V3l1ZndXRXVLdnFNbUh1bW8vVmRESmk2U1AyUyBndklodVp1eDdRUThvTUxPdEt0TGFqODcxQXRtaElhZkRIYnVKc0RXSWk3YndYUy85alpQbXpwMDZjWkR2V0JtdmU5TUp2d0pCTU1MIEdQR3hQUzk2OFJ3QXI4VmNTZkVyMUpLV2J0K0Y4RFN2cy9jZlZ3MWR1Z2VBa1ZVWmZsQ3c2UFBxNmpIZjI5cHQ2NU5nakRKUWtyU2kgUVFEK2JxQldBdkZTVm5SUDJiQmczZUVhM0prTkJmMDExQy9qOFRQUEh1MEhZS1FaODNyMHo5anNNN1M3aVBuNlNZVU5zL1o5YjRJdCBmdU8rMTlmWEJRS0JZTzhMbC84WWpEL0FiTGJMcGk4cXZtUHE4Tm9QRE5ZVWNaQU1kKzVFa3RyL01QMzNESlpzVXV4K2M4MlhqVmlVIGxnNk5OTmFPdTR1Qjd3Sm9OaE1OQUpBZGNUd1REZGFMbHowQS82U3h2V2ZBMnBvSnp4eDlTaGZ4bXRxeFR4QjUrZ040TVE1NVlyN3ogUnF4K1lTREhUcmlSb2pVMXNUVmlYMWk3Y1B3S2dIOFRheDBDVHJLOWJIc0xmVTZNS3h0ckw3OW9YZDNZK1lkcnhBQmczY0xMMzE1VCBPKzQ3SUJvUDRMRFA0a1dEd2VlYnJHY1VZWEVrb3M2YVhCaTgvWENOR0FCTUtWajAzcFRDNEhkQm1Bd2duTUNFQUdFeEtjODN5bnoxIHZ6eGNJd1lBay8zQnR5Y1hCdjBFM0FUREM5Z281dk5NMU9IT24vOGZnQjJIZlFIaE9SQjhaYjdnQlZNS2doVmZOR0ltbFpiT2M3V3ogOTJvQVprYXpOQ1h6dGlWZjlRa1R4cFlWTmd5ZE1qeFllNlNSeHNtRm9kZW5GQWEveTZETEFCajllMkJOUnM0SkQ5Y1c1VE53cFlsYSArOUJHZ3I1d3NxOWhaaXpUS0FPQmdDNHJDRTREbEI5SCtubHZQWTlpZmJYQmVpSk9wQmtUaCtVU2JvSzVhU3liWFllSHJhNmJ1TkpRIFBheXRIYmNBaFBFd2V5R1IzRVA2Ukt1aDFlREcydkVQdHZhNW1qVTFwUjluZVhmN0FieHNPTlU1ZWI0NWZhTjljNTV2VGwrUWtiM3IgN21nTVh0SGk1MEphd291dWZ3UVE4OCtzZG5DNWdUaHh3NFJYUEM3MVgxTTM3dEd2VGhzK2tzYWFzWlc4NzVsQmc4OTRrWkVMK1RqNCBRK2ROblgzWEZ0ZXRhZWtieWdxQ3N3QmNINzlJQjJPbWU5YS9NS2h3OHZDYXhwYThuZ2c4dVRCNEg0QmZHczJoY2E2Sk9sUFBXeEVHIDB5RzJ1YUI2RUgyN3JDQjRjVmxCc01IRXNZNllZK2pTamN4c1puU2JPRldhc2VlMVMvMm5GQVJiZGZOMFNtRjlOWU4rQUlPZnk2UmcgNUp6ZzhlanJZVzdSanAzTXVuQnlZY2pZQWxabGhYVkxtZWk3TUhrRGgvVjQ1cVRheEY0Y2dqUmo0cEJPR1Qyckl3SEc5cXJRVEZjMiBQVFArZlZQMXZ0QllNKzRmSURhNVBPMDVmVWJNUGROZ1BXTUllQXR1WkhCai9lVlJULzlaT1gvU2RoMmg3d0U0N0IzemFMRGpMWWo2IHZjcDdCV0p2K3YvZHVMdW44V1dLVjlXV05MT0ovYWVZa21ZdnUwT1ltOEZkdmgzdDRqVnJhOGN0QUZQQVlKN3V2VVpWSnRQK1VocUUgcVdXRndWdEtTK2UxdXVrc0t3dytUSXpZWmdNY25RdkM1Q20rK2x1amVWWnJja0h3dHdEcVRJVWh3cW1tYW5YZTB1bFhBSDVCakZvdyBwaEgwdVdXRjlVVmxCZlhQbXpwR1M3QTNYQUZncjRGU2NWbUV5aXgrUkhmOWZQalVvdm9OMGJ4N1NtRjlOUXhPeldaRzN2UUZvMkxhIDVxQzZla3dHV3ZWY3hKRVI0VWRUZkExdm1LcjNoU2tGOVNFMnVvMFE1YzBLK2k0eVYwL0VnelJqNHBEMmhOdU5BZERlVERXdVhGYzMgZHI2WldsL250dmYrbkFGanF5QTZyaDVwcXBaQks3VGlpeHZySjBiMTRYaWdkUTFqUDJMdy81Z0k5UVhGSEdVenhrVEVzVThOSlhvSSBTNGRHWXE1ekNMdDNPVThpOXFsNFo1em9tNU4wZThneFlYcmpCZStOWDFWYkV0TjBYOXF6NTE2QTE1cktsYm1YVHpCVkswWXVNVjFaIFZoQ2NFVXVSQ1BpWEFPTHk4N212UEUvY1B3b1hGU0t3aHI0RjVrWTRqZTBOVlZvNnp5MHJETjQxMlJjc0tmTUZyemM1RXRFYSs2ZDggbXBoVjBOTkFqYmhoNEw3SkJRMlRwcDYzSXFiUkdaV2Q5VnZzVy9EREJLTDJlNk9lZlFFQVc3cHNHUUdndTVFd2pOckpCY0ZIVGRRNiBsSTg4ZTMvUFlHT3JJTEpDTWw3VGlBTklNeVlPamRuVWRMMDlydU0xdWtmSVZ6WE5LOTFOekw4eVZwQ01MQ1JoMGtvdlBNVnJGNDdmIGJLcmcyZ3ZlZjV5QXQwelZZMEpVZDk3eS9FLzBSOHhMKy9JdXl0aFRFVnVOdy90c2Fla09nSitPc1F4RmxIT2hrVUNtRU0xYVd6UDIgMmlNOUc5WlNhNVpldFllQTM1dUlCUUNzVkV3WFhxWVE2SWJKdnZySFlxMXpqYS9oZlFEL01CRHBhNGo1MmpKZlExV3NkYVlXaHQ0aSA0Q2tUbVFEMENpd1owaFlYQ0Z0aG9FYjM2dW94SmhlZU1vY3hiVXBoOENZVHk4aFB1bkQrZHNTNHNOTkJOTWQwVGlBeTlnaUM2ekp1IE1sVHJrQUpEbDBZSWpzbjlLWWNhckNYaVFKb3g4VFhkaDFSM0FHR3dpVm9NL2x2VE02WHJUZFE2RXRxenR3S0dwdDR4ZVBBWlk2cE4gcm1nVWl3MksyTCtxdHZTd2l3VkVKUkRRQUQ5c3NHTFAvSkxxVnEvVVNJNDI4S3dZMWF4NTZxb3RzZGM1d2hHQUYyS3VvY3hzSm0zSSAzeHZiTzFOYjgzelkwWGpnL1RzTWpheG9zUFZSUkFidW0xeFkvNkN4ZW1TczBUbXc2SjJUZlEwenpSV2tmNW9xZE56TzloME4xVW9lIGhMY05WRkdmZGY4czFoVmE0MkhPNU1MZ0RTWUxrdkpVbzVWN0V4eU9Za1I5VHRoM1k0Q0dtOGdCOEQrbStvUC9NVlByOE5Zdis5WlQgQUV3OUE5My9rU1ZEdWhpcUplSkFtakh4TmRudDlnNkJvZVZWSFNhVEYveUh0Zi9PdktIUkVXcTNjNmZiMzB5dG1PeUZva3RYMTR4diAwY1A0cmVVQlY4RGd5azNNdXRYZk0rYllGKzZnQkN5RDdtb1Y4MFVZUTMzRFJCWURYcWJkelJOTmI2eThxcmIwTXpDZU0xRkxFUjlqIG9rN1VDRTkrdEd6UVQwMlc5RHA3NjJCMnF1S2N5WVgxZHhpc2g3M05ubG9ZeXBpUnpTWTNTMDRLckRtV1RhaS81QUd5VE5ReDZGbmQgOWZQSkpqZFdCb0I5Qzhud3F5WnFNUkQxT1NFbjdJS3o1OWdBQUI1bVNVUkJWTDBBUUdjVE9RQW5JZGMwZ1VCQUU5UGZESlZ6d2pwaiBvS0ZhSWc2a0dSTmZvMkJzc1lFM1Z0ZU5lOU5RcmFOak1uYm5tY0hXTDV3SmZFUGp3ckhMNDFWL1ZlMkViVXhrYkw4YmhtN1Y5NnpYIHFBWHRBQXlLK2NCRThWaXUvK0JEZUhUc2Q4U1pUek1RSlZaTjBPNTMxeXk5eXZnUzRBREF5c3hLbmN6VXpVU2RhQkR3c3Q2ZE9jSEUgcHNVSHVtcm8waTBBVEMxaUZJckh4Zk1QUnk3Y0RGTVpJNUUyTnpKR1RGdE4xUEh1elVpbWtiRVB0V2Z2cGJFK0kzWjQ5SktoUWxHZiBFNWhNWGROdzQrU0N1bWZOMUdyQjBaUzVheHJTU01xRnljUSswb3lKcjJGV3B2WkVXbWlvVG9zYzg5bTJaZGkzdzMzTW1IR0dpVG94IGFGcFRPejd1ZCtDVTVxWEdhb0ZhOWV4WGhydmpHNGg5bVdIR3JqMUdOZ005a3YzUDY4WGF3T1NZeUJJYm5tdGlFWmpESVdZVDA3Z0Egam5tajdSaU9UWCtaT21yQnJyalVKakwwL2VINzRuYnhiQ2lqOXFETmpZeEJhU00vRjlyalNhWnJyOGVPdEI5ZHJJajRIVE4xS09weiBBakdNWE5NUWFLSHBHeUJIVWxaUTl5YUFUdzJWazJZc2lTWFRDVUVrZzBCQXdkU29rT0pGUnVxMDBJb1ZVOE13ODRBMWlLeWZ1SXhPIElUdWNpSWVOamJ3eHRXNEZQTTM2YkFPSC9UeGVvenlIRU90eE9wNHllbGFiR3kwNEVCRU1YWGlabVNhZGJCajZYZHNaanNaVVJzZmwgRGlicWlOVG1zcGxtakptalBpY3d3Y1JuRFJncW9kYzBBRURtUmhadFg5T0lJNUJtVEJ6a2hGZE83UWREUzlwN3RkZk1YZUJXSVNNciBCREtud2w0d3NXdDZadHdxQUdZV0IyRzBhclVySWpMeEFmbXhnUm90RlhQVHQ3TTVvNGVKSU1uS0RTc2pkM0haMERPcnlVWXh4WFdoIEdSTk1aWFFkU3M0VkEwVkNNWk9aNWUwNXVuUEM3SnJpN2dCNm1ZamdzbXRzQmVLV1lyQ3BZK1licWlQaW9DMHVQU3Rpb0ZtZmJxalUgcDhaWEFHd0JZcnpQQnZhYXB5VGZDOFljWXFEeUxjREljdjZ0VysySytaUlk5M3Btb0hOK2NaV3hKZFdQZkN5T2FkTlJBUENTRTNPTiBaT1psWjZkcllQMEhvclo1SWMrRWJZbWI1QlNkVk1nWWI5TnFpak05V24zOWQ1WENIZFA5ZTlOYVhtQ25pWWN2U1VWM1RvaDRJcWRUIGpKOHorKzNwdHFYTGh5WUt0UVl6cnlJeWtyL3J0SnJpek90S2FtUGFVMUxFaHpSajRpQ2FLWmRNckhiTlpxWXJ0WlltWG1Ya3RBVjAgNkQ2a3VzTytQYWJhdkRXRzZuVHNWMXlUMmZJTmhLbFByQWNrb0ErRGI0MjFUc0l3SjlzcWFrWjlHT20rTTg4YnQwZlMyb0pVT0orayBRc1lXKzlQeWdkbnRkM2M2VGJuNkZGTG93NXA2TXlHWDlxM08xd1dNcmlCMEFIREEwdDh1RGpsVFhCcXhWb3NRNzFSbW1xSG9LTW94IDlQZjJYbW5wdklROFBuQWdKbDVscUpta1RHKzRCNEMxSm9vSnM2UVpFd2RSaEY0bXpsdXM4SjZCTXEybVhMelBodTZwWjJZMkh3OWcgbFpscVNZeHB0YW50cHBvalc0OEI4RkVMWDI1azZrZ3FZUlg5UStncFllblFDSW9ybXdGazJvNlNqRWl6WmpOM3VlTW1GVEllVGlBUSBVTDB2Zk9sTWFQY2lrQm9NOFBuWWliNEFPeUFDTXdENnluaDhhbjZwS1dPREo3S3pkOFRlckdNRjdzMG0vcEtKVnNaZXBQVVU4ZnVtIGJnSTR5amtlMG93bEpXbkd4RUdZdUxlSlgzeGJ6MFpvTDM5QzJzeW5xeGRlSTgvT0pUdFdhRFMxOWEvSGFkbHkxaWNVVkhkMkVVbTcgQi94WmNUbzhweHVHTkdNaVFRS0JnT285Y1BrUVV2ZytZL2tsWVBRQ0VXUVlLemtFaGk2TmxEZjQ5cmZCaWNlYWVodnB4Wml0WE5OTSBIcjdvMDVraE05OC9ZalByQVFqenBCa1RCMk0reHNRNWs5bk9WSmVPN2J3N2Qrd3dzNjhxTzIxN1N0a1h5TVVtVTB2NWhCVzE2QmFvIDlyaGR6UnhSQ0pHT3BqY1VkQ2FpU2NUTGZ3amdSR205eENGUjlKdEZIMGhibXI1TEJDNXZ3QzRZV0ZqTnBmUzRwa2xGMG95Smd6RmwgbVJuUlp5c25ybmZtbGU3Tks2NE1JL2I5cTlyODh6MWY4dWhkTURTYVNIQmFOQ0xDRG1WRHA5L2xFMmt5dXBHd0VPbG0rcXNEdkdyTCBNVmVCOFJzd3V0dk9JNUlkWnhzWmxDUGVIbnVScUJscHh1Q215VFZOQ3BKbVRCeU1LTnZFOUE1bXF5ZXVIUUJpSG5raHFMU1lhcVVpIDJLa05qWXc1N0xic25LTFQ4ME9CUWR0c1p4QWlWYzBLRlEza3pmcFJCazZ5blVXa0NqTHlXVU5NTmhlMjJRRVl1UEdnS0MydWFWSlIgT2p5L0lGckZ6RVV5RThJbTZrVEp5Tkt0R3RyTWZNY2tGM1o0dDZsYXJEMTdXL2JDdEd6R21KVmVZenVFRUttR0dWUWVLcnhkczM1TyBHakhSS2dSRG56Vms4NW9tNWowdUFZQmdZTjhSRVJjeU1pYmlRaG5hT0RwS1p2WnlZaGhyVXBJWmFSaVptZ29BRE4yaVJwaEpLMHEvIGUwR3ZyVjA0ZnJQdEVFS2trdXJxTWM3TTBOYUhBRXl4blVXa0htYVlXUnVVdGMwOUlzMWNUMm5lWmFTT01DN3Ryb2JFMFpDUk96QU0gWmFrWll3SmdaSlUrVXVaR2pKSVp3ZWxrcWhZcjFiS2ZIMlhtNXl5VkVPZ1B0ak1Ja1dxMmROMDZBOUtJaVNncE5qT3F4Q0NicS8rYSBPVGFuMytkdXFwQm1USHdGRzVuaXg1YVdVTzNoZTZ3ZERQMWNLemhwY1JlSkFHUE5HQ0l0YTJBWmpwR2ZzMVJCd0QxcmFzYytZVHVIIEVLbGtab1B2cHdSY2JUdUhTRjJzakUzeHN6bmJ4MHd6cG5SYVhOT2tJcG1tS0E3Q3dCNFRRL3BFMnNwZHBHeFBWa2RtUTlPaTk2cFAgekJSS2JreTZPNW1acDhpZHVqZ2JXM1pNdDluUXRqTzdBV3d3VWNnMEptd2t4anVLK0crcmE4WS9aenVQRUtta1BGUjBGclArcmUwYyBJc1V4N1RHeUtCa1phb2hhYVZwTmNTYmdtdGsxVzZmSE5VMHFrbVpNZkFWdk1YR1JURXk1QnNLMC9yaXU3bUZvVzkwZEg0Wkt0eHFwIGxPU0ljS3FoL1ZHM3ZET3Z0RVVMZURoaHZRUEtNWEJJZXEyeGR1eUZCZ29KSVpJRU0yaG1TUDhWSnJZbytib0lnVjRDK0UwQXF3QjYganpWL3JMeHFCK2xJZU0rZXpNTSsxK25OQ3A4SFJqQU9tVVRjbU5tc21RQXIxelNaM25BUFE1TjllTGZyZkdTaWtEQlBtakh4RldSayBsSUdKKzVtbzAvcmo2dE1ObFZwdnFFN3kwM1Nha1VFcVFvdnZ1alYyeXZ3MGIwZkVCUkJqUjhhZFkzdS9FQ0xabEMvMkZSRXcwR3hWIFdzVEFESytuT1hqVjBLVlJYYUNYTnhSc2w2YzdVZ3N4ZmN3VSs5MUdJbGk1cGlIZ05FT2xObDVYVXB0V2p3ZWtFbW5HeEZmd3gyYW0gajVHbFpveE9NekVsZ1lDMUJ1S2tCakowc21kODNPTFh6aXQxVVZ6NUdZRGpZenNrcEJrVG9vMGhGemVhV3VFVndGdWs4ZVBKL25xWiBLcHlHTkdHRGlSOGxadlNaVmxPY21laUdodUFZdWFZQnBkRTFUUXFTV3p6aVlLUk1EV04zeWkrcGp1bENPenBzcExGZzRFMFRkWkpkIDcrTEhjd0RrbWFqRmhKV3RmRXZMbTdmRElBT2Jld3Noa2tkNWFIZ1BFSVliS3ZmTVhzL2VRWlA5UVduRTBoV3hxV2VLblV6SDdXdW8gVml1WXVhWUJjMXBjMDZRcWFjYkVRUlM3NzV1cXhZZ01ObFdyNWVnY0UxV1k2RjhtNmlRN0wxT0JxVnBLVTZ1YU1VT2pqeDM2bGxRWSBhU2FGRUVtQVBYNll1VFo1VFhmOS9Icy9HcnAwaDRGYUlrVTVTaG03cGlGRkY1bXExV0lNSTljMElIckRTQjBSRjlLTWlZTmtlcHZmIGdaRXhjUUFNdjVFNkxaUTdvdUlFd015emFvNW0yODFZUXFZUU01bHJ4cGpvUDYxNXZXYThZK0s0V3F0elRkUVJRdGpINElzTmxISFogb1N1bW5yY2liS0NXU0dFZE4zWmNCUmhhM3A3Wlo2Sk9TejBhR240TUNBTk0xR0w3MXpUaUNLUVpFd2RaT1gvU2RnQ05oc29sOU1TbCBYUFVkUTZVMnIrN29NZElveEtCM2ZrbmwvOGJ6QVBsREhza0NVR1Nxbm82MDdtUlBpdDQyZEdScHhvUm9Jd2lJZVJFbUJwNmJNcXplIDlqbGNKSUhTMG5rdVFPOGFLYVl3dkxwNmpJbGxnRnVrV2F0UmlIbVJxMzJsdURuci93elVFWEVpelpnNEZGUEQyWGw5aXlyUE1sVHIgcUpqNENrT2xGbU5lcVd1b1Z0U1ljVmQrVWNYbGNhdWZsVEVld0RGR2loR3RYdGN3dGxYUEd5ck5acG94b2lGRzZnZ2g3Q09jRW5NSiB3bE1tb29pMlFwdTVwbUYwM2RKbFM4SzJVaUZGRTgwVXdyS3BveGJJaHM5SlRKb3g4VFZNdk5SVUxRMmVZcXJXa2VRWFYxNE1tSmxiIFRZd0dFM1VNSUNiNld4OS9WWHptcVJOZFo2NFlMMnZ0TzFidjZmbHZBTnNNSEh4d25tK09oUWVyaFJBbUJRSUJCVWFYV09zUTB3Y20gOG9pMmdZaWVOVmRMVFRWVjYwaG0xZm5QQm1Pb2tXTEpjMDBqRGtPYU1mRTFHcnpZV0RHaUsvdU9ydXhock41aE1CQXdWRW9ycjZmVyBVQzBUTXBYaXAvb1dQUmJ6M2VJRDVSWlhqZ0pnYk5TU05GNW85WnVXRG8wUVlPSkRrdUI0YmpSUVJ3aGhVYjl2dnR3QkJ2WldJZFl0IDN2TlF0SDNzT0lzTVZydDArcUxpRTgzVk96VHQ0VHRnWnA4aGdGU05rVG9pYnFRWkUxL1RWRFArYmFEbEcvZ2VSWHMzekFGRHRRNXAgLzFTK0lZYktMZjF3UVdteTdjZlJ6U1duSVdka3hVa21pcDB5ZWxaSEFxYVpxTFVmaDBrdmpPYU5tdGpVaDJSWm4rSzVjZitBRkVMRSB6MTRnMDBRZHJWUzJpVHBmNThtS1QxMFJUMlZEYTVzQWVzOVFPYS9TN2wyR2FoM1NyR0NoRDR6dkdpcjNSbGxCblN4cm4rU2tHUk9IIFFBekNQNHhWQTAzdFd6dzNMb3Q1NVBubTlHV2lCMDNWWS9DanBtcVpSRUFmeDZWbis0eVllMlpzbFppYUkrMW1BY2cza1d1LzE5YlggVG1pSzVvMGVPS1pHSWJNYzZJY1JDTWc1VFlnVTVYRmNJOCsxa05iRzk3Z3NEdzN2QWZCMDAzVkZvdkE4ZzhVdW05SGdMelZZNzB1UCBMQ2s1WGhQTk5sV1BtZjltcXBhSUg3bHdFWWRHVkdHeW1vYXVpcjJST0ZpLzR1cnVjRHp6WVdvUkNtQnpzK3NhYTBMam9LZlNlbGxlIDhkemk2TjdPbEZjOGR4b3pqekViaTUrTzlwMGYxbHorSG9BWGphUUFDdk5lUHZuWEptb0pJUkx2d3hjSDdRYWdZNjJqQ2Q4MkVPZEwgRDlmN2pnTTdRWUJQTmxsWEpKSTJlVTBEQXMrZVh1Kzd3R1RONlEwRm5kMUk1Q2tBdlEyVjNNM2VzTkd2VzhTSE5HUGlrQm9YWHY0aSBBSk1QUVhkVFdpL0tHMUUxeUVTeG5KRVZKNFVSV1FyQVdJTkh4Tk0rQ1Y2eDAxUzlPT2tFNkFYNXhWVy96eGxUM2VLcE9EMThjOXJuIEZsZFdBZnhqdzNrMHNYb3NsZ0lNZXNSVUdBQS96eXVxdUJOZ00zUHRXNkZmY1UxbW42S3EwWGtsbFpWNXhaVWY1QlZYcnM0dnJyd2sgMFRtRVNGV0JRRUNEMGFwVldRK0ZRTjk5Wk1rUUkxTUtaOWY3K25nVW5vUEJaMnhGNHBVVmh0NEY4S3JCa3UyVlFsMTV5RmRvb3RqcyBlbDhmQlJWaXdGaURSMFF6cGc1ZHV0RlVQUkUvMG95Snd5Qm00QUhEUlkrRDVzVjVSVlcvR0RCZ3VqZXFDbU9xbmZ5U3Ftc2NsMTZGIGdmMW9EckJWay9Hdk4xNGNCdC9xN0lpOGxWdGNWYlovdjdCREdqQmd1amUvcU9MeUxNZnpOb0V1aTBPV3VqVjFZOWZFVWlBRDdoTXcgczZyaVBrUy95Q3V1WEpnenN0clUzY1hERzdMRWsxOVU0YzhycnB3ZHhwYVBGZkhUWUl3RmNBS0FmQVlla3FtVFFyUUNHYmtKMk50MSB2VEd2Rmp0amtXK1FxL0F5RVB0eSs4SStKdHh2dUdRWE1HcktHM3kvKzlQeWdWRTlwOGdNbWhuMFQzUVZ2UWJnUElQWjlwRFc5eGlzIEorTElZenVBU0Y2NmcyZW1zeVB5Y3dBbVYwUE1CUEdkRzQvck9EbTN1UEloY2lQekdvTlhyRDdhbS9MOGovVms4b3loSFpGckdEak4gWUo3OStJOXJGNDdmYkw1dVhKMUk0Qm1jblhsdmJsSFZFZ0plaGVLUHdhUVp1anNSbmIyUk1ReG0vLzRPb3BsaWZvWmlWZTJFYmZuRiBsZmN6OEVzVG1mYWhZc2VOck13cnJyd2YydjFMWS8zRURhWXE5eDFkMlVPSHVZQkJoWVFOSlF6cWZvU1g5OHg1OWZTZVRjQjZVOGNYIG9pMGpvamVZK2VKWTZ6RFRiMlkwRlB4clNtR292clh2cmE0ZTQyenJ0dVYvV09OT0FCbXhaaEhKNFNObjd4TzlJeGtCQVAwTWx2VUEgdUszanpvNC9LQThWUHN6UVQwd3BXSFRVeFVJZXJ2Y2Q1M1g0dXpORGRBMklqV3pMY3lBR0hwN2thNGg1bEZra2hqUmo0ckNhNXBYdSB6aXV1dWhmZ1A4U2hmQjRCZDhQeDNKMVhYTFVLNExmQitCQ2d6VXc2ckppSUNjY0N5QU53Qm9EVENCeUhHQUFJLy9GeTExUytnOVNKIGlMOEQ0RHY3dmtVTUFpRmUzNjREdkxHdTd2SUZ3TmpZSzJVMjM0Zm16T3VBMlBjWU9rQjdBRCtIY203T0s2NE1FZEVDY3VuRjFjMDkgM3NIU29aR2p2anNRVUwxZjd0ZkxZWld2RkowSjVvRU1YS0RET0FYN3ZzTXQ0dEhoN3BCbVRJZ1cwVm8vUzBUWEd5amxKYWluWnpiNCBmdEcwYk5DZkFvRkFpNTVGSzYvM0RkdXF0dndlVE9jYnlDQ1NTR0RvMHNqTUJ0L3ZHSmdWaC9JOXdmUnJndlByOG9iQ1JoQzlDY1lIIElON0VXdTBGQUNJK0JrQXU5bDNUbk1GTThacE92ODdKenJvalRyVkZIRWd6Sm82b1F3ZG4ybzRka1N1eDcrUVJKOXdQUUw5OVY3ZjcgR29rRVB2SERDangxVlcxSmM4S08yRVl3NmRzQk10THlyWG5xcWkxNVJaVy9CU0VlVFhFR2dCSm1MbUhGeU12ZTBJeml5dlZFV0s4WiB1eFRSTmdZY2dEc3hJNE9BOWdCMXhzdWNDeUFEQkRCSC8yVzZydXBvN0NzUm9vMWo0c1VFMmdQQXhETmZtUXo4b2ZmZy8yL3Yzb1BqIHJNNDdqditlc3l2ZkpOK2dHUVliMjhGbU9nbHBTNU5BV3d5VCtpTEx5Qk0zS1FRRlNhNWJnaTlKNllUQVRLY2tUWXRLU3hneVU3Y2ggVFF1RFNUTXRUUk41cGlFNDZMSnlpaWZHaHFZaE5BUXdGQnUwd2hpSU1iWnNDMkZKZTU3KzRaaEFpbzFXKys2K0svSDkvT00vclBlYyAzKzdPWHA1enpudk9ycy9jMWROd2g3djN6RG84NjZkTlRWc0tKLytndmYzS3pKR1ovZS8zakpZcHFsV20zMHJxZUNkVW4zMDdGMzlqIDdpVzcxa202dUh5OTJBSzVGa2lTM0dUSmZFMk92dmVvYTYrNTlMNmpGZTBVSmFFWXcyazlzYVZwYUg3alBSdE40UWVhbVBjWWJucXUgby9VSGFZY1liOHkwSTkreDVudEp0cG1mbnQyMDROaklGVXJ3QnVaVG1DeHBvYnNXbXQ1YWFQM2lKMWh5WDU0aFdGMWlqUUVUM01ZViAyL28zNXhydWRkTlZDVGE3VU5LWHpVejlzL3NINytwcE9DVHBxS1JwL2VwL2o2UXBjbEdEdlF1MHRiWEZ6ZDBOR3p6b3g1TEdkdTk2IEZYUHA2K3RYNXJhbW5RUEZtWWcvcnBHd3ZzNDFPMlg2MjdSemxNRi81Z2ZQdmpIdEVPUFE2eHJSaHNSYjNkSlVVQWhYUzNvOThiYlQgNUFWKzRnRkZLRmo4V2htYm55cHBqazVzeWpGUHljekFZUnhadHpMM3VCSzlSN2xLdUg1WWt4MjZOdTBZS0I3RkdFWWxYNXY5dkV0RiAzd2hkeFo0ZHp1cVRvN3AzQ0c5aHBwdDdjeTFQbGFQdC9QMVg3VGIzcTFXSk85NHF4QlZZQWdzVVllT0tiUSs2bEVzN0J5YXVkZlc1IDJ5UnZUenRIZ2w1VVRlYUtxNWR1bjFpRG1lOFNGR01ZblMxTkJRVnZsdlJrMmxFU3NEZVR6UzdkdjdXRjh6ZUsxOUZibXkzclppZTkgWGEzZk10T2ZsN09QU3JLTUJ0UE9BSXc3R2J0QlVqVVBaRXlZQWFOM0l6TjVmSDNLMVpML2Q5cFpFckEvWk1MUzlVczc5NlVkQkdORCBNWVpSNjd1LzlWQzJNTEpVcHAra25XV3NYSHBtUkhISnMxdWIrdExPOGc3MnliVTU3UkMvWkhkbU9OdWlMVTJGZC83VDB2UjJ0TnpxIHJsdkwzVThsV0tIMFEyeUJkNXNOeTdxZmtQVFhhZWM0aGNmTTdQYTBRNkEwRzFkdmZTM0tWOGkxSyswc1krYmFWM0JmY3MyeXJxZlQgam9LeG94aERVZmJtMXY2c1VNZ3VrL1JRMmxtSzVmTGNTRmFMWCtoY014NUdqd3I1cnVZTkpyc3Q3U0EvdHplWU56NjdyYW0vVWgzMiBkYlY4d2FYUFNoclZsdFJWNnRpWkI0NndyVDB3Qmkvc1hIeXJTL2VtbmVNdFRJOU1zc0l5ZHorUWRoU1VidU9LYmYxRE5VTXI1ZXBKIE84c1k3QXp5My81MFE4OHphUWRCYVNqR1VMUjkzVTJ2MXRWbGw3ajA5eG9mU3pXaTNQK21yNjVtMWZoYW1tamUyOWw4bzhuL1dOSncgaWtGMnh4SDd5SE1kcmZsS2Q5elgyZkpWS1h4VTBrdVY3anNScHEyUFBMSXh6ZGNPR0xmYTJ0cmlsS2cxa205UE80c2t5V3pMNUlKKyA5dy9ydjM4dzdTaEl6clZMdHgrYmVYaG1vNXZmclBFeStPZTZQYzQrdUpTRG5TY0dpakdNeVJOYm1vYjZPbHV1ajI0ZmwxVE5NMDJQIG11SWwrYTdXdjZqRThycHk2TzFzL1NkemE1QlU4VUxTcEsyRm1MMzArWjdtMUQ3dzg1MVhkZFlvK3h1U3ZwTldoakhhRzdLNlB1MFEgd0hpMmRtVnU0R2p0c1ZXU3ZwdGlqQ0YzdTNIZDh1NVBybDJaRzBneEI4cWtxV2xMWVVOOXowM20zaUJwYjlwNVRtTjNNRnUydmlGMyAzY1lMSDJHZ2I0S2dHRU5KbnU5cXZ1LzF3c2o3VExwWnFxcU5DbDZXMlovazY3SVg5WGF1ZVRqdE1LWHE3V3JlSGtmc0FwZFhhb2V4IFFYTzdvYmV6K1dQN3VwdGVyVkNmcDdTbnMrbEF2clBsY2pjMVNIb2s3VHp2NEJVei82c2F4UTg5ZDEvTHkwazBhSVZNSXFPMUpxdkUgcUcvSmZVU1B4YmZoSVpuSFppcmJvSTFiSnBHMkxTVDBXTjlHdElUYWptTjREVS9oaHNVUERhNnJ6LzIrdTM5TzBtdEp0VHRLUDRxSyBGMjVvNkw3TjdFMHJRVW81Q1Q0QkZoTDZUUER4OHBuZ0ZabXhXdGZROC8zQjRjd0gzTzFHblRpTHJsb2NOUE0vaTdNUFhuQk5mZmNEIGFZZEJzaWpHVUxLWGMyc0hlanRiYmxJc0xKSjBpNlFVMTlMYkhuTjkyZ2FQdnpmZjBmeTE4VG9iOW5hZTcybmUzOWZaY3RuUGx5MGUgS2xNMzd2SnZCL1AzOTNZMS81MWtWYlVNdGEranBTZmYyWHlSVEorUTZ3RlZ6ekxaSVpudU45bFZoYnJzL042TzFyWTluV3VPSk5YNCBqTHJ3dkJKWXFobmRmNVJBbkhkU2NoK21VSFFiR1J2NUgwbWxIbFVSWFlWSFMyempsQkxLZU54aWZDeUpQRy9IVkhoU3BiK3ZqbWZjIGZwcEVucFBNNUJzYWVyNWlJWHUrekxhbzNPOTkxejV6WC85Q2R1amlqU3UyL2YvSFltR3NLMElHWmh5c2ZiRzBjTkxrUXR3cnFlU0IgTWxjcysyZUNKZktaVUhvYm8vWFpWWjNITnpSMDN4YXpRd3NsZlZGU3lhOVhDZnJjL1hPVG94YXNxKy81TXJOaEV4T0hrU0p4NTF6WiBQalY3ZEtSSnBzdGRXcUVUaDJ5VzB5c20rNC9vYXUrYm50bWVkZ0cyb1BHYmowcjZ6UktieWVjN1c5NTdxditjcy9xYnYxSXpZamRKIC9rZVM2a3JzUzVJRzNlemJzdmdQZmZlM1Z2dk0weHNXcnZyV3I0NG9YbTJ1ajByNnRRcDI3Wktla2ZTZ1RCMVRzb081cCsrN3BxeWogcVBNYjd6bmZGRzZSdkVHeWFVVmM2cEorWXU1ZjZlMXEvVWFaNHIzaHZNYjI5d3o3eUpka3VrTFM3Q0l2ZjFhdU8vTFRzNXZHOGo2KyBxN3RobVRLNlNhN0ZrckpGWERyaTBnNHozYnErUGxmV0cvazM1MVlzOTJCL09ZYU14eVhiN3NGdjNyQThWOWJkM3paM042ejJvQzlJIHVraFNwb2hMaDJYYUlWbmIrdnJ1SFdXS0owbjYrcmJHOHd1SzE3dDdrMGt6RW16NmNibmZrYTBadnZ0MFp6YmQzdEU0ZWVxaytLOXkgdjF5amY0NmVkZE4xRytwejMwc2k2TjFkS3k4b1pPSXRKbHVtNHI1bm82UWZ5MzNUK29hZWYwOGl5K25jblZzeEo4cStKTlBISmMwcyA3bXI3WC9mNGovdDNYZkxWdHJhMlZPN25hbSsvY3RMaE0vb3ZENjVQdUhTWnBOcXlkbWc2WkxMdlJ2TjJuM2x3R3dYWXhFY3hockk2IHErRmZhcWVFbWdaWlhDelpSWkkrSkdsNmljMitZdEpETG4vWVpEdDdCOC9lV1UySE4xZWlHRHZwdk1aN1pneDdXT1BtSHpQWlJ5Uk4gS2FLUFEyYTJ6VjFkaFppNXR4cVdJNVppYnVNOTUyU1ZhWkQ4ZHlSOVVDZUtzMktlajFNNUp1a3BrNTZVYTdma2o4YU1mdGgzZjJ1NSBaaWRQNjhNZnZyUG00Sm5URjhWZ2M2VjRSZ2hXNSs2MUx0V2FiTVRsUjROQ2Y3VENnRWU5YkJuYmswcld0cll3NzcvZWQyN0dmWjRIIFA5UGRhNE5VRzZVWkoyWmMvWEJ3TzFxUURZU01YZ2taMzV2VXNzNDd0NjZlRnFZT24yZnlPWXB4dXFTWlVhcVZ3aFFwdmg2a0FVbjkgQ3VHb3kvYkh3Wm85RzFkdnJlanl0OUZtak9aSFFnd3ZaQ1lON2FuMGdhNTNQL2g3MHd1dkRTNVN4czRPQmErTEZtYko0N1JxZWg0MyA3YnA0YXQzQWpGVkJ2dEtsNVpJV0Z0bUV1K2t4YytXQ2hlOWNVOTlWMUU3QmQvYlV6OHpFY0lHYnovZGdNeFR0amU4M014MDMrUkdaIDdSOGV0cWMrMDlqVlcyUzJVV2x2djNMU3NUT09uVGVpT0NmRU9Oc3QxSmxVRzEyMUNuSFlaTWZjN1hDUUJqejZTekhFUFJ0WGJLdlkgenJodnlwbDVkZGJoaFRVaG5CUGxaOXFKejROYVJadHU1bEdtZnBlT2hJSUdQTVFEbWVHYXZaOWExVmxWdTFiKzh3TkxwaFJHSmk5MyArYVVuZnRQNGhTcTZ3UHdscGtNVzliQUhmOGlpZHMwNFBHdEhVOU9Xb1dRU1l6eWdHRU5sWGRtZW1mL2E4SUlRYlY0MG0yL3U4MDAyIFhkSnNOMlZPam5DNisyR1poczN0YUZROEZCUjZwVUplTnFtM3Q2T3BxbmZXcTJReDltWnpWbStkVmpOODlBSTMvL1VnV3lUWnJLZzQgMDh5aXVSMTE4MzVGSFhEVFV6RVdkdStiTWZtNXRHY1J5MnJKQTlsenAreGJGQzB6MTgzbXl1T2NvREJiSjJkcjdNUy8wZjIxSUR2dSA3c2Y4eE96RFM4RzhyK0R4aGVDK0w5LzlCMmt1VVFGUWhNMWRLODlRaUIvMFlJdmttaVA1V1hLYnFtRFRKRDh1OTJPeThLcmtlWS8rIDlPUVFIMmQzUkl5VnUreU9yc3NXWkd0OG5tSmNZTUhtU1Q0elJwdGx3VEw2UmFIV0wvZGhNejhpV2IvYzhqRjRiNmJndlo5YTBmUGkgVys1SHhMc094UmlRc0xTS01RQUFBSXd2Yk9BQkFBQUFBQ21nR0FNQUFBQ0FGRkNNQVFBQUFFQUtLTVlBQUFBQUlBVVVZd0FBQUFDUSBBb294QUFBQUFFZ0J4UmdBQUFBQXBJQmlEQUFBQUFCU1FERUdBQUFBQUNtZ0dBTUFBQUNBRkZDTUFRQUFBRUFLS01ZQUFBQUFJQVVVIFl3QUFBQUNRQW9veEFBQUFBRWdCeFJnQUFBQUFwSUJpREFBQUFBQlNRREVHQUFBQUFDbWdHQU1BQUFDQUZGQ01BUUFBQUVBS0tNYUEgNUkxVVNSc0FBQUNvWWhSalFNTGN0SzNrTnVROVNXUUJBQUJBOWFJWUF4TFdWNXY5b21SL0t0bWU0cSsyUGViNi9QUzZtdXVTVHdZQSBBSUJxWW1rSEFDYXljMWY5MjRJWTlRRUxkcGE3MTdwVUd4Um1TNUxjRDBmVGdNa0czQW8vczVINFJENjM5cm1VSXdNQUFBQUFBQUFBIEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEgQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIEFQd2ZsZ0F4VXNvbnJrY0FBQUFBU1VWT1JLNUNZSUk9ICIKKyAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIgorICAgICAgIGhlaWdodD0iNTQuMjA0MTUxIgorICAgICAgIHdpZHRoPSI2NSIgLz4KKyAgPC9nPgorICA8ZworICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgorICAgICBpZD0ibGF5ZXIyIgorICAgICBpbmtzY2FwZTpsYWJlbD0iQkFER0UiCisgICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiCisgICAgIHNvZGlwb2RpOmluc2Vuc2l0aXZlPSJ0cnVlIj4KKyAgICA8ZworICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKKyAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzQwLjAwMDAxLC01ODEpIgorICAgICAgIGlkPSJnNDM5NCIKKyAgICAgICBjbGlwLXBhdGg9Im5vbmUiPgorICAgICAgPGcKKyAgICAgICAgIGlkPSJnODU1Ij4KKyAgICAgICAgPGcKKyAgICAgICAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJtYXNraGVscGVyIgorICAgICAgICAgICBpZD0iZzg3MCIKKyAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODczKSIKKyAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC42O2ZpbHRlcjp1cmwoI2ZpbHRlcjg5MSkiPgorICAgICAgICAgIDxjaXJjbGUKKyAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjQ5OTk5OTIsMCwwLDEuNDk5OTk5MiwtMjkuOTk5Nzk1LC0yMzcuNTQyODIpIgorICAgICAgICAgICAgIGlkPSJwYXRoODQ0IgorICAgICAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgorICAgICAgICAgICAgIGN4PSIyNTIiCisgICAgICAgICAgICAgY3k9IjU1Mi4zNjIxOCIKKyAgICAgICAgICAgICByPSIxMiIgLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8ZworICAgICAgICAgICBpZD0iZzg2MiI+CisgICAgICAgICAgPGNpcmNsZQorICAgICAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO2ZpbGw6I2Y1ZjVmNTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgorICAgICAgICAgICAgIGlkPSJwYXRoNDM5OCIKKyAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjQ5OTk5OTIsMCwwLDEuNDk5OTk5MiwtMjkuOTk5Nzk1LC0yMzguNTQyODIpIgorICAgICAgICAgICAgIGN4PSIyNTIiCisgICAgICAgICAgICAgY3k9IjU1Mi4zNjIxOCIKKyAgICAgICAgICAgICByPSIxMiIgLz4KKyAgICAgICAgICA8Y2lyY2xlCisgICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4yNSwwLDAsMS4yNSwzMywtMTAwLjQ1MjczKSIKKyAgICAgICAgICAgICBpZD0icGF0aDQ0MDAiCisgICAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojZGQ0ODE0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDo0O21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCisgICAgICAgICAgICAgY3g9IjI1MiIKKyAgICAgICAgICAgICBjeT0iNTUyLjM2MjE4IgorICAgICAgICAgICAgIHI9IjEyIiAvPgorICAgICAgICAgIDxwYXRoCisgICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0ic3RhciIKKyAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtmaWxsOiNmNWY1ZjU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKKyAgICAgICAgICAgICBpZD0icGF0aDQ0NTkiCisgICAgICAgICAgICAgc29kaXBvZGk6c2lkZXM9IjUiCisgICAgICAgICAgICAgc29kaXBvZGk6Y3g9IjY2Ni4xOTU3NCIKKyAgICAgICAgICAgICBzb2RpcG9kaTpjeT0iNTg5LjUwMzg1IgorICAgICAgICAgICAgIHNvZGlwb2RpOnIxPSI3LjI0MzExNzgiCisgICAgICAgICAgICAgc29kaXBvZGk6cjI9IjQuMzQ1ODcwNSIKKyAgICAgICAgICAgICBzb2RpcG9kaTphcmcxPSIxLjA0NzE5NzYiCisgICAgICAgICAgICAgc29kaXBvZGk6YXJnMj0iMS42NzU1MTYxIgorICAgICAgICAgICAgIGlua3NjYXBlOmZsYXRzaWRlZD0iZmFsc2UiCisgICAgICAgICAgICAgaW5rc2NhcGU6cm91bmRlZD0iMC4xIgorICAgICAgICAgICAgIGlua3NjYXBlOnJhbmRvbWl6ZWQ9IjAiCisgICAgICAgICAgICAgZD0ibSA2NjkuODE3Myw1OTUuNzc2NTcgYyAtMC4zOTEzMiwwLjIyNTkzIC0zLjYyNjQ1LC0xLjkwMzQzIC00LjA3NTgzLC0xLjk1MDY2IC0wLjQ0OTM4LC0wLjA0NzIgLTQuMDU2NTMsMS4zNjI5NyAtNC4zOTIzMiwxLjA2MDYyIC0wLjMzNTgsLTAuMzAyMzUgMC42ODk2MywtNC4wMzcxNSAwLjU5NTY5LC00LjQ3OTEzIC0wLjA5MzksLTAuNDQxOTggLTIuNTQ5OCwtMy40MzY4MSAtMi4zNjYwMiwtMy44NDk2IDAuMTgzNzksLTAuNDEyNzkgNC4wNTI2NywtMC41OTE2NiA0LjQ0Mzk4LC0wLjgxNzU5IDAuMzkxMzIsLTAuMjI1OTMgMi40ODA2NywtMy40ODcwNCAyLjkzMDA1LC0zLjQzOTggMC40NDkzOCwwLjA0NzIgMS44MTUwNSwzLjY3MTQ3IDIuMTUwODQsMy45NzM4MiAwLjMzNTgsMC4zMDIzNiA0LjA4Mjk0LDEuMjgxNyA0LjE3Njg5LDEuNzIzNjkgMC4wOTM5LDAuNDQxOTggLTIuOTMwOSwyLjg2MDc2IC0zLjExNDY5LDMuMjczNTUgLTAuMTgzNzksMC40MTI3OSAwLjA0MjcsNC4yNzkxNyAtMC4zNDg1OSw0LjUwNTEgeiIKKyAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjUxMTQyMywtMC4xNjM2NjM3NywwLjE2MzY2Mzc3LDEuNTExNDIzLC03NTUuMzczNDYsLTE5MS45MzY1MSkiIC8+CisgICAgICAgIDwvZz4KKyAgICAgIDwvZz4KKyAgICA8L2c+CisgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL2xheWVyLnlhbWwgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vbGF5ZXIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA3OGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL2xheWVyLnlhbWwKQEAgLTAsMCArMSwyNSBAQAoraW5jbHVkZXM6CisgIC0gJ2xheWVyOmJhc2ljJworICAtICdpbnRlcmZhY2U6bXlzcWwnCisgIC0gJ2ludGVyZmFjZTpvcGVudmltLWNvbXB1dGUnCisgIC0gJ2ludGVyZmFjZTpvcGVudmltJworb3B0aW9uczoKKyAgYmFzaWM6CisgICAgcGFja2FnZXM6CisgICAgICAtIGdpdAorICAgICAgLSBzY3JlZW4KKyAgICAgIC0gd2dldAorICAgICAgLSBteXNxbC1jbGllbnQKKyAgICAgIC0gcHl0aG9uMy1naXQKKyAgICAgIC0gcHl0aG9uLXlhbWwKKyAgICAgIC0gcHl0aG9uLWxpYnZpcnQKKyAgICAgIC0gcHl0aG9uLWJvdHRsZQorICAgICAgLSBweXRob24tbXlzcWxkYgorICAgICAgLSBweXRob24tanNvbnNjaGVtYQorICAgICAgLSBweXRob24tcGFyYW1pa28KKyAgICAgIC0gcHl0aG9uLWFyZ2NvbXBsZXRlCisgICAgICAtIHB5dGhvbi1yZXF1ZXN0cworICAgICAgLSBweXRob24tbm92YWNsaWVudAorICAgICAgLSBweXRob24ta2V5c3RvbmVjbGllbnQKKyAgICAgIC0gcHl0aG9uLWdsYW5jZWNsaWVudAorICAgICAgLSBweXRob24tbmV1dHJvbmNsaWVudApkaWZmIC0tZ2l0IGEvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL21ldGFkYXRhLnlhbWwgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vbWV0YWRhdGEueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDQ0NzM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL21ldGFkYXRhLnlhbWwKQEAgLTAsMCArMSwyNCBAQAorbmFtZTogb3BlbnZpbQorc3VtbWFyeTogT3BlbiBWaXJ0dWFsIEluZnJhc3RydWN0dXJlIE1hbmFnZXIKK21haW50YWluZXJzOgorICAtIFJ5ZSBUZXJyZWxsIDxyeWUudGVycmVsbEBjYW5vbmljYWwuY29tPgorICAtIEdlb3JnZSBLcmFmdCA8Z2VvcmdlLmtyYWZ0QGNhbm9uaWNhbC5jb20+CitkZXNjcmlwdGlvbjogfAorICBJbnN0YWxscyBhbmQgY29uZmlndXJlcyB0aGUgT3BlblZJTSBjb250cm9sbGVyIGZyb20gT3Blbk1BTk8uCit0YWdzOgorICAtIG5mdgorICAtIHRlbGNvCisgIC0gb3NtCitzZXJpZXM6CisgIC0geGVuaWFsCitleHRyYS1iaW5kaW5nczoKKyAgcHVibGljOgorICBpbnRlcm5hbDoKK3JlcXVpcmVzOgorICBkYjoKKyAgICBpbnRlcmZhY2U6IG15c3FsCisgIGNvbXB1dGU6CisgICAgaW50ZXJmYWNlOiBvcGVudmltLWNvbXB1dGUKK3Byb3ZpZGVzOgorICBvcGVudmltLWNvbnRyb2xsZXI6CisgICAgaW50ZXJmYWNlOiBvcGVudmltCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vcmVhY3RpdmUvb3BlbnZpbS5weSBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS9yZWFjdGl2ZS9vcGVudmltLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMWE5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vcmVhY3RpdmUvb3BlbnZpbS5weQpAQCAtMCwwICsxLDI3MyBAQAoraW1wb3J0IG9zCitpbXBvcnQganNvbgoraW1wb3J0IHRpbWUKK2ltcG9ydCBzdWJwcm9jZXNzCitmcm9tIGdpdCBpbXBvcnQgUmVwbyBhcyBnaXRyZXBvCitmcm9tIHNodXRpbCBpbXBvcnQgcm10cmVlCisKK2Zyb20gY2hhcm1zLnJlYWN0aXZlIGltcG9ydCB3aGVuLCB3aGVuX25vdCwgc2V0X3N0YXRlCitmcm9tIGNoYXJtaGVscGVycy5jb3JlLnRlbXBsYXRpbmcgaW1wb3J0IHJlbmRlcgorZnJvbSBjaGFybWhlbHBlcnMuY29yZS5ob29rZW52IGltcG9ydCAoCisgICAgc3RhdHVzX3NldCwKKyAgICBsZWFkZXJfc2V0LAorICAgIGxlYWRlcl9nZXQsCisgICAgdW5pdF9wdWJsaWNfaXAsCispCitmcm9tIGNoYXJtaGVscGVycy5jb3JlLnVuaXRkYXRhIGltcG9ydCBrdgorZnJvbSBjaGFybWhlbHBlcnMuY29yZS5ob3N0IGltcG9ydCAoCisgICAgc3ltbGluaywKKyAgICBta2RpciwKKyAgICBjaG93bnIsCisgICAgc2VydmljZV9zdGFydCwKKykKK2Zyb20gY2hhcm1oZWxwZXJzLmNvbnRyaWIudW5pc29uIGltcG9ydCAoCisgICAgY3JlYXRlX3ByaXZhdGVfa2V5LAorICAgIGNyZWF0ZV9wdWJsaWNfa2V5LAorICAgIGVuc3VyZV91c2VyLAorKQorCisKK2RlZiBzaChjbWQpOgorICAgIHJldHVybiBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChjbWQsIHNoZWxsPVRydWUpCisKKworZGVmIHNoX2FzX29wZW52aW0oY21kKToKKyAgICByZXR1cm4gc2goJ3N1ZG8gLWl1IG9wZW52aW0gJyArIGNtZCkKKworCitkZWYgY3JlYXRlX29wZW52aW1fdXNlcigpOgorICAgIHN0YXR1c19zZXQoIm1haW50ZW5hbmNlIiwgIkNyZWF0aW5nIE9wZW5WSU0gdXNlciIpCisgICAgZW5zdXJlX3VzZXIoJ29wZW52aW0nKQorCisKK2RlZiBpbml0aWFsaXplX29wZW52aW1fZGF0YWJhc2UoZGIpOgorICAgIHN0YXR1c19zZXQoIm1haW50ZW5hbmNlIiwgIkluaXRpYWxpemluZyBPcGVuVklNIGRhdGFiYXNlIikKKyAgICBzaF9hc19vcGVudmltKCIvb3B0L29wZW5tYW5vL29wZW52aW0vZGF0YWJhc2VfdXRpbHMvaW5pdF92aW1fZGIuc2ggLXUgJXMgLXAgJXMgLWQgJXMgLWggJXMiICUgKAorICAgICAgICBkYi51c2VyKCksCisgICAgICAgIGRiLnBhc3N3b3JkKCksCisgICAgICAgIGRiLmRhdGFiYXNlKCksCisgICAgICAgIGRiLmhvc3QoKQorICAgICkpCisKKworZGVmIGdlbmVyYXRlX3NzaF9rZXkoKToKKyAgICBzdGF0dXNfc2V0KCJtYWludGVuYW5jZSIsICJHZW5lcmF0aW5nIHNzaCBrZXkiKQorICAgIHVzZXIgPSAib3BlbnZpbSIKKyAgICBmb2xkZXIgPSAiL2hvbWUvJXMvLnNzaCIgJSB1c2VyCisgICAgbWtkaXIoZm9sZGVyLCBvd25lcj11c2VyLCBncm91cD11c2VyLCBwZXJtcz0wbzc3NSkKKyAgICBwcml2YXRlX3BhdGggPSAiJXMvaWRfcnNhIiAlIGZvbGRlcgorICAgIHB1YmxpY19wYXRoID0gIiVzLnB1YiIgJSBwcml2YXRlX3BhdGgKKyAgICBjcmVhdGVfcHJpdmF0ZV9rZXkodXNlciwgcHJpdmF0ZV9wYXRoKQorICAgIGNyZWF0ZV9wdWJsaWNfa2V5KHVzZXIsIHByaXZhdGVfcGF0aCwgcHVibGljX3BhdGgpCisKKworZGVmIGFkZF9vcGVudmltX3RvX3BhdGgoKToKKyAgICBzdGF0dXNfc2V0KCJtYWludGVuYW5jZSIsICJBZGRpbmcgT3BlblZJTSB0byBwYXRoIikKKyAgICBzeW1saW5rKAorICAgICAgICAnL29wdC9vcGVubWFuby9zY3JpcHRzL3NlcnZpY2Utb3Blbm1hbm8uc2gnLAorICAgICAgICAnL3Vzci9iaW4vc2VydmljZS1vcGVubWFubycpCisgICAgc3ltbGluaygnL29wdC9vcGVubWFuby9vcGVudmltL29wZW52aW0nLCAnL3Vzci9iaW4vb3BlbnZpbScpCisKKworZGVmIGRvd25sb2FkX29wZW52aW0oKToKKyAgICBzdGF0dXNfc2V0KCJtYWludGVuYW5jZSIsICJEb3dubG9hZGluZyBPcGVuVklNIikKKyAgICBpZiBvcy5wYXRoLmlzZGlyKCIvb3B0L29wZW5tYW5vIik6CisgICAgICAgIHJtdHJlZSgiL29wdC9vcGVubWFubyIpCisgICAgZ2l0cmVwby5jbG9uZV9mcm9tKCdodHRwczovL2dpdGh1Yi5jb20vdHZhbnN0ZWVuYnVyZ2gvb3Blbm1hbm8uZ2l0JywgJy9vcHQvb3Blbm1hbm8nKQorICAgIGNob3ducignL29wdC9vcGVubWFubycsIG93bmVyPSdvcGVudmltJywgZ3JvdXA9J29wZW52aW0nLCBmb2xsb3dfbGlua3M9RmFsc2UsIGNob3dudG9wZGlyPVRydWUpCisKKworZGVmIGNvbmZpZ3VyZV9vcGVudmltKGRiKToKKyAgICBzdGF0dXNfc2V0KCJtYWludGVuYW5jZSIsICJDb25maWd1cmluZyBPcGVuVklNIikKKyAgICByZW5kZXIoCisgICAgICAgIHNvdXJjZT0ib3BlbnZpbWQuY2ZnIiwKKyAgICAgICAgdGFyZ2V0PSIvb3B0L29wZW5tYW5vL29wZW52aW0vb3BlbnZpbWQuY2ZnIiwKKyAgICAgICAgb3duZXI9Im9wZW52aW0iLAorICAgICAgICBwZXJtcz0wbzY2NCwKKyAgICAgICAgY29udGV4dD17ImRiIjogZGJ9CisgICAgKQorCisKKyMgVE9ETzogcG9zc2libHkgY29tYmluZSBhbGwgb2YgdGhlc2UgY3JlYXRlIGZ1bmN0aW9ucz8KK2RlZiBjcmVhdGVfdGVuYW50KCk6CisgICAgc3RhdHVzX3NldCgibWFpbnRlbmFuY2UiLCAiQ3JlYXRpbmcgdGVuYW50IikKKyAgICByZW5kZXIoc291cmNlPSJ0ZW5hbnQueWFtbCIsIHRhcmdldD0iL3RtcC90ZW5hbnQueWFtbCIsIG93bmVyPSJvcGVudmltIiwgcGVybXM9MG82NjQsIGNvbnRleHQ9e30pCisgICAgY21kID0gJ29wZW52aW0gdGVuYW50LWNyZWF0ZSAvdG1wL3RlbmFudC55YW1sJworICAgIHRlbmFudF91dWlkID0gc2hfYXNfb3BlbnZpbShjbWQpLnNwbGl0KClbMF0KKyAgICB0ZW5hbnRfdXVpZCA9IHN0cih0ZW5hbnRfdXVpZCwgJ3V0Zi04JykKKyAgICBsZWFkZXJfc2V0KHsndGVuYW50JzogdGVuYW50X3V1aWR9KQorICAgIHJldHVybiB0ZW5hbnRfdXVpZAorCisKK2RlZiBjcmVhdGVfaW1hZ2UoKToKKyAgICBzdGF0dXNfc2V0KCJtYWludGVuYW5jZSIsICJDcmVhdGluZyBpbWFnZSIpCisgICAgcmVuZGVyKHNvdXJjZT0iaW1hZ2UueWFtbCIsIHRhcmdldD0iL3RtcC9pbWFnZS55YW1sIiwgb3duZXI9Im9wZW52aW0iLCBwZXJtcz0wbzY2NCwgY29udGV4dD17fSkKKyAgICBjbWQgPSAnb3BlbnZpbSBpbWFnZS1jcmVhdGUgL3RtcC9pbWFnZS55YW1sJworICAgIGltYWdlX3V1aWQgPSBzaF9hc19vcGVudmltKGNtZCkuc3BsaXQoKVswXQorICAgIGltYWdlX3V1aWQgPSBzdHIoaW1hZ2VfdXVpZCwgJ3V0Zi04JykKKyAgICByZXR1cm4gaW1hZ2VfdXVpZAorCisKK2RlZiBjcmVhdGVfZmxhdm9yKCk6CisgICAgc3RhdHVzX3NldCgibWFpbnRlbmFuY2UiLCAiQ3JlYXRpbmcgZmxhdm9yIikKKyAgICByZW5kZXIoc291cmNlPSJmbGF2b3IueWFtbCIsIHRhcmdldD0iL3RtcC9mbGF2b3IueWFtbCIsIG93bmVyPSJvcGVudmltIiwgcGVybXM9MG82NjQsIGNvbnRleHQ9e30pCisgICAgY21kID0gJ29wZW52aW0gZmxhdm9yLWNyZWF0ZSAvdG1wL2ZsYXZvci55YW1sJworICAgIGZsYXZvcl91dWlkID0gc2hfYXNfb3BlbnZpbShjbWQpLnNwbGl0KClbMF0KKyAgICBmbGF2b3JfdXVpZCA9IHN0cihmbGF2b3JfdXVpZCwgJ3V0Zi04JykKKyAgICByZXR1cm4gZmxhdm9yX3V1aWQKKworCisjIFRPRE86IGVzcGVjaWFsbHkgY29tYmluZSB0aGVzZSBzdHVwaWQgbmV0d29yayBmdW5jdGlvbnMKK2RlZiBjcmVhdGVfZGVmYXVsdF9uZXR3b3JrKCk6CisgICAgc3RhdHVzX3NldCgibWFpbnRlbmFuY2UiLCAiQ3JlYXRpbmcgZGVmYXVsdCBuZXR3b3JrIikKKyAgICByZW5kZXIoc291cmNlPSJuZXQtZGVmYXVsdC55YW1sIiwgdGFyZ2V0PSIvdG1wL25ldC1kZWZhdWx0LnlhbWwiLCBvd25lcj0ib3BlbnZpbSIsIHBlcm1zPTBvNjY0LCBjb250ZXh0PXt9KQorICAgIGNtZCA9ICdvcGVudmltIG5ldC1jcmVhdGUgL3RtcC9uZXQtZGVmYXVsdC55YW1sJworICAgIG5ldF9kZWZhdWx0X3V1aWQgPSBzaF9hc19vcGVudmltKGNtZCkuc3BsaXQoKVswXQorICAgIG5ldF9kZWZhdWx0X3V1aWQgPSBzdHIobmV0X2RlZmF1bHRfdXVpZCwgJ3V0Zi04JykKKyAgICByZXR1cm4gbmV0X2RlZmF1bHRfdXVpZAorCisKK2RlZiBjcmVhdGVfdmlyYnJfbmV0d29yaygpOgorICAgIHN0YXR1c19zZXQoIm1haW50ZW5hbmNlIiwgIkNyZWF0aW5nIHZpcmJyMCBuZXR3b3JrIikKKyAgICByZW5kZXIoc291cmNlPSJuZXQtdmlyYnIwLnlhbWwiLCB0YXJnZXQ9Ii90bXAvbmV0LXZpcmJyMC55YW1sIiwgb3duZXI9Im9wZW52aW0iLCBwZXJtcz0wbzY2NCwgY29udGV4dD17fSkKKyAgICBjbWQgPSAnb3BlbnZpbSBuZXQtY3JlYXRlIC90bXAvbmV0LXZpcmJyMC55YW1sJworICAgIG5ldF92aXJicjBfdXVpZCA9IHNoX2FzX29wZW52aW0oY21kKS5zcGxpdCgpWzBdCisgICAgbmV0X3ZpcmJyMF91dWlkID0gc3RyKG5ldF92aXJicjBfdXVpZCwgJ3V0Zi04JykKKyAgICByZXR1cm4gbmV0X3ZpcmJyMF91dWlkCisKKworZGVmIGNyZWF0ZV92bV95YW1sKGltYWdlX3V1aWQsIGZsYXZvcl91dWlkLCBuZXRfZGVmYXVsdF91dWlkLCBuZXRfdmlyYnIwX3V1aWQpOgorICAgIHN0YXR1c19zZXQoIm1haW50ZW5hbmNlIiwgIkNyZWF0aW5nIGRlZmF1bHQgVk0geWFtbCBmaWxlIikKKyAgICByZW5kZXIoCisgICAgICAgIHNvdXJjZT0ic2VydmVyLnlhbWwiLAorICAgICAgICB0YXJnZXQ9Ii90bXAvc2VydmVyLnlhbWwiLAorICAgICAgICBvd25lcj0ib3BlbnZpbSIsCisgICAgICAgIHBlcm1zPTBvNjY0LAorICAgICAgICBjb250ZXh0PXsKKyAgICAgICAgICAgICJpbWFnZV91dWlkIjogaW1hZ2VfdXVpZCwKKyAgICAgICAgICAgICJmbGF2b3JfdXVpZCI6IGZsYXZvcl91dWlkLAorICAgICAgICAgICAgIm5ldF9kZWZhdWx0X3V1aWQiOiBuZXRfZGVmYXVsdF91dWlkLAorICAgICAgICAgICAgIm5ldF92aXJicjBfdXVpZCI6IG5ldF92aXJicjBfdXVpZAorICAgICAgICB9CisgICAgKQorCisKK2RlZiBjcmVhdGVfc2FuZV9kZWZhdWx0cygpOgorICAgIHRlbmFudF91dWlkID0gY3JlYXRlX3RlbmFudCgpCisgICAgYWRkX29wZW52aW1fdGVuYW50X2Vudl92YXIodGVuYW50X3V1aWQpCisgICAgaW1hZ2VfdXVpZCA9IGNyZWF0ZV9pbWFnZSgpCisgICAgZmxhdm9yX3V1aWQgPSBjcmVhdGVfZmxhdm9yKCkKKyAgICBuZXRfZGVmYXVsdF91dWlkID0gY3JlYXRlX2RlZmF1bHRfbmV0d29yaygpCisgICAgbmV0X3ZpcmJyMF91dWlkID0gY3JlYXRlX3ZpcmJyX25ldHdvcmsoKQorICAgIGNyZWF0ZV92bV95YW1sKAorICAgICAgICBpbWFnZV91dWlkPWltYWdlX3V1aWQsCisgICAgICAgIGZsYXZvcl91dWlkPWZsYXZvcl91dWlkLAorICAgICAgICBuZXRfZGVmYXVsdF91dWlkPW5ldF9kZWZhdWx0X3V1aWQsCisgICAgICAgIG5ldF92aXJicjBfdXVpZD1uZXRfdmlyYnIwX3V1aWQKKyAgICApCisKKworZGVmIGluc3RhbGxfb3BlbnZpbV9zZXJ2aWNlKCk6CisgICAgc3RhdHVzX3NldCgibWFpbnRlbmFuY2UiLCAiSW5zdGFsbGluZyBPcGVuVklNIHNlcnZpY2UiKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cygnL2V0Yy9zeXN0ZW1kL3N5c3RlbScpOgorICAgICAgICBvcy5tYWtlZGlycygnL2V0Yy9zeXN0ZW1kL3N5c3RlbScpCisgICAgcmVuZGVyKAorICAgICAgICBzb3VyY2U9Im9wZW52aW0uc2VydmljZSIsCisgICAgICAgIHRhcmdldD0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9vcGVudmltLnNlcnZpY2UiLAorICAgICAgICBvd25lcj0icm9vdCIsCisgICAgICAgIHBlcm1zPTBvNjQ0LAorICAgICAgICBjb250ZXh0PXt9CisgICAgKQorCisKK2RlZiBhZGRfb3BlbnZpbV90ZW5hbnRfZW52X3Zhcih0ZW5hbnRfdXVpZCk6CisgICAgc3RhdHVzX3NldCgibWFpbnRlbmFuY2UiLCAiQWRkaW5nIE9QRU5WSU1fVEVOQU5UIGVudmlyb25tZW50IHZhcmlhYmxlIikKKyAgICBlbnZfbGluZSA9ICdleHBvcnQgT1BFTlZJTV9URU5BTlQ9JXNcbicgJSB0ZW5hbnRfdXVpZAorICAgIHdpdGggb3BlbignL2hvbWUvb3BlbnZpbS8ucHJvZmlsZScsICd3KycpIGFzIGY6CisgICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGlmIGVudl9saW5lID09IGxpbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBmLnRydW5jYXRlKCkKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBmLndyaXRlKGxpbmUpCisgICAgICAgIGYud3JpdGUoZW52X2xpbmUpCisKKworZGVmIG9wZW52aW1fcnVubmluZygpOgorICAgIHRyeToKKyAgICAgICAgc2hfYXNfb3BlbnZpbSgnb3BlbnZpbSB0ZW5hbnQtbGlzdCcpCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZXhjZXB0OgorICAgICAgICByZXR1cm4gRmFsc2UKKworCitkZWYgc3RhcnRfb3BlbnZpbSgpOgorICAgIHN0YXR1c19zZXQoIm1haW50ZW5hbmNlIiwgIlN0YXJ0aW5nIE9wZW5WSU0iKQorICAgIHNlcnZpY2Vfc3RhcnQoJ29wZW52aW0nKQorICAgIHQwID0gdGltZS50aW1lKCkKKyAgICB3aGlsZSBub3Qgb3BlbnZpbV9ydW5uaW5nKCk6CisgICAgICAgIGlmIHRpbWUudGltZSgpIC0gdDAgPiA2MDoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignRmFpbGVkIHRvIHN0YXJ0IG9wZW52aW0uJykKKyAgICAgICAgdGltZS5zbGVlcCgwLjI1KQorCisKK0B3aGVuX25vdCgnZGIuYXZhaWxhYmxlJykKK2RlZiBub3RfcmVhZHkoKToKKyAgICBzdGF0dXNfc2V0KCd3YWl0aW5nJywgJ015U1FMIGRhdGFiYXNlIHJlcXVpcmVkJykKKworCitAd2hlbignZGIuYXZhaWxhYmxlJykKK0B3aGVuX25vdCgnb3BlbnZpbS1jb250cm9sbGVyLmluc3RhbGxlZCcpCitkZWYgaW5zdGFsbF9vcGVudmltX2NvbnRyb2xsZXIobXlzcWwpOgorICAgIGNyZWF0ZV9vcGVudmltX3VzZXIoKQorICAgIGRvd25sb2FkX29wZW52aW0oKQorICAgIGFkZF9vcGVudmltX3RvX3BhdGgoKQorICAgIGNvbmZpZ3VyZV9vcGVudmltKG15c3FsKQorICAgIGluaXRpYWxpemVfb3BlbnZpbV9kYXRhYmFzZShteXNxbCkKKyAgICBnZW5lcmF0ZV9zc2hfa2V5KCkKKyAgICBpbnN0YWxsX29wZW52aW1fc2VydmljZSgpCisgICAgc3RhcnRfb3BlbnZpbSgpCisgICAgY3JlYXRlX3NhbmVfZGVmYXVsdHMoKQorICAgIHN0YXR1c19zZXQoCisgICAgICAgICdhY3RpdmUnLAorICAgICAgICAnVXAgb24ge2hvc3R9Ontwb3J0fScuZm9ybWF0KAorICAgICAgICAgICAgaG9zdD11bml0X3B1YmxpY19pcCgpLAorICAgICAgICAgICAgcG9ydD0nOTA4MCcpKQorICAgIHNldF9zdGF0ZSgnb3BlbnZpbS1jb250cm9sbGVyLmluc3RhbGxlZCcpCisKKworQHdoZW4oJ2NvbXB1dGUuY29ubmVjdGVkJywgJ29wZW52aW0tY29udHJvbGxlci5pbnN0YWxsZWQnKQorZGVmIHNlbmRfc3NoX2tleShjb21wdXRlKToKKyAgICB3aXRoIG9wZW4oJy9ob21lL29wZW52aW0vLnNzaC9pZF9yc2EucHViJywgJ3InKSBhcyBmOgorICAgICAgICBrZXkgPSBmLnJlYWQoKS5zdHJpcCgpCisgICAgY29tcHV0ZS5zZW5kX3NzaF9rZXkoa2V5KQorCisKK0B3aGVuKCdjb21wdXRlLmF2YWlsYWJsZScsICdvcGVudmltLWNvbnRyb2xsZXIuaW5zdGFsbGVkJykKK2RlZiBob3N0X2FkZChjb21wdXRlKToKKyAgICBjYWNoZSA9IGt2KCkKKyAgICBmb3Igbm9kZSBpbiBjb21wdXRlLmF1dGhvcml6ZWRfbm9kZXMoKToKKyAgICAgICAgaWYgY2FjaGUuZ2V0KCJjb21wdXRlOiIgKyBub2RlWydhZGRyZXNzJ10pOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgY21kID0gInNzaCAtbiAtbyAnU3RyaWN0SG9zdEtleUNoZWNraW5nIG5vJyAlc0AlcyIKKyAgICAgICAgc2hfYXNfb3BlbnZpbShjbWQgJSAobm9kZVsndXNlciddLCBub2RlWydhZGRyZXNzJ10pKQorICAgICAgICBkYXRhID0geworICAgICAgICAgICAgJ2hvc3QnOiB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiAnY29tcHV0ZS0wJywKKyAgICAgICAgICAgICAgICAndXNlcic6IG5vZGVbJ3VzZXInXSwKKyAgICAgICAgICAgICAgICAnaXBfbmFtZSc6IG5vZGVbJ2FkZHJlc3MnXSwKKyAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAnY29tcHV0ZS0wJworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdpdGggb3BlbignL3RtcC9jb21wdXRlLTAuanNvbicsICd3JykgYXMgZjoKKyAgICAgICAgICAgIGpzb24uZHVtcChkYXRhLCBmLCBpbmRlbnQ9NCwgc29ydF9rZXlzPVRydWUpCisgICAgICAgICMgVE9ETzogb3BlbnZpbSBydW4gZnVuY3Rpb24hCisgICAgICAgIHNoX2FzX29wZW52aW0oJ29wZW52aW0gaG9zdC1hZGQgL3RtcC9jb21wdXRlLTAuanNvbicpCisgICAgICAgIGNhY2hlLnNldCgnY29tcHV0ZTonICsgbm9kZVsnYWRkcmVzcyddLCBUcnVlKQorCisKK0B3aGVuKCdvcGVudmltLWNvbnRyb2xsZXIuYXZhaWxhYmxlJykKK2RlZiBvcGVudmltX2F2YWlsYWJsZShvcGVudmltKToKKyAgICBvcGVudmltLmNvbmZpZ3VyZShwb3J0PTkwODAsIHVzZXI9bGVhZGVyX2dldCgndGVuYW50JykpCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL2ZsYXZvci55YW1sIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL3RlbXBsYXRlcy9mbGF2b3IueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTk5ZWFkCi0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL3RlbXBsYXRlcy9mbGF2b3IueWFtbApAQCAtMCwwICsxLDUgQEAKK2ZsYXZvcjoKKyAgICBuYW1lOiAgICAgICAgeGVuaWFsCisgICAgZGVzY3JpcHRpb246IHhlbmlhbAorICAgIHJhbTogICAgICAgICAxMDI0CisgICAgdmNwdXM6ICAgICAgIDEKZGlmZiAtLWdpdCBhL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZW1wbGF0ZXMvaW1hZ2UueWFtbCBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZW1wbGF0ZXMvaW1hZ2UueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I4N2IzCi0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL3RlbXBsYXRlcy9pbWFnZS55YW1sCkBAIC0wLDAgKzEsNCBAQAoraW1hZ2U6CisgICAgbmFtZTogICAgICAgICB4ZW5pYWwKKyAgICBkZXNjcmlwdGlvbjogIHhlbmlhbAorICAgIHBhdGg6ICAgICAgICAgL29wdC9WTkYvaW1hZ2VzL3VidW50dS0xNi4wNC1zZXJ2ZXItY2xvdWRpbWctYW1kNjQtZGlzazEuaW1nCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL25ldC1kZWZhdWx0LnlhbWwgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL25ldC1kZWZhdWx0LnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5M2Y4NQotLS0gL2Rldi9udWxsCisrKyBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZW1wbGF0ZXMvbmV0LWRlZmF1bHQueWFtbApAQCAtMCwwICsxLDUgQEAKK25ldHdvcms6CisgICAgbmFtZTogICAgICAgICAgICAgICBkZWZhdWx0CisgICAgdHlwZTogICAgICAgICAgICAgICBicmlkZ2VfbWFuCisgICAgcHJvdmlkZXI6cGh5c2ljYWw6ICBkZWZhdWx0CisgICAgc2hhcmVkOiAgICAgICAgICAgICB0cnVlCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL25ldC12aXJicjAueWFtbCBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZW1wbGF0ZXMvbmV0LXZpcmJyMC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTc4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL25ldC12aXJicjAueWFtbApAQCAtMCwwICsxLDUgQEAKK25ldHdvcms6CisgICAgbmFtZTogICAgICAgICAgICAgICBzaGFyZWRfYnJpZGdlX25ldAorICAgIHR5cGU6ICAgICAgICAgICAgICAgYnJpZGdlX2RhdGEKKyAgICBwcm92aWRlcjpwaHlzaWNhbDogIGJyaWRnZTp2aXJicjAKKyAgICBzaGFyZWQ6ICAgICAgICAgICAgIHRydWUKZGlmZiAtLWdpdCBhL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZW1wbGF0ZXMvb3BlbnZpbS5zZXJ2aWNlIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL3RlbXBsYXRlcy9vcGVudmltLnNlcnZpY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2N2E2MgotLS0gL2Rldi9udWxsCisrKyBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZW1wbGF0ZXMvb3BlbnZpbS5zZXJ2aWNlCkBAIC0wLDAgKzEsMTAgQEAKK1tVbml0XQorRGVzY3JpcHRpb249b3BlbnZpbQorCitbU2VydmljZV0KK1VzZXI9b3BlbnZpbQorRXhlY1N0YXJ0PS9vcHQvb3Blbm1hbm8vb3BlbnZpbS9vcGVudmltZC5weSAtYyAvb3B0L29wZW5tYW5vL29wZW52aW0vb3BlbnZpbWQuY2ZnCitSZXN0YXJ0PWFsd2F5cworCitbSW5zdGFsbF0KK1dhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0CmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL29wZW52aW1kLmNmZyBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZW1wbGF0ZXMvb3BlbnZpbWQuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTc1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL29wZW52aW1kLmNmZwpAQCAtMCwwICsxLDEyNyBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworCisKKyNNaXNjZWxsYW5lb3VzCisjT3B0aW9uIHRvIHRlc3Qgb3BlbnZpbSB3aXRob3V0IHRoZSBuZWVkZWQgaW5mcmFzdHJ1Y3R1cmUsIHBvc3NpYmxlIHZhbHVlcyBhcmUKKyMgICAgIm5vcm1hbCIgICAgICBieSBkZWZhdWx0LCBPcGVuZmxvdyBjb250cm9sbGVyIChPRkMpLCBzd2l0Y2ggYW5kIHJlYWwgaG9zdCBhcmUgbmVlZGVkCisjICAgICJ0ZXN0IiAgICAgICAgVXNlZCBmb3IgdGVzdGluZyBodHRwIEFQSSBhbmQgZGF0YWJhc2Ugd2l0aG91dCBjb25uZWN0aW5nIHRvIGhvc3Qgb3IgdG8gT0ZDCisjICAgICJob3N0IG9ubHkiICAgVXNlZCB3aGVuIG5laXRoZXIgT0ZDIG5vciBPRiBzd2l0Y2ggYXJlIHByb3ZpZGVkLgorIyAgICAgICAgICAgICAgICAgIERhdGFwbGFuZSBuZXR3b3JrIGNvbm5lY3Rpb24gbXVzdCBiZSBkb25lIG1hbnVhbGx5LgorIyAgICAiT0Ygb25seSIgICAgIFVzZWQgZm9yIHRlc3Rpbmcgb2YgbmV3IG9wZW5mbG93IGNvbnRyb2xsZXJzIHN1cHBvcnQuIE5vIHJlYWwgVk0gZGVwbG95bWVudHMgd2lsbCBiZSBkb25lIGJ1dAorIyAgICAgICAgICAgICAgICAgIE9GQyB3aWxsIGJlIHVzZWQgYXMgaW4gcmVhbCBtb2RlCisjICAgICJkZXZlbG9wbWVudCIgRm9yY2VkIGEgY2xvdWQtdHlwZSBkZXBsb3ltZW50LCBub21hbCBtZW1vcnkgaW5zdGVhZCBvZiBodWdlcGFnZXMgaXMgdXNlZCwKKyMgICAgICAgICAgICAgICAgICB3aXRob3V0IGNwdSBwaW5uaW5nLCBhbmQgdXNpbmcgYSBicmlkZ2UgbmV0d29yayBpbnN0ZWFkIG9mIGEgcmVhbCBPRkMgZGF0YXBsYW5lIG5ldHdvcmtzLgorIyAgICAgICAgICAgICAgICAgIFRoZSBzYW1lICdkZXZlbG9wbWVudF9icmlkZ2UnIChzZWUgYmVsb3cpIGlzIHVzZWQgZm9yIGFsbCBkYXRhcGxhbmUgbmV0d29ya3MKK21vZGU6IGhvc3Qgb25seQorCisjT3BlbmZsb3cgY29udHJvbGxlciBpbmZvcm1hdGlvbgorb2ZfY29udHJvbGxlcjogICAgICBmbG9vZGxpZ2h0ICAgICAgICAgICAgICAgICAgICMgVHlwZSBvZiBjb250cm9sbGVyIHRvIGJlIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBWYWxpZCBjb250cm9sbGVycyBhcmUgJ29wZW5kYXlsaWdodCcsICdmbG9vZGxpZ2h0JyBvciA8Y3VzdG9tPgorI29mX2NvbnRyb2xsZXJfbW9kdWxlOiBtb2R1bGUgICAgICAgICAgICAgICAgICAgICMgT25seSBuZWVkZWQgZm9yIDxjdXN0b20+LiAgUHl0aG9uIG1vZHVsZSB0aGF0IGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhpcyBjb250cm9sbGVyLiBCeSBkZWZhdWx0IGEgZmlsZSB3aXRoIHRoZSBuYW1lICA8Y3VzdG9tPi5weSBpcyB1c2VkCisjb2ZfPG90aGVyPjogICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgIyBPdGhlciBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IDxjdXN0b20+IGNvbnRyb2xsZXIuIENvbnN1bWVkIGJ5IF9faW5pdF9fCitvZl91c2VyOiAgICAgICAgICAgIHVzZXIgY3JlZGVudGlhbHMgICAgICAgICAgICAgIyBVc2VyIGNyZWRlbnRpYWxzIGZvciB0aGUgY29udHJvbGxlciBpZiBuZWVkZWQKK29mX3Bhc3N3b3JkOiAgICAgICAgcGFzc3dkIGNyZWRlbnRpYWxzICAgICAgICAgICAjIFBhc3N3b3JkIGNyZWRlbnRpYWxzIGZvciB0aGUgY29udHJvbGxlciBpZiBuZWVkZWQKK29mX2NvbnRyb2xsZXJfaXA6ICAgMTI3LjAuMC4xICAgICAgICAgICAgICAgICAgICAjIElQIGFkZHJlc3Mgd2hlcmUgdGhlIE9wZW5mbG93IGNvbnRyb2xsZXIgaXMgbGlzdGVuaW5nCitvZl9jb250cm9sbGVyX3BvcnQ6IDcwNzAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUQ1AgcG9ydCB3aGVyZSB0aGUgT3BlbmZsb3cgY29udHJvbGxlciBpcyBsaXN0ZW5pbmcgKFJFU1QgQVBJIHNlcnZlcikKK29mX2NvbnRyb2xsZXJfZHBpZDogJzAwOjAxOjAyOjAzOjA0OjA1OjA2OjA3JyAgICAjIE9wZW5mbG93IFN3aXRjaCBpZGVudGlmaWVyIChwdXQgaGVyZSB0aGUgcmlnaHQgbnVtYmVyKQorCisjVGhpcyBvcHRpb24gaXMgdXNlZCBmb3IgdGhvc2Ugb3BlbmZsb3cgc3dpdGNoIHRoYXQgY2Fubm90IGRlbGl2ZXIgb25lIHBhY2tldCB0byBzZXZlcmFsIG91dHB1dCB3aXRoIGRpZmZlcmVudCB2bGFuIHRhZ3MKKyNXaGVuIHNldCB0byB0cnVlLCBpdCBmYWlscyB3aGVuIHRyeWluZyB0byBhdHRhY2ggZGlmZmVyZW50IHZsYW4gdGFnZ2VkIHBvcnRzIHRvIHRoZSBzYW1lIG5ldAorb2ZfY29udHJvbGxlcl9uZXRzX3dpdGhfc2FtZV92bGFuOiBmYWxzZSAgICAgICAgICMgKGJ5IGRlZmF1bHQsIHRydWUpCisKKyNTZXJ2ZXIgcGFyYW1ldGVycworaHR0cF9ob3N0OiAgICAgICAwLjAuMC4wICAgICAgICAgICAgICMgSVAgYWRkcmVzcyB3aGVyZSBvcGVudmltIGlzIGxpc3RlbmluZyAoYnkgZGVmYXVsdCwgbG9jYWxob3N0KQoraHR0cF9wb3J0OiAgICAgICA5MDgwICAgICAgICAgICAgICAgICMgR2VuZXJhbCBwb3J0IHdoZXJlIG9wZW52aW0gaXMgbGlzdGVuaW5nIChieSBkZWZhdWx0LCA5MDgwKQoraHR0cF9hZG1pbl9wb3J0OiA5MDg1ICAgICAgICAgICAgICAgICMgQWRtaW4gcG9ydCB3aGVyZSBvcGVudmltIGlzIGxpc3RlbmluZyAod2hlbiBtaXNzaW5nLCBubyBhZG1pbmlzdHJhdGlvbiBzZXJ2ZXIgaXMgbGF1bmNoZWQpCisKKyNkYXRhYmFzZSBwYXJhbWV0ZXJzCitkYl9ob3N0OiAgIHt7IGRiLmhvc3QoKSB9fQorZGJfdXNlcjogICB7eyBkYi51c2VyKCkgfX0KK2RiX3Bhc3N3ZDoge3sgZGIucGFzc3dvcmQoKSB9fQorZGJfbmFtZTogICB7eyBkYi5kYXRhYmFzZSgpIH19CisKKyNob3N0IHBhcmVtZXRlcnMKK2ltYWdlX3BhdGg6ICIvb3B0L1ZORi9pbWFnZXMiICAgICAgICAjIEZvbGRlciwgc2FtZSBmb3IgZXZlcnkgaG9zdCwgd2hlcmUgdGhlIFZORiBpbWFnZXMgd2lsbCBiZSBjb3BpZWQKKworI3Rlc3RpbmcgcGFyYW1ldGVycyAodXNlZCBieSAuL3Rlc3QvdGVzdF9vcGVudmltLnB5KQordGVuYW50X2lkOiBmYzdiNDNiNi02YmZhLTExZTQtODRkMi01MjU0MDA2ZDY3NzcgICAjIERlZmF1bHQgdGVuYW50IGlkZW50aWZpZXIgZm9yIHRlc3RpbmcKKworI1ZMQU4gcmFuZ2VzIHVzZWQgZm9yIHRoZSBkYXRhcGxhbmUgbmV0d29ya3MgKHB0cCwgZGF0YSkKKyNXaGVuIGEgbmV0d29yayBpcyBjcmVhdGVkIGFuIHVudXNlZCB2YWx1ZSBpbiB0aGlzIHJhbmdlIGlzIHVzZWQKK25ldHdvcmtfdmxhbl9yYW5nZV9zdGFydDogMzAwMAorbmV0d29ya192bGFuX3JhbmdlX2VuZDogICA0MDAwCisKKyNob3N0IGJyaWRnZSBpbnRlcmZhY2VzIGZvciBuZXR3b3JrcworIyBPcGVudmltIGNhbm5vdCBjcmVhdGUgYnJpZGdlIG5ldHdvcmtzIGF1dG9tYXRpY2FsbHksIGluIHRoZSBzYW1lIHdheSBhcyBvdGhlciBDTVMgZG8uCisjIEJyaWRnZSBuZXR3b3JrcyBuZWVkIHRvIGJlIHByZS1wcm92aXNpb25lZCBvbiBlYWNoIGhvc3QgYW5kIE9wZW52aW0gdXNlcyB0aG9zZSBwcmUtcHJvdmlzaW9uZWQgYnJpZGdlIG5ldHdvcmtzLgorIyBPcGVudmltIGFzc3VtZXMgdGhhdCB0aGUgZm9sbG93aW5nIGJyaWRnZSBpbnRlcmZhY2VzIGhhdmUgYmVlbiBjcmVhdGVkIG9uIGVhY2ggaG9zdCwgYXBwcm9wcmlhdGVseSBhc3NvY2lhdGVkIHRvIGEgcGh5c2ljYWwgcG9ydC4KKyMgVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBwcm92aWRlZDoKKyMgICAgLSBOYW1lIG9mIHRoZSBicmlkZ2UgKGlkZW50aWNhbCBpbiBhbGwgaG9zdHMpCisjICAgIC0gVkxBTiB0YWcgYXNzb2NpYXRlZCB0byBlYWNoIGJyaWRnZSBpbnRlcmZhY2UKKyMgICAgLSBUaGUgc3BlZWQgb2YgdGhlIHBoeXNpY2FsIHBvcnQgaW4gR2Jwcywgd2hlcmUgdGhhdCBicmlkZ2UgaW50ZXJmYWNlIHdhcyBjcmVhdGVkCisjIEZvciBpbnN0YW5jZSwgbmV4dCBleGFtcGxlIGFzc3VtZXMgdGhhdCAxMCBicmlkZ2VzIGhhdmUgYmVlbiBjcmVhdGVkIG9uIGVhY2ggaG9zdAorIyB1c2luZyB2bGFucyAyMDAxIHRvIDIwMTAsIGFzc29jaWF0ZWQgdG8gYSAxR2JwcyBwaHlzaWNhbCBwb3J0CiticmlkZ2VfaWZhY2VzOgorICAgI25hbWU6ICAgICAgW3ZsYW4sIHNwZWVkIGluIEdicHNdCisgICB2aXJick1hbjE6ICBbMjAwMSwgMV0KKyAgIHZpcmJyTWFuMjogIFsyMDAyLCAxXQorICAgdmlyYnJNYW4zOiAgWzIwMDMsIDFdCisgICB2aXJick1hbjQ6ICBbMjAwNCwgMV0KKyAgIHZpcmJyTWFuNTogIFsyMDA1LCAxXQorICAgdmlyYnJNYW42OiAgWzIwMDYsIDFdCisgICB2aXJick1hbjc6ICBbMjAwNywgMV0KKyAgIHZpcmJyTWFuODogIFsyMDA4LCAxXQorICAgdmlyYnJNYW45OiAgWzIwMDksIDFdCisgICB2aXJick1hbjEwOiBbMjAxMCwgMV0KKworI1VzZWQgb25seSB3aGVuICdtb2RlJyBpcyBhdCBkZXZlbG9wbWVudCcuIEluZGljYXRlcyB3aGljaCAnYnJpZGdlX2lmYWNlcycgaXMgdXNlZCBmb3IgZGF0YXBsYW5lIG5ldHdvcmtzCitkZXZlbG9wbWVudF9icmlkZ2U6IHZpcmJyTWFuMTAKKworI0RIQ1AgU0VSVkVSIFBBUkFNRVRFUlMuCisjSW4gY2FzZSBzb21lIG9mIHRoZSBwcmV2aW91cyAnYnJpZGdlX2lmYWNlcycgYXJlIGNvbm5lY3RlZCB0byBhbiBFWFRFUk5BTCBkaGNwIHNlcnZlciwgcHJvdmlkZQorIyAgIHRoZSBzZXJ2ZXIgcGFyYW1ldGVycyB0byBhbGxvdyBvcGVudmltIGdldHRpbmcgdGhlIGFsbG9jYXRlZCBJUCBhZGRyZXNzZXMgb2YgdmlydHVhbCBtYWNoaW5lcworIyAgIGNvbm5lY3RlZCB0byB0aGUgaW5kaWNhdGVkICdicmlkZ2VfaWZhY2VzJyBhbmQgb3IgJ25ldHMnLiBPcGVudmltIHdpbGwgY29ubmVjdCB0byB0aGUgZGhjcCBzZXJ2ZXIgYnkgc3NoLgorI0RIQ1Agc2VydmVyIG11c3QgY29udGFpbiBhIHNoZWxsIHNjcmlwdCAiLi9nZXRfZGhjcF9sZWFzZS5zaCIgdGhhdCBhY2NlcHQgYSBtYWMgYWRkcmVzcyBhcyBwYXJhbWV0ZXIKKyMgICBhbmQgcmV0dXJuIGVtcHR5IG9yIHRoZSBhbGxvY2F0ZWQgSVAgYWRkcmVzcy4gU2VlIGFuIGV4YW1wbGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAuL29wZW52aW0vZGhjcF90aHJlYWQucHkKKyNDT01NRU5UIGFsbCBsaW5lcyBpbiBjYXNlIHlvdSBkbyBub3QgaGF2ZSBhIERIQ1Agc2VydmVyIGluICdub3JtYWwnLCAnZGV2ZWxvcG1lbnQnICBvciAnaG9zdCBvbmx5JyBtb2Rlcy4KKyMgICBGb3IgJ3Rlc3QnIG9yICdPRiBvbmx5JyBtb2RlcyB5b3UgY2FuIGxlYXZlIHRoZW4gdW5jb21tZW50ZWQsIGJlY2F1c2UgaW4gdGhlc2UgbW9kZXMgZmFrZSBJUAorIyAgIGFkZHJlc3MgYXJlIGdlbmVyYXRlZCBpbnN0ZWFkIG9mIGNvbm5lY3Rpbmcgd2l0aCBhIHJlYWwgREhDUCBzZXJ2ZXIuCitkaGNwX3NlcnZlcjoKKyAgIGhvc3Q6ICAgICBob3N0LWlwLW9yLW5hbWUKKyAgICNwb3J0OiAgICAgMjIgICAgICAgICAgICAgICAjc3NoIHBvcnQsIGJ5IGRlZmF1bHQgMjIKKyAgIHByb3ZpZGVyOiBpc2MtZGhjcC1zZXJ2ZXIgICNkaGNwLXNlcnZlciB0eXBlCisgICB1c2VyOiAgICAgdXNlcgorICAgI3Byb3ZpZGUgcGFzc3dvcmQsIG9yIGtleSBpZiBuZWVkZWQKKyAgIHBhc3N3b3JkOiBwYXNzd2QKKyAgICNrZXk6ICAgICBzc2gtYWNjZXNzLWtleQorICAgI2xpc3Qgb2YgdGhlIHByZXZpb3VzIGJyaWRnZSBpbnRlcmZhY2VzIGF0dGFjaGVkIHRvIHRoaXMgZGhjcCBzZXJ2ZXIKKyAgIGJyaWRnZV9pZmFjZXM6ICAgWyB2aXJick1hbjEsIHZpcmJyTWFuMiBdCisgICAjbGlzdCBvZiB0aGUgbmV0d29ya3MgYXR0YWNoZWQgdG8gdGhpcyBkaGNwIHNlcnZlcgorICAgbmV0czogW2RlZmF1bHRdCisKKworI2xvZ2dpbmcgcGFyYW1ldGVycyAgICAgICAjIERFQlVHLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwgQ1JJVElDQUwKK2xvZ19sZXZlbDogICAgICAgRVJST1IKK2xvZ19sZXZlbF9kYjogICAgREVCVUcKK2xvZ19sZXZlbF9vZjogICAgREVCVUcKZGlmZiAtLWdpdCBhL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZW1wbGF0ZXMvc2VydmVyLnlhbWwgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL3NlcnZlci55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMWU3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL3NlcnZlci55YW1sCkBAIC0wLDAgKzEsMTAgQEAKK3NlcnZlcjoKKyAgbmFtZTogVk0KKyAgZGVzY3JpcHRpb246IFZNCisgIGltYWdlUmVmOiB7eyBpbWFnZV91dWlkIH19CisgIGZsYXZvclJlZjoge3sgZmxhdm9yX3V1aWQgfX0KKyAgbmV0d29ya3M6CisgIC0gbmFtZTogZGVmYXVsdAorICAgIHV1aWQ6IHt7IG5ldF9kZWZhdWx0X3V1aWQgfX0KKyAgLSBuYW1lOiB2aXJicjAKKyAgICB1dWlkOiB7eyBuZXRfdmlyYnIwX3V1aWQgfX0KZGlmZiAtLWdpdCBhL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZW1wbGF0ZXMvdGVuYW50LnlhbWwgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL3RlbmFudC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjM2Q1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVtcGxhdGVzL3RlbmFudC55YW1sCkBAIC0wLDAgKzEsMyBAQAordGVuYW50OgorICAgIG5hbWU6ICAgICAgICAgIG9wZW52aW0tdGVuYW50CisgICAgZGVzY3JpcHRpb246ICAgb3BlbnZpbS10ZW5hbnQKZGlmZiAtLWdpdCBhL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZXN0cy8xMC1zbW9rZSBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZXN0cy8xMC1zbW9rZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zM2Q3YjQzCi0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL3Rlc3RzLzEwLXNtb2tlCkBAIC0wLDAgKzEsNDQgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMworCitpbXBvcnQgYW11bGV0CitpbXBvcnQgb3BlbnZpbQorCitkZWYgZGVwbG95X29wZW52aW0oKToKKyAgICBkID0gYW11bGV0LkRlcGxveW1lbnQoKQorICAgIGQuYWRkKCJteXNxbCIsIHNlcmllcz0idHJ1c3R5IikKKyAgICBkLmFkZCgib3BlbnZpbS1jb250cm9sbGVyIiwgc2VyaWVzPSJ4ZW5pYWwiKQorICAgIGQuYWRkKCJvcGVudmltLWNvbXB1dGUiLCBjaGFybT0ibG9jYWw6eGVuaWFsL29wZW52aW0tY29tcHV0ZSIsIHNlcmllcz0ieGVuaWFsIikKKyAgICBkLnJlbGF0ZSgib3BlbnZpbS1jb250cm9sbGVyOmRiIiwgIm15c3FsOmRiIikKKyAgICBkLnJlbGF0ZSgib3BlbnZpbS1jb250cm9sbGVyOmNvbXB1dGUiLCAib3BlbnZpbS1jb21wdXRlOmNvbXB1dGUiKQorICAgIGQuc2V0dXAodGltZW91dD05MDApCisgICAgZC5zZW50cnkud2FpdCgpCisgICAgcmV0dXJuIGQKKworZGVmIGdldF9vcGVudmltX2Nvbm5lY3Rpb24oZGVwbG95bWVudCk6CisgICAgYWRkcmVzcyA9IGRlcGxveW1lbnQuc2VudHJ5WyJvcGVudmltLWNvbnRyb2xsZXIiXVswXS5pbmZvWyJwdWJsaWMtYWRkcmVzcyJdCisgICAgcmV0dXJuIG9wZW52aW0uY29ubmVjdChhZGRyZXNzKQorCitkZWYgY3JlYXRlX3ZtKGRlcGxveW1lbnQpOgorICAgIGMgPSBnZXRfb3BlbnZpbV9jb25uZWN0aW9uKGRlcGxveW1lbnQpCisgICAgdGVuYW50ID0gYy5nZXRfdGVuYW50cygpWzBdCisgICAgYy5zZXRfYWN0aXZlX3RlbmFudCh0ZW5hbnQpCisgICAgbmV0d29ya3MgPSBjLmdldF9uZXR3b3JrcygpCisgICAgaW1hZ2UgPSBjLmdldF9pbWFnZXMoKVswXQorICAgIGZsYXZvciA9IGMuZ2V0X2ZsYXZvcnMoKVswXQorCisgICAgc2VydmVyID0gYy5jcmVhdGVfc2VydmVyKAorICAgICAgICBuYW1lPSJ2bSIsCisgICAgICAgIGRlc2NyaXB0aW9uPSJ0ZXN0IHZtIiwKKyAgICAgICAgaW1hZ2U9aW1hZ2UsCisgICAgICAgIGZsYXZvcj1mbGF2b3IsCisgICAgICAgIG5ldHdvcmtzPW5ldHdvcmtzCisgICAgKQorCisgICAgcmV0dXJuIHNlcnZlcgorCitkZWYgdGVzdF92bV9jcmVhdGlvbigpOgorICAgIGQgPSBkZXBsb3lfb3BlbnZpbSgpCisgICAgY3JlYXRlX3ZtKGQpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF92bV9jcmVhdGlvbigpCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVzdHMvMjAtZGVwbG95bWVudCBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZXN0cy8yMC1kZXBsb3ltZW50Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwZjhiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVzdHMvMjAtZGVwbG95bWVudApAQCAtMCwwICsxLDQ3IEBACisjIS91c3IvYmluL3B5dGhvbjMKKworaW1wb3J0IGFtdWxldAoraW1wb3J0IG9wZW52aW0KKworZGVwbG95bWVudCA9IE5vbmUKKworZGVmIGRlcGxveV9vcGVudmltX3dpdGhvdXRfcmVsYXRpb25zKCk6CisgICAgZ2xvYmFsIGRlcGxveW1lbnQKKyAgICBkZXBsb3ltZW50ID0gYW11bGV0LkRlcGxveW1lbnQoKQorICAgIGRlcGxveW1lbnQuYWRkKCJteXNxbCIsIHNlcmllcz0idHJ1c3R5IikKKyAgICBkZXBsb3ltZW50LmFkZCgib3BlbnZpbS1jb250cm9sbGVyIiwgc2VyaWVzPSJ4ZW5pYWwiKQorICAgIGRlcGxveW1lbnQuYWRkKCJvcGVudmltLWNvbXB1dGUiLCBjaGFybT0ibG9jYWw6eGVuaWFsL29wZW52aW0tY29tcHV0ZSIsIHNlcmllcz0ieGVuaWFsIikKKyAgICBkZXBsb3ltZW50LmV4cG9zZSgib3BlbnZpbS1jb250cm9sbGVyIikKKyAgICBkZXBsb3ltZW50LnNldHVwKHRpbWVvdXQ9OTAwKQorICAgIGRlcGxveW1lbnQuc2VudHJ5LndhaXQoKQorCitkZWYgYWRkX3JlbGF0aW9ucygpOgorICAgIGRlcGxveW1lbnQucmVsYXRlKCJvcGVudmltLWNvbnRyb2xsZXI6ZGIiLCAibXlzcWw6ZGIiKQorICAgIGRlcGxveW1lbnQucmVsYXRlKCJvcGVudmltLWNvbnRyb2xsZXI6Y29tcHV0ZSIsICJvcGVudmltLWNvbXB1dGU6Y29tcHV0ZSIpCisKK2RlZiBnZXRfb3BlbnZpbV9jb25uZWN0aW9uKCk6CisgICAgYWRkcmVzcyA9IGRlcGxveW1lbnQuc2VudHJ5WyJvcGVudmltLWNvbnRyb2xsZXIiXVswXS5pbmZvWyJwdWJsaWMtYWRkcmVzcyJdCisgICAgcmV0dXJuIG9wZW52aW0uY29ubmVjdChhZGRyZXNzKQorCitkZWYgZ2V0X2ZpcnN0X3VuaXRfc3RhdHVzKHNlcnZpY2UpOgorICAgIHNlcnZpY2Vfc3RhdHVzID0gZGVwbG95bWVudC5zZW50cnkuZ2V0X3N0YXR1cygpWyJvcGVudmltLWNvbnRyb2xsZXIiXQorICAgIHVuaXRfc3RhdHVzID0gbmV4dChpdGVyKHNlcnZpY2Vfc3RhdHVzLnZhbHVlcygpKSkKKyAgICByZXR1cm4gdW5pdF9zdGF0dXMKKworZGVmIHRlc3RfY29udHJvbGxlcl9ibG9ja3Nfd2l0aG91dF9teXNxbCgpOgorICAgIHVuaXRfc3RhdHVzID0gZ2V0X2ZpcnN0X3VuaXRfc3RhdHVzKCJvcGVudmltLWNvbnRyb2xsZXIiKQorICAgIHdvcmtsb2FkX3N0YXR1cyA9IHVuaXRfc3RhdHVzWyJ3b3JrbG9hZC1zdGF0dXMiXQorICAgIGFzc2VydCB3b3JrbG9hZF9zdGF0dXNbImN1cnJlbnQiXSA9PSAiYmxvY2tlZCIKKyAgICBhc3NlcnQgd29ya2xvYWRfc3RhdHVzWyJtZXNzYWdlIl0gPT0gIm15c3FsIGRhdGFiYXNlIHJlcXVpcmVkIgorCitkZWYgdGVzdF9hZGRpbmdfY29tcHV0ZV91bml0KCk6CisgICAgZGVwbG95bWVudC5hZGRfdW5pdCgib3BlbnZpbS1jb21wdXRlIikKKyAgICBkZXBsb3ltZW50LnNlbnRyeS53YWl0KHRpbWVvdXQ9OTAwKQorICAgIGMgPSBnZXRfb3BlbnZpbV9jb25uZWN0aW9uKCkKKyAgICBhc3NlcnQgbGVuKGMuZ2V0X2hvc3RzKCkpID09IDIKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBkZXBsb3lfb3BlbnZpbV93aXRob3V0X3JlbGF0aW9ucygpCisgICAgdGVzdF9jb250cm9sbGVyX2Jsb2Nrc193aXRob3V0X215c3FsKCkKKyAgICBhZGRfcmVsYXRpb25zKCkKKyAgICB0ZXN0X2FkZGluZ19jb21wdXRlX3VuaXQoKQpkaWZmIC0tZ2l0IGEvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL3Rlc3RzL29wZW52aW0ucHkgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVzdHMvb3BlbnZpbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVhMzJjCi0tLSAvZGV2L251bGwKKysrIGIvY2hhcm0vb3BlbnZpbS9sYXllci1vcGVudmltL3Rlc3RzL29wZW52aW0ucHkKQEAgLTAsMCArMSw1NSBAQAoraW1wb3J0IHJlcXVlc3RzCitpbXBvcnQganNvbgorCitjbGFzcyBDb25uZWN0aW9uKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2VfdXJsKToKKyAgICAgICAgc2VsZi5iYXNlX3VybCA9IGJhc2VfdXJsCisKKyAgICBkZWYgc2V0X2FjdGl2ZV90ZW5hbnQoc2VsZiwgdGVuYW50KToKKyAgICAgICAgc2VsZi50ZW5hbnRfaWQgPSB0ZW5hbnRbImlkIl0KKworICAgIGRlZiBnZXRfdGVuYW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2h0dHBfZ2V0KCJ0ZW5hbnRzIilbInRlbmFudHMiXQorCisgICAgZGVmIGdldF9ob3N0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2h0dHBfZ2V0KCJob3N0cyIpWyJob3N0cyJdCisKKyAgICBkZWYgZ2V0X25ldHdvcmtzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faHR0cF9nZXQoIm5ldHdvcmtzIilbIm5ldHdvcmtzIl0KKworICAgIGRlZiBnZXRfaW1hZ2VzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faHR0cF9nZXQoc2VsZi50ZW5hbnRfaWQgKyAiL2ltYWdlcyIpWyJpbWFnZXMiXQorCisgICAgZGVmIGdldF9mbGF2b3JzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faHR0cF9nZXQoc2VsZi50ZW5hbnRfaWQgKyAiL2ZsYXZvcnMiKVsiZmxhdm9ycyJdCisKKyAgICBkZWYgY3JlYXRlX3NlcnZlcihzZWxmLCBuYW1lLCBkZXNjcmlwdGlvbiwgaW1hZ2UsIGZsYXZvciwgbmV0d29ya3MpOgorICAgICAgICByZXF1ZXN0X2RhdGEgPSB7InNlcnZlciI6IHsKKyAgICAgICAgICAgICJuYW1lIjogbmFtZSwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgImltYWdlUmVmIjogaW1hZ2VbImlkIl0sCisgICAgICAgICAgICAiZmxhdm9yUmVmIjogZmxhdm9yWyJpZCJdLAorICAgICAgICAgICAgIm5ldHdvcmtzIjogWworICAgICAgICAgICAgICAgIHsibmFtZSI6IG5bIm5hbWUiXSwgInV1aWQiOiBuWyJpZCJdfQorICAgICAgICAgICAgICAgIGZvciBuIGluIG5ldHdvcmtzCisgICAgICAgICAgICBdCisgICAgICAgIH19CisKKyAgICAgICAgcGF0aCA9IHNlbGYudGVuYW50X2lkICsgIi9zZXJ2ZXJzIgorICAgICAgICByZXR1cm4gc2VsZi5faHR0cF9wb3N0KHBhdGgsIHJlcXVlc3RfZGF0YSkKKworICAgIGRlZiBfaHR0cF9nZXQoc2VsZiwgcGF0aCk6CisgICAgICAgIHJlc3BvbnNlID0gcmVxdWVzdHMuZ2V0KHNlbGYuYmFzZV91cmwgKyBwYXRoKQorICAgICAgICBhc3NlcnQgcmVzcG9uc2Uuc3RhdHVzX2NvZGUgPT0gMjAwCisgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCkKKworICAgIGRlZiBfaHR0cF9wb3N0KHNlbGYsIHBhdGgsIHJlcXVlc3RfZGF0YSk6CisgICAgICAgIGRhdGEgPSBqc29uLmR1bXBzKHJlcXVlc3RfZGF0YSkKKyAgICAgICAgaGVhZGVycyA9IHsiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb24ifQorICAgICAgICByZXNwb25zZSA9IHJlcXVlc3RzLnBvc3Qoc2VsZi5iYXNlX3VybCArIHBhdGgsIGRhdGE9ZGF0YSwgaGVhZGVycz1oZWFkZXJzKQorICAgICAgICBhc3NlcnQgcmVzcG9uc2Uuc3RhdHVzX2NvZGUgPT0gMjAwCisgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCkKKworZGVmIGNvbm5lY3QoaG9zdCwgcG9ydD05MDgwKToKKyAgICBiYXNlX3VybCA9ICJodHRwOi8vJXM6JXMvb3BlbnZpbS8iICUgKGhvc3QsIHBvcnQpCisgICAgcmV0dXJuIENvbm5lY3Rpb24oYmFzZV91cmwpCmRpZmYgLS1naXQgYS9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVzdHMvdGVzdHMueWFtbCBiL2NoYXJtL29wZW52aW0vbGF5ZXItb3BlbnZpbS90ZXN0cy90ZXN0cy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMTBlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jaGFybS9vcGVudmltL2xheWVyLW9wZW52aW0vdGVzdHMvdGVzdHMueWFtbApAQCAtMCwwICsxLDMgQEAKK3BhY2thZ2VzOgorICAtIGFtdWxldAorICAtIHB5dGhvbjMtcmVxdWVzdHMKZGlmZiAtLWdpdCBhL2RhdGFiYXNlX3V0aWxzL2R1bXBfZGIuc2ggYi9kYXRhYmFzZV91dGlscy9kdW1wX2RiLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3ZDY4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhYmFzZV91dGlscy9kdW1wX2RiLnNoCkBAIC0wLDAgKzEsMTQ3IEBACisjIS9iaW4vYmFzaAorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCitMSUNFTlNFX0hFQUQ9Jy8qKgorKiBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorKiBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorKiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorKiBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisqKi8KKycKKworCitEQlVTRVI9InZpbSIKK0RCUEFTUz0iIgorREJIT1NUPSJsb2NhbGhvc3QiCitEQlBPUlQ9IjMzMDYiCitEQk5BTUU9InZpbV9kYiIKKyAKKyMgRGV0ZWN0IHBhdGhzCitNWVNRTD0kKHdoaWNoIG15c3FsKQorQVdLPSQod2hpY2ggYXdrKQorR1JFUD0kKHdoaWNoIGdyZXApCitESVJOQU1FPWBkaXJuYW1lICQwYAorIAorZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvIC1lICJVc2FnZTogJDAgT1BUSU9OUyIKKyAgICBlY2hvIC1lICIgIER1bXBzIG9wZW52aW0gZGF0YWJhc2UgY29udGVudCIKKyAgICBlY2hvIC1lICIgIE9QVElPTlMiCisgICAgZWNobyAtZSAiICAgICAtdSBVU0VSICBkYXRhYmFzZSB1c2VyLiAnJERCVVNFUicgYnkgZGVmYXVsdC4gUHJvbXB0cyBpZiBEQiBhY2Nlc3MgZmFpbHMiCisgICAgZWNobyAtZSAiICAgICAtcCBQQVNTICBkYXRhYmFzZSBwYXNzd29yZC4gJ05vIHBhc3N3b3JkJyBieSBkZWZhdWx0LiBQcm9tcHRzIGlmIERCIGFjY2VzcyBmYWlscyIKKyAgICBlY2hvIC1lICIgICAgIC1QIFBPUlQgIGRhdGFiYXNlIHBvcnQuICckREJQT1JUJyBieSBkZWZhdWx0IgorICAgIGVjaG8gLWUgIiAgICAgLWggSE9TVCAgZGF0YWJhc2UgaG9zdC4gJyREQkhPU1QnIGJ5IGRlZmF1bHQiCisgICAgZWNobyAtZSAiICAgICAtZCBOQU1FICBkYXRhYmFzZSBuYW1lLiAnJERCTkFNRScgYnkgZGVmYXVsdC4gIFByb21wdHMgaWYgREIgYWNjZXNzIGZhaWxzIgorICAgIGVjaG8gLWUgIiAgICAgLS1oZWxwICAgc2hvd3MgdGhpcyBoZWxwIgorfQorCit3aGlsZSBnZXRvcHRzICI6dTpwOlA6aDotOiIgbzsgZG8KKyAgICBjYXNlICIke299IiBpbgorICAgICAgICB1KQorICAgICAgICAgICAgREJVU0VSPSIkT1BUQVJHIgorICAgICAgICAgICAgOzsKKyAgICAgICAgcCkKKyAgICAgICAgICAgIERCUEFTUz0iJE9QVEFSRyIKKyAgICAgICAgICAgIDs7CisgICAgICAgIFApCisgICAgICAgICAgICBEQlBPUlQ9IiRPUFRBUkciCisgICAgICAgICAgICA7OworICAgICAgICBkKQorICAgICAgICAgICAgREJOQU1FPSIkT1BUQVJHIgorICAgICAgICAgICAgOzsKKyAgICAgICAgaCkKKyAgICAgICAgICAgIERCSE9TVD0iJE9QVEFSRyIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0pCisgICAgICAgICAgICBbICIke09QVEFSR30iID09ICJoZWxwIiBdICYmIHVzYWdlICYmIGV4aXQgMAorICAgICAgICAgICAgZWNobyAiSW52YWxpZCBvcHRpb246IC0tJE9QVEFSRyIgPiYyICYmIHVzYWdlICA+JjIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgOzsKKyAgICAgICAgXD8pCisgICAgICAgICAgICBlY2hvICJJbnZhbGlkIG9wdGlvbjogLSRPUFRBUkciID4mMiAmJiB1c2FnZSAgPiYyCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIDs7CisgICAgICAgIDopCisgICAgICAgICAgICBlY2hvICJPcHRpb24gLSRPUFRBUkcgcmVxdWlyZXMgYW4gYXJndW1lbnQuIiA+JjIgJiYgdXNhZ2UgID4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgdXNhZ2UgPiYyCisgICAgICAgICAgICBleGl0IC0xCisgICAgICAgICAgICA7OworICAgIGVzYWMKK2RvbmUKK3NoaWZ0ICQoKE9QVElORC0xKSkKKworI2NoZWNrIGFuZCBhc2sgZm9yIGRhdGFiYXNlIHVzZXIgcGFzc3dvcmQKK0RCVVNFUl89Ii11JERCVVNFUiIKK0RCUEFTU189IiIKK1sgLW4gIiREQlBBU1MiIF0gJiYgREJQQVNTXz0iLXAkREJQQVNTIgorREJIT1NUXz0iLWgkREJIT1NUIgorREJQT1JUXz0iLVAkREJQT1JUIgord2hpbGUgISAgZWNobyAiOyIgfCBteXNxbCAkREJIT1NUXyAkREJQT1JUXyAkREJVU0VSXyAkREJQQVNTXyAkREJOQU1FID4vZGV2L251bGwgMj4mMQorZG8KKyAgICAgICAgWyAtbiAiJGxvZ2ludHJ5IiBdICYmICBlY2hvIC1lICJcbkludmFsaWQgZGF0YWJhc2UgY3JlZGVudGlhbHMhISEuIFRyeSBhZ2FpbiAoQ3RybCtjIHRvIGFib3J0KSIKKyAgICAgICAgWyAteiAiJGxvZ2ludHJ5IiBdICYmICBlY2hvIC1lICJcblByb3ZpZGUgZGF0YWJhc2UgbmFtZSBhbmQgY3JlZGVudGlhbHMiCisgICAgICAgIHJlYWQgLWUgLXAgIm15c3FsIGRhdGFiYXNlIG5hbWUoJERCTkFNRSk6ICIgS0sKKyAgICAgICAgWyAtbiAiJEtLIiBdICYmIERCTkFNRT0iJEtLIgorICAgICAgICByZWFkIC1lIC1wICJteXNxbCB1c2VyKCREQlVTRVIpOiAiIEtLCisgICAgICAgIFsgLW4gIiRLSyIgXSAmJiBEQlVTRVI9IiRLSyIgJiYgREJVU0VSXz0iLXUkREJVU0VSIgorICAgICAgICByZWFkIC1lIC1zIC1wICJteXNxbCBwYXNzd29yZDogIiBEQlBBU1MKKyAgICAgICAgWyAtbiAiJERCUEFTUyIgXSAmJiBEQlBBU1NfPSItcCREQlBBU1MiCisgICAgICAgIFsgLXogIiREQlBBU1MiIF0gJiYgREJQQVNTXz0iIgorICAgICAgICBsb2dpbnRyeT0ieWVzIgorICAgICAgICBlY2hvCitkb25lCisKKyAKKyNlY2hvIHN0cnVjdHVyZSwgaW5jbHVkaW5nIHRoZSBjb250ZW50IG9mIHNjaGVtYV92ZXJzaW9uCitlY2hvICIkTElDRU5TRV9IRUFEIiA+ICR7RElSTkFNRX0vJHtEQk5BTUV9X3N0cnVjdHVyZS5zcWwKK215c3FsZHVtcCAkREJIT1NUXyAkREJQT1JUXyAkREJVU0VSXyAkREJQQVNTXyAtLW5vLWRhdGEgLS1hZGQtZHJvcC10YWJsZSAtLWFkZC1kcm9wLWRhdGFiYXNlIC0tcm91dGluZXMgLS1kYXRhYmFzZXMgJERCTkFNRSA+PiAke0RJUk5BTUV9LyR7REJOQU1FfV9zdHJ1Y3R1cmUuc3FsCitlY2hvIC1lICJcblxuXG5cbiIgPj4gJHtESVJOQU1FfS8ke0RCTkFNRX1fc3RydWN0dXJlLnNxbAorbXlzcWxkdW1wICREQkhPU1RfICREQlBPUlRfICREQlVTRVJfICREQlBBU1NfIC0tbm8tY3JlYXRlLWluZm8gJERCTkFNRSAtLXRhYmxlcyBzY2hlbWFfdmVyc2lvbiAyPi9kZXYvbnVsbCAgPj4gJHtESVJOQU1FfS8ke0RCTkFNRX1fc3RydWN0dXJlLnNxbAorZWNobyAiICAgICR7RElSTkFNRX0vJHtEQk5BTUV9X3N0cnVjdHVyZS5zcWwiCisKKyNlY2hvIG9ubHkgZGF0YQorZWNobyAiJExJQ0VOU0VfSEVBRCIgPiAke0RJUk5BTUV9LyR7REJOQU1FfV9kYXRhLnNxbCAjY29weSBteSBvd24gaGVhZGVyCitteXNxbGR1bXAgJERCSE9TVF8gJERCUE9SVF8gJERCVVNFUl8gJERCUEFTU18gLS1uby1jcmVhdGUtaW5mbyAkREJOQU1FID4+ICR7RElSTkFNRX0vJHtEQk5BTUV9X2RhdGEuc3FsCitlY2hvICIgICAgJHtESVJOQU1FfS8ke0RCTkFNRX1fZGF0YS5zcWwiCisKKyNlY2hvIGFsbAorZWNobyAiJExJQ0VOU0VfSEVBRCIgPiAke0RJUk5BTUV9LyR7REJOQU1FfV9hbGwuc3FsICNjb3B5IG15IG93biBoZWFkZXIKK215c3FsZHVtcCAkREJIT1NUXyAkREJQT1JUXyAkREJVU0VSXyAkREJQQVNTXyAtLWFkZC1kcm9wLXRhYmxlIC0tYWRkLWRyb3AtZGF0YWJhc2UgLS1yb3V0aW5lcyAtLWRhdGFiYXNlcyAkREJOQU1FID4+ICR7RElSTkFNRX0vJHtEQk5BTUV9X2FsbC5zcWwKK2VjaG8gIiAgICAke0RJUk5BTUV9LyR7REJOQU1FfV9hbGwuc3FsIgorCmRpZmYgLS1naXQgYS9kYXRhYmFzZV91dGlscy9ob3N0X3Jhbmtpbmcuc3FsIGIvZGF0YWJhc2VfdXRpbHMvaG9zdF9yYW5raW5nLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTIyOWJmCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YWJhc2VfdXRpbHMvaG9zdF9yYW5raW5nLnNxbApAQCAtMCwwICsxLDQzIEBACisvKgorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKyovCisKKy8qIFRoaXMgdGFibGUgY29udGFpbnMgYSBsaXN0IG9mIHByb2Nlc3NvciByYW5raW5nCisgICBUaGUgbGFyZ2VyIHJhbmtpbmcgdGhlIGJldHRlciBwZXJmb3JtYW5jZQorICAgQWxsIHBoeXNpY2FsIGhvc3QgbW9kZWxzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhpcyB0YWJsZSAKKyAgIGJlZm9yZSBiZWluZyBhZGRpbmcgdG8gb3BlbnZpbQorICAgcHJvY2Vzc29yIGluZm9ybWF0aW9uIGlzIG9idGFpbmVkIHdpdGggY29tbW5hbmQgY2F0IC9wcm9jL2NwdWluZm8KKyAgIE5PVEU6IEN1cnJlbnQgdmVyc2lvbiBvZiBvcGVudmltIGlnbm9yZXMgdGhlIHJhbmtpbmcKKyovCisKKworTE9DSyBUQUJMRVMgYGhvc3RfcmFua2luZ2AgV1JJVEU7CisvKiE0MDAwMCBBTFRFUiBUQUJMRSBgaG9zdF9yYW5raW5nYCBESVNBQkxFIEtFWVMgKi87CitJTlNFUlQgSU5UTyBgaG9zdF9yYW5raW5nYCAKKyAgICAoZmFtaWx5LCBtYW51ZmFjdHVyZXIsIHZlcnNpb24sIGRlc2NyaXB0aW9uLCByYW5raW5nKQorVkFMVUVTIAorICAgICgnWGVvbicsJ0ludGVsJywnSW50ZWwoUikgWGVvbihSKSBDUFUgRTUtMjY4MCAwIEAgMi43MEdIeicsJ3NhbmR5IGJyaWRnZScsMTcwKSwKKyAgICAoJ1hlb24nLCdJbnRlbCcsJ0ludGVsKFIpIFhlb24oUikgQ1BVIEU1LTQ2MjAgMCBAIDIuMjBHSHonLCdzYW5keSBicmlkZ2UnLDIwMCksCisgICAgKCdYZW9uJywnSW50ZWwnLCdJbnRlbChSKSBYZW9uKFIpIENQVSBFNS0yNjk3IHYyIEAgMi43MEdIeicsJ2l2eSBicmlkZ2UnLDMwMCksCisgICAgKCdYZW9uJywnSW50ZWwnLCdJbnRlbChSKSBYZW9uKFIpIENQVSBFNS0yNjgwIHYyIEAgMi44MEdIeicsJ2l2eSBicmlkZ2UnLDMxMCk7IC8qbGFzdCBlbnRyeSBlbmRzIHdpdGggICAnOycgICovCisKK1VOTE9DSyBUQUJMRVM7CmRpZmYgLS1naXQgYS9kYXRhYmFzZV91dGlscy9pbml0X3ZpbV9kYi5zaCBiL2RhdGFiYXNlX3V0aWxzL2luaXRfdmltX2RiLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyZGNkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhYmFzZV91dGlscy9pbml0X3ZpbV9kYi5zaApAQCAtMCwwICsxLDEyNCBAQAorIyEvYmluL2Jhc2gKKworIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworREJVU0VSPSJ2aW0iCitEQlBBU1M9IiIKK0RCSE9TVD0ibG9jYWxob3N0IgorREJQT1JUPSIzMzA2IgorREJOQU1FPSJ2aW1fZGIiCisgCisjIERldGVjdCBwYXRocworTVlTUUw9JCh3aGljaCBteXNxbCkKK0FXSz0kKHdoaWNoIGF3aykKK0dSRVA9JCh3aGljaCBncmVwKQorRElSTkFNRT1gZGlybmFtZSAkMGAKKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvIC1lICJVc2FnZTogJDAgT1BUSU9OUyBbe29wZW52aW1fdmVyc2lvbn1dIgorICAgIGVjaG8gLWUgIiAgSW5pdHMgb3BlbnZpbSBkYXRhYmFzZTsgZGVsZXRlcyBwcmV2aW91cyBvbmUgYW5kIGxvYWRzIGZyb20gJHtEQk5BTUV9X3N0cnVjdHVyZS5zcWwiCisgICAgZWNobyAtZSAiICAgYW5kIGRhdGEgZnJvbSBob3N0X3Jhbmtpbmcuc3FsLCBuZXRzLnNxbCwgb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlY2UqLnNxbCIKKyAgICBlY2hvIC1lICIgIElmIG9wZW52aW1fdmVyc2lvbiBpcyBub3QgcHJvdmlkZWQgaXQgdHJpZXMgdG8gZ2V0IGZyb20gb3BlbnZpbWQucHkgdXNpbmcgcmVsYXRpdmUgcGF0aCIKKyAgICBlY2hvIC1lICIgIE9QVElPTlMiCisgICAgZWNobyAtZSAiICAgICAtdSBVU0VSICBkYXRhYmFzZSB1c2VyLiAnJERCVVNFUicgYnkgZGVmYXVsdC4gUHJvbXB0cyBpZiBEQiBhY2Nlc3MgZmFpbHMiCisgICAgZWNobyAtZSAiICAgICAtcCBQQVNTICBkYXRhYmFzZSBwYXNzd29yZC4gJ05vIHBhc3N3b3JkJyBieSBkZWZhdWx0LiBQcm9tcHRzIGlmIERCIGFjY2VzcyBmYWlscyIKKyAgICBlY2hvIC1lICIgICAgIC1QIFBPUlQgIGRhdGFiYXNlIHBvcnQuICckREJQT1JUJyBieSBkZWZhdWx0IgorICAgIGVjaG8gLWUgIiAgICAgLWggSE9TVCAgZGF0YWJhc2UgaG9zdC4gJyREQkhPU1QnIGJ5IGRlZmF1bHQiCisgICAgZWNobyAtZSAiICAgICAtZCBOQU1FICBkYXRhYmFzZSBuYW1lLiAnJERCTkFNRScgYnkgZGVmYXVsdC4gIFByb21wdHMgaWYgREIgYWNjZXNzIGZhaWxzIgorICAgIGVjaG8gLWUgIiAgICAgLS1oZWxwICAgc2hvd3MgdGhpcyBoZWxwIgorfQorCit3aGlsZSBnZXRvcHRzICI6dTpwOlA6aDpkOi06IiBvOyBkbworICAgIGNhc2UgIiR7b30iIGluCisgICAgICAgIHUpCisgICAgICAgICAgICBEQlVTRVI9IiRPUFRBUkciCisgICAgICAgICAgICA7OworICAgICAgICBwKQorICAgICAgICAgICAgREJQQVNTPSIkT1BUQVJHIgorICAgICAgICAgICAgOzsKKyAgICAgICAgUCkKKyAgICAgICAgICAgIERCUE9SVD0iJE9QVEFSRyIKKyAgICAgICAgICAgIDs7CisgICAgICAgIGQpCisgICAgICAgICAgICBEQk5BTUU9IiRPUFRBUkciCisgICAgICAgICAgICA7OworICAgICAgICBoKQorICAgICAgICAgICAgREJIT1NUPSIkT1BUQVJHIgorICAgICAgICAgICAgOzsKKyAgICAgICAgLSkKKyAgICAgICAgICAgIFsgIiR7T1BUQVJHfSIgPT0gImhlbHAiIF0gJiYgdXNhZ2UgJiYgZXhpdCAwCisgICAgICAgICAgICBlY2hvICJJbnZhbGlkIG9wdGlvbjogLS0kT1BUQVJHIiA+JjIgJiYgdXNhZ2UgID4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICA7OworICAgICAgICBcPykKKyAgICAgICAgICAgIGVjaG8gIkludmFsaWQgb3B0aW9uOiAtJE9QVEFSRyIgPiYyICYmIHVzYWdlICA+JjIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgOzsKKyAgICAgICAgOikKKyAgICAgICAgICAgIGVjaG8gIk9wdGlvbiAtJE9QVEFSRyByZXF1aXJlcyBhbiBhcmd1bWVudC4iID4mMiAmJiB1c2FnZSAgPiYyCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICB1c2FnZSA+JjIKKyAgICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorc2hpZnQgJCgoT1BUSU5ELTEpKQorCisjY2hlY2sgYW5kIGFzayBmb3IgZGF0YWJhc2UgdXNlciBwYXNzd29yZAorREJVU0VSXz0iLXUkREJVU0VSIgorREJQQVNTXz0iIgorWyAtbiAiJERCUEFTUyIgXSAmJiBEQlBBU1NfPSItcCREQlBBU1MiCitEQkhPU1RfPSItaCREQkhPU1QiCitEQlBPUlRfPSItUCREQlBPUlQiCit3aGlsZSAhICBlY2hvICI7IiB8IG15c3FsICREQkhPU1RfICREQlBPUlRfICREQlVTRVJfICREQlBBU1NfICREQk5BTUUgPi9kZXYvbnVsbCAyPiYxCitkbworICAgICAgICBbIC1uICIkbG9naW50cnkiIF0gJiYgIGVjaG8gLWUgIlxuSW52YWxpZCBkYXRhYmFzZSBjcmVkZW50aWFscyEhIS4gVHJ5IGFnYWluIChDdHJsK2MgdG8gYWJvcnQpIgorICAgICAgICBbIC16ICIkbG9naW50cnkiIF0gJiYgIGVjaG8gLWUgIlxuUHJvdmlkZSBkYXRhYmFzZSBuYW1lIGFuZCBjcmVkZW50aWFscyIKKyAgICAgICAgcmVhZCAtZSAtcCAibXlzcWwgZGF0YWJhc2UgbmFtZSgkREJOQU1FKTogIiBLSworICAgICAgICBbIC1uICIkS0siIF0gJiYgREJOQU1FPSIkS0siCisgICAgICAgIHJlYWQgLWUgLXAgIm15c3FsIHVzZXIoJERCVVNFUik6ICIgS0sKKyAgICAgICAgWyAtbiAiJEtLIiBdICYmIERCVVNFUj0iJEtLIiAmJiBEQlVTRVJfPSItdSREQlVTRVIiCisgICAgICAgIHJlYWQgLWUgLXMgLXAgIm15c3FsIHBhc3N3b3JkOiAiIERCUEFTUworICAgICAgICBbIC1uICIkREJQQVNTIiBdICYmIERCUEFTU189Ii1wJERCUEFTUyIKKyAgICAgICAgWyAteiAiJERCUEFTUyIgXSAmJiBEQlBBU1NfPSIiCisgICAgICAgIGxvZ2ludHJ5PSJ5ZXMiOgorICAgICAgICBlY2hvCitkb25lCisKK2VjaG8gIiAgICBsb2FkaW5nICR7RElSTkFNRX0vdmltX2RiX3N0cnVjdHVyZS5zcWwiCitzZWQgLWUgInMvdmltX2RiLyREQk5BTUUvIiAke0RJUk5BTUV9L3ZpbV9kYl9zdHJ1Y3R1cmUuc3FsIHwgIG15c3FsICAkREJIT1NUXyAkREJQT1JUXyAkREJVU0VSXyAkREJQQVNTXyAKKworZWNobyAiICAgIG1pZ3JhZ2UgZGF0YWJhc2UgdmVyc2lvbiIKKyR7RElSTkFNRX0vbWlncmF0ZV92aW1fZGIuc2ggJERCSE9TVF8gJERCUE9SVF8gJERCVVNFUl8gJERCUEFTU18gLWQkREJOQU1FICQxCisKK2VjaG8gICIgICAgbG9hZGluZyAke0RJUk5BTUV9L2hvc3RfcmFua2luZy5zcWwiCitteXNxbCAkREJIT1NUXyAkREJQT1JUXyAkREJVU0VSXyAkREJQQVNTXyAgJERCTkFNRSA8ICR7RElSTkFNRX0vaG9zdF9yYW5raW5nLnNxbAorCitlY2hvICAiICAgIGxvYWRpbmcgJHtESVJOQU1FfS9vZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2Uuc3FsIgorbXlzcWwgJERCSE9TVF8gJERCUE9SVF8gJERCVVNFUl8gJERCUEFTU18gICREQk5BTUUgPCAke0RJUk5BTUV9L29mX3BvcnRzX3BjaV9jb3JyZXNwb25kZW5jZS5zcWwKKyNteXNxbCAtaCAkSE9TVCAtUCAkUE9SVCAtdSAkTVVTRVIgLXAkTVBBU1MgJE1EQiA8ICR7RElSTkFNRX0vb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlbmNlX2NlbnRvcy5zcWwKKworZWNobyAgIiAgICBsb2FkaW5nICR7RElSTkFNRX0vbmV0cy5zcWwiCitteXNxbCAkREJIT1NUXyAkREJQT1JUXyAkREJVU0VSXyAkREJQQVNTXyAgJERCTkFNRSA8ICR7RElSTkFNRX0vbmV0cy5zcWwKKwpkaWZmIC0tZ2l0IGEvZGF0YWJhc2VfdXRpbHMvbWlncmF0ZV92aW1fZGIuc2ggYi9kYXRhYmFzZV91dGlscy9taWdyYXRlX3ZpbV9kYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOGZlYzNlCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YWJhc2VfdXRpbHMvbWlncmF0ZV92aW1fZGIuc2gKQEAgLTAsMCArMSw0NTAgQEAKKyMhL2Jpbi9iYXNoCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKyMKKyNVcGdyYWRlL0Rvd25ncmFkZSBvcGVudmltIGRhdGFiYXNlIHByZXNlcnZpbmcgdGhlIGNvbnRlbnQKKyMKKworREJVU0VSPSJ2aW0iCitEQlBBU1M9IiIKK0RCSE9TVD0ibG9jYWxob3N0IgorREJQT1JUPSIzMzA2IgorREJOQU1FPSJ2aW1fZGIiCisgCisjIERldGVjdCBwYXRocworTVlTUUw9JCh3aGljaCBteXNxbCkKK0FXSz0kKHdoaWNoIGF3aykKK0dSRVA9JCh3aGljaCBncmVwKQorRElSTkFNRT1gZGlybmFtZSAkMGAKKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvIC1lICJVc2FnZTogJDAgT1BUSU9OUyAgW3tvcGVudmltX3ZlcnNpb259XSIKKyAgICBlY2hvIC1lICIgIFVwZ3JhZGVzL0Rvd25ncmFkZXMgb3BlbnZpbSBkYXRhYmFzZSBwcmVzZXJ2aW5nIHRoZSBjb250ZW50IgorICAgIGVjaG8gLWUgIiAgIGlmIG9wZW52aW1fdmVyc2lvbiBpcyBub3QgcHJvdmlkZWQgaXQgdHJpZXMgdG8gZ2V0IGZyb20gb3BlbnZpbWQucHkgdXNpbmcgcmVsYXRpdmUgcGF0aCIKKyAgICBlY2hvIC1lICIgIE9QVElPTlMiCisgICAgZWNobyAtZSAiICAgICAtdSBVU0VSICBkYXRhYmFzZSB1c2VyLiAnJERCVVNFUicgYnkgZGVmYXVsdC4gUHJvbXB0cyBpZiBEQiBhY2Nlc3MgZmFpbHMiCisgICAgZWNobyAtZSAiICAgICAtcCBQQVNTICBkYXRhYmFzZSBwYXNzd29yZC4gJ05vIHBhc3N3b3JkJyBieSBkZWZhdWx0LiBQcm9tcHRzIGlmIERCIGFjY2VzcyBmYWlscyIKKyAgICBlY2hvIC1lICIgICAgIC1QIFBPUlQgIGRhdGFiYXNlIHBvcnQuICckREJQT1JUJyBieSBkZWZhdWx0IgorICAgIGVjaG8gLWUgIiAgICAgLWggSE9TVCAgZGF0YWJhc2UgaG9zdC4gJyREQkhPU1QnIGJ5IGRlZmF1bHQiCisgICAgZWNobyAtZSAiICAgICAtZCBOQU1FICBkYXRhYmFzZSBuYW1lLiAnJERCTkFNRScgYnkgZGVmYXVsdC4gIFByb21wdHMgaWYgREIgYWNjZXNzIGZhaWxzIgorICAgIGVjaG8gLWUgIiAgICAgLS1oZWxwICAgc2hvd3MgdGhpcyBoZWxwIgorfQorCit3aGlsZSBnZXRvcHRzICI6dTpwOlA6aDpkOi06IiBvOyBkbworICAgIGNhc2UgIiR7b30iIGluCisgICAgICAgIHUpCisgICAgICAgICAgICBEQlVTRVI9IiRPUFRBUkciCisgICAgICAgICAgICA7OworICAgICAgICBwKQorICAgICAgICAgICAgREJQQVNTPSIkT1BUQVJHIgorICAgICAgICAgICAgOzsKKyAgICAgICAgUCkKKyAgICAgICAgICAgIERCUE9SVD0iJE9QVEFSRyIKKyAgICAgICAgICAgIDs7CisgICAgICAgIGQpCisgICAgICAgICAgICBEQk5BTUU9IiRPUFRBUkciCisgICAgICAgICAgICA7OworICAgICAgICBoKQorICAgICAgICAgICAgREJIT1NUPSIkT1BUQVJHIgorICAgICAgICAgICAgOzsKKyAgICAgICAgLSkKKyAgICAgICAgICAgIFsgIiR7T1BUQVJHfSIgPT0gImhlbHAiIF0gJiYgdXNhZ2UgJiYgZXhpdCAwCisgICAgICAgICAgICBlY2hvICJJbnZhbGlkIG9wdGlvbjogLS0kT1BUQVJHIiA+JjIgJiYgdXNhZ2UgID4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICA7OyAKKyAgICAgICAgXD8pCisgICAgICAgICAgICBlY2hvICJJbnZhbGlkIG9wdGlvbjogLSRPUFRBUkciID4mMiAmJiB1c2FnZSAgPiYyCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIDs7CisgICAgICAgIDopCisgICAgICAgICAgICBlY2hvICJPcHRpb24gLSRPUFRBUkcgcmVxdWlyZXMgYW4gYXJndW1lbnQuIiA+JjIgJiYgdXNhZ2UgID4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgdXNhZ2UgPiYyCisgICAgICAgICAgICBleGl0IC0xCisgICAgICAgICAgICA7OworICAgIGVzYWMKK2RvbmUKK3NoaWZ0ICQoKE9QVElORC0xKSkKKworCisjR0VUIE9QRU5WSU0gVkVSU0lPTgorT1BFTlZJTV9WRVI9IiQxIgoraWYgWyAteiAiJE9QRU5WSU1fVkVSIiBdCit0aGVuIAorICAgIE9QRU5WSU1fVkVSPWAke0RJUk5BTUV9Ly4uL29wZW52aW1kLnB5IC12YAorICAgIE9QRU5WSU1fVkVSPSR7T1BFTlZJTV9WRVIlJS1yKn0KKyAgICBPUEVOVklNX1ZFUj0ke09QRU5WSU1fVkVSIyMqdmVyc2lvbiB9CisgICAgZWNobyAiICAgIERldGVjdGVkIG9wZW52aW0gdmVyc2lvbiAkT1BFTlZJTV9WRVIiCitmaQorVkVSU0lPTl8xPWBlY2hvICRPUEVOVklNX1ZFUiB8IGN1dCAtZiAxIC1kIi4iYAorVkVSU0lPTl8yPWBlY2hvICRPUEVOVklNX1ZFUiB8IGN1dCAtZiAyIC1kIi4iYAorVkVSU0lPTl8zPWBlY2hvICRPUEVOVklNX1ZFUiB8IGN1dCAtZiAzIC1kIi4iYAoraWYgISBbICIkVkVSU0lPTl8xIiAtZ2UgMCAtYSAiJFZFUlNJT05fMiIgLWdlIDAgLWEgIiRWRVJTSU9OXzMiIC1nZSAwIF0gMj4vZGV2L251bGwKK3RoZW4gCisgICAgWyAtbiAiJDEiIF0gJiYgZWNobyAiSW52YWxpZCBvcGVudmltIHZlcnNpb24gJyQxJywgZXhwZWN0ZWQgJ1guWC5YJyIgPiYyCisgICAgWyAteiAiJDEiIF0gJiYgZWNobyAiQ2FuIG5vdCBnZXQgb3BlbnZpbSB2ZXJzaW9uIiA+JjIKKyAgICBleGl0IC0xCitmaQorT1BFTlZJTV9WRVJfTlVNPWBwcmludGYgIiVkJTAzZCUwM2QiICR7VkVSU0lPTl8xfSAke1ZFUlNJT05fMn0gJHtWRVJTSU9OXzN9YAorCisjY2hlY2sgYW5kIGFzayBmb3IgZGF0YWJhc2UgdXNlciBwYXNzd29yZAorREJVU0VSXz0iLXUkREJVU0VSIgorWyAtbiAiJERCUEFTUyIgXSAmJiBEQlBBU1NfPSItcCREQlBBU1MiCitEQkhPU1RfPSItaCREQkhPU1QiCitEQlBPUlRfPSItUCREQlBPUlQiCit3aGlsZSAhICBlY2hvICI7IiB8IG15c3FsICREQkhPU1RfICREQlBPUlRfICREQlVTRVJfICREQlBBU1NfICREQk5BTUUgPi9kZXYvbnVsbCAyPiYxCitkbworICAgICAgICBbIC1uICIkbG9naW50cnkiIF0gJiYgIGVjaG8gLWUgIlxuSW52YWxpZCBkYXRhYmFzZSBjcmVkZW50aWFscyEhIS4gVHJ5IGFnYWluIChDdHJsK2MgdG8gYWJvcnQpIgorICAgICAgICBbIC16ICIkbG9naW50cnkiIF0gJiYgIGVjaG8gLWUgIlxuUHJvdmlkZSBkYXRhYmFzZSBuYW1lIGFuZCBjcmVkZW50aWFscyIKKyAgICAgICAgcmVhZCAtZSAtcCAibXlzcWwgZGF0YWJhc2UgbmFtZSgkREJOQU1FKTogIiBLSworICAgICAgICBbIC1uICIkS0siIF0gJiYgREJOQU1FPSIkS0siCisgICAgICAgIHJlYWQgLWUgLXAgIm15c3FsIHVzZXIoJERCVVNFUik6ICIgS0sKKyAgICAgICAgWyAtbiAiJEtLIiBdICYmIERCVVNFUj0iJEtLIiAmJiBEQlVTRVJfPSItdSREQlVTRVIiCisgICAgICAgIHJlYWQgLWUgLXMgLXAgIm15c3FsIHBhc3N3b3JkOiAiIERCUEFTUworICAgICAgICBbIC1uICIkREJQQVNTIiBdICYmIERCUEFTU189Ii1wJERCUEFTUyIKKyAgICAgICAgWyAteiAiJERCUEFTUyIgXSAmJiBEQlBBU1NfPSIiCisgICAgICAgIGxvZ2ludHJ5PSJ5ZXMiCisgICAgICAgIGVjaG8KK2RvbmUKKworREJDTUQ9Im15c3FsICREQkhPU1RfICREQlBPUlRfICREQlVTRVJfICREQlBBU1NfICREQk5BTUUiCisjZWNobyBEQkNNRCAkREJDTUQKKworI0dFVCBEQVRBQkFTRSBWRVJTSU9OCisjY2hlY2sgdGhhdCB0aGUgZGF0YWJhc2Ugc2VlbXMgYSBvcGVudmltIGRhdGFiYXNlCitpZiAhIGVjaG8gLWUgInNob3cgY3JlYXRlIHRhYmxlIGluc3RhbmNlcztcbnNob3cgY3JlYXRlIHRhYmxlIG51bWFzIiB8ICREQkNNRCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgICBlY2hvICIgICAgZGF0YWJhc2UgJERCTkFNRSBkb2VzIG5vdCBzZWVtIHRvIGJlIGFuIG9wZW52aW0gZGF0YWJhc2UiID4mMgorICAgIGV4aXQgLTE7CitmaQorCitpZiAhIGVjaG8gJ3Nob3cgY3JlYXRlIHRhYmxlIHNjaGVtYV92ZXJzaW9uOycgfCAkREJDTUQgPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgICAgREFUQUJBU0VfVkVSPSIwLjAiCisgICAgREFUQUJBU0VfVkVSX05VTT0wCitlbHNlIAorICAgIERBVEFCQVNFX1ZFUl9OVU09YGVjaG8gInNlbGVjdCBtYXgodmVyc2lvbl9pbnQpIGZyb20gc2NoZW1hX3ZlcnNpb247IiB8ICREQkNNRCB8IHRhaWwgLW4rMmAgCisgICAgREFUQUJBU0VfVkVSPWBlY2hvICJzZWxlY3QgdmVyc2lvbiBmcm9tIHNjaGVtYV92ZXJzaW9uIHdoZXJlIHZlcnNpb25faW50PSckREFUQUJBU0VfVkVSX05VTSc7IiB8ICREQkNNRCB8IHRhaWwgLW4rMmAgCisgICAgWyAiJERBVEFCQVNFX1ZFUl9OVU0iIC1sdCAwIC1vICIkREFUQUJBU0VfVkVSX05VTSIgLWd0IDEwMCBdICYmIGVjaG8gIiAgICBFcnJvciBjYW4gbm90IGdldCBkYXRhYmFzZSB2ZXJzaW9uICgkREFUQUJBU0VfVkVSPykiID4mMiAmJiBleGl0IC0xCisgICAgI2VjaG8gIl8ke0RBVEFCQVNFX1ZFUl9OVU19XyR7REFUQUJBU0VfVkVSfSIKK2ZpCisKKworI0dFVCBEQVRBQkFTRSBUQVJHRVQgVkVSU0lPTgorREFUQUJBU0VfVEFSR0VUX1ZFUl9OVU09MAorWyAkT1BFTlZJTV9WRVJfTlVNIC1ndCAxMDkxIF0gJiYgREFUQUJBU0VfVEFSR0VUX1ZFUl9OVU09MSAgICM+MC4xLjkxID0+ICAxCitbICRPUEVOVklNX1ZFUl9OVU0gLWdlIDIwMDMgXSAmJiBEQVRBQkFTRV9UQVJHRVRfVkVSX05VTT0yICAgIzAuMi4wMyAgPT4gIDIKK1sgJE9QRU5WSU1fVkVSX05VTSAtZ2UgMjAwNSBdICYmIERBVEFCQVNFX1RBUkdFVF9WRVJfTlVNPTMgICAjMC4yLjUgICA9PiAgMworWyAkT1BFTlZJTV9WRVJfTlVNIC1nZSAzMDAxIF0gJiYgREFUQUJBU0VfVEFSR0VUX1ZFUl9OVU09NCAgICMwLjMuMSAgID0+ICA0CitbICRPUEVOVklNX1ZFUl9OVU0gLWdlIDQwMDEgXSAmJiBEQVRBQkFTRV9UQVJHRVRfVkVSX05VTT01ICAgIzAuNC4xICAgPT4gIDUKK1sgJE9QRU5WSU1fVkVSX05VTSAtZ2UgNDAwMiBdICYmIERBVEFCQVNFX1RBUkdFVF9WRVJfTlVNPTYgICAjMC40LjIgICA9PiAgNgorWyAkT1BFTlZJTV9WRVJfTlVNIC1nZSA0MDA1IF0gJiYgREFUQUJBU0VfVEFSR0VUX1ZFUl9OVU09NyAgICMwLjQuNSAgID0+ICA3CisjVE9ETyAuLi4gcHV0IG5leHQgdmVyc2lvbnMgaGVyZQorCisKK2Z1bmN0aW9uIHVwZ3JhZGVfdG9fMSgpeworICAgIGVjaG8gIiAgICB1cGdyYWRlIGRhdGFiYXNlIGZyb20gdmVyc2lvbiAwLjAgdG8gdmVyc2lvbiAwLjEiCisgICAgZWNobyAiICAgICAgQ1JFQVRFIFRBQkxFIFxgc2NoZW1hX3ZlcnNpb25cYCIKKyAgICBlY2hvICJDUkVBVEUgVEFCTEUgXGBzY2hlbWFfdmVyc2lvblxgICgKKwlcYHZlcnNpb25faW50XGAgSU5UIE5PVCBOVUxMIENPTU1FTlQgJ3ZlcnNpb24gYXMgYSBudW1iZXIuIE11c3Qgbm90IGNvbnRhaW4gZ2FwcycsCisJXGB2ZXJzaW9uXGAgVkFSQ0hBUigyMCkgTk9UIE5VTEwgQ09NTUVOVCAndmVyc2lvbiBhcyBhIHRleHQnLAorCVxgb3BlbnZpbV92ZXJcYCBWQVJDSEFSKDIwKSBOT1QgTlVMTCBDT01NRU5UICdvcGVudmltIHZlcnNpb24nLAorCVxgY29tbWVudHNcYCBWQVJDSEFSKDIwMDApIE5VTEwgQ09NTUVOVCAnY2hhbmdlcyB0byBkYXRhYmFzZScsCisJXGBkYXRlXGAgREFURSBOVUxMLAorCVBSSU1BUlkgS0VZIChcYHZlcnNpb25faW50XGApCisJKQorCUNPTU1FTlQ9J2RhdGFiYXNlIHNjaGVtYSBjb250cm9sIHZlcnNpb24nCisJQ09MTEFURT0ndXRmOF9nZW5lcmFsX2NpJworCUVOR0lORT1Jbm5vREI7IiB8ICREQkNNRCAgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICJJTlNFUlQgSU5UTyBcYHNjaGVtYV92ZXJzaW9uXGAgKFxgdmVyc2lvbl9pbnRcYCwgXGB2ZXJzaW9uXGAsIFxgb3BlbnZpbV92ZXJcYCwgXGBjb21tZW50c1xgLCBcYGRhdGVcYCkKKwkgVkFMVUVTICgxLCAnMC4xJywgJzAuMi4wMCcsICdpbnNlcnQgc2NoZW1hX3ZlcnNpb247IGFsdGVyIG5ldHMgd2l0aCBsYXN0X2Vycm9yIGNvbHVtbicsICcyMDE1LTA1LTA1Jyk7IiB8ICREQkNNRAorICAgIGVjaG8gIiAgICAgIEFMVEVSIFRBQkxFIFxgbmV0c1xgLCBBREQgQ09MVU1OIFxgbGFzdF9lcnJvclxgIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIFxgbmV0c1xgIAorICAgICAgICAgQUREIENPTFVNTiBcYGxhc3RfZXJyb3JcYCBWQVJDSEFSKDIwMCkgTlVMTCBBRlRFUiBcYHN0YXR1c1xgOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKK30KK2Z1bmN0aW9uIGRvd25ncmFkZV9mcm9tXzEoKXsKKyAgICBlY2hvICIgICAgZG93bmdyYWRlIGRhdGFiYXNlIGZyb20gdmVyc2lvbiAwLjEgdG8gdmVyc2lvbiAwLjAiCisgICAgZWNobyAiICAgICAgQUxURVIgVEFCTEUgXGBuZXRzXGAgRFJPUCBDT0xVTU4gXGBsYXN0X2Vycm9yXGAiCisgICAgZWNobyAiQUxURVIgVEFCTEUgXGBuZXRzXGAgRFJPUCBDT0xVTU4gXGBsYXN0X2Vycm9yXGA7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIiAgICAgIERST1AgVEFCTEUgXGBzY2hlbWFfdmVyc2lvblxgIgorICAgIGVjaG8gIkRST1AgVEFCTEUgXGBzY2hlbWFfdmVyc2lvblxgOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKK30KK2Z1bmN0aW9uIHVwZ3JhZGVfdG9fMigpeworICAgIGVjaG8gIiAgICB1cGdyYWRlIGRhdGFiYXNlIGZyb20gdmVyc2lvbiAwLjEgdG8gdmVyc2lvbiAwLjIiCisgICAgZWNobyAiICAgICAgQUxURVIgVEFCTEUgXGBvZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2VcYCBcYHJlc291cmNlc19wb3J0XGAgXGBwb3J0c1xgIEFERCBDT0xVTU4gXGBzd2l0Y2hfZHBpZFxgIgorICAgIGZvciB0YWJsZSBpbiBvZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2UgcmVzb3VyY2VzX3BvcnQgcG9ydHMKKyAgICBkbworICAgICAgICBlY2hvICJBTFRFUiBUQUJMRSBcYCR7dGFibGV9XGAKKyAgICAgICAgICAgIEFERCBDT0xVTU4gXGBzd2l0Y2hfZHBpZFxgIENIQVIoMjMpIE5VTEwgREVGQVVMVCBOVUxMIEFGVEVSIFxgc3dpdGNoX3BvcnRcYDsgIiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgICAgICBlY2hvICJBTFRFUiBUQUJMRSAke3RhYmxlfSBDSEFOR0UgQ09MVU1OIHN3aXRjaF9wb3J0IHN3aXRjaF9wb3J0IFZBUkNIQVIoMjQpIE5VTEwgREVGQVVMVCBOVUxMOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICAgICAgWyAkdGFibGUgPT0gb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlbmNlIF0gfHwKKyAgICAgICAgICAgIGVjaG8gIkFMVEVSIFRBQkxFICR7dGFibGV9IERST1AgSU5ERVggdmxhbl9zd2l0Y2hfcG9ydCwgQUREIFVOSVFVRSBJTkRFWCB2bGFuX3N3aXRjaF9wb3J0ICh2bGFuLCBzd2l0Y2hfcG9ydCwgc3dpdGNoX2RwaWQpOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBkb25lCisgICAgZWNobyAiICAgICAgVVBEQVRFIHByb2NlZHVyZSBVcGRhdGVTd2l0Y2hQb3J0IgorICAgIGVjaG8gIkRST1AgUFJPQ0VEVVJFIElGIEVYSVNUUyBVcGRhdGVTd2l0Y2hQb3J0OworICAgIGRlbGltaXRlciAvLworICAgIENSRUFURSBQUk9DRURVUkUgVXBkYXRlU3dpdGNoUG9ydCgpIE1PRElGSUVTIFNRTCBEQVRBIFNRTCBTRUNVUklUWSBJTlZPS0VSCisgICAgQ09NTUVOVCAnTG9hZCB0aGUgb3BlbmZsb3cgc3dpdGNoIHBvcnRzIGZyb20gb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlY2UgaW50byByZXNvdXJlY2VzX3BvcnQgYW5kIHBvcnRzJworICAgIEJFR0lOCisgICAgICAgICNERUxFVEVTIHN3aXRjaF9wb3J0IGVudHJ5IGJlZm9yZSB3cml0aW5nLCBiZWNhdXNlIGlmIG5vdCBpdCBmYWlscyBmb3Iga2V5IGNvbnN0cmFpbnMKKyAgICAgICAgVVBEQVRFIHBvcnRzCisgICAgICAgIFJJR0hUIEpPSU4gcmVzb3VyY2VzX3BvcnQgYXMgUlAgb24gcG9ydHMudXVpZD1SUC5wb3J0X2lkCisgICAgICAgIElOTkVSIEpPSU4gcmVzb3VyY2VzX3BvcnQgYXMgUlAyIG9uIFJQMi5pZD1SUC5yb290X2lkCisgICAgICAgIElOTkVSIEpPSU4gbnVtYXMgb24gUlAubnVtYV9pZD1udW1hcy5pZAorICAgICAgICBJTk5FUiBKT0lOIGhvc3RzIG9uIG51bWFzLmhvc3RfaWQ9aG9zdHMudXVpZAorICAgICAgICBJTk5FUiBKT0lOIG9mX3BvcnRzX3BjaV9jb3JyZXNwb25kZW5jZSBhcyBQQyBvbiBob3N0cy5pcF9uYW1lPVBDLmlwX25hbWUgYW5kIFJQMi5wY2k9UEMucGNpCisgICAgICAgIFNFVCBwb3J0cy5zd2l0Y2hfcG9ydD1udWxsLCBwb3J0cy5zd2l0Y2hfZHBpZD1udWxsLCBSUC5zd2l0Y2hfcG9ydD1udWxsLCBSUC5zd2l0Y2hfZHBpZD1udWxsOworICAgICAgICAjd3JpdGUgc3dpdGNoX3BvcnQgaW50byByZXNvdXJjZXNfcG9ydCBhbmQgcG9ydHMKKyAgICAgICAgVVBEQVRFIHBvcnRzCisgICAgICAgIFJJR0hUIEpPSU4gcmVzb3VyY2VzX3BvcnQgYXMgUlAgb24gcG9ydHMudXVpZD1SUC5wb3J0X2lkCisgICAgICAgIElOTkVSIEpPSU4gcmVzb3VyY2VzX3BvcnQgYXMgUlAyIG9uIFJQMi5pZD1SUC5yb290X2lkCisgICAgICAgIElOTkVSIEpPSU4gbnVtYXMgb24gUlAubnVtYV9pZD1udW1hcy5pZAorICAgICAgICBJTk5FUiBKT0lOIGhvc3RzIG9uIG51bWFzLmhvc3RfaWQ9aG9zdHMudXVpZAorICAgICAgICBJTk5FUiBKT0lOIG9mX3BvcnRzX3BjaV9jb3JyZXNwb25kZW5jZSBhcyBQQyBvbiBob3N0cy5pcF9uYW1lPVBDLmlwX25hbWUgYW5kIFJQMi5wY2k9UEMucGNpCisgICAgICAgIFNFVCBwb3J0cy5zd2l0Y2hfcG9ydD1QQy5zd2l0Y2hfcG9ydCwgcG9ydHMuc3dpdGNoX2RwaWQ9UEMuc3dpdGNoX2RwaWQsIFJQLnN3aXRjaF9wb3J0PVBDLnN3aXRjaF9wb3J0LCBSUC5zd2l0Y2hfZHBpZD1QQy5zd2l0Y2hfZHBpZDsKKyAgICBFTkQvLworICAgIGRlbGltaXRlciA7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIklOU0VSVCBJTlRPIFxgc2NoZW1hX3ZlcnNpb25cYCAoXGB2ZXJzaW9uX2ludFxgLCBcYHZlcnNpb25cYCwgXGBvcGVudmltX3ZlclxgLCBcYGNvbW1lbnRzXGAsIFxgZGF0ZVxgKQorCSBWQUxVRVMgKDIsICcwLjInLCAnMC4yLjAzJywgJ3VwZGF0ZSBQcm9jZWR1cmUgVXBkYXRlU3dpdGNoUG9ydCcsICcyMDE1LTA1LTA2Jyk7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorfQorZnVuY3Rpb24gdXBncmFkZV90b18zKCl7CisgICAgZWNobyAiICAgIHVwZ3JhZGUgZGF0YWJhc2UgZnJvbSB2ZXJzaW9uIDAuMiB0byB2ZXJzaW9uIDAuMyIKKyAgICBlY2hvICIgICAgIGNoYW5nZSBzaXplIG9mIHNvdXJjZV9uYW1lIGF0IHRhYmxlIHJlc291cmNlc19wb3J0IgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIHJlc291cmNlc19wb3J0IENIQU5HRSBDT0xVTU4gc291cmNlX25hbWUgc291cmNlX25hbWUgVkFSQ0hBUigyNCkgTlVMTCBERUZBVUxUIE5VTEwgQUZURVIgcG9ydF9pZDsifCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICIgICAgIENSRUFURSBQUk9DRURVUkUgR2V0QWxsQXZhaWxhYmxlUG9ydHMiCisgICAgZWNobyAiZGVsaW1pdGVyIC8vCisgICAgQ1JFQVRFIFBST0NFRFVSRSBHZXRBbGxBdmFpbGFibGVQb3J0cyhJTiBOdW1hIElOVCkgQ09OVEFJTlMgU1FMIFNRTCBTRUNVUklUWSBJTlZPS0VSCisgICAgQ09NTUVOVCAnT2J0YWluIGFsbCAtaW5jbHVkaW5nIHRob3NlIG5vdCBjb25uZWN0ZWQgdG8gc3dpdGNoIHBvcnQtIHBvcnRzIGF2YWlsYWJsZSBmb3IgYSBudW1hJworICAgIEJFR0lOCisJU0VMRUNUIHBvcnRfaWQsIHBjaSwgTWJwcywgTWJwcyAtIE1icHNfY29uc3VtZWQgYXMgTWJwc19mcmVlLCB0b3RhbFNSSU9WIC0gY29hbGVzY2UodXNlZFNSSU9WLDApIGFzIGF2YWlsYWJsZVNSSU9WLCBzd2l0Y2hfcG9ydCwgbWFjCisJRlJPTQorCSgKKwkgICBTRUxFQ1QgaWQgYXMgcG9ydF9pZCwgTWJwcywgcGNpLCBzd2l0Y2hfcG9ydCwgbWFjCisJICAgRlJPTSByZXNvdXJjZXNfcG9ydCAgCisJCVdIRVJFIG51bWFfaWQgPSBOdW1hIEFORCBpZD1yb290X2lkIEFORCBzdGF0dXMgPSAnb2snIEFORCBpbnN0YW5jZV9pZCBJUyBOVUxMCisJKSBhcyBBCisJSU5ORVIgSk9JTgorCSgKKwkgICBTRUxFQ1Qgcm9vdF9pZCwgc3VtKE1icHNfdXNlZCkgYXMgTWJwc19jb25zdW1lZCwgQ09VTlQoaWQpLTEgYXMgdG90YWxTUklPVgorCQlGUk9NIHJlc291cmNlc19wb3J0ICAKKwkJV0hFUkUgbnVtYV9pZCA9IE51bWEgQU5EIHN0YXR1cyA9ICdvaycKKwkJR1JPVVAgQlkgcm9vdF9pZAorCSkgYXMgQgorCU9OIEEucG9ydF9pZCA9IEIucm9vdF9pZAorCUxFRlQgSk9JTgorCSgKKwkgICBTRUxFQ1Qgcm9vdF9pZCwgIENPVU5UKGlkKSBhcyB1c2VkU1JJT1YKKwkJRlJPTSByZXNvdXJjZXNfcG9ydCAgCisJCVdIRVJFIG51bWFfaWQgPSBOdW1hIEFORCBzdGF0dXMgPSAnb2snIEFORCBpbnN0YW5jZV9pZCBJUyBOT1QgTlVMTAorCQlHUk9VUCBCWSByb290X2lkCisJKSBhcyBDCisJT04gQS5wb3J0X2lkID0gQy5yb290X2lkCisJT1JERVIgQlkgTWJwc19mcmVlLCBhdmFpbGFibGVTUklPViwgcGNpOworICAgIEVORC8vCisgICAgZGVsaW1pdGVyIDsifCAkREJDTUQgfHwgISAgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICJJTlNFUlQgSU5UTyBzY2hlbWFfdmVyc2lvbiAodmVyc2lvbl9pbnQsIHZlcnNpb24sIG9wZW52aW1fdmVyLCBjb21tZW50cywgZGF0ZSkgVkFMVUVTICgzLCAnMC4zJywgJzAuMi41JywgJ05ldyBQcm9jZWR1cmUgR2V0QWxsQXZhaWxhYmxlUG9ydHMnLCAnMjAxNS0wNy0wOScpOyJ8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorfQorCitmdW5jdGlvbiB1cGdyYWRlX3RvXzQoKXsKKyAgICBlY2hvICIgICAgdXBncmFkZSBkYXRhYmFzZSBmcm9tIHZlcnNpb24gMC4zIHRvIHZlcnNpb24gMC40IgorICAgIGVjaG8gIiAgICAgcmVtb3ZlIHVuaXF1ZSBWTEFOIGluZGV4IGF0ICdyZXNvdXJjZXNfcG9ydCcsICdwb3J0cyciCisgICAgZWNobyAiQUxURVIgVEFCTEUgcmVzb3VyY2VzX3BvcnQgRFJPUCBJTkRFWCB2bGFuX3N3aXRjaF9wb3J0OyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICJBTFRFUiBUQUJMRSBwb3J0cyAgICAgICAgICBEUk9QIElOREVYIHZsYW5fc3dpdGNoX3BvcnQ7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIiAgICAgY2hhbmdlIHRhYmxlICdwb3J0cyciCisgICAgZWNobyAiQUxURVIgVEFCTEUgcG9ydHMgQ0hBTkdFIENPTFVNTiBtb2RlbCBtb2RlbCBWQVJDSEFSKDEyKSBOVUxMIERFRkFVTFQgTlVMTCBDT01NRU5UICdkcml2ZXIgbW9kZWwgZm9yIGJyaWRnZSBpZmFjZXM7IFBGLFZGLFZGbm90U2hhcmVkIGZvciBkYXRhIGlmYWNlcycgQUZURVIgbWFjOyJ8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIkFMVEVSIFRBQkxFIHBvcnRzIERST1AgQ09MVU1OIHZsYW5fY2hhbmdlZDsifCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICJBTFRFUiBUQUJMRSByZXNvdXJjZXNfcG9ydCBEUk9QIENPTFVNTiB2bGFuOyJ8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIklOU0VSVCBJTlRPIHNjaGVtYV92ZXJzaW9uICh2ZXJzaW9uX2ludCwgdmVyc2lvbiwgb3BlbnZpbV92ZXIsIGNvbW1lbnRzLCBkYXRlKSBWQUxVRVMgKDQsICcwLjQnLCAnMC4zLjEnLCAnUmVtb3ZlIHVuaXF1ZSBpbmRleCBWTEFOIGF0IHJlc291cmNlc19wb3J0JywgJzIwMTUtMDktMDQnKTsifCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKK30KKworZnVuY3Rpb24gdXBncmFkZV90b19YKCl7CisgICAgI1RPRE8sIHRoaXMgY2hhbmdlIG9mIGZvcmVpZ24ga2V5IGRvZXMgbm90IHdvcmsKKyAgICBlY2hvICIgICAgdXBncmFkZSBkYXRhYmFzZSBmcm9tIHZlcnNpb24gMC5YIHRvIHZlcnNpb24gMC5YIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIGluc3RhbmNlcyBEUk9QIEZPUkVJR04gS0VZIEZLX2luc3RhbmNlc19mbGF2b3JzLCBEUk9QIElOREVYIEZLX2luc3RhbmNlc19mbGF2b3JzLAorICAgICAgICAgIERST1AgRk9SRUlHTiBLRVkgRktfaW5zdGFuY2VzX2ltYWdlcywgRFJPUCBJTkRFWCBGS19pbnN0YW5jZXNfZmxhdm9ycyw7InwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xIAorICAgIGVjaG8gIkFMVEVSIFRBQkxFIGluc3RhbmNlcworCUFERCBDT05TVFJBSU5UIEZLX2luc3RhbmNlc19mbGF2b3JzIEZPUkVJR04gS0VZIChmbGF2b3JfaWQsIHRlbmFudF9pZCkgUkVGRVJFTkNFUyB0ZW5hbnRzX2ZsYXZvcnMgKGZsYXZvcl9pZCwgdGVuYW50X2lkKSwKKwlBREQgQ09OU1RSQUlOVCBGS19pbnN0YW5jZXNfaW1hZ2VzIEZPUkVJR04gS0VZIChpbWFnZV9pZCwgdGVuYW50X2lkKSBSRUZFUkVOQ0VTIHRlbmFudHNfaW1hZ2VzIChpbWFnZV9pZCwgdGVuYW50X2lkKTsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCit9CisKK2Z1bmN0aW9uIGRvd25ncmFkZV9mcm9tXzIoKXsKKyAgICBlY2hvICIgICAgZG93bmdyYWRlIGRhdGFiYXNlIGZyb20gdmVyc2lvbiAwLjIgdG8gdmVyc2lvbiAwLjEiCisgICAgZWNobyAiICAgICAgVVBEQVRFIHByb2NlZHVyZSBVcGRhdGVTd2l0Y2hQb3J0IgorICAgIGVjaG8gIkRST1AgUFJPQ0VEVVJFIElGIEVYSVNUUyBVcGRhdGVTd2l0Y2hQb3J0OworICAgIGRlbGltaXRlciAvLworICAgIENSRUFURSBQUk9DRURVUkUgVXBkYXRlU3dpdGNoUG9ydCgpIE1PRElGSUVTIFNRTCBEQVRBIFNRTCBTRUNVUklUWSBJTlZPS0VSCisgICAgQkVHSU4KKyAgICBVUERBVEUKKyAgICAgICAgcmVzb3VyY2VzX3BvcnQgSU5ORVIgSk9JTiAoCisgICAgICAgICAgICBTRUxFQ1QgcmVzb3VyY2VzX3BvcnQuaWQsS0suc3dpdGNoX3BvcnQKKyAgICAgICAgICAgIEZST00gcmVzb3VyY2VzX3BvcnQgSU5ORVIgSk9JTiBudW1hcyBvbiByZXNvdXJjZXNfcG9ydC5udW1hX2lkPW51bWFzLmlkCisgICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBob3N0cyBvbiBudW1hcy5ob3N0X2lkPWhvc3RzLnV1aWQKKyAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIG9mX3BvcnRzX3BjaV9jb3JyZXNwb25kZW5jZSBhcyBLSyBvbiBob3N0cy5pcF9uYW1lPUtLLmlwX25hbWUgYW5kIHJlc291cmNlc19wb3J0LnBjaT1LSy5wY2kKKyAgICAgICAgICAgICkgYXMgVEFCTEEKKyAgICAgICAgT04gIHJlc291cmNlc19wb3J0LnJvb3RfaWQ9VEFCTEEuaWQKKyAgICBTRVQgcmVzb3VyY2VzX3BvcnQuc3dpdGNoX3BvcnQ9VEFCTEEuc3dpdGNoX3BvcnQKKyAgICBXSEVSRSByZXNvdXJjZXNfcG9ydC5yb290X2lkPVRBQkxBLmlkOworICAgIEVORC8vCisgICAgZGVsaW1pdGVyIDsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAiICAgICAgQUxURVIgVEFCTEUgXGBvZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2VcYCBcYHJlc291cmNlc19wb3J0XGAgXGBwb3J0c1xgIERST1AgQ09MVU1OIFxgc3dpdGNoX2RwaWRcYCIKKyAgICBmb3IgdGFibGUgaW4gb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlbmNlIHJlc291cmNlc19wb3J0IHBvcnRzCisgICAgZG8KKyAgICAgICAgWyAkdGFibGUgPT0gb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlbmNlIF0gfHwKKyAgICAgICAgICAgIGVjaG8gIkFMVEVSIFRBQkxFICR7dGFibGV9IERST1AgSU5ERVggdmxhbl9zd2l0Y2hfcG9ydCwgQUREIFVOSVFVRSBJTkRFWCB2bGFuX3N3aXRjaF9wb3J0ICh2bGFuLCBzd2l0Y2hfcG9ydCk7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgICAgICBlY2hvICJBTFRFUiBUQUJMRSBcYCR7dGFibGV9XGAgRFJPUCBDT0xVTU4gXGBzd2l0Y2hfZHBpZFxgOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICAgICAgc3dpdGNoX3BvcnRfc2l6ZT0xMgorICAgICAgICBbICR0YWJsZSA9PSBvZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2UgXSAmJiBzd2l0Y2hfcG9ydF9zaXplPTUwCisgICAgICAgIGVjaG8gIkFMVEVSIFRBQkxFICR7dGFibGV9IENIQU5HRSBDT0xVTU4gc3dpdGNoX3BvcnQgc3dpdGNoX3BvcnQgVkFSQ0hBUigke3N3aXRjaF9wb3J0X3NpemV9KSBOVUxMIERFRkFVTFQgTlVMTDsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZG9uZQorICAgIGVjaG8gIkRFTEVURSBGUk9NIFxgc2NoZW1hX3ZlcnNpb25cYCBXSEVSRSBcYHZlcnNpb25faW50XGAgPSAnMic7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorfQorZnVuY3Rpb24gZG93bmdyYWRlX2Zyb21fMygpeworICAgIGVjaG8gIiAgICBkb3duZ3JhZGUgZGF0YWJhc2UgZnJvbSB2ZXJzaW9uIDAuMyB0byB2ZXJzaW9uIDAuMiIKKyAgICBlY2hvICIgICAgIGNoYW5nZSBiYWNrIHNpemUgb2Ygc291cmNlX25hbWUgYXQgdGFibGUgcmVzb3VyY2VzX3BvcnQiCisgICAgZWNobyAiQUxURVIgVEFCTEUgcmVzb3VyY2VzX3BvcnQgQ0hBTkdFIENPTFVNTiBzb3VyY2VfbmFtZSBzb3VyY2VfbmFtZSBWQVJDSEFSKDIwKSBOVUxMIERFRkFVTFQgTlVMTCBBRlRFUiBwb3J0X2lkOyJ8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIiAgICAgIERST1AgUFJPQ0VEVVJFIEdldEFsbEF2YWlsYWJsZVBvcnRzIgorICAgIGVjaG8gIkRST1AgUFJPQ0VEVVJFIEdldEFsbEF2YWlsYWJsZVBvcnRzOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICJERUxFVEUgRlJPTSBzY2hlbWFfdmVyc2lvbiBXSEVSRSB2ZXJzaW9uX2ludCA9ICczJzsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCit9CitmdW5jdGlvbiBkb3duZ3JhZGVfZnJvbV80KCl7CisgICAgZWNobyAiICAgIGRvd25ncmFkZSBkYXRhYmFzZSBmcm9tIHZlcnNpb24gMC40IHRvIHZlcnNpb24gMC4zIgorICAgIGVjaG8gIiAgICAgYWRkaW5nIGJhY2sgdW5pcXVlIGluZGV4IFZMQU4gYXQgJ3Jlc291cmNlc19wb3J0JywncG9ydHMnIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIHJlc291cmNlc19wb3J0IEFERCBDT0xVTU4gdmxhbiBTTUFMTElOVCg1KSBVTlNJR05FRCBOVUxMIERFRkFVTFQgTlVMTCAgQUZURVIgTWJwc191c2VkOyJ8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIlVQREFURSByZXNvdXJjZXNfcG9ydCBTRVQgdmxhbj0gOTkraWQtcm9vdF9pZCBXSEVSRSBpZCAhPSByb290X2lkOyJ8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIkFMVEVSIFRBQkxFIHJlc291cmNlc19wb3J0IEFERCBVTklRVUUgSU5ERVggdmxhbl9zd2l0Y2hfcG9ydCAodmxhbiwgc3dpdGNoX3BvcnQsIHN3aXRjaF9kcGlkKTsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAiQUxURVIgVEFCTEUgICAgcG9ydHMgQUREIFVOSVFVRSBJTkRFWCB2bGFuX3N3aXRjaF9wb3J0ICh2bGFuLCBzd2l0Y2hfcG9ydCwgc3dpdGNoX2RwaWQpOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICIgICAgIGNoYW5nZSBiYWNrIHRhYmxlICdwb3J0cyciCisgICAgZWNobyAiQUxURVIgVEFCTEUgcG9ydHMgQ0hBTkdFIENPTFVNTiBtb2RlbCBtb2RlbCBWQVJDSEFSKDEyKSBOVUxMIERFRkFVTFQgTlVMTCBBRlRFUiBtYWM7InwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAiQUxURVIgVEFCTEUgcG9ydHMgQUREIENPTFVNTiB2bGFuX2NoYW5nZWQgU01BTExJTlQoNSkgTlVMTCBERUZBVUxUIE5VTEwgQ09NTUVOVCAnIT1OVUxMIHdoZW4gb3JpZ2luYWwgdmxhbiBoYXZlIGJlZW4gY2hhbmdlZCB0byBtYXRjaCBhIHBtcCBuZXQgd2l0aCBhbGwgcG9ydHMgaW4gdGhlIHNhbWUgdmxhbicgQUZURVIgc3dpdGNoX3BvcnQ7InwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAiREVMRVRFIEZST00gc2NoZW1hX3ZlcnNpb24gV0hFUkUgdmVyc2lvbl9pbnQgPSAnNCc7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorfQorCisKK2Z1bmN0aW9uIHVwZ3JhZGVfdG9fNSgpeworICAgIGVjaG8gIiAgICB1cGdyYWRlIGRhdGFiYXNlIGZyb20gdmVyc2lvbiAwLjQgdG8gdmVyc2lvbiAwLjUiCisgICAgZWNobyAiICAgICBhZGQgJ2lwX2FkZHJlc3MnIHRvIHBvcnRzJyIKKyAgICBlY2hvICJBTFRFUiBUQUJMRSBwb3J0cyBBREQgQ09MVU1OIGlwX2FkZHJlc3MgVkFSQ0hBUig2NCkgTlVMTCBERUZBVUxUIE5VTEwgQUZURVIgbWFjOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICJJTlNFUlQgSU5UTyBzY2hlbWFfdmVyc2lvbiAodmVyc2lvbl9pbnQsIHZlcnNpb24sIG9wZW52aW1fdmVyLCBjb21tZW50cywgZGF0ZSkgVkFMVUVTICg1LCAnMC41JywgJzAuNC4xJywgJ0FkZCBpcF9hZGRyZXNzIHRvIHBvcnRzJywgJzIwMTUtMDktMDQnKTsifCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKK30KK2Z1bmN0aW9uIGRvd25ncmFkZV9mcm9tXzUoKXsKKyAgICBlY2hvICIgICAgZG93bmdyYWRlIGRhdGFiYXNlIGZyb20gdmVyc2lvbiAwLjUgdG8gdmVyc2lvbiAwLjQiCisgICAgZWNobyAiICAgICByZW1vdmluZyAnaXBfYWRkcmVzcycgZnJvbSAncG9ydHMnIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIHBvcnRzIERST1AgQ09MVU1OIGlwX2FkZHJlc3M7InwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAiREVMRVRFIEZST00gc2NoZW1hX3ZlcnNpb24gV0hFUkUgdmVyc2lvbl9pbnQgPSAnNSc7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorfQorCitmdW5jdGlvbiB1cGdyYWRlX3RvXzYoKXsKKyAgICBlY2hvICIgICAgdXBncmFkZSBkYXRhYmFzZSBmcm9tIHZlcnNpb24gMC41IHRvIHZlcnNpb24gMC42IgorICAgIGVjaG8gIiAgICAgIENoYW5nZSBlbmFsYXJnZSBuYW1lLCBkZXNjcmlwdGlvbiB0byAyNTUgYXQgYWxsIGRhdGFiYXNlIgorICAgIGZvciB0YWJsZSBpbiBmbGF2b3JzIGltYWdlcyBpbnN0YW5jZXMgdGVuYW50cworICAgIGRvCisgICAgICAgICBuYW1lX2xlbmd0aD0yNTUKKyAgICAgICAgIFtbICR0YWJsZSA9PSB0ZW5hbnRzIF1dIHx8IG5hbWVfbGVuZ3RoPTY0CisgICAgICAgICBlY2hvIC1lbiAiICAgICAgICAkdGFibGUgICAgICAgICAgICAgICBcciIKKyAgICAgICAgIGVjaG8gIkFMVEVSIFRBQkxFICR0YWJsZSBDSEFOR0UgQ09MVU1OIG5hbWUgbmFtZSBWQVJDSEFSKCRuYW1lX2xlbmd0aCkgTk9UIE5VTEwsIENIQU5HRSBDT0xVTU4gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gVkFSQ0hBUigyNTUpIE5VTEwgREVGQVVMVCBOVUxMOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBkb25lCisgICAgZWNobyAtZW4gIiAgICAgICAgaG9zdHMgICAgICAgICAgICAgICBcciIKKyAgICBlY2hvICJBTFRFUiBUQUJMRSBob3N0cyBDSEFOR0UgQ09MVU1OIG5hbWUgbmFtZSBWQVJDSEFSKDI1NSkgTk9UIE5VTEwsIENIQU5HRSBDT0xVTU4gaXBfbmFtZSBpcF9uYW1lIFZBUkNIQVIoNjQpIE5PVCBOVUxMLCBDSEFOR0UgQ09MVU1OIHVzZXIgdXNlciBWQVJDSEFSKDY0KSBOT1QgTlVMTCwgQ0hBTkdFIENPTFVNTiBwYXNzd29yZCBwYXNzd29yZCBWQVJDSEFSKDY0KSBOVUxMIERFRkFVTFQgTlVMTCwgQ0hBTkdFIENPTFVNTiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBWQVJDSEFSKDI1NSkgTlVMTCBERUZBVUxUIE5VTEwsIENIQU5HRSBDT0xVTU4gZmVhdHVyZXMgZmVhdHVyZXMgVkFSQ0hBUigyNTUpIE5VTEwgREVGQVVMVCBOVUxMOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvIC1lbiAiICAgICAgICBuZXRzICAgICAgICAgICAgICAgIFxyIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIG5ldHMgQ0hBTkdFIENPTFVNTiBuYW1lIG5hbWUgVkFSQ0hBUigyNTUpIE5PVCBOVUxMLCBDSEFOR0UgQ09MVU1OIGxhc3RfZXJyb3IgbGFzdF9lcnJvciBWQVJDSEFSKDI1NSkgTlVMTCBERUZBVUxUIE5VTEwsIENIQU5HRSBDT0xVTU4gYmluZCBiaW5kIFZBUkNIQVIoMzYpIE5VTEwgREVGQVVMVCBOVUxMOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvIC1lbiAiICAgICAgICBpbnN0YW5jZXMgICAgICAgICAgIFxyIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIGluc3RhbmNlcyBDSEFOR0UgQ09MVU1OIGxhc3RfZXJyb3IgbGFzdF9lcnJvciBWQVJDSEFSKDI1NSkgTlVMTCBERUZBVUxUIE5VTEw7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gLWVuICIgICAgICAgIHBvcnRzICAgICAgICAgICAgICAgXHIiCisgICAgZWNobyAiQUxURVIgVEFCTEUgcG9ydHMgQ0hBTkdFIENPTFVNTiBuYW1lIG5hbWUgVkFSQ0hBUig2NCkgTk9UIE5VTEwsIENIQU5HRSBDT0xVTU4gc3dpdGNoX3BvcnQgc3dpdGNoX3BvcnQgVkFSQ0hBUig2NCkgTlVMTCBERUZBVUxUIE5VTEwsIENIQU5HRSBDT0xVTU4gc3dpdGNoX2RwaWQgc3dpdGNoX2RwaWQgVkFSQ0hBUig2NCkgTlVMTCBERUZBVUxUIE5VTEw7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gLWVuICIgICAgICAgIG9mX2Zsb3dzICAgICAgICAgICAgXHIiCisgICAgZWNobyAiQUxURVIgVEFCTEUgb2ZfZmxvd3MgQ0hBTkdFIENPTFVNTiBuYW1lIG5hbWUgVkFSQ0hBUig2NCkgTk9UIE5VTEwsIENIQU5HRSBDT0xVTU4gbmV0X2lkIG5ldF9pZCBWQVJDSEFSKDM2KSBOVUxMIERFRkFVTFQgTlVMTCwgQ0hBTkdFIENPTFVNTiBhY3Rpb25zIGFjdGlvbnMgVkFSQ0hBUigyNTUpIE5VTEwgREVGQVVMVCBOVUxMOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvIC1lbiAiICAgICAgICBvZl9wb3J0c19wY2lfY29yLi4uIFxyIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIG9mX3BvcnRzX3BjaV9jb3JyZXNwb25kZW5jZSBDSEFOR0UgQ09MVU1OIGlwX25hbWUgaXBfbmFtZSBWQVJDSEFSKDY0KSBOVUxMIERFRkFVTFQgTlVMTCwgQ0hBTkdFIENPTFVNTiBzd2l0Y2hfcG9ydCBzd2l0Y2hfcG9ydCBWQVJDSEFSKDY0KSBOVUxMIERFRkFVTFQgTlVMTCwgQ0hBTkdFIENPTFVNTiBzd2l0Y2hfZHBpZCBzd2l0Y2hfZHBpZCBWQVJDSEFSKDY0KSBOVUxMIERFRkFVTFQgTlVMTDsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAtZW4gIiAgICAgICAgcmVzb3VyY2VzX3BvcnQgICAgICBcciIKKyAgICBlY2hvICJBTFRFUiBUQUJMRSByZXNvdXJjZXNfcG9ydCBDSEFOR0UgQ09MVU1OIHNvdXJjZV9uYW1lIHNvdXJjZV9uYW1lIFZBUkNIQVIoNjQpIE5VTEwgREVGQVVMVCBOVUxMLCBDSEFOR0UgQ09MVU1OIHN3aXRjaF9wb3J0IHN3aXRjaF9wb3J0IFZBUkNIQVIoNjQpIE5VTEwgREVGQVVMVCBOVUxMLCBDSEFOR0UgQ09MVU1OIHN3aXRjaF9kcGlkIHN3aXRjaF9kcGlkIFZBUkNIQVIoNjQpIE5VTEwgREVGQVVMVCBOVUxMOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICJJTlNFUlQgSU5UTyBzY2hlbWFfdmVyc2lvbiAodmVyc2lvbl9pbnQsIHZlcnNpb24sIG9wZW52aW1fdmVyLCBjb21tZW50cywgZGF0ZSkgVkFMVUVTICg2LCAnMC42JywgJzAuNC4yJywgJ0VubGFyZ2luZyBuYW1lIGF0IGRhdGFiYXNlJywgJzIwMTYtMDItMDEnKTsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCit9CitmdW5jdGlvbiBkb3duZ3JhZGVfZnJvbV82KCl7CisgICAgZWNobyAiICAgIGRvd25ncmFkZSBkYXRhYmFzZSBmcm9tIHZlcnNpb24gMC42IHRvIHZlcnNpb24gMC41IgorICAgIGVjaG8gIiAgICAgIENoYW5nZSBiYWNrIG5hbWUsZGVzY3JpcHRpb24gdG8gc2hvcnRlciBsZW5ndGggYXQgYWxsIGRhdGFiYXNlIgorICAgIGZvciB0YWJsZSBpbiBmbGF2b3JzIGltYWdlcyBpbnN0YW5jZXMgdGVuYW50cworICAgIGRvCisgICAgICAgICBuYW1lX2xlbmd0aD01MAorICAgICAgICAgW1sgJHRhYmxlID09IGZsYXZvcnMgXV0gfHwgW1sgJHRhYmxlID09IGltYWdlcyBdXSB8fCBuYW1lX2xlbmd0aD0zNiAKKyAgICAgICAgIGVjaG8gLWVuICIgICAgICAgICR0YWJsZSAgICAgICAgICAgICAgIFxyIgorICAgICAgICAgZWNobyAiQUxURVIgVEFCTEUgJHRhYmxlIENIQU5HRSBDT0xVTU4gbmFtZSBuYW1lIFZBUkNIQVIoJG5hbWVfbGVuZ3RoKSBOT1QgTlVMTCwgQ0hBTkdFIENPTFVNTiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBWQVJDSEFSKDEwMCkgTlVMTCBERUZBVUxUIE5VTEw7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGRvbmUKKyAgICBlY2hvIC1lbiAiICAgICAgICBob3N0cyAgICAgICAgICAgICAgIFxyIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIGhvc3RzIENIQU5HRSBDT0xVTU4gbmFtZSBuYW1lIFZBUkNIQVIoMzYpIE5PVCBOVUxMLCBDSEFOR0UgQ09MVU1OIGlwX25hbWUgaXBfbmFtZSBWQVJDSEFSKDM2KSBOT1QgTlVMTCwgQ0hBTkdFIENPTFVNTiB1c2VyIHVzZXIgVkFSQ0hBUigzNikgTk9UIE5VTEwsIENIQU5HRSBDT0xVTU4gcGFzc3dvcmQgcGFzc3dvcmQgVkFSQ0hBUigzNikgTlVMTCBERUZBVUxUIE5VTEwsIENIQU5HRSBDT0xVTU4gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gVkFSQ0hBUigxMDApIE5VTEwgREVGQVVMVCBOVUxMLCBDSEFOR0UgQ09MVU1OIGZlYXR1cmVzIGZlYXR1cmVzIFZBUkNIQVIoNTApIE5VTEwgREVGQVVMVCBOVUxMOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvIC1lbiAiICAgICAgICBuZXRzICAgICAgICAgICAgICAgIFxyIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIG5ldHMgQ0hBTkdFIENPTFVNTiBuYW1lIG5hbWUgVkFSQ0hBUig1MCkgTk9UIE5VTEwsIENIQU5HRSBDT0xVTU4gbGFzdF9lcnJvciBsYXN0X2Vycm9yIFZBUkNIQVIoMjAwKSBOVUxMIERFRkFVTFQgTlVMTCwgQ0hBTkdFIENPTFVNTiBiaW5kIGJpbmQgVkFSQ0hBUigzNikgTlVMTCBERUZBVUxUIE5VTEw7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gLWVuICIgICAgICAgIGluc3RhbmNlcyAgICAgICAgICAgXHIiCisgICAgZWNobyAiQUxURVIgVEFCTEUgaW5zdGFuY2VzIENIQU5HRSBDT0xVTU4gbGFzdF9lcnJvciBsYXN0X2Vycm9yIFZBUkNIQVIoMjAwKSBOVUxMIERFRkFVTFQgTlVMTDsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAtZW4gIiAgICAgICAgcG9ydHMgICAgICAgICAgICAgICBcciIKKyAgICBlY2hvICJBTFRFUiBUQUJMRSBwb3J0cyBDSEFOR0UgQ09MVU1OIG5hbWUgbmFtZSBWQVJDSEFSKDI1KSBOVUxMIERFRkFVTFQgTlVMTCwgQ0hBTkdFIENPTFVNTiBzd2l0Y2hfcG9ydCBzd2l0Y2hfcG9ydCBWQVJDSEFSKDI0KSBOVUxMIERFRkFVTFQgTlVMTCwgQ0hBTkdFIENPTFVNTiBzd2l0Y2hfZHBpZCBzd2l0Y2hfZHBpZCBWQVJDSEFSKDIzKSBOVUxMIERFRkFVTFQgTlVMTDsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAtZW4gIiAgICAgICAgb2ZfZmxvd3MgICAgICAgICAgICBcciIKKyAgICBlY2hvICJBTFRFUiBUQUJMRSBvZl9mbG93cyBDSEFOR0UgQ09MVU1OIG5hbWUgbmFtZSBWQVJDSEFSKDUwKSBOVUxMIERFRkFVTFQgTlVMTCwgQ0hBTkdFIENPTFVNTiBuZXRfaWQgbmV0X2lkIFZBUkNIQVIoNTApIE5VTEwgREVGQVVMVCBOVUxMLCBDSEFOR0UgQ09MVU1OIGFjdGlvbnMgYWN0aW9ucyBWQVJDSEFSKDEwMCkgTlVMTCBERUZBVUxUIE5VTEw7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gLWVuICIgICAgICAgIG9mX3BvcnRzX3BjaV9jb3IuLi4gXHIiCisgICAgZWNobyAiQUxURVIgVEFCTEUgb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlbmNlIENIQU5HRSBDT0xVTU4gaXBfbmFtZSBpcF9uYW1lIFZBUkNIQVIoNTApIE5VTEwgREVGQVVMVCBOVUxMLCBDSEFOR0UgQ09MVU1OIHN3aXRjaF9wb3J0IHN3aXRjaF9wb3J0IFZBUkNIQVIoMjQpIE5VTEwgREVGQVVMVCBOVUxMLCBDSEFOR0UgQ09MVU1OIHN3aXRjaF9kcGlkIHN3aXRjaF9kcGlkIFZBUkNIQVIoMjMpIE5VTEwgREVGQVVMVCBOVUxMOyIgfCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvIC1lbiAiICAgICAgICByZXNvdXJjZXNfcG9ydCAgICAgIFxyIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIHJlc291cmNlc19wb3J0IENIQU5HRSBDT0xVTU4gc291cmNlX25hbWUgc291cmNlX25hbWUgVkFSQ0hBUigyNCkgTlVMTCBERUZBVUxUIE5VTEwsIENIQU5HRSBDT0xVTU4gc3dpdGNoX3BvcnQgc3dpdGNoX3BvcnQgVkFSQ0hBUigyNCkgTlVMTCBERUZBVUxUIE5VTEwsIENIQU5HRSBDT0xVTU4gc3dpdGNoX2RwaWQgc3dpdGNoX2RwaWQgVkFSQ0hBUigyMykgTlVMTCBERUZBVUxUIE5VTEw7IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIkRFTEVURSBGUk9NIHNjaGVtYV92ZXJzaW9uIFdIRVJFIHZlcnNpb25faW50PSc2JzsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCit9CitmdW5jdGlvbiB1cGdyYWRlX3RvXzcoKXsKKyAgICBlY2hvICIgICAgdXBncmFkZSBkYXRhYmFzZSBmcm9tIHZlcnNpb24gMC42IHRvIHZlcnNpb24gMC43IgorICAgIGVjaG8gIiAgICAgYWRkICdiaW5kX25ldCcsJ2JpbmRfdHlwZScsJ2NpZHInLCdlbmFibGVfZGhjcCcgdG8gJ25ldHMnIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIG5ldHMgQUREIENPTFVNTiBjaWRyIFZBUkNIQVIoNjQpIE5VTEwgREVGQVVMVCBOVUxMIEFGVEVSIGJpbmQsIEFERCBDT0xVTU4gZW5hYmxlX2RoY3AgRU5VTSgndHJ1ZScsJ2ZhbHNlJykgTk9UIE5VTEwgREVGQVVMVCAnZmFsc2UnIGFmdGVyIGNpZHIsIEFERCBDT0xVTU4gZGhjcF9maXJzdF9pcCBWQVJDSEFSKDY0KSBOVUxMIERFRkFVTFQgTlVMTCBBRlRFUiBlbmFibGVfZGhjcCwgQUREIENPTFVNTiBkaGNwX2xhc3RfaXAgVkFSQ0hBUig2NCkgTlVMTCBERUZBVUxUIE5VTEwgQUZURVIgZGhjcF9maXJzdF9pcDsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAiQUxURVIgVEFCTEUgbmV0cyBDSEFOR0UgQ09MVU1OIGJpbmQgcHJvdmlkZXIgVkFSQ0hBUigzNikgTlVMTCBERUZBVUxUIE5VTEwgQUZURVIgdmxhbjsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAiQUxURVIgVEFCTEUgbmV0cyBBREQgQ09MVU1OIGJpbmRfbmV0IFZBUkNIQVIoMzYpIE5VTEwgREVGQVVMVCBOVUxMIENPTU1FTlQgJ1RvIGNvbm5lY3Qgd2l0aCBvdGhlciBuZXQnIEFGVEVSIHByb3ZpZGVyLCBBREQgQ09MVU1OIGJpbmRfdHlwZSBWQVJDSEFSKDM2KSAgTlVMTCBERUZBVUxUIE5VTEwgQ09NTUVOVCAnVkxBTjo8dGFnPiB0byBpbnNlcnQvcmVtb3ZlJyBhZnRlciBiaW5kX25ldDsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCisgICAgZWNobyAiSU5TRVJUIElOVE8gc2NoZW1hX3ZlcnNpb24gKHZlcnNpb25faW50LCB2ZXJzaW9uLCBvcGVudmltX3ZlciwgY29tbWVudHMsIGRhdGUpIFZBTFVFUyAoNywgJzAuNycsICcwLjQuNCcsICdBZGQgYmluZF9uZXQgdG8gbmV0IHRhYmxlJywgJzIwMTYtMDItMTInKTsifCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKK30KK2Z1bmN0aW9uIGRvd25ncmFkZV9mcm9tXzcoKXsKKyAgICBlY2hvICIgICAgZG93bmdyYWRlIGRhdGFiYXNlIGZyb20gdmVyc2lvbiAwLjcgdG8gdmVyc2lvbiAwLjYiCisgICAgZWNobyAiICAgICByZW1vdmluZyAnYmluZF9uZXQnLCdiaW5kX3R5cGUnLCdjaWRyJywnZW5hYmxlX2RoY3AnIGZyb20gJ25ldHMnIgorICAgIGVjaG8gIkFMVEVSIFRBQkxFIG5ldHMgQ0hBTkdFIENPTFVNTiBwcm92aWRlciBiaW5kIE5VTEwgREVGQVVMVCBOVUxMIEFGVEVSIHZsYW47IiB8ICREQkNNRCB8fCAhIGVjaG8gIkVSUk9SLiBBYm9ydGVkISIgfHwgZXhpdCAtMQorICAgIGVjaG8gIkFMVEVSIFRBQkxFIG5ldHMgRFJPUCBDT0xVTU4gY2lkciwgRFJPUCBDT0xVTU4gZW5hYmxlX2RoY3AsIERST1AgQ09MVU1OIGJpbmRfbmV0LCBEUk9QIENPTFVNTiBiaW5kX3R5cGUsIERST1AgQ09MVU1OIGRoY3BfZmlyc3RfaXAsIERST1AgQ09MVU1OIGRoY3BfbGFzdF9pcDsifCAkREJDTUQgfHwgISBlY2hvICJFUlJPUi4gQWJvcnRlZCEiIHx8IGV4aXQgLTEKKyAgICBlY2hvICJERUxFVEUgRlJPTSBzY2hlbWFfdmVyc2lvbiBXSEVSRSB2ZXJzaW9uX2ludCA9ICc3JzsiIHwgJERCQ01EIHx8ICEgZWNobyAiRVJST1IuIEFib3J0ZWQhIiB8fCBleGl0IC0xCit9CisjVE9ETyAuLi4gcHV0IGZ1bnRpb25zIGhlcmUKKworCitbICREQVRBQkFTRV9UQVJHRVRfVkVSX05VTSAtZXEgJERBVEFCQVNFX1ZFUl9OVU0gXSAmJiBlY2hvICIgICAgY3VycmVudCBkYXRhYmFzZSB2ZXJzaW9uICREQVRBQkFTRV9WRVIgaXMgb2siCisjVVBHUkFERSBEQVRBQkFTRSBzdGVwIGJ5IHN0ZXAKK3doaWxlIFsgJERBVEFCQVNFX1RBUkdFVF9WRVJfTlVNIC1ndCAkREFUQUJBU0VfVkVSX05VTSBdCitkbworICAgIERBVEFCQVNFX1ZFUl9OVU09JCgoREFUQUJBU0VfVkVSX05VTSsxKSkKKyAgICB1cGdyYWRlX3RvXyR7REFUQUJBU0VfVkVSX05VTX0KKyAgICAjRklMRV89IiR7RElSTkFNRX0vdXBncmFkZV90b18ke0RBVEFCQVNFX1ZFUl9OVU19LnNoIgorICAgICNbICEgLXggIiRGSUxFXyIgXSAmJiBlY2hvICJFcnJvciwgY2FuIG5vdCBmaW5kIHNjcmlwdCAnJEZJTEVfJyB0byB1cGdyYWRlIiA+JjIgJiYgZXhpdCAtMQorICAgICMkRklMRV8gfHwgZXhpdCAtMSAgIyBpZiBmYWlsIHJldHVybgorZG9uZQorCisjRE9XTkdSQURFIERBVEFCQVNFIHN0ZXAgYnkgc3RlcAord2hpbGUgWyAkREFUQUJBU0VfVEFSR0VUX1ZFUl9OVU0gLWx0ICREQVRBQkFTRV9WRVJfTlVNIF0KK2RvCisgICAgI0ZJTEVfPSIke0RJUk5BTUV9L2Rvd25ncmFkZV9mcm9tXyR7REFUQUJBU0VfVkVSX05VTX0uc2giCisgICAgI1sgISAteCAiJEZJTEVfIiBdICYmIGVjaG8gIkVycm9yLCBjYW4gbm90IGZpbmQgc2NyaXB0ICckRklMRV8nIHRvIGRvd25ncmFkZSIgPiYyICYmIGV4aXQgLTEKKyAgICAjJEZJTEVfIHx8IGV4aXQgLTEgICMgaWYgZmFpbCByZXR1cm4KKyAgICBkb3duZ3JhZGVfZnJvbV8ke0RBVEFCQVNFX1ZFUl9OVU19CisgICAgREFUQUJBU0VfVkVSX05VTT0kKChEQVRBQkFTRV9WRVJfTlVNLTEpKQorZG9uZQorCisjZWNobyBkb25lCisKZGlmZiAtLWdpdCBhL2RhdGFiYXNlX3V0aWxzL25ldHMuc3FsIGIvZGF0YWJhc2VfdXRpbHMvbmV0cy5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0ZDBkMQotLS0gL2Rldi9udWxsCisrKyBiL2RhdGFiYXNlX3V0aWxzL25ldHMuc3FsCkBAIC0wLDAgKzEsNzQgQEAKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKy8qCisgICAgVGhpcyB0YWJsZSBjb250YWlucyBhIGxpc3Qgb2YgbmV0d29ya3MgY3JlYXRlZCBmcm9tIHRoZSBiZWdpbmluZworICAgIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBuZWVkZWQKKyAgICAgICAgdXVpZDogcHJvdmlkZSBhIHZhbGlkIHV1aWQgZm9ybWF0CisgICAgICAgIHR5cGU6IHB0cCwgZGF0YSAocG9pbnQgdG8gcG9pbnQsIG9yIHBvaW50IHRvIG11bHRpcG9pbnQpIGFyZSBvcGVuZmxvdyBkYWRhcGxhbmUgbmV0cworICAgICAgICAgICAgICBicmlkZ2VfbWFuLCBicmlkZ2VfZGF0YSBhcmUgdmlydGlvL2JyaWRnZSBjb250cm9scGxhbmUgbmV0cworICAgICAgICBuYW1lOiB1c2VmdWwgaHVtYW4gcmVhZGFibGUgbmFtZQorICAgICAgICBzaGFyZWQ6IGJ5IGRlZmF1bHQgdHJ1ZQorICAgICAgICB2bGFuOiAgZGVmYXVsdCB2bGFuIG9mIHRoZSBkYXRhcGxhbmUgbmV0CisgICAgICAgIGJpbmQ6IGZvciBjb250cm9sIHBsYW5lOgorICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmYXVsdCBuZXR3b3JrCisgICAgICAgICAgICAgICAgICBtYWN2dGFwOmhvc3RfaWZhY2UuIENvbm5lY3QgdG8gYSBkaXJlY3QgbWFjdnRhcCBob3N0IGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgYnJpZGdlOmJyaWRnZV9uYW1lLiBDb25uZWN0IHRvIHRoaXMgaG9zdCBicmlkZ2VfbmFtZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgZm9yIGRhdGFwbGFuZTogTlVMTCwgYmVjYXVzZSB0aGUgYmluZGluZyBpcyBkb25lIHdpdGggYSBleHRlcm5hbCBwb3J0CisqLworCisKK0xPQ0sgVEFCTEVTIGBuZXRzYCBXUklURTsKKy8qCitJTlNFUlQgSU5UTyBgbmV0c2AKKyAgKHV1aWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB0eXBlYCwgICAgICAgbmFtZSwgICAgICAgIHNoYXJlZCwgdmxhbiwgYmluZCkKK1ZBTFVFUworICAoJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcsJ2JyaWRnZV9tYW4nLCAnZGVmYXVsdCcsICAgJ3RydWUnLCBOVUxMLCAnZGVmYXVsdCcpLAorICAoJzExMTExMTExLTExMTEtMTExMS0xMTExLTExMTExMTExMTExMScsJ2JyaWRnZV9tYW4nLCAnZGlyZWN0OmVtMScsJ3RydWUnLCBOVUxMLCAnbWFjdnRhcDplbTEnKSwKKyAgKCdhYWFhYWFhYS0xMTExLWFhYWEtYWFhYS1hYWFhYWFhYWFhYWEnLCdkYXRhJywgICAgICAgJ2NvcmVJUHY0JywgICd0cnVlJywgNzAyLCAgTlVMTCksCisgICgnYWFhYWFhYWEtYWFhYS0wMDAwLTExMTEtYWFhYWFhYWFhYWFhJywnYnJpZGdlX2RhdGEnLCd2aXJick1hbjInLCAndHJ1ZScsIDIwMDIsICdicmlkZ2U6dmlyYnJNYW4yJykgICMgbGFzdCByb3cgd2l0aG91dCAnLCcKKzsKKyovCisKK1VOTE9DSyBUQUJMRVM7CisKKy8qICBFeHRlcm5hbCBQT1JUUyBhcmUgbmVjZXNzYXJ5IHRvIGNvbm5lY3QgYSBkYXRhcGxhbmUgbmV0d29yayB0byBhbiBleHRlcm5hbCBzd2l0Y2ggcG9ydAorICAgIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBuZWVkZWQKKyAgICAgICAgdXVpZDogcHJvdmlkZSBhIHZhbGlkIHV1aWQgZm9ybWF0CisgICAgICAgIG5hbWU6IHVzZWZ1bCBodW1hbiByZWFkYWJsZSBuYW1lCisgICAgICAgIG5ldF9pZDogdXVpZCBvZiB0aGUgbmV0IHdoZXJlIHRoaXMgcG9ydCBtdXN0IGJlIGNvbm5lY3RlZAorICAgICAgICBNYnBzOiBvbmx5IGluZm9ybWF0aXZlLCBpbmRpY2F0ZXMgdGhlIGV4cGVjdGVkIGJhbmR3aWR0aCBpbiBtZWdhYml0cy9zCisgICAgICAgIHR5cGU6IG9ubHkgZXh0ZXJuYWwgaGFzIG1lYW5pbmcgaGVyZQorICAgICAgICB2bGFuOiBpZiB0aGUgdHJhZmZpYyBhdCB0aGF0IHBvcnQgbXVzdCBiZSB2bGFuIHRhZ2dlZAorICAgICAgICBzd2l0Y2hfcG9ydDogcG9ydCBuYW1lIGF0IHN3aXRjaDoKKyovCisKK0xPQ0sgVEFCTEVTIGBwb3J0c2AgV1JJVEU7CisvKgorSU5TRVJUIElOVE8gYHBvcnRzYCAKKyAgKHV1aWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsICAgICAgICBuZXRfaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYnBzLCB0eXBlLCAgICAgIHZsYW4sIHN3aXRjaF9wb3J0KQorVkFMVUVTCisgICgnNmQ1MzZhODAtNTJlOS0xMWU0LTllMzEtNTI1NDAwNmQ2Nzc3JywnQ29yZUlQdjQnLCAgJ2FhYWFhYWFhLTExMTEtYWFhYS1hYWFhLWFhYWFhYWFhYWFhYScsMTAwMDAsJ2V4dGVybmFsJyw3MDIsICAnVGUwLzQ3JykgIyBsYXN0IHJvdyB3aXRob3V0ICcsJworOworKi8KKworVU5MT0NLIFRBQkxFUzsKKwpkaWZmIC0tZ2l0IGEvZGF0YWJhc2VfdXRpbHMvb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlbmNlLnNxbCBiL2RhdGFiYXNlX3V0aWxzL29mX3BvcnRzX3BjaV9jb3JyZXNwb25kZW5jZS5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlhYTg0NgotLS0gL2Rldi9udWxsCisrKyBiL2RhdGFiYXNlX3V0aWxzL29mX3BvcnRzX3BjaV9jb3JyZXNwb25kZW5jZS5zcWwKQEAgLTAsMCArMSw3NiBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworLyoKKyAgIFJFQUQgVEhJUyBwbGVhc2U6CisgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBtYXRjaGluZyBiZXR3ZWVuIGRhdGFwbGFuZSBob3N0IHBvcnRzIAorICAgYW5kIG9wZW5mbG93IHN3aXRjaCBwb3J0cy4gCisgICBUaGUgdHdvIGZpcnN0IGNvbHVtbiBpZGVudGlmaWVzIHRoZSBob3N0IGFuZCB0aGUgcGNpIGJ1cworICAgICAgIGNvbW1hbmQgZXRodG9vbCAtaSBwcm92aWRlcyB0aGUgcGNpIGJ1cyBwb3J0IChhdCBob3N0KQorICAgICAgIGNvbW1hbmQgZXRodG9vbCAtcCBtYWtlcyB0aGlzIHBvcnQgYmxpbmtpbmcgKGF0IGhvc3QpCisgICBMYXN0IGNvbHVtbiBpZGVudGlmaWVzIHRoZSBzd2l0Y2ggcG9ydCBuYW1lCisgICAgICAgb3BlbnZpbSBwcmludHMgYXQgc3RhcnRpbmcgdGhlIG9wZW5mbG93IHBvcnRzIG5hbWluZyAKKyAgIE5PVEU6IGlmIGEgaG9zdCBoYXMgYWxyZWFkeSBiZWVuIGluc2VydGVkLCB5b3UgbXVzdCBleGVjdXRlIAorICAgVXBkYXRlU3dpdGNoUG9ydCBkYXRhYmFzZSBwcm9jZWR1cmUgdG8gYXNzb2NpYXRlIHBvcnRzIHdpdGggCisgICB0aGUgc3dpdGNoIGNvbm5lY3Rpb24KKyovCisKK0xPQ0sgVEFCTEVTIGBvZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2VgIFdSSVRFOworCisvKiBEQVRBIGZvciBmYWtlaG9zdCBleGFtcGxlcyovCitJTlNFUlQgSU5UTyBgb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlbmNlYCAKKyAgICAoaXBfbmFtZSwgcGNpLCBzd2l0Y2hfcG9ydCkKK1ZBTFVFUworICAgICgnZmFrZS1ob3N0LTAnLCAnMDAwMDowNjowMC4wJywgJ3BvcnQwLzAnKSwKKyAgICAoJ2Zha2UtaG9zdC0wJywgJzAwMDA6MDY6MDAuMScsICdwb3J0MC8xJyksCisgICAgKCdmYWtlLWhvc3QtMCcsICcwMDAwOjA4OjAwLjAnLCAncG9ydDAvMicpLAorICAgICgnZmFrZS1ob3N0LTAnLCAnMDAwMDowODowMC4xJywgJ3BvcnQwLzMnKSwKKworICAgICgnZmFrZS1ob3N0LTEnLCAnMDAwMDo0NDowMC4wJywgJ3BvcnQwLzQnKSwKKyAgICAoJ2Zha2UtaG9zdC0xJywgJzAwMDA6NDQ6MDAuMScsICdwb3J0MC81JyksCisgICAgKCdmYWtlLWhvc3QtMScsICcwMDAwOjQzOjAwLjAnLCAncG9ydDAvNicpLAorICAgICgnZmFrZS1ob3N0LTEnLCAnMDAwMDo0MzowMC4xJywgJ3BvcnQwLzcnKSwKKyAgICAoJ2Zha2UtaG9zdC0xJywgJzAwMDA6MDQ6MDAuMCcsICdwb3J0MC84JyksCisgICAgKCdmYWtlLWhvc3QtMScsICcwMDAwOjA0OjAwLjEnLCAncG9ydDAvOScpLAorICAgICgnZmFrZS1ob3N0LTEnLCAnMDAwMDowNjowMC4wJywgJ3BvcnQwLzEwJyksCisgICAgKCdmYWtlLWhvc3QtMScsICcwMDAwOjA2OjAwLjEnLCAncG9ydDAvMTEnKSwKKworICAgICgnZmFrZS1ob3N0LTInLCAnMDAwMDo0NDowMC4wJywgJ3BvcnQwLzEyJyksCisgICAgKCdmYWtlLWhvc3QtMicsICcwMDAwOjQ0OjAwLjEnLCAncG9ydDAvMTMnKSwKKyAgICAoJ2Zha2UtaG9zdC0yJywgJzAwMDA6NDM6MDAuMCcsICdwb3J0MC8xNCcpLAorICAgICgnZmFrZS1ob3N0LTInLCAnMDAwMDo0MzowMC4xJywgJ3BvcnQwLzE1JyksCisgICAgKCdmYWtlLWhvc3QtMicsICcwMDAwOjA0OjAwLjAnLCAncG9ydDAvMTYnKSwKKyAgICAoJ2Zha2UtaG9zdC0yJywgJzAwMDA6MDQ6MDAuMScsICdwb3J0MC8xNycpLAorICAgICgnZmFrZS1ob3N0LTInLCAnMDAwMDowNjowMC4wJywgJ3BvcnQwLzE4JyksCisgICAgKCdmYWtlLWhvc3QtMicsICcwMDAwOjA2OjAwLjEnLCAncG9ydDAvMTknKSwKKworICAgICgnZmFrZS1ob3N0LTMnLCAnMDAwMDo0NDowMC4wJywgJ3BvcnQxLzAnKSwKKyAgICAoJ2Zha2UtaG9zdC0zJywgJzAwMDA6NDQ6MDAuMScsICdwb3J0MS8xJyksCisgICAgKCdmYWtlLWhvc3QtMycsICcwMDAwOjQzOjAwLjAnLCAncG9ydDEvMicpLAorICAgICgnZmFrZS1ob3N0LTMnLCAnMDAwMDo0MzowMC4xJywgJ3BvcnQxLzMnKSwKKyAgICAoJ2Zha2UtaG9zdC0zJywgJzAwMDA6MDQ6MDAuMCcsICdwb3J0MS80JyksCisgICAgKCdmYWtlLWhvc3QtMycsICcwMDAwOjA0OjAwLjEnLCAncG9ydDEvNScpLAorICAgICgnZmFrZS1ob3N0LTMnLCAnMDAwMDowNjowMC4wJywgJ3BvcnQxLzYnKSwKKyAgICAoJ2Zha2UtaG9zdC0zJywgJzAwMDA6MDY6MDAuMScsICdwb3J0MS83JykKKzsKKworCitVTkxPQ0sgVEFCTEVTOwpkaWZmIC0tZ2l0IGEvZGF0YWJhc2VfdXRpbHMvdmltX2RiX3N0cnVjdHVyZS5zcWwgYi9kYXRhYmFzZV91dGlscy92aW1fZGJfc3RydWN0dXJlLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk5MTcxCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YWJhc2VfdXRpbHMvdmltX2RiX3N0cnVjdHVyZS5zcWwKQEAgLTAsMCArMSw5NjIgQEAKKy8qKgorKiBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorKiBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorKiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyoKKyogRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorKiBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisqKi8KKworLS0gTXlTUUwgZHVtcCAxMC4xMyAgRGlzdHJpYiA1LjUuNDMsIGZvciBkZWJpYW4tbGludXgtZ251ICh4ODZfNjQpCistLQorLS0gSG9zdDogbG9jYWxob3N0ICAgIERhdGFiYXNlOiB2aW1fZGIKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gU2VydmVyIHZlcnNpb24JNS41LjQzLTB1YnVudHUwLjE0LjA0LjEKKworLyohNDAxMDEgU0VUIEBPTERfQ0hBUkFDVEVSX1NFVF9DTElFTlQ9QEBDSEFSQUNURVJfU0VUX0NMSUVOVCAqLzsKKy8qITQwMTAxIFNFVCBAT0xEX0NIQVJBQ1RFUl9TRVRfUkVTVUxUUz1AQENIQVJBQ1RFUl9TRVRfUkVTVUxUUyAqLzsKKy8qITQwMTAxIFNFVCBAT0xEX0NPTExBVElPTl9DT05ORUNUSU9OPUBAQ09MTEFUSU9OX0NPTk5FQ1RJT04gKi87CisvKiE0MDEwMSBTRVQgTkFNRVMgdXRmOCAqLzsKKy8qITQwMTAzIFNFVCBAT0xEX1RJTUVfWk9ORT1AQFRJTUVfWk9ORSAqLzsKKy8qITQwMTAzIFNFVCBUSU1FX1pPTkU9JyswMDowMCcgKi87CisvKiE0MDAxNCBTRVQgQE9MRF9VTklRVUVfQ0hFQ0tTPUBAVU5JUVVFX0NIRUNLUywgVU5JUVVFX0NIRUNLUz0wICovOworLyohNDAwMTQgU0VUIEBPTERfRk9SRUlHTl9LRVlfQ0hFQ0tTPUBARk9SRUlHTl9LRVlfQ0hFQ0tTLCBGT1JFSUdOX0tFWV9DSEVDS1M9MCAqLzsKKy8qITQwMTAxIFNFVCBAT0xEX1NRTF9NT0RFPUBAU1FMX01PREUsIFNRTF9NT0RFPSdOT19BVVRPX1ZBTFVFX09OX1pFUk8nICovOworLyohNDAxMTEgU0VUIEBPTERfU1FMX05PVEVTPUBAU1FMX05PVEVTLCBTUUxfTk9URVM9MCAqLzsKKworLS0KKy0tIEN1cnJlbnQgRGF0YWJhc2U6IGB2aW1fZGJgCistLQorCisvKiE0MDAwMCBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBgdmltX2RiYCovOworCitDUkVBVEUgREFUQUJBU0UgLyohMzIzMTIgSUYgTk9UIEVYSVNUUyovIGB2aW1fZGJgIC8qITQwMTAwIERFRkFVTFQgQ0hBUkFDVEVSIFNFVCB1dGY4ICovOworCitVU0UgYHZpbV9kYmA7CisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGBmbGF2b3JzYAorLS0KKworRFJPUCBUQUJMRSBJRiBFWElTVFMgYGZsYXZvcnNgOworLyohNDAxMDEgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IHV0ZjggKi87CitDUkVBVEUgVEFCTEUgYGZsYXZvcnNgICgKKyAgYHV1aWRgIHZhcmNoYXIoMzYpIE5PVCBOVUxMLAorICBgbmFtZWAgdmFyY2hhcig2NCkgTk9UIE5VTEwsCisgIGBkZXNjcmlwdGlvbmAgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwKKyAgYGRpc2tgIHNtYWxsaW50KDUpIHVuc2lnbmVkIERFRkFVTFQgTlVMTCwKKyAgYHJhbWAgc21hbGxpbnQoNSkgdW5zaWduZWQgREVGQVVMVCBOVUxMLAorICBgdmNwdXNgIHNtYWxsaW50KDUpIHVuc2lnbmVkIERFRkFVTFQgTlVMTCwKKyAgYGV4dGVuZGVkYCB2YXJjaGFyKDIwMDApIERFRkFVTFQgTlVMTCBDT01NRU5UICdFeHRyYSBkZXNjcmlwdGlvbiB5YW1sIGZvcm1hdCBvZiBuZWVkZWQgcmVzb3VyY2VzIGFuZCBwaW5pbmcsIG9yZ2luaXplZCBpbiBzZXRzIHBlciBudW1hJywKKyAgYHB1YmxpY2AgZW51bSgneWVzJywnbm8nKSBOT1QgTlVMTCBERUZBVUxUICdubycsCisgIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgTk9UIE5VTEwgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwKKyAgUFJJTUFSWSBLRVkgKGB1dWlkYCkKKykgRU5HSU5FPUlubm9EQiBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT01NRU5UPSdmbGF2b3JzIHdpdGggZXh0cmEgdm5mY2QgaW5mbyc7CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSBAc2F2ZWRfY3NfY2xpZW50ICovOworCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgaG9zdF9yYW5raW5nYAorLS0KKworRFJPUCBUQUJMRSBJRiBFWElTVFMgYGhvc3RfcmFua2luZ2A7CisvKiE0MDEwMSBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gdXRmOCAqLzsKK0NSRUFURSBUQUJMRSBgaG9zdF9yYW5raW5nYCAoCisgIGBpZGAgaW50KDEwKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKKyAgYGZhbWlseWAgdmFyY2hhcig1MCkgTk9UIE5VTEwsCisgIGBtYW51ZmFjdHVyZXJgIHZhcmNoYXIoNTApIE5PVCBOVUxMLAorICBgdmVyc2lvbmAgdmFyY2hhcig1MCkgTk9UIE5VTEwsCisgIGBkZXNjcmlwdGlvbmAgdmFyY2hhcig1MCkgREVGQVVMVCBOVUxMLAorICBgcmFua2luZ2Agc21hbGxpbnQoNCkgdW5zaWduZWQgTk9UIE5VTEwsCisgIFBSSU1BUlkgS0VZIChgaWRgKSwKKyAgVU5JUVVFIEtFWSBgZmFtaWx5X21hbnVmYWN0dXJlcl92ZXJzaW9uYCAoYGZhbWlseWAsYG1hbnVmYWN0dXJlcmAsYHZlcnNpb25gKQorKSBFTkdJTkU9SW5ub0RCIERFRkFVTFQgQ0hBUlNFVD11dGY4OworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gQHNhdmVkX2NzX2NsaWVudCAqLzsKKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGhvc3RzYAorLS0KKworRFJPUCBUQUJMRSBJRiBFWElTVFMgYGhvc3RzYDsKKy8qITQwMTAxIFNFVCBAc2F2ZWRfY3NfY2xpZW50ICAgICA9IEBAY2hhcmFjdGVyX3NldF9jbGllbnQgKi87CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSB1dGY4ICovOworQ1JFQVRFIFRBQkxFIGBob3N0c2AgKAorICBgdXVpZGAgdmFyY2hhcigzNikgTk9UIE5VTEwsCisgIGBuYW1lYCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwsCisgIGBpcF9uYW1lYCB2YXJjaGFyKDY0KSBOT1QgTlVMTCwKKyAgYGRlc2NyaXB0aW9uYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLAorICBgc3RhdHVzYCBlbnVtKCdvaycsJ2Vycm9yJywnbm90dXNlZCcpIE5PVCBOVUxMIERFRkFVTFQgJ29rJywKKyAgYHJhbmtpbmdgIHNtYWxsaW50KDYpIE5PVCBOVUxMIERFRkFVTFQgJzAnLAorICBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIE5PVCBOVUxMIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCisgIGBmZWF0dXJlc2AgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwKKyAgYHVzZXJgIHZhcmNoYXIoNjQpIE5PVCBOVUxMLAorICBgcGFzc3dvcmRgIHZhcmNoYXIoNjQpIERFRkFVTFQgTlVMTCwKKyAgYGFkbWluX3N0YXRlX3VwYCBlbnVtKCd0cnVlJywnZmFsc2UnKSBOT1QgTlVMTCBERUZBVUxUICd0cnVlJywKKyAgYFJBTWAgbWVkaXVtaW50KDgpIHVuc2lnbmVkIE5PVCBOVUxMIERFRkFVTFQgJzAnIENPTU1FTlQgJ0hvc3QgbWVtb3J5IGluIE1CIG5vdCB1c2VkIGFzIGh1Z2VwYWdlcycsCisgIGBjcHVzYCBzbWFsbGludCg1KSB1bnNpZ25lZCBOT1QgTlVMTCBERUZBVUxUICcwJyBDT01NRU5UICdIb3N0IHRocmVhZHMob3IgY29yZXMpIG5vdCBpc29sYXRlZCBmcm9tIE9TJywKKyAgUFJJTUFSWSBLRVkgKGB1dWlkYCksCisgIFVOSVFVRSBLRVkgYGlwX25hbWVgIChgaXBfbmFtZWApCispIEVOR0lORT1Jbm5vREIgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09NTUVOVD0naG9zdHMgaW5mb3JtYXRpb24nOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gQHNhdmVkX2NzX2NsaWVudCAqLzsKKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGltYWdlc2AKKy0tCisKK0RST1AgVEFCTEUgSUYgRVhJU1RTIGBpbWFnZXNgOworLyohNDAxMDEgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IHV0ZjggKi87CitDUkVBVEUgVEFCTEUgYGltYWdlc2AgKAorICBgdXVpZGAgdmFyY2hhcigzNikgTk9UIE5VTEwsCisgIGBwYXRoYCB2YXJjaGFyKDEwMCkgTk9UIE5VTEwsCisgIGBuYW1lYCB2YXJjaGFyKDY0KSBOT1QgTlVMTCwKKyAgYGRlc2NyaXB0aW9uYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLAorICBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIE5PVCBOVUxMIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCisgIGBtb2RpZmllZF9hdGAgdGltZXN0YW1wIE5VTEwgREVGQVVMVCBOVUxMLAorICBgcHVibGljYCBlbnVtKCd5ZXMnLCdubycpIE5PVCBOVUxMIERFRkFVTFQgJ25vJywKKyAgYHByb2dyZXNzYCB0aW55aW50KDMpIHVuc2lnbmVkIE5PVCBOVUxMIERFRkFVTFQgJzEwMCcsCisgIGBzdGF0dXNgIGVudW0oJ0FDVElWRScsJ0RPV04nLCdCVUlMRCcsJ0VSUk9SJykgTk9UIE5VTEwgREVGQVVMVCAnQUNUSVZFJywKKyAgYG1ldGFkYXRhYCB2YXJjaGFyKDIwMDApIERFRkFVTFQgTlVMTCBDT01NRU5UICdNZXRhdGRhdGEgaW4ganNvbiB0ZXh0IGZvcm1hdCcsCisgIFBSSU1BUlkgS0VZIChgdXVpZGApLAorICBVTklRVUUgS0VZIGBwYXRoYCAoYHBhdGhgKQorKSBFTkdJTkU9SW5ub0RCIERFRkFVTFQgQ0hBUlNFVD11dGY4OworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gQHNhdmVkX2NzX2NsaWVudCAqLzsKKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGluc3RhbmNlX2RldmljZXNgCistLQorCitEUk9QIFRBQkxFIElGIEVYSVNUUyBgaW5zdGFuY2VfZGV2aWNlc2A7CisvKiE0MDEwMSBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gdXRmOCAqLzsKK0NSRUFURSBUQUJMRSBgaW5zdGFuY2VfZGV2aWNlc2AgKAorICBgaWRgIGludCgxMSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsCisgIGB0eXBlYCBlbnVtKCd1c2InLCdkaXNrJywnY2Ryb20nLCd4bWwnKSBOT1QgTlVMTCwKKyAgYHhtbGAgdmFyY2hhcigxMDAwKSBERUZBVUxUIE5VTEwgQ09NTUVOVCAnbGlidmlydCBYTUwgZm9ybWF0IGZvciBhZGl0aW9uYWwgZGV2aWNlJywKKyAgYGluc3RhbmNlX2lkYCB2YXJjaGFyKDM2KSBOT1QgTlVMTCwKKyAgYGltYWdlX2lkYCB2YXJjaGFyKDM2KSBERUZBVUxUIE5VTEwgQ09NTUVOVCAnVXNlZCBpbiBjYXNlIHR5cGUgaXMgZGlzaycsCisgIGB2cGNpYCBjaGFyKDEyKSBERUZBVUxUIE5VTEwgQ09NTUVOVCAnZm9ybWF0IFhYWFg6WFg6WFguWCcsCisgIGBkZXZgIHZhcmNoYXIoMTIpIERFRkFVTFQgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGBpZGApLAorICBLRVkgYEZLX2luc3RhbmNlX2RldmljZXNfaW5zdGFuY2VzYCAoYGluc3RhbmNlX2lkYCksCisgIEtFWSBgRktfaW5zdGFuY2VfZGV2aWNlc19pbWFnZXNgIChgaW1hZ2VfaWRgKSwKKyAgQ09OU1RSQUlOVCBgRktfaW5zdGFuY2VfZGV2aWNlc19pbWFnZXNgIEZPUkVJR04gS0VZIChgaW1hZ2VfaWRgKSBSRUZFUkVOQ0VTIGB0ZW5hbnRzX2ltYWdlc2AgKGBpbWFnZV9pZGApLAorICBDT05TVFJBSU5UIGBGS19pbnN0YW5jZV9kZXZpY2VzX2luc3RhbmNlc2AgRk9SRUlHTiBLRVkgKGBpbnN0YW5jZV9pZGApIFJFRkVSRU5DRVMgYGluc3RhbmNlc2AgKGB1dWlkYCkgT04gREVMRVRFIENBU0NBREUKKykgRU5HSU5FPUlubm9EQiAgREVGQVVMVCBDSEFSU0VUPXV0Zjg7CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSBAc2F2ZWRfY3NfY2xpZW50ICovOworCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgaW5zdGFuY2VzYAorLS0KKworRFJPUCBUQUJMRSBJRiBFWElTVFMgYGluc3RhbmNlc2A7CisvKiE0MDEwMSBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gdXRmOCAqLzsKK0NSRUFURSBUQUJMRSBgaW5zdGFuY2VzYCAoCisgIGB1dWlkYCB2YXJjaGFyKDM2KSBOT1QgTlVMTCwKKyAgYGZsYXZvcl9pZGAgdmFyY2hhcigzNikgTk9UIE5VTEwsCisgIGBpbWFnZV9pZGAgdmFyY2hhcigzNikgTk9UIE5VTEwsCisgIGBuYW1lYCB2YXJjaGFyKDY0KSBOT1QgTlVMTCwKKyAgYGRlc2NyaXB0aW9uYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLAorICBgbGFzdF9lcnJvcmAgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwKKyAgYHByb2dyZXNzYCB0aW55aW50KDMpIHVuc2lnbmVkIE5PVCBOVUxMIERFRkFVTFQgJzAnLAorICBgdGVuYW50X2lkYCB2YXJjaGFyKDM2KSBOT1QgTlVMTCwKKyAgYHN0YXR1c2AgZW51bSgnQUNUSVZFJywnUEFVU0VEJywnSU5BQ1RJVkUnLCdDUkVBVElORycsJ0VSUk9SJywnREVMRVRJTkcnKSBOT1QgTlVMTCBERUZBVUxUICdBQ1RJVkUnLAorICBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIE5PVCBOVUxMIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCisgIGBtb2RpZmllZF9hdGAgdGltZXN0YW1wIE5VTEwgREVGQVVMVCBOVUxMLAorICBgaG9zdF9pZGAgdmFyY2hhcigzNikgTk9UIE5VTEwgQ09NTUVOVCAnSE9TVCB3aGVyZSBpcyBhbGxvY2F0ZWQnLAorICBgcmFtYCBtZWRpdW1pbnQoOCkgdW5zaWduZWQgTk9UIE5VTEwgREVGQVVMVCAnMCcgQ09NTUVOVCAndXNlZCBub24taHVnZXBhZ2VzIG1lbW9yeSBpbiBNQicsCisgIGB2Y3B1c2Agc21hbGxpbnQoNSkgdW5zaWduZWQgTk9UIE5VTEwgREVGQVVMVCAnMCcgQ09NTUVOVCAndXNlZCBub24taXNvbGF0ZWQgQ1BVcycsCisgIFBSSU1BUlkgS0VZIChgdXVpZGApLAorICBLRVkgYEZLX2luc3RhbmNlc190ZW5hbnRzYCAoYHRlbmFudF9pZGApLAorICBLRVkgYEZLX2luc3RhbmNlc19mbGF2b3JzYCAoYGZsYXZvcl9pZGApLAorICBLRVkgYEZLX2luc3RhbmNlc19pbWFnZXNgIChgaW1hZ2VfaWRgKSwKKyAgS0VZIGBGS19pbnN0YW5jZXNfaG9zdHNgIChgaG9zdF9pZGApLAorICBDT05TVFJBSU5UIGBGS19pbnN0YW5jZXNfZmxhdm9yc2AgRk9SRUlHTiBLRVkgKGBmbGF2b3JfaWRgKSBSRUZFUkVOQ0VTIGB0ZW5hbnRzX2ZsYXZvcnNgIChgZmxhdm9yX2lkYCksCisgIENPTlNUUkFJTlQgYEZLX2luc3RhbmNlc19ob3N0c2AgRk9SRUlHTiBLRVkgKGBob3N0X2lkYCkgUkVGRVJFTkNFUyBgaG9zdHNgIChgdXVpZGApLAorICBDT05TVFJBSU5UIGBGS19pbnN0YW5jZXNfaW1hZ2VzYCBGT1JFSUdOIEtFWSAoYGltYWdlX2lkYCkgUkVGRVJFTkNFUyBgdGVuYW50c19pbWFnZXNgIChgaW1hZ2VfaWRgKSwKKyAgQ09OU1RSQUlOVCBgRktfaW5zdGFuY2VzX3RlbmFudHNgIEZPUkVJR04gS0VZIChgdGVuYW50X2lkYCkgUkVGRVJFTkNFUyBgdGVuYW50c2AgKGB1dWlkYCkKKykgRU5HSU5FPUlubm9EQiBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT01NRU5UPSdWTSBpbnN0YW5jZXMnOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gQHNhdmVkX2NzX2NsaWVudCAqLzsKKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGxvZ3NgCistLQorCitEUk9QIFRBQkxFIElGIEVYSVNUUyBgbG9nc2A7CisvKiE0MDEwMSBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gdXRmOCAqLzsKK0NSRUFURSBUQUJMRSBgbG9nc2AgKAorICBgaWRgIGludCgxMCkgdW5zaWduZWQgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsCisgIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgTk9UIE5VTEwgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwKKyAgYHRlbmFudF9pZGAgdmFyY2hhcigzNikgREVGQVVMVCBOVUxMLAorICBgcmVsYXRlZGAgZW51bSgnaG9zdHMnLCdpbWFnZXMnLCdmbGF2b3JzJywndGVuYW50cycsJ3BvcnRzJywnaW5zdGFuY2VzJywnbmV0cycpIERFRkFVTFQgTlVMTCwKKyAgYHV1aWRgIHZhcmNoYXIoMzYpIERFRkFVTFQgTlVMTCBDT01NRU5UICd1dWlkIG9mIGhvc3QsIGltYWdlLCBldGMgdGhhdCBsb2cgcmVsYXRlcyB0bycsCisgIGBsZXZlbGAgZW51bSgncGFuaWMnLCdlcnJvcicsJ2luZm8nLCdkZWJ1ZycsJ3ZlcmJvc2UnKSBOT1QgTlVMTCwKKyAgYGRlc2NyaXB0aW9uYCB2YXJjaGFyKDIwMCkgTk9UIE5VTEwsCisgIFBSSU1BUlkgS0VZIChgaWRgKQorKSBFTkdJTkU9SW5ub0RCICBERUZBVUxUIENIQVJTRVQ9dXRmODsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IEBzYXZlZF9jc19jbGllbnQgKi87CisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGBuZXRzYAorLS0KKworRFJPUCBUQUJMRSBJRiBFWElTVFMgYG5ldHNgOworLyohNDAxMDEgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IHV0ZjggKi87CitDUkVBVEUgVEFCTEUgYG5ldHNgICgKKyAgYHV1aWRgIHZhcmNoYXIoMzYpIE5PVCBOVUxMLAorICBgdGVuYW50X2lkYCB2YXJjaGFyKDM2KSBERUZBVUxUIE5VTEwsCisgIGB0eXBlYCBlbnVtKCdwdHAnLCdkYXRhJywnYnJpZGdlX2RhdGEnLCdicmlkZ2VfbWFuJykgTk9UIE5VTEwgREVGQVVMVCAnYnJpZGdlX21hbicsCisgIGBzdGF0dXNgIGVudW0oJ0FDVElWRScsJ0RPV04nLCdCVUlMRCcsJ0VSUk9SJykgTk9UIE5VTEwgREVGQVVMVCAnQUNUSVZFJywKKyAgYGxhc3RfZXJyb3JgIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsCisgIGBuYW1lYCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwsCisgIGBzaGFyZWRgIGVudW0oJ3RydWUnLCdmYWxzZScpIE5PVCBOVUxMIERFRkFVTFQgJ2ZhbHNlJywKKyAgYGFkbWluX3N0YXRlX3VwYCBlbnVtKCd0cnVlJywnZmFsc2UnKSBOT1QgTlVMTCBERUZBVUxUICd0cnVlJywKKyAgYHZsYW5gIHNtYWxsaW50KDYpIERFRkFVTFQgTlVMTCwKKyAgYHByb3ZpZGVyYCB2YXJjaGFyKDM2KSBERUZBVUxUIE5VTEwsCisgIGBiaW5kX25ldGAgdmFyY2hhcigzNikgREVGQVVMVCBOVUxMIENPTU1FTlQgJ1RvIGNvbm5lY3Qgd2l0aCBvdGhlciBuZXQnLAorICBgYmluZF90eXBlYCB2YXJjaGFyKDM2KSBERUZBVUxUIE5VTEwgQ09NTUVOVCAnVkxBTjo8dGFnPiB0byBpbnNlcnQvcmVtb3ZlJywKKyAgYGNpZHJgIHZhcmNoYXIoNjQpIERFRkFVTFQgTlVMTCwKKyAgYGVuYWJsZV9kaGNwYCBlbnVtKCd0cnVlJywnZmFsc2UnKSBOT1QgTlVMTCBERUZBVUxUICdmYWxzZScsCisgIGBkaGNwX2ZpcnN0X2lwYCB2YXJjaGFyKDY0KSBERUZBVUxUIE5VTEwsCisgIGBkaGNwX2xhc3RfaXBgIHZhcmNoYXIoNjQpIERFRkFVTFQgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGB1dWlkYCksCisgIFVOSVFVRSBLRVkgYHR5cGVfdmxhbmAgKGB0eXBlYCxgdmxhbmApLAorICBVTklRVUUgS0VZIGBwaHlzaWNhbGAgKGBwcm92aWRlcmApLAorICBLRVkgYEZLX25ldHNfdGVuYW50c2AgKGB0ZW5hbnRfaWRgKSwKKyAgQ09OU1RSQUlOVCBgRktfbmV0c190ZW5hbnRzYCBGT1JFSUdOIEtFWSAoYHRlbmFudF9pZGApIFJFRkVSRU5DRVMgYHRlbmFudHNgIChgdXVpZGApCispIEVOR0lORT1Jbm5vREIgREVGQVVMVCBDSEFSU0VUPXV0Zjg7CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSBAc2F2ZWRfY3NfY2xpZW50ICovOworCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgbnVtYXNgCistLQorCitEUk9QIFRBQkxFIElGIEVYSVNUUyBgbnVtYXNgOworLyohNDAxMDEgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IHV0ZjggKi87CitDUkVBVEUgVEFCTEUgYG51bWFzYCAoCisgIGBpZGAgaW50KDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKKyAgYGhvc3RfaWRgIHZhcmNoYXIoMzYpIE5PVCBOVUxMLAorICBgbnVtYV9zb2NrZXRgIHRpbnlpbnQoMykgdW5zaWduZWQgTk9UIE5VTEwgREVGQVVMVCAnMCcsCisgIGBodWdlcGFnZXNgIHNtYWxsaW50KDUpIHVuc2lnbmVkIE5PVCBOVUxMIERFRkFVTFQgJzAnIENPTU1FTlQgJ0F2YWlsYWJsZSBtZW1vcnkgZm9yIGd1ZXN0IGluIEdCJywKKyAgYHN0YXR1c2AgZW51bSgnb2snLCdlcnJvcicsJ25vdHVzZWQnKSBOT1QgTlVMTCBERUZBVUxUICdvaycsCisgIGBtZW1vcnlgIHNtYWxsaW50KDUpIHVuc2lnbmVkIE5PVCBOVUxMIERFRkFVTFQgJzAnIENPTU1FTlQgJ3RvdGFsIG1lbXJ5IGluIEdCLCBub3QgYWxsIGF2YWlsYWJsZSBmb3IgZ3Vlc3RzJywKKyAgYGFkbWluX3N0YXRlX3VwYCBlbnVtKCd0cnVlJywnZmFsc2UnKSBOT1QgTlVMTCBERUZBVUxUICd0cnVlJywKKyAgUFJJTUFSWSBLRVkgKGBpZGApLAorICBLRVkgYEZLX251bWFzX2hvc3RzYCAoYGhvc3RfaWRgKSwKKyAgQ09OU1RSQUlOVCBgRktfbnVtYXNfaG9zdHNgIEZPUkVJR04gS0VZIChgaG9zdF9pZGApIFJFRkVSRU5DRVMgYGhvc3RzYCAoYHV1aWRgKSBPTiBERUxFVEUgQ0FTQ0FERSBPTiBVUERBVEUgQ0FTQ0FERQorKSBFTkdJTkU9SW5ub0RCICBERUZBVUxUIENIQVJTRVQ9dXRmODsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IEBzYXZlZF9jc19jbGllbnQgKi87CisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGBvZl9mbG93c2AKKy0tCisKK0RST1AgVEFCTEUgSUYgRVhJU1RTIGBvZl9mbG93c2A7CisvKiE0MDEwMSBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gdXRmOCAqLzsKK0NSRUFURSBUQUJMRSBgb2ZfZmxvd3NgICgKKyAgYGlkYCBpbnQoMTApIHVuc2lnbmVkIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgbmFtZWAgdmFyY2hhcig2NCkgTk9UIE5VTEwsCisgIGBuZXRfaWRgIHZhcmNoYXIoMzYpIERFRkFVTFQgTlVMTCwKKyAgYHByaW9yaXR5YCBpbnQoMTApIHVuc2lnbmVkIERFRkFVTFQgTlVMTCwKKyAgYHZsYW5faWRgIHNtYWxsaW50KDUpIHVuc2lnbmVkIERFRkFVTFQgTlVMTCwKKyAgYGluZ3Jlc3NfcG9ydGAgdmFyY2hhcigxMCkgREVGQVVMVCBOVUxMLAorICBgc3JjX21hY2AgdmFyY2hhcig1MCkgREVGQVVMVCBOVUxMLAorICBgZHN0X21hY2AgdmFyY2hhcig1MCkgREVGQVVMVCBOVUxMLAorICBgYWN0aW9uc2AgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGBpZGApLAorICBVTklRVUUgS0VZIGBuYW1lYCAoYG5hbWVgKSwKKyAgS0VZIGBGS19vZl9mbG93c19uZXRzYCAoYG5ldF9pZGApLAorICBDT05TVFJBSU5UIGBGS19vZl9mbG93c19uZXRzYCBGT1JFSUdOIEtFWSAoYG5ldF9pZGApIFJFRkVSRU5DRVMgYG5ldHNgIChgdXVpZGApIE9OIERFTEVURSBTRVQgTlVMTCBPTiBVUERBVEUgQ0FTQ0FERQorKSBFTkdJTkU9SW5ub0RCICBERUZBVUxUIENIQVJTRVQ9dXRmODsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IEBzYXZlZF9jc19jbGllbnQgKi87CisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGBvZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2VgCistLQorCitEUk9QIFRBQkxFIElGIEVYSVNUUyBgb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlbmNlYDsKKy8qITQwMTAxIFNFVCBAc2F2ZWRfY3NfY2xpZW50ICAgICA9IEBAY2hhcmFjdGVyX3NldF9jbGllbnQgKi87CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSB1dGY4ICovOworQ1JFQVRFIFRBQkxFIGBvZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2VgICgKKyAgYGlkYCBpbnQoMTApIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgaXBfbmFtZWAgdmFyY2hhcig2NCkgREVGQVVMVCBOVUxMLAorICBgcGNpYCB2YXJjaGFyKDUwKSBERUZBVUxUIE5VTEwsCisgIGBzd2l0Y2hfcG9ydGAgdmFyY2hhcig2NCkgREVGQVVMVCBOVUxMLAorICBgc3dpdGNoX2RwaWRgIHZhcmNoYXIoNjQpIERFRkFVTFQgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGBpZGApCispIEVOR0lORT1Jbm5vREIgIERFRkFVTFQgQ0hBUlNFVD11dGY4OworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gQHNhdmVkX2NzX2NsaWVudCAqLzsKKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYHBvcnRzYAorLS0KKworRFJPUCBUQUJMRSBJRiBFWElTVFMgYHBvcnRzYDsKKy8qITQwMTAxIFNFVCBAc2F2ZWRfY3NfY2xpZW50ICAgICA9IEBAY2hhcmFjdGVyX3NldF9jbGllbnQgKi87CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSB1dGY4ICovOworQ1JFQVRFIFRBQkxFIGBwb3J0c2AgKAorICBgdXVpZGAgdmFyY2hhcigzNikgTk9UIE5VTEwsCisgIGBuYW1lYCB2YXJjaGFyKDY0KSBOT1QgTlVMTCwKKyAgYGluc3RhbmNlX2lkYCB2YXJjaGFyKDM2KSBERUZBVUxUIE5VTEwsCisgIGB0ZW5hbnRfaWRgIHZhcmNoYXIoMzYpIERFRkFVTFQgTlVMTCwKKyAgYG5ldF9pZGAgdmFyY2hhcigzNikgREVGQVVMVCBOVUxMLAorICBgdnBjaWAgY2hhcigxMikgREVGQVVMVCBOVUxMLAorICBgTWJwc2AgbWVkaXVtaW50KDgpIHVuc2lnbmVkIERFRkFVTFQgTlVMTCBDT01NRU5UICdJbiBNYml0cy9zJywKKyAgYGFkbWluX3N0YXRlX3VwYCBlbnVtKCd0cnVlJywnZmFsc2UnKSBOT1QgTlVMTCBERUZBVUxUICd0cnVlJywKKyAgYHN0YXR1c2AgZW51bSgnQUNUSVZFJywnRE9XTicsJ0JVSUxEJywnRVJST1InKSBOT1QgTlVMTCBERUZBVUxUICdBQ1RJVkUnLAorICBgdHlwZWAgZW51bSgnaW5zdGFuY2U6YnJpZGdlJywnaW5zdGFuY2U6ZGF0YScsJ2V4dGVybmFsJykgTk9UIE5VTEwgREVGQVVMVCAnaW5zdGFuY2U6YnJpZGdlJywKKyAgYHZsYW5gIHNtYWxsaW50KDUpIERFRkFVTFQgTlVMTCBDT01NRU5UICd2bGFuIG9mIHRoaXMgU1JJT1YsIG9yIGV4dGVybmFsIHBvcnQnLAorICBgc3dpdGNoX3BvcnRgIHZhcmNoYXIoNjQpIERFRkFVTFQgTlVMTCwKKyAgYHN3aXRjaF9kcGlkYCB2YXJjaGFyKDY0KSBERUZBVUxUIE5VTEwsCisgIGBtYWNgIGNoYXIoMTgpIERFRkFVTFQgTlVMTCBDT01NRU5UICdtYWMgYWRkcmVzcyBmb3JtYXQgWFg6WFg6WFg6WFg6WFg6WFgnLAorICBgaXBfYWRkcmVzc2AgdmFyY2hhcig2NCkgREVGQVVMVCBOVUxMLAorICBgbW9kZWxgIHZhcmNoYXIoMTIpIERFRkFVTFQgTlVMTCBDT01NRU5UICdkcml2ZXIgbW9kZWwgZm9yIGJyaWRnZSBpZmFjZXM7IFBGLFZGLFZGbm90U2hhcmVkIGZvciBkYXRhIGlmYWNlcycsCisgIFBSSU1BUlkgS0VZIChgdXVpZGApLAorICBVTklRVUUgS0VZIGBtYWNgIChgbWFjYCksCisgIEtFWSBgRktfaW5zdGFuY2VfaWZhY2VzX2luc3RhbmNlc2AgKGBpbnN0YW5jZV9pZGApLAorICBLRVkgYEZLX2luc3RhbmNlX2lmYWNlc19uZXRzYCAoYG5ldF9pZGApLAorICBLRVkgYEZLX3BvcnRzX3RlbmFudHNgIChgdGVuYW50X2lkYCksCisgIENPTlNUUkFJTlQgYEZLX2luc3RhbmNlX2lmYWNlc19uZXRzYCBGT1JFSUdOIEtFWSAoYG5ldF9pZGApIFJFRkVSRU5DRVMgYG5ldHNgIChgdXVpZGApLAorICBDT05TVFJBSU5UIGBGS19wb3J0c19pbnN0YW5jZXNgIEZPUkVJR04gS0VZIChgaW5zdGFuY2VfaWRgKSBSRUZFUkVOQ0VTIGBpbnN0YW5jZXNgIChgdXVpZGApIE9OIERFTEVURSBDQVNDQURFIE9OIFVQREFURSBDQVNDQURFLAorICBDT05TVFJBSU5UIGBGS19wb3J0c190ZW5hbnRzYCBGT1JFSUdOIEtFWSAoYHRlbmFudF9pZGApIFJFRkVSRU5DRVMgYHRlbmFudHNgIChgdXVpZGApCispIEVOR0lORT1Jbm5vREIgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09NTUVOVD0nQnJpZGdlIGludGVyZmFjZXMgdXNlZCBieSBpbnN0YW5jZXMnOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gQHNhdmVkX2NzX2NsaWVudCAqLzsKKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYHJlc291cmNlc19jb3JlYAorLS0KKworRFJPUCBUQUJMRSBJRiBFWElTVFMgYHJlc291cmNlc19jb3JlYDsKKy8qITQwMTAxIFNFVCBAc2F2ZWRfY3NfY2xpZW50ICAgICA9IEBAY2hhcmFjdGVyX3NldF9jbGllbnQgKi87CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSB1dGY4ICovOworQ1JFQVRFIFRBQkxFIGByZXNvdXJjZXNfY29yZWAgKAorICBgaWRgIGludCgxMSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsCisgIGBudW1hX2lkYCBpbnQoMTEpIERFRkFVTFQgTlVMTCwKKyAgYGNvcmVfaWRgIHNtYWxsaW50KDUpIHVuc2lnbmVkIE5PVCBOVUxMLAorICBgdGhyZWFkX2lkYCBzbWFsbGludCg1KSB1bnNpZ25lZCBOT1QgTlVMTCwKKyAgYGluc3RhbmNlX2lkYCB2YXJjaGFyKDM2KSBERUZBVUxUIE5VTEwgQ09NTUVOVCAnaW5zdGFuY2UgdGhhdCBjb25zdW1lIHRoaXMgcmVzb3VyY2UnLAorICBgdl90aHJlYWRfaWRgIHNtYWxsaW50KDYpIERFRkFVTFQgTlVMTCBDT01NRU5UICduYW1lIHVzZWQgYnkgdmlydHVhbCBtYWNoaW5lOyAtMSBpZiB0aGlzIHRocmVhZCBpcyBub3QgdXNlZCBiZWNhdXNlIGNvcmUgaXMgYXNpZ25lZCBjb21wbGV0ZWx5JywKKyAgYHN0YXR1c2AgZW51bSgnb2snLCdlcnJvcicsJ25vdHVzZWQnLCdub3RlbGlnaWJsZScpIE5PVCBOVUxMIERFRkFVTFQgJ29rJyBDT01NRU5UICcnJ2Vycm9yJyc6IHJlc291cmNlIG5vdCBhdmFpbGFibGUgYmVjYXN1ZSBhbiBlcnJvciBhdCBkZXBsb3ltZW50OyAnJ25vdHVzZWQnJzogYWRtaW4gbWFya2VkIGFzIG5vdCBhdmFpbGFibGUsICcnbm90ZWxpZ2libGUnJzogdXNlZCBieSBob3N0IGFuZCBub3QgYXZhaWxhYmxlIGZvciBndWVzdHMnLAorICBgcGFpcmVkYCBlbnVtKCdZJywnTicpIE5PVCBOVUxMIERFRkFVTFQgJ04nLAorICBQUklNQVJZIEtFWSAoYGlkYCksCisgIEtFWSBgRktfcmVzb3VyY2VzX2NvcmVfaW5zdGFuY2VzYCAoYGluc3RhbmNlX2lkYCksCisgIEtFWSBgRktfcmVzb3VyY2VzX2NvcmVfbnVtYXNgIChgbnVtYV9pZGApLAorICBDT05TVFJBSU5UIGBGS19yZXNvdXJjZXNfY29yZV9pbnN0YW5jZXNgIEZPUkVJR04gS0VZIChgaW5zdGFuY2VfaWRgKSBSRUZFUkVOQ0VTIGBpbnN0YW5jZXNgIChgdXVpZGApLAorICBDT05TVFJBSU5UIGBGS19yZXNvdXJjZXNfY29yZV9udW1hc2AgRk9SRUlHTiBLRVkgKGBudW1hX2lkYCkgUkVGRVJFTkNFUyBgbnVtYXNgIChgaWRgKSBPTiBERUxFVEUgQ0FTQ0FERSBPTiBVUERBVEUgQ0FTQ0FERQorKSBFTkdJTkU9SW5ub0RCICBERUZBVUxUIENIQVJTRVQ9dXRmOCBDT01NRU5UPSdDb250YWluIGFuIGVudHJ5IGJ5IHRocmVhZCAodHdvIGVudHJpZXMgcGVyIGNvcmUpIG9mIGFsbCBhdmFpbGFibGUgY29yZXMuIFRocmV5IHdpbGwgYmUgZnJlZSBpZiBpbnN0YW5jZV9pZCBpcyBOVUxMJzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IEBzYXZlZF9jc19jbGllbnQgKi87CisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGByZXNvdXJjZXNfbWVtYAorLS0KKworRFJPUCBUQUJMRSBJRiBFWElTVFMgYHJlc291cmNlc19tZW1gOworLyohNDAxMDEgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IHV0ZjggKi87CitDUkVBVEUgVEFCTEUgYHJlc291cmNlc19tZW1gICgKKyAgYGlkYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgbnVtYV9pZGAgaW50KDExKSBOT1QgTlVMTCBERUZBVUxUICcwJywKKyAgYGluc3RhbmNlX2lkYCB2YXJjaGFyKDM2KSBERUZBVUxUICcwJyBDT01NRU5UICdOVUxMIGlzIGFsbG93ZWQgaW4gb3JkZXIgdG8gYWxsb3cgc29tZSBtZW1vcnkgbm90IHVzZWQnLAorICBgY29uc3VtZWRgIGludCgzKSB1bnNpZ25lZCBOT1QgTlVMTCBERUZBVUxUICcwJyBDT01NRU5UICdJbiBHQicsCisgIFBSSU1BUlkgS0VZIChgaWRgKSwKKyAgS0VZIGBGS19yZXNvdXJjZXNfbWVtX2luc3RhbmNlc2AgKGBpbnN0YW5jZV9pZGApLAorICBLRVkgYEZLX3Jlc291cmNlc19tZW1fbnVtYXNgIChgbnVtYV9pZGApLAorICBDT05TVFJBSU5UIGBGS19yZXNvdXJjZXNfbWVtX2luc3RhbmNlc2AgRk9SRUlHTiBLRVkgKGBpbnN0YW5jZV9pZGApIFJFRkVSRU5DRVMgYGluc3RhbmNlc2AgKGB1dWlkYCkgT04gREVMRVRFIENBU0NBREUsCisgIENPTlNUUkFJTlQgYEZLX3Jlc291cmNlc19tZW1fbnVtYXNgIEZPUkVJR04gS0VZIChgbnVtYV9pZGApIFJFRkVSRU5DRVMgYG51bWFzYCAoYGlkYCkgT04gVVBEQVRFIENBU0NBREUKKykgRU5HSU5FPUlubm9EQiAgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09NTUVOVD0nSW5jbHVkZSB0aGUgaHVnZXBhZ2VzIG1lbW9yeSB1c2VkIGJ5IG9uZSBpbnN0YW5jZSAoVk0pIGluIG9uZSBob3N0IE5VTUEuJzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IEBzYXZlZF9jc19jbGllbnQgKi87CisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGByZXNvdXJjZXNfcG9ydGAKKy0tCisKK0RST1AgVEFCTEUgSUYgRVhJU1RTIGByZXNvdXJjZXNfcG9ydGA7CisvKiE0MDEwMSBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gdXRmOCAqLzsKK0NSRUFURSBUQUJMRSBgcmVzb3VyY2VzX3BvcnRgICgKKyAgYGlkYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgbnVtYV9pZGAgaW50KDExKSBOT1QgTlVMTCBERUZBVUxUICcwJywKKyAgYGluc3RhbmNlX2lkYCB2YXJjaGFyKDM2KSBERUZBVUxUIE5VTEwgQ09NTUVOVCAnQ29udGFpbiBpbnN0YW5jZSB0aGF0IHVzZSB0aGlzIHJlc291cmNlIGNvbXBsZXRlbHkuIE5VTEwgaWYgdGhpcyByZXNvdXJjZSBpcyBmcmVlIG9yIHBhcnRpYWxseSB1c2VkIChyZXNvdXJjZXNfcG9ydF9TUklPViknLAorICBgcG9ydF9pZGAgdmFyY2hhcigzNikgREVGQVVMVCBOVUxMIENPTU1FTlQgJ1doZW4gcmVzb3VyY2UgaXMgdXNlZCwgdGhpcyBwb2ludCB0byB0aGUgcG9ydHMgdGFibGUnLAorICBgc291cmNlX25hbWVgIHZhcmNoYXIoNjQpIERFRkFVTFQgTlVMTCwKKyAgYHBjaWAgY2hhcigxMikgTk9UIE5VTEwgREVGQVVMVCAnMCcgQ09NTUVOVCAnSG9zdCBwaHlzaWNhbCBwY2kgYnVzLiBGb3JtYXQgWFhYWDpYWDpYWC5YJywKKyAgYE1icHNgIHNtYWxsaW50KDUpIHVuc2lnbmVkIERFRkFVTFQgJzEwJyBDT01NRU5UICdOb21pbmFsIFBvcnQgc3BlZWQgJywKKyAgYHJvb3RfaWRgIGludCgxMSkgREVGQVVMVCBOVUxMIENPTU1FTlQgJ05VTEwgZm9yIHBoeXNpY2FsIHBvcnQgZW50cmllczsgPWlkIGZvciBTUklPViBwb3J0JywKKyAgYHN0YXR1c2AgZW51bSgnb2snLCdlcnJvcicsJ25vdHVzZWQnKSBOT1QgTlVMTCBERUZBVUxUICdvaycsCisgIGBNYnBzX3VzZWRgIHNtYWxsaW50KDUpIHVuc2lnbmVkIE5PVCBOVUxMIERFRkFVTFQgJzAnIENPTU1FTlQgJ1NwZWVkIGJhbmR3aWR0aCB1c2VkIHdoZW4gYXNpZ25lZCcsCisgIGBzd2l0Y2hfcG9ydGAgdmFyY2hhcig2NCkgREVGQVVMVCBOVUxMLAorICBgc3dpdGNoX2RwaWRgIHZhcmNoYXIoNjQpIERFRkFVTFQgTlVMTCwKKyAgYG1hY2AgY2hhcigxOCkgREVGQVVMVCBOVUxMIENPTU1FTlQgJ21hYyBhZGRyZXNzIGZvcm1hdCBYWDpYWDpYWDpYWDpYWDpYWCcsCisgIFBSSU1BUlkgS0VZIChgaWRgKSwKKyAgVU5JUVVFIEtFWSBgbWFjYCAoYG1hY2ApLAorICBVTklRVUUgS0VZIGBwb3J0X2lkYCAoYHBvcnRfaWRgKSwKKyAgS0VZIGBGS19yZXNvdXJjZXNfcG9ydF9udW1hc2AgKGBudW1hX2lkYCksCisgIEtFWSBgRktfcmVzb3VyY2VzX3BvcnRfaW5zdGFuY2VzYCAoYGluc3RhbmNlX2lkYCksCisgIENPTlNUUkFJTlQgYEZLX3Jlc291cmNlc19wb3J0X2luc3RhbmNlc2AgRk9SRUlHTiBLRVkgKGBpbnN0YW5jZV9pZGApIFJFRkVSRU5DRVMgYGluc3RhbmNlc2AgKGB1dWlkYCksCisgIENPTlNUUkFJTlQgYEZLX3Jlc291cmNlc19wb3J0X251bWFzYCBGT1JFSUdOIEtFWSAoYG51bWFfaWRgKSBSRUZFUkVOQ0VTIGBudW1hc2AgKGBpZGApIE9OIERFTEVURSBDQVNDQURFIE9OIFVQREFURSBDQVNDQURFLAorICBDT05TVFJBSU5UIGBGS19yZXNvdXJjZXNfcG9ydF9wb3J0c2AgRk9SRUlHTiBLRVkgKGBwb3J0X2lkYCkgUkVGRVJFTkNFUyBgcG9ydHNgIChgdXVpZGApIE9OIERFTEVURSBDQVNDQURFIE9OIFVQREFURSBDQVNDQURFCispIEVOR0lORT1Jbm5vREIgIERFRkFVTFQgQ0hBUlNFVD11dGY4IENPTU1FTlQ9J0NvbnRhaW4gTklDIHBvcnRzIFNSSU9WIGFuZCBhdmFpbGFiZXMsIGFuZCBjdXJyZW50IHVzZS4gRXZlcnkgcG9ydCBjb250YWluIHNldmVyYWwgZW50cmllcywgb25lIHBlciBwb3J0IChyb290X2lkPU5VTEwpIGFuZCBhbGwgcG9zaWJsZSBTUklPViAocm9vdF9pZD1pZCBvZiBwb3J0KSc7CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSBAc2F2ZWRfY3NfY2xpZW50ICovOworCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgc2NoZW1hX3ZlcnNpb25gCistLQorCitEUk9QIFRBQkxFIElGIEVYSVNUUyBgc2NoZW1hX3ZlcnNpb25gOworLyohNDAxMDEgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IHV0ZjggKi87CitDUkVBVEUgVEFCTEUgYHNjaGVtYV92ZXJzaW9uYCAoCisgIGB2ZXJzaW9uX2ludGAgaW50KDExKSBOT1QgTlVMTCBDT01NRU5UICd2ZXJzaW9uIGFzIGEgbnVtYmVyLiBNdXN0IG5vdCBjb250YWluIGdhcHMnLAorICBgdmVyc2lvbmAgdmFyY2hhcigyMCkgTk9UIE5VTEwgQ09NTUVOVCAndmVyc2lvbiBhcyBhIHRleHQnLAorICBgb3BlbnZpbV92ZXJgIHZhcmNoYXIoMjApIE5PVCBOVUxMIENPTU1FTlQgJ29wZW52aW0gdmVyc2lvbicsCisgIGBjb21tZW50c2AgdmFyY2hhcigyMDAwKSBERUZBVUxUIE5VTEwgQ09NTUVOVCAnY2hhbmdlcyB0byBkYXRhYmFzZScsCisgIGBkYXRlYCBkYXRlIERFRkFVTFQgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGB2ZXJzaW9uX2ludGApCispIEVOR0lORT1Jbm5vREIgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09NTUVOVD0nZGF0YWJhc2Ugc2NoZW1hIGNvbnRyb2wgdmVyc2lvbic7CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSBAc2F2ZWRfY3NfY2xpZW50ICovOworCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgdGVuYW50c2AKKy0tCisKK0RST1AgVEFCTEUgSUYgRVhJU1RTIGB0ZW5hbnRzYDsKKy8qITQwMTAxIFNFVCBAc2F2ZWRfY3NfY2xpZW50ICAgICA9IEBAY2hhcmFjdGVyX3NldF9jbGllbnQgKi87CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSB1dGY4ICovOworQ1JFQVRFIFRBQkxFIGB0ZW5hbnRzYCAoCisgIGB1dWlkYCB2YXJjaGFyKDM2KSBOT1QgTlVMTCwKKyAgYG5hbWVgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwKKyAgYGRlc2NyaXB0aW9uYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLAorICBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIE5PVCBOVUxMIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCisgIGBlbmFibGVkYCBlbnVtKCd0cnVlJywnZmFsc2UnKSBOT1QgTlVMTCBERUZBVUxUICd0cnVlJywKKyAgUFJJTUFSWSBLRVkgKGB1dWlkYCksCisgIFVOSVFVRSBLRVkgYG5hbWVgIChgbmFtZWApCispIEVOR0lORT1Jbm5vREIgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09NTUVOVD0ndGVuYW50cyBpbmZvcm1hdGlvbic7CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSBAc2F2ZWRfY3NfY2xpZW50ICovOworCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgdGVuYW50c19mbGF2b3JzYAorLS0KKworRFJPUCBUQUJMRSBJRiBFWElTVFMgYHRlbmFudHNfZmxhdm9yc2A7CisvKiE0MDEwMSBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gdXRmOCAqLzsKK0NSRUFURSBUQUJMRSBgdGVuYW50c19mbGF2b3JzYCAoCisgIGBpZGAgaW50KDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKKyAgYGZsYXZvcl9pZGAgdmFyY2hhcigzNikgTk9UIE5VTEwsCisgIGB0ZW5hbnRfaWRgIHZhcmNoYXIoMzYpIE5PVCBOVUxMLAorICBQUklNQVJZIEtFWSAoYGlkYCksCisgIEtFWSBgRktfX3RlbmFudHNgIChgdGVuYW50X2lkYCksCisgIEtFWSBgRktfX2ZsYXZvcnNgIChgZmxhdm9yX2lkYCksCisgIENPTlNUUkFJTlQgYEZLX19mbGF2b3JzYCBGT1JFSUdOIEtFWSAoYGZsYXZvcl9pZGApIFJFRkVSRU5DRVMgYGZsYXZvcnNgIChgdXVpZGApLAorICBDT05TVFJBSU5UIGBGS19fdGVuYW50c2AgRk9SRUlHTiBLRVkgKGB0ZW5hbnRfaWRgKSBSRUZFUkVOQ0VTIGB0ZW5hbnRzYCAoYHV1aWRgKSBPTiBERUxFVEUgQ0FTQ0FERSBPTiBVUERBVEUgQ0FTQ0FERQorKSBFTkdJTkU9SW5ub0RCICBERUZBVUxUIENIQVJTRVQ9dXRmODsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IEBzYXZlZF9jc19jbGllbnQgKi87CisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGB0ZW5hbnRzX2ltYWdlc2AKKy0tCisKK0RST1AgVEFCTEUgSUYgRVhJU1RTIGB0ZW5hbnRzX2ltYWdlc2A7CisvKiE0MDEwMSBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovOworLyohNDAxMDEgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ID0gdXRmOCAqLzsKK0NSRUFURSBUQUJMRSBgdGVuYW50c19pbWFnZXNgICgKKyAgYGlkYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgaW1hZ2VfaWRgIHZhcmNoYXIoMzYpIE5PVCBOVUxMLAorICBgdGVuYW50X2lkYCB2YXJjaGFyKDM2KSBOT1QgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGBpZGApLAorICBLRVkgYEZLX3RlbmFudHNfaW1hZ2VzX3RlbmFudHNgIChgdGVuYW50X2lkYCksCisgIEtFWSBgRktfdGVuYW50c19pbWFnZXNfaW1hZ2VzYCAoYGltYWdlX2lkYCksCisgIENPTlNUUkFJTlQgYEZLX3RlbmFudHNfaW1hZ2VzX2ltYWdlc2AgRk9SRUlHTiBLRVkgKGBpbWFnZV9pZGApIFJFRkVSRU5DRVMgYGltYWdlc2AgKGB1dWlkYCksCisgIENPTlNUUkFJTlQgYEZLX3RlbmFudHNfaW1hZ2VzX3RlbmFudHNgIEZPUkVJR04gS0VZIChgdGVuYW50X2lkYCkgUkVGRVJFTkNFUyBgdGVuYW50c2AgKGB1dWlkYCkgT04gREVMRVRFIENBU0NBREUgT04gVVBEQVRFIENBU0NBREUKKykgRU5HSU5FPUlubm9EQiAgREVGQVVMVCBDSEFSU0VUPXV0Zjg7CisvKiE0MDEwMSBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgPSBAc2F2ZWRfY3NfY2xpZW50ICovOworCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgdXVpZHNgCistLQorCitEUk9QIFRBQkxFIElGIEVYSVNUUyBgdXVpZHNgOworLyohNDAxMDEgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IHV0ZjggKi87CitDUkVBVEUgVEFCTEUgYHV1aWRzYCAoCisgIGB1dWlkYCB2YXJjaGFyKDM2KSBOT1QgTlVMTCwKKyAgYHJvb3RfdXVpZGAgdmFyY2hhcigzNikgREVGQVVMVCBOVUxMIENPTU1FTlQgJ1NvbWUgcmVsYXRlZCBVVUlEcyBjYW4gYmUgZ3JvdXBlZCBieSB0aGlzIGZpZWxkLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGRlbGV0ZWQgYXQgb25jZScsCisgIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgTk9UIE5VTEwgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwKKyAgYHVzZWRfYXRgIGVudW0oJ2ZsYXZvcnMnLCdob3N0cycsJ2ltYWdlcycsJ2luc3RhbmNlcycsJ25ldHMnLCdwb3J0cycsJ3RlbmFudHMnKSBERUZBVUxUIE5VTEwgQ09NTUVOVCAnVGFibGUgdGhhdCB1c2VzIHRoaXMgVVVJRCcsCisgIFBSSU1BUlkgS0VZIChgdXVpZGApCispIEVOR0lORT1Jbm5vREIgREVGQVVMVCBDSEFSU0VUPXV0ZjggQ09NTUVOVD0nVXNlZCB0byBhdm9pZCBVVUlEIHJlcGV0aXRpb25zJzsKKy8qITQwMTAxIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCA9IEBzYXZlZF9jc19jbGllbnQgKi87CisKKy0tCistLSBEdW1waW5nIHJvdXRpbmVzIGZvciBkYXRhYmFzZSAndmltX2RiJworLS0KKy8qITUwMDAzIERST1AgUFJPQ0VEVVJFIElGIEVYSVNUUyBgR2V0QWxsQXZhaWxhYmxlUG9ydHNgICovOworLyohNTAwMDMgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgICA9IEBAY2hhcmFjdGVyX3NldF9jbGllbnQgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9jc19yZXN1bHRzICAgICA9IEBAY2hhcmFjdGVyX3NldF9yZXN1bHRzICovIDsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfY29sX2Nvbm5lY3Rpb24gPSBAQGNvbGxhdGlvbl9jb25uZWN0aW9uICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCAgPSB1dGY4ICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgPSB1dGY4ICovIDsKKy8qITUwMDAzIFNFVCBjb2xsYXRpb25fY29ubmVjdGlvbiAgPSB1dGY4X2dlbmVyYWxfY2kgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9zcWxfbW9kZSAgICAgICA9IEBAc3FsX21vZGUgKi8gOworLyohNTAwMDMgU0VUIHNxbF9tb2RlICAgICAgICAgICAgICA9ICcnICovIDsKK0RFTElNSVRFUiA7OworQ1JFQVRFIFBST0NFRFVSRSBgR2V0QWxsQXZhaWxhYmxlUG9ydHNgKElOIE51bWEgSU5UKQorICAgIFNRTCBTRUNVUklUWSBJTlZPS0VSCisgICAgQ09NTUVOVCAnT2J0YWluIGFsbCAtaW5jbHVkaW5nIHRob3NlIG5vdCBjb25uZWN0ZWQgdG8gc3dpdGNoIHBvcnQtIHBvcnRzIGF2YWlsYWJsZSBmb3IgYSBudW1hJworQkVHSU4KKwlTRUxFQ1QgcG9ydF9pZCwgcGNpLCBNYnBzLCBNYnBzIC0gTWJwc19jb25zdW1lZCBhcyBNYnBzX2ZyZWUsIHRvdGFsU1JJT1YgLSBjb2FsZXNjZSh1c2VkU1JJT1YsMCkgYXMgYXZhaWxhYmxlU1JJT1YsIHN3aXRjaF9wb3J0LCBtYWMKKwlGUk9NCisJKAorCSAgIFNFTEVDVCBpZCBhcyBwb3J0X2lkLCBNYnBzLCBwY2ksIHN3aXRjaF9wb3J0LCBtYWMKKwkgICBGUk9NIHJlc291cmNlc19wb3J0ICAKKwkJV0hFUkUgbnVtYV9pZCA9IE51bWEgQU5EIGlkPXJvb3RfaWQgQU5EIHN0YXR1cyA9ICdvaycgQU5EIGluc3RhbmNlX2lkIElTIE5VTEwKKwkpIGFzIEEKKwlJTk5FUiBKT0lOCisJKAorCSAgIFNFTEVDVCByb290X2lkLCBzdW0oTWJwc191c2VkKSBhcyBNYnBzX2NvbnN1bWVkLCBDT1VOVChpZCktMSBhcyB0b3RhbFNSSU9WCisJCUZST00gcmVzb3VyY2VzX3BvcnQgIAorCQlXSEVSRSBudW1hX2lkID0gTnVtYSBBTkQgc3RhdHVzID0gJ29rJworCQlHUk9VUCBCWSByb290X2lkCisJKSBhcyBCCisJT04gQS5wb3J0X2lkID0gQi5yb290X2lkCisJTEVGVCBKT0lOCisJKAorCSAgIFNFTEVDVCByb290X2lkLCAgQ09VTlQoaWQpIGFzIHVzZWRTUklPVgorCQlGUk9NIHJlc291cmNlc19wb3J0ICAKKwkJV0hFUkUgbnVtYV9pZCA9IE51bWEgQU5EIHN0YXR1cyA9ICdvaycgQU5EIGluc3RhbmNlX2lkIElTIE5PVCBOVUxMCisJCUdST1VQIEJZIHJvb3RfaWQKKwkpIGFzIEMKKwlPTiBBLnBvcnRfaWQgPSBDLnJvb3RfaWQKKwlPUkRFUiBCWSBNYnBzX2ZyZWUsIGF2YWlsYWJsZVNSSU9WLCBwY2k7CisgICAgRU5EIDs7CitERUxJTUlURVIgOworLyohNTAwMDMgU0VUIHNxbF9tb2RlICAgICAgICAgICAgICA9IEBzYXZlZF9zcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgID0gQHNhdmVkX2NzX2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9yZXN1bHRzID0gQHNhdmVkX2NzX3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IEBzYXZlZF9jb2xfY29ubmVjdGlvbiAqLyA7CisvKiE1MDAwMyBEUk9QIFBST0NFRFVSRSBJRiBFWElTVFMgYEdldEF2YWlsYWJsZVBvcnRzYCAqLzsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfY3NfY2xpZW50ICAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovIDsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfY3NfcmVzdWx0cyAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NvbF9jb25uZWN0aW9uID0gQEBjb2xsYXRpb25fY29ubmVjdGlvbiAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgID0gdXRmOCAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9yZXN1bHRzID0gdXRmOCAqLyA7CisvKiE1MDAwMyBTRVQgY29sbGF0aW9uX2Nvbm5lY3Rpb24gID0gdXRmOF9nZW5lcmFsX2NpICovIDsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfc3FsX21vZGUgICAgICAgPSBAQHNxbF9tb2RlICovIDsKKy8qITUwMDAzIFNFVCBzcWxfbW9kZSAgICAgICAgICAgICAgPSAnJyAqLyA7CitERUxJTUlURVIgOzsKK0NSRUFURSBQUk9DRURVUkUgYEdldEF2YWlsYWJsZVBvcnRzYChJTiBgTnVtYWAgSU5UKQorICAgIERFVEVSTUlOSVNUSUMKKyAgICBTUUwgU0VDVVJJVFkgSU5WT0tFUgorQkVHSU4KK1NFTEVDVCBwb3J0X2lkLCBwY2ksIE1icHMsIE1icHMgLSBNYnBzX2NvbnN1bWVkIGFzIE1icHNfZnJlZSwgdG90YWxTUklPViAtIGNvYWxlc2NlKHVzZWRTUklPViwwKSBhcyBhdmFpbGFibGVTUklPViwgc3dpdGNoX3BvcnQsIG1hYworRlJPTQorCSgKKwkgICBTRUxFQ1QgaWQgYXMgcG9ydF9pZCwgTWJwcywgcGNpLCBzd2l0Y2hfcG9ydCwgbWFjCisJICAgRlJPTSByZXNvdXJjZXNfcG9ydCAgCisJCVdIRVJFIG51bWFfaWQgPSBOdW1hIEFORCBpZD1yb290X2lkIEFORCBzdGF0dXMgPSAnb2snIEFORCBzd2l0Y2hfcG9ydCBpcyBub3QgTnVsbCBBTkQgaW5zdGFuY2VfaWQgSVMgTlVMTAorCSkgYXMgQQorCUlOTkVSIEpPSU4KKwkoCisJICAgU0VMRUNUIHJvb3RfaWQsIHN1bShNYnBzX3VzZWQpIGFzIE1icHNfY29uc3VtZWQsIENPVU5UKGlkKS0xIGFzIHRvdGFsU1JJT1YKKwkJRlJPTSByZXNvdXJjZXNfcG9ydCAgCisJCVdIRVJFIG51bWFfaWQgPSBOdW1hIEFORCBzdGF0dXMgPSAnb2snCisJCUdST1VQIEJZIHJvb3RfaWQKKwkpIGFzIEIKKwlPTiBBLnBvcnRfaWQgPSBCLnJvb3RfaWQKKwlMRUZUIEpPSU4KKwkoCisJICAgU0VMRUNUIHJvb3RfaWQsICBDT1VOVChpZCkgYXMgdXNlZFNSSU9WCisJCUZST00gcmVzb3VyY2VzX3BvcnQgIAorCQlXSEVSRSBudW1hX2lkID0gTnVtYSBBTkQgc3RhdHVzID0gJ29rJyBBTkQgaW5zdGFuY2VfaWQgSVMgTk9UIE5VTEwgQU5EIHN3aXRjaF9wb3J0IGlzIG5vdCBOdWxsCisJCUdST1VQIEJZIHJvb3RfaWQKKwkpIGFzIEMKKwlPTiBBLnBvcnRfaWQgPSBDLnJvb3RfaWQKKworT1JERVIgQlkgTWJwc19mcmVlLCBhdmFpbGFibGVTUklPViwgcGNpCis7CitFTkQgOzsKK0RFTElNSVRFUiA7CisvKiE1MDAwMyBTRVQgc3FsX21vZGUgICAgICAgICAgICAgID0gQHNhdmVkX3NxbF9tb2RlICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCAgPSBAc2F2ZWRfY3NfY2xpZW50ICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgPSBAc2F2ZWRfY3NfcmVzdWx0cyAqLyA7CisvKiE1MDAwMyBTRVQgY29sbGF0aW9uX2Nvbm5lY3Rpb24gID0gQHNhdmVkX2NvbF9jb25uZWN0aW9uICovIDsKKy8qITUwMDAzIERST1AgUFJPQ0VEVVJFIElGIEVYSVNUUyBgR2V0SG9zdEJ5TWVtQ3B1YCAqLzsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfY3NfY2xpZW50ICAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovIDsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfY3NfcmVzdWx0cyAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NvbF9jb25uZWN0aW9uID0gQEBjb2xsYXRpb25fY29ubmVjdGlvbiAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgID0gdXRmOCAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9yZXN1bHRzID0gdXRmOCAqLyA7CisvKiE1MDAwMyBTRVQgY29sbGF0aW9uX2Nvbm5lY3Rpb24gID0gdXRmOF9nZW5lcmFsX2NpICovIDsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfc3FsX21vZGUgICAgICAgPSBAQHNxbF9tb2RlICovIDsKKy8qITUwMDAzIFNFVCBzcWxfbW9kZSAgICAgICAgICAgICAgPSAnJyAqLyA7CitERUxJTUlURVIgOzsKK0NSRUFURSBQUk9DRURVUkUgYEdldEhvc3RCeU1lbUNwdWAoSU4gYE5lZWRlZF9tZW1gIElOVCwgSU4gYE5lZWRlZF9jcHVzYCBJTlQpCisgICAgU1FMIFNFQ1VSSVRZIElOVk9LRVIKKyAgICBDT01NRU5UICdPYnRhaW4gdGhvc2UgaG9zdHMgd2l0aCB0aGUgYXZhaWxhYmxlIGZyZWUgTWVtb3J5KE5vbiBIdWdlUGFnZXMpIGFuZCBDUFVTIChOb24gaXNvbGF0ZWQpJworQkVHSU4KKworU0VMRUNUICogCitGUk9NIGhvc3RzIGFzIEgKK0xFRlQgSk9JTiAoCisJU0VMRUNUIHN1bShyYW0pIGFzIHVzZWRfcmFtLCBzdW0odmNwdXMpIGFzIHVzZWRfY3B1cywgaG9zdF9pZAorCUZST00gaW5zdGFuY2VzCisJR1JPVVAgQlkgaG9zdF9pZAorKSBhcyBVIE9OIFUuaG9zdF9pZCA9IEgudXVpZAorV0hFUkUgTmVlZGVkX21lbTw9SC5SQU0tY29hbGVzY2UoVS51c2VkX3JhbSwwKSBBTkQgTmVlZGVkX2NwdXM8PUguY3B1cy1jb2FsZXNjZShVLnVzZWRfY3B1cywwKSBBTkQgSC5hZG1pbl9zdGF0ZV91cCA9ICd0cnVlJyAKK09SREVSIEJZIFJBTS1jb2FsZXNjZShVLnVzZWRfcmFtLDApLCBjcHVzLWNvYWxlc2NlKFUudXNlZF9jcHVzLDApCisKKzsKK0VORCA7OworREVMSU1JVEVSIDsKKy8qITUwMDAzIFNFVCBzcWxfbW9kZSAgICAgICAgICAgICAgPSBAc2F2ZWRfc3FsX21vZGUgKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ICA9IEBzYXZlZF9jc19jbGllbnQgKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyA9IEBzYXZlZF9jc19yZXN1bHRzICovIDsKKy8qITUwMDAzIFNFVCBjb2xsYXRpb25fY29ubmVjdGlvbiAgPSBAc2F2ZWRfY29sX2Nvbm5lY3Rpb24gKi8gOworLyohNTAwMDMgRFJPUCBQUk9DRURVUkUgSUYgRVhJU1RTIGBHZXRJZmFjZXNgICovOworLyohNTAwMDMgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgICA9IEBAY2hhcmFjdGVyX3NldF9jbGllbnQgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9jc19yZXN1bHRzICAgICA9IEBAY2hhcmFjdGVyX3NldF9yZXN1bHRzICovIDsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfY29sX2Nvbm5lY3Rpb24gPSBAQGNvbGxhdGlvbl9jb25uZWN0aW9uICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCAgPSB1dGY4ICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgPSB1dGY4ICovIDsKKy8qITUwMDAzIFNFVCBjb2xsYXRpb25fY29ubmVjdGlvbiAgPSB1dGY4X2dlbmVyYWxfY2kgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9zcWxfbW9kZSAgICAgICA9IEBAc3FsX21vZGUgKi8gOworLyohNTAwMDMgU0VUIHNxbF9tb2RlICAgICAgICAgICAgICA9ICcnICovIDsKK0RFTElNSVRFUiA7OworQ1JFQVRFIFBST0NFRFVSRSBgR2V0SWZhY2VzYCgpCisgICAgU1FMIFNFQ1VSSVRZIElOVk9LRVIKKyAgICBDT01NRU5UICdVc2VkIGZvciB0aGUgaHR0cCBnZXQgcG9ydHMnCitCRUdJTgorCitTRUxFQ1QgKiwgJ0FDVElWRScgYXMgc3RhdHVzLCd0cnVlJyBhcyBhZG1pbl9zdGF0ZV91cCBGUk9NCisoCisJKAorCQlTRUxFQ1QgaWZhLnV1aWQgYXMgaWQsIGlmYS5uYW1lIGFzIG5hbWUsIGluc3RhbmNlX2lkIGFzIGRldmljZV9pZCwgbmV0X2lkLCB0ZW5hbnRfaWQKKwkJRlJPTSBpbnN0YW5jZV9pZmFjZXMgQVMgaWZhIEpPSU4gaW5zdGFuY2VzIEFTIGkgb24gaWZhLmluc3RhbmNlX2lkPWkudXVpZAorCSkgCisJVU5JT04KKwkoCisJCVNFTEVDVCBpZmFjZV91dWlkIGFzIGlkLCBpZmEubmFtZSBhcyBuYW1lLCBpbnN0YW5jZV9pZCBhcyBkZXZpY2VfaWQsIG5ldF9pZCx0ZW5hbnRfaWQKKwkJRlJPTSByZXNvdXJjZXNfcG9ydCAgQVMgaWZhIEpPSU4gaW5zdGFuY2VzIEFTIGkgb24gaWZhLmluc3RhbmNlX2lkPWkudXVpZAorCQlXSEVSRSBpZmFjZV91dWlkIGlzIG5vdCBOVUxMCisJKSAKKwlVTklPTgorCSgKKwkJU0VMRUNUIHV1aWQgYXMgaWQsIG5hbWUsIE51bGwgYXMgZGV2aWNlX2lkLCBuZXRfaWQsIE51bGwgYXMgdGVuYW50X2lkCisJCUZST00gZXh0ZXJuYWxfcG9ydHMgCisJKSAKKykgYXMgQiAKKzsKK0VORCA7OworREVMSU1JVEVSIDsKKy8qITUwMDAzIFNFVCBzcWxfbW9kZSAgICAgICAgICAgICAgPSBAc2F2ZWRfc3FsX21vZGUgKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ICA9IEBzYXZlZF9jc19jbGllbnQgKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyA9IEBzYXZlZF9jc19yZXN1bHRzICovIDsKKy8qITUwMDAzIFNFVCBjb2xsYXRpb25fY29ubmVjdGlvbiAgPSBAc2F2ZWRfY29sX2Nvbm5lY3Rpb24gKi8gOworLyohNTAwMDMgRFJPUCBQUk9DRURVUkUgSUYgRVhJU1RTIGBHZXROZXh0QXV0b0luY3JlbWVudGAgKi87CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX3Jlc3VsdHMgICAgID0gQEBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9jb2xfY29ubmVjdGlvbiA9IEBAY29sbGF0aW9uX2Nvbm5lY3Rpb24gKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ICA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IHV0ZjhfZ2VuZXJhbF9jaSAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX3NxbF9tb2RlICAgICAgID0gQEBzcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgc3FsX21vZGUgICAgICAgICAgICAgID0gJycgKi8gOworREVMSU1JVEVSIDs7CitDUkVBVEUgUFJPQ0VEVVJFIGBHZXROZXh0QXV0b0luY3JlbWVudGAoKQorICAgIFNRTCBTRUNVUklUWSBJTlZPS0VSCitCRUdJTgorU0VMRUNUIHRhYmxlX25hbWUsIEFVVE9fSU5DUkVNRU5UCitGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMKK1dIRVJFIHRhYmxlX25hbWUgPSAncmVzb3VyY2VzX3BvcnQnCitBTkQgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoICkgOworRU5EIDs7CitERUxJTUlURVIgOworLyohNTAwMDMgU0VUIHNxbF9tb2RlICAgICAgICAgICAgICA9IEBzYXZlZF9zcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgID0gQHNhdmVkX2NzX2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9yZXN1bHRzID0gQHNhdmVkX2NzX3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IEBzYXZlZF9jb2xfY29ubmVjdGlvbiAqLyA7CisvKiE1MDAwMyBEUk9QIFBST0NFRFVSRSBJRiBFWElTVFMgYEdldE51bWFCeUNvcmVgICovOworLyohNTAwMDMgU0VUIEBzYXZlZF9jc19jbGllbnQgICAgICA9IEBAY2hhcmFjdGVyX3NldF9jbGllbnQgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9jc19yZXN1bHRzICAgICA9IEBAY2hhcmFjdGVyX3NldF9yZXN1bHRzICovIDsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfY29sX2Nvbm5lY3Rpb24gPSBAQGNvbGxhdGlvbl9jb25uZWN0aW9uICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCAgPSB1dGY4ICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgPSB1dGY4ICovIDsKKy8qITUwMDAzIFNFVCBjb2xsYXRpb25fY29ubmVjdGlvbiAgPSB1dGY4X2dlbmVyYWxfY2kgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9zcWxfbW9kZSAgICAgICA9IEBAc3FsX21vZGUgKi8gOworLyohNTAwMDMgU0VUIHNxbF9tb2RlICAgICAgICAgICAgICA9ICcnICovIDsKK0RFTElNSVRFUiA7OworQ1JFQVRFIFBST0NFRFVSRSBgR2V0TnVtYUJ5Q29yZWAoSU4gYE5lZWRlZF9jb3Jlc2AgU01BTExJTlQpCisgICAgU1FMIFNFQ1VSSVRZIElOVk9LRVIKKyAgICBDT01NRU5UICdPYnRhaW4gTnVtYXMgd2l0aCBhIGNvbmNyZXRlIG51bWJlciBvZiBhdmFpbGFibGUgY29yZXMsIHdpdGggYm90JworQkVHSU4KKworU0VMRUNUIG51bWFfaWQsIGhvc3RfaWQsIG51bWFfc29ja2V0LCBmcmVlY29yZXMgRlJPTQorKAorICAgIFNFTEVDVCBudW1hX2lkLCBDT1VOVChjb3JlX2lkKSBhcyBmcmVlY29yZXMgRlJPTQorICAgICgKKyAgICAgICAgU0VMRUNUIG51bWFfaWQsIGNvcmVfaWQsIENPVU5UKHRocmVhZF9pZCkgQVMgZnJlZXRocmVhZHMKKwkJICBGUk9NIHJlc291cmNlc19jb3JlIAorCQkgIFdIRVJFIGluc3RhbmNlX2lkIElTIE5VTEwgQU5EIHN0YXR1cyA9ICdvaycgCisJCSAgR1JPVVAgQlkgbnVtYV9pZCwgY29yZV9pZAorICAgICkgQVMgRlJFRUNPUkVTX1RBQkxFCisgICAgV0hFUkUgRlJFRUNPUkVTX1RBQkxFLmZyZWV0aHJlYWRzID0gMgorICAgIEdST1VQIEJZIG51bWFfaWQgIAorKSBBUyBOQkNPUkVTX1RBQkxFIAorSU5ORVIgSk9JTiBudW1hcyBPTiBudW1hcy5pZCA9IE5CQ09SRVNfVEFCTEUubnVtYV9pZAorSU5ORVIgSk9JTiBob3N0cyBPTiBudW1hcy5ob3N0X2lkID0gaG9zdHMudXVpZAorCitXSEVSRSBOQkNPUkVTX1RBQkxFLmZyZWVjb3JlcyA+PSBOZWVkZWRfY29yZXMgQU5EIG51bWFzLnN0YXR1cyA9ICdvaycgQU5EIG51bWFzLmFkbWluX3N0YXRlX3VwID0gJ3RydWUnIEFORCBob3N0cy5hZG1pbl9zdGF0ZV91cCA9ICd0cnVlJworT1JERVIgQlkgTkJDT1JFU19UQUJMRS5mcmVlY29yZXMKKzsKKworRU5EIDs7CitERUxJTUlURVIgOworLyohNTAwMDMgU0VUIHNxbF9tb2RlICAgICAgICAgICAgICA9IEBzYXZlZF9zcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgID0gQHNhdmVkX2NzX2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9yZXN1bHRzID0gQHNhdmVkX2NzX3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IEBzYXZlZF9jb2xfY29ubmVjdGlvbiAqLyA7CisvKiE1MDAwMyBEUk9QIFBST0NFRFVSRSBJRiBFWElTVFMgYEdldE51bWFCeU1lbW9yeWAgKi87CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX3Jlc3VsdHMgICAgID0gQEBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9jb2xfY29ubmVjdGlvbiA9IEBAY29sbGF0aW9uX2Nvbm5lY3Rpb24gKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ICA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IHV0ZjhfZ2VuZXJhbF9jaSAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX3NxbF9tb2RlICAgICAgID0gQEBzcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgc3FsX21vZGUgICAgICAgICAgICAgID0gJycgKi8gOworREVMSU1JVEVSIDs7CitDUkVBVEUgUFJPQ0VEVVJFIGBHZXROdW1hQnlNZW1vcnlgKElOIGBOZWVkZWRfbWVtYCBTTUFMTElOVCkKKyAgICBERVRFUk1JTklTVElDCisgICAgU1FMIFNFQ1VSSVRZIElOVk9LRVIKKyAgICBDT01NRU5UICdPYnRhaW4gbnVtYXMgd2l0aCBhIGZyZWUgcXVhbnRpdHkgb2YgbWVtb3J5LCBwYXNzZWQgYnkgcGFyYW1ldGVyJworQkVHSU4KK1NFTEVDVCAqIEZST00gCisoICAgU0VMRUNUIG51bWFzLmlkIGFzIG51bWFfaWQsIG51bWFzLmhvc3RfaWQsIG51bWFzLm51bWFfc29ja2V0LCBudW1hcy5odWdlcGFnZXMsIG51bWFzLmh1Z2VwYWdlcyAtIHN1bShjb2FsZXNjZShyZXNvdXJjZXNfbWVtLmNvbnN1bWVkLDApKSBBUyBmcmVlbWVtCisgICAgRlJPTSBudW1hcyAKKwkgTEVGVCBKT0lOIHJlc291cmNlc19tZW0gT04gbnVtYXMuaWQgPSByZXNvdXJjZXNfbWVtLm51bWFfaWQKKyAgICBKT0lOIGhvc3RzIE9OIG51bWFzLmhvc3RfaWQgPSBob3N0cy51dWlkCisgICAgV0hFUkUgbnVtYXMuc3RhdHVzID0gJ29rJyBBTkQgbnVtYXMuYWRtaW5fc3RhdGVfdXAgPSAndHJ1ZScgQU5EIGhvc3RzLmFkbWluX3N0YXRlX3VwID0gJ3RydWUnCisgICAgR1JPVVAgQlkgbnVtYXMuaWQKKykgQVMgQ09NQklORUQKKworV0hFUkUgQ09NQklORUQuZnJlZW1lbSA+PSBOZWVkZWRfbWVtCitPUkRFUiBCWSBDT01CSU5FRC5mcmVlbWVtCis7CitFTkQgOzsKK0RFTElNSVRFUiA7CisvKiE1MDAwMyBTRVQgc3FsX21vZGUgICAgICAgICAgICAgID0gQHNhdmVkX3NxbF9tb2RlICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCAgPSBAc2F2ZWRfY3NfY2xpZW50ICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgPSBAc2F2ZWRfY3NfcmVzdWx0cyAqLyA7CisvKiE1MDAwMyBTRVQgY29sbGF0aW9uX2Nvbm5lY3Rpb24gID0gQHNhdmVkX2NvbF9jb25uZWN0aW9uICovIDsKKy8qITUwMDAzIERST1AgUFJPQ0VEVVJFIElGIEVYSVNUUyBgR2V0TnVtYUJ5UG9ydGAgKi87CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX3Jlc3VsdHMgICAgID0gQEBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9jb2xfY29ubmVjdGlvbiA9IEBAY29sbGF0aW9uX2Nvbm5lY3Rpb24gKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ICA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IHV0ZjhfZ2VuZXJhbF9jaSAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX3NxbF9tb2RlICAgICAgID0gQEBzcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgc3FsX21vZGUgICAgICAgICAgICAgID0gJycgKi8gOworREVMSU1JVEVSIDs7CitDUkVBVEUgUFJPQ0VEVVJFIGBHZXROdW1hQnlQb3J0YChJTiBgTmVlZGVkX3NwZWVkYCBTTUFMTElOVCwgSU4gYE5lZWRlZF9wb3J0c2AgU01BTExJTlQpCisgICAgU1FMIFNFQ1VSSVRZIElOVk9LRVIKKyAgICBDT01NRU5UICdCdXNjYSBOdW1hcyBjb24gTiBwdWVydG9zIGZpc2ljb3MgTElCUkVTIGRlIFggdmVsb2NpZGFkJworQkVHSU4KKworU0VMRUNUIG51bWFfaWQsIENPVU5UKGlkKSBBUyBudW1iZXJfcG9ydHMgIAorRlJPTQorKAorCVNFTEVDVCByb290X2lkIEFTIGlkLCBzdGF0dXMsIG51bWFfaWQsIE1icHMsIFNVTShNYnBzX3VzZWQpIEFTIENvbnN1bWVkCisJRlJPTSByZXNvdXJjZXNfcG9ydCAKKwlHUk9VUCBCWSByb290X2lkCispIEFTIFAKK1dIRVJFIHN0YXR1cyA9ICdvaycgQU5EIHN3aXRjaF9wb3J0IGlzIG5vdCBOdWxsIEFORCBDb25zdW1lZCA9IDAgQU5EIE1icHMgPj0gTmVlZGVkX3NwZWVkCitHUk9VUCBCWSBudW1hX2lkCitIQVZJTkcgbnVtYmVyX3BvcnRzICA+PSBOZWVkZWRfcG9ydHMKKzsKKworRU5EIDs7CitERUxJTUlURVIgOworLyohNTAwMDMgU0VUIHNxbF9tb2RlICAgICAgICAgICAgICA9IEBzYXZlZF9zcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgID0gQHNhdmVkX2NzX2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9yZXN1bHRzID0gQHNhdmVkX2NzX3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IEBzYXZlZF9jb2xfY29ubmVjdGlvbiAqLyA7CisvKiE1MDAwMyBEUk9QIFBST0NFRFVSRSBJRiBFWElTVFMgYEdldE51bWFCeVRocmVhZGAgKi87CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX3Jlc3VsdHMgICAgID0gQEBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9jb2xfY29ubmVjdGlvbiA9IEBAY29sbGF0aW9uX2Nvbm5lY3Rpb24gKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ICA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IHV0ZjhfZ2VuZXJhbF9jaSAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX3NxbF9tb2RlICAgICAgID0gQEBzcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgc3FsX21vZGUgICAgICAgICAgICAgID0gJycgKi8gOworREVMSU1JVEVSIDs7CitDUkVBVEUgUFJPQ0VEVVJFIGBHZXROdW1hQnlUaHJlYWRgKElOIGBOZWVkZWRfdGhyZWFkc2AgU01BTExJTlQpCisgICAgU1FMIFNFQ1VSSVRZIElOVk9LRVIKK0JFR0lOCisKK1NFTEVDVCBudW1hX2lkLCBob3N0X2lkLCBudW1hX3NvY2tldCwgZnJlZXRocmVhZHMKK0ZST00KKygKKwlTRUxFQ1QgbnVtYV9pZCwgQ09VTlQodGhyZWFkX2lkKSBBUyBmcmVldGhyZWFkcworCUZST00gcmVzb3VyY2VzX2NvcmUgCisJV0hFUkUgaW5zdGFuY2VfaWQgSVMgTlVMTCBBTkQgc3RhdHVzID0gJ29rJyAKKwlHUk9VUCBCWSBudW1hX2lkCispIEFTIE5CQ09SRVNfVEFCTEUgCitJTk5FUiBKT0lOIG51bWFzIE9OIG51bWFzLmlkID0gTkJDT1JFU19UQUJMRS5udW1hX2lkCitJTk5FUiBKT0lOIGhvc3RzIE9OIG51bWFzLmhvc3RfaWQgPSBob3N0cy51dWlkCisKK1dIRVJFIE5CQ09SRVNfVEFCTEUuZnJlZXRocmVhZHMgPj0gTmVlZGVkX3RocmVhZHMgQU5EIG51bWFzLnN0YXR1cyA9ICdvaycgQU5EIG51bWFzLmFkbWluX3N0YXRlX3VwID0gJ3RydWUnIEFORCBob3N0cy5hZG1pbl9zdGF0ZV91cCA9ICd0cnVlJworT1JERVIgQlkgTkJDT1JFU19UQUJMRS5mcmVldGhyZWFkcworOworCitFTkQgOzsKK0RFTElNSVRFUiA7CisvKiE1MDAwMyBTRVQgc3FsX21vZGUgICAgICAgICAgICAgID0gQHNhdmVkX3NxbF9tb2RlICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X2NsaWVudCAgPSBAc2F2ZWRfY3NfY2xpZW50ICovIDsKKy8qITUwMDAzIFNFVCBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgPSBAc2F2ZWRfY3NfcmVzdWx0cyAqLyA7CisvKiE1MDAwMyBTRVQgY29sbGF0aW9uX2Nvbm5lY3Rpb24gID0gQHNhdmVkX2NvbF9jb25uZWN0aW9uICovIDsKKy8qITUwMDAzIERST1AgUFJPQ0VEVVJFIElGIEVYSVNUUyBgR2V0UG9ydHNGcm9tTnVtYWAgKi87CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX2NsaWVudCAgICAgID0gQEBjaGFyYWN0ZXJfc2V0X2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NzX3Jlc3VsdHMgICAgID0gQEBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIEBzYXZlZF9jb2xfY29ubmVjdGlvbiA9IEBAY29sbGF0aW9uX2Nvbm5lY3Rpb24gKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ICA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyA9IHV0ZjggKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IHV0ZjhfZ2VuZXJhbF9jaSAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX3NxbF9tb2RlICAgICAgID0gQEBzcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgc3FsX21vZGUgICAgICAgICAgICAgID0gJycgKi8gOworREVMSU1JVEVSIDs7CitDUkVBVEUgUFJPQ0VEVVJFIGBHZXRQb3J0c0Zyb21OdW1hYChJTiBgTnVtYWAgSU5UKQorICAgIE5PIFNRTAorICAgIFNRTCBTRUNVUklUWSBJTlZPS0VSCitCRUdJTgorU0VMRUNUIE1icHMsIHBjaSwgc3RhdHVzLCBNYnBzX2NvbnN1bWVkICAKK0ZST00KKygKKyAgIFNFTEVDVCBpZCwgTWJwcywgcGNpLCBzdGF0dXMKKyAgIEZST00gcmVzb3VyY2VzX3BvcnQgIAorCVdIRVJFIG51bWFfaWQgPSBOdW1hIEFORCBpZD1yb290X2lkIEFORCBzdGF0dXM9J29rJyBBTkQgc3dpdGNoX3BvcnQgaXMgbm90IE51bGwKKykgYXMgQQorSU5ORVIgSk9JTgorKAorICAgU0VMRUNUIHJvb3RfaWQsIHN1bShNYnBzX3VzZWQpIGFzIE1icHNfY29uc3VtZWQKKwlGUk9NIHJlc291cmNlc19wb3J0ICAKKwlXSEVSRSBudW1hX2lkID0gTnVtYSAKKwlHUk9VUCBCWSByb290X2lkCispIGFzIEIKK09OIEEuaWQgPSBCLnJvb3RfaWQKKzsKK0VORCA7OworREVMSU1JVEVSIDsKKy8qITUwMDAzIFNFVCBzcWxfbW9kZSAgICAgICAgICAgICAgPSBAc2F2ZWRfc3FsX21vZGUgKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfY2xpZW50ICA9IEBzYXZlZF9jc19jbGllbnQgKi8gOworLyohNTAwMDMgU0VUIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyA9IEBzYXZlZF9jc19yZXN1bHRzICovIDsKKy8qITUwMDAzIFNFVCBjb2xsYXRpb25fY29ubmVjdGlvbiAgPSBAc2F2ZWRfY29sX2Nvbm5lY3Rpb24gKi8gOworLyohNTAwMDMgRFJPUCBQUk9DRURVUkUgSUYgRVhJU1RTIGBVcGRhdGVTd2l0Y2hQb3J0YCAqLzsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfY3NfY2xpZW50ICAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfY2xpZW50ICovIDsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfY3NfcmVzdWx0cyAgICAgPSBAQGNoYXJhY3Rlcl9zZXRfcmVzdWx0cyAqLyA7CisvKiE1MDAwMyBTRVQgQHNhdmVkX2NvbF9jb25uZWN0aW9uID0gQEBjb2xsYXRpb25fY29ubmVjdGlvbiAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgID0gdXRmOCAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9yZXN1bHRzID0gdXRmOCAqLyA7CisvKiE1MDAwMyBTRVQgY29sbGF0aW9uX2Nvbm5lY3Rpb24gID0gdXRmOF9nZW5lcmFsX2NpICovIDsKKy8qITUwMDAzIFNFVCBAc2F2ZWRfc3FsX21vZGUgICAgICAgPSBAQHNxbF9tb2RlICovIDsKKy8qITUwMDAzIFNFVCBzcWxfbW9kZSAgICAgICAgICAgICAgPSAnJyAqLyA7CitERUxJTUlURVIgOzsKK0NSRUFURSBQUk9DRURVUkUgYFVwZGF0ZVN3aXRjaFBvcnRgKCkKKyAgICBNT0RJRklFUyBTUUwgREFUQQorICAgIFNRTCBTRUNVUklUWSBJTlZPS0VSCisgICAgQ09NTUVOVCAnTG9hZCB0aGUgb3BlbmZsb3cgc3dpdGNoIHBvcnRzIGZyb20gb2ZfcG9ydHNfcGNpX2NvcnJlc3BvbmRlY2UgaW50byByZXNvdXJlY2VzX3BvcnQgYW5kIHBvcnRzJworQkVHSU4KKyAgICAgICAgCisgICAgICAgIFVQREFURSBwb3J0cworICAgICAgICBSSUdIVCBKT0lOIHJlc291cmNlc19wb3J0IGFzIFJQIG9uIHBvcnRzLnV1aWQ9UlAucG9ydF9pZAorICAgICAgICBJTk5FUiBKT0lOIHJlc291cmNlc19wb3J0IGFzIFJQMiBvbiBSUDIuaWQ9UlAucm9vdF9pZAorICAgICAgICBJTk5FUiBKT0lOIG51bWFzIG9uIFJQLm51bWFfaWQ9bnVtYXMuaWQKKyAgICAgICAgSU5ORVIgSk9JTiBob3N0cyBvbiBudW1hcy5ob3N0X2lkPWhvc3RzLnV1aWQKKyAgICAgICAgSU5ORVIgSk9JTiBvZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2UgYXMgUEMgb24gaG9zdHMuaXBfbmFtZT1QQy5pcF9uYW1lIGFuZCBSUDIucGNpPVBDLnBjaQorICAgICAgICBTRVQgcG9ydHMuc3dpdGNoX3BvcnQ9bnVsbCwgcG9ydHMuc3dpdGNoX2RwaWQ9bnVsbCwgUlAuc3dpdGNoX3BvcnQ9bnVsbCwgUlAuc3dpdGNoX2RwaWQ9bnVsbDsKKyAgICAgICAgCisgICAgICAgIFVQREFURSBwb3J0cworICAgICAgICBSSUdIVCBKT0lOIHJlc291cmNlc19wb3J0IGFzIFJQIG9uIHBvcnRzLnV1aWQ9UlAucG9ydF9pZAorICAgICAgICBJTk5FUiBKT0lOIHJlc291cmNlc19wb3J0IGFzIFJQMiBvbiBSUDIuaWQ9UlAucm9vdF9pZAorICAgICAgICBJTk5FUiBKT0lOIG51bWFzIG9uIFJQLm51bWFfaWQ9bnVtYXMuaWQKKyAgICAgICAgSU5ORVIgSk9JTiBob3N0cyBvbiBudW1hcy5ob3N0X2lkPWhvc3RzLnV1aWQKKyAgICAgICAgSU5ORVIgSk9JTiBvZl9wb3J0c19wY2lfY29ycmVzcG9uZGVuY2UgYXMgUEMgb24gaG9zdHMuaXBfbmFtZT1QQy5pcF9uYW1lIGFuZCBSUDIucGNpPVBDLnBjaQorICAgICAgICBTRVQgcG9ydHMuc3dpdGNoX3BvcnQ9UEMuc3dpdGNoX3BvcnQsIHBvcnRzLnN3aXRjaF9kcGlkPVBDLnN3aXRjaF9kcGlkLCBSUC5zd2l0Y2hfcG9ydD1QQy5zd2l0Y2hfcG9ydCwgUlAuc3dpdGNoX2RwaWQ9UEMuc3dpdGNoX2RwaWQ7CisgICAgRU5EIDs7CitERUxJTUlURVIgOworLyohNTAwMDMgU0VUIHNxbF9tb2RlICAgICAgICAgICAgICA9IEBzYXZlZF9zcWxfbW9kZSAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9jbGllbnQgID0gQHNhdmVkX2NzX2NsaWVudCAqLyA7CisvKiE1MDAwMyBTRVQgY2hhcmFjdGVyX3NldF9yZXN1bHRzID0gQHNhdmVkX2NzX3Jlc3VsdHMgKi8gOworLyohNTAwMDMgU0VUIGNvbGxhdGlvbl9jb25uZWN0aW9uICA9IEBzYXZlZF9jb2xfY29ubmVjdGlvbiAqLyA7CisvKiE0MDEwMyBTRVQgVElNRV9aT05FPUBPTERfVElNRV9aT05FICovOworCisvKiE0MDEwMSBTRVQgU1FMX01PREU9QE9MRF9TUUxfTU9ERSAqLzsKKy8qITQwMDE0IFNFVCBGT1JFSUdOX0tFWV9DSEVDS1M9QE9MRF9GT1JFSUdOX0tFWV9DSEVDS1MgKi87CisvKiE0MDAxNCBTRVQgVU5JUVVFX0NIRUNLUz1AT0xEX1VOSVFVRV9DSEVDS1MgKi87CisvKiE0MDEwMSBTRVQgQ0hBUkFDVEVSX1NFVF9DTElFTlQ9QE9MRF9DSEFSQUNURVJfU0VUX0NMSUVOVCAqLzsKKy8qITQwMTAxIFNFVCBDSEFSQUNURVJfU0VUX1JFU1VMVFM9QE9MRF9DSEFSQUNURVJfU0VUX1JFU1VMVFMgKi87CisvKiE0MDEwMSBTRVQgQ09MTEFUSU9OX0NPTk5FQ1RJT049QE9MRF9DT0xMQVRJT05fQ09OTkVDVElPTiAqLzsKKy8qITQwMTExIFNFVCBTUUxfTk9URVM9QE9MRF9TUUxfTk9URVMgKi87CisKKy0tIER1bXAgY29tcGxldGVkIG9uIDIwMTYtMDUtMTMgMTI6NTI6MTkKKworCisKKworCistLSBNeVNRTCBkdW1wIDEwLjEzICBEaXN0cmliIDUuNS40MywgZm9yIGRlYmlhbi1saW51eC1nbnUgKHg4Nl82NCkKKy0tCistLSBIb3N0OiBsb2NhbGhvc3QgICAgRGF0YWJhc2U6IHZpbV9kYgorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBTZXJ2ZXIgdmVyc2lvbgk1LjUuNDMtMHVidW50dTAuMTQuMDQuMQorCisvKiE0MDEwMSBTRVQgQE9MRF9DSEFSQUNURVJfU0VUX0NMSUVOVD1AQENIQVJBQ1RFUl9TRVRfQ0xJRU5UICovOworLyohNDAxMDEgU0VUIEBPTERfQ0hBUkFDVEVSX1NFVF9SRVNVTFRTPUBAQ0hBUkFDVEVSX1NFVF9SRVNVTFRTICovOworLyohNDAxMDEgU0VUIEBPTERfQ09MTEFUSU9OX0NPTk5FQ1RJT049QEBDT0xMQVRJT05fQ09OTkVDVElPTiAqLzsKKy8qITQwMTAxIFNFVCBOQU1FUyB1dGY4ICovOworLyohNDAxMDMgU0VUIEBPTERfVElNRV9aT05FPUBAVElNRV9aT05FICovOworLyohNDAxMDMgU0VUIFRJTUVfWk9ORT0nKzAwOjAwJyAqLzsKKy8qITQwMDE0IFNFVCBAT0xEX1VOSVFVRV9DSEVDS1M9QEBVTklRVUVfQ0hFQ0tTLCBVTklRVUVfQ0hFQ0tTPTAgKi87CisvKiE0MDAxNCBTRVQgQE9MRF9GT1JFSUdOX0tFWV9DSEVDS1M9QEBGT1JFSUdOX0tFWV9DSEVDS1MsIEZPUkVJR05fS0VZX0NIRUNLUz0wICovOworLyohNDAxMDEgU0VUIEBPTERfU1FMX01PREU9QEBTUUxfTU9ERSwgU1FMX01PREU9J05PX0FVVE9fVkFMVUVfT05fWkVSTycgKi87CisvKiE0MDExMSBTRVQgQE9MRF9TUUxfTk9URVM9QEBTUUxfTk9URVMsIFNRTF9OT1RFUz0wICovOworCistLQorLS0gRHVtcGluZyBkYXRhIGZvciB0YWJsZSBgc2NoZW1hX3ZlcnNpb25gCistLQorCitMT0NLIFRBQkxFUyBgc2NoZW1hX3ZlcnNpb25gIFdSSVRFOworLyohNDAwMDAgQUxURVIgVEFCTEUgYHNjaGVtYV92ZXJzaW9uYCBESVNBQkxFIEtFWVMgKi87CitJTlNFUlQgSU5UTyBgc2NoZW1hX3ZlcnNpb25gIFZBTFVFUyAoMSwnMC4xJywnMC4yLjAwJywnaW5zZXJ0IHNjaGVtYV92ZXJzaW9uOyBhbHRlciBuZXRzIHdpdGggbGFzdF9lcnJvciBjb2x1bW4nLCcyMDE1LTA1LTA1JyksKDIsJzAuMicsJzAuMi4wMycsJ3VwZGF0ZSBQcm9jZWR1cmUgVXBkYXRlU3dpdGNoUG9ydCcsJzIwMTUtMDUtMDYnKSwoMywnMC4zJywnMC4yLjUnLCdOZXcgUHJvY2VkdXJlIEdldEFsbEF2YWlsYWJsZVBvcnRzJywnMjAxNS0wNy0wOScpLCg0LCcwLjQnLCcwLjMuMScsJ1JlbW92ZSB1bmlxdWUgaW5kZXggVkxBTiBhdCByZXNvdXJjZXNfcG9ydCcsJzIwMTUtMDktMDQnKSwoNSwnMC41JywnMC40LjEnLCdBZGQgaXBfYWRkcmVzcyB0byBwb3J0cycsJzIwMTUtMDktMDQnKSwoNiwnMC42JywnMC40LjInLCdFbmxhcmdpbmcgbmFtZSBhdCBkYXRhYmFzZScsJzIwMTYtMDItMDEnKSwoNywnMC43JywnMC40LjQnLCdBZGQgYmluZF9uZXQgdG8gbmV0IHRhYmxlJywnMjAxNi0wMi0xMicpOworLyohNDAwMDAgQUxURVIgVEFCTEUgYHNjaGVtYV92ZXJzaW9uYCBFTkFCTEUgS0VZUyAqLzsKK1VOTE9DSyBUQUJMRVM7CisvKiE0MDEwMyBTRVQgVElNRV9aT05FPUBPTERfVElNRV9aT05FICovOworCisvKiE0MDEwMSBTRVQgU1FMX01PREU9QE9MRF9TUUxfTU9ERSAqLzsKKy8qITQwMDE0IFNFVCBGT1JFSUdOX0tFWV9DSEVDS1M9QE9MRF9GT1JFSUdOX0tFWV9DSEVDS1MgKi87CisvKiE0MDAxNCBTRVQgVU5JUVVFX0NIRUNLUz1AT0xEX1VOSVFVRV9DSEVDS1MgKi87CisvKiE0MDEwMSBTRVQgQ0hBUkFDVEVSX1NFVF9DTElFTlQ9QE9MRF9DSEFSQUNURVJfU0VUX0NMSUVOVCAqLzsKKy8qITQwMTAxIFNFVCBDSEFSQUNURVJfU0VUX1JFU1VMVFM9QE9MRF9DSEFSQUNURVJfU0VUX1JFU1VMVFMgKi87CisvKiE0MDEwMSBTRVQgQ09MTEFUSU9OX0NPTk5FQ1RJT049QE9MRF9DT0xMQVRJT05fQ09OTkVDVElPTiAqLzsKKy8qITQwMTExIFNFVCBTUUxfTk9URVM9QE9MRF9TUUxfTk9URVMgKi87CisKKy0tIER1bXAgY29tcGxldGVkIG9uIDIwMTYtMDUtMTMgMTI6NTI6MTkKZGlmZiAtLWdpdCBhL2RoY3BfdGhyZWFkLnB5IGIvZGhjcF90aHJlYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0NTg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RoY3BfdGhyZWFkLnB5CkBAIC0wLDAgKzEsMjkyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisnJycKK1RoaXMgaXMgdGhyZWFkIHRoYXQgaW50ZXJhY3Qgd2l0aCB0aGUgZGhjcCBzZXJ2ZXIgdG8gZ2V0IHRoZSBJUCBhZGRyZXNzZXMgCisnJycKK19fYXV0aG9yX189IlBhYmxvIE1vbnRlcywgQWxmb25zbyBUaWVybm8iCitfX2RhdGVfXyA9IiQ0LUphbi0yMDE2IDEyOjA3OjE1JCIKKworCisKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB0aW1lCitpbXBvcnQgUXVldWUKK2ltcG9ydCBwYXJhbWlrbworaW1wb3J0IHJhbmRvbQoraW1wb3J0IHN1YnByb2Nlc3MKKworI1RPRE86IGluc2VydCBhIGxvZ2dpbmcgc3lzdGVtCisKK2NsYXNzIGRoY3BfdGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaGNwX3BhcmFtcywgZGIsIGRiX2xvY2ssIHRlc3QsIGRoY3BfbmV0cywgZGVidWc9Tm9uZSk6CisgICAgICAgICcnJ0luaXQgYSB0aHJlYWQuCisgICAgICAgIEFyZ3VtZW50czogdGhyZWFkX2luZm8gbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2l0aDoKKyAgICAgICAgICAgICdkaGNwX3BhcmFtcycgZGhjcCBzZXJ2ZXIgcGFyYW1ldGVycyB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKKyAgICAgICAgICAgICAgICBtYW5kYXRvcnkgOiB1c2VyLCBob3N0LCBwb3J0LCBrZXksIGlmYWNlcyhpbnRlcmZhY2UgbmFtZSBsaXN0IG9mIHRoZSBvbmUgbWFuYWdlZCBieSB0aGUgZGhjcCkKKyAgICAgICAgICAgICAgICBvcHRpb25hbDogIHBhc3N3b3JkLCBrZXksIHBvcnQoMjIpCisgICAgICAgICAgICAnZGInICdkYl9sb2NrJzogZGF0YWJhc2UgY2xhc3MgYW5kIGxvY2sgZm9yIGFjY2Vzc2luZyBpdAorICAgICAgICAgICAgJ3Rlc3QnOiBpbiB0ZXN0IG1vZGUgbm8gYWNjZXMgdG8gYSBzZXJ2ZXIgaXMgZG9uZSwgYW5kIGlwIGlzIGludmVudGVkCisgICAgICAgICcnJworICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYubmFtZSA9ICJkaGNwX3RocmVhZCIKKyAgICAgICAgc2VsZi5kaGNwX3BhcmFtcyA9IGRoY3BfcGFyYW1zCisgICAgICAgIHNlbGYuZGVidWcgPSBkZWJ1ZworICAgICAgICBzZWxmLmRiID0gZGIKKyAgICAgICAgc2VsZi5kYl9sb2NrID0gZGJfbG9jaworICAgICAgICBzZWxmLnRlc3QgPSB0ZXN0CisgICAgICAgIHNlbGYuZGhjcF9uZXRzID0gZGhjcF9uZXRzCisgICAgICAgIHNlbGYuc3NoX2Nvbm4gPSBOb25lCisgICAgICAgIAorICAgICAgICBzZWxmLm1hY19zdGF0dXMgPXt9ICNkaWN0aW9uYXJ5IG9mIG1hY19hZGRyZXNzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uCisgICAgICAgICAgICAjaXA6IE5vbmUKKyAgICAgICAgICAgICNyZXRyaWVzOiAKKyAgICAgICAgICAgICNuZXh0X3JlYWRpbmc6IHRpbWUgZm9yIHRoZSBuZXh0IHRyeWluZyB0byBjaGVjayBBQ1RJVkUgc3RhdHVzIG9yIElQCisgICAgICAgICAgICAjY3JlYXRlZDogdGltZSB3aGVuIGl0IHdhcyBhZGRlZCAKKyAgICAgICAgICAgICNhY3RpdmU6IHRpbWUgd2hlbiB0aGUgVk0gYmVjb21lcyBpbnRvIEFDVElWRSBzdGF0dXMKKyAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgc2VsZi5xdWV1ZUxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYudGFza1F1ZXVlID0gUXVldWUuUXVldWUoMjAwMCkKKyAgICAgICAgCisgICAgZGVmIHNzaF9jb25uZWN0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjQ29ubmVjdCBTU0gKKyAgICAgICAgICAgIHNlbGYuc3NoX2Nvbm4gPSBwYXJhbWlrby5TU0hDbGllbnQoKQorICAgICAgICAgICAgc2VsZi5zc2hfY29ubi5zZXRfbWlzc2luZ19ob3N0X2tleV9wb2xpY3kocGFyYW1pa28uQXV0b0FkZFBvbGljeSgpKQorICAgICAgICAgICAgc2VsZi5zc2hfY29ubi5sb2FkX3N5c3RlbV9ob3N0X2tleXMoKQorICAgICAgICAgICAgc2VsZi5zc2hfY29ubi5jb25uZWN0KHNlbGYuZGhjcF9wYXJhbXNbImhvc3QiXSwgcG9ydD1zZWxmLmRoY3BfcGFyYW1zLmdldCgicG9ydCIsMjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPXNlbGYuZGhjcF9wYXJhbXNbInVzZXIiXSwgcGFzc3dvcmQ9c2VsZi5kaGNwX3BhcmFtcy5nZXQoInBhc3N3b3JkIiksIHBrZXk9c2VsZi5kaGNwX3BhcmFtcy5nZXQoImtleSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9MikKKyAgICAgICAgZXhjZXB0IHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICB0ZXh0ID0gZS5hcmdzWzBdCisgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IHNzaF9jb25uZWN0IHNzaCBFeGNlcHRpb246IiwgdGV4dAorICAgICAgICAKKyAgICBkZWYgbG9hZF9tYWNfZnJvbV9kYihzZWxmKToKKyAgICAgICAgI1RPRE8gZ2V0IG1hY3MgdG8gZm9sbG93IGZyb20gdGhlIGRhdGFiYXNlCisgICAgICAgIHByaW50IHNlbGYubmFtZSwgIiBsb2FkIG1hY3MgZnJvbSBkYiIKKyAgICAgICAgc2VsZi5kYl9sb2NrLmFjcXVpcmUoKQorICAgICAgICByLGMgPSBzZWxmLmRiLmdldF90YWJsZShTRUxFQ1Q9KCdtYWMnLCdpcF9hZGRyZXNzJywnbmV0cy51dWlkIGFzIG5ldF9pZCcsICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST009J3BvcnRzIGpvaW4gbmV0cyBvbiBwb3J0cy5uZXRfaWQ9bmV0cy51dWlkJywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFX05PVD17J3BvcnRzLmluc3RhbmNlX2lkJzogTm9uZSwgJ25ldHMucHJvdmlkZXInOiBOb25lfSkKKyAgICAgICAgc2VsZi5kYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLm1hY19zdGF0dXMgPXt9CisgICAgICAgIGlmIHI8MDoKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogRXJyb3IgZ2V0dGluZyBkYXRhIGZyb20gZGF0YWJhc2U6IiwgYworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBwb3J0IGluIGM6CisgICAgICAgICAgICBpZiBwb3J0WyJuZXRfaWQiXSBpbiBzZWxmLmRoY3BfbmV0czoKKyAgICAgICAgICAgICAgICBzZWxmLm1hY19zdGF0dXNbIHBvcnRbIm1hYyJdIF0gPSB7ImlwIjogcG9ydFsiaXBfYWRkcmVzcyJdLCAibmV4dF9yZWFkaW5nIjogbm93LCAiY3JlYXRlZCI6IG5vdywgInJldHJpZXMiOjB9CisgICAgCisgICAgZGVmIGluc2VydF90YXNrKHNlbGYsIHRhc2ssICphZGl0aW9uYWwpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnF1ZXVlTG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgIHRhc2sgPSBzZWxmLnRhc2tRdWV1ZS5wdXQoICh0YXNrLCkgKyBhZGl0aW9uYWwsIHRpbWVvdXQ9NSkgCisgICAgICAgICAgICBzZWxmLnF1ZXVlTG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgIHJldHVybiAxLCBOb25lCisgICAgICAgIGV4Y2VwdCBRdWV1ZS5GdWxsOgorICAgICAgICAgICAgcmV0dXJuIC0xLCAidGltZW91dCBpbnNlcnRpbmcgYSB0YXNrIG92ZXIgaG9zdCAiICsgc2VsZi5uYW1lCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBwcmludCBzZWxmLm5hbWUsICIgc3RhcnRpbmcsIG5ldHMiLCBzZWxmLmRoY3BfbmV0cyAKKyAgICAgICAgbmV4dF9pdGVyYXRpb24gPSB0aW1lLnRpbWUoKSArIDEwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLmxvYWRfbWFjX2Zyb21fZGIoKQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlTG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi50YXNrUXVldWUuZW1wdHkoKToKKyAgICAgICAgICAgICAgICAgICAgdGFzayA9IHNlbGYudGFza1F1ZXVlLmdldCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGFzayA9IE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlTG9jay5yZWxlYXNlKCkKKyAgICAKKyAgICAgICAgICAgICAgICBpZiB0YXNrIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG5vdz10aW1lLnRpbWUoKQorICAgICAgICAgICAgICAgICAgICBpZiBub3cgPj0gbmV4dF9pdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2l0ZXJhdGlvbiA9IHNlbGYuZ2V0X2lwX2Zyb21fZGhjcCgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICAgICAKKyAgICAKKyAgICAgICAgICAgICAgICBpZiB0YXNrWzBdID09ICdhZGQnOgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IHByb2Nlc3NpbmcgdGFzayBhZGQgbWFjIiwgdGFza1sxXQorICAgICAgICAgICAgICAgICAgICBub3c9dGltZS50aW1lKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWNfc3RhdHVzW3Rhc2tbMV0gXSA9IHsiaXAiOiBOb25lLCAibmV4dF9yZWFkaW5nIjogbm93LCAiY3JlYXRlZCI6IG5vdywgInJldHJpZXMiOjB9CisgICAgICAgICAgICAgICAgICAgIG5leHRfaXRlcmF0aW9uID0gbm93CisgICAgICAgICAgICAgICAgZWxpZiB0YXNrWzBdID09ICdkZWwnOgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IHByb2Nlc3NpbmcgdGFzayBkZWwgbWFjIiwgdGFza1sxXQorICAgICAgICAgICAgICAgICAgICBpZiB0YXNrWzFdIGluIHNlbGYubWFjX3N0YXR1czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLm1hY19zdGF0dXNbdGFza1sxXSBdCisgICAgICAgICAgICAgICAgZWxpZiB0YXNrWzBdID09ICdleGl0JzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBwcm9jZXNzaW5nIHRhc2sgZXhpdCIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXJtaW5hdGUoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogdW5rbm93biB0YXNrIiwgdGFzaworICAgICAgICAgIAorICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuc3NoX2Nvbm46CisgICAgICAgICAgICAgICAgc2VsZi5zc2hfY29ubi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHRleHQgPSBzdHIoZSkKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogdGVybWluYXRlIEV4Y2VwdGlvbjoiLCB0ZXh0CisgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZXhpdCBmcm9tIGhvc3RfdGhyZWFkIiAKKworICAgIGRlZiBnZXRfaXBfZnJvbV9kaGNwKHNlbGYpOgorICAgICAgICAKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgbmV4dF9pdGVyYXRpb249IG5vdyArIDQwMDAwICMgPjEwIGhvcmVzCisgICAgICAgIAorICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAiSXRlcmF0aW9uIiAKKyAgICAgICAgZm9yIG1hY19hZGRyZXNzIGluIHNlbGYubWFjX3N0YXR1czoKKyAgICAgICAgICAgIGlmIG5vdyA8IHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bIm5leHRfcmVhZGluZyJdOgorICAgICAgICAgICAgICAgIGlmIHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bIm5leHRfcmVhZGluZyJdIDwgbmV4dF9pdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIG5leHRfaXRlcmF0aW9uID0gc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXVsibmV4dF9yZWFkaW5nIl0KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdLmdldCgiYWN0aXZlIikgPT0gTm9uZToKKyAgICAgICAgICAgICAgICAjY2hlY2sgZnJvbSBkYiBpZiBhbHJlYWR5IGFjdGl2ZQorICAgICAgICAgICAgICAgIHNlbGYuZGJfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgICAgICByLGMgPSBzZWxmLmRiLmdldF90YWJsZShGUk9NPSJwb3J0cyBhcyBwIGpvaW4gaW5zdGFuY2VzIGFzIGkgb24gcC5pbnN0YW5jZV9pZD1pLnV1aWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFPXsicC5tYWMiOiBtYWNfYWRkcmVzcywgImkuc3RhdHVzIjogIkFDVElWRSJ9KQorICAgICAgICAgICAgICAgIHNlbGYuZGJfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICBpZiByPjA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bImFjdGl2ZSJdID0gbm93CisgICAgICAgICAgICAgICAgICAgIHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bIm5leHRfcmVhZGluZyJdID0gKGludChub3cpLzIgKzEpKiAyCisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIm1hYyAlcyAgVk0gQUNUSVZFIiAlIChtYWNfYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXVsicmV0cmllcyJdID0gMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICNwcmludCBzZWxmLm5hbWUsICJtYWMgJXMgIFZNIElOQUNUSVZFIiAlIChtYWNfYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgaWYgbm93IC0gc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXVsiY3JlYXRlZCJdID4gMzAwOgorICAgICAgICAgICAgICAgICAgICAgICAgI21vZGlmeSBEYXRhYmFzZSB0byB0ZWxsIG9wZW5tYW5vIHRoYXQgd2UgY2FuIG5vdCBnZXQgZGhjcCBmcm9tIHRoZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXS5nZXQoImlwIik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYl9sb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsYyA9IHNlbGYuZGIudXBkYXRlX3Jvd3MoInBvcnRzIiwgeyJpcF9hZGRyZXNzIjogIjAuMC4wLjAifSwgeyJtYWMiOiBtYWNfYWRkcmVzc30pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bImlwIl0gPSAiMC4wLjAuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICJtYWMgJXMgPj4gc2V0IHRvIDAuMC4wLjAgYmVjYXVzZSBvZiB0aW1lb3V0IiAlIChtYWNfYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bIm5leHRfcmVhZGluZyJdID0gKGludChub3cpLzYwICsxKSogNjAKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bIm5leHRfcmVhZGluZyJdID0gKGludChub3cpLzYgKzEpKiA2CisgICAgICAgICAgICAgICAgaWYgc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXVsibmV4dF9yZWFkaW5nIl0gPCBuZXh0X2l0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9pdGVyYXRpb24gPSBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJuZXh0X3JlYWRpbmciXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAKKworICAgICAgICAgICAgaWYgc2VsZi50ZXN0OgorICAgICAgICAgICAgICAgIGlmIHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bInJldHJpZXMiXT5yYW5kb20ucmFuZGludCgxMCwxMDApOiAjd2FpdCBiZXR3ZWVuIDEwIGFuZCAxMDAgc2Vjb25kcyB0byBwcm9kdWNlIGEgZmFrZSBJUAorICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gc2VsZi5nZXRfZmFrZV9pcCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IE5vbmUKKyAgICAgICAgICAgIGVsaWYgc2VsZi5kaGNwX3BhcmFtc1siaG9zdCJdPT0ibG9jYWxob3N0IjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBbJ2dldF9kaGNwX2xlYXNlLnNoJywgIG1hY19hZGRyZXNzXQorICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY29tbWFuZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBzdHIoZSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBnZXRfaXBfZnJvbV9kaGNwIHN1YnByb2Nlc3MgRXhjZXB0aW9uIiwgdGV4dAorICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNzaF9jb25uOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2hfY29ubmVjdCgpCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAnZ2V0X2RoY3BfbGVhc2Uuc2ggJyArICBtYWNfYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAoXywgc3Rkb3V0LCBfKSA9IHNlbGYuc3NoX2Nvbm4uZXhlY19jb21tYW5kKGNvbW1hbmQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzdGRvdXQucmVhZCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlLmFyZ3NbMF0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBnZXRfaXBfZnJvbV9kaGNwOiBzc2hfRXhjZXB0aW9uOiIsIHRleHQKKyAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2hfY29ubiA9IE5vbmUKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBzdHIoZSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBnZXRfaXBfZnJvbV9kaGNwOiBFeGNlcHRpb246IiwgdGV4dAorICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNzaF9jb25uID0gTm9uZQorCisgICAgICAgICAgICBpZiBjb250ZW50OgorICAgICAgICAgICAgICAgIHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bImlwIl0gPSBjb250ZW50CisgICAgICAgICAgICAgICAgI21vZGlmeSBEYXRhYmFzZQorICAgICAgICAgICAgICAgIHNlbGYuZGJfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgICAgICByLGMgPSBzZWxmLmRiLnVwZGF0ZV9yb3dzKCJwb3J0cyIsIHsiaXBfYWRkcmVzcyI6IGNvbnRlbnR9LCB7Im1hYyI6IG1hY19hZGRyZXNzfSkKKyAgICAgICAgICAgICAgICBzZWxmLmRiX2xvY2sucmVsZWFzZSgpCisgICAgICAgICAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IERhdGFiYXNlIHVwZGF0ZSBlcnJvcjoiLCBjCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXVsicmV0cmllcyJdID0gMAorICAgICAgICAgICAgICAgICAgICBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJuZXh0X3JlYWRpbmciXSA9IChpbnQobm93KS8zNjAwICsxKSogMzYwMDAgIyAxMCBob3JlcworICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJuZXh0X3JlYWRpbmciXSA8IG5leHRfaXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9pdGVyYXRpb24gPSBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJuZXh0X3JlYWRpbmciXQorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICJtYWMgJXMgPj4gJXMiICUgKG1hY19hZGRyZXNzLCBjb250ZW50KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgI2EgZmFpbCBoYXMgaGFwcGVuCisgICAgICAgICAgICBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJyZXRyaWVzIl0gKz0xCisgICAgICAgICAgICAjbmV4dCBpdGVyYXRpb24gaXMgZXZlcnkgMnNlYyBhdCB0aGUgYmVnaW5uaW5nOyBldmVyeSA1c2VjIGFmdGVyIGEgbWludXRlLCBldmVyeSAxbWluIGFmdGVyIGEgNW1pbgorICAgICAgICAgICAgaWYgbm93IC0gc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXVsiYWN0aXZlIl0gPiAxMjA6CisgICAgICAgICAgICAgICAgI21vZGlmeSBEYXRhYmFzZSB0byB0ZWxsIG9wZW5tYW5vIHRoYXQgd2UgY2FuIG5vdCBnZXQgZGhjcCBmcm9tIHRoZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc10uZ2V0KCJpcCIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRiX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICAgICAgICAgIHIsYyA9IHNlbGYuZGIudXBkYXRlX3Jvd3MoInBvcnRzIiwgeyJpcF9hZGRyZXNzIjogIjAuMC4wLjAifSwgeyJtYWMiOiBtYWNfYWRkcmVzc30pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGJfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXVsiaXAiXSA9ICIwLjAuMC4wIgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICJtYWMgJXMgPj4gc2V0IHRvIDAuMC4wLjAgYmVjYXVzZSBvZiB0aW1lb3V0IiAlIChtYWNfYWRkcmVzcykKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgbm93IC0gc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXVsiYWN0aXZlIl0gPiA2MDoKKyAgICAgICAgICAgICAgICBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJuZXh0X3JlYWRpbmciXSA9IChpbnQobm93KS82ICsxKSogNgorICAgICAgICAgICAgZWxpZiBub3cgLSBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJhY3RpdmUiXSA+IDMwMDoKKyAgICAgICAgICAgICAgICBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJuZXh0X3JlYWRpbmciXSA9IChpbnQobm93KS82MCArMSkqIDYwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubWFjX3N0YXR1c1ttYWNfYWRkcmVzc11bIm5leHRfcmVhZGluZyJdID0gKGludChub3cpLzIgKzEpKiAyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJuZXh0X3JlYWRpbmciXSA8IG5leHRfaXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIG5leHRfaXRlcmF0aW9uID0gc2VsZi5tYWNfc3RhdHVzW21hY19hZGRyZXNzXVsibmV4dF9yZWFkaW5nIl0KKyAgICAgICAgcmV0dXJuIG5leHRfaXRlcmF0aW9uICAgIAorICAgIAorICAgIGRlZiBnZXRfZmFrZV9pcChzZWxmKToKKyAgICAgICAgZmFrZV9pcD0gICAiMTkyLjE2OC4lZC4lZCIgJSAocmFuZG9tLnJhbmRpbnQoMSwyNTQpLCByYW5kb20ucmFuZGludCgxLDI1NCkgKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgI2NoZWNrIG5vdCBhbHJlYWR5IHByb3ZpZGVkCisgICAgICAgICAgICBhbHJlYWR5X3VzZWQgPSBGYWxzZQorICAgICAgICAgICAgZm9yIG1hY19hZGRyZXNzIGluIHNlbGYubWFjX3N0YXR1czoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm1hY19zdGF0dXNbbWFjX2FkZHJlc3NdWyJpcCJdID09IGZha2VfaXA6CisgICAgICAgICAgICAgICAgICAgIGFscmVhZHlfdXNlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG5vdCBhbHJlYWR5X3VzZWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZha2VfaXAKKworCisjRVhBTVBMRSBvZiBiYXNoIHNjcmlwdCB0aGF0IG11c3QgYmUgYXZhaWxhYmxlIGF0IHRoZSBESENQIHNlcnZlciBmb3IgImlzYy1kaGNwLXNlcnZlciIgdHlwZQorIyAgICAgJCBjYXQgLi9nZXRfZGhjcF9sZWFzZS5zaAorIyAgICAgIyEvYmluL2Jhc2gKKyMgICAgIGF3ayAnCisjICAgICAoJDE9PSJsZWFzZSIgJiYgJDM9PSJ7Iil7IGxlYXNlPSQyOyBhY3RpdmU9Im5vIjsgZm91bmQ9Im5vIiB9CisjICAgICAoJDE9PSJiaW5kaW5nIiAmJiAkMj09InN0YXRlIiAmJiAkMz09ImFjdGl2ZTsiKXsgYWN0aXZlPSJ5ZXMiIH0KKyMgICAgICgkMT09ImhhcmR3YXJlIiAmJiAkMj09ImV0aGVybmV0IiAmJiAkMz09dG9sb3dlcigiJyQxJzsiKSl7IGZvdW5kPSJ5ZXMiIH0KKyMgICAgICgkMT09ImNsaWVudC1ob3N0bmFtZSIpeyBuYW1lPSQyIH0KKyMgICAgICgkMT09In0iKXsgaWYgKGFjdGl2ZT09InllcyIgJiYgZm91bmQ9PSJ5ZXMiKXsgdGFyZ2V0X2xlYXNlPWxlYXNlOyB0YXJnZXRfbmFtZT1uYW1lfX0KKyMgICAgIEVORHtwcmludGYoIiVzIiwgdGFyZ2V0X2xlYXNlKX0gI3ByaW50IHRhcmdldF9uYW1lCisjICAgICAnIC92YXIvbGliL2RoY3AvZGhjcGQubGVhc2VzCisKKyAKZGlmZiAtLWdpdCBhL2Zsb29kbGlnaHQucHkgYi9mbG9vZGxpZ2h0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNmI2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mbG9vZGxpZ2h0LnB5CkBAIC0wLDAgKzEsNDQxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogdXRmLTggLSotCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKycnJworSW1wbGVtZW50IHRoZSBwbHVnZ2luZyBmb3IgZmxvb2RsaWd0aCBvcGVuZmxvdyBjb250cm9sbGVyCitJdCBjcmVhdGVzIHRoZSBjbGFzcyBPRl9jb25uIHRvIGNyZWF0ZSBkYXRhcGxhbmUgY29ubmVjdGlvbnMKK3dpdGggc3RhdGljIHJ1bGVzIGJhc2VkIG9uIHBhY2tldCBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworJycnCisKK19fYXV0aG9yX189IlBhYmxvIE1vbnRlcywgQWxmb25zbyBUaWVybm8iCitfX2RhdGVfXyA9IiQyOC1vY3QtMjAxNCAxMjowNzoxNSQiCisKKworaW1wb3J0IGpzb24KK2ltcG9ydCByZXF1ZXN0cworaW1wb3J0IGxvZ2dpbmcKKworY2xhc3MgT0ZfY29ubigpOgorICAgICcnJyBPcGVuZmxvdyBDb25uZWN0b3IgZm9yIEZsb29kbGlnaHQuCisgICAgICAgICBObyBNQUMgbGVhcm5pbmcgaXMgdXNlZAorICAgICAgICB2ZXJzaW9uIDAuOSBvciAxLlggaXMgYXV0b2RldGVjdGVkCisgICAgICAgIHZlcnNpb24gMS5YIGlzIGluIHByb2dyZXNzLCBub3QgZmluaXNoZWQhISEKKyAgICAnJycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyYW1zKToKKyAgICAgICAgJycnIENvbnN0cnVjdG9yLiAKKyAgICAgICAgICAgIHBhcmFtcyBpcyBhIGRpY3Rpb25heSB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKKyAgICAgICAgICAgICAgICBvZl9kcGlkOiAgICAgRFBJRCB0byB1c2UgZm9yIHRoaXMgY29udHJvbGxlcgorICAgICAgICAgICAgICAgIG9mX2lwOiAgICAgICBjb250cm9sbGVyIElQIGFkZHJlc3MKKyAgICAgICAgICAgICAgICBvZl9wb3J0OiAgICAgY29udHJvbGxlciBUQ1AgcG9ydAorICAgICAgICAgICAgICAgIG9mX3ZlcnNpb246ICB2ZXJzaW9uLCBjYW4gYmUgIjAuOSIgb3IgIjEuWCIuIEJ5IGRlZmF1bHQgaXQgaXMgYXV0b2RldGVjdGVkCisgICAgICAgICAgICAgICAgb2ZfZGVidWc6ICAgIGRlYnVnIGxldmVsIGZvciBsb2dnaW5nLiBEZWZhdWx0IHRvIEVSUk9SCisgICAgICAgICAgICAgICAgb3RoZXIga2V5cyBhcmUgaWdub3JlZAorICAgICAgICAgICAgUmFpc2UgYW4gZXhjZXB0aW9uIGlmIHNhbWUgcGFyYW1ldGVyIGlzIG1pc3Npbmcgb3Igd3JvbmcKKyAgICAgICAgJycnCisgICAgICAgICNjaGVjayBwYXJhbXMKKyAgICAgICAgaWYgIm9mX2lwIiBub3QgaW4gcGFyYW1zIG9yIHBhcmFtc1sib2ZfaXAiXT09Tm9uZSBvciAib2ZfcG9ydCIgbm90IGluIHBhcmFtcyBvciBwYXJhbXNbIm9mX3BvcnQiXT09Tm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIklQIGFkZHJlc3MgYW5kIHBvcnQgbXVzdCBiZSBwcm92aWRlZCIpCisKKyAgICAgICAgc2VsZi5uYW1lID0gIkZsb29kbGlnaHQiCisgICAgICAgIHNlbGYuZHBpZCA9IHN0cihwYXJhbXNbIm9mX2RwaWQiXSkKKyAgICAgICAgc2VsZi51cmwgPSAiaHR0cDovLyVzOiVzIiAlKCBzdHIocGFyYW1zWyJvZl9pcCJdKSwgc3RyKHBhcmFtc1sib2ZfcG9ydCJdKSApCisKKyAgICAgICAgc2VsZi5wcDJvZmk9e30gICMgRnJvbSBQaHlzaWNhbCBQb3J0IHRvIE9wZW5GbG93IEluZGV4CisgICAgICAgIHNlbGYub2ZpMnBwPXt9ICAjIEZyb20gT3BlbkZsb3cgSW5kZXggdG8gUGh5c2ljYWwgUG9ydAorICAgICAgICBzZWxmLmhlYWRlcnMgPSB7J2NvbnRlbnQtdHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nLCAnQWNjZXB0JzonYXBwbGljYXRpb24vanNvbid9CisgICAgICAgIHNlbGYudmVyc2lvbj0gTm9uZQorICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCd2aW0uT0YuRkwnKQorICAgICAgICBzZWxmLmxvZ2dlci5zZXRMZXZlbCggZ2V0YXR0cihsb2dnaW5nLCBwYXJhbXMuZ2V0KCJvZl9kZWJ1ZyIsICJFUlJPUiIpICkgKQorICAgICAgICBzZWxmLl9zZXRfdmVyc2lvbihwYXJhbXMuZ2V0KCJvZl92ZXJzaW9uIikgKQorICAgIAorICAgIGRlZiBfc2V0X3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CisgICAgICAgICcnJ3NldCB1cCBhIHZlcnNpb24gb2YgdGhlIGNvbnRyb2xsZXIuCisgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gaXQgZmlsbHMgdGhlIHNlbGYudmVyX25hbWVzIHdpdGggdGhlIG5hbWluZyB1c2VkIGluIHRoaXMgdmVyc2lvbgorICAgICAgICAnJycKKyAgICAgICAgI3N0YXRpYyB2ZXJzaW9uIG5hbWVzCisgICAgICAgIGlmIHZlcnNpb249PU5vbmU6CisgICAgICAgICAgICBzZWxmLnZlcnNpb249IE5vbmUKKyAgICAgICAgZWxpZiB2ZXJzaW9uPT0iMC45IjoKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbj0gdmVyc2lvbgorICAgICAgICAgICAgc2VsZi5uYW1lID0gIkZsb29kbGlnaHR2MC45IgorICAgICAgICAgICAgc2VsZi52ZXJfbmFtZXM9eworICAgICAgICAgICAgICAgICJkcGlkIjogICAgICAgICAiZHBpZCIsCisgICAgICAgICAgICAgICAgIlVSTG1vZGlmaWVyIjogICJzdGF0aWNmbG93ZW50cnlwdXNoZXIiLAorICAgICAgICAgICAgICAgICJkZXN0bWFjIjogICAgICAiZHN0LW1hYyIsCisgICAgICAgICAgICAgICAgInZsYW5pZCI6ICAgICAgICJ2bGFuLWlkIiwKKyAgICAgICAgICAgICAgICAiaW5wb3J0IjogICAgICAgImluZ3Jlc3MtcG9ydCIsCisgICAgICAgICAgICAgICAgInNldHZsYW4iOiAgICAgICJzZXQtdmxhbi1pZCIsCisgICAgICAgICAgICAgICAgInN0cmlwdmxhbiI6ICAgICJzdHJpcC12bGFuIiwKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxpZiB2ZXJzaW9uWzBdPT0iMSIgOiAjdmVyc2lvbiAxLlgKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbj0gdmVyc2lvbgorICAgICAgICAgICAgc2VsZi5uYW1lID0gIkZsb29kbGlnaHR2MS5YIgorICAgICAgICAgICAgc2VsZi52ZXJfbmFtZXM9eworICAgICAgICAgICAgICAgICJkcGlkIjogICAgICAgICAic3dpdGNoRFBJRCIsCisgICAgICAgICAgICAgICAgIlVSTG1vZGlmaWVyIjogICJzdGF0aWNmbG93cHVzaGVyIiwKKyAgICAgICAgICAgICAgICAiZGVzdG1hYyI6ICAgICAgImV0aF9kc3QiLAorICAgICAgICAgICAgICAgICJ2bGFuaWQiOiAgICAgICAiZXRoX3ZsYW5fdmlkIiwKKyAgICAgICAgICAgICAgICAiaW5wb3J0IjogICAgICAgImluX3BvcnQiLAorICAgICAgICAgICAgICAgICJzZXR2bGFuIjogICAgICAic2V0X3ZsYW5fdmlkIiwKKyAgICAgICAgICAgICAgICAic3RyaXB2bGFuIjogICAgInN0cmlwX3ZsYW4iLAorICAgICAgICAgICAgfQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCB2ZXJzaW9uIGZvciBmbG9vZGxpZ2h0IGNvbnRyb2xsZXIiKQorICAgICAgICAgICAgCisgICAgZGVmIGdldF9vZl9zd2l0Y2hlcyhzZWxmKToKKyAgICAgICAgJycnIE9idGFpbiBhIGEgbGlzdCBvZiBzd2l0Y2hlcyBvciBEUElEIGRldGVjdGVkIGJ5IHRoaXMgY29udHJvbGxlcgorICAgICAgICAgICAgUmV0dXJuCisgICAgICAgICAgICAgICAgPj0wLCBsaXN0OiAgICAgIGxpc3QgbGVuZ3RoLCBhbmQgYSBsaXN0IHdoZXJlIGVhY2ggZWxlbWVudCBhIHR1cGxlIHBhaXIgKERQSUQsIElQIGFkZHJlc3MpCisgICAgICAgICAgICAgICAgPDAsIHRleHRfZXJyb3I6IGlmIGZhaWxzCisgICAgICAgICcnJyAgCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9mX3Jlc3BvbnNlID0gcmVxdWVzdHMuZ2V0KHNlbGYudXJsKyIvd20vY29yZS9jb250cm9sbGVyL3N3aXRjaGVzL2pzb24iLCBoZWFkZXJzPXNlbGYuaGVhZGVycykKKyAgICAgICAgICAgIGVycm9yX3RleHQgPSAiT3BlbmZsb3cgcmVzcG9uc2UgJWQ6ICVzIiAlIChvZl9yZXNwb25zZS5zdGF0dXNfY29kZSwgb2ZfcmVzcG9uc2UudGV4dCkKKyAgICAgICAgICAgIGlmIG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlICE9IDIwMDoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci53YXJuaW5nKCJnZXRfb2Zfc3dpdGNoZXMgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xICwgZXJyb3JfdGV4dAorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoImdldF9vZl9zd2l0Y2hlcyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIGluZm8gPSBvZl9yZXNwb25zZS5qc29uKCkKKyAgICAgICAgICAgIGlmIHR5cGUoaW5mbykgIT0gbGlzdCBhbmQgdHlwZShpbmZvKSAhPSB0dXBsZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiZ2V0X29mX3N3aXRjaGVzLiBVbmV4cGVjdGVkIHJlc3BvbnNlIG5vdCBhIGxpc3QgJXMiLCBzdHIodHlwZShpbmZvKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAiVW5leHBlY3RlZCByZXNwb25zZSwgbm90IGEgbGlzdC4gV3JvbmcgdmVyc2lvbj8iCisgICAgICAgICAgICBpZiBsZW4oaW5mbyk9PTA6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAsIGluZm8KKyAgICAgICAgICAgICNhdXRvZGlzY292ZXIgdmVyc2lvbgorICAgICAgICAgICAgaWYgc2VsZi52ZXJzaW9uID09IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgJ2RwaWQnIGluIGluZm9bMF0gYW5kICdpbmV0QWRkcmVzcycgaW4gaW5mb1swXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2V0X3ZlcnNpb24oIjAuOSIpCisgICAgICAgICAgICAgICAgZWxpZiAnc3dpdGNoRFBJRCcgaW4gaW5mb1swXSBhbmQgJ2luZXRBZGRyZXNzJyBpbiBpbmZvWzBdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZXRfdmVyc2lvbigiMS5YIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiZ2V0X29mX3N3aXRjaGVzLiBVbmV4cGVjdGVkIHJlc3BvbnNlLCBub3QgZm91bmQgJ2RwaWQnIG9yICdzd2l0Y2hEUElEJyBmaWVsZDogJXMiLCBzdHIoaW5mb1swXSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSwgIlVuZXhwZWN0ZWQgcmVzcG9uc2UsIG5vdCBmb3VuZCAnZHBpZCcgb3IgJ3N3aXRjaERQSUQnIGZpZWxkLiBXcm9uZyB2ZXJzaW9uPyIKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3dpdGNoX2xpc3Q9W10KKyAgICAgICAgICAgIGZvciBzd2l0Y2ggaW4gaW5mbzoKKyAgICAgICAgICAgICAgICBzd2l0Y2hfbGlzdC5hcHBlbmQoIChzd2l0Y2hbIHNlbGYudmVyX25hbWVzWyJkcGlkIl0gXSwgc3dpdGNoWydpbmV0QWRkcmVzcyddKSApCisgICAgICAgICAgICByZXR1cm4gbGVuKHN3aXRjaF9saXN0KSwgc3dpdGNoX2xpc3QKKyAgICAgICAgZXhjZXB0IChyZXF1ZXN0cy5leGNlcHRpb25zLlJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAjVmFsdWVFcnJvciBpbiB0aGUgY2FzZSB0aGF0IEpTT04gY2FuIG5vdCBiZSBkZWNvZGVkCisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gdHlwZShlKS5fX25hbWVfXyArICI6ICIgKyBzdHIoZSkKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJnZXRfb2Zfc3dpdGNoZXMgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX3RleHQKKworICAgIGRlZiBnZXRfb2ZfcnVsZXMoc2VsZiwgdHJhbnNsYXRlX29mX3BvcnRzPVRydWUpOgorICAgICAgICAnJycgT2J0YWluIHRoZSBydWxlcyBpbnNlcnRlZCBhdCBvcGVuZmxvdyBjb250cm9sbGVyCisgICAgICAgICAgICBQYXJhbXM6CisgICAgICAgICAgICAgICAgdHJhbnNsYXRlX29mX3BvcnRzOiBpZiBUcnVlIGl0IHRyYW5zbGF0ZXMgcG9ydHMgZnJvbSBvcGVuZmxvdyBpbmRleCB0byBwaHlzaWNhbCBzd2l0Y2ggbmFtZQorICAgICAgICAgICAgUmV0dXJuOgorICAgICAgICAgICAgICAgIDAsIGRpY3QgaWYgb2s6IHdpdGggdGhlIHJ1bGUgbmFtZSBhcyBrZXkgYW5kIHZhbHVlIGlzIGFub3RoZXIgZGljdGlvbmFyeSB3aXRoIHRoZSBmb2xsb3dpbmcgY29udGVudDoKKyAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IHJ1bGUgcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgbmFtZTogICAgICAgICBydWxlIG5hbWUgKHByZXNlbnQgYWxzbyBhcyB0aGUgbWFzdGVyIGRpY3Qga2V5KQorICAgICAgICAgICAgICAgICAgICBpbmdyZXNzX3BvcnQ6IG1hdGNoIGlucHV0IHBvcnQgb2YgdGhlIHJ1bGUKKyAgICAgICAgICAgICAgICAgICAgZHN0X21hYzogICAgICBtYXRjaCBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgcnVsZSwgY2FuIGJlIG1pc3Npbmcgb3IgTm9uZSBpZiBub3QgYXBwbHkKKyAgICAgICAgICAgICAgICAgICAgdmxhbl9pZDogICAgICBtYXRjaCB2bGFuIHRhZyBvZiB0aGUgcnVsZSwgY2FuIGJlIG1pc3Npbmcgb3IgTm9uZSBpZiBub3QgYXBwbHkKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogICAgICBsaXN0IG9mIGFjdGlvbnMsIGNvbXBvc2VkIGJ5IGEgcGFpciB0dXBsZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAodmxhbiwgTm9uZS9pbnQpOiBmb3Igc3RyaXBwaW5nL3NldHRpbmcgYSB2bGFuIHRhZworICAgICAgICAgICAgICAgICAgICAgICAgKG91dCwgcG9ydCk6ICAgICAgc2VuZCB0byB0aGlzIHBvcnQgCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaDogICAgICAgRFBJRCwgYWxsIAorICAgICAgICAgICAgICAgIC0xLCB0ZXh0X2Vycm9yIGlmIGZhaWxzCisgICAgICAgICcnJyAgIAorICAgICAgICAKKyAgICAgICAgI2dldCB0cmFuc2xhdGlvbiwgYXV0b2Rpc2NvdmVyIHZlcnNpb24KKyAgICAgICAgaWYgbGVuKHNlbGYub2ZpMnBwKSA9PSAwOgorICAgICAgICAgICAgcixjID0gc2VsZi5vYnRhaW5fcG9ydF9jb3JyZXNwb25kZW5jZSgpCisgICAgICAgICAgICBpZiByPDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHIsYworICAgICAgICAjZ2V0IHJ1bGVzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9mX3Jlc3BvbnNlID0gcmVxdWVzdHMuZ2V0KHNlbGYudXJsKyIvd20vJXMvbGlzdC8lcy9qc29uIiAlKHNlbGYudmVyX25hbWVzWyJVUkxtb2RpZmllciJdLCBzZWxmLmRwaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9c2VsZi5oZWFkZXJzKQorICAgICAgICAgICAgZXJyb3JfdGV4dCA9ICJPcGVuZmxvdyByZXNwb25zZSAlZDogJXMiICUgKG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlLCBvZl9yZXNwb25zZS50ZXh0KQorICAgICAgICAgICAgaWYgb2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUgIT0gMjAwOgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcoImdldF9vZl9ydWxlcyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEgLCBlcnJvcl90ZXh0CisgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygiZ2V0X29mX3J1bGVzICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgaW5mbyA9IG9mX3Jlc3BvbnNlLmpzb24oKQorICAgICAgICAgICAgaWYgdHlwZShpbmZvKSAhPSBkaWN0OgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJnZXRfb2ZfcnVsZXMuIFVuZXhwZWN0ZWQgcmVzcG9uc2Ugbm90IGEgZGljdCAlcyIsIHN0cih0eXBlKGluZm8pKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJVbmV4cGVjdGVkIHJlc3BvbnNlLCBub3QgYSBkaWN0LiBXcm9uZyB2ZXJzaW9uPyIKKyAgICAgICAgICAgIHJ1bGVfZGljdD17fQorICAgICAgICAgICAgZm9yIHN3aXRjaCxzd2l0Y2hfaW5mbyBpbiBpbmZvLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIHN3aXRjaF9pbmZvID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgc3RyKHN3aXRjaCkgIT0gc2VsZi5kcGlkOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZvciBuYW1lLGRldGFpbHMgaW4gc3dpdGNoX2luZm8uaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHJ1bGUgPSB7fQorICAgICAgICAgICAgICAgICAgICBydWxlWyJzd2l0Y2giXSA9IHN0cihzd2l0Y2gpCisgICAgICAgICAgICAgICAgICAgICNydWxlWyJhY3RpdmUiXSA9ICJ0cnVlIgorICAgICAgICAgICAgICAgICAgICBydWxlWyJwcmlvcml0eSJdID0gaW50KGRldGFpbHNbInByaW9yaXR5Il0pCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyc2lvblswXT09IjAiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhbnNsYXRlX29mX3BvcnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVbImluZ3Jlc3NfcG9ydCJdID0gc2VsZi5vZmkycHBbIGRldGFpbHNbIm1hdGNoIl1bImlucHV0UG9ydCJdIF0gCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVbImluZ3Jlc3NfcG9ydCJdID0gc3RyKGRldGFpbHNbIm1hdGNoIl1bImlucHV0UG9ydCJdKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X21hYyA9IGRldGFpbHNbIm1hdGNoIl1bImRhdGFMYXllckRlc3RpbmF0aW9uIl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRzdF9tYWMgIT0gIjAwOjAwOjAwOjAwOjAwOjAwIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlWyJkc3RfbWFjIl0gPSBkc3RfbWFjCisgICAgICAgICAgICAgICAgICAgICAgICB2bGFuID0gZGV0YWlsc1sibWF0Y2giXVsiZGF0YUxheWVyVmlydHVhbExhbiJdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2bGFuICE9IC0xOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVbInZsYW5faWQiXSA9IHZsYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbmxpc3Q9W10KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhY3Rpb24gaW4gZGV0YWlsc1siYWN0aW9ucyJdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFjdGlvblsidHlwZSJdPT0iT1VUUFVUIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhbnNsYXRlX29mX3BvcnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IHNlbGYub2ZpMnBwWyBhY3Rpb25bInBvcnQiXSBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gYWN0aW9uWyJwb3J0Il0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ubGlzdC5hcHBlbmQoICgib3V0IiwgcG9ydCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgYWN0aW9uWyJ0eXBlIl09PSJTVFJJUF9WTEFOIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ubGlzdC5hcHBlbmQoICgidmxhbiIsTm9uZSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgYWN0aW9uWyJ0eXBlIl09PSJTRVRfVkxBTl9JRCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbmxpc3QuYXBwZW5kKCAoInZsYW4iLCBhY3Rpb25bInZpcnR1YWxMYW5JZGVudGlmaWVyIl0pICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25saXN0LmFwcGVuZCggKGFjdGlvblsidHlwZSJdLCBzdHIoYWN0aW9uKSApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci53YXJuaW5nKCJnZXRfb2ZfcnVsZXMoKSBVbmtub3duIGFjdGlvbiBpbiBydWxlICVzOiAlcyIsIHJ1bGVbIm5hbWUiXSwgc3RyKGFjdGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZVsiYWN0aW9ucyJdID0gYWN0aW9ubGlzdAorICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYudmVyc2lvblswXT09IjEiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhbnNsYXRlX29mX3BvcnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVbImluZ3Jlc3NfcG9ydCJdID0gc2VsZi5vZmkycHBbIGRldGFpbHNbIm1hdGNoIl1bImluX3BvcnQiXSBdCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVbImluZ3Jlc3NfcG9ydCJdID0gZGV0YWlsc1sibWF0Y2giXVsiaW5fcG9ydCJdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAiZXRoX2RzdCIgaW4gZGV0YWlsc1sibWF0Y2giXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfbWFjID0gZGV0YWlsc1sibWF0Y2giXVsiZXRoX2RzdCJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZHN0X21hYyAhPSAiMDA6MDA6MDA6MDA6MDA6MDAiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlWyJkc3RfbWFjIl0gPSBkc3RfbWFjCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAiZXRoX3ZsYW5fdmlkIiBpbiBkZXRhaWxzWyJtYXRjaCJdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYW4gPSBpbnQoZGV0YWlsc1sibWF0Y2giXVsiZXRoX3ZsYW5fdmlkIl0sMTYpICYgMHhGRkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlWyJ2bGFuX2lkIl0gPSBzdHIodmxhbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbmxpc3Q9W10KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhY3Rpb24gaW4gZGV0YWlsc1siaW5zdHJ1Y3Rpb25zIl1bImluc3RydWN0aW9uX2FwcGx5X2FjdGlvbnMiXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhY3Rpb249PSJvdXRwdXQiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cmFuc2xhdGVfb2ZfcG9ydHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gc2VsZi5vZmkycHBbIGRldGFpbHNbImluc3RydWN0aW9ucyJdWyJpbnN0cnVjdGlvbl9hcHBseV9hY3Rpb25zIl1bIm91dHB1dCJdIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBkZXRhaWxzWyJpbnN0cnVjdGlvbnMiXVsiaW5zdHJ1Y3Rpb25fYXBwbHlfYWN0aW9ucyJdWyJvdXRwdXQiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25saXN0LmFwcGVuZCggKCJvdXQiLHBvcnQpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGFjdGlvbj09InN0cmlwX3ZsYW4iOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25saXN0LmFwcGVuZCggKCJ2bGFuIixOb25lKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBhY3Rpb249PSJzZXRfdmxhbl92aWQiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25saXN0LmFwcGVuZCggKCJ2bGFuIiwgZGV0YWlsc1siaW5zdHJ1Y3Rpb25zIl1bImluc3RydWN0aW9uX2FwcGx5X2FjdGlvbnMiXVsic2V0X3ZsYW5fdmlkIl0pICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiZ2V0X29mX3J1bGVzIFVua25vd24gYWN0aW9uIGluIHJ1bGUgJXM6ICVzIiwgcnVsZVsibmFtZSJdLCBzdHIoYWN0aW9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2FjdGlvbmxpc3QuYXBwZW5kKCAoYWN0aW9uLCBzdHIoZGV0YWlsc1siaW5zdHJ1Y3Rpb25zIl1bImluc3RydWN0aW9uX2FwcGx5X2FjdGlvbnMiXSkgKSkKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9kaWN0W3N0cihuYW1lKV0gPSBydWxlCisgICAgICAgICAgICByZXR1cm4gMCwgcnVsZV9kaWN0CisgICAgICAgIGV4Y2VwdCAocmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uLCBWYWx1ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgI1ZhbHVlRXJyb3IgaW4gdGhlIGNhc2UgdGhhdCBKU09OIGNhbiBub3QgYmUgZGVjb2RlZAorICAgICAgICAgICAgZXJyb3JfdGV4dCA9IHR5cGUoZSkuX19uYW1lX18gKyAiOiAiICsgc3RyKGUpCisgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiZ2V0X29mX3J1bGVzICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgcmV0dXJuIC0xLCBlcnJvcl90ZXh0CisKKyAgICBkZWYgb2J0YWluX3BvcnRfY29ycmVzcG9uZGVuY2Uoc2VsZik6CisgICAgICAgICcnJ09idGFpbiB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBwaHlzaWNhbCBhbmQgb3BlbmZsb3cgcG9ydCBuYW1lcworICAgICAgICByZXR1cm46CisgICAgICAgICAgICAgMCwgZGljdGlvbmFyeTogd2l0aCBwaHlzaWNhbCBuYW1lIGFzIGtleSwgb3BlbmZsb3cgbmFtZSBhcyB2YWx1ZQorICAgICAgICAgICAgLTEsIGVycm9yX3RleHQ6IGlmIGZhaWxzCisgICAgICAgICcnJworICAgICAgICB0cnk6CisgICAgICAgICAgICBvZl9yZXNwb25zZSA9IHJlcXVlc3RzLmdldChzZWxmLnVybCsiL3dtL2NvcmUvY29udHJvbGxlci9zd2l0Y2hlcy9qc29uIiwgaGVhZGVycz1zZWxmLmhlYWRlcnMpCisgICAgICAgICAgICAjcHJpbnQgdmltX3Jlc3BvbnNlLnN0YXR1c19jb2RlCisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gIk9wZW5mbG93IHJlc3BvbnNlICVkOiAlcyIgJSAob2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIG9mX3Jlc3BvbnNlLnRleHQpCisgICAgICAgICAgICBpZiBvZl9yZXNwb25zZS5zdGF0dXNfY29kZSAhPSAyMDA6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIud2FybmluZygib2J0YWluX3BvcnRfY29ycmVzcG9uZGVuY2UgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xICwgZXJyb3JfdGV4dAorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoIm9idGFpbl9wb3J0X2NvcnJlc3BvbmRlbmNlICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgaW5mbyA9IG9mX3Jlc3BvbnNlLmpzb24oKQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiB0eXBlKGluZm8pICE9IGxpc3QgYW5kIHR5cGUoaW5mbykgIT0gdHVwbGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAidW5leHBlY3RlZCBvcGVuZmxvdyByZXNwb25zZSwgbm90IGEgbGlzdC4gV3JvbmcgdmVyc2lvbj8iCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZGV4ID0gLTEKKyAgICAgICAgICAgIGlmIGxlbihpbmZvKT4wOgorICAgICAgICAgICAgICAgICNhdXRvZGlzY292ZXIgdmVyc2lvbgorICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyc2lvbiA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiAnZHBpZCcgaW4gaW5mb1swXSBhbmQgJ3BvcnRzJyBpbiBpbmZvWzBdOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2V0X3ZlcnNpb24oIjAuOSIpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgJ3N3aXRjaERQSUQnIGluIGluZm9bMF06CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZXRfdmVyc2lvbigiMS5YIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSwgInVuZXhwZWN0ZWQgb3BlbmZsb3cgcmVzcG9uc2UsIFdyb25nIHZlcnNpb24/IgorCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLGxlbihpbmZvKSk6CisgICAgICAgICAgICAgICAgaWYgaW5mb1tpXVsgc2VsZi52ZXJfbmFtZXNbImRwaWQiXSBdID09IHNlbGYuZHBpZDoKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBpbmRleCA9PSAtMToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gIkRQSUQgJyIrc2VsZi5kcGlkKyInIG5vdCBwcmVzZW50IGluIGNvbnRyb2xsZXIgIitzZWxmLnVybAorICAgICAgICAgICAgICAgICNwcmludCBzZWxmLm5hbWUsICI6IGdldF9vZl9jb250cm9sbGVyX2luZm8gRVJST1IiLCB0ZXh0IAorICAgICAgICAgICAgICAgIHJldHVybiAtMSwgdGV4dAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcnNpb25bMF09PSIwIjoKKyAgICAgICAgICAgICAgICAgICAgcG9ydHMgPSBpbmZvW2luZGV4XVsicG9ydHMiXQorICAgICAgICAgICAgICAgIGVsc2U6ICN2ZXJzaW9uIDEuWAorICAgICAgICAgICAgICAgICAgICBvZl9yZXNwb25zZSA9IHJlcXVlc3RzLmdldChzZWxmLnVybCsiL3dtL2NvcmUvc3dpdGNoLyVzL3BvcnQtZGVzYy9qc29uIiAlc2VsZi5kcGlkLCBoZWFkZXJzPXNlbGYuaGVhZGVycykKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50IHZpbV9yZXNwb25zZS5zdGF0dXNfY29kZQorICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0ID0gIk9wZW5mbG93IHJlc3BvbnNlICVkOiAlcyIgJSAob2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIG9mX3Jlc3BvbnNlLnRleHQpCisgICAgICAgICAgICAgICAgICAgIGlmIG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlICE9IDIwMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcoIm9idGFpbl9wb3J0X2NvcnJlc3BvbmRlbmNlICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICwgZXJyb3JfdGV4dAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1Zygib2J0YWluX3BvcnRfY29ycmVzcG9uZGVuY2UgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBvZl9yZXNwb25zZS5qc29uKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShpbmZvKSAhPSBkaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAidW5leHBlY3RlZCBvcGVuZmxvdyBwb3J0LWRlc2MgcmVzcG9uc2UsIG5vdCBhIGRpY3QuIFdyb25nIHZlcnNpb24/IgorICAgICAgICAgICAgICAgICAgICBpZiAicG9ydERlc2MiIG5vdCBpbiBpbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAidW5leHBlY3RlZCBvcGVuZmxvdyBwb3J0LWRlc2MgcmVzcG9uc2UsICdwb3J0RGVzYycgbm90IGZvdW5kLiBXcm9uZyB2ZXJzaW9uPyIKKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShpbmZvWyJwb3J0RGVzYyJdKSAhPSBsaXN0IGFuZCB0eXBlKGluZm9bInBvcnREZXNjIl0pICE9IHR1cGxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAidW5leHBlY3RlZCBvcGVuZmxvdyBwb3J0LWRlc2MgcmVzcG9uc2UgYXQgJ3BvcnREZXNjJywgbm90IGEgbGlzdC4gV3JvbmcgdmVyc2lvbj8iCisgICAgICAgICAgICAgICAgICAgIHBvcnRzID0gaW5mb1sicG9ydERlc2MiXQorICAgICAgICAgICAgICAgIGZvciBwb3J0IGluIHBvcnRzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBwMm9maVsgc3RyKHBvcnRbIm5hbWUiXSkgXSA9IHN0cihwb3J0WyJwb3J0TnVtYmVyIl0gKQorICAgICAgICAgICAgICAgICAgICBzZWxmLm9maTJwcFsgcG9ydFsicG9ydE51bWJlciJdXSA9IHN0cihwb3J0WyJuYW1lIl0pIAorICAgICAgICAgICAgI3ByaW50IHNlbGYubmFtZSwgIjogZ2V0X29mX2NvbnRyb2xsZXJfaW5mbyBwb3J0czoiLCBzZWxmLnBwMm9maQorICAgICAgICAgICAgcmV0dXJuIDAsIHNlbGYucHAyb2ZpCisgICAgICAgIGV4Y2VwdCAocmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uLCBWYWx1ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgI1ZhbHVlRXJyb3IgaW4gdGhlIGNhc2UgdGhhdCBKU09OIGNhbiBub3QgYmUgZGVjb2RlZAorICAgICAgICAgICAgZXJyb3JfdGV4dCA9IHR5cGUoZSkuX19uYW1lX18gKyAiOiAiICsgc3RyKGUpCisgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigib2J0YWluX3BvcnRfY29ycmVzcG9uZGVuY2UgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX3RleHQKKyAgICAgICAgICAgIAorICAgIGRlZiBkZWxfZmxvdyhzZWxmLCBmbG93X25hbWUpOgorICAgICAgICAnJycgRGVsZXRlIGFuIGV4aXN0aW5nIHJ1bGUKKyAgICAgICAgICAgIFBhcmFtczogZmxvd19uYW1lLCB0aGlzIGlzIHRoZSBydWxlIG5hbWUKKyAgICAgICAgICAgIFJldHVybgorICAgICAgICAgICAgICAgIDAsIE5vbmUgaWYgb2sKKyAgICAgICAgICAgICAgICAtMSwgdGV4dF9lcnJvciBpZiBmYWlscworICAgICAgICAnJycgICAgICAgICAgIAorICAgICAgICAjYXV0b2Rpc2NvdmVyIHZlcnNpb24KKyAgICAgICAgaWYgc2VsZi52ZXJzaW9uID09IE5vbmU6CisgICAgICAgICAgICByLGMgPSBzZWxmLmdldF9vZl9zd2l0Y2hlcygpCisgICAgICAgICAgICBpZiByPDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHIsYworICAgICAgICAgICAgZWxpZiByPT0wOgorICAgICAgICAgICAgICAgIHJldHVybiAtMSwgIk5vIGRwaWQgZm91bmQgIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvZl9yZXNwb25zZSA9IHJlcXVlc3RzLmRlbGV0ZShzZWxmLnVybCsiL3dtLyVzL2pzb24iICUgc2VsZi52ZXJfbmFtZXNbIlVSTG1vZGlmaWVyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9c2VsZi5oZWFkZXJzLCBkYXRhPSd7InN3aXRjaCI6IiVzIiwibmFtZSI6IiVzIn0nICUoc2VsZi5kcGlkLCBmbG93X25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZXJyb3JfdGV4dCA9ICJPcGVuZmxvdyByZXNwb25zZSAlZDogJXMiICUgKG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlLCBvZl9yZXNwb25zZS50ZXh0KQorICAgICAgICAgICAgaWYgb2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUgIT0gMjAwOgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcoImRlbF9mbG93ICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMSAsIGVycm9yX3RleHQKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJkZWxfZmxvdyBPSyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiAwLCBOb25lCisKKyAgICAgICAgZXhjZXB0IHJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVxdWVzdEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgZXJyb3JfdGV4dCA9IHR5cGUoZSkuX19uYW1lX18gKyAiOiAiICsgc3RyKGUpCisgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiZGVsX2Zsb3cgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX3RleHQKKworICAgIGRlZiBuZXdfZmxvdyhzZWxmLCBkYXRhKToKKyAgICAgICAgJycnIEluc2VydCBhIG5ldyBzdGF0aWMgcnVsZQorICAgICAgICAgICAgUGFyYW1zOiBkYXRhOiBkaWN0aW9uYXJ5IHdpdGggdGhlIGZvbGxvd2luZyBjb250ZW50OgorICAgICAgICAgICAgICAgIHByaW9yaXR5OiAgICAgcnVsZSBwcmlvcml0eQorICAgICAgICAgICAgICAgIG5hbWU6ICAgICAgICAgcnVsZSBuYW1lCisgICAgICAgICAgICAgICAgaW5ncmVzc19wb3J0OiBtYXRjaCBpbnB1dCBwb3J0IG9mIHRoZSBydWxlCisgICAgICAgICAgICAgICAgZHN0X21hYzogICAgICBtYXRjaCBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgcnVsZSwgbWlzc2luZyBvciBOb25lIGlmIG5vdCBhcHBseQorICAgICAgICAgICAgICAgIHZsYW5faWQ6ICAgICAgbWF0Y2ggdmxhbiB0YWcgb2YgdGhlIHJ1bGUsIG1pc3Npbmcgb3IgTm9uZSBpZiBub3QgYXBwbHkKKyAgICAgICAgICAgICAgICBhY3Rpb25zOiAgICAgIGxpc3Qgb2YgYWN0aW9ucywgY29tcG9zZWQgYnkgYSBwYWlyIHR1cGxlcyB3aXRoIHRoZXNlIHBvc2liaWxpdGllczoKKyAgICAgICAgICAgICAgICAgICAgKCd2bGFuJywgTm9uZS9pbnQpOiBmb3Igc3RyaXBwaW5nL3NldHRpbmcgYSB2bGFuIHRhZworICAgICAgICAgICAgICAgICAgICAoJ291dCcsIHBvcnQpOiAgICAgIHNlbmQgdG8gdGhpcyBwb3J0CisgICAgICAgICAgICBSZXR1cm4KKyAgICAgICAgICAgICAgICAwLCBOb25lIGlmIG9rCisgICAgICAgICAgICAgICAgLTEsIHRleHRfZXJyb3IgaWYgZmFpbHMKKyAgICAgICAgJycnICAgCisgICAgICAgICNnZXQgdHJhbnNsYXRpb24sIGF1dG9kaXNjb3ZlciB2ZXJzaW9uCisgICAgICAgIGlmIGxlbihzZWxmLnBwMm9maSkgPT0gMDoKKyAgICAgICAgICAgIHIsYyA9IHNlbGYub2J0YWluX3BvcnRfY29ycmVzcG9uZGVuY2UoKQorICAgICAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgICAgIHJldHVybiByLGMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgI1dlIGhhdmUgdG8gYnVpbGQgdGhlIGRhdGEgZm9yIHRoZSBmbG9vZGxpZ2h0IGNhbGwgZnJvbSB0aGUgZ2VuZXJpYyBkYXRhCisgICAgICAgICAgICBzZGF0YSA9IHsnYWN0aXZlJzogInRydWUiLCAibmFtZSI6ZGF0YVsibmFtZSJdfQorICAgICAgICAgICAgaWYgZGF0YS5nZXQoInByaW9yaXR5Iik6CisgICAgICAgICAgICAgICAgc2RhdGFbInByaW9yaXR5Il0gPSBzdHIoZGF0YVsicHJpb3JpdHkiXSkKKyAgICAgICAgICAgIGlmIGRhdGEuZ2V0KCJ2bGFuX2lkIik6CisgICAgICAgICAgICAgICAgc2RhdGFbIHNlbGYudmVyX25hbWVzWyJ2bGFuaWQiXSAgXSA9IGRhdGFbInZsYW5faWQiXQorICAgICAgICAgICAgaWYgZGF0YS5nZXQoImRzdF9tYWMiKToKKyAgICAgICAgICAgICAgICBzZGF0YVsgIHNlbGYudmVyX25hbWVzWyJkZXN0bWFjIl0gIF0gPSBkYXRhWyJkc3RfbWFjIl0KKyAgICAgICAgICAgIHNkYXRhWydzd2l0Y2gnXSA9IHNlbGYuZHBpZAorICAgICAgICAgICAgaWYgbm90IGRhdGFbJ2luZ3Jlc3NfcG9ydCddIGluIHNlbGYucHAyb2ZpOgorICAgICAgICAgICAgICAgIGVycm9yX3RleHQgPSAnRXJyb3IuIFBvcnQgJytkYXRhWydpbmdyZXNzX3BvcnQnXSsnIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzd2l0Y2gnCisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIud2FybmluZygibmV3X2Zsb3cgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCBlcnJvcl90ZXh0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNkYXRhWyAgc2VsZi52ZXJfbmFtZXNbImlucG9ydCJdICBdID0gc2VsZi5wcDJvZmlbZGF0YVsnaW5ncmVzc19wb3J0J11dCisgICAgICAgICAgICBzZGF0YVsnYWN0aW9ucyddID0gIiIKKworICAgICAgICAgICAgZm9yIGFjdGlvbiBpbiBkYXRhWydhY3Rpb25zJ106CisgICAgICAgICAgICAgICAgaWYgbGVuKHNkYXRhWydhY3Rpb25zJ10pID4gMDoKKyAgICAgICAgICAgICAgICAgICAgc2RhdGFbJ2FjdGlvbnMnXSArPSAgJywnCisgICAgICAgICAgICAgICAgaWYgYWN0aW9uWzBdID09ICJ2bGFuIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYWN0aW9uWzFdPT1Ob25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2RhdGFbJ2FjdGlvbnMnXSArPSBzZWxmLnZlcl9uYW1lc1sic3RyaXB2bGFuIl0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNkYXRhWydhY3Rpb25zJ10gKz0gc2VsZi52ZXJfbmFtZXNbInNldHZsYW4iXSArICI9IiArIHN0cihhY3Rpb25bMV0pCisgICAgICAgICAgICAgICAgZWxpZiBhY3Rpb25bMF0gPT0gJ291dCc6CisgICAgICAgICAgICAgICAgICAgIHNkYXRhWydhY3Rpb25zJ10gKz0gIm91dHB1dD0iICsgc2VsZi5wcDJvZmlbIGFjdGlvblsxXSBdCisKKworICAgICAgICAgICAgb2ZfcmVzcG9uc2UgPSByZXF1ZXN0cy5wb3N0KHNlbGYudXJsKyIvd20vJXMvanNvbiIgJSBzZWxmLnZlcl9uYW1lc1siVVJMbW9kaWZpZXIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1zZWxmLmhlYWRlcnMsIGRhdGE9anNvbi5kdW1wcyhzZGF0YSkgKQorICAgICAgICAgICAgZXJyb3JfdGV4dCA9ICJPcGVuZmxvdyByZXNwb25zZSAlZDogJXMiICUgKG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlLCBvZl9yZXNwb25zZS50ZXh0KQorICAgICAgICAgICAgaWYgb2ZfcmVzcG9uc2Uuc3RhdHVzX2NvZGUgIT0gMjAwOgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcoIm5ld19mbG93ICIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMSAsIGVycm9yX3RleHQKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJuZXdfZmxvdyBPSyIgKyBlcnJvcl90ZXh0KQorICAgICAgICAgICAgcmV0dXJuIDAsIE5vbmUKKworICAgICAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gdHlwZShlKS5fX25hbWVfXyArICI6ICIgKyBzdHIoZSkKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJuZXdfZmxvdyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dAorCisgICAgZGVmIGNsZWFyX2FsbF9mbG93cyhzZWxmKToKKyAgICAgICAgJycnIERlbGV0ZSBhbGwgZXhpc3RpbmcgcnVsZXMKKyAgICAgICAgICAgIFJldHVybjoKKyAgICAgICAgICAgICAgICAwLCBOb25lIGlmIG9rCisgICAgICAgICAgICAgICAgLTEsIHRleHRfZXJyb3IgaWYgZmFpbHMKKyAgICAgICAgJycnICAgICAgICAgICAKKyAgICAgICAgI2F1dG9kaXNjb3ZlciB2ZXJzaW9uCisgICAgICAgIGlmIHNlbGYudmVyc2lvbiA9PSBOb25lOgorICAgICAgICAgICAgcixjID0gc2VsZi5nZXRfb2Zfc3dpdGNoZXMoKQorICAgICAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgICAgIHJldHVybiByLGMKKyAgICAgICAgICAgIGVsaWYgcj09MDogI2VtcHR5CisgICAgICAgICAgICAgICAgcmV0dXJuIDAsIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdXJsID0gc2VsZi51cmwrIi93bS8lcy9jbGVhci8lcy9qc29uIiAlIChzZWxmLnZlcl9uYW1lc1siVVJMbW9kaWZpZXIiXSwgc2VsZi5kcGlkKQorICAgICAgICAgICAgb2ZfcmVzcG9uc2UgPSByZXF1ZXN0cy5nZXQodXJsICkKKyAgICAgICAgICAgIGVycm9yX3RleHQgPSAiT3BlbmZsb3cgcmVzcG9uc2UgJWQ6ICVzIiAlIChvZl9yZXNwb25zZS5zdGF0dXNfY29kZSwgb2ZfcmVzcG9uc2UudGV4dCkKKyAgICAgICAgICAgIGlmIG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlIDwgMjAwIG9yIG9mX3Jlc3BvbnNlLnN0YXR1c19jb2RlID49IDMwMDoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci53YXJuaW5nKCJjbGVhcl9hbGxfZmxvd3MgIiArIGVycm9yX3RleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xICwgZXJyb3JfdGV4dAorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoImNsZWFyX2FsbF9mbG93cyBPSyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiAwLCBOb25lCisgICAgICAgIGV4Y2VwdCByZXF1ZXN0cy5leGNlcHRpb25zLlJlcXVlc3RFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGVycm9yX3RleHQgPSB0eXBlKGUpLl9fbmFtZV9fICsgIjogIiArIHN0cihlKQorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoImNsZWFyX2FsbF9mbG93cyAiICsgZXJyb3JfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dApkaWZmIC0tZ2l0IGEvaG9zdF90aHJlYWQucHkgYi9ob3N0X3RocmVhZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWJhMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdF90aHJlYWQucHkKQEAgLTAsMCArMSwxNjkyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisnJycKK1RoaXMgaXMgdGhyZWFkIHRoYXQgaW50ZXJhY3Qgd2l0aCB0aGUgaG9zdCBhbmQgdGhlIGxpYnZpcnQgdG8gbWFuYWdlIFZNCitPbmUgdGhyZWFkIHdpbGwgYmUgbGF1bmNoZWQgcGVyIGhvc3QgCisnJycKK19fYXV0aG9yX189IlBhYmxvIE1vbnRlcywgQWxmb25zbyBUaWVybm8iCitfX2RhdGVfXyA9IiQxMC1qdWwtMjAxNCAxMjowNzoxNSQiCisKKworaW1wb3J0IGpzb24KK2ltcG9ydCB5YW1sCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdGltZQoraW1wb3J0IFF1ZXVlCitpbXBvcnQgcGFyYW1pa28KK2Zyb20ganNvbnNjaGVtYSBpbXBvcnQgdmFsaWRhdGUgYXMganNfdiwgZXhjZXB0aW9ucyBhcyBqc19lCitpbXBvcnQgbGlidmlydAorZnJvbSB2aW1fc2NoZW1hIGltcG9ydCBsb2NhbGluZm9fc2NoZW1hLCBob3N0aW5mb19zY2hlbWEKK2ltcG9ydCByYW5kb20KKyNmcm9tIGxvZ2dpbmcgaW1wb3J0IExvZ2dlcgorI2ltcG9ydCB1dGlscy5hdXhpbGlhcnlfZnVuY3Rpb25zIGFzIGFmCisKKyNUT0RPOiBpbnNlcnQgYSBsb2dnaW5nIHN5c3RlbQorCitjbGFzcyBob3N0X3RocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgaG9zdCwgdXNlciwgZGIsIGRiX2xvY2ssIHRlc3QsIGltYWdlX3BhdGgsIGhvc3RfaWQsIHZlcnNpb24sIGRldmVsb3BfbW9kZSwgZGV2ZWxvcF9icmlkZ2VfaWZhY2UpOgorICAgICAgICAnJydJbml0IGEgdGhyZWFkLgorICAgICAgICBBcmd1bWVudHM6IAorICAgICAgICAgICAgJ2lkJyBudW1iZXIgb2YgdGhlYWQKKyAgICAgICAgICAgICduYW1lJyBuYW1lIG9mIHRocmVhZAorICAgICAgICAgICAgJ2hvc3QnLCd1c2VyJzogIGhvc3QgaXAgb3IgbmFtZSB0byBtYW5hZ2UgYW5kIHVzZXIKKyAgICAgICAgICAgICdkYicsICdkYl9sb2NrJzogZGF0YWJhc2UgY2xhc3MgYW5kIGxvY2sgdG8gdXNlIGl0IGluIGV4Y2x1c2lvbgorICAgICAgICAnJycKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi51c2VyID0gdXNlcgorICAgICAgICBzZWxmLmRiID0gZGIKKyAgICAgICAgc2VsZi5kYl9sb2NrID0gZGJfbG9jaworICAgICAgICBzZWxmLnRlc3QgPSB0ZXN0CisgICAgICAgIHNlbGYuZGV2ZWxvcF9tb2RlID0gZGV2ZWxvcF9tb2RlCisgICAgICAgIHNlbGYuZGV2ZWxvcF9icmlkZ2VfaWZhY2UgPSBkZXZlbG9wX2JyaWRnZV9pZmFjZQorICAgICAgICBzZWxmLmltYWdlX3BhdGggPSBpbWFnZV9wYXRoCisgICAgICAgIHNlbGYuaG9zdF9pZCA9IGhvc3RfaWQKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICAKKyAgICAgICAgc2VsZi54bWxfbGV2ZWwgPSAwCisgICAgICAgICNzZWxmLnBlbmRpbmcgPXt9CisgICAgICAgIAorICAgICAgICBzZWxmLnNlcnZlcl9zdGF0dXMgPSB7fSAjZGljdGlvbmFyeSB3aXRoIHBhaXJzIHNlcnZlcl91dWlkOnNlcnZlcl9zdGF0dXMgCisgICAgICAgIHNlbGYucGVuZGluZ190ZXJtaW5hdGVfc2VydmVyID1bXSAjbGlzdCAgd2l0aCBwYWlycyAodGltZSxzZXJ2ZXJfdXVpZCkgdGltZSB0byBzZW5kIGEgdGVybWluYXRlIGZvciBhIHNlcnZlciBiZWluZyBkZXN0cm95ZWQKKyAgICAgICAgc2VsZi5uZXh0X3VwZGF0ZV9zZXJ2ZXJfc3RhdHVzID0gMCAjdGltZSB3aGVuIG11c3QgYmUgY2hlY2sgc2VydmVycyBzdGF0dXMKKyAgICAgICAgCisgICAgICAgIHNlbGYuaG9zdGluZm8gPSBOb25lIAorICAgICAgICAKKyAgICAgICAgc2VsZi5xdWV1ZUxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYudGFza1F1ZXVlID0gUXVldWUuUXVldWUoMjAwMCkKKyAgICAgICAgCisgICAgZGVmIHNzaF9jb25uZWN0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjQ29ubmVjdCBTU0gKKyAgICAgICAgICAgIHNlbGYuc3NoX2Nvbm4gPSBwYXJhbWlrby5TU0hDbGllbnQoKQorICAgICAgICAgICAgc2VsZi5zc2hfY29ubi5zZXRfbWlzc2luZ19ob3N0X2tleV9wb2xpY3kocGFyYW1pa28uQXV0b0FkZFBvbGljeSgpKQorICAgICAgICAgICAgc2VsZi5zc2hfY29ubi5sb2FkX3N5c3RlbV9ob3N0X2tleXMoKQorICAgICAgICAgICAgc2VsZi5zc2hfY29ubi5jb25uZWN0KHNlbGYuaG9zdCwgdXNlcm5hbWU9c2VsZi51c2VyLCB0aW1lb3V0PTEwKSAjLCBOb25lKQorICAgICAgICBleGNlcHQgcGFyYW1pa28uc3NoX2V4Y2VwdGlvbi5TU0hFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHRleHQgPSBlLmFyZ3NbMF0KKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogc3NoX2Nvbm5lY3Qgc3NoIEV4Y2VwdGlvbjoiLCB0ZXh0CisgICAgICAgIAorICAgIGRlZiBsb2FkX2xvY2FsaW5mbyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYudGVzdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjQ29ubmVjdCBTU0gKKyAgICAgICAgICAgICAgICBzZWxmLnNzaF9jb25uZWN0KCkKKyAgICAKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gJ21rZGlyIC1wICcgKyAgc2VsZi5pbWFnZV9wYXRoCisgICAgICAgICAgICAgICAgI3ByaW50IHNlbGYubmFtZSwgJzogY29tbWFuZDonLCBjb21tYW5kCisgICAgICAgICAgICAgICAgKF8sIHN0ZG91dCwgc3RkZXJyKSA9IHNlbGYuc3NoX2Nvbm4uZXhlY19jb21tYW5kKGNvbW1hbmQpCisgICAgICAgICAgICAgICAgY29udGVudCA9IHN0ZGVyci5yZWFkKCkKKyAgICAgICAgICAgICAgICBpZiBsZW4oY29udGVudCkgPiAwOgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICc6IGNvbW1hbmQ6JywgY29tbWFuZCwgInN0ZGVycjoiLCBjb250ZW50CisKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2NhdCAnICsgIHNlbGYuaW1hZ2VfcGF0aCArICcvLm9wZW52aW0ueWFtbCcKKyAgICAgICAgICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAnOiBjb21tYW5kOicsIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAoXywgc3Rkb3V0LCBzdGRlcnIpID0gc2VsZi5zc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICAgICAgICAgICAgICBjb250ZW50ID0gc3Rkb3V0LnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIGxlbihjb250ZW50KSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICc6IGNvbW1hbmQ6JywgY29tbWFuZCwgInN0ZGVycjoiLCBzdGRlcnIucmVhZCgpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uKCJFcnJvciBlbXB0eSBmaWxlICIpCisgICAgICAgICAgICAgICAgc2VsZi5sb2NhbGluZm8gPSB5YW1sLmxvYWQoY29udGVudCkKKyAgICAgICAgICAgICAgICBqc192KHNlbGYubG9jYWxpbmZvLCBsb2NhbGluZm9fc2NoZW1hKQorICAgICAgICAgICAgICAgIHNlbGYubG9jYWxpbmZvX2RpcnR5PUZhbHNlCisgICAgICAgICAgICAgICAgaWYgJ3NlcnZlcl9maWxlcycgbm90IGluIHNlbGYubG9jYWxpbmZvOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsaW5mb1snc2VydmVyX2ZpbGVzJ10gPSB7fQorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgJzogbG9jYWxpbmZvIGxvYWQgZnJvbSBob3N0JworICAgICAgICAgICAgICAgIHJldHVybgorICAgIAorICAgICAgICAgICAgZXhjZXB0IHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgdGV4dCA9IGUuYXJnc1swXQorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogbG9hZF9sb2NhbGluZm8gc3NoIEV4Y2VwdGlvbjoiLCB0ZXh0CisgICAgICAgICAgICBleGNlcHQgbGlidmlydC5saWJ2aXJ0RXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gZS5nZXRfZXJyb3JfbWVzc2FnZSgpCisgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBsb2FkX2xvY2FsaW5mbyBsaWJ2aXJ0IEV4Y2VwdGlvbjoiLCB0ZXh0CisgICAgICAgICAgICBleGNlcHQgeWFtbC5ZQU1MRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIHRleHQgPSAiIgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZXhjLCAncHJvYmxlbV9tYXJrJyk6CisgICAgICAgICAgICAgICAgICAgIG1hcmsgPSBleGMucHJvYmxlbV9tYXJrCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIGF0IHBvc2l0aW9uOiAoJXM6JXMpIiAlIChtYXJrLmxpbmUrMSwgbWFyay5jb2x1bW4rMSkKKyAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGxvYWRfbG9jYWxpbmZvIHlhbWwgZm9ybWF0IEV4Y2VwdGlvbiIsIHRleHQKKyAgICAgICAgICAgIGV4Y2VwdCBqc19lLlZhbGlkYXRpb25FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHRleHQgPSAiIgorICAgICAgICAgICAgICAgIGlmIGxlbihlLnBhdGgpPjA6IHRleHQ9IiBhdCAnIiArICI6Ii5qb2luKG1hcChzdHIsIGUucGF0aCkpKyInIgorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogbG9hZF9sb2NhbGluZm8gZm9ybWF0IEV4Y2VwdGlvbjoiLCB0ZXh0LCBlLm1lc3NhZ2UgCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgdGV4dCA9IHN0cihlKQorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogbG9hZF9sb2NhbGluZm8gRXhjZXB0aW9uOiIsIHRleHQKKyAgICAgICAgCisgICAgICAgICNub3QgbG9hZGVkLCBpbnNlcnQgYSBkZWZhdWx0IGRhdGEgYW5kIGZvcmNlIHNhdmluZyBieSBhY3RpdmF0aW5nIGRpcnR5IGZsYWcKKyAgICAgICAgc2VsZi5sb2NhbGluZm8gPSB7J2ZpbGVzJzp7fSwgJ3NlcnZlcl9maWxlcyc6e30gfSAKKyAgICAgICAgI3NlbGYubG9jYWxpbmZvX2RpcnR5PVRydWUKKyAgICAgICAgc2VsZi5sb2NhbGluZm9fZGlydHk9RmFsc2UKKworICAgIGRlZiBsb2FkX2hvc3RpbmZvKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnRlc3Q6CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICNDb25uZWN0IFNTSAorICAgICAgICAgICAgc2VsZi5zc2hfY29ubmVjdCgpCisKKworICAgICAgICAgICAgY29tbWFuZCA9ICdjYXQgJyArICBzZWxmLmltYWdlX3BhdGggKyAnL2hvc3RpbmZvLnlhbWwnCisgICAgICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAnOiBjb21tYW5kOicsIGNvbW1hbmQKKyAgICAgICAgICAgIChfLCBzdGRvdXQsIHN0ZGVycikgPSBzZWxmLnNzaF9jb25uLmV4ZWNfY29tbWFuZChjb21tYW5kKQorICAgICAgICAgICAgY29udGVudCA9IHN0ZG91dC5yZWFkKCkKKyAgICAgICAgICAgIGlmIGxlbihjb250ZW50KSA9PSAwOgorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgJzogY29tbWFuZDonLCBjb21tYW5kLCAic3RkZXJyOiIsIHN0ZGVyci5yZWFkKCkKKyAgICAgICAgICAgICAgICByYWlzZSBwYXJhbWlrby5zc2hfZXhjZXB0aW9uLlNTSEV4Y2VwdGlvbigiRXJyb3IgZW1wdHkgZmlsZSAiKQorICAgICAgICAgICAgc2VsZi5ob3N0aW5mbyA9IHlhbWwubG9hZChjb250ZW50KQorICAgICAgICAgICAganNfdihzZWxmLmhvc3RpbmZvLCBob3N0aW5mb19zY2hlbWEpCisgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICc6IGhvc3RsaW5mbyBsb2FkIGZyb20gaG9zdCcsIHNlbGYuaG9zdGluZm8KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGV4Y2VwdCBwYXJhbWlrby5zc2hfZXhjZXB0aW9uLlNTSEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgdGV4dCA9IGUuYXJnc1swXQorICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBsb2FkX2hvc3RpbmZvIHNzaCBFeGNlcHRpb246IiwgdGV4dAorICAgICAgICBleGNlcHQgbGlidmlydC5saWJ2aXJ0RXJyb3IgYXMgZToKKyAgICAgICAgICAgIHRleHQgPSBlLmdldF9lcnJvcl9tZXNzYWdlKCkKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogbG9hZF9ob3N0aW5mbyBsaWJ2aXJ0IEV4Y2VwdGlvbjoiLCB0ZXh0CisgICAgICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciBhcyBleGM6CisgICAgICAgICAgICB0ZXh0ID0gIiIKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoZXhjLCAncHJvYmxlbV9tYXJrJyk6CisgICAgICAgICAgICAgICAgbWFyayA9IGV4Yy5wcm9ibGVtX21hcmsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gIiBhdCBwb3NpdGlvbjogKCVzOiVzKSIgJSAobWFyay5saW5lKzEsIG1hcmsuY29sdW1uKzEpCisgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGxvYWRfaG9zdGluZm8geWFtbCBmb3JtYXQgRXhjZXB0aW9uIiwgdGV4dAorICAgICAgICBleGNlcHQganNfZS5WYWxpZGF0aW9uRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHRleHQgPSAiIgorICAgICAgICAgICAgaWYgbGVuKGUucGF0aCk+MDogdGV4dD0iIGF0ICciICsgIjoiLmpvaW4obWFwKHN0ciwgZS5wYXRoKSkrIiciCisgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGxvYWRfaG9zdGluZm8gZm9ybWF0IEV4Y2VwdGlvbjoiLCB0ZXh0LCBlLm1lc3NhZ2UgCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHRleHQgPSBzdHIoZSkKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogbG9hZF9ob3N0aW5mbyBFeGNlcHRpb246IiwgdGV4dAorICAgICAgICAKKyAgICAgICAgI25vdCBsb2FkZWQsIGluc2VydCBhIGRlZmF1bHQgZGF0YSAKKyAgICAgICAgc2VsZi5ob3N0aW5mbyA9IE5vbmUgCisgICAgICAgIAorICAgIGRlZiBzYXZlX2xvY2FsaW5mbyhzZWxmLCB0cmllcz0zKToKKyAgICAgICAgaWYgc2VsZi50ZXN0OgorICAgICAgICAgICAgc2VsZi5sb2NhbGluZm9fZGlydHkgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIAorICAgICAgICB3aGlsZSB0cmllcz49MDoKKyAgICAgICAgICAgIHRyaWVzLT0xCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2NhdCA+ICcgKyAgc2VsZi5pbWFnZV9wYXRoICsgJy8ub3BlbnZpbS55YW1sJworICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgJzogY29tbWFuZDonLCBjb21tYW5kCisgICAgICAgICAgICAgICAgKHN0ZGluLCBfLCBfKSA9IHNlbGYuc3NoX2Nvbm4uZXhlY19jb21tYW5kKGNvbW1hbmQpCisgICAgICAgICAgICAgICAgeWFtbC5zYWZlX2R1bXAoc2VsZi5sb2NhbGluZm8sIHN0ZGluLCBleHBsaWNpdF9zdGFydD1UcnVlLCBpbmRlbnQ9NCwgZGVmYXVsdF9mbG93X3N0eWxlPUZhbHNlLCB0YWdzPUZhbHNlLCBlbmNvZGluZz0ndXRmLTgnLCBhbGxvd191bmljb2RlPVRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5sb2NhbGluZm9fZGlydHkgPSBGYWxzZQorICAgICAgICAgICAgICAgIGJyZWFrICN3aGlsZSB0cmllcworICAgIAorICAgICAgICAgICAgZXhjZXB0IHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgdGV4dCA9IGUuYXJnc1swXQorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogc2F2ZV9sb2NhbGluZm8gc3NoIEV4Y2VwdGlvbjoiLCB0ZXh0CisgICAgICAgICAgICAgICAgaWYgIlNTSCBzZXNzaW9uIG5vdCBhY3RpdmUiIGluIHRleHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NoX2Nvbm5lY3QoKQorICAgICAgICAgICAgZXhjZXB0IGxpYnZpcnQubGlidmlydEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgdGV4dCA9IGUuZ2V0X2Vycm9yX21lc3NhZ2UoKQorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogc2F2ZV9sb2NhbGluZm8gbGlidmlydCBFeGNlcHRpb246IiwgdGV4dAorICAgICAgICAgICAgZXhjZXB0IHlhbWwuWUFNTEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gIiIKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGV4YywgJ3Byb2JsZW1fbWFyaycpOgorICAgICAgICAgICAgICAgICAgICBtYXJrID0gZXhjLnByb2JsZW1fbWFyaworICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIiBhdCBwb3NpdGlvbjogKCVzOiVzKSIgJSAobWFyay5saW5lKzEsIG1hcmsuY29sdW1uKzEpCisgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBzYXZlX2xvY2FsaW5mbyB5YW1sIGZvcm1hdCBFeGNlcHRpb24iLCB0ZXh0CisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgdGV4dCA9IHN0cihlKQorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogc2F2ZV9sb2NhbGluZm8gRXhjZXB0aW9uOiIsIHRleHQKKworICAgIGRlZiBsb2FkX3NlcnZlcnNfZnJvbV9kYihzZWxmKToKKyAgICAgICAgc2VsZi5kYl9sb2NrLmFjcXVpcmUoKQorICAgICAgICByLGMgPSBzZWxmLmRiLmdldF90YWJsZShTRUxFQ1Q9KCd1dWlkJywnc3RhdHVzJywgJ2ltYWdlX2lkJyksIEZST009J2luc3RhbmNlcycsIFdIRVJFPXsnaG9zdF9pZCc6IHNlbGYuaG9zdF9pZH0pCisgICAgICAgIHNlbGYuZGJfbG9jay5yZWxlYXNlKCkKKworICAgICAgICBzZWxmLnNlcnZlcl9zdGF0dXMgPSB7fQorICAgICAgICBpZiByPDA6CisgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IEVycm9yIGdldHRpbmcgZGF0YSBmcm9tIGRhdGFiYXNlOiIsIGMKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3Igc2VydmVyIGluIGM6CisgICAgICAgICAgICBzZWxmLnNlcnZlcl9zdGF0dXNbIHNlcnZlclsndXVpZCddIF0gPSBzZXJ2ZXJbJ3N0YXR1cyddCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNjb252ZXJ0IGZyb20gb2xkIHZlcnNpb24gdG8gbmV3IG9uZQorICAgICAgICAgICAgaWYgJ2luY19maWxlcycgaW4gc2VsZi5sb2NhbGluZm8gYW5kIHNlcnZlclsndXVpZCddIGluIHNlbGYubG9jYWxpbmZvWydpbmNfZmlsZXMnXToKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfZmlsZXNfZGljdCA9IHsnc291cmNlIGZpbGUnOiBzZWxmLmxvY2FsaW5mb1snaW5jX2ZpbGVzJ11bIHNlcnZlclsndXVpZCddIF0gWzBdLCAgJ2ZpbGUgZm9ybWF0JzoncmF3JyB9CisgICAgICAgICAgICAgICAgaWYgc2VydmVyX2ZpbGVzX2RpY3RbJ3NvdXJjZSBmaWxlJ11bLTU6XSA9PSAncWNvdzInOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfZmlsZXNfZGljdFsnZmlsZSBmb3JtYXQnXSA9ICdxY293MicKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5sb2NhbGluZm9bJ3NlcnZlcl9maWxlcyddWyBzZXJ2ZXJbJ3V1aWQnXSBdID0geyBzZXJ2ZXJbJ2ltYWdlX2lkJ10gOiBzZXJ2ZXJfZmlsZXNfZGljdCB9CisgICAgICAgIGlmICdpbmNfZmlsZXMnIGluIHNlbGYubG9jYWxpbmZvOgorICAgICAgICAgICAgZGVsIHNlbGYubG9jYWxpbmZvWydpbmNfZmlsZXMnXQorICAgICAgICAgICAgc2VsZi5sb2NhbGluZm9fZGlydHkgPSBUcnVlCisgICAgCisgICAgZGVmIGRlbGV0ZV91bnVzZWRfZmlsZXMoc2VsZik6CisgICAgICAgICcnJ0NvbXBhcmVzIHNlbGYubG9jYWxpbmZvWydzZXJ2ZXJfZmlsZXMnXSBjb250ZW50IHdpdGggcmVhbCBzZXJ2ZXJzIHJ1bm5pbmcgc2VsZi5zZXJ2ZXJfc3RhdHVzIG9idGFpbmVkIGZyb20gZGF0YWJhc2UKKyAgICAgICAgRGVsZXRlcyB1bnVzZWQgZW50cmllcyBhdCBzZWxmLmxvYWNhbGluZm8gYW5kIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGZpbGVzLgorICAgICAgICBUaGUgb25seSByZWFzb24gZm9yIHRoaXMgbWlzbWF0Y2ggaXMgdGhlIG1hbnVhbCBkZWxldGlvbiBvZiBpbnN0YW5jZXMgKFZNKSBhdCBkYXRhYmFzZQorICAgICAgICAnJycgCisgICAgICAgIGlmIHNlbGYudGVzdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3IgdXVpZCxpbWFnZXMgaW4gc2VsZi5sb2NhbGluZm9bJ3NlcnZlcl9maWxlcyddLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB1dWlkIG5vdCBpbiBzZWxmLnNlcnZlcl9zdGF0dXM6CisgICAgICAgICAgICAgICAgZm9yIGxvY2FsZmlsZSBpbiBpbWFnZXMudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZGVsZXRpbmcgZmlsZSAnJXMnIG9mIHVudXNlZCBzZXJ2ZXIgJyVzJyIgJShsb2NhbGZpbGVbJ3NvdXJjZSBmaWxlJ10sIHV1aWQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKGxvY2FsZmlsZVsnc291cmNlIGZpbGUnXSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IEV4Y2VwdGlvbiBkZWxldGluZyBmaWxlICclcyc6ICVzIiAlKGxvY2FsZmlsZVsnc291cmNlIGZpbGUnXSwgc3RyKGUpKQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmxvY2FsaW5mb1snc2VydmVyX2ZpbGVzJ11bdXVpZF0KKyAgICAgICAgICAgICAgICBzZWxmLmxvY2FsaW5mb19kaXJ0eSA9IFRydWUKKyAgIAorICAgIGRlZiBpbnNlcnRfdGFzayhzZWxmLCB0YXNrLCAqYWRpdGlvbmFsKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5xdWV1ZUxvY2suYWNxdWlyZSgpCisgICAgICAgICAgICB0YXNrID0gc2VsZi50YXNrUXVldWUucHV0KCAodGFzaywpICsgYWRpdGlvbmFsLCB0aW1lb3V0PTUpIAorICAgICAgICAgICAgc2VsZi5xdWV1ZUxvY2sucmVsZWFzZSgpCisgICAgICAgICAgICByZXR1cm4gMSwgTm9uZQorICAgICAgICBleGNlcHQgUXVldWUuRnVsbDoKKyAgICAgICAgICAgIHJldHVybiAtMSwgInRpbWVvdXQgaW5zZXJ0aW5nIGEgdGFzayBvdmVyIGhvc3QgIiArIHNlbGYubmFtZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYubG9hZF9sb2NhbGluZm8oKQorICAgICAgICAgICAgc2VsZi5sb2FkX2hvc3RpbmZvKCkKKyAgICAgICAgICAgIHNlbGYubG9hZF9zZXJ2ZXJzX2Zyb21fZGIoKQorICAgICAgICAgICAgc2VsZi5kZWxldGVfdW51c2VkX2ZpbGVzKCkKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZUxvY2suYWNxdWlyZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYudGFza1F1ZXVlLmVtcHR5KCk6CisgICAgICAgICAgICAgICAgICAgIHRhc2sgPSBzZWxmLnRhc2tRdWV1ZS5nZXQoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRhc2sgPSBOb25lCisgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZUxvY2sucmVsZWFzZSgpCisgICAgCisgICAgICAgICAgICAgICAgaWYgdGFzayBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBub3c9dGltZS50aW1lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5sb2NhbGluZm9fZGlydHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNhdmVfbG9jYWxpbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLm5leHRfdXBkYXRlX3NlcnZlcl9zdGF0dXMgPCBub3c6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9zZXJ2ZXJzX3N0YXR1cygpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5leHRfdXBkYXRlX3NlcnZlcl9zdGF0dXMgPSBub3cgKyA1CisgICAgICAgICAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYucGVuZGluZ190ZXJtaW5hdGVfc2VydmVyKT4wIGFuZCBzZWxmLnBlbmRpbmdfdGVybWluYXRlX3NlcnZlclswXVswXTxub3c6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9mb3JjZW9mZigpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICAgICAKKyAgICAKKyAgICAgICAgICAgICAgICBpZiB0YXNrWzBdID09ICdpbnN0YW5jZSc6CisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogcHJvY2Vzc2luZyB0YXNrIGluc3RhbmNlIiwgdGFza1sxXVsnYWN0aW9uJ10KKyAgICAgICAgICAgICAgICAgICAgcmV0cnk9MAorICAgICAgICAgICAgICAgICAgICB3aGlsZSByZXRyeSA8MjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHI9c2VsZi5hY3Rpb25fb25fc2VydmVyKHRhc2tbMV0sIHJldHJ5PT0yKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcj49MDogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIHRhc2tbMF0gPT0gJ2ltYWdlJzoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsaWYgdGFza1swXSA9PSAnZXhpdCc6CisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogcHJvY2Vzc2luZyB0YXNrIGV4aXQiCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVybWluYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgICAgICBlbGlmIHRhc2tbMF0gPT0gJ3JlbG9hZCc6CisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogcHJvY2Vzc2luZyB0YXNrIHJlbG9hZCB0ZXJtaW5hdGluZyBhbmQgcmVsYXVuY2hpbmciCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVybWluYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIHRhc2tbMF0gPT0gJ2VkaXQtaWZhY2UnOgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IHByb2Nlc3NpbmcgdGFzayBlZGl0LWlmYWNlIHBvcnQ9JXMsIG9sZF9uZXQ9JXMsIG5ld19uZXQ9JXMiICUgKHRhc2tbMV0sIHRhc2tbMl0sIHRhc2tbM10pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdF9pZmFjZSh0YXNrWzFdLCB0YXNrWzJdLCB0YXNrWzNdKQorICAgICAgICAgICAgICAgIGVsaWYgdGFza1swXSA9PSAncmVzdG9yZS1pZmFjZSc6CisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogcHJvY2Vzc2luZyB0YXNrIHJlc3RvcmUtaWZhY2UgJXMgbWFjPSVzIiAlICh0YXNrWzFdLCB0YXNrWzJdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3RvcmVfaWZhY2UodGFza1sxXSwgdGFza1syXSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IHVua25vd24gdGFzayIsIHRhc2sKKyAgICAgICAgICAgICAgICAKKyAgICBkZWYgc2VydmVyX2ZvcmNlb2ZmKHNlbGYsIHdhaXRfdW50aWxfZmluaXNoZWQ9RmFsc2UpOgorICAgICAgICB3aGlsZSBsZW4oc2VsZi5wZW5kaW5nX3Rlcm1pbmF0ZV9zZXJ2ZXIpPjA6CisgICAgICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgaWYgc2VsZi5wZW5kaW5nX3Rlcm1pbmF0ZV9zZXJ2ZXJbMF1bMF0+bm93OgorICAgICAgICAgICAgICAgIGlmIHdhaXRfdW50aWxfZmluaXNoZWQ6CisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJlcT17J3V1aWQnOnNlbGYucGVuZGluZ190ZXJtaW5hdGVfc2VydmVyWzBdWzFdLAorICAgICAgICAgICAgICAgICdhY3Rpb24nOnsndGVybWluYXRlJzonZm9yY2UnfSwKKyAgICAgICAgICAgICAgICAnc3RhdHVzJzogTm9uZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZi5hY3Rpb25fb25fc2VydmVyKHJlcSkKKyAgICAgICAgICAgIHNlbGYucGVuZGluZ190ZXJtaW5hdGVfc2VydmVyLnBvcCgwKQorICAgIAorICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyX2ZvcmNlb2ZmKFRydWUpCisgICAgICAgICAgICBpZiBzZWxmLmxvY2FsaW5mb19kaXJ0eToKKyAgICAgICAgICAgICAgICBzZWxmLnNhdmVfbG9jYWxpbmZvKCkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRlc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5zc2hfY29ubi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHRleHQgPSBzdHIoZSkKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogdGVybWluYXRlIEV4Y2VwdGlvbjoiLCB0ZXh0CisgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZXhpdCBmcm9tIGhvc3RfdGhyZWFkIiAKKworICAgIGRlZiBnZXRfbG9jYWxfaWZhY2VfbmFtZShzZWxmLCBnZW5lcmljX25hbWUpOgorICAgICAgICBpZiBzZWxmLmhvc3RpbmZvICE9IE5vbmUgYW5kICJpZmFjZV9uYW1lcyIgaW4gc2VsZi5ob3N0aW5mbyBhbmQgZ2VuZXJpY19uYW1lIGluIHNlbGYuaG9zdGluZm9bImlmYWNlX25hbWVzIl06CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ob3N0aW5mb1siaWZhY2VfbmFtZXMiXVtnZW5lcmljX25hbWVdCisgICAgICAgIHJldHVybiBnZW5lcmljX25hbWUKKyAgICAgICAgCisgICAgZGVmIGNyZWF0ZV94bWxfc2VydmVyKHNlbGYsIHNlcnZlciwgZGV2X2xpc3QsIHNlcnZlcl9tZXRhZGF0YT17fSk6CisgICAgICAgICIiIkZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgVk0gWE1MIGRlZmluaXRpb24uCisgICAgICAgIEFkZGl0aW9uYWwgZGV2aWNlcyBhcmUgaW4gZGV2X2xpc3QgbGlzdAorICAgICAgICBUaGUgbWFpbiBkaXNrIGlzIHVwb24gZGV2X2xpc3RbMF0iIiIKKyAgICAgICAgCisgICAgI2dldCBpZiBvcGVyYXRpbmcgc3lzdGVtIGlzIFdpbmRvd3MgICAgICAgIAorICAgICAgICB3aW5kb3dzX29zID0gRmFsc2UKKyAgICAgICAgb3NfdHlwZSA9IHNlcnZlcl9tZXRhZGF0YS5nZXQoJ29zX3R5cGUnLCBOb25lKQorICAgICAgICBpZiBvc190eXBlID09IE5vbmUgYW5kICdtZXRhZGF0YScgaW4gZGV2X2xpc3RbMF06CisgICAgICAgICAgICBvc190eXBlID0gZGV2X2xpc3RbMF1bJ21ldGFkYXRhJ10uZ2V0KCdvc190eXBlJywgTm9uZSkKKyAgICAgICAgaWYgb3NfdHlwZSAhPSBOb25lIGFuZCBvc190eXBlLmxvd2VyKCkgPT0gIndpbmRvd3MiOgorICAgICAgICAgICAgd2luZG93c19vcyA9IFRydWUKKyAgICAjZ2V0IHR5cGUgb2YgaGFyZCBkaXNrIGJ1cyAgCisgICAgICAgIGJ1c19pZGUgPSBUcnVlIGlmIHdpbmRvd3Nfb3MgZWxzZSBGYWxzZSAgIAorICAgICAgICBidXMgPSBzZXJ2ZXJfbWV0YWRhdGEuZ2V0KCdidXMnLCBOb25lKQorICAgICAgICBpZiBidXMgPT0gTm9uZSBhbmQgJ21ldGFkYXRhJyBpbiBkZXZfbGlzdFswXToKKyAgICAgICAgICAgIGJ1cyA9IGRldl9saXN0WzBdWydtZXRhZGF0YSddLmdldCgnYnVzJywgTm9uZSkKKyAgICAgICAgaWYgYnVzICE9IE5vbmU6CisgICAgICAgICAgICBidXNfaWRlID0gVHJ1ZSBpZiBidXM9PSdpZGUnIGVsc2UgRmFsc2UKKyAgICAgICAgICAgIAorICAgICAgICBzZWxmLnhtbF9sZXZlbCA9IDAKKworICAgICAgICB0ZXh0ID0gIjxkb21haW4gdHlwZT0na3ZtJz4iCisgICAgI2dldCB0b3BvbG9neQorICAgICAgICB0b3BvID0gc2VydmVyX21ldGFkYXRhLmdldCgndG9wb2xvZ3knLCBOb25lKQorICAgICAgICBpZiB0b3BvID09IE5vbmUgYW5kICdtZXRhZGF0YScgaW4gZGV2X2xpc3RbMF06CisgICAgICAgICAgICB0b3BvID0gZGV2X2xpc3RbMF1bJ21ldGFkYXRhJ10uZ2V0KCd0b3BvbG9neScsIE5vbmUpCisgICAgI25hbWUKKyAgICAgICAgbmFtZSA9IHNlcnZlci5nZXQoJ25hbWUnLCcnKSArICJfIiArIHNlcnZlclsndXVpZCddCisgICAgICAgIG5hbWUgPSBuYW1lWzo1OF0gICNxZW11IGltcG9zZSBhIGxlbmd0aCAgbGltaXQgb2YgNTkgY2hhcnMgb3Igbm90IHN0YXJ0LiBVc2luZyA1OAorICAgICAgICB0ZXh0ICs9IHNlbGYuaW5jX3RhYigpICsgIjxuYW1lPiIgKyBuYW1lKyAiPC9uYW1lPiIKKyAgICAjdXVpZAorICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPHV1aWQ+IiArIHNlcnZlclsndXVpZCddICsgIjwvdXVpZD4iIAorICAgICAgICAKKyAgICAgICAgbnVtYT17fQorICAgICAgICBpZiAnZXh0ZW5kZWQnIGluIHNlcnZlciBhbmQgc2VydmVyWydleHRlbmRlZCddIT1Ob25lIGFuZCAnbnVtYXMnIGluIHNlcnZlclsnZXh0ZW5kZWQnXToKKyAgICAgICAgICAgIG51bWEgPSBzZXJ2ZXJbJ2V4dGVuZGVkJ11bJ251bWFzJ11bMF0KKyAgICAjbWVtb3J5CisgICAgICAgIHVzZV9odWdlID0gRmFsc2UKKyAgICAgICAgbWVtb3J5ID0gaW50KG51bWEuZ2V0KCdtZW1vcnknLDApKSoxMDI0KjEwMjQgI2luIEtpQgorICAgICAgICBpZiBtZW1vcnk9PTA6CisgICAgICAgICAgICBtZW1vcnkgPSBpbnQoc2VydmVyWydyYW0nXSkqMTAyNDsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRldmVsb3BfbW9kZToKKyAgICAgICAgICAgICAgICB1c2VfaHVnZSA9IFRydWUKKyAgICAgICAgaWYgbWVtb3J5PT0wOgorICAgICAgICAgICAgcmV0dXJuIC0xLCAnTm8gbWVtb3J5IGFzc2lnbmVkIHRvIGluc3RhbmNlJworICAgICAgICBtZW1vcnkgPSBzdHIobWVtb3J5KQorICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPG1lbW9yeSB1bml0PSdLaUInPiIgK21lbW9yeSsiPC9tZW1vcnk+IiAKKyAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjxjdXJyZW50TWVtb3J5IHVuaXQ9J0tpQic+IiArbWVtb3J5KyAiPC9jdXJyZW50TWVtb3J5PiIKKyAgICAgICAgaWYgdXNlX2h1Z2U6CisgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkrJzxtZW1vcnlCYWNraW5nPicrIFwKKyAgICAgICAgICAgICAgICBzZWxmLmluY190YWIoKSArICc8aHVnZXBhZ2VzLz4nKyBcCisgICAgICAgICAgICAgICAgc2VsZi5kZWNfdGFiKCkrICc8L21lbW9yeUJhY2tpbmc+JworCisgICAgI2NwdQorICAgICAgICB1c2VfY3B1X3Bpbm5pbmc9RmFsc2UKKyAgICAgICAgdmNwdXMgPSBpbnQoc2VydmVyLmdldCgidmNwdXMiLDApKQorICAgICAgICBjcHVfcGlubmluZyA9IFtdCisgICAgICAgIGlmICdjb3Jlcy1zb3VyY2UnIGluIG51bWE6CisgICAgICAgICAgICB1c2VfY3B1X3Bpbm5pbmc9VHJ1ZQorICAgICAgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKDAsIGxlbihudW1hWydjb3Jlcy1zb3VyY2UnXSkpOgorICAgICAgICAgICAgICAgIGNwdV9waW5uaW5nLmFwcGVuZCggWyBudW1hWydjb3Jlcy1pZCddW2luZGV4XSwgbnVtYVsnY29yZXMtc291cmNlJ11baW5kZXhdIF0gKQorICAgICAgICAgICAgICAgIHZjcHVzICs9IDEKKyAgICAgICAgaWYgJ3RocmVhZHMtc291cmNlJyBpbiBudW1hOgorICAgICAgICAgICAgdXNlX2NwdV9waW5uaW5nPVRydWUKKyAgICAgICAgICAgIGZvciBpbmRleCBpbiByYW5nZSgwLCBsZW4obnVtYVsndGhyZWFkcy1zb3VyY2UnXSkpOgorICAgICAgICAgICAgICAgIGNwdV9waW5uaW5nLmFwcGVuZCggWyBudW1hWyd0aHJlYWRzLWlkJ11baW5kZXhdLCBudW1hWyd0aHJlYWRzLXNvdXJjZSddW2luZGV4XSBdICkKKyAgICAgICAgICAgICAgICB2Y3B1cyArPSAxCisgICAgICAgIGlmICdwYWlyZWQtdGhyZWFkcy1zb3VyY2UnIGluIG51bWE6CisgICAgICAgICAgICB1c2VfY3B1X3Bpbm5pbmc9VHJ1ZQorICAgICAgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKDAsIGxlbihudW1hWydwYWlyZWQtdGhyZWFkcy1zb3VyY2UnXSkpOgorICAgICAgICAgICAgICAgIGNwdV9waW5uaW5nLmFwcGVuZCggW251bWFbJ3BhaXJlZC10aHJlYWRzLWlkJ11baW5kZXhdWzBdLCBudW1hWydwYWlyZWQtdGhyZWFkcy1zb3VyY2UnXVtpbmRleF1bMF0gXSApCisgICAgICAgICAgICAgICAgY3B1X3Bpbm5pbmcuYXBwZW5kKCBbbnVtYVsncGFpcmVkLXRocmVhZHMtaWQnXVtpbmRleF1bMV0sIG51bWFbJ3BhaXJlZC10aHJlYWRzLXNvdXJjZSddW2luZGV4XVsxXSBdICkKKyAgICAgICAgICAgICAgICB2Y3B1cyArPSAyCisgICAgICAgIAorICAgICAgICBpZiB1c2VfY3B1X3Bpbm5pbmcgYW5kIG5vdCBzZWxmLmRldmVsb3BfbW9kZToKKyAgICAgICAgICAgIHRleHQgKz0gc2VsZi50YWIoKSsiPHZjcHUgcGxhY2VtZW50PSdzdGF0aWMnPiIgK3N0cihsZW4oY3B1X3Bpbm5pbmcpKSArIjwvdmNwdT4iICsgXAorICAgICAgICAgICAgICAgIHNlbGYudGFiKCkrJzxjcHV0dW5lPicKKyAgICAgICAgICAgIHNlbGYueG1sX2xldmVsICs9IDEKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihjcHVfcGlubmluZykpOgorICAgICAgICAgICAgICAgIHRleHQgKz0gc2VsZi50YWIoKSArICI8dmNwdXBpbiB2Y3B1PSciICtzdHIoY3B1X3Bpbm5pbmdbaV1bMF0pKyAiJyBjcHVzZXQ9JyIgK3N0cihjcHVfcGlubmluZ1tpXVsxXSkgKyInLz4iCisgICAgICAgICAgICB0ZXh0ICs9IHNlbGYuZGVjX3RhYigpKyc8L2NwdXR1bmU+JysgXAorICAgICAgICAgICAgICAgIHNlbGYudGFiKCkgKyAnPG51bWF0dW5lPicgK1wKKyAgICAgICAgICAgICAgICBzZWxmLmluY190YWIoKSArICI8bWVtb3J5IG1vZGU9J3N0cmljdCcgbm9kZXNldD0nIiArc3RyKG51bWFbJ3NvdXJjZSddKSsgIicvPiIgK1wKKyAgICAgICAgICAgICAgICBzZWxmLmRlY190YWIoKSArICc8L251bWF0dW5lPicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHZjcHVzPT0wOgorICAgICAgICAgICAgICAgIHJldHVybiAtMSwgIkluc3RhbmNlIHdpdGhvdXQgbnVtYmVyIG9mIGNwdXMiCisgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkrIjx2Y3B1PiIgKyBzdHIodmNwdXMpICArICI8L3ZjcHU+IgorCisgICAgI2Jvb3QKKyAgICAgICAgYm9vdF9jZHJvbSA9IEZhbHNlCisgICAgICAgIGZvciBkZXYgaW4gZGV2X2xpc3Q6CisgICAgICAgICAgICBpZiBkZXZbJ3R5cGUnXT09J2Nkcm9tJyA6CisgICAgICAgICAgICAgICAgYm9vdF9jZHJvbSA9IFRydWUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkrICc8b3M+JyArIFwKKyAgICAgICAgICAgIHNlbGYuaW5jX3RhYigpICsgIjx0eXBlIGFyY2g9J3g4Nl82NCcgbWFjaGluZT0ncGMnPmh2bTwvdHlwZT4iCisgICAgICAgIGlmIGJvb3RfY2Ryb206CisgICAgICAgICAgICB0ZXh0ICs9ICBzZWxmLnRhYigpICsgIjxib290IGRldj0nY2Ryb20nLz4iIAorICAgICAgICB0ZXh0ICs9ICBzZWxmLnRhYigpICsgIjxib290IGRldj0naGQnLz4iICsgXAorICAgICAgICAgICAgc2VsZi5kZWNfdGFiKCkrJzwvb3M+JworICAgICNmZWF0dXJlcworICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkrJzxmZWF0dXJlcz4nK1wKKyAgICAgICAgICAgIHNlbGYuaW5jX3RhYigpKyc8YWNwaS8+JyArXAorICAgICAgICAgICAgc2VsZi50YWIoKSsnPGFwaWMvPicgK1wKKyAgICAgICAgICAgIHNlbGYudGFiKCkrJzxwYWUvPicrIFwKKyAgICAgICAgICAgIHNlbGYuZGVjX3RhYigpICsnPC9mZWF0dXJlcz4nCisgICAgICAgIGlmIHdpbmRvd3Nfb3Mgb3IgdG9wbz09Im9uZVNvY2tldCI6CisgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPGNwdSBtb2RlPSdob3N0LW1vZGVsJz4gPHRvcG9sb2d5IHNvY2tldHM9JzEnIGNvcmVzPSclZCcgdGhyZWFkcz0nMScgLz4gPC9jcHU+IiUgdmNwdXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHQgKz0gc2VsZi50YWIoKSArICI8Y3B1IG1vZGU9J2hvc3QtbW9kZWwnPjwvY3B1PiIKKyAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjxjbG9jayBvZmZzZXQ9J3V0YycvPiIgK1wKKyAgICAgICAgICAgIHNlbGYudGFiKCkgKyAiPG9uX3Bvd2Vyb2ZmPnByZXNlcnZlPC9vbl9wb3dlcm9mZj4iICsgXAorICAgICAgICAgICAgc2VsZi50YWIoKSArICI8b25fcmVib290PnJlc3RhcnQ8L29uX3JlYm9vdD4iICsgXAorICAgICAgICAgICAgc2VsZi50YWIoKSArICI8b25fY3Jhc2g+cmVzdGFydDwvb25fY3Jhc2g+IgorICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPGRldmljZXM+IiArIFwKKyAgICAgICAgICAgIHNlbGYuaW5jX3RhYigpICsgIjxlbXVsYXRvcj4vdXNyL2xpYmV4ZWMvcWVtdS1rdm08L2VtdWxhdG9yPiIgKyBcCisgICAgICAgICAgICBzZWxmLnRhYigpICsgIjxzZXJpYWwgdHlwZT0ncHR5Jz4iICtcCisgICAgICAgICAgICBzZWxmLmluY190YWIoKSArICI8dGFyZ2V0IHBvcnQ9JzAnLz4iICsgXAorICAgICAgICAgICAgc2VsZi5kZWNfdGFiKCkgKyAiPC9zZXJpYWw+IiArXAorICAgICAgICAgICAgc2VsZi50YWIoKSArICI8Y29uc29sZSB0eXBlPSdwdHknPiIgKyBcCisgICAgICAgICAgICBzZWxmLmluY190YWIoKSsgIjx0YXJnZXQgdHlwZT0nc2VyaWFsJyBwb3J0PScwJy8+IiArIFwKKyAgICAgICAgICAgIHNlbGYuZGVjX3RhYigpKyc8L2NvbnNvbGU+JworICAgICAgICBpZiB3aW5kb3dzX29zOgorICAgICAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjxjb250cm9sbGVyIHR5cGU9J3VzYicgaW5kZXg9JzAnLz4iICsgXAorICAgICAgICAgICAgICAgIHNlbGYudGFiKCkgKyAiPGNvbnRyb2xsZXIgdHlwZT0naWRlJyBpbmRleD0nMCcvPiIgKyBcCisgICAgICAgICAgICAgICAgc2VsZi50YWIoKSArICI8aW5wdXQgdHlwZT0nbW91c2UnIGJ1cz0ncHMyJy8+IiArIFwKKyAgICAgICAgICAgICAgICBzZWxmLnRhYigpICsgIjxzb3VuZCBtb2RlbD0naWNoNicvPiIgKyBcCisgICAgICAgICAgICAgICAgc2VsZi50YWIoKSArICI8dmlkZW8+IiArIFwKKyAgICAgICAgICAgICAgICBzZWxmLmluY190YWIoKSArICI8bW9kZWwgdHlwZT0nY2lycnVzJyB2cmFtPSc5MjE2JyBoZWFkcz0nMScvPiIgKyBcCisgICAgICAgICAgICAgICAgc2VsZi5kZWNfdGFiKCkgKyAiPC92aWRlbz4iICsgXAorICAgICAgICAgICAgICAgIHNlbGYudGFiKCkgKyAiPG1lbWJhbGxvb24gbW9kZWw9J3ZpcnRpbycvPiIgKyBcCisgICAgICAgICAgICAgICAgc2VsZi50YWIoKSArICI8aW5wdXQgdHlwZT0ndGFibGV0JyBidXM9J3VzYicvPiIgI1RPRE8gcmV2aXNhcgorCisjPiAgICAgICAgICAgICBzZWxmLnRhYigpKyc8YWxpYXMgbmFtZT1cJ2hvc3RkZXYwXCcvPlxuJyArXAorIz4gICAgICAgICAgICAgc2VsZi5kZWNfdGFiKCkrJzwvaG9zdGRldj5cbicgK1wKKyM+ICAgICAgICAgICAgIHNlbGYudGFiKCkrJzxpbnB1dCB0eXBlPVwndGFibGV0XCcgYnVzPVwndXNiXCcvPlxuJworICAgICAgICBpZiB3aW5kb3dzX29zOgorICAgICAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjxncmFwaGljcyB0eXBlPSd2bmMnIHBvcnQ9Jy0xJyBhdXRvcG9ydD0neWVzJy8+IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI0lmIGltYWdlIGNvbnRhaW5zICdHUkFQSCcgaW5jbHVkZSBncmFwaGljcworICAgICAgICAgICAgI2lmICdHUkFQSCcgaW4gaW1hZ2U6CisgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPGdyYXBoaWNzIHR5cGU9J3ZuYycgcG9ydD0nLTEnIGF1dG9wb3J0PSd5ZXMnIGxpc3Rlbj0nMC4wLjAuMCc+IiArXAorICAgICAgICAgICAgICAgIHNlbGYuaW5jX3RhYigpICsgIjxsaXN0ZW4gdHlwZT0nYWRkcmVzcycgYWRkcmVzcz0nMC4wLjAuMCcvPiIgK1wKKyAgICAgICAgICAgICAgICBzZWxmLmRlY190YWIoKSArICI8L2dyYXBoaWNzPiIKKworICAgICAgICB2ZF9pbmRleCA9ICdhJworICAgICAgICBmb3IgZGV2IGluIGRldl9saXN0OgorICAgICAgICAgICAgYnVzX2lkZV9kZXYgPSBidXNfaWRlCisgICAgICAgICAgICBpZiBkZXZbJ3R5cGUnXT09J2Nkcm9tJyBvciBkZXZbJ3R5cGUnXT09J2Rpc2snOgorICAgICAgICAgICAgICAgIGlmIGRldlsndHlwZSddPT0nY2Ryb20nOgorICAgICAgICAgICAgICAgICAgICBidXNfaWRlX2RldiA9IFRydWUKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPGRpc2sgdHlwZT0nZmlsZScgZGV2aWNlPSciK2RldlsndHlwZSddKyInPiIKKyAgICAgICAgICAgICAgICBpZiAnZmlsZSBmb3JtYXQnIGluIGRldjoKKyAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLmluY190YWIoKSArICI8ZHJpdmVyIG5hbWU9J3FlbXUnIHR5cGU9JyIgICtkZXZbJ2ZpbGUgZm9ybWF0J10rICInIGNhY2hlPSd3cml0ZXRocm91Z2gnLz4iCisgICAgICAgICAgICAgICAgaWYgJ3NvdXJjZSBmaWxlJyBpbiBkZXY6CisgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gc2VsZi50YWIoKSArICI8c291cmNlIGZpbGU9JyIgK2Rldlsnc291cmNlIGZpbGUnXSsgIicvPiIKKyAgICAgICAgICAgICAgICAjZWxpZiB2Wyd0eXBlJ10gPT0gJ2Jsb2NrJzoKKyAgICAgICAgICAgICAgICAjICAgIHRleHQgKz0gc2VsZi50YWIoKSArICI8c291cmNlIGRldj0nIiArIHZbJ3NvdXJjZSddICsgIicvPiIKKyAgICAgICAgICAgICAgICAjZWxzZToKKyAgICAgICAgICAgICAgICAjICAgIHJldHVybiAtMSwgJ1Vua25vd24gZGlzayB0eXBlICcgKyB2Wyd0eXBlJ10KKyAgICAgICAgICAgICAgICB2cGNpID0gZGV2LmdldCgndnBjaScsTm9uZSkKKyAgICAgICAgICAgICAgICBpZiB2cGNpID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHZwY2kgPSBkZXZbJ21ldGFkYXRhJ10uZ2V0KCd2cGNpJyxOb25lKQorICAgICAgICAgICAgICAgIHRleHQgKz0gc2VsZi5wY2kyeG1sKHZwY2kpCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBidXNfaWRlX2RldjoKKyAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjx0YXJnZXQgZGV2PSdoZCIgK3ZkX2luZGV4KyAiJyBidXM9J2lkZScvPiIgICAjVE9ETyBhbGxvd3Mgc2V2ZXJhbCB0eXBlIG9mIGRpc2tzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjx0YXJnZXQgZGV2PSd2ZCIgK3ZkX2luZGV4KyAiJyBidXM9J3ZpcnRpbycvPiIgCisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLmRlY190YWIoKSArICc8L2Rpc2s+JworICAgICAgICAgICAgICAgIHZkX2luZGV4ID0gY2hyKG9yZCh2ZF9pbmRleCkrMSkKKyAgICAgICAgICAgIGVsaWYgZGV2Wyd0eXBlJ109PSd4bWwnOgorICAgICAgICAgICAgICAgIGRldl90ZXh0ID0gZGV2Wyd4bWwnXQorICAgICAgICAgICAgICAgIGlmICd2cGNpJyBpbiBkZXY6CisgICAgICAgICAgICAgICAgICAgIGRldl90ZXh0ID0gZGV2X3RleHQucmVwbGFjZSgnX192cGNpX18nLCBkZXZbJ3ZwY2knXSkKKyAgICAgICAgICAgICAgICBpZiAnc291cmNlIGZpbGUnIGluIGRldjoKKyAgICAgICAgICAgICAgICAgICAgZGV2X3RleHQgPSBkZXZfdGV4dC5yZXBsYWNlKCdfX2ZpbGVfXycsIGRldlsnc291cmNlIGZpbGUnXSkKKyAgICAgICAgICAgICAgICBpZiAnZmlsZSBmb3JtYXQnIGluIGRldjoKKyAgICAgICAgICAgICAgICAgICAgZGV2X3RleHQgPSBkZXZfdGV4dC5yZXBsYWNlKCdfX2Zvcm1hdF9fJywgZGV2Wydzb3VyY2UgZmlsZSddKQorICAgICAgICAgICAgICAgIGlmICdfX2Rldl9fJyBpbiBkZXZfdGV4dDoKKyAgICAgICAgICAgICAgICAgICAgZGV2X3RleHQgPSBkZXZfdGV4dC5yZXBsYWNlKCdfX2Rldl9fJywgdmRfaW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHZkX2luZGV4ID0gY2hyKG9yZCh2ZF9pbmRleCkrMSkKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IGRldl90ZXh0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAtMSwgJ1Vua25vd24gZGV2aWNlIHR5cGUgJyArIGRldlsndHlwZSddCisKKyAgICAgICAgbmV0X25iPTAKKyAgICAgICAgYnJpZGdlX2ludGVyZmFjZXMgPSBzZXJ2ZXIuZ2V0KCduZXR3b3JrcycsIFtdKQorICAgICAgICBmb3IgdiBpbiBicmlkZ2VfaW50ZXJmYWNlczoKKyAgICAgICAgICAgICNHZXQgdGhlIGJyaWZnZSBuYW1lCisgICAgICAgICAgICBzZWxmLmRiX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBzZWxmLmRiLmdldF90YWJsZShGUk9NPSduZXRzJywgU0VMRUNUPSgncHJvdmlkZXInLCksV0hFUkU9eyd1dWlkJzp2WyduZXRfaWQnXX0gKQorICAgICAgICAgICAgc2VsZi5kYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgaWYgcmVzdWx0IDw9IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgImNyZWF0ZV94bWxfc2VydmVyIEVSUk9SIGdldHRpbmcgbmV0cyIscmVzdWx0LCBjb250ZW50CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCBjb250ZW50CisgICAgICAgICAgICAjQUxGOiBBbGxvdyBieSB0aGUgbW9tZW50IHRoZSAnZGVmYXVsdCcgYnJpZGdlIG5ldCBiZWNhdXNlIGlzIGNvbmZvcnRhYmxlIGZvciBwcm92aWRlIGludGVybmV0IHRvIFZNCisgICAgICAgICAgICAjSSBrbm93IGl0IGlzIG5vdCBzZWN1cmUgICAgCisgICAgICAgICAgICAjZm9yIHYgaW4gc29ydGVkKGRlc2NbJ25ldHdvcmsgaW50ZXJmYWNlcyddLml0ZXJ2YWx1ZXMoKSk6CisgICAgICAgICAgICBtb2RlbCA9IHYuZ2V0KCJtb2RlbCIsIE5vbmUpCisgICAgICAgICAgICBpZiBjb250ZW50WzBdWydwcm92aWRlciddPT0nZGVmYXVsdCc6CisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjxpbnRlcmZhY2UgdHlwZT0nbmV0d29yayc+IiArIFwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmNfdGFiKCkgKyAiPHNvdXJjZSBuZXR3b3JrPSciICtjb250ZW50WzBdWydwcm92aWRlciddKyAiJy8+IgorICAgICAgICAgICAgZWxpZiBjb250ZW50WzBdWydwcm92aWRlciddWzA6N109PSdtYWN2dGFwJzoKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkrIjxpbnRlcmZhY2UgdHlwZT0nZGlyZWN0Jz4iICsgXAorICAgICAgICAgICAgICAgICAgICBzZWxmLmluY190YWIoKSArICI8c291cmNlIGRldj0nIiArIHNlbGYuZ2V0X2xvY2FsX2lmYWNlX25hbWUoY29udGVudFswXVsncHJvdmlkZXInXVs4Ol0pICsgIicgbW9kZT0nYnJpZGdlJy8+IiArIFwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YWIoKSArICI8dGFyZ2V0IGRldj0nbWFjdnRhcDAnLz4iCisgICAgICAgICAgICAgICAgaWYgd2luZG93c19vczoKKyAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjxhbGlhcyBuYW1lPSduZXQiICsgc3RyKG5ldF9uYikgKyAiJy8+IgorICAgICAgICAgICAgICAgIGVsaWYgbW9kZWw9PU5vbmU6CisgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gInZpcnRpbyIKKyAgICAgICAgICAgIGVsaWYgY29udGVudFswXVsncHJvdmlkZXInXVswOjZdPT0nYnJpZGdlJzoKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPGludGVyZmFjZSB0eXBlPSdicmlkZ2UnPiIgKyAgXAorICAgICAgICAgICAgICAgICAgICBzZWxmLmluY190YWIoKSsiPHNvdXJjZSBicmlkZ2U9JyIgK3NlbGYuZ2V0X2xvY2FsX2lmYWNlX25hbWUoY29udGVudFswXVsncHJvdmlkZXInXVs3Ol0pKyAiJy8+IgorICAgICAgICAgICAgICAgIGlmIHdpbmRvd3Nfb3M6CisgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gc2VsZi50YWIoKSArICI8dGFyZ2V0IGRldj0ndm5ldCIgKyBzdHIobmV0X25iKSsgIicvPiIgK1wKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFiKCkgKyAiPGFsaWFzIG5hbWU9J25ldCIgKyBzdHIobmV0X25iKSsgIicvPiIKKyAgICAgICAgICAgICAgICBlbGlmIG1vZGVsPT1Ob25lOgorICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICJ2aXJ0aW8iCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAtMSwgJ1Vua25vd24gQnJpZGdlIG5ldCBwcm92aWRlciAnICsgY29udGVudFswXVsncHJvdmlkZXInXQorICAgICAgICAgICAgaWYgbW9kZWwhPU5vbmU6CisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjxtb2RlbCB0eXBlPSciICttb2RlbCsgIicvPiIKKyAgICAgICAgICAgIGlmIHYuZ2V0KCdtYWNfYWRkcmVzcycsIE5vbmUpICE9IE5vbmU6CisgICAgICAgICAgICAgICAgdGV4dCs9IHNlbGYudGFiKCkgKyI8bWFjIGFkZHJlc3M9JyIgK3ZbJ21hY19hZGRyZXNzJ10rICInLz4iCisgICAgICAgICAgICB0ZXh0ICs9IHNlbGYucGNpMnhtbCh2LmdldCgndnBjaScsTm9uZSkpCisgICAgICAgICAgICB0ZXh0ICs9IHNlbGYuZGVjX3RhYigpKyc8L2ludGVyZmFjZT4nCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5ldF9uYiArPSAxCisKKyAgICAgICAgaW50ZXJmYWNlcyA9IG51bWEuZ2V0KCdpbnRlcmZhY2VzJywgW10pCisKKyAgICAgICAgbmV0X25iPTAKKyAgICAgICAgZm9yIHYgaW4gaW50ZXJmYWNlczoKKyAgICAgICAgICAgIGlmIHNlbGYuZGV2ZWxvcF9tb2RlOiAjbWFwIHRoZXNlIGludGVyZmFjZXMgdG8gYnJpZGdlcworICAgICAgICAgICAgICAgIHRleHQgKz0gc2VsZi50YWIoKSArICI8aW50ZXJmYWNlIHR5cGU9J2JyaWRnZSc+IiArICBcCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5jX3RhYigpKyI8c291cmNlIGJyaWRnZT0nIiArc2VsZi5kZXZlbG9wX2JyaWRnZV9pZmFjZSsgIicvPiIKKyAgICAgICAgICAgICAgICBpZiB3aW5kb3dzX29zOgorICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPHRhcmdldCBkZXY9J3ZuZXQiICsgc3RyKG5ldF9uYikrICInLz4iICtcCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhYigpICsgIjxhbGlhcyBuYW1lPSduZXQiICsgc3RyKG5ldF9uYikrICInLz4iCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjxtb2RlbCB0eXBlPSdlMTAwMCcvPiIgI2UxMDAwIGlzIG1vcmUgcHJvYmFibGUgdG8gYmUgc3VwcG9ydGVkIHRoYW4gJ3ZpcnRpbycKKyAgICAgICAgICAgICAgICBpZiB2LmdldCgnbWFjX2FkZHJlc3MnLCBOb25lKSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICB0ZXh0Kz0gc2VsZi50YWIoKSArIjxtYWMgYWRkcmVzcz0nIiArdlsnbWFjX2FkZHJlc3MnXSsgIicvPiIKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IHNlbGYucGNpMnhtbCh2LmdldCgndnBjaScsTm9uZSkpCisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLmRlY190YWIoKSsnPC9pbnRlcmZhY2U+JworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiB2WydkZWRpY2F0ZWQnXSA9PSAneWVzJzogICNwYXNzdGhyb3VnaHQKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPGhvc3RkZXYgbW9kZT0nc3Vic3lzdGVtJyB0eXBlPSdwY2knIG1hbmFnZWQ9J3llcyc+IiArIFwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmNfdGFiKCkgKyAiPHNvdXJjZT4iCisgICAgICAgICAgICAgICAgc2VsZi5pbmNfdGFiKCkKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IHNlbGYucGNpMnhtbCh2Wydzb3VyY2UnXSkKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IHNlbGYuZGVjX3RhYigpKyc8L3NvdXJjZT4nCisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnBjaTJ4bWwodi5nZXQoJ3ZwY2knLE5vbmUpKQorICAgICAgICAgICAgICAgIGlmIHdpbmRvd3Nfb3M6CisgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gc2VsZi50YWIoKSArICI8YWxpYXMgbmFtZT0naG9zdGRldiIgKyBzdHIobmV0X25iKSArICInLz4iCisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLmRlY190YWIoKSsnPC9ob3N0ZGV2PicKKyAgICAgICAgICAgICAgICBuZXRfbmIgKz0gMQorICAgICAgICAgICAgZWxzZTogICAgICAgICNzcmlvdl9pbnRlcmZhY2VzCisgICAgICAgICAgICAgICAgI3NraXAgbm90IGNvbm5lY3RlZCBpbnRlcmZhY2VzCisgICAgICAgICAgICAgICAgaWYgdi5nZXQoIm5ldF9pZCIpID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnRhYigpICsgIjxpbnRlcmZhY2UgdHlwZT0naG9zdGRldicgbWFuYWdlZD0neWVzJz4iCisgICAgICAgICAgICAgICAgc2VsZi5pbmNfdGFiKCkKKyAgICAgICAgICAgICAgICBpZiB2LmdldCgnbWFjX2FkZHJlc3MnLCBOb25lKSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICB0ZXh0Kz0gc2VsZi50YWIoKSArICI8bWFjIGFkZHJlc3M9JyIgK3ZbJ21hY19hZGRyZXNzJ10rICInLz4iCisgICAgICAgICAgICAgICAgdGV4dCs9IHNlbGYudGFiKCkrJzxzb3VyY2U+JworICAgICAgICAgICAgICAgIHNlbGYuaW5jX3RhYigpCisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnBjaTJ4bWwodlsnc291cmNlJ10pCisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLmRlY190YWIoKSsnPC9zb3VyY2U+JworICAgICAgICAgICAgICAgIGlmIHYuZ2V0KCd2bGFuJyxOb25lKSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHNlbGYudGFiKCkgKyAiPHZsYW4+ICAgPHRhZyBpZD0nIiArIHN0cih2Wyd2bGFuJ10pICsgIicvPiAgIDwvdmxhbj4iCisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLnBjaTJ4bWwodi5nZXQoJ3ZwY2knLE5vbmUpKQorICAgICAgICAgICAgICAgIGlmIHdpbmRvd3Nfb3M6CisgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gc2VsZi50YWIoKSArICI8YWxpYXMgbmFtZT0naG9zdGRldiIgKyBzdHIobmV0X25iKSArICInLz4iCisgICAgICAgICAgICAgICAgdGV4dCArPSBzZWxmLmRlY190YWIoKSsnPC9pbnRlcmZhY2U+JworCisgICAgICAgICAgICAKKyAgICAgICAgdGV4dCArPSBzZWxmLmRlY190YWIoKSsnPC9kZXZpY2VzPicrXAorICAgICAgICBzZWxmLmRlY190YWIoKSsnPC9kb21haW4+JworICAgICAgICByZXR1cm4gMCwgdGV4dAorICAgIAorICAgIGRlZiBwY2kyeG1sKHNlbGYsIHBjaSk6CisgICAgICAgICcnJ2Zyb20gYSBwY2kgZm9ybWF0IHRleHQgWFhYWDpYWDpYWC5YIGdlbmVyYXRlcyB0aGUgeG1sIGNvbnRlbnQgb2YgPGFkZHJlc3M+CisgICAgICAgIGFsb3dzIGFuIGVtcHR5IHBjaSB0ZXh0JycnCisgICAgICAgIGlmIHBjaSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIGZpcnN0X3BhcnQgPSBwY2kuc3BsaXQoJzonKQorICAgICAgICBzZWNvbmRfcGFydCA9IGZpcnN0X3BhcnRbMl0uc3BsaXQoJy4nKQorICAgICAgICByZXR1cm4gc2VsZi50YWIoKSArICI8YWRkcmVzcyB0eXBlPSdwY2knIGRvbWFpbj0nMHgiICsgZmlyc3RfcGFydFswXSArIFwKKyAgICAgICAgICAgICAgICAgICAgIicgYnVzPScweCIgKyBmaXJzdF9wYXJ0WzFdICsgIicgc2xvdD0nMHgiICsgc2Vjb25kX3BhcnRbMF0gKyBcCisgICAgICAgICAgICAgICAgICAgICInIGZ1bmN0aW9uPScweCIgKyBzZWNvbmRfcGFydFsxXSArICInLz4iIAorICAgIAorICAgIGRlZiB0YWIoc2VsZik6CisgICAgICAgICIiIlJldHVybiBpbmRlbnRhdGlvbiBhY2NvcmRpbmcgdG8geG1sX2xldmVsIiIiCisgICAgICAgIHJldHVybiAiXG4iICsgKCcgICcqc2VsZi54bWxfbGV2ZWwpCisgICAgCisgICAgZGVmIGluY190YWIoc2VsZik6CisgICAgICAgICIiIkluY3JlbWVudCBhbmQgcmV0dXJuIGluZGVudGF0aW9uIGFjY29yZGluZyB0byB4bWxfbGV2ZWwiIiIKKyAgICAgICAgc2VsZi54bWxfbGV2ZWwgKz0gMQorICAgICAgICByZXR1cm4gc2VsZi50YWIoKQorICAgIAorICAgIGRlZiBkZWNfdGFiKHNlbGYpOgorICAgICAgICAiIiJEZWNyZW1lbnQgYW5kIHJldHVybiBpbmRlbnRhdGlvbiBhY2NvcmRpbmcgdG8geG1sX2xldmVsIiIiCisgICAgICAgIHNlbGYueG1sX2xldmVsIC09IDEKKyAgICAgICAgcmV0dXJuIHNlbGYudGFiKCkKKyAgICAKKyAgICBkZWYgZ2V0X2ZpbGVfaW5mbyhzZWxmLCBwYXRoKToKKyAgICAgICAgY29tbWFuZCA9ICdscyAtbEwgLS10aW1lLXN0eWxlPSslWS0lbS0lZFQlSDolTTolUyAnICsgcGF0aAorICAgICAgICBwcmludCBzZWxmLm5hbWUsICc6IGNvbW1hbmQ6JywgY29tbWFuZAorICAgICAgICAoXywgc3Rkb3V0LCBfKSA9IHNlbGYuc3NoX2Nvbm4uZXhlY19jb21tYW5kKGNvbW1hbmQpCisgICAgICAgIGNvbnRlbnQgPSBzdGRvdXQucmVhZCgpCisgICAgICAgIGlmIGxlbihjb250ZW50KSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUgIyBmaWxlIGRvZXMgbm90IGV4aXN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY29udGVudC5zcGxpdCgiICIpICMocGVybWlzc2lvbiwgMSwgb3duZXIsIGdyb3VwLCBzaXplLCBkYXRlLCBmaWxlKQorCisgICAgZGVmIHFlbXVfZ2V0X2luZm8oc2VsZiwgcGF0aCk6CisgICAgICAgIGNvbW1hbmQgPSAncWVtdS1pbWcgaW5mbyAnICsgcGF0aAorICAgICAgICBwcmludCBzZWxmLm5hbWUsICc6IGNvbW1hbmQ6JywgY29tbWFuZAorICAgICAgICAoXywgc3Rkb3V0LCBzdGRlcnIpID0gc2VsZi5zc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICAgICAgY29udGVudCA9IHN0ZG91dC5yZWFkKCkKKyAgICAgICAgaWYgbGVuKGNvbnRlbnQpID09IDA6CisgICAgICAgICAgICBlcnJvciA9IHN0ZGVyci5yZWFkKCkKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZ2V0X3FlbXVfaW5mbyBlcnJvciAiLCBlcnJvcgorICAgICAgICAgICAgcmFpc2UgcGFyYW1pa28uc3NoX2V4Y2VwdGlvbi5TU0hFeGNlcHRpb24oIkVycm9yIGdldHRpbmcgcWVtdV9pbmZvOiAiICsgZXJyb3IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6IAorICAgICAgICAgICAgICAgIHJldHVybiB5YW1sLmxvYWQoY29udGVudCkKKyAgICAgICAgICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgdGV4dCA9ICIiCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihleGMsICdwcm9ibGVtX21hcmsnKToKKyAgICAgICAgICAgICAgICAgICAgbWFyayA9IGV4Yy5wcm9ibGVtX21hcmsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIgYXQgcG9zaXRpb246ICglczolcykiICUgKG1hcmsubGluZSsxLCBtYXJrLmNvbHVtbisxKQorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZ2V0X3FlbXVfaW5mbyB5YW1sIGZvcm1hdCBFeGNlcHRpb24iLCB0ZXh0CisgICAgICAgICAgICAgICAgcmFpc2UgcGFyYW1pa28uc3NoX2V4Y2VwdGlvbi5TU0hFeGNlcHRpb24oIkVycm9yIGdldHRpbmcgcWVtdV9pbmZvIHlhbWwgZm9ybWF0IiArIHRleHQpCisKKyAgICBkZWYgcWVtdV9jaGFuZ2VfYmFja2luZyhzZWxmLCBpbmNfZmlsZSwgbmV3X2JhY2tpbmdfZmlsZSk6CisgICAgICAgIGNvbW1hbmQgPSAncWVtdS1pbWcgcmViYXNlIC11IC1iICcgKyBuZXdfYmFja2luZ19maWxlICsgJyAnICsgaW5jX2ZpbGUgCisgICAgICAgIHByaW50IHNlbGYubmFtZSwgJzogY29tbWFuZDonLCBjb21tYW5kCisgICAgICAgIChfLCBfLCBzdGRlcnIpID0gc2VsZi5zc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICAgICAgY29udGVudCA9IHN0ZGVyci5yZWFkKCkKKyAgICAgICAgaWYgbGVuKGNvbnRlbnQpID09IDA6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBxZW11X2NoYW5nZV9iYWNraW5nIGVycm9yOiAiLCBjb250ZW50CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAKKyAgICBkZWYgZ2V0X25vdHVzZWRfZmlsZW5hbWUoc2VsZiwgcHJvcG9zZWRfbmFtZSwgc3VmZml4PScnKToKKyAgICAgICAgJycnTG9vayBmb3IgYSBub24gZXhpc3RpbmcgZmlsZV9uYW1lIGluIHRoZSBob3N0CisgICAgICAgICAgICBwcm9wb3NlZF9uYW1lOiBwcm9wb3NlZCBmaWxlIG5hbWUsIGluY2x1ZGVzIHBhdGgKKyAgICAgICAgICAgIHN1ZmZpeDogc3VmZml4IHRvIGJlIGFkZGVkIHRvIHRoZSBuYW1lLCBiZWZvcmUgdGhlIGV4dGVudGlvbgorICAgICAgICAnJycKKyAgICAgICAgZXh0ZW5zaW9uID0gcHJvcG9zZWRfbmFtZS5yZmluZCgiLiIpCisgICAgICAgIHNsYXNoID0gcHJvcG9zZWRfbmFtZS5yZmluZCgiLyIpCisgICAgICAgIGlmIGV4dGVuc2lvbiA8IDAgb3IgZXh0ZW5zaW9uIDwgc2xhc2g6ICMgbm8gZXh0ZW5zaW9uCisgICAgICAgICAgICBleHRlbnNpb24gPSBsZW4ocHJvcG9zZWRfbmFtZSkKKyAgICAgICAgdGFyZ2V0X25hbWUgPSBwcm9wb3NlZF9uYW1lWzpleHRlbnNpb25dICsgc3VmZml4ICsgcHJvcG9zZWRfbmFtZVtleHRlbnNpb246XQorICAgICAgICBpbmZvID0gc2VsZi5nZXRfZmlsZV9pbmZvKHRhcmdldF9uYW1lKQorICAgICAgICBpZiBpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0X25hbWUKKyAgICAgICAgCisgICAgICAgIGluZGV4PTAKKyAgICAgICAgd2hpbGUgaW5mbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRhcmdldF9uYW1lID0gcHJvcG9zZWRfbmFtZVs6ZXh0ZW5zaW9uXSArIHN1ZmZpeCArICAiLSIgKyBzdHIoaW5kZXgpICsgcHJvcG9zZWRfbmFtZVtleHRlbnNpb246XQorICAgICAgICAgICAgaW5kZXgrPTEKKyAgICAgICAgICAgIGluZm8gPSBzZWxmLmdldF9maWxlX2luZm8odGFyZ2V0X25hbWUpIAorICAgICAgICByZXR1cm4gdGFyZ2V0X25hbWUKKyAgICAKKyAgICBkZWYgZ2V0X25vdHVzZWRfcGF0aChzZWxmLCBwcm9wb3NlZF9wYXRoLCBzdWZmaXg9JycpOgorICAgICAgICAnJydMb29rIGZvciBhIG5vbiBleGlzdGluZyBwYXRoIGF0IGRhdGFiYXNlIGZvciBpbWFnZXMKKyAgICAgICAgICAgIHByb3Bvc2VkX3BhdGg6IHByb3Bvc2VkIGZpbGUgbmFtZSwgaW5jbHVkZXMgcGF0aAorICAgICAgICAgICAgc3VmZml4OiBzdWZmaXggdG8gYmUgYWRkZWQgdG8gdGhlIG5hbWUsIGJlZm9yZSB0aGUgZXh0ZW50aW9uCisgICAgICAgICcnJworICAgICAgICBleHRlbnNpb24gPSBwcm9wb3NlZF9wYXRoLnJmaW5kKCIuIikKKyAgICAgICAgaWYgZXh0ZW5zaW9uIDwgMDoKKyAgICAgICAgICAgIGV4dGVuc2lvbiA9IGxlbihwcm9wb3NlZF9wYXRoKQorICAgICAgICBpZiBzdWZmaXggIT0gTm9uZToKKyAgICAgICAgICAgIHRhcmdldF9wYXRoID0gcHJvcG9zZWRfcGF0aFs6ZXh0ZW5zaW9uXSArIHN1ZmZpeCArIHByb3Bvc2VkX3BhdGhbZXh0ZW5zaW9uOl0KKyAgICAgICAgaW5kZXg9MAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgcixfPXNlbGYuZGIuZ2V0X3RhYmxlKEZST009ImltYWdlcyIsV0hFUkU9eyJwYXRoIjp0YXJnZXRfcGF0aH0pCisgICAgICAgICAgICBpZiByPD0wOgorICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRfcGF0aAorICAgICAgICAgICAgdGFyZ2V0X3BhdGggPSBwcm9wb3NlZF9wYXRoWzpleHRlbnNpb25dICsgc3VmZml4ICsgICItIiArIHN0cihpbmRleCkgKyBwcm9wb3NlZF9wYXRoW2V4dGVuc2lvbjpdCisgICAgICAgICAgICBpbmRleCs9MQorCisgICAgCisgICAgZGVmIGRlbGV0ZV9maWxlKHNlbGYsIGZpbGVfbmFtZSk6CisgICAgICAgIGNvbW1hbmQgPSAncm0gLWYgJytmaWxlX25hbWUKKyAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAnOiBjb21tYW5kOicsIGNvbW1hbmQKKyAgICAgICAgKF8sIF8sIHN0ZGVycikgPSBzZWxmLnNzaF9jb25uLmV4ZWNfY29tbWFuZChjb21tYW5kKQorICAgICAgICBlcnJvcl9tc2cgPSBzdGRlcnIucmVhZCgpCisgICAgICAgIGlmIGxlbihlcnJvcl9tc2cpID4gMDoKKyAgICAgICAgICAgIHJhaXNlIHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uKCJFcnJvciBkZWxldGluZyBmaWxlOiAiICsgZXJyb3JfbXNnKQorCisgICAgZGVmIGNvcHlfZmlsZShzZWxmLCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBwZXJzZXJ2ZV90aW1lPVRydWUpOgorICAgICAgICBjb21tYW5kID0gJ2NwIC0tbm8tcHJlc2VydmU9bW9kZSAnCisgICAgICAgIGlmIHBlcnNlcnZlX3RpbWU6IGNvbW1hbmQgKz0gJy0tcHJlc2VydmU9dGltZXN0YW1wcyAnCisgICAgICAgIGNvbW1hbmQgKz0gIHNvdXJjZSArICcgJyAgKyBkZXN0aW5hdGlvbgorICAgICAgICBwcmludCBzZWxmLm5hbWUsICc6IGNvbW1hbmQ6JywgY29tbWFuZAorICAgICAgICAoXywgXywgc3RkZXJyKSA9IHNlbGYuc3NoX2Nvbm4uZXhlY19jb21tYW5kKGNvbW1hbmQpCisgICAgICAgIGVycm9yX21zZyA9IHN0ZGVyci5yZWFkKCkKKyAgICAgICAgaWYgbGVuKGVycm9yX21zZykgPiAwOgorICAgICAgICAgICAgcmFpc2UgcGFyYW1pa28uc3NoX2V4Y2VwdGlvbi5TU0hFeGNlcHRpb24oIkVycm9yIGNvcHlpbmcgaW1hZ2UgdG8gbG9jYWwgaG9zdDogIiArIGVycm9yX21zZykKKworICAgIGRlZiBjb3B5X3JlbW90ZV9maWxlKHNlbGYsIHJlbW90ZV9maWxlLCB1c2VfaW5jcmVtZW50YWwpOgorICAgICAgICAnJycgQ29weSBhIGZpbGUgZnJvbSB0aGUgcmVwb3NpdG9yeSB0byBsb2NhbCBmb2xkZXIgYW5kIHJlY3Vyc2l2ZWx5IAorICAgICAgICAgICAgY29weSB0aGUgYmFja2luZyBmaWxlcyBpbiBjYXNlIHRoZSByZW1vdGUgZmlsZSBpcyBpbmNyZW1lbnRhbAorICAgICAgICAgICAgUmVhZCBhbmQvb3IgbW9kaWZpZWQgc2VsZi5sb2NhbGluZm9bJ2ZpbGVzJ10gdGhhdCBjb250YWluIHRoZQorICAgICAgICAgICAgdW5tb2RpZmllZCBjb3BpZXMgb2YgaW1hZ2VzIGluIHRoZSBsb2NhbCBwYXRoCisgICAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAgICAgcmVtb3RlX2ZpbGU6IHBhdGggb2YgcmVtb3RlIGZpbGUKKyAgICAgICAgICAgICAgICB1c2VfaW5jcmVtZW50YWw6IE5vbmUgKGxlYXZlIHRoZSBkZWNpc2lvbiB0byB0aGlzIGZ1bmN0aW9uKSwgVHJ1ZSwgRmFsc2UKKyAgICAgICAgICAgIHJldHVybjoKKyAgICAgICAgICAgICAgICBsb2NhbF9maWxlOiBuYW1lIG9mIGxvY2FsIGZpbGUKKyAgICAgICAgICAgICAgICBxZW11X2luZm86IGRpY3Qgd2l0aCBxdWVtdSBpbmZvcm1hdGlvbiBvZiBsb2NhbCBmaWxlCisgICAgICAgICAgICAgICAgdXNlX2luY3JlbWVudGFsX291dDogVHJ1ZSwgRmFsc2U7IHNhbWUgYXMgdXNlX2luY3JlbWVudGFsLCBidXQgaWYgTm9uZSBhIGRlY2lzaW9uIGlzIHRha2VuCisgICAgICAgICcnJworICAgICAgICAKKyAgICAgICAgdXNlX2luY3JlbWVudGFsX291dCA9IHVzZV9pbmNyZW1lbnRhbAorICAgICAgICBuZXdfYmFja2luZ19maWxlID0gTm9uZQorICAgICAgICBsb2NhbF9maWxlID0gTm9uZQorCisgICAgICAgICNpbiBjYXNlIGluY3JlbWVudGFsIHVzZSBpcyBub3QgZGVjaWRlZCwgdGFrZSB0aGUgZGVjaXNpb24gZGVwZW5kaW5nIG9uIHRoZSBpbWFnZQorICAgICAgICAjYXZvaWQgdGhlIHVzZSBvZiBpbmNyZW1lbnRhbCBpZiB0aGlzIGltYWdlIGlzIGFscmVhZHkgaW5jcmVtZW50YWwKKyAgICAgICAgcWVtdV9yZW1vdGVfaW5mbyA9IHNlbGYucWVtdV9nZXRfaW5mbyhyZW1vdGVfZmlsZSkKKyAgICAgICAgaWYgdXNlX2luY3JlbWVudGFsX291dD09Tm9uZToKKyAgICAgICAgICAgIHVzZV9pbmNyZW1lbnRhbF9vdXQgPSBub3QgJ2JhY2tpbmcgZmlsZScgaW4gcWVtdV9yZW1vdGVfaW5mbworICAgICAgICAjY29weSByZWN1cnNpdmVsbHkgdGhlIGJhY2tpbmcgZmlsZXMKKyAgICAgICAgaWYgJ2JhY2tpbmcgZmlsZScgaW4gcWVtdV9yZW1vdGVfaW5mbzoKKyAgICAgICAgICAgIG5ld19iYWNraW5nX2ZpbGUsIF8sIF8gPSBzZWxmLmNvcHlfcmVtb3RlX2ZpbGUocWVtdV9yZW1vdGVfaW5mb1snYmFja2luZyBmaWxlJ10sIFRydWUpCisgICAgICAgIAorICAgICAgICAjY2hlY2sgaWYgcmVtb3RlIGZpbGUgaXMgcHJlc2VudCBsb2NhbGx5CisgICAgICAgIGlmIHVzZV9pbmNyZW1lbnRhbF9vdXQgYW5kIHJlbW90ZV9maWxlIGluIHNlbGYubG9jYWxpbmZvWydmaWxlcyddOgorICAgICAgICAgICAgbG9jYWxfZmlsZSA9IHNlbGYubG9jYWxpbmZvWydmaWxlcyddW3JlbW90ZV9maWxlXQorICAgICAgICAgICAgbG9jYWxfZmlsZV9pbmZvID0gIHNlbGYuZ2V0X2ZpbGVfaW5mbyhsb2NhbF9maWxlKQorICAgICAgICAgICAgcmVtb3RlX2ZpbGVfaW5mbyA9IHNlbGYuZ2V0X2ZpbGVfaW5mbyhyZW1vdGVfZmlsZSkKKyAgICAgICAgICAgIGlmIGxvY2FsX2ZpbGVfaW5mbyA9PSBOb25lOgorICAgICAgICAgICAgICAgIGxvY2FsX2ZpbGUgPSBOb25lCisgICAgICAgICAgICBlbGlmIGxvY2FsX2ZpbGVfaW5mb1s0XSE9cmVtb3RlX2ZpbGVfaW5mb1s0XSBvciBsb2NhbF9maWxlX2luZm9bNV0hPXJlbW90ZV9maWxlX2luZm9bNV06CisgICAgICAgICAgICAgICAgI2xvY2FsIGNvcHkgb2YgZmlsZSBub3QgdmFsaWQgYmVjYXVzZSBkYXRlIG9yIHNpemUgYXJlIGRpZmZlcmVudC4gCisgICAgICAgICAgICAgICAgI1RPRE8gREVMRVRFIGxvY2FsIGZpbGUgaWYgdGhpcyBmaWxlIGlzIG5vdCB1c2VkIGJ5IGFueSBhY3RpdmUgdmlydHVhbCBtYWNoaW5lCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKGxvY2FsX2ZpbGUpCisgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLmxvY2FsaW5mb1snZmlsZXMnXVtyZW1vdGVfZmlsZV0KKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgbG9jYWxfZmlsZSA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6ICNjaGVjayB0aGF0IHRoZSBsb2NhbCBmaWxlIGhhcyB0aGUgc2FtZSBiYWNraW5nIGZpbGUsIG9yIHRoZXJlIGFyZSBub3QgYmFja2luZyBhdCBhbGwKKyAgICAgICAgICAgICAgICBxZW11X2luZm8gPSBzZWxmLnFlbXVfZ2V0X2luZm8obG9jYWxfZmlsZSkKKyAgICAgICAgICAgICAgICBpZiBuZXdfYmFja2luZ19maWxlICE9IHFlbXVfaW5mby5nZXQoJ2JhY2tpbmcgZmlsZScpOgorICAgICAgICAgICAgICAgICAgICBsb2NhbF9maWxlID0gTm9uZQorICAgICAgICAgICAgICAgIAorCisgICAgICAgIGlmIGxvY2FsX2ZpbGUgPT0gTm9uZTogI2NvcHkgdGhlIGZpbGUgCisgICAgICAgICAgICBpbWdfbmFtZT0gcmVtb3RlX2ZpbGUuc3BsaXQoJy8nKSBbLTFdCisgICAgICAgICAgICBpbWdfbG9jYWwgPSBzZWxmLmltYWdlX3BhdGggKyAnLycgKyBpbWdfbmFtZQorICAgICAgICAgICAgbG9jYWxfZmlsZSA9IHNlbGYuZ2V0X25vdHVzZWRfZmlsZW5hbWUoaW1nX2xvY2FsKQorICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUocmVtb3RlX2ZpbGUsIGxvY2FsX2ZpbGUsIHVzZV9pbmNyZW1lbnRhbF9vdXQpCisKKyAgICAgICAgICAgIGlmIHVzZV9pbmNyZW1lbnRhbF9vdXQ6CisgICAgICAgICAgICAgICAgc2VsZi5sb2NhbGluZm9bJ2ZpbGVzJ11bcmVtb3RlX2ZpbGVdID0gbG9jYWxfZmlsZQorICAgICAgICAgICAgaWYgbmV3X2JhY2tpbmdfZmlsZToKKyAgICAgICAgICAgICAgICBzZWxmLnFlbXVfY2hhbmdlX2JhY2tpbmcobG9jYWxfZmlsZSwgbmV3X2JhY2tpbmdfZmlsZSkKKyAgICAgICAgICAgIHFlbXVfaW5mbyA9IHNlbGYucWVtdV9nZXRfaW5mbyhsb2NhbF9maWxlKQorICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBsb2NhbF9maWxlLCBxZW11X2luZm8sIHVzZV9pbmNyZW1lbnRhbF9vdXQKKyAgICAgICAgICAgIAorICAgIGRlZiBsYXVuY2hfc2VydmVyKHNlbGYsIGNvbm4sIHNlcnZlciwgcmVidWlsZD1GYWxzZSwgZG9tYWluPU5vbmUpOgorICAgICAgICBpZiBzZWxmLnRlc3Q6CisgICAgICAgICAgICB0aW1lLnNsZWVwKHJhbmRvbS5yYW5kaW50KDIwLDE1MCkpICNzbGVlcCByYW5kb20gdGltZXRvIGJlIG1ha2UgaXQgYSBiaXQgbW9yZSByZWFsCisgICAgICAgICAgICByZXR1cm4gMCwgJ1N1Y2Nlc3MnCisKKyAgICAgICAgc2VydmVyX2lkID0gc2VydmVyWyd1dWlkJ10KKyAgICAgICAgcGF1c2VkID0gc2VydmVyLmdldCgncGF1c2VkJywnbm8nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBkb21haW4hPU5vbmUgYW5kIHJlYnVpbGQ9PUZhbHNlOgorICAgICAgICAgICAgICAgIGRvbWFpbi5yZXN1bWUoKQorICAgICAgICAgICAgICAgICNzZWxmLnNlcnZlcl9zdGF0dXNbc2VydmVyX2lkXSA9ICdBQ1RJVkUnCisgICAgICAgICAgICAgICAgcmV0dXJuIDAsICdTdWNjZXNzJworCisgICAgICAgICAgICBzZWxmLmRiX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICByZXN1bHQsIHNlcnZlcl9kYXRhID0gc2VsZi5kYi5nZXRfaW5zdGFuY2Uoc2VydmVyX2lkKQorICAgICAgICAgICAgc2VsZi5kYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgaWYgcmVzdWx0IDw9IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBsYXVuY2hfc2VydmVyIEVSUk9SIGdldHRpbmcgc2VydmVyIGZyb20gREIiLHJlc3VsdCwgc2VydmVyX2RhdGEKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LCBzZXJ2ZXJfZGF0YQorICAgIAorICAgICAgICAjMDogZ2V0IGltYWdlIG1ldGFkYXRhCisgICAgICAgICAgICBzZXJ2ZXJfbWV0YWRhdGEgPSBzZXJ2ZXIuZ2V0KCdtZXRhZGF0YScsIHt9KQorICAgICAgICAgICAgdXNlX2luY3JlbWVudGFsID0gTm9uZQorICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgInVzZV9pbmNyZW1lbnRhbCIgaW4gc2VydmVyX21ldGFkYXRhOgorICAgICAgICAgICAgICAgIHVzZV9pbmNyZW1lbnRhbCA9IEZhbHNlIGlmIHNlcnZlcl9tZXRhZGF0YVsidXNlX2luY3JlbWVudGFsIl09PSJubyIgZWxzZSBUcnVlCisKKyAgICAgICAgICAgIHNlcnZlcl9ob3N0X2ZpbGVzID0gc2VsZi5sb2NhbGluZm9bJ3NlcnZlcl9maWxlcyddLmdldCggc2VydmVyWyd1dWlkJ10sIHt9KQorICAgICAgICAgICAgaWYgcmVidWlsZDoKKyAgICAgICAgICAgICAgICAjZGVsZXRlIHByZXZpb3VzIGluY3JlbWVudGFsIGZpbGVzCisgICAgICAgICAgICAgICAgZm9yIGZpbGVfIGluIHNlcnZlcl9ob3N0X2ZpbGVzLnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKGZpbGVfWydzb3VyY2UgZmlsZSddICkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdF9maWxlcz17fQorICAgIAorICAgICAgICAjMTogb2J0YWluIGFkaXRpb25hbCBkZXZpY2VzIChkaXNrcykKKyAgICAgICAgICAgICNQdXQgYXMgZmlyc3QgZGV2aWNlIHRoZSBtYWluIGRpc2sKKyAgICAgICAgICAgIGRldmljZXMgPSBbICB7InR5cGUiOiJkaXNrIiwgImltYWdlX2lkIjpzZXJ2ZXJbJ2ltYWdlX2lkJ10sICJ2cGNpIjpzZXJ2ZXJfbWV0YWRhdGEuZ2V0KCd2cGNpJywgTm9uZSkgfSBdIAorICAgICAgICAgICAgaWYgJ2V4dGVuZGVkJyBpbiBzZXJ2ZXJfZGF0YSBhbmQgc2VydmVyX2RhdGFbJ2V4dGVuZGVkJ10hPU5vbmUgYW5kICJkZXZpY2VzIiBpbiBzZXJ2ZXJfZGF0YVsnZXh0ZW5kZWQnXToKKyAgICAgICAgICAgICAgICBkZXZpY2VzICs9IHNlcnZlcl9kYXRhWydleHRlbmRlZCddWydkZXZpY2VzJ10KKworICAgICAgICAgICAgZm9yIGRldiBpbiBkZXZpY2VzOgorICAgICAgICAgICAgICAgIGlmIGRldlsnaW1hZ2VfaWQnXSA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYuZGJfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBzZWxmLmRiLmdldF90YWJsZShGUk9NPSdpbWFnZXMnLCBTRUxFQ1Q9KCdwYXRoJywnbWV0YWRhdGEnKSxXSEVSRT17J3V1aWQnOmRldlsnaW1hZ2VfaWQnXX0gKQorICAgICAgICAgICAgICAgIHNlbGYuZGJfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgPD0gMDoKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGV4dCA9ICJFUlJPUiIsIHJlc3VsdCwgY29udGVudCwgIndoZW4gZ2V0dGluZyBpbWFnZSIsIGRldlsnaW1hZ2VfaWQnXQorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGxhdW5jaF9zZXJ2ZXIiLCBlcnJvcl90ZXh0IAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX3RleHQKKyAgICAgICAgICAgICAgICBpZiBjb250ZW50WzBdWydtZXRhZGF0YSddIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBkZXZbJ21ldGFkYXRhJ10gPSBqc29uLmxvYWRzKGNvbnRlbnRbMF1bJ21ldGFkYXRhJ10pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGV2WydtZXRhZGF0YSddID0ge30KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBkZXZbJ2ltYWdlX2lkJ10gaW4gc2VydmVyX2hvc3RfZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIGRldlsnc291cmNlIGZpbGUnXSA9IHNlcnZlcl9ob3N0X2ZpbGVzWyBkZXZbJ2ltYWdlX2lkJ10gXSBbJ3NvdXJjZSBmaWxlJ10gI2xvY2FsIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgZGV2WydmaWxlIGZvcm1hdCddID0gc2VydmVyX2hvc3RfZmlsZXNbIGRldlsnaW1hZ2VfaWQnXSBdIFsnZmlsZSBmb3JtYXQnXSAjIHJhdyBvciBxY293MgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIzI6IGNvcHkgaW1hZ2UgdG8gaG9zdAorICAgICAgICAgICAgICAgIHJlbW90ZV9maWxlID0gY29udGVudFswXVsncGF0aCddCisgICAgICAgICAgICAgICAgdXNlX2luY3JlbWVudGFsX2ltYWdlID0gdXNlX2luY3JlbWVudGFsCisgICAgICAgICAgICAgICAgaWYgZGV2WydtZXRhZGF0YSddLmdldCgidXNlX2luY3JlbWVudGFsIikgPT0gIm5vIjoKKyAgICAgICAgICAgICAgICAgICAgdXNlX2luY3JlbWVudGFsX2ltYWdlID0gRmFsc2UKKyAgICAgICAgICAgICAgICBsb2NhbF9maWxlLCBxZW11X2luZm8sIHVzZV9pbmNyZW1lbnRhbF9pbWFnZSA9IHNlbGYuY29weV9yZW1vdGVfZmlsZShyZW1vdGVfZmlsZSwgdXNlX2luY3JlbWVudGFsX2ltYWdlKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICNjcmVhdGUgaW5jcmVtZW50YWwgaW1hZ2UKKyAgICAgICAgICAgICAgICBpZiB1c2VfaW5jcmVtZW50YWxfaW1hZ2U6CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX2ZpbGVfaW5jID0gc2VsZi5nZXRfbm90dXNlZF9maWxlbmFtZShsb2NhbF9maWxlLCAnLmluYycpCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAncWVtdS1pbWcgY3JlYXRlIC1mIHFjb3cyICcrbG9jYWxfZmlsZV9pbmMrICcgLW8gYmFja2luZ19maWxlPScrIGxvY2FsX2ZpbGUKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ2NvbW1hbmQ6JywgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAoXywgXywgc3RkZXJyKSA9IHNlbGYuc3NoX2Nvbm4uZXhlY19jb21tYW5kKGNvbW1hbmQpCisgICAgICAgICAgICAgICAgICAgIGVycm9yX21zZyA9IHN0ZGVyci5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGVycm9yX21zZykgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgcGFyYW1pa28uc3NoX2V4Y2VwdGlvbi5TU0hFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIGluY3JlbWVudGFsIGZpbGU6ICIgKyBlcnJvcl9tc2cpCisgICAgICAgICAgICAgICAgICAgIGxvY2FsX2ZpbGUgPSBsb2NhbF9maWxlX2luYworICAgICAgICAgICAgICAgICAgICBxZW11X2luZm8gPSB7J2ZpbGUgZm9ybWF0JzoncWNvdzInfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0X2ZpbGVzWyBkZXZbJ2ltYWdlX2lkJ10gXSA9IHsnc291cmNlIGZpbGUnOiBsb2NhbF9maWxlLCAnZmlsZSBmb3JtYXQnOiBxZW11X2luZm9bJ2ZpbGUgZm9ybWF0J119CisKKyAgICAgICAgICAgICAgICBkZXZbJ3NvdXJjZSBmaWxlJ10gPSBsb2NhbF9maWxlIAorICAgICAgICAgICAgICAgIGRldlsnZmlsZSBmb3JtYXQnXSA9IHFlbXVfaW5mb1snZmlsZSBmb3JtYXQnXQorCisgICAgICAgICAgICBzZWxmLmxvY2FsaW5mb1snc2VydmVyX2ZpbGVzJ11bIHNlcnZlclsndXVpZCddIF0gPSBzZXJ2ZXJfaG9zdF9maWxlcworICAgICAgICAgICAgc2VsZi5sb2NhbGluZm9fZGlydHkgPSBUcnVlCisKKyAgICAgICAgIzMgQ3JlYXRlIFhNTAorICAgICAgICAgICAgcmVzdWx0LCB4bWwgPSBzZWxmLmNyZWF0ZV94bWxfc2VydmVyKHNlcnZlcl9kYXRhLCBkZXZpY2VzLCBzZXJ2ZXJfbWV0YWRhdGEpICAjbG9jYWxfZmlsZQorICAgICAgICAgICAgaWYgcmVzdWx0IDwwOgorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogY3JlYXRlIHhtbCBzZXJ2ZXIgZXJyb3I6IiwgeG1sCisgICAgICAgICAgICAgICAgcmV0dXJuIC0yLCB4bWwKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogY3JlYXRlIHhtbDoiLCB4bWwKKyAgICAgICAgICAgIGF0cmlidXRlID0gbGlidmlydC5WSVJfRE9NQUlOX1NUQVJUX1BBVVNFRCBpZiBwYXVzZWQgPT0gInllcyIgZWxzZSAwCisgICAgICAgICM0IFN0YXJ0IHRoZSBkb21haW4KKyAgICAgICAgICAgIGlmIG5vdCByZWJ1aWxkOiAjZW5zdXJlcyB0aGF0IGFueSBwZW5kaW5nIGRlc3Ryb3lpbmcgc2VydmVyIGlzIGRvbmUKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9mb3JjZW9mZihUcnVlKQorICAgICAgICAgICAgI3ByaW50IHNlbGYubmFtZSwgIjogbGF1bmNoaW5nIGluc3RhbmNlIiAjLCB4bWwKKyAgICAgICAgICAgIGNvbm4uY3JlYXRlWE1MKHhtbCwgYXRyaWJ1dGUpCisgICAgICAgICAgICAjc2VsZi5zZXJ2ZXJfc3RhdHVzW3NlcnZlcl9pZF0gPSAnUEFVU0VEJyBpZiBwYXVzZWQgPT0gInllcyIgZWxzZSAnQUNUSVZFJworCisgICAgICAgICAgICByZXR1cm4gMCwgJ1N1Y2Nlc3MnCisKKyAgICAgICAgZXhjZXB0IHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICB0ZXh0ID0gZS5hcmdzWzBdCisgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGxhdW5jaF9zZXJ2ZXIoJXMpIHNzaCBFeGNlcHRpb246ICVzIiAlKHNlcnZlcl9pZCwgdGV4dCkKKyAgICAgICAgICAgIGlmICJTU0ggc2Vzc2lvbiBub3QgYWN0aXZlIiBpbiB0ZXh0OgorICAgICAgICAgICAgICAgIHNlbGYuc3NoX2Nvbm5lY3QoKQorICAgICAgICBleGNlcHQgbGlidmlydC5saWJ2aXJ0RXJyb3IgYXMgZToKKyAgICAgICAgICAgIHRleHQgPSBlLmdldF9lcnJvcl9tZXNzYWdlKCkKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogbGF1bmNoX3NlcnZlciglcykgbGlidmlydCBFeGNlcHRpb246ICVzIiAgJShzZXJ2ZXJfaWQsIHRleHQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHRleHQgPSBzdHIoZSkKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogbGF1bmNoX3NlcnZlciglcykgRXhjZXB0aW9uOiAlcyIgICUoc2VydmVyX2lkLCB0ZXh0KQorICAgICAgICByZXR1cm4gLTEsIHRleHQKKyAgICAKKyAgICBkZWYgdXBkYXRlX3NlcnZlcnNfc3RhdHVzKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIyB2aXJEb21haW5TdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVklSX0RPTUFJTl9OT1NUQVRFID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVklSX0RPTUFJTl9SVU5OSU5HID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVklSX0RPTUFJTl9CTE9DS0VEID0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVklSX0RPTUFJTl9QQVVTRUQgPSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBWSVJfRE9NQUlOX1NIVVRET1dOID0gNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVklSX0RPTUFJTl9TSFVUT0ZGID0gNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVklSX0RPTUFJTl9DUkFTSEVEID0gNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVklSX0RPTUFJTl9QTVNVU1BFTkRFRCA9IDcgICAjVE9ETyBzdXNwZW5kZWQKKyAgICAKKyAgICAgICAgaWYgc2VsZi50ZXN0IG9yIGxlbihzZWxmLnNlcnZlcl9zdGF0dXMpPT0wOgorICAgICAgICAgICAgcmV0dXJuICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb25uID0gbGlidmlydC5vcGVuKCJxZW11K3NzaDovLyIrc2VsZi51c2VyKyJAIitzZWxmLmhvc3QrIi9zeXN0ZW0iKQorICAgICAgICAgICAgZG9tYWlucz0gIGNvbm4ubGlzdEFsbERvbWFpbnMoKSAKKyAgICAgICAgICAgIGRvbWFpbl9kaWN0PXt9CisgICAgICAgICAgICBmb3IgZG9tYWluIGluIGRvbWFpbnM6CisgICAgICAgICAgICAgICAgdXVpZCA9IGRvbWFpbi5VVUlEU3RyaW5nKCkgOworICAgICAgICAgICAgICAgIGxpYnZpcnRfc3RhdHVzID0gZG9tYWluLnN0YXRlKCkKKyAgICAgICAgICAgICAgICAjcHJpbnQgbGlidmlydF9zdGF0dXMKKyAgICAgICAgICAgICAgICBpZiBsaWJ2aXJ0X3N0YXR1c1swXSA9PSBsaWJ2aXJ0LlZJUl9ET01BSU5fUlVOTklORyBvciBsaWJ2aXJ0X3N0YXR1c1swXSA9PSBsaWJ2aXJ0LlZJUl9ET01BSU5fU0hVVERPV046CisgICAgICAgICAgICAgICAgICAgIG5ld19zdGF0dXMgPSAiQUNUSVZFIgorICAgICAgICAgICAgICAgIGVsaWYgbGlidmlydF9zdGF0dXNbMF0gPT0gbGlidmlydC5WSVJfRE9NQUlOX1BBVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXR1cyA9ICJQQVVTRUQiCisgICAgICAgICAgICAgICAgZWxpZiBsaWJ2aXJ0X3N0YXR1c1swXSA9PSBsaWJ2aXJ0LlZJUl9ET01BSU5fU0hVVE9GRjoKKyAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXR1cyA9ICJJTkFDVElWRSIKKyAgICAgICAgICAgICAgICBlbGlmIGxpYnZpcnRfc3RhdHVzWzBdID09IGxpYnZpcnQuVklSX0RPTUFJTl9DUkFTSEVEOgorICAgICAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gIkVSUk9SIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5ld19zdGF0dXMgPSBOb25lCisgICAgICAgICAgICAgICAgZG9tYWluX2RpY3RbdXVpZF0gPSBuZXdfc3RhdHVzCisgICAgICAgICAgICBjb25uLmNsb3NlCisgICAgICAgIGV4Y2VwdCBsaWJ2aXJ0LmxpYnZpcnRFcnJvciBhcyBlOgorICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBnZXRfc3RhdGUoKSBFeGNlcHRpb24gJyIsIGUuZ2V0X2Vycm9yX21lc3NhZ2UoKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIHNlcnZlcl9pZCwgY3VycmVudF9zdGF0dXMgaW4gc2VsZi5zZXJ2ZXJfc3RhdHVzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgbmV3X3N0YXR1cyA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlcnZlcl9pZCBpbiBkb21haW5fZGljdDoKKyAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gZG9tYWluX2RpY3Rbc2VydmVyX2lkXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gIklOQUNUSVZFIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgbmV3X3N0YXR1cyA9PSBOb25lIG9yIG5ld19zdGF0dXMgPT0gY3VycmVudF9zdGF0dXM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5ld19zdGF0dXMgPT0gJ0lOQUNUSVZFJyBhbmQgY3VycmVudF9zdGF0dXMgPT0gJ0VSUk9SJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAja2VlcCBFUlJPUiBzdGF0dXMsIGJlY2F1c2Ugb2J2aW91c2x5IHRoaXMgbWFjaGluZSBpcyBub3QgcnVubmluZworICAgICAgICAgICAgI2NoYW5nZSBzdGF0dXMKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogc2VydmVyICIsIHNlcnZlcl9pZCwgInN0YXR1cyBjaGFuZ2UgZnJvbSAiLCBjdXJyZW50X3N0YXR1cywgInRvIiwgbmV3X3N0YXR1cworICAgICAgICAgICAgU1RBVFVTPXsncHJvZ3Jlc3MnOjEwMCwgJ3N0YXR1cyc6bmV3X3N0YXR1c30KKyAgICAgICAgICAgIGlmIG5ld19zdGF0dXMgPT0gJ0VSUk9SJzoKKyAgICAgICAgICAgICAgICBTVEFUVVNbJ2xhc3RfZXJyb3InXSA9ICdtYWNoaW5lIGhhcyBjcmFzaGVkJworICAgICAgICAgICAgc2VsZi5kYl9sb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgcixfID0gc2VsZi5kYi51cGRhdGVfcm93cygnaW5zdGFuY2VzJywgU1RBVFVTLCB7J3V1aWQnOnNlcnZlcl9pZH0sIGxvZz1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuZGJfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgIGlmIHI+PTA6CisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfc3RhdHVzW3NlcnZlcl9pZF0gPSBuZXdfc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBkZWYgYWN0aW9uX29uX3NlcnZlcihzZWxmLCByZXEsIGxhc3RfcmV0cnk9VHJ1ZSk6CisgICAgICAgICcnJ1BlcmZvcm0gYW4gYWN0aW9uIG9uIGEgcmVxCisgICAgICAgIEF0dHJpYnV0ZXM6CisgICAgICAgICAgICByZXE6IGRpY3Rpb25hcnkgdGhhdCBjb250YWluOgorICAgICAgICAgICAgICAgIHNlcnZlciBwcm9wZXJ0aWVzOiAndXVpZCcsJ25hbWUnLCd0ZW5hbnRfaWQnLCdzdGF0dXMnCisgICAgICAgICAgICAgICAgYWN0aW9uOiAnYWN0aW9uJworICAgICAgICAgICAgICAgIGhvc3QgcHJvcGVydGllczogJ3VzZXInLCAnaXBfbmFtZScKKyAgICAgICAgcmV0dXJuIChlcnJvciwgdGV4dCkgIAorICAgICAgICAgICAgIDA6IE5vIGVycm9yLiBWTSBpcyB1cGRhdGVkIHRvIG5ldyBzdGF0ZSwgIAorICAgICAgICAgICAgLTE6IEludmFsaWQgYWN0aW9uLCBhcyB0cnlpbmcgdG8gcGF1c2UgYSBQQVVTRUQgVk0KKyAgICAgICAgICAgIC0yOiBFcnJvciBhY2Nlc3NpbmcgaG9zdAorICAgICAgICAgICAgLTM6IFZNIG5vciBwcmVzZW50CisgICAgICAgICAgICAtNDogRXJyb3IgYXQgREIgYWNjZXNzCisgICAgICAgICAgICAtNTogRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHBlcmZvcm0gYWN0aW9uLiBWTSBpcyB1cGRhdGVkIHRvIEVSUk9SCisgICAgICAgICcnJworICAgICAgICBzZXJ2ZXJfaWQgPSByZXFbJ3V1aWQnXQorICAgICAgICBjb25uID0gTm9uZQorICAgICAgICBuZXdfc3RhdHVzID0gTm9uZQorICAgICAgICBvbGRfc3RhdHVzID0gcmVxWydzdGF0dXMnXQorICAgICAgICBsYXN0X2Vycm9yID0gTm9uZQorICAgICAgICAKKyAgICAgICAgaWYgc2VsZi50ZXN0OgorICAgICAgICAgICAgaWYgJ3Rlcm1pbmF0ZScgaW4gcmVxWydhY3Rpb24nXToKKyAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gJ2RlbGV0ZWQnCisgICAgICAgICAgICBlbGlmICdzaHV0b2ZmJyBpbiByZXFbJ2FjdGlvbiddIG9yICdzaHV0ZG93bicgaW4gcmVxWydhY3Rpb24nXSBvciAnZm9yY2VPZmYnIGluIHJlcVsnYWN0aW9uJ106CisgICAgICAgICAgICAgICAgaWYgcmVxWydzdGF0dXMnXSE9J0VSUk9SJzoKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCg1KQorICAgICAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gJ0lOQUNUSVZFJworICAgICAgICAgICAgZWxpZiAnc3RhcnQnIGluIHJlcVsnYWN0aW9uJ10gIGFuZCByZXFbJ3N0YXR1cyddIT0nRVJST1InOiAgICAgIG5ld19zdGF0dXMgPSAnQUNUSVZFJworICAgICAgICAgICAgZWxpZiAncmVzdW1lJyBpbiByZXFbJ2FjdGlvbiddIGFuZCByZXFbJ3N0YXR1cyddIT0nRVJST1InIGFuZCByZXFbJ3N0YXR1cyddIT0nSU5BQ1RJVkUnIDogICAgIG5ld19zdGF0dXMgPSAnQUNUSVZFJworICAgICAgICAgICAgZWxpZiAncGF1c2UnIGluIHJlcVsnYWN0aW9uJ10gIGFuZCByZXFbJ3N0YXR1cyddIT0nRVJST1InOiAgICAgIG5ld19zdGF0dXMgPSAnUEFVU0VEJworICAgICAgICAgICAgZWxpZiAncmVib290JyBpbiByZXFbJ2FjdGlvbiddIGFuZCByZXFbJ3N0YXR1cyddIT0nRVJST1InOiAgICAgbmV3X3N0YXR1cyA9ICdBQ1RJVkUnCisgICAgICAgICAgICBlbGlmICdyZWJ1aWxkJyBpbiByZXFbJ2FjdGlvbiddOgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAocmFuZG9tLnJhbmRpbnQoMjAsMTUwKSkKKyAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gJ0FDVElWRScKKyAgICAgICAgICAgIGVsaWYgJ2NyZWF0ZUltYWdlJyBpbiByZXFbJ2FjdGlvbiddOgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoNSkKKyAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9pbWFnZShOb25lLCByZXEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29ubiA9IGxpYnZpcnQub3BlbigicWVtdStzc2g6Ly8iK3NlbGYudXNlcisiQCIrc2VsZi5ob3N0KyIvc3lzdGVtIikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRvbSA9IGNvbm4ubG9va3VwQnlVVUlEU3RyaW5nKHNlcnZlcl9pZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgbGlidmlydC5saWJ2aXJ0RXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGUuZ2V0X2Vycm9yX21lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICBpZiAnTG9va3VwQnlVVUlEU3RyaW5nJyBpbiB0ZXh0IG9yICdEb21haW4gbm90IGZvdW5kJyBpbiB0ZXh0IG9yICdObyBleGlzdGUgdW4gZG9taW5pbyBjb2luY2lkZW50ZScgaW4gdGV4dDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogYWN0aW9uX29uX3NlcnZlcigiLHNlcnZlcl9pZCwiKSBsaWJ2aXJ0IGV4Y2VwdGlvbjoiLCB0ZXh0IAorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICdmb3JjZU9mZicgaW4gcmVxWydhY3Rpb24nXToKKyAgICAgICAgICAgICAgICAgICAgaWYgZG9tID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGFjdGlvbl9vbl9zZXJ2ZXIoIixzZXJ2ZXJfaWQsIikgZG9tYWluIG5vdCBydW5uaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IHNlbmRpbmcgREVTVFJPWSB0byBzZXJ2ZXIiLCBzZXJ2ZXJfaWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tLmRlc3Ryb3koKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICJkb21haW4gaXMgbm90IHJ1bm5pbmciIG5vdCBpbiBlLmdldF9lcnJvcl9tZXNzYWdlKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogYWN0aW9uX29uX3NlcnZlcigiLHNlcnZlcl9pZCwiKSBFeGNlcHRpb24gd2hpbGUgc2VuZGluZyBmb3JjZSBvZmY6IiwgZS5nZXRfZXJyb3JfbWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZXJyb3IgPSAgJ2FjdGlvbl9vbl9zZXJ2ZXIgRXhjZXB0aW9uIHdoaWxlIGRlc3Ryb3k6ICcgKyBlLmdldF9lcnJvcl9tZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXR1cyA9ICdFUlJPUicKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlbGlmICd0ZXJtaW5hdGUnIGluIHJlcVsnYWN0aW9uJ106CisgICAgICAgICAgICAgICAgICAgIGlmIGRvbSA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBhY3Rpb25fb25fc2VydmVyKCIsc2VydmVyX2lkLCIpIGRvbWFpbiBub3QgcnVubmluZyIgCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gJ2RlbGV0ZWQnCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVxWydhY3Rpb24nXVsndGVybWluYXRlJ10gPT0gJ2ZvcmNlJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBzZW5kaW5nIERFU1RST1kgdG8gc2VydmVyIiwgc2VydmVyX2lkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20uZGVzdHJveSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdGF0dXMgPSAnZGVsZXRlZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IHNlbmRpbmcgU0hVVERPV04gdG8gc2VydmVyIiwgc2VydmVyX2lkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20uc2h1dGRvd24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfdGVybWluYXRlX3NlcnZlci5hcHBlbmQoICh0aW1lLnRpbWUoKSsxMCxzZXJ2ZXJfaWQpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGFjdGlvbl9vbl9zZXJ2ZXIoIixzZXJ2ZXJfaWQsIikgRXhjZXB0aW9uIHdoaWxlIGRlc3Ryb3k6IiwgZS5nZXRfZXJyb3JfbWVzc2FnZSgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZXJyb3IgPSAgJ2FjdGlvbl9vbl9zZXJ2ZXIgRXhjZXB0aW9uIHdoaWxlIGRlc3Ryb3k6ICcgKyBlLmdldF9lcnJvcl9tZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gJ0VSUk9SJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICJkb21haW4gaXMgbm90IHJ1bm5pbmciIGluIGUuZ2V0X2Vycm9yX21lc3NhZ2UoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tLnVuZGVmaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdGF0dXMgPSAnZGVsZXRlZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogYWN0aW9uX29uX3NlcnZlcigiLHNlcnZlcl9pZCwiKSBFeGNlcHRpb24gd2hpbGUgdW5kZWZpbmU6IiwgZS5nZXRfZXJyb3JfbWVzc2FnZSgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9lcnJvciA9ICAnYWN0aW9uX29uX3NlcnZlciBFeGNlcHRpb24yIHdoaWxlIHVuZGVmaW5lOicsIGUuZ2V0X2Vycm9yX21lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNFeGNlcHRpb246ICd2aXJEb21haW5EZXRhY2hEZXZpY2UoKSBmYWlsZWQnCisgICAgICAgICAgICAgICAgICAgIGlmIG5ld19zdGF0dXM9PSdkZWxldGVkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlcnZlcl9pZCBpbiBzZWxmLnNlcnZlcl9zdGF0dXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuc2VydmVyX3N0YXR1c1tzZXJ2ZXJfaWRdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiByZXFbJ3V1aWQnXSBpbiBzZWxmLmxvY2FsaW5mb1snc2VydmVyX2ZpbGVzJ106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZpbGVfIGluIHNlbGYubG9jYWxpbmZvWydzZXJ2ZXJfZmlsZXMnXVsgcmVxWyd1dWlkJ10gXS52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWxldGVfZmlsZShmaWxlX1snc291cmNlIGZpbGUnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5sb2NhbGluZm9bJ3NlcnZlcl9maWxlcyddWyByZXFbJ3V1aWQnXSBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2NhbGluZm9fZGlydHkgPSBUcnVlCisKKyAgICAgICAgICAgICAgICBlbGlmICdzaHV0b2ZmJyBpbiByZXFbJ2FjdGlvbiddIG9yICdzaHV0ZG93bicgaW4gcmVxWydhY3Rpb24nXToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZG9tID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBhY3Rpb25fb25fc2VydmVyKCIsc2VydmVyX2lkLCIpIGRvbWFpbiBub3QgcnVubmluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbS5zaHV0ZG93bigpCisjICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXR1cyA9ICdJTkFDVElWRScKKyAgICAgICAgICAgICAgICAgICAgICAgICNUT0RPOiBjaGVjayBzdGF0dXMgZm9yIGNoYW5naW5nIGF0IGRhdGFiYXNlCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdGF0dXMgPSAnRVJST1InCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGFjdGlvbl9vbl9zZXJ2ZXIoIixzZXJ2ZXJfaWQsIikgRXhjZXB0aW9uIHdoaWxlIHNodXRkb3duOiIsIGUuZ2V0X2Vycm9yX21lc3NhZ2UoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZXJyb3IgPSAgJ2FjdGlvbl9vbl9zZXJ2ZXIgRXhjZXB0aW9uIHdoaWxlIHNodXRkb3duOiAnICsgZS5nZXRfZXJyb3JfbWVzc2FnZSgpCisgICAgCisgICAgICAgICAgICAgICAgZWxpZiAncmVidWlsZCcgaW4gcmVxWydhY3Rpb24nXToKKyAgICAgICAgICAgICAgICAgICAgaWYgZG9tICE9IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBkb20uZGVzdHJveSgpCisgICAgICAgICAgICAgICAgICAgIHIgPSBzZWxmLmxhdW5jaF9zZXJ2ZXIoY29ubiwgcmVxLCBUcnVlLCBOb25lKQorICAgICAgICAgICAgICAgICAgICBpZiByWzBdIDwwOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXR1cyA9ICdFUlJPUicKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZXJyb3IgPSByWzFdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gJ0FDVElWRScKKyAgICAgICAgICAgICAgICBlbGlmICdzdGFydCcgaW4gcmVxWydhY3Rpb24nXToKKyAgICAgICAgICAgICAgICAgICAgI0xhIGluc3RhbmNpYSBlc3TDoSBzw7NsbyBlbiBsYSBiYXNlIGRlIGRhdG9zIHBlcm8gbm8gZW4gbGEgbGlidmlydC4gZXMgbmVjZXNhcmlvIGNyZWFybGEKKyAgICAgICAgICAgICAgICAgICAgcmVidWlsZCA9IFRydWUgaWYgcmVxWydhY3Rpb24nXVsnc3RhcnQnXT09J3JlYnVpbGQnICBlbHNlIEZhbHNlCisgICAgICAgICAgICAgICAgICAgIHIgPSBzZWxmLmxhdW5jaF9zZXJ2ZXIoY29ubiwgcmVxLCByZWJ1aWxkLCBkb20pCisgICAgICAgICAgICAgICAgICAgIGlmIHJbMF0gPDA6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gJ0VSUk9SJworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9lcnJvciA9IHJbMV0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdGF0dXMgPSAnQUNUSVZFJworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVsaWYgJ3Jlc3VtZScgaW4gcmVxWydhY3Rpb24nXToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZG9tID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20ucmVzdW1lKCkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXR1cyA9ICdBQ1RJVkUnCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogYWN0aW9uX29uX3NlcnZlcigiLHNlcnZlcl9pZCwiKSBFeGNlcHRpb24gd2hpbGUgcmVzdW1lOiIsIGUuZ2V0X2Vycm9yX21lc3NhZ2UoKSAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxpZiAncGF1c2UnIGluIHJlcVsnYWN0aW9uJ106CisgICAgICAgICAgICAgICAgICAgIHRyeTogCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkb20gPT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbS5zdXNwZW5kKCkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXR1cyA9ICdQQVVTRUQnCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogYWN0aW9uX29uX3NlcnZlcigiLHNlcnZlcl9pZCwiKSBFeGNlcHRpb24gd2hpbGUgcGF1c2U6IiwgZS5nZXRfZXJyb3JfbWVzc2FnZSgpIAorICAgIAorICAgICAgICAgICAgICAgIGVsaWYgJ3JlYm9vdCcgaW4gcmVxWydhY3Rpb24nXToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRvbSA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tLnJlYm9vdCgpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGFjdGlvbl9vbl9zZXJ2ZXIoIixzZXJ2ZXJfaWQsIikgcmVib290OiIgCisgICAgICAgICAgICAgICAgICAgICAgICAjbmV3X3N0YXR1cyA9ICdBQ1RJVkUnCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogYWN0aW9uX29uX3NlcnZlcigiLHNlcnZlcl9pZCwiKSBFeGNlcHRpb24gd2hpbGUgcmVib290OiIsIGUuZ2V0X2Vycm9yX21lc3NhZ2UoKSAKKyAgICAgICAgICAgICAgICBlbGlmICdjcmVhdGVJbWFnZScgaW4gcmVxWydhY3Rpb24nXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfaW1hZ2UoZG9tLCByZXEpCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpICAgIAorICAgICAgICAgICAgZXhjZXB0IGxpYnZpcnQubGlidmlydEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgY29ubiBpcyBub3QgTm9uZTogY29ubi5jbG9zZQorICAgICAgICAgICAgICAgIHRleHQgPSBlLmdldF9lcnJvcl9tZXNzYWdlKCkKKyAgICAgICAgICAgICAgICBuZXdfc3RhdHVzID0gIkVSUk9SIgorICAgICAgICAgICAgICAgIGxhc3RfZXJyb3IgPSB0ZXh0CisgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBhY3Rpb25fb25fc2VydmVyKCIsc2VydmVyX2lkLCIpIEV4Y2VwdGlvbiAnIiwgdGV4dAorICAgICAgICAgICAgICAgIGlmICdMb29rdXBCeVVVSURTdHJpbmcnIGluIHRleHQgb3IgJ0RvbWFpbiBub3QgZm91bmQnIGluIHRleHQgb3IgJ05vIGV4aXN0ZSB1biBkb21pbmlvIGNvaW5jaWRlbnRlJyBpbiB0ZXh0OgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGFjdGlvbl9vbl9zZXJ2ZXIoIixzZXJ2ZXJfaWQsIikgRXhjZXB0aW9uIHJlbW92ZWQgZnJvbSBob3N0IgorICAgICAgICAjZW5kIG9mIGlmIHNlbGYudGVzdAorICAgICAgICBpZiBuZXdfc3RhdHVzID09ICBOb25lOgorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGFjdGlvbl9vbl9zZXJ2ZXIoIixzZXJ2ZXJfaWQsIikgbmV3IHN0YXR1cyIsIG5ld19zdGF0dXMsIGxhc3RfZXJyb3IKKyAgICAgICAgVVBEQVRFID0geydwcm9ncmVzcyc6MTAwLCAnc3RhdHVzJzpuZXdfc3RhdHVzfQorICAgICAgICAKKyAgICAgICAgaWYgbmV3X3N0YXR1cz09J0VSUk9SJzoKKyAgICAgICAgICAgIGlmIG5vdCBsYXN0X3JldHJ5OiAgI2lmIHRoZXJlIHdpbGwgYmUgYW5vdGhlciByZXRyeSBkbyBub3QgdXBkYXRlIGRhdGFiYXNlIAorICAgICAgICAgICAgICAgIHJldHVybiAtMSAKKyAgICAgICAgICAgIGVsaWYgJ3Rlcm1pbmF0ZScgaW4gcmVxWydhY3Rpb24nXToKKyAgICAgICAgICAgICAgICAjUFVUIGEgbG9nIGluIHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogUEFOSUMgZGVsZXRpbmcgc2VydmVyIiwgc2VydmVyX2lkLCBsYXN0X2Vycm9yCisgICAgICAgICAgICAgICAgc2VsZi5kYl9sb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgICAgIHNlbGYuZGIubmV3X3JvdygnbG9ncycsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndXVpZCc6c2VydmVyX2lkLCAndGVuYW50X2lkJzpyZXFbJ3RlbmFudF9pZCddLCAncmVsYXRlZCc6J2luc3RhbmNlcycsJ2xldmVsJzoncGFuaWMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOidQQU5JQyBkZWxldGluZyBzZXJ2ZXIgZnJvbSBob3N0ICcrc2VsZi5uYW1lKyc6ICcrbGFzdF9lcnJvcn0KKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBzZWxmLmRiX2xvY2sucmVsZWFzZSgpCisgICAgICAgICAgICAgICAgaWYgc2VydmVyX2lkIGluIHNlbGYuc2VydmVyX3N0YXR1czoKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuc2VydmVyX3N0YXR1c1tzZXJ2ZXJfaWRdCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFVQREFURVsnbGFzdF9lcnJvciddID0gbGFzdF9lcnJvcgorICAgICAgICBpZiBuZXdfc3RhdHVzICE9ICdkZWxldGVkJyBhbmQgKG5ld19zdGF0dXMgIT0gb2xkX3N0YXR1cyBvciBuZXdfc3RhdHVzID09ICdFUlJPUicpIDoKKyAgICAgICAgICAgIHNlbGYuZGJfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgIHNlbGYuZGIudXBkYXRlX3Jvd3MoJ2luc3RhbmNlcycsIFVQREFURSwgeyd1dWlkJzpzZXJ2ZXJfaWR9LCBsb2c9VHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuc2VydmVyX3N0YXR1c1tzZXJ2ZXJfaWRdID0gbmV3X3N0YXR1cworICAgICAgICAgICAgc2VsZi5kYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICBpZiBuZXdfc3RhdHVzID09ICdFUlJPUic6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgcmV0dXJuIDEKKyAgICAgCisgICAgCisgICAgZGVmIHJlc3RvcmVfaWZhY2Uoc2VsZiwgbmFtZSwgbWFjLCBsaWJfY29ubj1Ob25lKToKKyAgICAgICAgJycnIG1ha2UgYW4gaWZkb3duLCBpZnVwIHRvIHJlc3RvcmUgZGVmYXVsdCBwYXJhbWV0ZXIgb2YgbmEgaW50ZXJmYWNlCisgICAgICAgICAgICBQYXJhbXM6CisgICAgICAgICAgICAgICAgbWFjOiBtYWMgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgbGliX2Nvbm46IGNvbm5lY3Rpb24gdG8gdGhlIGxpYnZpcnQsIGlmIE5vbmUgYSBuZXcgY29ubmVjdGlvbiBpcyBjcmVhdGVkCisgICAgICAgICAgICBSZXR1cm4gMCxOb25lIGlmIG9rLCAtMSx0ZXh0IGlmIGZhaWxzCisgICAgICAgICcnJyAKKyAgICAgICAgY29ubj1Ob25lCisgICAgICAgIHJldCA9IDAKKyAgICAgICAgZXJyb3JfdGV4dD1Ob25lCisgICAgICAgIGlmIHNlbGYudGVzdDoKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogcmVzdG9yZV9pZmFjZSAnJXMnICVzIiAlIChuYW1lLCBtYWMpCisgICAgICAgICAgICByZXR1cm4gMCwgTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgbGliX2Nvbm46CisgICAgICAgICAgICAgICAgY29ubiA9IGxpYnZpcnQub3BlbigicWVtdStzc2g6Ly8iK3NlbGYudXNlcisiQCIrc2VsZi5ob3N0KyIvc3lzdGVtIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29ubiA9IGxpYl9jb25uCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAjd2FpdCB0byB0aGUgcGVuZGluZyBWTSBkZWxldGlvbgorICAgICAgICAgICAgI1RPRE8uUmV2aXNlICBzZWxmLnNlcnZlcl9mb3JjZW9mZihUcnVlKQorCisgICAgICAgICAgICBpZmFjZSA9IGNvbm4uaW50ZXJmYWNlTG9va3VwQnlNQUNTdHJpbmcobWFjKQorICAgICAgICAgICAgaWZhY2UuZGVzdHJveSgpCisgICAgICAgICAgICBpZmFjZS5jcmVhdGUoKQorICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiByZXN0b3JlX2lmYWNlICclcycgJXMiICUgKG5hbWUsIG1hYykKKyAgICAgICAgZXhjZXB0IGxpYnZpcnQubGlidmlydEVycm9yIGFzIGU6ICAgCisgICAgICAgICAgICBlcnJvcl90ZXh0ID0gZS5nZXRfZXJyb3JfbWVzc2FnZSgpCisgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IHJlc3RvcmVfaWZhY2UgJyVzJyAnJXMnIGxpYnZpcnQgZXhjZXB0aW9uOiAlcyIgJShuYW1lLCBtYWMsIGVycm9yX3RleHQpIAorICAgICAgICAgICAgcmV0PS0xCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBsaWJfY29ubiBpcyBOb25lIGFuZCBjb25uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UKKyAgICAgICAgcmV0dXJuIHJldCwgZXJyb3JfdGV4dAorCisgICAgICAgIAorICAgIGRlZiBjcmVhdGVfaW1hZ2Uoc2VsZixkb20sIHJlcSk6CisgICAgICAgIGlmIHNlbGYudGVzdDoKKyAgICAgICAgICAgIGlmICdwYXRoJyBpbiByZXFbJ2FjdGlvbiddWydjcmVhdGVJbWFnZSddOgorICAgICAgICAgICAgICAgIGZpbGVfZHN0ID0gcmVxWydhY3Rpb24nXVsnY3JlYXRlSW1hZ2UnXVsncGF0aCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNyZWF0ZUltYWdlPXJlcVsnYWN0aW9uJ11bJ2NyZWF0ZUltYWdlJ10KKyAgICAgICAgICAgICAgICBpbWdfbmFtZT0gY3JlYXRlSW1hZ2VbJ3NvdXJjZSddWydwYXRoJ10KKyAgICAgICAgICAgICAgICBpbmRleD1pbWdfbmFtZS5yZmluZCgnLycpCisgICAgICAgICAgICAgICAgZmlsZV9kc3QgPSBzZWxmLmdldF9ub3R1c2VkX3BhdGgoaW1nX25hbWVbOmluZGV4KzFdICsgY3JlYXRlSW1hZ2VbJ25hbWUnXSArICcucWNvdzInKQorICAgICAgICAgICAgaW1hZ2Vfc3RhdHVzPSdBQ1RJVkUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgcmV0cnkgaW4gKDAsMSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaWQgPSByZXFbJ3V1aWQnXQorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbWFnZT1yZXFbJ2FjdGlvbiddWydjcmVhdGVJbWFnZSddCisgICAgICAgICAgICAgICAgICAgIGZpbGVfb3JpZyA9IHNlbGYubG9jYWxpbmZvWydzZXJ2ZXJfZmlsZXMnXVtzZXJ2ZXJfaWRdIFsgY3JlYXRlSW1hZ2VbJ3NvdXJjZSddWydpbWFnZV9pZCddIF0gWydzb3VyY2UgZmlsZSddCisgICAgICAgICAgICAgICAgICAgIGlmICdwYXRoJyBpbiByZXFbJ2FjdGlvbiddWydjcmVhdGVJbWFnZSddOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9kc3QgPSByZXFbJ2FjdGlvbiddWydjcmVhdGVJbWFnZSddWydwYXRoJ10KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGltZ19uYW1lPSBjcmVhdGVJbWFnZVsnc291cmNlJ11bJ3BhdGgnXQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9aW1nX25hbWUucmZpbmQoJy8nKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9kc3QgPSBzZWxmLmdldF9ub3R1c2VkX2ZpbGVuYW1lKGltZ19uYW1lWzppbmRleCsxXSArIGNyZWF0ZUltYWdlWyduYW1lJ10gKyAnLnFjb3cyJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29weV9maWxlKGZpbGVfb3JpZywgZmlsZV9kc3QpCisgICAgICAgICAgICAgICAgICAgIHFlbXVfaW5mbyA9IHNlbGYucWVtdV9nZXRfaW5mbyhmaWxlX29yaWcpCisgICAgICAgICAgICAgICAgICAgIGlmICdiYWNraW5nIGZpbGUnIGluIHFlbXVfaW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLHYgaW4gc2VsZi5sb2NhbGluZm9bJ2ZpbGVzJ10uaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB2PT1xZW11X2luZm9bJ2JhY2tpbmcgZmlsZSddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnFlbXVfY2hhbmdlX2JhY2tpbmcoZmlsZV9kc3QsIGspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGltYWdlX3N0YXR1cz0nQUNUSVZFJworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBwYXJhbWlrby5zc2hfZXhjZXB0aW9uLlNTSEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICBpbWFnZV9zdGF0dXM9J0VSUk9SJworICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0ID0gZS5hcmdzWzBdCisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIic6IGNyZWF0ZV9pbWFnZSgiLHNlcnZlcl9pZCwiKSBzc2ggRXhjZXB0aW9uOiIsIGVycm9yX3RleHQKKyAgICAgICAgICAgICAgICAgICAgaWYgIlNTSCBzZXNzaW9uIG5vdCBhY3RpdmUiIGluIGVycm9yX3RleHQgYW5kIHJldHJ5PT0wOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2hfY29ubmVjdCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICBpbWFnZV9zdGF0dXM9J0VSUk9SJworICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0ID0gc3RyKGUpCisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIic6IGNyZWF0ZV9pbWFnZSgiLHNlcnZlcl9pZCwiKSBFeGNlcHRpb246IiwgZXJyb3JfdGV4dAorICAgICAgICAKKyAgICAgICAgICAgICAgICAjVE9ETyBpbnNlcnQgYSBsYXN0X2Vycm9yIGF0IGRhdGFiYXNlCisgICAgICAgIHNlbGYuZGJfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5kYi51cGRhdGVfcm93cygnaW1hZ2VzJywgeydzdGF0dXMnOmltYWdlX3N0YXR1cywgJ3Byb2dyZXNzJzogMTAwLCAncGF0aCc6ZmlsZV9kc3R9LCAKKyAgICAgICAgICAgICAgICB7J3V1aWQnOnJlcVsnbmV3X2ltYWdlJ11bJ3V1aWQnXX0sIGxvZz1UcnVlKQorICAgICAgICBzZWxmLmRiX2xvY2sucmVsZWFzZSgpCisgIAorICAgIGRlZiBlZGl0X2lmYWNlKHNlbGYsIHBvcnRfaWQsIG9sZF9uZXQsIG5ld19uZXQpOgorICAgICAgICAjVGhpcyBhY3Rpb24gaW1wbHkgcmVtb3ZlIGFuZCBpbnNlcnQgaW50ZXJmYWNlIHRvIHB1dCBwcm9wZXIgcGFyYW1ldGVycworICAgICAgICBpZiBzZWxmLnRlc3Q6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICNnZXQgaWZhY2UgZGV0YWlscworICAgICAgICAgICAgc2VsZi5kYl9sb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgcixjID0gc2VsZi5kYi5nZXRfdGFibGUoRlJPTT0ncG9ydHMgYXMgcCBqb2luIHJlc291cmNlc19wb3J0IGFzIHJwIG9uIHAudXVpZD1ycC5wb3J0X2lkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFPXsncG9ydF9pZCc6IHBvcnRfaWR9KQorICAgICAgICAgICAgc2VsZi5kYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZWRpdF9pZmFjZSgiLHBvcnRfaWQsIikgRERCQiBlcnJvcjoiLCBjCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbGlmIHI9PTA6CisgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBlZGl0X2lmYWNlKCIscG9ydF9pZCwiKSBwb3Igbm90IGZvdW5kIgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcG9ydD1jWzBdCisgICAgICAgICAgICBpZiBwb3J0WyJtb2RlbCJdIT0iVkYiOgorICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZWRpdF9pZmFjZSgiLHBvcnRfaWQsIikgRVJST1IgbW9kZWwgbXVzdCBiZSBWRiIKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICNjcmVhdGUgeG1sIGRldGFjaCBmaWxlCisgICAgICAgICAgICB4bWw9W10KKyAgICAgICAgICAgIHNlbGYueG1sX2xldmVsID0gMgorICAgICAgICAgICAgeG1sLmFwcGVuZCgiPGludGVyZmFjZSB0eXBlPSdob3N0ZGV2JyBtYW5hZ2VkPSd5ZXMnPiIpCisgICAgICAgICAgICB4bWwuYXBwZW5kKCIgIDxtYWMgYWRkcmVzcz0nIiArcG9ydFsnbWFjJ10rICInLz4iKQorICAgICAgICAgICAgeG1sLmFwcGVuZCgiICA8c291cmNlPiIrIHNlbGYucGNpMnhtbChwb3J0WydwY2knXSkrIlxuICA8L3NvdXJjZT4iKQorICAgICAgICAgICAgeG1sLmFwcGVuZCgnPC9pbnRlcmZhY2U+JykgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbm49Tm9uZQorICAgICAgICAgICAgICAgIGNvbm4gPSBsaWJ2aXJ0Lm9wZW4oInFlbXUrc3NoOi8vIitzZWxmLnVzZXIrIkAiK3NlbGYuaG9zdCsiL3N5c3RlbSIpCisgICAgICAgICAgICAgICAgZG9tID0gY29ubi5sb29rdXBCeVVVSURTdHJpbmcocG9ydFsiaW5zdGFuY2VfaWQiXSkKKyAgICAgICAgICAgICAgICBpZiBvbGRfbmV0OgorICAgICAgICAgICAgICAgICAgICB0ZXh0PSJcbiIuam9pbih4bWwpCisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZWRpdF9pZmFjZSBkZXRhY2hpbmcgU1JJT1YgaW50ZXJmYWNlIiwgdGV4dAorICAgICAgICAgICAgICAgICAgICBkb20uZGV0YWNoRGV2aWNlRmxhZ3ModGV4dCwgZmxhZ3M9bGlidmlydC5WSVJfRE9NQUlOX0FGRkVDVF9MSVZFKQorICAgICAgICAgICAgICAgIGlmIG5ld19uZXQ6CisgICAgICAgICAgICAgICAgICAgIHhtbFstMV0gPSIgIDx2bGFuPiAgIDx0YWcgaWQ9JyIgKyBzdHIocG9ydFsndmxhbiddKSArICInLz4gICA8L3ZsYW4+IgorICAgICAgICAgICAgICAgICAgICBzZWxmLnhtbF9sZXZlbCA9IDEKKyAgICAgICAgICAgICAgICAgICAgeG1sLmFwcGVuZChzZWxmLnBjaTJ4bWwocG9ydC5nZXQoJ3ZwY2knLE5vbmUpKSApCisgICAgICAgICAgICAgICAgICAgIHhtbC5hcHBlbmQoJzwvaW50ZXJmYWNlPicpICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB0ZXh0PSJcbiIuam9pbih4bWwpCisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogZWRpdF9pZmFjZSBhdHRhY2hpbmcgU1JJT1YgaW50ZXJmYWNlIiwgdGV4dAorICAgICAgICAgICAgICAgICAgICBkb20uYXR0YWNoRGV2aWNlRmxhZ3ModGV4dCwgZmxhZ3M9bGlidmlydC5WSVJfRE9NQUlOX0FGRkVDVF9MSVZFKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGV4Y2VwdCBsaWJ2aXJ0LmxpYnZpcnRFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHRleHQgPSBlLmdldF9lcnJvcl9tZXNzYWdlKCkKKyAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGVkaXRfaWZhY2UoIixwb3J0WyJpbnN0YW5jZV9pZCJdLCIpIGxpYnZpcnQgZXhjZXB0aW9uOiIsIHRleHQgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIGNvbm4gaXMgbm90IE5vbmU6IGNvbm4uY2xvc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorZGVmIGNyZWF0ZV9zZXJ2ZXIoc2VydmVyLCBkYiwgZGJfbG9jaywgb25seV9vZl9wb3J0cyk6CisgICAgI3ByaW50ICJzZXJ2ZXIiCisgICAgI3ByaW50ICJzZXJ2ZXIiCisgICAgI3ByaW50IHNlcnZlcgorICAgICNwcmludCAic2VydmVyIgorICAgICNwcmludCAic2VydmVyIgorICAgICN0cnk6CisjICAgICAgICAgICAgaG9zdF9pZCA9IHNlcnZlci5nZXQoJ2hvc3RfaWQnLCBOb25lKQorICAgIGV4dGVuZGVkID0gc2VydmVyLmdldCgnZXh0ZW5kZWQnLCBOb25lKQorICAgIAorIyAgICAgICAgICAgICBwcmludCAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyMgICAgICAgICAgICAgcHJpbnQganNvbi5kdW1wcyhleHRlbmRlZCwgaW5kZW50PTQpCisgICAgCisgICAgcmVxdWlyZW1lbnRzPXt9CisgICAgcmVxdWlyZW1lbnRzWydudW1hJ109eydtZW1vcnknOjAsICdwcm9jX3JlcV90eXBlJzogJ3RocmVhZHMnLCAncHJvY19yZXFfbmInOjAsICdwb3J0X2xpc3QnOltdLCAnc3Jpb3ZfbGlzdCc6W119CisgICAgcmVxdWlyZW1lbnRzWydyYW0nXSA9IHNlcnZlclsnZmxhdm9yJ10uZ2V0KCdyYW0nLCAwKQorICAgIGlmIHJlcXVpcmVtZW50c1sncmFtJ109PSBOb25lOgorICAgICAgICByZXF1aXJlbWVudHNbJ3JhbSddID0gMAorICAgIHJlcXVpcmVtZW50c1sndmNwdXMnXSA9IHNlcnZlclsnZmxhdm9yJ10uZ2V0KCd2Y3B1cycsIDApCisgICAgaWYgcmVxdWlyZW1lbnRzWyd2Y3B1cyddPT0gTm9uZToKKyAgICAgICAgcmVxdWlyZW1lbnRzWyd2Y3B1cyddID0gMAorICAgICNJZiBleHRlbmRlZCBpcyBub3QgZGVmaW5lZCBnZXQgcmVxdWlyZW1lbnRzIGZyb20gZmxhdm9yCisgICAgaWYgZXh0ZW5kZWQgaXMgTm9uZToKKyAgICAgICAgI0lmIGV4dGVuZGVkIGlzIGRlZmluZWQgaW4gZmxhdm9yIGNvbnZlcnQgdG8gZGljdGlvbmFyeSBhbmQgdXNlIGl0CisgICAgICAgIGlmICdleHRlbmRlZCcgaW4gc2VydmVyWydmbGF2b3InXSBhbmQgIHNlcnZlclsnZmxhdm9yJ11bJ2V4dGVuZGVkJ10gIT0gTm9uZToKKyAgICAgICAgICAgIGpzb25fYWNjZXB0YWJsZV9zdHJpbmcgPSBzZXJ2ZXJbJ2ZsYXZvciddWydleHRlbmRlZCddLnJlcGxhY2UoIiciLCAiXCIiKQorICAgICAgICAgICAgZXh0ZW5kZWQgPSBqc29uLmxvYWRzKGpzb25fYWNjZXB0YWJsZV9zdHJpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHRlbmRlZCA9IE5vbmUKKyAgICAjcHJpbnQganNvbi5kdW1wcyhleHRlbmRlZCwgaW5kZW50PTQpCisgICAgCisgICAgI0ZvciBzaW1wbGljaXR5IG9ubHkgb25lIG51bWEgVk0gYXJlIHN1cHBvcnRlZCBpbiB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICAgIGlmIGV4dGVuZGVkICE9IE5vbmU6CisgICAgICAgIG51bWFzID0gZXh0ZW5kZWQuZ2V0KCdudW1hcycsIFtdKQorICAgICAgICBpZiBsZW4obnVtYXMpPjE6CisgICAgICAgICAgICByZXR1cm4gKC0yLCAiTXVsdGktTlVNQSBWTXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0IikKKyAgICAgICAgI2VsaWYgbGVuKG51bWFzKTwxOgorICAgICAgICAjICAgIHJldHVybiAoLTEsICJBdCBsZWFzdCBvbmUgbnVtYSBtdXN0IGJlIHNwZWNpZmllZCIpCisgICAgCisgICAgICAgICNhIGZvciBsb29wIGlzIHVzZWQgaW4gb3JkZXIgdG8gYmUgcmVhZHkgdG8gbXVsdGktTlVNQSBWTXMKKyAgICAgICAgcmVxdWVzdCA9IFtdCisgICAgICAgIGZvciBudW1hIGluIG51bWFzOgorICAgICAgICAgICAgbnVtYV9yZXEgPSB7fQorICAgICAgICAgICAgbnVtYV9yZXFbJ21lbW9yeSddID0gbnVtYS5nZXQoJ21lbW9yeScsIDApCisgICAgICAgICAgICBpZiAnY29yZXMnIGluIG51bWE6IAorICAgICAgICAgICAgICAgIG51bWFfcmVxWydwcm9jX3JlcV9uYiddID0gbnVtYVsnY29yZXMnXSAgICAgICAgICAgICAgICAgICAgICNudW1iZXIgb2YgY29yZXMgb3IgdGhyZWFkcyB0byBiZSByZXNlcnZlZAorICAgICAgICAgICAgICAgIG51bWFfcmVxWydwcm9jX3JlcV90eXBlJ10gPSAnY29yZXMnICAgICAgICAgICAgICAgICAgICAgICAgICNpbmRpY2F0ZXMgd2hldGhlciBjb3JlcyBvciB0aHJlYWRzIG11c3QgYmUgcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICBudW1hX3JlcVsncHJvY19yZXFfbGlzdCddID0gbnVtYS5nZXQoJ2NvcmVzLWlkJywgTm9uZSkgICAgICAjbGlzdCBvZiBpZHMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGNvcmVzIG9yIHRocmVhZHMKKyAgICAgICAgICAgIGVsaWYgJ3BhaXJlZC10aHJlYWRzJyBpbiBudW1hOgorICAgICAgICAgICAgICAgIG51bWFfcmVxWydwcm9jX3JlcV9uYiddID0gbnVtYVsncGFpcmVkLXRocmVhZHMnXQorICAgICAgICAgICAgICAgIG51bWFfcmVxWydwcm9jX3JlcV90eXBlJ10gPSAncGFpcmVkLXRocmVhZHMnCisgICAgICAgICAgICAgICAgbnVtYV9yZXFbJ3Byb2NfcmVxX2xpc3QnXSA9IG51bWEuZ2V0KCdwYWlyZWQtdGhyZWFkcy1pZCcsIE5vbmUpCisgICAgICAgICAgICBlbGlmICd0aHJlYWRzJyBpbiBudW1hOgorICAgICAgICAgICAgICAgIG51bWFfcmVxWydwcm9jX3JlcV9uYiddID0gbnVtYVsndGhyZWFkcyddCisgICAgICAgICAgICAgICAgbnVtYV9yZXFbJ3Byb2NfcmVxX3R5cGUnXSA9ICd0aHJlYWRzJworICAgICAgICAgICAgICAgIG51bWFfcmVxWydwcm9jX3JlcV9saXN0J10gPSBudW1hLmdldCgndGhyZWFkcy1pZCcsIE5vbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG51bWFfcmVxWydwcm9jX3JlcV9uYiddID0gMCAjIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICBudW1hX3JlcVsncHJvY19yZXFfdHlwZSddID0gJ3RocmVhZHMnCisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAjR2VuZXJhdGUgYSBsaXN0IG9mIHNyaW92IGFuZCBhbm90aGVyIGZvciBwaHlzaWNhbCBpbnRlcmZhY2VzIAorICAgICAgICAgICAgaW50ZXJmYWNlcyA9IG51bWEuZ2V0KCdpbnRlcmZhY2VzJywgW10pCisgICAgICAgICAgICBzcmlvdl9saXN0ID0gW10KKyAgICAgICAgICAgIHBvcnRfbGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgaWZhY2UgaW4gaW50ZXJmYWNlczoKKyAgICAgICAgICAgICAgICBpZmFjZVsnYmFuZHdpZHRoJ10gPSBpbnQoaWZhY2VbJ2JhbmR3aWR0aCddKQorICAgICAgICAgICAgICAgIGlmIGlmYWNlWydkZWRpY2F0ZWQnXVs6M109PSd5ZXMnOgorICAgICAgICAgICAgICAgICAgICBwb3J0X2xpc3QuYXBwZW5kKGlmYWNlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNyaW92X2xpc3QuYXBwZW5kKGlmYWNlKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICNTYXZlIGxpc3RzIG9yZGVyZWQgZnJvbSBtb3JlIHJlc3RyaWN0aXZlIHRvIGxlc3MgYncgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICBudW1hX3JlcVsnc3Jpb3ZfbGlzdCddID0gc29ydGVkKHNyaW92X2xpc3QsIGtleT1sYW1iZGEgazoga1snYmFuZHdpZHRoJ10sIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgICAgIG51bWFfcmVxWydwb3J0X2xpc3QnXSA9IHNvcnRlZChwb3J0X2xpc3QsIGtleT1sYW1iZGEgazoga1snYmFuZHdpZHRoJ10sIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChudW1hX3JlcSkKKyAgICAgICAgICAgICAgICAKKyAgICAjICAgICAgICAgICAgICAgICBwcmludCAiLS0tLS0tLS0tLVxuIitqc29uLmR1bXBzKHJlcXVlc3RbMF0sIGluZGVudD00KQorICAgICMgICAgICAgICAgICAgICAgIHByaW50ICctLS0tLS0tLS0tXG5cbicKKyAgICAgICAgICAgIAorICAgICAgICAjU2VhcmNoIGluIGRiIGZvciBhbiBhcHByb3ByaWF0ZSBudW1hIGZvciBlYWNoIHJlcXVlc3RlZCBudW1hCisgICAgICAgICNhdCB0aGUgbW9tZW50IG11bHRpLU5VTUEgVk1zIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgICAgIGlmIGxlbihyZXF1ZXN0KT4wOgorICAgICAgICAgICAgcmVxdWlyZW1lbnRzWydudW1hJ10udXBkYXRlKHJlcXVlc3RbMF0pCisgICAgaWYgcmVxdWlyZW1lbnRzWydudW1hJ11bJ21lbW9yeSddPjA6CisgICAgICAgIHJlcXVpcmVtZW50c1sncmFtJ109MCAgI0J5IHRoZSBtb21lbnQgSSBtYWtlIGluY29tcGF0aWJsZSBhc2sgZm9yIGJvdGggSHVnZSBhbmQgbm9uIGh1Z2UgcGFnZXMgbWVtb3J5CisgICAgZWxpZiByZXF1aXJlbWVudHNbJ3JhbSddPT0wOgorICAgICAgICByZXR1cm4gKC0xLCAiTWVtb3J5IGluZm9ybWF0aW9uIG5vdCBzZXQgbmVpdGhlciBhdCBleHRlbmRlZCBmaWVsZCBub3QgYXQgcmFtIikKKyAgICBpZiByZXF1aXJlbWVudHNbJ251bWEnXVsncHJvY19yZXFfbmInXT4wOgorICAgICAgICByZXF1aXJlbWVudHNbJ3ZjcHVzJ109MCAjQnkgdGhlIG1vbWVudCBJIG1ha2UgaW5jb21wYXRpYmxlIGFzayBmb3IgYm90aCBJc29sYXRlZCBhbmQgbm9uIGlzb2xhdGVkIGNwdXMKKyAgICBlbGlmIHJlcXVpcmVtZW50c1sndmNwdXMnXT09MDoKKyAgICAgICAgcmV0dXJuICgtMSwgIlByb2Nlc3NvciBpbmZvcm1hdGlvbiBub3Qgc2V0IG5laXRoZXIgYXQgZXh0ZW5kZWQgZmllbGQgbm90IGF0IHZjcHVzIikgICAgCisKKworICAgIGRiX2xvY2suYWNxdWlyZSgpCisgICAgcmVzdWx0LCBjb250ZW50ID0gZGIuZ2V0X251bWFzKHJlcXVpcmVtZW50cywgc2VydmVyLmdldCgnaG9zdF9pZCcsIE5vbmUpLCBvbmx5X29mX3BvcnRzKQorICAgIGRiX2xvY2sucmVsZWFzZSgpCisgICAgCisgICAgaWYgcmVzdWx0ID09IC0xOgorICAgICAgICByZXR1cm4gKC0xLCBjb250ZW50KQorICAgIAorICAgIG51bWFfaWQgPSBjb250ZW50WydudW1hX2lkJ10KKyAgICBob3N0X2lkID0gY29udGVudFsnaG9zdF9pZCddCisKKyAgICAjb2J0YWluIHRocmVhZHNfaWQgYW5kIGNhbGN1bGF0ZSBwaW5uaW5nCisgICAgY3B1X3Bpbm5pbmcgPSBbXQorICAgIHJlc2VydmVkX3RocmVhZHM9W10KKyAgICBpZiByZXF1aXJlbWVudHNbJ251bWEnXVsncHJvY19yZXFfbmInXT4wOgorICAgICAgICBkYl9sb2NrLmFjcXVpcmUoKQorICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBkYi5nZXRfdGFibGUoRlJPTT0ncmVzb3VyY2VzX2NvcmUnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVD0oJ2lkJywnY29yZV9pZCcsJ3RocmVhZF9pZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkU9eydudW1hX2lkJzpudW1hX2lkLCdpbnN0YW5jZV9pZCc6IE5vbmUsICdzdGF0dXMnOidvayd9ICkKKyAgICAgICAgZGJfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgaWYgcmVzdWx0IDw9IDA6CisgICAgICAgICAgICBwcmludCBjb250ZW50CisgICAgICAgICAgICByZXR1cm4gLTEsIGNvbnRlbnQKKyAgICAKKyAgICAgICAgI2NvbnZlcnQgcm93cyB0byBhIGRpY3Rpb25hcnkgaW5kZXhlZCBieSBjb3JlX2lkCisgICAgICAgIGNvcmVzX2RpY3QgPSB7fQorICAgICAgICBmb3Igcm93IGluIGNvbnRlbnQ6CisgICAgICAgICAgICBpZiBub3Qgcm93Wydjb3JlX2lkJ10gaW4gY29yZXNfZGljdDoKKyAgICAgICAgICAgICAgICBjb3Jlc19kaWN0W3Jvd1snY29yZV9pZCddXSA9IFtdCisgICAgICAgICAgICBjb3Jlc19kaWN0W3Jvd1snY29yZV9pZCddXS5hcHBlbmQoW3Jvd1sndGhyZWFkX2lkJ10scm93WydpZCddXSkgCisgICAgICAgICAgIAorICAgICAgICAjSW4gY2FzZSBmdWxsIGNvcmVzIGFyZSByZXF1ZXN0ZWQgCisgICAgICAgIHBhaXJlZCA9ICdOJworICAgICAgICBpZiByZXF1aXJlbWVudHNbJ251bWEnXVsncHJvY19yZXFfdHlwZSddID09ICdjb3Jlcyc6CisgICAgICAgICAgICAjR2V0L2NyZWF0ZSB0aGUgbGlzdCBvZiB0aGUgdmNwdV9pZHMKKyAgICAgICAgICAgIHZjcHVfaWRfbGlzdCA9IHJlcXVpcmVtZW50c1snbnVtYSddWydwcm9jX3JlcV9saXN0J10KKyAgICAgICAgICAgIGlmIHZjcHVfaWRfbGlzdCA9PSBOb25lOgorICAgICAgICAgICAgICAgIHZjcHVfaWRfbGlzdCA9IHJhbmdlKDAsaW50KHJlcXVpcmVtZW50c1snbnVtYSddWydwcm9jX3JlcV9uYiddKSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIHRocmVhZHMgaW4gY29yZXNfZGljdC5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICAgICAgI3dlIG5lZWQgZnVsbCBjb3JlcworICAgICAgICAgICAgICAgIGlmIGxlbih0aHJlYWRzKSAhPSAyOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICNzZXQgcGlubmluZyBmb3IgdGhlIGZpcnN0IHRocmVhZAorICAgICAgICAgICAgICAgIGNwdV9waW5uaW5nLmFwcGVuZCggWyB2Y3B1X2lkX2xpc3QucG9wKDApLCB0aHJlYWRzWzBdWzBdLCB0aHJlYWRzWzBdWzFdIF0gKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICNyZXNlcnZlIHNvIGl0IGlzIG5vdCB1c2VkIHRoZSBzZWNvbmQgdGhyZWFkCisgICAgICAgICAgICAgICAgcmVzZXJ2ZWRfdGhyZWFkcy5hcHBlbmQodGhyZWFkc1sxXVsxXSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBsZW4odmNwdV9pZF9saXN0KSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIAorICAgICAgICAjSW4gY2FzZSBwYWlyZWQgdGhyZWFkcyBhcmUgcmVxdWVzdGVkCisgICAgICAgIGVsaWYgcmVxdWlyZW1lbnRzWydudW1hJ11bJ3Byb2NfcmVxX3R5cGUnXSA9PSAncGFpcmVkLXRocmVhZHMnOgorICAgICAgICAgICAgcGFpcmVkID0gJ1knCisgICAgICAgICAgICAjR2V0L2NyZWF0ZSB0aGUgbGlzdCBvZiB0aGUgdmNwdV9pZHMKKyAgICAgICAgICAgIGlmIHJlcXVpcmVtZW50c1snbnVtYSddWydwcm9jX3JlcV9saXN0J10gIT0gTm9uZToKKyAgICAgICAgICAgICAgICB2Y3B1X2lkX2xpc3QgPSBbXQorICAgICAgICAgICAgICAgIGZvciBwYWlyIGluIHJlcXVpcmVtZW50c1snbnVtYSddWydwcm9jX3JlcV9saXN0J106CisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihwYWlyKSE9MjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSwgIkZpZWxkIHBhaXJlZC10aHJlYWRzLWlkIG5vdCBwcm9wZXJseSBzcGVjaWZpZWQiCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgdmNwdV9pZF9saXN0LmFwcGVuZChwYWlyWzBdKQorICAgICAgICAgICAgICAgICAgICB2Y3B1X2lkX2xpc3QuYXBwZW5kKHBhaXJbMV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZjcHVfaWRfbGlzdCA9IHJhbmdlKDAsMippbnQocmVxdWlyZW1lbnRzWydudW1hJ11bJ3Byb2NfcmVxX25iJ10pKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIHRocmVhZHMgaW4gY29yZXNfZGljdC5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICAgICAgI3dlIG5lZWQgZnVsbCBjb3JlcworICAgICAgICAgICAgICAgIGlmIGxlbih0aHJlYWRzKSAhPSAyOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICNzZXQgcGlubmluZyBmb3IgdGhlIGZpcnN0IHRocmVhZAorICAgICAgICAgICAgICAgIGNwdV9waW5uaW5nLmFwcGVuZChbdmNwdV9pZF9saXN0LnBvcCgwKSwgdGhyZWFkc1swXVswXSwgdGhyZWFkc1swXVsxXV0pCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgI3NldCBwaW5uaW5nIGZvciB0aGUgc2Vjb25kIHRocmVhZAorICAgICAgICAgICAgICAgIGNwdV9waW5uaW5nLmFwcGVuZChbdmNwdV9pZF9saXN0LnBvcCgwKSwgdGhyZWFkc1sxXVswXSwgdGhyZWFkc1sxXVsxXV0pCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgbGVuKHZjcHVfaWRfbGlzdCkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAgCisgICAgICAgIAorICAgICAgICAjSW4gY2FzZSBub3JtYWwgdGhyZWFkcyBhcmUgcmVxdWVzdGVkCisgICAgICAgIGVsaWYgcmVxdWlyZW1lbnRzWydudW1hJ11bJ3Byb2NfcmVxX3R5cGUnXSA9PSAndGhyZWFkcyc6CisgICAgICAgICAgICAjR2V0L2NyZWF0ZSB0aGUgbGlzdCBvZiB0aGUgdmNwdV9pZHMKKyAgICAgICAgICAgIHZjcHVfaWRfbGlzdCA9IHJlcXVpcmVtZW50c1snbnVtYSddWydwcm9jX3JlcV9saXN0J10KKyAgICAgICAgICAgIGlmIHZjcHVfaWRfbGlzdCA9PSBOb25lOgorICAgICAgICAgICAgICAgIHZjcHVfaWRfbGlzdCA9IHJhbmdlKDAsaW50KHJlcXVpcmVtZW50c1snbnVtYSddWydwcm9jX3JlcV9uYiddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgdGhyZWFkc19pbmRleCBpbiBzb3J0ZWQoY29yZXNfZGljdCwga2V5PWxhbWJkYSBrOiBsZW4oY29yZXNfZGljdFtrXSkpOgorICAgICAgICAgICAgICAgIHRocmVhZHMgPSBjb3Jlc19kaWN0W3RocmVhZHNfaW5kZXhdCisgICAgICAgICAgICAgICAgI3NldCBwaW5uaW5nIGZvciB0aGUgZmlyc3QgdGhyZWFkCisgICAgICAgICAgICAgICAgY3B1X3Bpbm5pbmcuYXBwZW5kKFt2Y3B1X2lkX2xpc3QucG9wKDApLCB0aHJlYWRzWzBdWzBdLCB0aHJlYWRzWzBdWzFdXSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjaWYgZXhpc3RzLCBzZXQgcGlubmluZyBmb3IgdGhlIHNlY29uZCB0aHJlYWQKKyAgICAgICAgICAgICAgICBpZiBsZW4odGhyZWFkcykgPT0gMiBhbmQgbGVuKHZjcHVfaWRfbGlzdCkgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY3B1X3Bpbm5pbmcuYXBwZW5kKFt2Y3B1X2lkX2xpc3QucG9wKDApLCB0aHJlYWRzWzFdWzBdLCB0aHJlYWRzWzFdWzFdXSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBsZW4odmNwdV9pZF9saXN0KSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBicmVhayAgICAKKyAgICAKKyAgICAgICAgI0dldCB0aGUgc291cmNlIHBjaSBhZGRyZXNzZXMgZm9yIHRoZSBzZWxlY3RlZCBudW1hCisgICAgICAgIHVzZWRfc3Jpb3ZfcG9ydHMgPSBbXQorICAgICAgICBmb3IgcG9ydCBpbiByZXF1aXJlbWVudHNbJ251bWEnXVsnc3Jpb3ZfbGlzdCddOgorICAgICAgICAgICAgZGJfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgIHJlc3VsdCwgY29udGVudCA9IGRiLmdldF90YWJsZShGUk9NPSdyZXNvdXJjZXNfcG9ydCcsIFNFTEVDVD0oJ2lkJywgJ3BjaScsICdtYWMnKSxXSEVSRT17J251bWFfaWQnOm51bWFfaWQsJ3Jvb3RfaWQnOiBwb3J0Wydwb3J0X2lkJ10sICdwb3J0X2lkJzogTm9uZSwgJ01icHNfdXNlZCc6IDB9ICkKKyAgICAgICAgICAgIGRiX2xvY2sucmVsZWFzZSgpCisgICAgICAgICAgICBpZiByZXN1bHQgPD0gMDoKKyAgICAgICAgICAgICAgICBwcmludCBjb250ZW50CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCBjb250ZW50CisgICAgICAgICAgICBmb3Igcm93IGluIGNvbnRlbnQ6CisgICAgICAgICAgICAgICAgaWYgcm93WydpZCddIGluIHVzZWRfc3Jpb3ZfcG9ydHMgb3Igcm93WydpZCddPT1wb3J0Wydwb3J0X2lkJ106CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcG9ydFsncGNpJ10gPSByb3dbJ3BjaSddCisgICAgICAgICAgICAgICAgaWYgJ21hY19hZGRyZXNzJyBub3QgaW4gcG9ydDogCisgICAgICAgICAgICAgICAgICAgIHBvcnRbJ21hY19hZGRyZXNzJ10gPSByb3dbJ21hYyddCisgICAgICAgICAgICAgICAgZGVsIHBvcnRbJ21hYyddCisgICAgICAgICAgICAgICAgcG9ydFsncG9ydF9pZCddPXJvd1snaWQnXQorICAgICAgICAgICAgICAgIHBvcnRbJ01icHNfdXNlZCddID0gcG9ydFsnYmFuZHdpZHRoJ10KKyAgICAgICAgICAgICAgICB1c2VkX3NyaW92X3BvcnRzLmFwcGVuZChyb3dbJ2lkJ10pCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgCisgICAgICAgIGZvciBwb3J0IGluIHJlcXVpcmVtZW50c1snbnVtYSddWydwb3J0X2xpc3QnXToKKyAgICAgICAgICAgIHBvcnRbJ01icHNfdXNlZCddID0gTm9uZQorICAgICAgICAgICAgaWYgcG9ydFsnZGVkaWNhdGVkJ10gIT0gInllczpzcmlvdiI6CisgICAgICAgICAgICAgICAgcG9ydFsnbWFjX2FkZHJlc3MnXSA9IHBvcnRbJ21hYyddCisgICAgICAgICAgICAgICAgZGVsIHBvcnRbJ21hYyddCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGRiX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBkYi5nZXRfdGFibGUoRlJPTT0ncmVzb3VyY2VzX3BvcnQnLCBTRUxFQ1Q9KCdpZCcsICdwY2knLCAnbWFjJywgJ01icHMnKSxXSEVSRT17J251bWFfaWQnOm51bWFfaWQsJ3Jvb3RfaWQnOiBwb3J0Wydwb3J0X2lkJ10sICdwb3J0X2lkJzogTm9uZSwgJ01icHNfdXNlZCc6IDB9ICkKKyAgICAgICAgICAgIGRiX2xvY2sucmVsZWFzZSgpCisgICAgICAgICAgICBpZiByZXN1bHQgPD0gMDoKKyAgICAgICAgICAgICAgICBwcmludCBjb250ZW50CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCBjb250ZW50CisgICAgICAgICAgICBwb3J0WydNYnBzX3VzZWQnXSA9IGNvbnRlbnRbMF1bJ01icHMnXQorICAgICAgICAgICAgZm9yIHJvdyBpbiBjb250ZW50OgorICAgICAgICAgICAgICAgIGlmIHJvd1snaWQnXSBpbiB1c2VkX3NyaW92X3BvcnRzIG9yIHJvd1snaWQnXT09cG9ydFsncG9ydF9pZCddOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHBvcnRbJ3BjaSddID0gcm93WydwY2knXQorICAgICAgICAgICAgICAgIGlmICdtYWNfYWRkcmVzcycgbm90IGluIHBvcnQ6IAorICAgICAgICAgICAgICAgICAgICBwb3J0WydtYWNfYWRkcmVzcyddID0gcm93WydtYWMnXSAgIyBtYWMgY2Fubm90IGJlIHNldCB0byBwYXNzdGhyb3VnaCBwb3J0cyAKKyAgICAgICAgICAgICAgICBkZWwgcG9ydFsnbWFjJ10KKyAgICAgICAgICAgICAgICBwb3J0Wydwb3J0X2lkJ109cm93WydpZCddCisgICAgICAgICAgICAgICAgdXNlZF9zcmlvdl9wb3J0cy5hcHBlbmQocm93WydpZCddKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgCisgICAgIyAgICAgICAgICAgICBwcmludCAnMi4gUGh5c2ljYWwgcG9ydHMgYXNzaWduYXRpb246Jytqc29uLmR1bXBzKHJlcXVpcmVtZW50c1sncG9ydF9saXN0J10sIGluZGVudD00KQorICAgICMgICAgICAgICAgICAgcHJpbnQgJzIuIFNSLUlPViBhc3NpZ25hdGlvbjonK2pzb24uZHVtcHMocmVxdWlyZW1lbnRzWydzcmlvdl9saXN0J10sIGluZGVudD00KQorICAgICAgICAKKyAgICBzZXJ2ZXJbJ2hvc3RfaWQnXSA9IGhvc3RfaWQKKyAgICAgICAgCisKKyAgICAjR2VuZXJhdGUgZGljdGlvbmFyeSBmb3Igc2F2aW5nIGluIGRiIHRoZSBpbnN0YW5jZSByZXNvdXJjZXMKKyAgICByZXNvdXJjZXMgPSB7fQorICAgIHJlc291cmNlc1snYnJpZGdlZC1pZmFjZXMnXSA9IFtdCisgICAgCisgICAgbnVtYV9kaWN0ID0ge30KKyAgICBudW1hX2RpY3RbJ2ludGVyZmFjZXMnXSA9IFtdCisgICAgCisgICAgbnVtYV9kaWN0WydpbnRlcmZhY2VzJ10gKz0gcmVxdWlyZW1lbnRzWydudW1hJ11bJ3BvcnRfbGlzdCddCisgICAgbnVtYV9kaWN0WydpbnRlcmZhY2VzJ10gKz0gcmVxdWlyZW1lbnRzWydudW1hJ11bJ3NyaW92X2xpc3QnXQorICAKKyAgICAjQ2hlY2sgYnJpZGdlIGluZm9ybWF0aW9uCisgICAgdW5pZmllZF9kYXRhcGxhbmVfaWZhY2U9W10KKyAgICB1bmlmaWVkX2RhdGFwbGFuZV9pZmFjZSArPSByZXF1aXJlbWVudHNbJ251bWEnXVsncG9ydF9saXN0J10KKyAgICB1bmlmaWVkX2RhdGFwbGFuZV9pZmFjZSArPSByZXF1aXJlbWVudHNbJ251bWEnXVsnc3Jpb3ZfbGlzdCddCisgICAgCisgICAgZm9yIGNvbnRyb2xfaWZhY2UgaW4gc2VydmVyLmdldCgnbmV0d29ya3MnLCBbXSk6CisgICAgICAgIGNvbnRyb2xfaWZhY2VbJ25ldF9pZCddPWNvbnRyb2xfaWZhY2UucG9wKCd1dWlkJykKKyAgICAgICAgI0dldCB0aGUgYnJpZmdlIG5hbWUKKyAgICAgICAgZGJfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gZGIuZ2V0X3RhYmxlKEZST009J25ldHMnLCBTRUxFQ1Q9KCduYW1lJywndHlwZScsICd2bGFuJyksV0hFUkU9eyd1dWlkJzpjb250cm9sX2lmYWNlWyduZXRfaWQnXX0gKQorICAgICAgICBkYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICBpZiByZXN1bHQgPCAwOiAKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiByZXN1bHQ9PTA6CisgICAgICAgICAgICByZXR1cm4gLTEsICJFcnJvciBhdCBmaWVsZCBuZXR3b2tzOiBOb3QgZm91bmQgYW55IG5ldHdvcmsgd2l0IHV1aWQgJXMiICUgY29udHJvbF9pZmFjZVsnbmV0X2lkJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ldHdvcms9Y29udGVudFswXQorICAgICAgICAgICAgaWYgY29udHJvbF9pZmFjZS5nZXQoInR5cGUiLCAndmlydHVhbCcpID09ICd2aXJ0dWFsJzoKKyAgICAgICAgICAgICAgICBpZiBuZXR3b3JrWyd0eXBlJ10hPSdicmlkZ2VfZGF0YScgYW5kIG5ldHdvcmtbJ3R5cGUnXSE9J2JyaWRnZV9tYW4nOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJFcnJvciBhdCBmaWVsZCBuZXR3b2tzOiBuZXR3b3JrIHV1aWQgJXMgZm9yIGNvbnRyb2wgaW50ZXJmYWNlIGlzIG5vdCBvZiB0eXBlIGJyaWRnZV9tYW4gb3IgYnJpZGdlX2RhdGEiICUgY29udHJvbF9pZmFjZVsnbmV0X2lkJ10KKyAgICAgICAgICAgICAgICByZXNvdXJjZXNbJ2JyaWRnZWQtaWZhY2VzJ10uYXBwZW5kKGNvbnRyb2xfaWZhY2UpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG5ldHdvcmtbJ3R5cGUnXSE9J2RhdGEnIGFuZCBuZXR3b3JrWyd0eXBlJ10hPSdwdHAnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJFcnJvciBhdCBmaWVsZCBuZXR3b2tzOiBuZXR3b3JrIHV1aWQgJXMgZm9yIGRhdGFwbGFuZSBpbnRlcmZhY2UgaXMgbm90IG9mIHR5cGUgZGF0YSBvciBwdHAiICUgY29udHJvbF9pZmFjZVsnbmV0X2lkJ10KKyAgICAgICAgICAgICAgICAjZGF0YXBsYW5lIGludGVyZmFjZSwgbG9vayBmb3IgaXQgaW4gdGhlIG51bWEgdHJlZSBhbmQgYXNpZ24gdGhpcyBuZXR3b3JrCisgICAgICAgICAgICAgICAgaWZhY2VfZm91bmQ9RmFsc2UKKyAgICAgICAgICAgICAgICBmb3IgZGF0YXBsYW5lX2lmYWNlIGluIG51bWFfZGljdFsnaW50ZXJmYWNlcyddOgorICAgICAgICAgICAgICAgICAgICBpZiBkYXRhcGxhbmVfaWZhY2VbJ25hbWUnXSA9PSBjb250cm9sX2lmYWNlLmdldCgibmFtZSIpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFwbGFuZV9pZmFjZVsnZGVkaWNhdGVkJ10gPT0gInllcyIgYW5kIGNvbnRyb2xfaWZhY2VbInR5cGUiXSAhPSAiUEYiKSBvciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGFwbGFuZV9pZmFjZVsnZGVkaWNhdGVkJ10gPT0gIm5vIiBhbmQgY29udHJvbF9pZmFjZVsidHlwZSJdICE9ICJWRiIpIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YXBsYW5lX2lmYWNlWydkZWRpY2F0ZWQnXSA9PSAieWVzOnNyaW92IiBhbmQgY29udHJvbF9pZmFjZVsidHlwZSJdICE9ICJWRm5vdFNoYXJlZCIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAiRXJyb3IgYXQgZmllbGQgbmV0d29rczogbWlzbWF0Y2ggYXQgaW50ZXJmYWNlICclcycgZnJvbSBmbGF2b3IgJ2RlZGljYXRlZD0lcycgYW5kIG5ldHdvcmtzICd0eXBlPSVzJyIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udHJvbF9pZmFjZS5nZXQoIm5hbWUiKSwgZGF0YXBsYW5lX2lmYWNlWydkZWRpY2F0ZWQnXSwgY29udHJvbF9pZmFjZVsidHlwZSJdKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXBsYW5lX2lmYWNlWyd1dWlkJ10gPSBjb250cm9sX2lmYWNlWyduZXRfaWQnXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGF0YXBsYW5lX2lmYWNlWydkZWRpY2F0ZWQnXSA9PSAibm8iOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFwbGFuZV9pZmFjZVsndmxhbiddID0gbmV0d29ya1sndmxhbiddCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYXRhcGxhbmVfaWZhY2VbJ2RlZGljYXRlZCddICE9ICJ5ZXMiIGFuZCBjb250cm9sX2lmYWNlLmdldCgibWFjX2FkZHJlc3MiKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcGxhbmVfaWZhY2VbJ21hY19hZGRyZXNzJ10gPSBjb250cm9sX2lmYWNlLmdldCgibWFjX2FkZHJlc3MiKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29udHJvbF9pZmFjZS5nZXQoInZwY2kiKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcGxhbmVfaWZhY2VbJ3ZwY2knXSA9IGNvbnRyb2xfaWZhY2UuZ2V0KCJ2cGNpIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlX2ZvdW5kPVRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbm90IGlmYWNlX2ZvdW5kOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJFcnJvciBhdCBmaWVsZCBuZXR3b2tzOiBpbnRlcmZhY2UgbmFtZSAlcyBmcm9tIG5ldHdvcmsgbm90IGZvdW5kIGF0IGZsYXZvciIgJSBjb250cm9sX2lmYWNlLmdldCgibmFtZSIpCisgICAgICAgIAorICAgIHJlc291cmNlc1snaG9zdF9pZCddID0gaG9zdF9pZAorICAgIHJlc291cmNlc1snaW1hZ2VfaWQnXSA9IHNlcnZlclsnaW1hZ2VfaWQnXQorICAgIHJlc291cmNlc1snZmxhdm9yX2lkJ10gPSBzZXJ2ZXJbJ2ZsYXZvcl9pZCddCisgICAgcmVzb3VyY2VzWyd0ZW5hbnRfaWQnXSA9IHNlcnZlclsndGVuYW50X2lkJ10KKyAgICByZXNvdXJjZXNbJ3JhbSddID0gcmVxdWlyZW1lbnRzWydyYW0nXQorICAgIHJlc291cmNlc1sndmNwdXMnXSA9IHJlcXVpcmVtZW50c1sndmNwdXMnXQorICAgIHJlc291cmNlc1snc3RhdHVzJ10gPSAnQ1JFQVRJTkcnCisgICAgCisgICAgaWYgJ2Rlc2NyaXB0aW9uJyBpbiBzZXJ2ZXI6IHJlc291cmNlc1snZGVzY3JpcHRpb24nXSA9IHNlcnZlclsnZGVzY3JpcHRpb24nXQorICAgIGlmICduYW1lJyBpbiBzZXJ2ZXI6IHJlc291cmNlc1snbmFtZSddID0gc2VydmVyWyduYW1lJ10KKyAgICAKKyAgICByZXNvdXJjZXNbJ2V4dGVuZGVkJ10gPSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgI29wdGlvbmFsCisgICAgcmVzb3VyY2VzWydleHRlbmRlZCddWydudW1hcyddID0gW10KKyAgICBudW1hX2RpY3RbJ251bWFfaWQnXSA9IG51bWFfaWQKKyAgICBudW1hX2RpY3RbJ21lbW9yeSddID0gcmVxdWlyZW1lbnRzWydudW1hJ11bJ21lbW9yeSddCisgICAgbnVtYV9kaWN0Wydjb3JlcyddID0gW10KKworICAgIGZvciBjb3JlIGluIGNwdV9waW5uaW5nOgorICAgICAgICBudW1hX2RpY3RbJ2NvcmVzJ10uYXBwZW5kKHsnaWQnOiBjb3JlWzJdLCAndnRocmVhZCc6IGNvcmVbMF0sICdwYWlyZWQnOiBwYWlyZWR9KQorICAgIGZvciBjb3JlIGluIHJlc2VydmVkX3RocmVhZHM6CisgICAgICAgIG51bWFfZGljdFsnY29yZXMnXS5hcHBlbmQoeydpZCc6IGNvcmV9KQorICAgIHJlc291cmNlc1snZXh0ZW5kZWQnXVsnbnVtYXMnXS5hcHBlbmQobnVtYV9kaWN0KQorICAgIGlmIGV4dGVuZGVkIT1Ob25lIGFuZCAnZGV2aWNlcycgaW4gZXh0ZW5kZWQ6ICAgI1RPRE8gYWxsb3cgZXh0cmEgZGV2aWNlcyB3aXRob3V0IG51bWEKKyAgICAgICAgcmVzb3VyY2VzWydleHRlbmRlZCddWydkZXZpY2VzJ10gPSBleHRlbmRlZFsnZGV2aWNlcyddCisgICAgCisKKyAgICBwcmludCAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09eycKKyAgICBwcmludCBqc29uLmR1bXBzKHJlc291cmNlcywgaW5kZW50PTQpCisgICAgcHJpbnQgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PX0nCisgICAgCisgICAgcmV0dXJuIDAsIHJlc291cmNlcworCmRpZmYgLS1naXQgYS9odHRwc2VydmVyLnB5IGIvaHR0cHNlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmU1MTY0Ci0tLSAvZGV2L251bGwKKysrIGIvaHR0cHNlcnZlci5weQpAQCAtMCwwICsxLDIxNTYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKycnJworVGhpcyBpcyB0aGUgdGhyZWFkIGZvciB0aGUgaHR0cCBzZXJ2ZXIgTm9ydGggQVBJLiAKK1R3byB0aHJlYWQgd2lsbCBiZSBsYXVuY2hlZCwgd2l0aCBub3JtYWwgYW5kIGFkbWluaXN0cmF0aXZlIHBlcm1pc3Npb25zLgorJycnCisKK19fYXV0aG9yX189IkFsZm9uc28gVGllcm5vIgorX19kYXRlX18gPSIkMTAtanVsLTIwMTQgMTI6MDc6MTUkIgorCitpbXBvcnQgYm90dGxlCitpbXBvcnQgeWFtbAoraW1wb3J0IGpzb24KK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCBkYXRldGltZQorZnJvbSB1dGlscyBpbXBvcnQgUkFEY2xhc3MKK2Zyb20ganNvbnNjaGVtYSBpbXBvcnQgdmFsaWRhdGUgYXMganNfdiwgZXhjZXB0aW9ucyBhcyBqc19lCitpbXBvcnQgaG9zdF90aHJlYWQgYXMgaHQKK2Zyb20gdmltX3NjaGVtYSBpbXBvcnQgaG9zdF9uZXdfc2NoZW1hLCBob3N0X2VkaXRfc2NoZW1hLCB0ZW5hbnRfbmV3X3NjaGVtYSwgXAorICAgIHRlbmFudF9lZGl0X3NjaGVtYSwgXAorICAgIGZsYXZvcl9uZXdfc2NoZW1hLCBmbGF2b3JfdXBkYXRlX3NjaGVtYSwgXAorICAgIGltYWdlX25ld19zY2hlbWEsIGltYWdlX3VwZGF0ZV9zY2hlbWEsIFwKKyAgICBzZXJ2ZXJfbmV3X3NjaGVtYSwgc2VydmVyX2FjdGlvbl9zY2hlbWEsIG5ldHdvcmtfbmV3X3NjaGVtYSwgbmV0d29ya191cGRhdGVfc2NoZW1hLCBcCisgICAgcG9ydF9uZXdfc2NoZW1hLCBwb3J0X3VwZGF0ZV9zY2hlbWEKKworZ2xvYmFsIG15CitnbG9iYWwgdXJsX2Jhc2UKK2dsb2JhbCBjb25maWdfZGljCisKK3VybF9iYXNlPSIvb3BlbnZpbSIKKworSFRUUF9CYWRfUmVxdWVzdCA9ICAgICAgICAgIDQwMAorSFRUUF9VbmF1dGhvcml6ZWQgPSAgICAgICAgIDQwMSAKK0hUVFBfTm90X0ZvdW5kID0gICAgICAgICAgICA0MDQgCitIVFRQX0ZvcmJpZGRlbiA9ICAgICAgICAgICAgNDAzCitIVFRQX01ldGhvZF9Ob3RfQWxsb3dlZCA9ICAgNDA1IAorSFRUUF9Ob3RfQWNjZXB0YWJsZSA9ICAgICAgIDQwNgorSFRUUF9SZXF1ZXN0X1RpbWVvdXQgPSAgICAgIDQwOAorSFRUUF9Db25mbGljdCA9ICAgICAgICAgICAgIDQwOQorSFRUUF9TZXJ2aWNlX1VuYXZhaWxhYmxlID0gIDUwMyAKK0hUVFBfSW50ZXJuYWxfU2VydmVyX0Vycm9yPSA1MDAgCisKKworZGVmIGNoZWNrX2V4dGVuZGVkKGV4dGVuZGVkLCBhbGxvd19uZXRfYXR0YWNoPUZhbHNlKToKKyAgICAnJydNYWtlcyBhbmQgZXh0cmEgY2hlY2tpbmcgb2YgZXh0ZW5kZWQgaW5wdXQgdGhhdCBjYW5ub3QgYmUgZG9uZSB1c2luZyBqc29uc2NoZW1hCisgICAgQXR0cmlidXRlczogCisgICAgICAgIGFsbG93X25ldF9hdHRhY2g6ICBmb3IgYWxsb3dpbmcgb3Igbm90IHRoZSB1dWlkIGZpZWxkIGF0IGludGVyZmFjZXMKKyAgICAgICAgdGhhdCBhcmUgYWxsb3dlZCBmb3IgaW5zdGFuY2UsIGJ1dCBub3QgZm9yIGZsYXZvcnMKKyAgICBSZXR1cm46ICg8MCwgZXJyb3JfdGV4dCkgaWYgZXJyb3I7ICgwLE5vbmUpIGlmIG5vdCBlcnJvciAnJycKKyAgICBpZiAibnVtYXMiIG5vdCBpbiBleHRlbmRlZDogcmV0dXJuIDAsIE5vbmUKKyAgICBpZF9zPVtdCisgICAgbnVtYWlkPTAKKyAgICBmb3IgbnVtYSBpbiBleHRlbmRlZFsibnVtYXMiXToKKyAgICAgICAgbmJfZm9ybWF0cyA9IDAKKyAgICAgICAgaWYgImNvcmVzIiBpbiBudW1hOgorICAgICAgICAgICAgbmJfZm9ybWF0cyArPSAxCisgICAgICAgICAgICBpZiAiY29yZXMtaWQiIGluIG51bWE6CisgICAgICAgICAgICAgICAgaWYgbGVuKG51bWFbImNvcmVzLWlkIl0pICE9IG51bWFbImNvcmVzIl06CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtSFRUUF9CYWRfUmVxdWVzdCwgImRpZmZlcmVudCBudW1iZXIgb2YgY29yZXMtaWQgKCVkKSB0aGFuIGNvcmVzICglZCkgYXQgbnVtYSAlZCIgJSAobGVuKG51bWFbImNvcmVzLWlkIl0pLCBudW1hWyJjb3JlcyJdLG51bWFpZCkKKyAgICAgICAgICAgICAgICBpZF9zLmV4dGVuZChudW1hWyJjb3Jlcy1pZCJdKQorICAgICAgICBpZiAidGhyZWFkcyIgaW4gbnVtYToKKyAgICAgICAgICAgIG5iX2Zvcm1hdHMgKz0gMQorICAgICAgICAgICAgaWYgInRocmVhZHMtaWQiIGluIG51bWE6CisgICAgICAgICAgICAgICAgaWYgbGVuKG51bWFbInRocmVhZHMtaWQiXSkgIT0gbnVtYVsidGhyZWFkcyJdOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUhUVFBfQmFkX1JlcXVlc3QsICJkaWZmZXJlbnQgbnVtYmVyIG9mIHRocmVhZHMtaWQgKCVkKSB0aGFuIHRocmVhZHMgKCVkKSBhdCBudW1hICVkIiAlIChsZW4obnVtYVsidGhyZWFkcy1pZCJdKSwgbnVtYVsidGhyZWFkcyJdLG51bWFpZCkgCisgICAgICAgICAgICAgICAgaWRfcy5leHRlbmQobnVtYVsidGhyZWFkcy1pZCJdKQorICAgICAgICBpZiAicGFpcmVkLXRocmVhZHMiIGluIG51bWE6CisgICAgICAgICAgICBuYl9mb3JtYXRzICs9IDEKKyAgICAgICAgICAgIGlmICJwYWlyZWQtdGhyZWFkcy1pZCIgaW4gbnVtYToKKyAgICAgICAgICAgICAgICBpZiBsZW4obnVtYVsicGFpcmVkLXRocmVhZHMtaWQiXSkgIT0gbnVtYVsicGFpcmVkLXRocmVhZHMiXToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1IVFRQX0JhZF9SZXF1ZXN0LCAiZGlmZmVyZW50IG51bWJlciBvZiBwYWlyZWQtdGhyZWFkcy1pZCAoJWQpIHRoYW4gcGFpcmVkLXRocmVhZHMgKCVkKSBhdCBudW1hICVkIiAlIChsZW4obnVtYVsicGFpcmVkLXRocmVhZHMtaWQiXSksIG51bWFbInBhaXJlZC10aHJlYWRzIl0sbnVtYWlkKSAKKyAgICAgICAgICAgICAgICBmb3IgcGFpciBpbiBudW1hWyJwYWlyZWQtdGhyZWFkcy1pZCJdOgorICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocGFpcikgIT0gMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtSFRUUF9CYWRfUmVxdWVzdCwgInBhaXJlZC10aHJlYWRzLWlkIG11c3QgY29udGFpbiBhIGxpc3Qgb2YgdHdvIGVsZW1lbnRzIGxpc3QgYXQgbnVtYSAlZCIgJSAobnVtYWlkKSAKKyAgICAgICAgICAgICAgICAgICAgaWRfcy5leHRlbmQocGFpcikKKyAgICAgICAgaWYgbmJfZm9ybWF0cyA+IDE6CisgICAgICAgICAgICByZXR1cm4gLUhUVFBfU2VydmljZV9VbmF2YWlsYWJsZSwgIm9ubHkgb25lIG9mIGNvcmVzLCB0aHJlYWRzLCAgcGFpcmVkLXRocmVhZHMgYXJlIGFsbG93ZWQgaW4gdGhpcyB2ZXJzaW9uIGF0IG51bWEgJWQiICUgbnVtYWlkIAorICAgICAgICAjY2hlY2sgaW50ZXJmYWNlcworICAgICAgICBpZiAiaW50ZXJmYWNlcyIgaW4gbnVtYToKKyAgICAgICAgICAgIGlmYWNlaWQ9MAorICAgICAgICAgICAgbmFtZXM9W10KKyAgICAgICAgICAgIHZwY2lzPVtdCisgICAgICAgICAgICBmb3IgaW50ZXJmYWNlIGluIG51bWFbImludGVyZmFjZXMiXToKKyAgICAgICAgICAgICAgICBpZiAidXVpZCIgaW4gaW50ZXJmYWNlIGFuZCBub3QgYWxsb3dfbmV0X2F0dGFjaDogCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtSFRUUF9CYWRfUmVxdWVzdCwgInV1aWQgZmllbGQgaXMgbm90IGFsbG93ZWQgYXQgbnVtYSAlZCBpbnRlcmZhY2UgJXMgcG9zaXRpb24gJWQiICUgKG51bWFpZCwgaW50ZXJmYWNlLmdldCgibmFtZSIsIiIpLCBpZmFjZWlkICkKKyAgICAgICAgICAgICAgICBpZiAibWFjX2FkZHJlc3MiIGluIGludGVyZmFjZSBhbmQgaW50ZXJmYWNlWyJkZWRpY2F0ZWQiXT09InllcyI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtSFRUUF9CYWRfUmVxdWVzdCwgIm1hY19hZGRyZXNzIGNhbiBub3QgYmUgc2V0IGZvciBkZWRpY2F0ZWQgKHBhc3N0aHJvdWdoKSBhdCBudW1hICVkLCBpbnRlcmZhY2UgJXMgcG9zaXRpb24gJWQiICUgKG51bWFpZCwgaW50ZXJmYWNlLmdldCgibmFtZSIsIiIpLCBpZmFjZWlkICkKKyAgICAgICAgICAgICAgICBpZiAibmFtZSIgaW4gaW50ZXJmYWNlOgorICAgICAgICAgICAgICAgICAgICBpZiBpbnRlcmZhY2VbIm5hbWUiXSBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtSFRUUF9CYWRfUmVxdWVzdCwgIm5hbWUgcmVwZWF0ZWQgYXQgbnVtYSAlZCwgaW50ZXJmYWNlICVzIHBvc2l0aW9uICVkIiAlIChudW1haWQsIGludGVyZmFjZS5nZXQoIm5hbWUiLCIiKSwgaWZhY2VpZCApCisgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZChpbnRlcmZhY2VbIm5hbWUiXSkKKyAgICAgICAgICAgICAgICBpZiAidnBjaSIgaW4gaW50ZXJmYWNlOgorICAgICAgICAgICAgICAgICAgICBpZiBpbnRlcmZhY2VbInZwY2kiXSBpbiB2cGNpczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtSFRUUF9CYWRfUmVxdWVzdCwgInZwY2kgJXMgcmVwZWF0ZWQgYXQgbnVtYSAlZCwgaW50ZXJmYWNlICVzIHBvc2l0aW9uICVkIiAlIChpbnRlcmZhY2VbInZwY2kiXSwgbnVtYWlkLCBpbnRlcmZhY2UuZ2V0KCJuYW1lIiwiIiksIGlmYWNlaWQgKQorICAgICAgICAgICAgICAgICAgICB2cGNpcy5hcHBlbmQoaW50ZXJmYWNlWyJ2cGNpIl0pCisgICAgICAgICAgICAgICAgaWZhY2VpZCs9MQorICAgICAgICBudW1haWQrPTEKKyAgICBpZiBudW1haWQgPiAxOgorICAgICAgICByZXR1cm4gLUhUVFBfU2VydmljZV9VbmF2YWlsYWJsZSwgIm9ubHkgb25lIG51bWEgY2FuIGJlIGRlZmluZWQgaW4gdGhpcyB2ZXJzaW9uICIgCisgICAgZm9yIGEgaW4gcmFuZ2UoMCxsZW4oaWRfcykpOgorICAgICAgICBpZiBhIG5vdCBpbiBpZF9zOgorICAgICAgICAgICAgcmV0dXJuIC1IVFRQX0JhZF9SZXF1ZXN0LCAiY29yZS90aHJlYWQgaWRlbnRpZmllcnMgbXVzdCBzdGFydCBhdCAwIGFuZCBnYXBzIGFyZSBub3QgYWxsb2VkLiBNaXNzaW5nIGlkIG51bWJlciAlZCIgJSBhIAorICAgIAorICAgIHJldHVybiAwLCBOb25lCisKKyMKKyMgZGljdGlvbmFyaWVzIHRoYXQgY2hhbmdlIGZyb20gSFRUUCBBUEkgdG8gZGF0YWJhc2UgbmFtaW5nCisjCitodHRwMmRiX2hvc3Q9eydpZCc6J3V1aWQnfQoraHR0cDJkYl90ZW5hbnQ9eydpZCc6J3V1aWQnfQoraHR0cDJkYl9mbGF2b3I9eydpZCc6J3V1aWQnLCdpbWFnZVJlZic6J2ltYWdlX2lkJ30KK2h0dHAyZGJfaW1hZ2U9eydpZCc6J3V1aWQnLCAnY3JlYXRlZCc6J2NyZWF0ZWRfYXQnLCAndXBkYXRlZCc6J21vZGlmaWVkX2F0JywgJ3B1YmxpYyc6ICdwdWJsaWMnfQoraHR0cDJkYl9zZXJ2ZXI9eydpZCc6J3V1aWQnLCdob3N0SWQnOidob3N0X2lkJywnZmxhdm9yUmVmJzonZmxhdm9yX2lkJywnaW1hZ2VSZWYnOidpbWFnZV9pZCcsJ2NyZWF0ZWQnOidjcmVhdGVkX2F0J30KK2h0dHAyZGJfbmV0d29yaz17J2lkJzondXVpZCcsJ3Byb3ZpZGVyOnZsYW4nOid2bGFuJywgJ3Byb3ZpZGVyOnBoeXNpY2FsJzogJ3Byb3ZpZGVyJ30KK2h0dHAyZGJfcG9ydD17J2lkJzondXVpZCcsICduZXR3b3JrX2lkJzonbmV0X2lkJywgJ21hY19hZGRyZXNzJzonbWFjJywgJ2RldmljZV9vd25lcic6J3R5cGUnLCdkZXZpY2VfaWQnOidpbnN0YW5jZV9pZCcsJ2JpbmRpbmc6c3dpdGNoX3BvcnQnOidzd2l0Y2hfcG9ydCcsJ2JpbmRpbmc6dmxhbic6J3ZsYW4nLCAnYmFuZHdpZHRoJzonTWJwcyd9CisKK2RlZiByZW1vdmVfZXh0cmFfaXRlbXMoZGF0YSwgc2NoZW1hKToKKyAgICBkZWxldGVkPVtdCisgICAgaWYgdHlwZShkYXRhKSBpcyB0dXBsZSBvciB0eXBlKGRhdGEpIGlzIGxpc3Q6CisgICAgICAgIGZvciBkIGluIGRhdGE6CisgICAgICAgICAgICBhPSByZW1vdmVfZXh0cmFfaXRlbXMoZCwgc2NoZW1hWydpdGVtcyddKQorICAgICAgICAgICAgaWYgYSBpcyBub3QgTm9uZTogZGVsZXRlZC5hcHBlbmQoYSkKKyAgICBlbGlmIHR5cGUoZGF0YSkgaXMgZGljdDoKKyAgICAgICAgZm9yIGsgaW4gZGF0YS5rZXlzKCk6CisgICAgICAgICAgICBpZiAncHJvcGVydGllcycgbm90IGluIHNjaGVtYSBvciBrIG5vdCBpbiBzY2hlbWFbJ3Byb3BlcnRpZXMnXS5rZXlzKCk6CisgICAgICAgICAgICAgICAgZGVsIGRhdGFba10KKyAgICAgICAgICAgICAgICBkZWxldGVkLmFwcGVuZChrKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhID0gcmVtb3ZlX2V4dHJhX2l0ZW1zKGRhdGFba10sIHNjaGVtYVsncHJvcGVydGllcyddW2tdKQorICAgICAgICAgICAgICAgIGlmIGEgaXMgbm90IE5vbmU6ICBkZWxldGVkLmFwcGVuZCh7azphfSkKKyAgICBpZiBsZW4oZGVsZXRlZCkgPT0gMDogcmV0dXJuIE5vbmUKKyAgICBlbGlmIGxlbihkZWxldGVkKSA9PSAxOiByZXR1cm4gZGVsZXRlZFswXQorICAgIGVsc2U6IHJldHVybiBkZWxldGVkCisgICAgICAgICAgICAgICAgCitkZWYgZGVsZXRlX251bGxzKHZhcik6CisgICAgaWYgdHlwZSh2YXIpIGlzIGRpY3Q6CisgICAgICAgIGZvciBrIGluIHZhci5rZXlzKCk6CisgICAgICAgICAgICBpZiB2YXJba10gaXMgTm9uZTogZGVsIHZhcltrXQorICAgICAgICAgICAgZWxpZiB0eXBlKHZhcltrXSkgaXMgZGljdCBvciB0eXBlKHZhcltrXSkgaXMgbGlzdCBvciB0eXBlKHZhcltrXSkgaXMgdHVwbGU6IAorICAgICAgICAgICAgICAgIGlmIGRlbGV0ZV9udWxscyh2YXJba10pOiBkZWwgdmFyW2tdCisgICAgICAgIGlmIGxlbih2YXIpID09IDA6IHJldHVybiBUcnVlCisgICAgZWxpZiB0eXBlKHZhcikgaXMgbGlzdCBvciB0eXBlKHZhcikgaXMgdHVwbGU6CisgICAgICAgIGZvciBrIGluIHZhcjoKKyAgICAgICAgICAgIGlmIHR5cGUoaykgaXMgZGljdDogZGVsZXRlX251bGxzKGspCisgICAgICAgIGlmIGxlbih2YXIpID09IDA6IHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgaHR0cHNlcnZlcih0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGJfY29ubiwgbmFtZT0iaHR0cCIsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9ODA4MCwgYWRtaW49RmFsc2UsIGNvbmZpZ189Tm9uZSk6CisgICAgICAgICcnJworICAgICAgICBDcmVhdGVzIGEgbmV3IHRocmVhZCB0byBhdHRlbmQgdGhlIGh0dHAgY29ubmVjdGlvbnMKKyAgICAgICAgQXR0cmlidXRlczoKKyAgICAgICAgICAgIGRiX2Nvbm46IGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIG5hbWU6IG5hbWUgb2YgdGhpcyB0aHJlYWQKKyAgICAgICAgICAgIGhvc3Q6IGlwIG9yIG5hbWUgd2hlcmUgdG8gbGlzdGVuCisgICAgICAgICAgICBwb3J0OiBwb3J0IHdoZXJlIHRvIGxpc3RlbgorICAgICAgICAgICAgYWRtaW46IGlmIHRoaXMgaGFzIHByaXZpbGVnZXMgb2YgYWRtaW5pc3RyYXRvciBvciBub3QgCisgICAgICAgICAgICBjb25maWdfOiB1bmxlc3MgdGhlIGZpcnN0IHRocmVhZCBtdXN0IGJlIHByb3ZpZGVkLiBJdCBpcyBhIGdsb2JhbCBkaWN0aW9uYXJ5IHdoZXJlIHRvIGFsbG9jYXRlIHRoZSBzZWxmIHZhcmlhYmxlIAorICAgICAgICAnJycKKyAgICAgICAgZ2xvYmFsIHVybF9iYXNlCisgICAgICAgIGdsb2JhbCBjb25maWdfZGljCisgICAgICAgIAorICAgICAgICAjaW5pdGlhbGl6YXRpb24KKyAgICAgICAgaWYgY29uZmlnXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbmZpZ19kaWMgPSBjb25maWdfCisgICAgICAgIGlmICdodHRwX3RocmVhZHMnIG5vdCBpbiBjb25maWdfZGljOgorICAgICAgICAgICAgY29uZmlnX2RpY1snaHR0cF90aHJlYWRzJ10gPSB7fQorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydCAgCisgICAgICAgIHNlbGYuZGIgPSBkYl9jb25uCisgICAgICAgIHNlbGYuYWRtaW4gPSBhZG1pbgorICAgICAgICBpZiBuYW1lIGluIGNvbmZpZ19kaWM6CisgICAgICAgICAgICBwcmludCAiaHR0cHNlcnZlciBXYXJuaW5nISEhIE9uZXRoZXIgdGhyZWFkIHdpdGggdGhlIHNhbWUgbmFtZSIsIG5hbWUKKyAgICAgICAgICAgIG49MAorICAgICAgICAgICAgd2hpbGUgbmFtZStzdHIobikgaW4gY29uZmlnX2RpYzoKKyAgICAgICAgICAgICAgICBuICs9MQorICAgICAgICAgICAgbmFtZSArPXN0cihuKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYudXJsX3ByZWZmaXggPSAnaHR0cDovLycgKyBzZWxmLmhvc3QgKyAnOicgKyBzdHIoc2VsZi5wb3J0KSArIHVybF9iYXNlCisgICAgICAgIGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddW25hbWVdID0gc2VsZgorCisgICAgICAgICNFbnN1cmUgdGhhdCB3aGVuIHRoZSBtYWluIHByb2dyYW0gZXhpdHMgdGhlIHRocmVhZCB3aWxsIGFsc28gZXhpdAorICAgICAgICBzZWxmLmRhZW1vbiA9IFRydWUgICAgICAKKyAgICAgICAgc2VsZi5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgIAorICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGJvdHRsZS5ydW4oaG9zdD1zZWxmLmhvc3QsIHBvcnQ9c2VsZi5wb3J0LCBkZWJ1Zz1UcnVlKSAjcXVpZXQ9VHJ1ZQorICAgICAgICAgICAKKyAgICBkZWYgZ2V0aG9zdChzZWxmLCBob3N0X2lkKToKKyAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gc2VsZi5kYi5nZXRfaG9zdChob3N0X2lkKQorICAgICAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICAgICAgcHJpbnQgImh0dHBzZXJ2ZXIuZ2V0aG9zdCBlcnJvciAlZCAlcyIgJSAocmVzdWx0LCBjb250ZW50KQorICAgICAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIGVsaWYgcmVzdWx0PT0wOgorICAgICAgICAgICAgcHJpbnQgImh0dHBzZXJ2ZXIuZ2V0aG9zdCBob3N0ICclcycgbm90IGZvdW5kIiAlIGhvc3RfaWQKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgY29udGVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGE9eydob3N0JyA6IGNvbnRlbnR9CisgICAgICAgICAgICBjb252ZXJ0X2Jvb2xlYW4oY29udGVudCwgKCdhZG1pbl9zdGF0ZV91cCcsKSApCisgICAgICAgICAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGNvbnRlbnQsIGh0dHAyZGJfaG9zdCwgcmV2ZXJzZT1UcnVlKQorICAgICAgICAgICAgcHJpbnQgZGF0YVsnaG9zdCddCisgICAgICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy8nLCBtZXRob2Q9J0dFVCcpCitkZWYgaHR0cF9nZXQoKToKKyAgICBwcmludCAKKyAgICByZXR1cm4gJ3dvcmtzJyAjVE9ETzogcHV0IGxpbmtzIG9yIHJlZGlyZWN0aW9uIHRvIC9vcGVudmltPz8/CisKKyMKKyMgVXRpbCBmdW5jaW9ucworIworCitkZWYgY2hhbmdlX2tleXNfaHR0cDJkYihkYXRhLCBodHRwX2RiLCByZXZlcnNlPUZhbHNlKToKKyAgICAnJydDaGFuZ2Uga2V5cyBvZiBkaWN0aW9uYXJ5IGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBrZXlfZGljdCB2YWx1ZXMKKyAgICBUaGlzIGFsbG93IGNoYW5nZSBmcm9tIGh0dHAgaW50ZXJmYWNlIG5hbWVzIHRvIGRhdGFiYXNlIG5hbWVzLgorICAgIFdoZW4gcmV2ZXJzZSBpcyBUcnVlLCB0aGUgY2hhbmdlIGlzIG90aGVyd2lzZQorICAgIEF0dHJpYnV0ZXM6CisgICAgICAgIGRhdGE6IGNhbiBiZSBhIGRpY3Rpb25hcnkgb3IgYSBsaXN0CisgICAgICAgIGh0dHBfZGI6IGlzIGEgZGljdGlvbmFyeSB3aXRoIGhodHAgbmFtZXMgYXMga2V5cyBhbmQgZGF0YWJhc2UgbmFtZXMgYXMgdmFsdWUKKyAgICAgICAgcmV2ZXJzZTogYnkgZGVmYXVsdCBjaGFuZ2UgaXMgZG9uZSBmcm9tIGh0dHAgQVBJIHRvIGRhdGFiYXNlLiBJZiBUcnVlIGNoYW5nZSBpcyBkb25lIG90aGVyd2lzZQorICAgIFJldHVybjogTm9uZSwgYnV0IGRhdGEgaXMgbW9kaWZpZWQnJycKKyAgICBpZiB0eXBlKGRhdGEpIGlzIHR1cGxlIG9yIHR5cGUoZGF0YSkgaXMgbGlzdDoKKyAgICAgICAgZm9yIGQgaW4gZGF0YToKKyAgICAgICAgICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoZCwgaHR0cF9kYiwgcmV2ZXJzZSkKKyAgICBlbGlmIHR5cGUoZGF0YSkgaXMgZGljdCBvciB0eXBlKGRhdGEpIGlzIGJvdHRsZS5Gb3Jtc0RpY3Q6CisgICAgICAgIGlmIHJldmVyc2U6CisgICAgICAgICAgICBmb3Igayx2IGluIGh0dHBfZGIuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiB2IGluIGRhdGE6IGRhdGFba109ZGF0YS5wb3AodikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBrLHYgaW4gaHR0cF9kYi5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGsgaW4gZGF0YTogZGF0YVt2XT1kYXRhLnBvcChrKQorCisKKworZGVmIGZvcm1hdF9vdXQoZGF0YSk6CisgICAgJycncmV0dXJuIHN0cmluZyBvZiBkaWN0aW9uYXJ5IGRhdGEgYWNjb3JkaW5nIHRvIHJlcXVlc3RlZCBqc29uLCB5YW1sLCB4bWwuIEJ5IGRlZmF1bHQganNvbicnJworICAgIGlmICdhcHBsaWNhdGlvbi95YW1sJyBpbiBib3R0bGUucmVxdWVzdC5oZWFkZXJzLmdldCgnQWNjZXB0Jyk6CisgICAgICAgIGJvdHRsZS5yZXNwb25zZS5jb250ZW50X3R5cGU9J2FwcGxpY2F0aW9uL3lhbWwnCisgICAgICAgIHJldHVybiB5YW1sLnNhZmVfZHVtcChkYXRhLCBleHBsaWNpdF9zdGFydD1UcnVlLCBpbmRlbnQ9NCwgZGVmYXVsdF9mbG93X3N0eWxlPUZhbHNlLCB0YWdzPUZhbHNlLCBlbmNvZGluZz0ndXRmLTgnLCBhbGxvd191bmljb2RlPVRydWUpICMsIGNhbm9uaWNhbD1UcnVlLCBkZWZhdWx0X3N0eWxlPSciJworICAgIGVsc2U6ICNieSBkZWZhdWx0IGpzb24KKyAgICAgICAgYm90dGxlLnJlc3BvbnNlLmNvbnRlbnRfdHlwZT0nYXBwbGljYXRpb24vanNvbicKKyAgICAgICAgI3JldHVybiBkYXRhICNqc29uIG5vIHN0eWxlCisgICAgICAgIHJldHVybiBqc29uLmR1bXBzKGRhdGEsIGluZGVudD00KSArICJcbiIKKworZGVmIGZvcm1hdF9pbihzY2hlbWEpOgorICAgIHRyeToKKyAgICAgICAgZXJyb3JfdGV4dCA9ICJJbnZhbGlkIGhlYWRlciBmb3JtYXQgIgorICAgICAgICBmb3JtYXRfdHlwZSA9IGJvdHRsZS5yZXF1ZXN0LmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpCisgICAgICAgIGlmICdhcHBsaWNhdGlvbi9qc29uJyBpbiBmb3JtYXRfdHlwZToKKyAgICAgICAgICAgIGVycm9yX3RleHQgPSAiSW52YWxpZCBqc29uIGZvcm1hdCAiCisgICAgICAgICAgICAjVXNlIHRoZSBqc29uIGRlY29kZXIgaW5zdGVhZCBvZiBib3R0bGUgZGVjb2RlciBiZWNhdXNlIGl0IGluZm9ybXMgYWJvdXQgdGhlIGxvY2F0aW9uIG9mIGVycm9yIGZvcm1hdHMgd2l0aCBhIFZhbHVlRXJyb3IgZXhjZXB0aW9uCisgICAgICAgICAgICBjbGllbnRfZGF0YSA9IGpzb24ubG9hZChib3R0bGUucmVxdWVzdC5ib2R5KQorICAgICAgICAgICAgI2NsaWVudF9kYXRhID0gYm90dGxlLnJlcXVlc3QuanNvbigpCisgICAgICAgIGVsaWYgJ2FwcGxpY2F0aW9uL3lhbWwnIGluIGZvcm1hdF90eXBlOgorICAgICAgICAgICAgZXJyb3JfdGV4dCA9ICJJbnZhbGlkIHlhbWwgZm9ybWF0ICIKKyAgICAgICAgICAgIGNsaWVudF9kYXRhID0geWFtbC5sb2FkKGJvdHRsZS5yZXF1ZXN0LmJvZHkpCisgICAgICAgIGVsaWYgZm9ybWF0X3R5cGUgPT0gJ2FwcGxpY2F0aW9uL3htbCc6CisgICAgICAgICAgICBib3R0bGUuYWJvcnQoNTAxLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94bWwgbm90IHN1cHBvcnRlZCB5ZXQuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJIVFRQIEhFQURFUlM6ICIgKyBzdHIoYm90dGxlLnJlcXVlc3QuaGVhZGVycy5pdGVtcygpKQorICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTm90X0FjY2VwdGFibGUsICdDb250ZW50LVR5cGUgJyArIHN0cihmb3JtYXRfdHlwZSkgKyAnIG5vdCBzdXBwb3J0ZWQuJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjaWYgY2xpZW50X2RhdGEgPT0gTm9uZToKKyAgICAgICAgIyAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgIkNvbnRlbnQgZXJyb3IsIGVtcHR5IikKKyAgICAgICAgIyAgICByZXR1cm4KKyAgICAgICAgI2NoZWNrIG5lZWRlZF9pdGVtcworCisgICAgICAgICNwcmludCAiSFRUUCBpbnB1dCBkYXRhOiAiLCBzdHIoY2xpZW50X2RhdGEpCisgICAgICAgIGVycm9yX3RleHQgPSAiSW52YWxpZCBjb250ZW50ICIKKyAgICAgICAganNfdihjbGllbnRfZGF0YSwgc2NoZW1hKQorCisgICAgICAgIHJldHVybiBjbGllbnRfZGF0YQorICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgeWFtbC5ZQU1MRXJyb3IpIGFzIGV4YzoKKyAgICAgICAgZXJyb3JfdGV4dCArPSBzdHIoZXhjKQorICAgICAgICBwcmludCBlcnJvcl90ZXh0IAorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgZXJyb3JfdGV4dCkKKyAgICBleGNlcHQganNfZS5WYWxpZGF0aW9uRXJyb3IgYXMgZXhjOgorICAgICAgICBwcmludCAiSFRUUCB2YWxpZGF0ZV9pbiBlcnJvciwganNvbnNjaGVtYSBleGNlcHRpb24gIiwgZXhjLm1lc3NhZ2UsICJhdCIsIGV4Yy5wYXRoCisgICAgICAgIHByaW50ICIgIENPTlRFTlQ6ICIgKyBzdHIoYm90dGxlLnJlcXVlc3QuYm9keS5yZWFkbGluZXMoKSkKKyAgICAgICAgZXJyb3JfcG9zID0gIiIKKyAgICAgICAgaWYgbGVuKGV4Yy5wYXRoKT4wOiBlcnJvcl9wb3M9IiBhdCAnIiArICAiOiIuam9pbihtYXAoc3RyLCBleGMucGF0aCkpICsgIiciCisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCBlcnJvcl90ZXh0ICsgZXJyb3JfcG9zKyI6ICIrZXhjLm1lc3NhZ2UpCisgICAgI2V4Y2VwdDoKKyAgICAjICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCAiQ29udGVudCBlcnJvcjogRmFpbGVkIHRvIHBhcnNlIENvbnRlbnQtVHlwZSIsICBlcnJvcl9wb3MpCisgICAgIyAgICByYWlzZQorCitkZWYgZmlsdGVyX3F1ZXJ5X3N0cmluZyhxcywgaHR0cDJkYiwgYWxsb3dlZCk6CisgICAgJycnUHJvY2VzcyBxdWVyeSBzdHJpbmcgKHFzKSBjaGVja2luZyB0aGF0IGNvbnRhaW5zIG9ubHkgdmFsaWQgdG9rZW5zIGZvciBhdm9pZGluZyBTUUwgaW5qZWN0aW9uCisgICAgQXR0cmlidXRlczoKKyAgICAgICAgJ3FzJzogYm90dGxlLkZvcm1zRGljdCB2YXJpYWJsZSB0byBiZSBwcm9jZXNzZWQuIE5vbmUgb3IgZW1wdHkgaXMgY29uc2lkZXJlZCB2YWxpZAorICAgICAgICAnYWxsb3dlZCc6IGxpc3Qgb2YgYWxsb3dlZCBzdHJpbmcgdG9rZW5zIChBUEkgaHR0cCBuYW1pbmcpLiBBbGwgdGhlIGtleXMgb2YgJ3FzJyBtdXN0IGJlIG9uZSBvZiAnYWxsb3dlZCcKKyAgICAgICAgJ2h0dHAyZGInOiBkaWN0aW9uYXJ5IHdpdGggY2hhbmdlIGZyb20gaHR0cCBBUEkgbmFtaW5nIChkaWN0aW9uYXJ5IGtleSkgdG8gZGF0YWJhc2UgbmFtaW5nKGRpY3Rpb25hcnkgdmFsdWUpCisgICAgUmV0dXJuOiBBIHR1cGxlIHdpdGggdGhlIChzZWxlY3Qsd2hlcmUsbGltaXQpIHRvIGJlIHVzZSBpbiBhIGRhdGFiYXNlIHF1ZXJ5LiBBbGwgb2YgdGhlbiB0cmFuc2Zvcm1lZCB0byB0aGUgZGF0YWJhc2UgbmFtaW5nCisgICAgICAgIHNlbGVjdDogbGlzdCBvZiBpdGVtcyB0byByZXRyaWV2ZSwgZmlsdGVyZWQgYnkgcXVlcnkgc3RyaW5nICdmaWVsZD10b2tlbicuIElmIG5vICdmaWVsZCcgaXMgcHJlc2VudCwgYWxsb3dlZCBsaXN0IGlzIHJldHVybmVkCisgICAgICAgIHdoZXJlOiBkaWN0aW9uYXJ5IHdpdGgga2V5LCB2YWx1ZSwgdGFrZW4gZnJvbSB0aGUgcXVlcnkgc3RyaW5nIHRva2VuPXZhbHVlLiBFbXB0eSBpZiBub3RoaW5nIGlzIHByb3ZpZGVkCisgICAgICAgIGxpbWl0OiBsaW1pdCBkaWN0YXRlZCBieSB1c2VyIHdpdGggdGhlIHF1ZXJ5IHN0cmluZyAnbGltaXQnLiAxMDAgYnkgZGVmYXVsdAorICAgIGFib3J0IGlmIG5vdCBwZXJtaXR0ZWQsIHVzaW5nIGJvdHRlbC5hYm9ydAorICAgICcnJworICAgIHdoZXJlPXt9CisgICAgbGltaXQ9MTAwCisgICAgc2VsZWN0PVtdCisgICAgaWYgdHlwZShxcykgaXMgbm90IGJvdHRsZS5Gb3Jtc0RpY3Q6CisgICAgICAgIHByaW50ICchISEhISEhISEhISEhIWludmFsaWQgcXVlcnkgc3RyaW5nIG5vdCBhIGRpY3Rpb25hcnknCisgICAgICAgICNib3R0bGUuYWJvcnQoSFRUUF9JbnRlcm5hbF9TZXJ2ZXJfRXJyb3IsICJjYWxsIHByb2dyYW1tZXIiKQorICAgIGVsc2U6CisgICAgICAgIGZvciBrIGluIHFzOgorICAgICAgICAgICAgaWYgaz09J2ZpZWxkJzoKKyAgICAgICAgICAgICAgICBzZWxlY3QgKz0gcXMuZ2V0YWxsKGspCisgICAgICAgICAgICAgICAgZm9yIHYgaW4gc2VsZWN0OgorICAgICAgICAgICAgICAgICAgICBpZiB2IG5vdCBpbiBhbGxvd2VkOgorICAgICAgICAgICAgICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsICJJbnZhbGlkIHF1ZXJ5IHN0cmluZyBhdCAnZmllbGQ9Iit2KyInIikKKyAgICAgICAgICAgIGVsaWYgaz09J2xpbWl0JzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGxpbWl0PWludChxc1trXSkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCAiSW52YWxpZCBxdWVyeSBzdHJpbmcgYXQgJ2xpbWl0PSIrcXNba10rIiciKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBrIG5vdCBpbiBhbGxvd2VkOgorICAgICAgICAgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgIkludmFsaWQgcXVlcnkgc3RyaW5nIGF0ICciK2srIj0iK3FzW2tdKyInIikKKyAgICAgICAgICAgICAgICBpZiBxc1trXSE9Im51bGwiOiAgd2hlcmVba109cXNba10KKyAgICAgICAgICAgICAgICBlbHNlOiB3aGVyZVtrXT1Ob25lIAorICAgIGlmIGxlbihzZWxlY3QpPT0wOiBzZWxlY3QgKz0gYWxsb3dlZAorICAgICNjaGFuZ2UgZnJvbSBodHRwIGFwaSB0byBkYXRhYmFzZSBuYW1pbmcKKyAgICBmb3IgaSBpbiByYW5nZSgwLGxlbihzZWxlY3QpKToKKyAgICAgICAgaz1zZWxlY3RbaV0KKyAgICAgICAgaWYgayBpbiBodHRwMmRiOiAKKyAgICAgICAgICAgIHNlbGVjdFtpXSA9IGh0dHAyZGJba10KKyAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKHdoZXJlLCBodHRwMmRiKQorICAgICNwcmludCAiZmlsdGVyX3F1ZXJ5X3N0cmluZyIsIHNlbGVjdCx3aGVyZSxsaW1pdAorICAgIAorICAgIHJldHVybiBzZWxlY3Qsd2hlcmUsbGltaXQKKworCitkZWYgY29udmVydF9iYW5kd2lkdGgoZGF0YSwgcmV2ZXJzZT1GYWxzZSk6CisgICAgJycnQ2hlY2sgdGhlIGZpZWxkIGJhbmR3aWR0aCByZWN1cnNpdmVseSBhbmQgd2hlbiBmb3VuZCwgaXQgcmVtb3ZlcyB1bml0cyBhbmQgY29udmVydCB0byBudW1iZXIgCisgICAgSXQgYXNzdW1lcyB0aGF0IGJhbmR3aWR0aCBpcyB3ZWxsIGZvcm1lZAorICAgIEF0dHJpYnV0ZXM6CisgICAgICAgICdkYXRhJzogZGljdGlvbmFyeSBib3R0bGUuRm9ybXNEaWN0IHZhcmlhYmxlIHRvIGJlIGNoZWNrZWQuIE5vbmUgb3IgZW1wdHkgaXMgY29uc2lkZXJlZCB2YWxpZAorICAgICAgICAncmV2ZXJzZSc6IGJ5IGRlZmF1bHQgY29udmVydCBmb3JtIHN0ciB0byBpbnQgKE1icHMpLCBpZiBUcnVlIGl0IGNvbnZlcnQgZnJvbSBudW1iZXIgdG8gdW5pdHMKKyAgICBSZXR1cm46CisgICAgICAgIE5vbmUKKyAgICAnJycKKyAgICBpZiB0eXBlKGRhdGEpIGlzIGRpY3Q6CisgICAgICAgIGZvciBrIGluIGRhdGEua2V5cygpOgorICAgICAgICAgICAgaWYgdHlwZShkYXRhW2tdKSBpcyBkaWN0IG9yIHR5cGUoZGF0YVtrXSkgaXMgdHVwbGUgb3IgdHlwZShkYXRhW2tdKSBpcyBsaXN0OgorICAgICAgICAgICAgICAgIGNvbnZlcnRfYmFuZHdpZHRoKGRhdGFba10sIHJldmVyc2UpCisgICAgICAgIGlmICJiYW5kd2lkdGgiIGluIGRhdGE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWU9c3RyKGRhdGFbImJhbmR3aWR0aCJdKQorICAgICAgICAgICAgICAgIGlmIG5vdCByZXZlcnNlOgorICAgICAgICAgICAgICAgICAgICBwb3MgPSB2YWx1ZS5maW5kKCJicHMiKQorICAgICAgICAgICAgICAgICAgICBpZiBwb3M+MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlW3Bvcy0xXT09IkciOiBkYXRhWyJiYW5kd2lkdGgiXSA9ICBpbnQoZGF0YVsiYmFuZHdpZHRoIl1bOnBvcy0xXSkgKiAxMDAwCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlW3Bvcy0xXT09ImsiOiBkYXRhWyJiYW5kd2lkdGgiXT0gaW50KGRhdGFbImJhbmR3aWR0aCJdWzpwb3MtMV0pIC8gMTAwMAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogZGF0YVsiYmFuZHdpZHRoIl09IGludChkYXRhWyJiYW5kd2lkdGgiXVs6cG9zLTFdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaW50KGRhdGFbImJhbmR3aWR0aCJdKQorICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSAlIDEwMDAgPT0gMDogZGF0YVsiYmFuZHdpZHRoIl09c3RyKHZhbHVlLzEwMDApICsgIiBHYnBzIgorICAgICAgICAgICAgICAgICAgICBlbHNlOiBkYXRhWyJiYW5kd2lkdGgiXT1zdHIodmFsdWUpICsgIiBNYnBzIgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHByaW50ICJjb252ZXJ0X2JhbmR3aWR0aCBleGNlcHRpb24gZm9yIHR5cGUiLCB0eXBlKGRhdGFbImJhbmR3aWR0aCJdKSwgIiBkYXRhIiwgZGF0YVsiYmFuZHdpZHRoIl0KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICBpZiB0eXBlKGRhdGEpIGlzIHR1cGxlIG9yIHR5cGUoZGF0YSkgaXMgbGlzdDoKKyAgICAgICAgZm9yIGsgaW4gZGF0YToKKyAgICAgICAgICAgIGlmIHR5cGUoaykgaXMgZGljdCBvciB0eXBlKGspIGlzIHR1cGxlIG9yIHR5cGUoaykgaXMgbGlzdDoKKyAgICAgICAgICAgICAgICBjb252ZXJ0X2JhbmR3aWR0aChrLCByZXZlcnNlKQorCitkZWYgY29udmVydF9ib29sZWFuKGRhdGEsIGl0ZW1zKToKKyAgICAnJydDaGVjayByZWN1cnNpdmVseSB0aGUgY29udGVudCBvZiBkYXRhLCBhbmQgaWYgdGhlcmUgaXMgYW4ga2V5IGNvbnRhaW5lZCBpbiBpdGVtcywgY29udmVydCB2YWx1ZSBmcm9tIHN0cmluZyB0byBib29sZWFuIAorICAgIEl0IGFzc3VtZXMgdGhhdCBiYW5kd2lkdGggaXMgd2VsbCBmb3JtZWQKKyAgICBBdHRyaWJ1dGVzOgorICAgICAgICAnZGF0YSc6IGRpY3Rpb25hcnkgYm90dGxlLkZvcm1zRGljdCB2YXJpYWJsZSB0byBiZSBjaGVja2VkLiBOb25lIG9yIGVtcHR5IGlzIGNvbnNpZGV0ZWQgdmFsaWQKKyAgICAgICAgJ2l0ZW1zJzogdHVwbGUgb2Yga2V5cyB0byBjb252ZXJ0CisgICAgUmV0dXJuOgorICAgICAgICBOb25lCisgICAgJycnCisgICAgaWYgdHlwZShkYXRhKSBpcyBkaWN0OgorICAgICAgICBmb3IgayBpbiBkYXRhLmtleXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUoZGF0YVtrXSkgaXMgZGljdCBvciB0eXBlKGRhdGFba10pIGlzIHR1cGxlIG9yIHR5cGUoZGF0YVtrXSkgaXMgbGlzdDoKKyAgICAgICAgICAgICAgICBjb252ZXJ0X2Jvb2xlYW4oZGF0YVtrXSwgaXRlbXMpCisgICAgICAgICAgICBpZiBrIGluIGl0ZW1zOgorICAgICAgICAgICAgICAgIGlmIHR5cGUoZGF0YVtrXSkgaXMgc3RyOgorICAgICAgICAgICAgICAgICAgICBpZiAgIGRhdGFba109PSJmYWxzZSI6IGRhdGFba109RmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBkYXRhW2tdPT0idHJ1ZSI6ICBkYXRhW2tdPVRydWUKKyAgICBpZiB0eXBlKGRhdGEpIGlzIHR1cGxlIG9yIHR5cGUoZGF0YSkgaXMgbGlzdDoKKyAgICAgICAgZm9yIGsgaW4gZGF0YToKKyAgICAgICAgICAgIGlmIHR5cGUoaykgaXMgZGljdCBvciB0eXBlKGspIGlzIHR1cGxlIG9yIHR5cGUoaykgaXMgbGlzdDoKKyAgICAgICAgICAgICAgICBjb252ZXJ0X2Jvb2xlYW4oaywgaXRlbXMpCisKK2RlZiBjb252ZXJ0X2RhdGV0aW1lMnN0cih2YXIpOgorICAgICcnJ0NvbnZlcnRzIGEgZGF0ZXRpbWUgdmFyaWFibGUgdG8gYSBzdHJpbmcgd2l0aCB0aGUgZm9ybWF0ICclWS0lbS0lZFQlSDolaTolcycKKyAgICBJdCBlbnRlcnMgcmVjdXJzaXZlbHkgaW4gdGhlIGRpY3QgdmFyIGZpbmRpbmcgdGhpcyBraW5kIG9mIHZhcmlhYmxlcworICAgICcnJworICAgIGlmIHR5cGUodmFyKSBpcyBkaWN0OgorICAgICAgICBmb3Igayx2IGluIHZhci5pdGVtcygpOgorICAgICAgICAgICAgaWYgdHlwZSh2KSBpcyBkYXRldGltZS5kYXRldGltZToKKyAgICAgICAgICAgICAgICB2YXJba109IHYuc3RyZnRpbWUoJyVZLSVtLSVkVCVIOiVNOiVTJykKKyAgICAgICAgICAgIGVsaWYgdHlwZSh2KSBpcyBkaWN0IG9yIHR5cGUodikgaXMgbGlzdCBvciB0eXBlKHYpIGlzIHR1cGxlOiAKKyAgICAgICAgICAgICAgICBjb252ZXJ0X2RhdGV0aW1lMnN0cih2KQorICAgICAgICBpZiBsZW4odmFyKSA9PSAwOiByZXR1cm4gVHJ1ZQorICAgIGVsaWYgdHlwZSh2YXIpIGlzIGxpc3Qgb3IgdHlwZSh2YXIpIGlzIHR1cGxlOgorICAgICAgICBmb3IgdiBpbiB2YXI6CisgICAgICAgICAgICBjb252ZXJ0X2RhdGV0aW1lMnN0cih2KQorCitkZWYgY2hlY2tfdmFsaWRfdGVuYW50KG15LCB0ZW5hbnRfaWQpOgorICAgIGlmIHRlbmFudF9pZD09J2FueSc6CisgICAgICAgIGlmIG5vdCBteS5hZG1pbjoKKyAgICAgICAgICAgIHJldHVybiBIVFRQX1VuYXV0aG9yaXplZCwgIk5lZWRlZCBhZG1pbiBwcml2aWxlZ2VzIgorICAgIGVsc2U6CisgICAgICAgIHJlc3VsdCwgXyA9IG15LmRiLmdldF90YWJsZShGUk9NPSd0ZW5hbnRzJywgU0VMRUNUPSgndXVpZCcsKSwgV0hFUkU9eyd1dWlkJzogdGVuYW50X2lkfSkKKyAgICAgICAgaWYgcmVzdWx0PD0wOgorICAgICAgICAgICAgcmV0dXJuIEhUVFBfTm90X0ZvdW5kLCAidGVuYW50ICclcycgbm90IGZvdW5kIiAlIHRlbmFudF9pZAorICAgIHJldHVybiAwLCBOb25lCisKK2RlZiBjaGVja192YWxpZF91dWlkKHV1aWQpOgorICAgIGlkX3NjaGVtYSA9IHsidHlwZSIgOiAic3RyaW5nIiwgInBhdHRlcm4iOiAiXlthLWZBLUYwLTldezh9KC1bYS1mQS1GMC05XXs0fSl7M30tW2EtZkEtRjAtOV17MTJ9JCJ9CisgICAgdHJ5OgorICAgICAgICBqc192KHV1aWQsIGlkX3NjaGVtYSkKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBleGNlcHQganNfZS5WYWxpZGF0aW9uRXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorCitAYm90dGxlLmVycm9yKDQwMCkKK0Bib3R0bGUuZXJyb3IoNDAxKSAKK0Bib3R0bGUuZXJyb3IoNDA0KSAKK0Bib3R0bGUuZXJyb3IoNDAzKQorQGJvdHRsZS5lcnJvcig0MDUpIAorQGJvdHRsZS5lcnJvcig0MDYpCitAYm90dGxlLmVycm9yKDQwOCkKK0Bib3R0bGUuZXJyb3IoNDA5KQorQGJvdHRsZS5lcnJvcig1MDMpIAorQGJvdHRsZS5lcnJvcig1MDApCitkZWYgZXJyb3I0MDAoZXJyb3IpOgorICAgIGU9eyJlcnJvciI6eyJjb2RlIjplcnJvci5zdGF0dXNfY29kZSwgInR5cGUiOmVycm9yLnN0YXR1cywgImRlc2NyaXB0aW9uIjplcnJvci5ib2R5fX0KKyAgICByZXR1cm4gZm9ybWF0X291dChlKQorCitAYm90dGxlLmhvb2soJ2FmdGVyX3JlcXVlc3QnKQorZGVmIGVuYWJsZV9jb3JzKCk6CisgICAgI1RPRE86IEFsZjogSXMgaXQgbmVlZGVkPz8KKyAgICBib3R0bGUucmVzcG9uc2UuaGVhZGVyc1snQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJ10gPSAnKicKKworIworIyBIT1NUUworIworCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy9ob3N0cycsIG1ldGhvZD0nR0VUJykKK2RlZiBodHRwX2dldF9ob3N0cygpOgorICAgIHNlbGVjdF8sd2hlcmVfLGxpbWl0XyA9IGZpbHRlcl9xdWVyeV9zdHJpbmcoYm90dGxlLnJlcXVlc3QucXVlcnksIGh0dHAyZGJfaG9zdCwKKyAgICAgICAgICAgICgnaWQnLCduYW1lJywnZGVzY3JpcHRpb24nLCdzdGF0dXMnLCdhZG1pbl9zdGF0ZV91cCcpICkKKyAgICAKKyAgICBteXNlbGYgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgcmVzdWx0LCBjb250ZW50ID0gbXlzZWxmLmRiLmdldF90YWJsZShGUk9NPSdob3N0cycsIFNFTEVDVD1zZWxlY3RfLCBXSEVSRT13aGVyZV8sIExJTUlUPWxpbWl0XykKKyAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICBwcmludCAiaHR0cF9nZXRfaG9zdHMgRXJyb3IiLCBjb250ZW50CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgIGVsc2U6CisgICAgICAgIGNvbnZlcnRfYm9vbGVhbihjb250ZW50LCAoJ2FkbWluX3N0YXRlX3VwJywpICkKKyAgICAgICAgY2hhbmdlX2tleXNfaHR0cDJkYihjb250ZW50LCBodHRwMmRiX2hvc3QsIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgZm9yIHJvdyBpbiBjb250ZW50OgorICAgICAgICAgICAgcm93WydsaW5rcyddID0gKCB7J2hyZWYnOiBteXNlbGYudXJsX3ByZWZmaXggKyAnL2hvc3RzLycgKyBzdHIocm93WydpZCddKSwgJ3JlbCc6ICdib29rbWFyayd9LCApCisgICAgICAgIGRhdGE9eydob3N0cycgOiBjb250ZW50fQorICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy9ob3N0cy88aG9zdF9pZD4nLCBtZXRob2Q9J0dFVCcpCitkZWYgaHR0cF9nZXRfaG9zdF9pZChob3N0X2lkKToKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICByZXR1cm4gbXkuZ2V0aG9zdChob3N0X2lkKQorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy9ob3N0cycsIG1ldGhvZD0nUE9TVCcpCitkZWYgaHR0cF9wb3N0X2hvc3RzKCk6CisgICAgJycnaW5zZXJ0IGEgaG9zdCBpbnRvIHRoZSBkYXRhYmFzZS4gQWxsIHJlc291cmNlcyBhcmUgZ290IGFuZCBpbnNlcnRlZCcnJworICAgIG15ID0gY29uZmlnX2RpY1snaHR0cF90aHJlYWRzJ11bIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgXQorICAgICNjaGVjayBwZXJtaXNzaW9ucworICAgIGlmIG5vdCBteS5hZG1pbjoKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfVW5hdXRob3JpemVkLCAiTmVlZGVkIGFkbWluIHByaXZpbGVnZXMiKQorICAgIAorICAgICNwYXJzZSBpbnB1dCBkYXRhCisgICAgaHR0cF9jb250ZW50ID0gZm9ybWF0X2luKCBob3N0X25ld19zY2hlbWEgKQorICAgIHIgPSByZW1vdmVfZXh0cmFfaXRlbXMoaHR0cF9jb250ZW50LCBob3N0X25ld19zY2hlbWEpCisgICAgaWYgciBpcyBub3QgTm9uZTogcHJpbnQgImh0dHBfcG9zdF9ob3N0X2lkOiBXYXJuaW5nOiByZW1vdmUgZXh0cmEgaXRlbXMgIiwgcgorICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoaHR0cF9jb250ZW50Wydob3N0J10sIGh0dHAyZGJfaG9zdCkKKworICAgIGhvc3QgPSBodHRwX2NvbnRlbnRbJ2hvc3QnXQorICAgIHdhcm5pbmdfdGV4dD0iIgorICAgIGlmICdob3N0LWRhdGEnIGluIGh0dHBfY29udGVudDoKKyAgICAgICAgaG9zdC51cGRhdGUoaHR0cF9jb250ZW50Wydob3N0LWRhdGEnXSkKKyAgICAgICAgaXBfbmFtZT1odHRwX2NvbnRlbnRbJ2hvc3QtZGF0YSddWydpcF9uYW1lJ10KKyAgICAgICAgdXNlcj1odHRwX2NvbnRlbnRbJ2hvc3QtZGF0YSddWyd1c2VyJ10KKyAgICAgICAgcGFzc3dvcmQ9aHR0cF9jb250ZW50Wydob3N0LWRhdGEnXS5nZXQoJ3Bhc3N3b3JkJywgTm9uZSkKKyAgICBlbHNlOgorICAgICAgICBpcF9uYW1lPWhvc3RbJ2lwX25hbWUnXQorICAgICAgICB1c2VyPWhvc3RbJ3VzZXInXQorICAgICAgICBwYXNzd29yZD1ob3N0LmdldCgncGFzc3dvcmQnLCBOb25lKQorCisgICAgICAgICNmaWxsIHJhZCBpbmZvCisgICAgICAgIHJhZCA9IFJBRGNsYXNzLlJBRGNsYXNzKCkKKyAgICAgICAgKHJldHVybl9zdGF0dXMsIGNvZGUpID0gcmFkLm9idGFpbl9SQUQodXNlciwgcGFzc3dvcmQsIGlwX25hbWUpCisgICAgICAgIAorICAgICAgICAjcmV0dXJuIAorICAgICAgICBpZiBub3QgcmV0dXJuX3N0YXR1czoKKyAgICAgICAgICAgIHByaW50ICdodHRwX3Bvc3RfaG9zdHMgRVJST1Igb2J0YWluaW5nIFJBRCcsIGNvZGUKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCBjb2RlKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHdhcm5pbmdfdGV4dD1jb2RlCisgICAgICAgIHJhZF9zdHJ1Y3R1cmUgPSB5YW1sLmxvYWQocmFkLnRvX3RleHQoKSkKKyAgICAgICAgcHJpbnQgJ3JhZF9zdHJ1Y3R1cmVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAgICAgICAgcHJpbnQganNvbi5kdW1wcyhyYWRfc3RydWN0dXJlLCBpbmRlbnQ9NCkKKyAgICAgICAgcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAgICAgICAgI3JldHVybgorICAgICAgICBXSEVSRV89eyJmYW1pbHkiOnJhZF9zdHJ1Y3R1cmVbJ3Byb2Nlc3NvciddWydmYW1pbHknXSwgJ21hbnVmYWN0dXJlcic6cmFkX3N0cnVjdHVyZVsncHJvY2Vzc29yJ11bJ21hbnVmYWN0dXJlciddLCAndmVyc2lvbic6cmFkX3N0cnVjdHVyZVsncHJvY2Vzc29yJ11bJ3ZlcnNpb24nXX0gCisgICAgICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF90YWJsZShGUk9NPSdob3N0X3JhbmtpbmcnLCAKKyAgICAgICAgICAgICAgICAgICAgU0VMRUNUPSgncmFua2luZycsKSwKKyAgICAgICAgICAgICAgICAgICAgV0hFUkU9V0hFUkVfKQorICAgICAgICBpZiByZXN1bHQgPiAwOgorICAgICAgICAgICAgaG9zdFsncmFua2luZyddID0gY29udGVudFswXVsncmFua2luZyddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjZXJyb3JfdGV4dD0gIkhvc3QgIiArIHN0cihXSEVSRV8pKyAiIG5vdCBmb3VuZCBpbiByYW5raW5nIHRhYmxlLiBOb3QgdmFsaWQgZm9yIFZJTSBtYW5hZ2VtZW50IgorICAgICAgICAgICAgI2JvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCBlcnJvcl90ZXh0KQorICAgICAgICAgICAgI3JldHVybgorICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9ICJIb3N0ICIgKyBzdHIoV0hFUkVfKSsgIiBub3QgZm91bmQgaW4gcmFua2luZyB0YWJsZS4gQXNzdW1pbmcgbG93ZXN0IHZhbHVlIDEwMFxuIgorICAgICAgICAgICAgaG9zdFsncmFua2luZyddID0gMTAwICNUT0RPOiBhcyBub3QgdXNlZCBpbiB0aGlzIHZlcnNpb24sIHNldCB0aGUgbG93ZXN0IHZhbHVlCisgICAgCisgICAgICAgIGZlYXR1cmVzID0gcmFkX3N0cnVjdHVyZVsncHJvY2Vzc29yJ10uZ2V0KCdmZWF0dXJlcycsICgpKQorICAgICAgICBob3N0WydmZWF0dXJlcyddID0gIiwiLmpvaW4oZmVhdHVyZXMpCisgICAgICAgIGhvc3RbJ251bWFzJ10gPSBbXSAKKyAgICAgICAgCisgICAgICAgIGZvciBub2RlIGluIChyYWRfc3RydWN0dXJlWydyZXNvdXJjZSB0b3BvbG9neSddWydub2RlcyddIG9yIHt9KS5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICBpbnRlcmZhY2VzPSBbXQorICAgICAgICAgICAgY29yZXMgPSBbXQorICAgICAgICAgICAgZWxpZ2libGVfY29yZXM9W10KKyAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgZm9yIGNvcmUgaW4gbm9kZVsnY3B1J11bJ2VsaWdpYmxlX2NvcmVzJ106CisgICAgICAgICAgICAgICAgZWxpZ2libGVfY29yZXMuZXh0ZW5kKGNvcmUpCisgICAgICAgICAgICBmb3IgY29yZSBpbiBub2RlWydjcHUnXVsnY29yZXMnXToKKyAgICAgICAgICAgICAgICBmb3IgdGhyZWFkX2lkIGluIGNvcmU6CisgICAgICAgICAgICAgICAgICAgIGM9eydjb3JlX2lkJzogY291bnQsICd0aHJlYWRfaWQnOiB0aHJlYWRfaWR9CisgICAgICAgICAgICAgICAgICAgIGlmIHRocmVhZF9pZCBub3QgaW4gZWxpZ2libGVfY29yZXM6IGNbJ3N0YXR1cyddID0gJ25vdGVsaWdpYmxlJworICAgICAgICAgICAgICAgICAgICBjb3Jlcy5hcHBlbmQoYykKKyAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50KzEgCisKKyAgICAgICAgICAgIGlmICduaWNzJyBpbiBub2RlOiAgICAKKyAgICAgICAgICAgICAgICBmb3IgcG9ydF9rLCBwb3J0X3YgaW4gbm9kZVsnbmljcyddWyduaWMgMCddWydwb3J0cyddLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBpZiBwb3J0X3ZbJ3ZpcnR1YWwnXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzcmlvdnMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBvcnRfazIsIHBvcnRfdjIgaW4gbm9kZVsnbmljcyddWyduaWMgMCddWydwb3J0cyddLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcnRfdjJbJ3ZpcnR1YWwnXSBhbmQgcG9ydF92MlsnUEZfcGNpX2lkJ109PXBvcnRfazoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Jpb3ZzLmFwcGVuZCh7J3BjaSc6cG9ydF9rMiwgJ21hYyc6cG9ydF92MlsnbWFjJ10sICdzb3VyY2VfbmFtZSc6cG9ydF92Mlsnc291cmNlX25hbWUnXX0pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oc3Jpb3ZzKT4wOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzb3J0IHNyaW92IGFjY29yZGluZyB0byBwY2kgYW5kIHJlbmFtZSB0aGVtIHRvIHRoZSB2ZiBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Jpb3ZzID0gc29ydGVkKHNyaW92cywga2V5PWxhbWJkYSBrOiBrWydwY2knXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD0wIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzcmlvdiBpbiBuZXdfc3Jpb3ZzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmlvdlsnc291cmNlX25hbWUnXSA9IGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFwcGVuZCAgKHsncGNpJzpzdHIocG9ydF9rKSwgJ01icHMnOiBwb3J0X3ZbJ3NwZWVkJ10vMTAwMDAwMCwgJ3NyaW92cyc6IG5ld19zcmlvdnMsICdtYWMnOnBvcnRfdlsnbWFjJ10sICdzb3VyY2VfbmFtZSc6cG9ydF92Wydzb3VyY2VfbmFtZSddfSkKKyAgICAgICAgICAgICNAVE9ETyBMQSBtZW1vcmlhIGRldnVlbHRhIHBvciBlbCBSQUQgZXMgaW5jb3JyZWN0YSwgYWxtZW5vcyBwYXJhIElWWTEsIE5GVjEwMAorICAgICAgICAgICAgbWVtb3J5PW5vZGVbJ21lbW9yeSddWydub2RlX3NpemUnXSAvICgxMDI0KjEwMjQqMTAyNCkKKyAgICAgICAgICAgICNtZW1vcnk9Z2V0X25leHRfMnBvdyhub2RlWydtZW1vcnknXVsnaHVnZXBhZ2VfbnInXSkKKyAgICAgICAgICAgIGhvc3RbJ251bWFzJ10uYXBwZW5kKCB7J251bWFfc29ja2V0Jzogbm9kZVsnaWQnXSwgJ2h1Z2VwYWdlcyc6IG5vZGVbJ21lbW9yeSddWydodWdlcGFnZV9uciddLCAnbWVtb3J5JzptZW1vcnksICdpbnRlcmZhY2VzJzogaW50ZXJmYWNlcywgJ2NvcmVzJzogY29yZXMgfSApCisgICAgcHJpbnQganNvbi5kdW1wcyhob3N0LCBpbmRlbnQ9NCkKKyAgICAjcmV0dXJuCisgICAgIworICAgICNpbnNlcnQgaW4gZGF0YSBiYXNlCisgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIubmV3X2hvc3QoaG9zdCkKKyAgICBpZiByZXN1bHQgPj0gMDoKKyAgICAgICAgaWYgY29udGVudFsnYWRtaW5fc3RhdGVfdXAnXToKKyAgICAgICAgICAgICNjcmVhdGUgdGhyZWFkCisgICAgICAgICAgICBob3N0X3Rlc3RfbW9kZSA9IFRydWUgaWYgY29uZmlnX2RpY1snbW9kZSddPT0ndGVzdCcgb3IgY29uZmlnX2RpY1snbW9kZSddPT0iT0Ygb25seSIgZWxzZSBGYWxzZQorICAgICAgICAgICAgaG9zdF9kZXZlbG9wX21vZGUgPSBUcnVlIGlmIGNvbmZpZ19kaWNbJ21vZGUnXT09J2RldmVsb3BtZW50JyBlbHNlIEZhbHNlCisgICAgICAgICAgICBob3N0X2RldmVsb3BfYnJpZGdlX2lmYWNlID0gY29uZmlnX2RpYy5nZXQoJ2RldmVsb3BtZW50X2JyaWRnZScsIE5vbmUpCisgICAgICAgICAgICB0aHJlYWQgPSBodC5ob3N0X3RocmVhZChuYW1lPWhvc3QuZ2V0KCduYW1lJyxpcF9uYW1lKSwgdXNlcj11c2VyLCBob3N0PWlwX25hbWUsIGRiPWNvbmZpZ19kaWNbJ2RiJ10sIGRiX2xvY2s9Y29uZmlnX2RpY1snZGJfbG9jayddLCAKKyAgICAgICAgICAgICAgICB0ZXN0PWhvc3RfdGVzdF9tb2RlLCBpbWFnZV9wYXRoPWNvbmZpZ19kaWNbJ2ltYWdlX3BhdGgnXSwKKyAgICAgICAgICAgICAgICB2ZXJzaW9uPWNvbmZpZ19kaWNbJ3ZlcnNpb24nXSwgaG9zdF9pZD1jb250ZW50Wyd1dWlkJ10sCisgICAgICAgICAgICAgICAgZGV2ZWxvcF9tb2RlPWhvc3RfZGV2ZWxvcF9tb2RlLCBkZXZlbG9wX2JyaWRnZV9pZmFjZT1ob3N0X2RldmVsb3BfYnJpZGdlX2lmYWNlICAgKQorICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgICAgIGNvbmZpZ19kaWNbJ2hvc3RfdGhyZWFkcyddWyBjb250ZW50Wyd1dWlkJ10gXSA9IHRocmVhZAorCisgICAgICAgICNyZXR1cm4gaG9zdCBkYXRhCisgICAgICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoY29udGVudCwgaHR0cDJkYl9ob3N0LCByZXZlcnNlPVRydWUpCisgICAgICAgIGlmIGxlbih3YXJuaW5nX3RleHQpPjA6CisgICAgICAgICAgICBjb250ZW50WyJ3YXJuaW5nIl09IHdhcm5pbmdfdGV4dAorICAgICAgICBkYXRhPXsnaG9zdCcgOiBjb250ZW50fQorICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorICAgIGVsc2U6CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKworQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvaG9zdHMvPGhvc3RfaWQ+JywgbWV0aG9kPSdQVVQnKQorZGVmIGh0dHBfcHV0X2hvc3RfaWQoaG9zdF9pZCk6CisgICAgJycnbW9kaWZ5IGEgaG9zdCBpbnRvIHRoZSBkYXRhYmFzZS4gQWxsIHJlc291cmNlcyBhcmUgZ290IGFuZCBpbnNlcnRlZCcnJworICAgIG15ID0gY29uZmlnX2RpY1snaHR0cF90aHJlYWRzJ11bIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgXQorICAgICNjaGVjayBwZXJtaXNzaW9ucworICAgIGlmIG5vdCBteS5hZG1pbjoKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfVW5hdXRob3JpemVkLCAiTmVlZGVkIGFkbWluIHByaXZpbGVnZXMiKQorICAgIAorICAgICNwYXJzZSBpbnB1dCBkYXRhCisgICAgaHR0cF9jb250ZW50ID0gZm9ybWF0X2luKCBob3N0X2VkaXRfc2NoZW1hICkKKyAgICByID0gcmVtb3ZlX2V4dHJhX2l0ZW1zKGh0dHBfY29udGVudCwgaG9zdF9lZGl0X3NjaGVtYSkKKyAgICBpZiByIGlzIG5vdCBOb25lOiBwcmludCAiaHR0cF9wb3N0X2hvc3RfaWQ6IFdhcm5pbmc6IHJlbW92ZSBleHRyYSBpdGVtcyAiLCByCisgICAgY2hhbmdlX2tleXNfaHR0cDJkYihodHRwX2NvbnRlbnRbJ2hvc3QnXSwgaHR0cDJkYl9ob3N0KQorCisgICAgI2luc2VydCBpbiBkYXRhIGJhc2UKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5lZGl0X2hvc3QoaG9zdF9pZCwgaHR0cF9jb250ZW50Wydob3N0J10pCisgICAgaWYgcmVzdWx0ID49IDA6CisgICAgICAgIGNvbnZlcnRfYm9vbGVhbihjb250ZW50LCAoJ2FkbWluX3N0YXRlX3VwJywpICkKKyAgICAgICAgY2hhbmdlX2tleXNfaHR0cDJkYihjb250ZW50LCBodHRwMmRiX2hvc3QsIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgZGF0YT17J2hvc3QnIDogY29udGVudH0KKworICAgICAgICAjcmVsb2FkIHRocmVhZAorICAgICAgICBjb25maWdfZGljWydob3N0X3RocmVhZHMnXVtob3N0X2lkXS5uYW1lID0gY29udGVudC5nZXQoJ25hbWUnLGNvbnRlbnRbJ2lwX25hbWUnXSkKKyAgICAgICAgY29uZmlnX2RpY1snaG9zdF90aHJlYWRzJ11baG9zdF9pZF0udXNlciA9IGNvbnRlbnRbJ3VzZXInXQorICAgICAgICBjb25maWdfZGljWydob3N0X3RocmVhZHMnXVtob3N0X2lkXS5ob3N0ID0gY29udGVudFsnaXBfbmFtZSddCisgICAgICAgIGNvbmZpZ19kaWNbJ2hvc3RfdGhyZWFkcyddW2hvc3RfaWRdLmluc2VydF90YXNrKCJyZWxvYWQiKQorCisgICAgICAgICNwcmludCBkYXRhCisgICAgICAgIHJldHVybiBmb3JtYXRfb3V0KGRhdGEpCisgICAgZWxzZToKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsIGNvbnRlbnQpCisgICAgICAgIHJldHVybgorCisKKworQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvaG9zdHMvPGhvc3RfaWQ+JywgbWV0aG9kPSdERUxFVEUnKQorZGVmIGh0dHBfZGVsZXRlX2hvc3RfaWQoaG9zdF9pZCk6CisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI2NoZWNrIHBlcm1pc3Npb25zCisgICAgaWYgbm90IG15LmFkbWluOgorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9VbmF1dGhvcml6ZWQsICJOZWVkZWQgYWRtaW4gcHJpdmlsZWdlcyIpCisgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZGVsZXRlX3JvdygnaG9zdHMnLCBob3N0X2lkKQorICAgIGlmIHJlc3VsdCA9PSAwOgorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsIGNvbnRlbnQpCisgICAgZWxpZiByZXN1bHQgPjA6CisgICAgICAgICN0ZXJtaW5hdGUgdGhyZWFkCisgICAgICAgIGlmIGhvc3RfaWQgaW4gY29uZmlnX2RpY1snaG9zdF90aHJlYWRzJ106CisgICAgICAgICAgICBjb25maWdfZGljWydob3N0X3RocmVhZHMnXVtob3N0X2lkXS5pbnNlcnRfdGFzaygiZXhpdCIpCisgICAgICAgICNyZXR1cm4gZGF0YQorICAgICAgICBkYXRhPXsncmVzdWx0JyA6IGNvbnRlbnR9CisgICAgICAgIHJldHVybiBmb3JtYXRfb3V0KGRhdGEpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgImh0dHBfZGVsZXRlX2hvc3RfaWQgZXJyb3IiLHJlc3VsdCwgY29udGVudAorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisKKworCisjCisjIFRFTkFOVFMKKyMKKworQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvdGVuYW50cycsIG1ldGhvZD0nR0VUJykKK2RlZiBodHRwX2dldF90ZW5hbnRzKCk6CisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgc2VsZWN0Xyx3aGVyZV8sbGltaXRfID0gZmlsdGVyX3F1ZXJ5X3N0cmluZyhib3R0bGUucmVxdWVzdC5xdWVyeSwgaHR0cDJkYl90ZW5hbnQsCisgICAgICAgICAgICAoJ2lkJywnbmFtZScsJ2Rlc2NyaXB0aW9uJywnZW5hYmxlZCcpICkKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoRlJPTT0ndGVuYW50cycsIFNFTEVDVD1zZWxlY3RfLFdIRVJFPXdoZXJlXyxMSU1JVD1saW1pdF8pCisgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgcHJpbnQgImh0dHBfZ2V0X3RlbmFudHMgRXJyb3IiLCBjb250ZW50CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgIGVsc2U6CisgICAgICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoY29udGVudCwgaHR0cDJkYl90ZW5hbnQsIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgY29udmVydF9ib29sZWFuKGNvbnRlbnQsICgnZW5hYmxlZCcsKSkKKyAgICAgICAgZGF0YT17J3RlbmFudHMnIDogY29udGVudH0KKyAgICAgICAgI2RhdGFbJ3RlbmFudHNfbGlua3MnXSA9IGRpY3QoWygndGVuYW50Jywgcm93WydpZCddKSBmb3Igcm93IGluIGNvbnRlbnRdKQorICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy90ZW5hbnRzLzx0ZW5hbnRfaWQ+JywgbWV0aG9kPSdHRVQnKQorZGVmIGh0dHBfZ2V0X3RlbmFudF9pZCh0ZW5hbnRfaWQpOgorICAgIG15ID0gY29uZmlnX2RpY1snaHR0cF90aHJlYWRzJ11bIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgXQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF90YWJsZShGUk9NPSd0ZW5hbnRzJywgU0VMRUNUPSgndXVpZCcsJ25hbWUnLCdkZXNjcmlwdGlvbicsICdlbmFibGVkJyksV0hFUkU9eyd1dWlkJzogdGVuYW50X2lkfSApCisgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgcHJpbnQgImh0dHBfZ2V0X3RlbmFudF9pZCBlcnJvciAlZCAlcyIgJSAocmVzdWx0LCBjb250ZW50KQorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICBlbGlmIHJlc3VsdD09MDoKKyAgICAgICAgcHJpbnQgImh0dHBfZ2V0X3RlbmFudF9pZCB0ZW5hbnQgJyVzJyBub3QgZm91bmQiICUgdGVuYW50X2lkCisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgInRlbmFudCAlcyBub3QgZm91bmQiICUgdGVuYW50X2lkKQorICAgIGVsc2U6CisgICAgICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoY29udGVudCwgaHR0cDJkYl90ZW5hbnQsIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgY29udmVydF9ib29sZWFuKGNvbnRlbnQsICgnZW5hYmxlZCcsKSkKKyAgICAgICAgZGF0YT17J3RlbmFudCcgOiBjb250ZW50WzBdfQorICAgICAgICAjZGF0YVsndGVuYW50c19saW5rcyddID0gZGljdChbKCd0ZW5hbnQnLCByb3dbJ2lkJ10pIGZvciByb3cgaW4gY29udGVudF0pCisgICAgICAgIHJldHVybiBmb3JtYXRfb3V0KGRhdGEpCisKKworQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvdGVuYW50cycsIG1ldGhvZD0nUE9TVCcpCitkZWYgaHR0cF9wb3N0X3RlbmFudHMoKToKKyAgICAnJydpbnNlcnQgYSB0ZW5hbnQgaW50byB0aGUgZGF0YWJhc2UuJycnCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI3BhcnNlIGlucHV0IGRhdGEKKyAgICBodHRwX2NvbnRlbnQgPSBmb3JtYXRfaW4oIHRlbmFudF9uZXdfc2NoZW1hICkKKyAgICByID0gcmVtb3ZlX2V4dHJhX2l0ZW1zKGh0dHBfY29udGVudCwgdGVuYW50X25ld19zY2hlbWEpCisgICAgaWYgciBpcyBub3QgTm9uZTogcHJpbnQgImh0dHBfcG9zdF90ZW5hbnRzOiBXYXJuaW5nOiByZW1vdmUgZXh0cmEgaXRlbXMgIiwgcgorICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoaHR0cF9jb250ZW50Wyd0ZW5hbnQnXSwgaHR0cDJkYl90ZW5hbnQpCisKKyAgICAjaW5zZXJ0IGluIGRhdGEgYmFzZQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLm5ld190ZW5hbnQoaHR0cF9jb250ZW50Wyd0ZW5hbnQnXSkKKyAgICAgICAgICAgIAorICAgIGlmIHJlc3VsdCA+PSAwOgorICAgICAgICByZXR1cm4gaHR0cF9nZXRfdGVuYW50X2lkKGNvbnRlbnQpCisgICAgZWxzZToKKyAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIHJldHVybgorICAgIAorQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvdGVuYW50cy88dGVuYW50X2lkPicsIG1ldGhvZD0nUFVUJykKK2RlZiBodHRwX3B1dF90ZW5hbnRfaWQodGVuYW50X2lkKToKKyAgICAnJyd1cGRhdGUgYSB0ZW5hbnQgaW50byB0aGUgZGF0YWJhc2UuJycnCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI3BhcnNlIGlucHV0IGRhdGEKKyAgICBodHRwX2NvbnRlbnQgPSBmb3JtYXRfaW4oIHRlbmFudF9lZGl0X3NjaGVtYSApCisgICAgciA9IHJlbW92ZV9leHRyYV9pdGVtcyhodHRwX2NvbnRlbnQsIHRlbmFudF9lZGl0X3NjaGVtYSkKKyAgICBpZiByIGlzIG5vdCBOb25lOiBwcmludCAiaHR0cF9wdXRfdGVuYW50X2lkOiBXYXJuaW5nOiByZW1vdmUgZXh0cmEgaXRlbXMgIiwgcgorICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoaHR0cF9jb250ZW50Wyd0ZW5hbnQnXSwgaHR0cDJkYl90ZW5hbnQpCisKKyAgICAjaW5zZXJ0IGluIGRhdGEgYmFzZQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLnVwZGF0ZV9yb3dzKCd0ZW5hbnRzJywgaHR0cF9jb250ZW50Wyd0ZW5hbnQnXSwgV0hFUkU9eyd1dWlkJzogdGVuYW50X2lkfSwgbG9nPVRydWUgKQorICAgIGlmIHJlc3VsdCA+PSAwOgorICAgICAgICByZXR1cm4gaHR0cF9nZXRfdGVuYW50X2lkKHRlbmFudF9pZCkKKyAgICBlbHNlOgorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnL3RlbmFudHMvPHRlbmFudF9pZD4nLCBtZXRob2Q9J0RFTEVURScpCitkZWYgaHR0cF9kZWxldGVfdGVuYW50X2lkKHRlbmFudF9pZCk6CisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI2NoZWNrIHBlcm1pc3Npb25zCisgICAgciwgdGVuYW50c19mbGF2b3JzID0gbXkuZGIuZ2V0X3RhYmxlKEZST009J3RlbmFudHNfZmxhdm9ycycsIFNFTEVDVD0oJ2ZsYXZvcl9pZCcsJ3RlbmFudF9pZCcpLCBXSEVSRT17J3RlbmFudF9pZCc6IHRlbmFudF9pZH0pCisgICAgaWYgcjw9MDoKKyAgICAgICAgdGVuYW50c19mbGF2b3JzPSgpCisgICAgciwgdGVuYW50c19pbWFnZXMgID0gbXkuZGIuZ2V0X3RhYmxlKEZST009J3RlbmFudHNfaW1hZ2VzJywgIFNFTEVDVD0oJ2ltYWdlX2lkJywndGVuYW50X2lkJyksICBXSEVSRT17J3RlbmFudF9pZCc6IHRlbmFudF9pZH0pCisgICAgaWYgcjw9MDoKKyAgICAgICAgdGVuYW50c19pbWFnZXM9KCkKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5kZWxldGVfcm93KCd0ZW5hbnRzJywgdGVuYW50X2lkKQorICAgIGlmIHJlc3VsdCA9PSAwOgorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsIGNvbnRlbnQpCisgICAgZWxpZiByZXN1bHQgPjA6CisgICAgICAgIHByaW50ICJhbGYiLCB0ZW5hbnRzX2ZsYXZvcnMsIHRlbmFudHNfaW1hZ2VzCisgICAgICAgIGZvciBmbGF2b3IgaW4gdGVuYW50c19mbGF2b3JzOgorICAgICAgICAgICAgbXkuZGIuZGVsZXRlX3Jvd19ieV9rZXkoImZsYXZvcnMiLCAidXVpZCIsICBmbGF2b3JbJ2ZsYXZvcl9pZCddKQorICAgICAgICBmb3IgaW1hZ2UgaW4gdGVuYW50c19pbWFnZXM6CisgICAgICAgICAgICBteS5kYi5kZWxldGVfcm93X2J5X2tleSgiaW1hZ2VzIiwgInV1aWQiLCAgIGltYWdlWydpbWFnZV9pZCddKQorICAgICAgICBkYXRhPXsncmVzdWx0JyA6IGNvbnRlbnR9CisgICAgICAgIHJldHVybiBmb3JtYXRfb3V0KGRhdGEpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgImh0dHBfZGVsZXRlX3RlbmFudF9pZCBlcnJvciIscmVzdWx0LCBjb250ZW50CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKworIworIyBGTEFWT1JTCisjCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnLzx0ZW5hbnRfaWQ+L2ZsYXZvcnMnLCBtZXRob2Q9J0dFVCcpCitkZWYgaHR0cF9nZXRfZmxhdm9ycyh0ZW5hbnRfaWQpOgorICAgIG15ID0gY29uZmlnX2RpY1snaHR0cF90aHJlYWRzJ11bIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgXQorICAgICNjaGVjayB2YWxpZCB0ZW5hbnRfaWQKKyAgICByZXN1bHQsY29udGVudCA9IGNoZWNrX3ZhbGlkX3RlbmFudChteSwgdGVuYW50X2lkKQorICAgIGlmIHJlc3VsdCAhPSAwOgorICAgICAgICBib3R0bGUuYWJvcnQocmVzdWx0LCBjb250ZW50KQorICAgICNvYnRhaW4gZGF0YQorICAgIHNlbGVjdF8sd2hlcmVfLGxpbWl0XyA9IGZpbHRlcl9xdWVyeV9zdHJpbmcoYm90dGxlLnJlcXVlc3QucXVlcnksIGh0dHAyZGJfZmxhdm9yLAorICAgICAgICAgICAgKCdpZCcsJ25hbWUnLCdkZXNjcmlwdGlvbicsJ3B1YmxpYycpICkKKyAgICBpZiB0ZW5hbnRfaWQ9PSdhbnknOgorICAgICAgICBmcm9tXyAgPSdmbGF2b3JzJworICAgIGVsc2U6CisgICAgICAgIGZyb21fICA9J3RlbmFudHNfZmxhdm9ycyBpbm5lciBqb2luIGZsYXZvcnMgb24gdGVuYW50c19mbGF2b3JzLmZsYXZvcl9pZD1mbGF2b3JzLnV1aWQnCisgICAgICAgIHdoZXJlX1sndGVuYW50X2lkJ10gPSB0ZW5hbnRfaWQKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoRlJPTT1mcm9tXywgU0VMRUNUPXNlbGVjdF8sIFdIRVJFPXdoZXJlXywgTElNSVQ9bGltaXRfKQorICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgIHByaW50ICJodHRwX2dldF9mbGF2b3JzIEVycm9yIiwgY29udGVudAorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICBlbHNlOgorICAgICAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGNvbnRlbnQsIGh0dHAyZGJfZmxhdm9yLCByZXZlcnNlPVRydWUpCisgICAgICAgIGZvciByb3cgaW4gY29udGVudDoKKyAgICAgICAgICAgIHJvd1snbGlua3MnXT1bIHsnaHJlZic6ICIvIi5qb2luKCAobXkudXJsX3ByZWZmaXgsIHRlbmFudF9pZCwgJ2ZsYXZvcnMnLCBzdHIocm93WydpZCddKSApICksICdyZWwnOidib29rbWFyaycgfSBdCisgICAgICAgIGRhdGE9eydmbGF2b3JzJyA6IGNvbnRlbnR9CisgICAgICAgIHJldHVybiBmb3JtYXRfb3V0KGRhdGEpCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnLzx0ZW5hbnRfaWQ+L2ZsYXZvcnMvPGZsYXZvcl9pZD4nLCBtZXRob2Q9J0dFVCcpCitkZWYgaHR0cF9nZXRfZmxhdm9yX2lkKHRlbmFudF9pZCwgZmxhdm9yX2lkKToKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjY2hlY2sgdmFsaWQgdGVuYW50X2lkCisgICAgcmVzdWx0LGNvbnRlbnQgPSBjaGVja192YWxpZF90ZW5hbnQobXksIHRlbmFudF9pZCkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KHJlc3VsdCwgY29udGVudCkKKyAgICAjb2J0YWluIGRhdGEKKyAgICBzZWxlY3RfLHdoZXJlXyxsaW1pdF8gPSBmaWx0ZXJfcXVlcnlfc3RyaW5nKGJvdHRsZS5yZXF1ZXN0LnF1ZXJ5LCBodHRwMmRiX2ZsYXZvciwKKyAgICAgICAgICAgICgnaWQnLCduYW1lJywnZGVzY3JpcHRpb24nLCdyYW0nLCAndmNwdXMnLCAnZXh0ZW5kZWQnLCAnZGlzaycsICdwdWJsaWMnKSApCisgICAgaWYgdGVuYW50X2lkPT0nYW55JzoKKyAgICAgICAgZnJvbV8gID0nZmxhdm9ycycKKyAgICBlbHNlOgorICAgICAgICBmcm9tXyAgPSd0ZW5hbnRzX2ZsYXZvcnMgYXMgdGYgaW5uZXIgam9pbiBmbGF2b3JzIGFzIGYgb24gdGYuZmxhdm9yX2lkPWYudXVpZCcKKyAgICAgICAgd2hlcmVfWyd0ZW5hbnRfaWQnXSA9IHRlbmFudF9pZAorICAgIHdoZXJlX1sndXVpZCddID0gZmxhdm9yX2lkCisgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZ2V0X3RhYmxlKFNFTEVDVD1zZWxlY3RfLCBGUk9NPWZyb21fLCBXSEVSRT13aGVyZV8sIExJTUlUPWxpbWl0XykKKworICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgIHByaW50ICJodHRwX2dldF9mbGF2b3JfaWQgZXJyb3IgJWQgJXMiICUgKHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgZWxpZiByZXN1bHQ9PTA6CisgICAgICAgIHByaW50ICJodHRwX2dldF9mbGF2b3JzX2lkIGZsYXZvciAnJXMnIG5vdCBmb3VuZCIgJSBzdHIoZmxhdm9yX2lkKQorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsICdmbGF2b3IgJXMgbm90IGZvdW5kJyAlIGZsYXZvcl9pZCkKKyAgICBlbHNlOgorICAgICAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGNvbnRlbnQsIGh0dHAyZGJfZmxhdm9yLCByZXZlcnNlPVRydWUpCisgICAgICAgIGlmICdleHRlbmRlZCcgaW4gY29udGVudFswXSBhbmQgY29udGVudFswXVsnZXh0ZW5kZWQnXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGV4dGVuZGVkID0ganNvbi5sb2Fkcyhjb250ZW50WzBdWydleHRlbmRlZCddKQorICAgICAgICAgICAgaWYgJ2RldmljZXMnIGluIGV4dGVuZGVkOiAKKyAgICAgICAgICAgICAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGV4dGVuZGVkWydkZXZpY2VzJ10sIGh0dHAyZGJfZmxhdm9yLCByZXZlcnNlPVRydWUpCisgICAgICAgICAgICBjb250ZW50WzBdWydleHRlbmRlZCddPWV4dGVuZGVkCisgICAgICAgIGNvbnZlcnRfYmFuZHdpZHRoKGNvbnRlbnRbMF0sIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgY29udGVudFswXVsnbGlua3MnXT1bIHsnaHJlZic6ICIvIi5qb2luKCAobXkudXJsX3ByZWZmaXgsIHRlbmFudF9pZCwgJ2ZsYXZvcnMnLCBzdHIoY29udGVudFswXVsnaWQnXSkgKSApLCAncmVsJzonYm9va21hcmsnIH0gXQorICAgICAgICBkYXRhPXsnZmxhdm9yJyA6IGNvbnRlbnRbMF19CisgICAgICAgICNkYXRhWyd0ZW5hbnRzX2xpbmtzJ10gPSBkaWN0KFsoJ3RlbmFudCcsIHJvd1snaWQnXSkgZm9yIHJvdyBpbiBjb250ZW50XSkKKyAgICAgICAgcmV0dXJuIGZvcm1hdF9vdXQoZGF0YSkKKworCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy88dGVuYW50X2lkPi9mbGF2b3JzJywgbWV0aG9kPSdQT1NUJykKK2RlZiBodHRwX3Bvc3RfZmxhdm9ycyh0ZW5hbnRfaWQpOgorICAgICcnJ2luc2VydCBhIGZsYXZvciBpbnRvIHRoZSBkYXRhYmFzZSwgYW5kIGF0dGFjaCB0byB0ZW5hbnQuJycnCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI2NoZWNrIHZhbGlkIHRlbmFudF9pZAorICAgIHJlc3VsdCxjb250ZW50ID0gY2hlY2tfdmFsaWRfdGVuYW50KG15LCB0ZW5hbnRfaWQpCisgICAgaWYgcmVzdWx0ICE9IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydChyZXN1bHQsIGNvbnRlbnQpCisgICAgaHR0cF9jb250ZW50ID0gZm9ybWF0X2luKCBmbGF2b3JfbmV3X3NjaGVtYSApCisgICAgciA9IHJlbW92ZV9leHRyYV9pdGVtcyhodHRwX2NvbnRlbnQsIGZsYXZvcl9uZXdfc2NoZW1hKQorICAgIGlmIHIgaXMgbm90IE5vbmU6IHByaW50ICJodHRwX3Bvc3RfZmxhdm9yczogV2FybmluZzogcmVtb3ZlIGV4dHJhIGl0ZW1zICIsIHIKKyAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGh0dHBfY29udGVudFsnZmxhdm9yJ10sIGh0dHAyZGJfZmxhdm9yKQorICAgIGV4dGVuZGVkX2RpY3QgPSBodHRwX2NvbnRlbnRbJ2ZsYXZvciddLnBvcCgnZXh0ZW5kZWQnLCBOb25lKQorICAgIGlmIGV4dGVuZGVkX2RpY3QgaXMgbm90IE5vbmU6IAorICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBjaGVja19leHRlbmRlZChleHRlbmRlZF9kaWN0KQorICAgICAgICBpZiByZXN1bHQ8MDoKKyAgICAgICAgICAgIHByaW50ICJodHRwX3Bvc3RfZmxhdm9ycyB3cm9uZyBpbnB1dCBleHRlbmRlZCBlcnJvciAlZCAlcyIgJSAocmVzdWx0LCBjb250ZW50KQorICAgICAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY29udmVydF9iYW5kd2lkdGgoZXh0ZW5kZWRfZGljdCkKKyAgICAgICAgaWYgJ2RldmljZXMnIGluIGV4dGVuZGVkX2RpY3Q6IGNoYW5nZV9rZXlzX2h0dHAyZGIoZXh0ZW5kZWRfZGljdFsnZGV2aWNlcyddLCBodHRwMmRiX2ZsYXZvcikKKyAgICAgICAgaHR0cF9jb250ZW50WydmbGF2b3InXVsnZXh0ZW5kZWQnXSA9IGpzb24uZHVtcHMoZXh0ZW5kZWRfZGljdCkKKyAgICAjaW5zZXJ0IGluIGRhdGEgYmFzZQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLm5ld19mbGF2b3IoaHR0cF9jb250ZW50WydmbGF2b3InXSwgdGVuYW50X2lkKQorICAgIGlmIHJlc3VsdCA+PSAwOgorICAgICAgICByZXR1cm4gaHR0cF9nZXRfZmxhdm9yX2lkKHRlbmFudF9pZCwgY29udGVudCkKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiaHR0cF9wc290X2ZsYXZvcnMgZXJyb3IgJWQgJXMiICUgKHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIHJldHVybgorICAgIAorQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvPHRlbmFudF9pZD4vZmxhdm9ycy88Zmxhdm9yX2lkPicsIG1ldGhvZD0nREVMRVRFJykKK2RlZiBodHRwX2RlbGV0ZV9mbGF2b3JfaWQodGVuYW50X2lkLCBmbGF2b3JfaWQpOgorICAgICcnJ0RlbGV0ZXMgdGhlIGZsYXZvcl9pZCBvZiBhIHRlbmFudC4gSVQgcmVtb3ZlcyBmcm9tIHRlbmFudHNfZmxhdm9ycyB0YWJsZS4nJycKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjY2hlY2sgdmFsaWQgdGVuYW50X2lkCisgICAgcmVzdWx0LGNvbnRlbnQgPSBjaGVja192YWxpZF90ZW5hbnQobXksIHRlbmFudF9pZCkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZGVsZXRlX2ltYWdlX2ZsYXZvcignZmxhdm9yJywgZmxhdm9yX2lkLCB0ZW5hbnRfaWQpCisgICAgaWYgcmVzdWx0ID09IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgY29udGVudCkKKyAgICBlbGlmIHJlc3VsdCA+MDoKKyAgICAgICAgZGF0YT17J3Jlc3VsdCcgOiBjb250ZW50fQorICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorICAgIGVsc2U6CisgICAgICAgIHByaW50ICJodHRwX2RlbGV0ZV9mbGF2b3JfaWQgZXJyb3IiLHJlc3VsdCwgY29udGVudAorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnLzx0ZW5hbnRfaWQ+L2ZsYXZvcnMvPGZsYXZvcl9pZD4vPGFjdGlvbj4nLCBtZXRob2Q9J1BPU1QnKQorZGVmIGh0dHBfYXR0YWNoX2RldGFjaF9mbGF2b3JzKHRlbmFudF9pZCwgZmxhdm9yX2lkLCBhY3Rpb24pOgorICAgICcnJ2F0dGFjaC9kZXRhY2ggYW4gZXhpc3RpbmcgZmxhdm9yIGluIHRoaXMgdGVuYW50LiBUaGF0IGlzIGluc2VydC9yZW1vdmUgYXQgdGVuYW50c19mbGF2b3JzIHRhYmxlLicnJworICAgICNUT0RPIGFsZjogIG5vdCB0ZXN0ZWQgYXQgYWxsISEhCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI2NoZWNrIHZhbGlkIHRlbmFudF9pZAorICAgIHJlc3VsdCxjb250ZW50ID0gY2hlY2tfdmFsaWRfdGVuYW50KG15LCB0ZW5hbnRfaWQpCisgICAgaWYgcmVzdWx0ICE9IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydChyZXN1bHQsIGNvbnRlbnQpCisgICAgaWYgdGVuYW50X2lkPT0nYW55JzoKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsICJJbnZhbGlkIHRlbmFudCAnYW55JyB3aXRoIHRoaXMgY29tbWFuZCIpCisgICAgI2NoZWNrIHZhbGlkIGFjdGlvbgorICAgIGlmIGFjdGlvbiE9J2F0dGFjaCcgYW5kIGFjdGlvbiAhPSAnZGV0YWNoJzoKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTWV0aG9kX05vdF9BbGxvd2VkLCAiYWN0aW9ucyBjYW4gYmUgYXR0YWNoIG9yIGRldGFjaCIpCisgICAgICAgIHJldHVybgorCisgICAgI0Vuc3VyZSB0aGF0IGZsYXZvciBleGlzdCAKKyAgICBmcm9tXyAgPSd0ZW5hbnRzX2ZsYXZvcnMgYXMgdGYgcmlnaHQgam9pbiBmbGF2b3JzIGFzIGYgb24gdGYuZmxhdm9yX2lkPWYudXVpZCcKKyAgICB3aGVyZV89eyd1dWlkJzogZmxhdm9yX2lkfQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF90YWJsZShTRUxFQ1Q9KCdwdWJsaWMnLCd0ZW5hbnRfaWQnKSwgRlJPTT1mcm9tXywgV0hFUkU9d2hlcmVfKQorICAgIGlmIHJlc3VsdD09MDoKKyAgICAgICAgaWYgYWN0aW9uPT0nYXR0YWNoJzoKKyAgICAgICAgICAgIHRleHRfZXJyb3I9IkZsYXZvciAnJXMnIG5vdCBmb3VuZCIgJSBmbGF2b3JfaWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHRfZXJyb3I9IkZsYXZvciAnJXMnIG5vdCBmb3VuZCBmb3IgdGVuYW50ICclcyciICUgKGZsYXZvcl9pZCwgdGVuYW50X2lkKQorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsIHRleHRfZXJyb3IpCisgICAgICAgIHJldHVybgorICAgIGVsaWYgcmVzdWx0PjA6CisgICAgICAgIGZsYXZvcj1jb250ZW50WzBdCisgICAgICAgIGlmIGFjdGlvbj09J2F0dGFjaCc6CisgICAgICAgICAgICBpZiBmbGF2b3JbJ3RlbmFudF9pZCddIT1Ob25lOgorICAgICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0NvbmZsaWN0LCAiRmxhdm9yICclcycgYWxyZWFkeSBhdHRhY2hlZCB0byB0ZW5hbnQgJyVzJyIgJSAoZmxhdm9yX2lkLCB0ZW5hbnRfaWQpKQorICAgICAgICAgICAgaWYgZmxhdm9yWydwdWJsaWMnXT09J25vJyBhbmQgbm90IG15LmFkbWluOgorICAgICAgICAgICAgICAgICNhbGxvdyBvbmx5IGF0dGFjaGluZyBwdWJsaWMgZmxhdm9ycworICAgICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX1VuYXV0aG9yaXplZCwgIk5lZWRlZCBhZG1pbiByaWdodHMgdG8gYXR0YWNoIGEgcHJpdmF0ZSBmbGF2b3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgI2luc2VydCBpbiBkYXRhIGJhc2UKKyAgICAgICAgICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLm5ld19yb3coJ3RlbmFudHNfZmxhdm9ycycsIHsnZmxhdm9yX2lkJzpmbGF2b3JfaWQsICd0ZW5hbnRfaWQnOiB0ZW5hbnRfaWR9KQorICAgICAgICAgICAgaWYgcmVzdWx0ID49IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGh0dHBfZ2V0X2ZsYXZvcl9pZCh0ZW5hbnRfaWQsIGZsYXZvcl9pZCkKKyAgICAgICAgZWxzZTogI2RldGFjaAorICAgICAgICAgICAgaWYgZmxhdm9yWyd0ZW5hbnRfaWQnXT09Tm9uZToKKyAgICAgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsICJGbGF2b3IgJyVzJyBub3QgYXR0YWNoZWQgdG8gdGVuYW50ICclcyciICUgKGZsYXZvcl9pZCwgdGVuYW50X2lkKSkKKyAgICAgICAgICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmRlbGV0ZV9yb3dfYnlfZGljdChGUk9NPSd0ZW5hbnRzX2ZsYXZvcnMnLCBXSEVSRT17J2ZsYXZvcl9pZCc6Zmxhdm9yX2lkLCAndGVuYW50X2lkJzp0ZW5hbnRfaWR9KQorICAgICAgICAgICAgaWYgcmVzdWx0Pj0wOgorICAgICAgICAgICAgICAgIGlmIGZsYXZvclsncHVibGljJ109PSdubyc6CisgICAgICAgICAgICAgICAgICAgICN0cnkgdG8gZGVsZXRlIHRoZSBmbGF2b3IgY29tcGxldGVseSB0byBhdm9pZCBvcnBoYW4gZmxhdm9ycywgSUdOT1JFIGVycm9yCisgICAgICAgICAgICAgICAgICAgIG15LmRiLmRlbGV0ZV9yb3dfYnlfZGljdChGUk9NPSdmbGF2b3JzJywgV0hFUkU9eyd1dWlkJzpmbGF2b3JfaWR9KQorICAgICAgICAgICAgICAgIGRhdGE9eydyZXN1bHQnIDogImZsYXZvciBkZXRhY2hlZCJ9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdF9vdXQoZGF0YSkKKyAgICAKKyAgICAjaWYgZ2V0IGhlcmUgaXMgYmVjYXVzZSBhbiBlcnJvcgorICAgIHByaW50ICJodHRwX2F0dGFjaF9kZXRhY2hfZmxhdm9ycyBlcnJvciAlZCAlcyIgJSAocmVzdWx0LCBjb250ZW50KQorICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgIHJldHVybgorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy88dGVuYW50X2lkPi9mbGF2b3JzLzxmbGF2b3JfaWQ+JywgbWV0aG9kPSdQVVQnKQorZGVmIGh0dHBfcHV0X2ZsYXZvcl9pZCh0ZW5hbnRfaWQsIGZsYXZvcl9pZCk6CisgICAgJycndXBkYXRlIGEgZmxhdm9yX2lkIGludG8gdGhlIGRhdGFiYXNlLicnJworICAgIG15ID0gY29uZmlnX2RpY1snaHR0cF90aHJlYWRzJ11bIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgXQorICAgICNjaGVjayB2YWxpZCB0ZW5hbnRfaWQKKyAgICByZXN1bHQsY29udGVudCA9IGNoZWNrX3ZhbGlkX3RlbmFudChteSwgdGVuYW50X2lkKQorICAgIGlmIHJlc3VsdCAhPSAwOgorICAgICAgICBib3R0bGUuYWJvcnQocmVzdWx0LCBjb250ZW50KQorICAgICNwYXJzZSBpbnB1dCBkYXRhCisgICAgaHR0cF9jb250ZW50ID0gZm9ybWF0X2luKCBmbGF2b3JfdXBkYXRlX3NjaGVtYSApCisgICAgciA9IHJlbW92ZV9leHRyYV9pdGVtcyhodHRwX2NvbnRlbnQsIGZsYXZvcl91cGRhdGVfc2NoZW1hKQorICAgIGlmIHIgaXMgbm90IE5vbmU6IHByaW50ICJodHRwX3B1dF9mbGF2b3JfaWQ6IFdhcm5pbmc6IHJlbW92ZSBleHRyYSBpdGVtcyAiLCByCisgICAgY2hhbmdlX2tleXNfaHR0cDJkYihodHRwX2NvbnRlbnRbJ2ZsYXZvciddLCBodHRwMmRiX2ZsYXZvcikKKyAgICBleHRlbmRlZF9kaWN0ID0gaHR0cF9jb250ZW50WydmbGF2b3InXS5wb3AoJ2V4dGVuZGVkJywgTm9uZSkKKyAgICBpZiBleHRlbmRlZF9kaWN0IGlzIG5vdCBOb25lOiAKKyAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gY2hlY2tfZXh0ZW5kZWQoZXh0ZW5kZWRfZGljdCkKKyAgICAgICAgaWYgcmVzdWx0PDA6CisgICAgICAgICAgICBwcmludCAiaHR0cF9wdXRfZmxhdm9yX2lkIHdyb25nIGlucHV0IGV4dGVuZGVkIGVycm9yICVkICVzIiAlIChyZXN1bHQsIGNvbnRlbnQpCisgICAgICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjb252ZXJ0X2JhbmR3aWR0aChleHRlbmRlZF9kaWN0KQorICAgICAgICBpZiAnZGV2aWNlcycgaW4gZXh0ZW5kZWRfZGljdDogY2hhbmdlX2tleXNfaHR0cDJkYihleHRlbmRlZF9kaWN0WydkZXZpY2VzJ10sIGh0dHAyZGJfZmxhdm9yKQorICAgICAgICBodHRwX2NvbnRlbnRbJ2ZsYXZvciddWydleHRlbmRlZCddID0ganNvbi5kdW1wcyhleHRlbmRlZF9kaWN0KQorICAgICNFbnN1cmUgdGhhdCBmbGF2b3IgZXhpc3QgCisgICAgd2hlcmVfPXsndXVpZCc6IGZsYXZvcl9pZH0KKyAgICBpZiB0ZW5hbnRfaWQ9PSdhbnknOgorICAgICAgICBmcm9tXyAgPSdmbGF2b3JzJworICAgIGVsc2U6CisgICAgICAgIGZyb21fICA9J3RlbmFudHNfZmxhdm9ycyBhcyB0aSBpbm5lciBqb2luIGZsYXZvcnMgYXMgaSBvbiB0aS5mbGF2b3JfaWQ9aS51dWlkJworICAgICAgICB3aGVyZV9bJ3RlbmFudF9pZCddID0gdGVuYW50X2lkCisgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZ2V0X3RhYmxlKFNFTEVDVD0oJ3B1YmxpYycsKSwgRlJPTT1mcm9tXywgV0hFUkU9d2hlcmVfKQorICAgIGlmIHJlc3VsdD09MDoKKyAgICAgICAgdGV4dF9lcnJvcj0iRmxhdm9yICclcycgbm90IGZvdW5kIiAlIGZsYXZvcl9pZAorICAgICAgICBpZiB0ZW5hbnRfaWQhPSdhbnknOgorICAgICAgICAgICAgdGV4dF9lcnJvciArPSIgZm9yIHRlbmFudCAnJXMnIiAlIGZsYXZvcl9pZAorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsIHRleHRfZXJyb3IpCisgICAgICAgIHJldHVybgorICAgIGVsaWYgcmVzdWx0PjA6CisgICAgICAgIGlmIGNvbnRlbnRbMF1bJ3B1YmxpYyddPT0neWVzJyBhbmQgbm90IG15LmFkbWluOgorICAgICAgICAgICAgI2FsbG93IG9ubHkgbW9kaWZpY2F0aW9ucyBvdmVyIHByaXZhdGUgZmxhdm9ycworICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfVW5hdXRob3JpemVkLCAiTmVlZGVkIGFkbWluIHJpZ2h0cyB0byBlZGl0IGEgcHVibGljIGZsYXZvciIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgI2luc2VydCBpbiBkYXRhIGJhc2UKKyAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIudXBkYXRlX3Jvd3MoJ2ZsYXZvcnMnLCBodHRwX2NvbnRlbnRbJ2ZsYXZvciddLCB7J3V1aWQnOiBmbGF2b3JfaWR9KQorCisgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgcHJpbnQgImh0dHBfcHV0X2ZsYXZvcl9pZCBlcnJvciAlZCAlcyIgJSAocmVzdWx0LCBjb250ZW50KQorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGh0dHBfZ2V0X2ZsYXZvcl9pZCh0ZW5hbnRfaWQsIGZsYXZvcl9pZCkKKworCisKKyMKKyMgSU1BR0VTCisjCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnLzx0ZW5hbnRfaWQ+L2ltYWdlcycsIG1ldGhvZD0nR0VUJykKK2RlZiBodHRwX2dldF9pbWFnZXModGVuYW50X2lkKToKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjY2hlY2sgdmFsaWQgdGVuYW50X2lkCisgICAgcmVzdWx0LGNvbnRlbnQgPSBjaGVja192YWxpZF90ZW5hbnQobXksIHRlbmFudF9pZCkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KHJlc3VsdCwgY29udGVudCkKKyAgICAjb2J0YWluIGRhdGEKKyAgICBzZWxlY3RfLHdoZXJlXyxsaW1pdF8gPSBmaWx0ZXJfcXVlcnlfc3RyaW5nKGJvdHRsZS5yZXF1ZXN0LnF1ZXJ5LCBodHRwMmRiX2ltYWdlLAorICAgICAgICAgICAgKCdpZCcsJ25hbWUnLCdkZXNjcmlwdGlvbicsJ3BhdGgnLCdwdWJsaWMnKSApCisgICAgaWYgdGVuYW50X2lkPT0nYW55JzoKKyAgICAgICAgZnJvbV8gID0naW1hZ2VzJworICAgIGVsc2U6CisgICAgICAgIGZyb21fICA9J3RlbmFudHNfaW1hZ2VzIGlubmVyIGpvaW4gaW1hZ2VzIG9uIHRlbmFudHNfaW1hZ2VzLmltYWdlX2lkPWltYWdlcy51dWlkJworICAgICAgICB3aGVyZV9bJ3RlbmFudF9pZCddID0gdGVuYW50X2lkCisgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZ2V0X3RhYmxlKFNFTEVDVD1zZWxlY3RfLCBGUk9NPWZyb21fLCBXSEVSRT13aGVyZV8sIExJTUlUPWxpbWl0XykKKyAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICBwcmludCAiaHR0cF9nZXRfaW1hZ2VzIEVycm9yIiwgY29udGVudAorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICBlbHNlOgorICAgICAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGNvbnRlbnQsIGh0dHAyZGJfaW1hZ2UsIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgI2ZvciByb3cgaW4gY29udGVudDogcm93WydsaW5rcyddPVsgeydocmVmJzogIi8iLmpvaW4oIChteS51cmxfcHJlZmZpeCwgdGVuYW50X2lkLCAnaW1hZ2VzJywgc3RyKHJvd1snaWQnXSkgKSApLCAncmVsJzonYm9va21hcmsnIH0gXQorICAgICAgICBkYXRhPXsnaW1hZ2VzJyA6IGNvbnRlbnR9CisgICAgICAgIHJldHVybiBmb3JtYXRfb3V0KGRhdGEpCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnLzx0ZW5hbnRfaWQ+L2ltYWdlcy88aW1hZ2VfaWQ+JywgbWV0aG9kPSdHRVQnKQorZGVmIGh0dHBfZ2V0X2ltYWdlX2lkKHRlbmFudF9pZCwgaW1hZ2VfaWQpOgorICAgIG15ID0gY29uZmlnX2RpY1snaHR0cF90aHJlYWRzJ11bIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgXQorICAgICNjaGVjayB2YWxpZCB0ZW5hbnRfaWQKKyAgICByZXN1bHQsY29udGVudCA9IGNoZWNrX3ZhbGlkX3RlbmFudChteSwgdGVuYW50X2lkKQorICAgIGlmIHJlc3VsdCAhPSAwOgorICAgICAgICBib3R0bGUuYWJvcnQocmVzdWx0LCBjb250ZW50KQorICAgICNvYnRhaW4gZGF0YQorICAgIHNlbGVjdF8sd2hlcmVfLGxpbWl0XyA9IGZpbHRlcl9xdWVyeV9zdHJpbmcoYm90dGxlLnJlcXVlc3QucXVlcnksIGh0dHAyZGJfaW1hZ2UsCisgICAgICAgICAgICAoJ2lkJywnbmFtZScsJ2Rlc2NyaXB0aW9uJywncHJvZ3Jlc3MnLCAnc3RhdHVzJywncGF0aCcsICdjcmVhdGVkJywgJ3VwZGF0ZWQnLCdwdWJsaWMnKSApCisgICAgaWYgdGVuYW50X2lkPT0nYW55JzoKKyAgICAgICAgZnJvbV8gID0naW1hZ2VzJworICAgIGVsc2U6CisgICAgICAgIGZyb21fICA9J3RlbmFudHNfaW1hZ2VzIGFzIHRpIGlubmVyIGpvaW4gaW1hZ2VzIGFzIGkgb24gdGkuaW1hZ2VfaWQ9aS51dWlkJworICAgICAgICB3aGVyZV9bJ3RlbmFudF9pZCddID0gdGVuYW50X2lkCisgICAgd2hlcmVfWyd1dWlkJ10gPSBpbWFnZV9pZAorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF90YWJsZShTRUxFQ1Q9c2VsZWN0XywgRlJPTT1mcm9tXywgV0hFUkU9d2hlcmVfLCBMSU1JVD1saW1pdF8pCisKKyAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICBwcmludCAiaHR0cF9nZXRfaW1hZ2VzIGVycm9yICVkICVzIiAlIChyZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgIGVsaWYgcmVzdWx0PT0wOgorICAgICAgICBwcmludCAiaHR0cF9nZXRfaW1hZ2VzIGltYWdlICclcycgbm90IGZvdW5kIiAlIHN0cihpbWFnZV9pZCkKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTm90X0ZvdW5kLCAnaW1hZ2UgJXMgbm90IGZvdW5kJyAlIGltYWdlX2lkKQorICAgIGVsc2U6CisgICAgICAgIGNvbnZlcnRfZGF0ZXRpbWUyc3RyKGNvbnRlbnQpCisgICAgICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoY29udGVudCwgaHR0cDJkYl9pbWFnZSwgcmV2ZXJzZT1UcnVlKQorICAgICAgICBpZiAnbWV0YWRhdGEnIGluIGNvbnRlbnRbMF0gYW5kIGNvbnRlbnRbMF1bJ21ldGFkYXRhJ10gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBtZXRhZGF0YSA9IGpzb24ubG9hZHMoY29udGVudFswXVsnbWV0YWRhdGEnXSkKKyAgICAgICAgICAgIGNvbnRlbnRbMF1bJ21ldGFkYXRhJ109bWV0YWRhdGEKKyAgICAgICAgY29udGVudFswXVsnbGlua3MnXT1bIHsnaHJlZic6ICIvIi5qb2luKCAobXkudXJsX3ByZWZmaXgsIHRlbmFudF9pZCwgJ2ltYWdlcycsIHN0cihjb250ZW50WzBdWydpZCddKSApICksICdyZWwnOidib29rbWFyaycgfSBdCisgICAgICAgIGRhdGE9eydpbWFnZScgOiBjb250ZW50WzBdfQorICAgICAgICAjZGF0YVsndGVuYW50c19saW5rcyddID0gZGljdChbKCd0ZW5hbnQnLCByb3dbJ2lkJ10pIGZvciByb3cgaW4gY29udGVudF0pCisgICAgICAgIHJldHVybiBmb3JtYXRfb3V0KGRhdGEpCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnLzx0ZW5hbnRfaWQ+L2ltYWdlcycsIG1ldGhvZD0nUE9TVCcpCitkZWYgaHR0cF9wb3N0X2ltYWdlcyh0ZW5hbnRfaWQpOgorICAgICcnJ2luc2VydCBhIGltYWdlIGludG8gdGhlIGRhdGFiYXNlLCBhbmQgYXR0YWNoIHRvIHRlbmFudC4nJycKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjY2hlY2sgdmFsaWQgdGVuYW50X2lkCisgICAgcmVzdWx0LGNvbnRlbnQgPSBjaGVja192YWxpZF90ZW5hbnQobXksIHRlbmFudF9pZCkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KHJlc3VsdCwgY29udGVudCkKKyAgICBodHRwX2NvbnRlbnQgPSBmb3JtYXRfaW4oaW1hZ2VfbmV3X3NjaGVtYSkKKyAgICByID0gcmVtb3ZlX2V4dHJhX2l0ZW1zKGh0dHBfY29udGVudCwgaW1hZ2VfbmV3X3NjaGVtYSkKKyAgICBpZiByIGlzIG5vdCBOb25lOiBwcmludCAiaHR0cF9wb3N0X2ltYWdlczogV2FybmluZzogcmVtb3ZlIGV4dHJhIGl0ZW1zICIsIHIKKyAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGh0dHBfY29udGVudFsnaW1hZ2UnXSwgaHR0cDJkYl9pbWFnZSkKKyAgICBtZXRhZGF0YV9kaWN0ID0gaHR0cF9jb250ZW50WydpbWFnZSddLnBvcCgnbWV0YWRhdGEnLCBOb25lKQorICAgIGlmIG1ldGFkYXRhX2RpY3QgaXMgbm90IE5vbmU6IAorICAgICAgICBodHRwX2NvbnRlbnRbJ2ltYWdlJ11bJ21ldGFkYXRhJ10gPSBqc29uLmR1bXBzKG1ldGFkYXRhX2RpY3QpCisgICAgI2luc2VydCBpbiBkYXRhIGJhc2UKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5uZXdfaW1hZ2UoaHR0cF9jb250ZW50WydpbWFnZSddLCB0ZW5hbnRfaWQpCisgICAgaWYgcmVzdWx0ID49IDA6CisgICAgICAgIHJldHVybiBodHRwX2dldF9pbWFnZV9pZCh0ZW5hbnRfaWQsIGNvbnRlbnQpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgImh0dHBfcG9zdF9pbWFnZXMgZXJyb3IgJWQgJXMiICUgKHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIHJldHVybgorICAgIAorQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvPHRlbmFudF9pZD4vaW1hZ2VzLzxpbWFnZV9pZD4nLCBtZXRob2Q9J0RFTEVURScpCitkZWYgaHR0cF9kZWxldGVfaW1hZ2VfaWQodGVuYW50X2lkLCBpbWFnZV9pZCk6CisgICAgJycnRGVsZXRlcyB0aGUgaW1hZ2VfaWQgb2YgYSB0ZW5hbnQuIElUIHJlbW92ZXMgZnJvbSB0ZW5hbnRzX2ltYWdlcyB0YWJsZS4nJycKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjY2hlY2sgdmFsaWQgdGVuYW50X2lkCisgICAgcmVzdWx0LGNvbnRlbnQgPSBjaGVja192YWxpZF90ZW5hbnQobXksIHRlbmFudF9pZCkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KHJlc3VsdCwgY29udGVudCkKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5kZWxldGVfaW1hZ2VfZmxhdm9yKCdpbWFnZScsIGltYWdlX2lkLCB0ZW5hbnRfaWQpCisgICAgaWYgcmVzdWx0ID09IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgY29udGVudCkKKyAgICBlbGlmIHJlc3VsdCA+MDoKKyAgICAgICAgZGF0YT17J3Jlc3VsdCcgOiBjb250ZW50fQorICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorICAgIGVsc2U6CisgICAgICAgIHByaW50ICJodHRwX2RlbGV0ZV9pbWFnZV9pZCBlcnJvciIscmVzdWx0LCBjb250ZW50CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKworQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvPHRlbmFudF9pZD4vaW1hZ2VzLzxpbWFnZV9pZD4vPGFjdGlvbj4nLCBtZXRob2Q9J1BPU1QnKQorZGVmIGh0dHBfYXR0YWNoX2RldGFjaF9pbWFnZXModGVuYW50X2lkLCBpbWFnZV9pZCwgYWN0aW9uKToKKyAgICAnJydhdHRhY2gvZGV0YWNoIGFuIGV4aXN0aW5nIGltYWdlIGluIHRoaXMgdGVuYW50LiBUaGF0IGlzIGluc2VydC9yZW1vdmUgYXQgdGVuYW50c19pbWFnZXMgdGFibGUuJycnCisgICAgI1RPRE8gYWxmOiAgbm90IHRlc3RlZCBhdCBhbGwhISEKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjY2hlY2sgdmFsaWQgdGVuYW50X2lkCisgICAgcmVzdWx0LGNvbnRlbnQgPSBjaGVja192YWxpZF90ZW5hbnQobXksIHRlbmFudF9pZCkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KHJlc3VsdCwgY29udGVudCkKKyAgICBpZiB0ZW5hbnRfaWQ9PSdhbnknOgorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgIkludmFsaWQgdGVuYW50ICdhbnknIHdpdGggdGhpcyBjb21tYW5kIikKKyAgICAjY2hlY2sgdmFsaWQgYWN0aW9uCisgICAgaWYgYWN0aW9uIT0nYXR0YWNoJyBhbmQgYWN0aW9uICE9ICdkZXRhY2gnOgorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9NZXRob2RfTm90X0FsbG93ZWQsICJhY3Rpb25zIGNhbiBiZSBhdHRhY2ggb3IgZGV0YWNoIikKKyAgICAgICAgcmV0dXJuCisKKyAgICAjRW5zdXJlIHRoYXQgaW1hZ2UgZXhpc3QgCisgICAgZnJvbV8gID0ndGVuYW50c19pbWFnZXMgYXMgdGkgcmlnaHQgam9pbiBpbWFnZXMgYXMgaSBvbiB0aS5pbWFnZV9pZD1pLnV1aWQnCisgICAgd2hlcmVfPXsndXVpZCc6IGltYWdlX2lkfQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF90YWJsZShTRUxFQ1Q9KCdwdWJsaWMnLCd0ZW5hbnRfaWQnKSwgRlJPTT1mcm9tXywgV0hFUkU9d2hlcmVfKQorICAgIGlmIHJlc3VsdD09MDoKKyAgICAgICAgaWYgYWN0aW9uPT0nYXR0YWNoJzoKKyAgICAgICAgICAgIHRleHRfZXJyb3I9IkltYWdlICclcycgbm90IGZvdW5kIiAlIGltYWdlX2lkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZXh0X2Vycm9yPSJJbWFnZSAnJXMnIG5vdCBmb3VuZCBmb3IgdGVuYW50ICclcyciICUgKGltYWdlX2lkLCB0ZW5hbnRfaWQpCisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgdGV4dF9lcnJvcikKKyAgICAgICAgcmV0dXJuCisgICAgZWxpZiByZXN1bHQ+MDoKKyAgICAgICAgaW1hZ2U9Y29udGVudFswXQorICAgICAgICBpZiBhY3Rpb249PSdhdHRhY2gnOgorICAgICAgICAgICAgaWYgaW1hZ2VbJ3RlbmFudF9pZCddIT1Ob25lOgorICAgICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0NvbmZsaWN0LCAiSW1hZ2UgJyVzJyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRlbmFudCAnJXMnIiAlIChpbWFnZV9pZCwgdGVuYW50X2lkKSkKKyAgICAgICAgICAgIGlmIGltYWdlWydwdWJsaWMnXT09J25vJyBhbmQgbm90IG15LmFkbWluOgorICAgICAgICAgICAgICAgICNhbGxvdyBvbmx5IGF0dGFjaGluZyBwdWJsaWMgaW1hZ2VzCisgICAgICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfVW5hdXRob3JpemVkLCAiTmVlZGVkIGFkbWluIHJpZ2h0cyB0byBhdHRhY2ggYSBwcml2YXRlIGltYWdlIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICNpbnNlcnQgaW4gZGF0YSBiYXNlCisgICAgICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5uZXdfcm93KCd0ZW5hbnRzX2ltYWdlcycsIHsnaW1hZ2VfaWQnOmltYWdlX2lkLCAndGVuYW50X2lkJzogdGVuYW50X2lkfSkKKyAgICAgICAgICAgIGlmIHJlc3VsdCA+PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBodHRwX2dldF9pbWFnZV9pZCh0ZW5hbnRfaWQsIGltYWdlX2lkKQorICAgICAgICBlbHNlOiAjZGV0YWNoCisgICAgICAgICAgICBpZiBpbWFnZVsndGVuYW50X2lkJ109PU5vbmU6CisgICAgICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTm90X0ZvdW5kLCAiSW1hZ2UgJyVzJyBub3QgYXR0YWNoZWQgdG8gdGVuYW50ICclcyciICUgKGltYWdlX2lkLCB0ZW5hbnRfaWQpKQorICAgICAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZGVsZXRlX3Jvd19ieV9kaWN0KEZST009J3RlbmFudHNfaW1hZ2VzJywgV0hFUkU9eydpbWFnZV9pZCc6aW1hZ2VfaWQsICd0ZW5hbnRfaWQnOnRlbmFudF9pZH0pCisgICAgICAgICAgICBpZiByZXN1bHQ+PTA6CisgICAgICAgICAgICAgICAgaWYgaW1hZ2VbJ3B1YmxpYyddPT0nbm8nOgorICAgICAgICAgICAgICAgICAgICAjdHJ5IHRvIGRlbGV0ZSB0aGUgaW1hZ2UgY29tcGxldGVseSB0byBhdm9pZCBvcnBoYW4gaW1hZ2VzLCBJR05PUkUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgbXkuZGIuZGVsZXRlX3Jvd19ieV9kaWN0KEZST009J2ltYWdlcycsIFdIRVJFPXsndXVpZCc6aW1hZ2VfaWR9KQorICAgICAgICAgICAgICAgIGRhdGE9eydyZXN1bHQnIDogImltYWdlIGRldGFjaGVkIn0KKyAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorICAgIAorICAgICNpZiBnZXQgaGVyZSBpcyBiZWNhdXNlIGFuIGVycm9yCisgICAgcHJpbnQgImh0dHBfYXR0YWNoX2RldGFjaF9pbWFnZXMgZXJyb3IgJWQgJXMiICUgKHJlc3VsdCwgY29udGVudCkKKyAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICByZXR1cm4KKworQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvPHRlbmFudF9pZD4vaW1hZ2VzLzxpbWFnZV9pZD4nLCBtZXRob2Q9J1BVVCcpCitkZWYgaHR0cF9wdXRfaW1hZ2VfaWQodGVuYW50X2lkLCBpbWFnZV9pZCk6CisgICAgJycndXBkYXRlIGEgaW1hZ2VfaWQgaW50byB0aGUgZGF0YWJhc2UuJycnCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI2NoZWNrIHZhbGlkIHRlbmFudF9pZAorICAgIHJlc3VsdCxjb250ZW50ID0gY2hlY2tfdmFsaWRfdGVuYW50KG15LCB0ZW5hbnRfaWQpCisgICAgaWYgcmVzdWx0ICE9IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydChyZXN1bHQsIGNvbnRlbnQpCisgICAgI3BhcnNlIGlucHV0IGRhdGEKKyAgICBodHRwX2NvbnRlbnQgPSBmb3JtYXRfaW4oIGltYWdlX3VwZGF0ZV9zY2hlbWEgKQorICAgIHIgPSByZW1vdmVfZXh0cmFfaXRlbXMoaHR0cF9jb250ZW50LCBpbWFnZV91cGRhdGVfc2NoZW1hKQorICAgIGlmIHIgaXMgbm90IE5vbmU6IHByaW50ICJodHRwX3B1dF9pbWFnZV9pZDogV2FybmluZzogcmVtb3ZlIGV4dHJhIGl0ZW1zICIsIHIKKyAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGh0dHBfY29udGVudFsnaW1hZ2UnXSwgaHR0cDJkYl9pbWFnZSkKKyAgICBtZXRhZGF0YV9kaWN0ID0gaHR0cF9jb250ZW50WydpbWFnZSddLnBvcCgnbWV0YWRhdGEnLCBOb25lKQorICAgIGlmIG1ldGFkYXRhX2RpY3QgaXMgbm90IE5vbmU6IAorICAgICAgICBodHRwX2NvbnRlbnRbJ2ltYWdlJ11bJ21ldGFkYXRhJ10gPSBqc29uLmR1bXBzKG1ldGFkYXRhX2RpY3QpCisgICAgI0Vuc3VyZSB0aGF0IGltYWdlIGV4aXN0IAorICAgIHdoZXJlXz17J3V1aWQnOiBpbWFnZV9pZH0KKyAgICBpZiB0ZW5hbnRfaWQ9PSdhbnknOgorICAgICAgICBmcm9tXyAgPSdpbWFnZXMnCisgICAgZWxzZToKKyAgICAgICAgZnJvbV8gID0ndGVuYW50c19pbWFnZXMgYXMgdGkgaW5uZXIgam9pbiBpbWFnZXMgYXMgaSBvbiB0aS5pbWFnZV9pZD1pLnV1aWQnCisgICAgICAgIHdoZXJlX1sndGVuYW50X2lkJ10gPSB0ZW5hbnRfaWQKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoU0VMRUNUPSgncHVibGljJywpLCBGUk9NPWZyb21fLCBXSEVSRT13aGVyZV8pCisgICAgaWYgcmVzdWx0PT0wOgorICAgICAgICB0ZXh0X2Vycm9yPSJJbWFnZSAnJXMnIG5vdCBmb3VuZCIgJSBpbWFnZV9pZAorICAgICAgICBpZiB0ZW5hbnRfaWQhPSdhbnknOgorICAgICAgICAgICAgdGV4dF9lcnJvciArPSIgZm9yIHRlbmFudCAnJXMnIiAlIGltYWdlX2lkCisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgdGV4dF9lcnJvcikKKyAgICAgICAgcmV0dXJuCisgICAgZWxpZiByZXN1bHQ+MDoKKyAgICAgICAgaWYgY29udGVudFswXVsncHVibGljJ109PSd5ZXMnIGFuZCBub3QgbXkuYWRtaW46CisgICAgICAgICAgICAjYWxsb3cgb25seSBtb2RpZmljYXRpb25zIG92ZXIgcHJpdmF0ZSBpbWFnZXMKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX1VuYXV0aG9yaXplZCwgIk5lZWRlZCBhZG1pbiByaWdodHMgdG8gZWRpdCBhIHB1YmxpYyBpbWFnZSIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgI2luc2VydCBpbiBkYXRhIGJhc2UKKyAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIudXBkYXRlX3Jvd3MoJ2ltYWdlcycsIGh0dHBfY29udGVudFsnaW1hZ2UnXSwgeyd1dWlkJzogaW1hZ2VfaWR9KQorCisgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgcHJpbnQgImh0dHBfcHV0X2ltYWdlX2lkIGVycm9yICVkICVzIiAlIChyZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gaHR0cF9nZXRfaW1hZ2VfaWQodGVuYW50X2lkLCBpbWFnZV9pZCkKKworCisjCisjIFNFUlZFUlMKKyMKKworQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvPHRlbmFudF9pZD4vc2VydmVycycsIG1ldGhvZD0nR0VUJykKK2RlZiBodHRwX2dldF9zZXJ2ZXJzKHRlbmFudF9pZCk6CisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgcmVzdWx0LGNvbnRlbnQgPSBjaGVja192YWxpZF90ZW5hbnQobXksIHRlbmFudF9pZCkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisgICAgI29idGFpbiBkYXRhCisgICAgc2VsZWN0Xyx3aGVyZV8sbGltaXRfID0gZmlsdGVyX3F1ZXJ5X3N0cmluZyhib3R0bGUucmVxdWVzdC5xdWVyeSwgaHR0cDJkYl9zZXJ2ZXIsCisgICAgICAgICAgICAoJ2lkJywnbmFtZScsJ2Rlc2NyaXB0aW9uJywnaG9zdElkJywnaW1hZ2VSZWYnLCdmbGF2b3JSZWYnLCdzdGF0dXMnLCAndGVuYW50X2lkJykgKQorICAgIGlmIHRlbmFudF9pZCE9J2FueSc6CisgICAgICAgIHdoZXJlX1sndGVuYW50X2lkJ10gPSB0ZW5hbnRfaWQKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoU0VMRUNUPXNlbGVjdF8sIEZST009J2luc3RhbmNlcycsIFdIRVJFPXdoZXJlXywgTElNSVQ9bGltaXRfKQorICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgIHByaW50ICJodHRwX2dldF9zZXJ2ZXJzIEVycm9yIiwgY29udGVudAorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICBlbHNlOgorICAgICAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGNvbnRlbnQsIGh0dHAyZGJfc2VydmVyLCByZXZlcnNlPVRydWUpCisgICAgICAgIGZvciByb3cgaW4gY29udGVudDoKKyAgICAgICAgICAgIHRlbmFudF9pZCA9IHJvdy5wb3AoJ3RlbmFudF9pZCcpCisgICAgICAgICAgICByb3dbJ2xpbmtzJ109WyB7J2hyZWYnOiAiLyIuam9pbiggKG15LnVybF9wcmVmZml4LCB0ZW5hbnRfaWQsICdzZXJ2ZXJzJywgc3RyKHJvd1snaWQnXSkgKSApLCAncmVsJzonYm9va21hcmsnIH0gXQorICAgICAgICBkYXRhPXsnc2VydmVycycgOiBjb250ZW50fQorICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy88dGVuYW50X2lkPi9zZXJ2ZXJzLzxzZXJ2ZXJfaWQ+JywgbWV0aG9kPSdHRVQnKQorZGVmIGh0dHBfZ2V0X3NlcnZlcl9pZCh0ZW5hbnRfaWQsIHNlcnZlcl9pZCk6CisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI2NoZWNrIHZhbGlkIHRlbmFudF9pZAorICAgIHJlc3VsdCxjb250ZW50ID0gY2hlY2tfdmFsaWRfdGVuYW50KG15LCB0ZW5hbnRfaWQpCisgICAgaWYgcmVzdWx0ICE9IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydChyZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIHJldHVybgorICAgICNvYnRhaW4gZGF0YQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF9pbnN0YW5jZShzZXJ2ZXJfaWQpCisgICAgaWYgcmVzdWx0ID09IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgY29udGVudCkKKyAgICBlbGlmIHJlc3VsdCA+MDoKKyAgICAgICAgI2NoYW5nZSBpbWFnZS9mbGF2b3ItaWQgdG8gaWQgYW5kIGxpbmsKKyAgICAgICAgY29udmVydF9iYW5kd2lkdGgoY29udGVudCwgcmV2ZXJzZT1UcnVlKQorICAgICAgICBjb252ZXJ0X2RhdGV0aW1lMnN0cihjb250ZW50KQorICAgICAgICBpZiBjb250ZW50WyJyYW0iXT09MCA6IGRlbCBjb250ZW50WyJyYW0iXQorICAgICAgICBpZiBjb250ZW50WyJ2Y3B1cyJdPT0wIDogZGVsIGNvbnRlbnRbInZjcHVzIl0KKyAgICAgICAgaWYgJ2ZsYXZvcl9pZCcgaW4gY29udGVudDoKKyAgICAgICAgICAgIGlmIGNvbnRlbnRbJ2ZsYXZvcl9pZCddIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRlbnRbJ2ZsYXZvciddID0geydpZCc6Y29udGVudFsnZmxhdm9yX2lkJ10sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rcyc6W3snaHJlZic6ICAiLyIuam9pbiggKG15LnVybF9wcmVmZml4LCBjb250ZW50Wyd0ZW5hbnRfaWQnXSwgJ2ZsYXZvcnMnLCBzdHIoY29udGVudFsnZmxhdm9yX2lkJ10pICkgKSwgJ3JlbCc6J2Jvb2ttYXJrJ31dIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWwgY29udGVudFsnZmxhdm9yX2lkJ10KKyAgICAgICAgaWYgJ2ltYWdlX2lkJyBpbiBjb250ZW50OgorICAgICAgICAgICAgaWYgY29udGVudFsnaW1hZ2VfaWQnXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjb250ZW50WydpbWFnZSddID0geydpZCc6Y29udGVudFsnaW1hZ2VfaWQnXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua3MnOlt7J2hyZWYnOiAgIi8iLmpvaW4oIChteS51cmxfcHJlZmZpeCwgY29udGVudFsndGVuYW50X2lkJ10sICdpbWFnZXMnLCBzdHIoY29udGVudFsnaW1hZ2VfaWQnXSkgKSApLCAncmVsJzonYm9va21hcmsnfV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsIGNvbnRlbnRbJ2ltYWdlX2lkJ10KKyAgICAgICAgY2hhbmdlX2tleXNfaHR0cDJkYihjb250ZW50LCBodHRwMmRiX3NlcnZlciwgcmV2ZXJzZT1UcnVlKQorICAgICAgICBpZiAnZXh0ZW5kZWQnIGluIGNvbnRlbnQ6CisgICAgICAgICAgICBpZiAnZGV2aWNlcycgaW4gY29udGVudFsnZXh0ZW5kZWQnXTogY2hhbmdlX2tleXNfaHR0cDJkYihjb250ZW50WydleHRlbmRlZCddWydkZXZpY2VzJ10sIGh0dHAyZGJfc2VydmVyLCByZXZlcnNlPVRydWUpCisgICAgICAgICAgICAKKyAgICAgICAgZGF0YT17J3NlcnZlcicgOiBjb250ZW50fQorICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorICAgIGVsc2U6CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKworQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvPHRlbmFudF9pZD4vc2VydmVycycsIG1ldGhvZD0nUE9TVCcpCitkZWYgaHR0cF9wb3N0X3NlcnZlcl9pZCh0ZW5hbnRfaWQpOgorICAgICcnJ2RlcGxveXMgYSBuZXcgc2VydmVyJycnCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI2NoZWNrIHZhbGlkIHRlbmFudF9pZAorICAgIHJlc3VsdCxjb250ZW50ID0gY2hlY2tfdmFsaWRfdGVuYW50KG15LCB0ZW5hbnRfaWQpCisgICAgaWYgcmVzdWx0ICE9IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydChyZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIHJldHVybgorICAgIGlmIHRlbmFudF9pZD09J2FueSc6CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCAiSW52YWxpZCB0ZW5hbnQgJ2FueScgd2l0aCB0aGlzIGNvbW1hbmQiKQorICAgICNjaGVrIGlucHV0CisgICAgaHR0cF9jb250ZW50ID0gZm9ybWF0X2luKCBzZXJ2ZXJfbmV3X3NjaGVtYSApCisgICAgciA9IHJlbW92ZV9leHRyYV9pdGVtcyhodHRwX2NvbnRlbnQsIHNlcnZlcl9uZXdfc2NoZW1hKQorICAgIGlmIHIgaXMgbm90IE5vbmU6IHByaW50ICJodHRwX3Bvc3Rfc2VydmVzOiBXYXJuaW5nOiByZW1vdmUgZXh0cmEgaXRlbXMgIiwgcgorICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoaHR0cF9jb250ZW50WydzZXJ2ZXInXSwgaHR0cDJkYl9zZXJ2ZXIpCisgICAgZXh0ZW5kZWRfZGljdCA9IGh0dHBfY29udGVudFsnc2VydmVyJ10uZ2V0KCdleHRlbmRlZCcsIE5vbmUpCisgICAgaWYgZXh0ZW5kZWRfZGljdCBpcyBub3QgTm9uZToKKyAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gY2hlY2tfZXh0ZW5kZWQoZXh0ZW5kZWRfZGljdCwgVHJ1ZSkKKyAgICAgICAgaWYgcmVzdWx0PDA6CisgICAgICAgICAgICBwcmludCAiaHR0cF9wb3N0X3NlcnZlcnMgd3JvbmcgaW5wdXQgZXh0ZW5kZWQgZXJyb3IgJWQgJXMiICUgKHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNvbnZlcnRfYmFuZHdpZHRoKGV4dGVuZGVkX2RpY3QpCisgICAgICAgIGlmICdkZXZpY2VzJyBpbiBleHRlbmRlZF9kaWN0OiBjaGFuZ2Vfa2V5c19odHRwMmRiKGV4dGVuZGVkX2RpY3RbJ2RldmljZXMnXSwgaHR0cDJkYl9zZXJ2ZXIpCisKKyAgICBzZXJ2ZXIgPSBodHRwX2NvbnRlbnRbJ3NlcnZlciddCisgICAgc2VydmVyX3N0YXJ0ID0gc2VydmVyLmdldCgnc3RhcnQnLCAneWVzJykKKyAgICBzZXJ2ZXJbJ3RlbmFudF9pZCddID0gdGVuYW50X2lkCisgICAgI2NoZWNrIGZsYXZvciB2YWxpZCBhbmQgdGFrZSBpbmZvCisgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZ2V0X3RhYmxlKEZST009J3RlbmFudHNfZmxhdm9ycyBhcyB0ZiBqb2luIGZsYXZvcnMgYXMgZiBvbiB0Zi5mbGF2b3JfaWQ9Zi51dWlkJywKKyAgICAgICAgICAgICBTRUxFQ1Q9KCdyYW0nLCd2Y3B1cycsJ2V4dGVuZGVkJyksIFdIRVJFPXsndXVpZCc6c2VydmVyWydmbGF2b3JfaWQnXSwgJ3RlbmFudF9pZCc6dGVuYW50X2lkfSkKKyAgICBpZiByZXN1bHQ8PTA6CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgJ2ZsYXZvcl9pZCAlcyBub3QgZm91bmQnICUgc2VydmVyWydmbGF2b3JfaWQnXSkKKyAgICAgICAgcmV0dXJuCisgICAgc2VydmVyWydmbGF2b3InXT1jb250ZW50WzBdCisgICAgI2NoZWNrIGltYWdlIHZhbGlkIGFuZCB0YWtlIGluZm8KKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoRlJPTT0ndGVuYW50c19pbWFnZXMgYXMgdGkgam9pbiBpbWFnZXMgYXMgaSBvbiB0aS5pbWFnZV9pZD1pLnV1aWQnLAorICAgICAgICBTRUxFQ1Q9KCdwYXRoJywnbWV0YWRhdGEnKSwgV0hFUkU9eyd1dWlkJzpzZXJ2ZXJbJ2ltYWdlX2lkJ10sICd0ZW5hbnRfaWQnOnRlbmFudF9pZCwgInN0YXR1cyI6IkFDVElWRSJ9KQorICAgIGlmIHJlc3VsdDw9MDoKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTm90X0ZvdW5kLCAnaW1hZ2VfaWQgJXMgbm90IGZvdW5kIG9yIG5vdCBBQ1RJVkUnICUgc2VydmVyWydpbWFnZV9pZCddKQorICAgICAgICByZXR1cm4KKyAgICBzZXJ2ZXJbJ2ltYWdlJ109Y29udGVudFswXQorICAgIGlmICJob3N0c19pZCIgaW4gc2VydmVyOgorICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoRlJPTT0naG9zdHMnLCBTRUxFQ1Q9KCd1dWlkJywpLCBXSEVSRT17J3V1aWQnOiBzZXJ2ZXJbJ2hvc3RfaWQnXX0pCisgICAgICAgIGlmIHJlc3VsdDw9MDoKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgJ2hvc3RJZCAlcyBub3QgZm91bmQnICUgc2VydmVyWydob3N0X2lkJ10pCisgICAgICAgICAgICByZXR1cm4KKyAgICAjcHJpbnQganNvbi5kdW1wcyhzZXJ2ZXIsIGluZGVudD00KQorICAgICAKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBodC5jcmVhdGVfc2VydmVyKHNlcnZlciwgY29uZmlnX2RpY1snZGInXSwgY29uZmlnX2RpY1snZGJfbG9jayddLCBjb25maWdfZGljWydtb2RlJ109PSdub3JtYWwnKQorCisgICAgaWYgcmVzdWx0ID49IDA6CisgICAgI0luc2VydCBpbnN0YW5jZSB0byBkYXRhYmFzZQorICAgICAgICBuZXRzPVtdCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICJpbnNlcnRpbmcgYXQgREIiCisgICAgICAgIHByaW50CisgICAgICAgIGlmIHNlcnZlcl9zdGFydCA9PSAnbm8nOgorICAgICAgICAgICAgY29udGVudFsnc3RhdHVzJ10gPSAnSU5BQ1RJVkUnCisgICAgICAgIHBvcnRzX3RvX2ZyZWU9W10KKyAgICAgICAgbmV3X2luc3RhbmNlX3Jlc3VsdCwgbmV3X2luc3RhbmNlID0gbXkuZGIubmV3X2luc3RhbmNlKGNvbnRlbnQsIG5ldHMsIHBvcnRzX3RvX2ZyZWUpCisgICAgICAgIGlmIG5ld19pbnN0YW5jZV9yZXN1bHQgPCAwOgorICAgICAgICAgICAgcHJpbnQgIkVycm9yIGh0dHBfcG9zdF9zZXJ2ZXJzKCkgOiIsIG5ld19pbnN0YW5jZV9yZXN1bHQsIG5ld19pbnN0YW5jZQorICAgICAgICAgICAgYm90dGxlLmFib3J0KC1uZXdfaW5zdGFuY2VfcmVzdWx0LCBuZXdfaW5zdGFuY2UpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgImluc2VydGVkIGF0IERCIgorICAgICAgICBwcmludAorICAgICAgICBmb3IgcG9ydCBpbiBwb3J0c190b19mcmVlOgorICAgICAgICAgICAgcixjID0gY29uZmlnX2RpY1snaG9zdF90aHJlYWRzJ11bIHNlcnZlclsnaG9zdF9pZCddIF0uaW5zZXJ0X3Rhc2soICdyZXN0b3JlLWlmYWNlJywqcG9ydCApCisgICAgICAgICAgICBpZiByIDwgMDoKKyAgICAgICAgICAgICAgICBwcmludCAnIGh0dHBfcG9zdF9zZXJ2ZXJzIEVSUk9SIFJFU1RPUkUgSUZBQ0UhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIScgKyAgYworICAgICAgICAjdXBkYXRhIG5ldHMKKyAgICAgICAgZm9yIG5ldCBpbiBuZXRzOgorICAgICAgICAgICAgcixjID0gY29uZmlnX2RpY1snb2ZfdGhyZWFkJ10uaW5zZXJ0X3Rhc2soInVwZGF0ZS1uZXQiLCBuZXQpCisgICAgICAgICAgICBpZiByIDwgMDoKKyAgICAgICAgICAgICAgICBwcmludCAnOmh0dHBfcG9zdF9zZXJ2ZXJzIEVSUk9SIFVQREFUSU5HIE5FVFMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEnICsgIGMKKworICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgI2xvb2sgZm9yIGRoY3AgaXAgYWRkcmVzcyAKKyAgICAgICAgcjIsIGMyID0gbXkuZGIuZ2V0X3RhYmxlKEZST009InBvcnRzIiwgU0VMRUNUPVsibWFjIiwgIm5ldF9pZCJdLCBXSEVSRT17Imluc3RhbmNlX2lkIjogbmV3X2luc3RhbmNlfSkKKyAgICAgICAgaWYgcjIgPjAgYW5kIGNvbmZpZ19kaWMuZ2V0KCJkaGNwX3NlcnZlciIpOgorICAgICAgICAgICAgZm9yIGlmYWNlIGluIGMyOgorICAgICAgICAgICAgICAgIGlmIGlmYWNlWyJuZXRfaWQiXSBpbiBjb25maWdfZGljWyJkaGNwX25ldHMiXToKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJkaGNwIGluc2VydCBhZGQgdGFzayIKKyAgICAgICAgICAgICAgICAgICAgcixjID0gY29uZmlnX2RpY1snZGhjcF90aHJlYWQnXS5pbnNlcnRfdGFzaygiYWRkIiwgaWZhY2VbIm1hYyJdKQorICAgICAgICAgICAgICAgICAgICBpZiByIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICc6aHR0cF9wb3N0X3NlcnZlcnMgRVJST1IgVVBEQVRJTkcgZGhjcF9zZXJ2ZXIgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEnICsgIGMgCisgICAgICAgIAorICAgICNTdGFydCBzZXJ2ZXIKKyAgICAgICAgCisgICAgICAgIHNlcnZlclsndXVpZCddID0gbmV3X2luc3RhbmNlCisgICAgICAgICNzZXJ2ZXJfc3RhcnQgPSBzZXJ2ZXIuZ2V0KCdzdGFydCcsICd5ZXMnKQorICAgICAgICBpZiBzZXJ2ZXJfc3RhcnQgIT0gJ25vJzoKKyAgICAgICAgICAgIHNlcnZlclsncGF1c2VkJ10gPSBUcnVlIGlmIHNlcnZlcl9zdGFydCA9PSAncGF1c2VkJyBlbHNlIEZhbHNlIAorICAgICAgICAgICAgc2VydmVyWydhY3Rpb24nXSA9IHsic3RhcnQiOk5vbmV9CisgICAgICAgICAgICBzZXJ2ZXJbJ3N0YXR1cyddID0gIkNSRUFUSU5HIgorICAgICAgICAgICAgI1Byb2dyYW0gdGFzaworICAgICAgICAgICAgcixjID0gY29uZmlnX2RpY1snaG9zdF90aHJlYWRzJ11bIHNlcnZlclsnaG9zdF9pZCddIF0uaW5zZXJ0X3Rhc2soICdpbnN0YW5jZScsc2VydmVyICkKKyAgICAgICAgICAgIGlmIHI8MDoKKyAgICAgICAgICAgICAgICBteS5kYi51cGRhdGVfcm93cygnaW5zdGFuY2VzJywgeydzdGF0dXMnOiJFUlJPUiJ9LCB7J3V1aWQnOnNlcnZlclsndXVpZCddLCAnbGFzdF9lcnJvcic6Y30sIGxvZz1UcnVlKQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGh0dHBfZ2V0X3NlcnZlcl9pZCh0ZW5hbnRfaWQsIG5ld19pbnN0YW5jZSkKKyAgICBlbHNlOgorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisKK2RlZiBodHRwX3NlcnZlcl9hY3Rpb24oc2VydmVyX2lkLCB0ZW5hbnRfaWQsIGFjdGlvbik6CisgICAgJycnUGVyZm9ybSBhY3Rpb25zIG92ZXIgYSBzZXJ2ZXIgYXMgcmVzdW1lLCByZWJvb3QsIHRlcm1pbmF0ZSwgLi4uJycnCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgc2VydmVyPXsidXVpZCI6IHNlcnZlcl9pZCwgImFjdGlvbiI6YWN0aW9ufQorICAgIHdoZXJlPXsndXVpZCc6IHNlcnZlcl9pZH0KKyAgICBpZiB0ZW5hbnRfaWQhPSdhbnknOgorICAgICAgICB3aGVyZVsndGVuYW50X2lkJ109IHRlbmFudF9pZAorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF90YWJsZShGUk9NPSdpbnN0YW5jZXMnLCBXSEVSRT13aGVyZSkKKyAgICBpZiByZXN1bHQgPT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTm90X0ZvdW5kLCAic2VydmVyICVzIG5vdCBmb3VuZCIgJSBzZXJ2ZXJfaWQpCisgICAgICAgIHJldHVybgorICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgIHByaW50ICJodHRwX3Bvc3Rfc2VydmVyX2FjdGlvbiBlcnJvciBnZXR0aW5nIGRhdGEgJWQgJXMiICUgKHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfSW50ZXJuYWxfU2VydmVyX0Vycm9yLCBjb250ZW50KQorICAgICAgICByZXR1cm4KKyAgICBzZXJ2ZXIudXBkYXRlKGNvbnRlbnRbMF0pCisgICAgdGVuYW50X2lkID0gc2VydmVyWyJ0ZW5hbnRfaWQiXQorCisgICAgI1RPRE8gY2hlY2sgYSByaWdodCBjb250ZW50CisgICAgbmV3X3N0YXR1cyA9IE5vbmUKKyAgICBpZiAndGVybWluYXRlJyBpbiBhY3Rpb246CisgICAgICAgIG5ld19zdGF0dXM9J0RFTEVUSU5HJworICAgIGVsaWYgc2VydmVyWydzdGF0dXMnXSA9PSAnRVJST1InOiAjb3Igc2VydmVyWydzdGF0dXMnXSA9PSAnQ1JFQVRJTkcnOgorICAgICAgICBpZiAndGVybWluYXRlJyBub3QgaW4gYWN0aW9uIGFuZCAncmVidWlsZCcgbm90IGluIGFjdGlvbjoKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX01ldGhvZF9Ob3RfQWxsb3dlZCwgIlNlcnZlciBpcyBpbiBFUlJPUiBzdGF0dXMsIG11c3QgYmUgcmVidWl0IG9yIGRlbGV0ZWQgIikKKyAgICAgICAgICAgIHJldHVybgorIyAgICAgZWxpZiBzZXJ2ZXJbJ3N0YXR1cyddID09ICdJTkFDVElWRSc6CisjICAgICAgICAgaWYgJ3N0YXJ0JyBub3QgaW4gYWN0aW9uIGFuZCAnY3JlYXRlSW1hZ2UnIG5vdCBpbiBhY3Rpb246CisjICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX01ldGhvZF9Ob3RfQWxsb3dlZCwgIlRoZSBvbmx5IHBvc3NpYmxlIGFjdGlvbiBvdmVyIGFuIGluc3RhbmNlIGluICdJTkFDVElWRScgc3RhdHVzIGlzICdzdGFydCciKQorIyAgICAgICAgICAgICByZXR1cm4KKyMgICAgICAgICBpZiAnc3RhcnQnIGluIGFjdGlvbjoKKyMgICAgICAgICAgICAgbmV3X3N0YXR1cz0nQ1JFQVRJTkcnCisjICAgICAgICAgICAgIHNlcnZlclsncGF1c2VkJ109J25vJworIyAgICAgZWxpZiBzZXJ2ZXJbJ3N0YXR1cyddID09ICdQQVVTRUQnOgorIyAgICAgICAgIGlmICdyZXN1bWUnIG5vdCBpbiBhY3Rpb246CisjICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX01ldGhvZF9Ob3RfQWxsb3dlZCwgIlRoZSBvbmx5IHBvc3NpYmxlIGFjdGlvbiBvdmVyIGFuIGluc3RhbmNlIGluICdQQVVTRUQnIHN0YXR1cyBpcyAncmVzdW1lJyIpCisjICAgICAgICAgICAgIHJldHVybgorIyAgICAgZWxpZiBzZXJ2ZXJbJ3N0YXR1cyddID09ICdBQ1RJVkUnOgorIyAgICAgICAgIGlmICdwYXVzZScgbm90IGluIGFjdGlvbiBhbmQgJ3JlYm9vdCdub3QgaW4gYWN0aW9uIGFuZCAnc2h1dG9mZidub3QgaW4gYWN0aW9uOgorIyAgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9NZXRob2RfTm90X0FsbG93ZWQsICJUaGUgb25seSBwb3NzaWJsZSBhY3Rpb24gb3ZlciBhbiBpbnN0YW5jZSBpbiAnQUNUSVZFJyBzdGF0dXMgaXMgJ3BhdXNlJywncmVib290JyBvciAnc2h1dG9mZiciKQorIyAgICAgICAgICAgICByZXR1cm4KKworICAgIGlmICdzdGFydCcgaW4gYWN0aW9uIG9yICdjcmVhdGVJbWFnZScgaW4gYWN0aW9uIG9yICdyZWJ1aWxkJyBpbiBhY3Rpb246CisgICAgICAgICNjaGVjayBpbWFnZSB2YWxpZCBhbmQgdGFrZSBpbmZvCisgICAgICAgIGltYWdlX2lkID0gc2VydmVyWydpbWFnZV9pZCddCisgICAgICAgIGlmICdjcmVhdGVJbWFnZScgaW4gYWN0aW9uOgorICAgICAgICAgICAgaWYgJ2ltYWdlUmVmJyBpbiBhY3Rpb25bJ2NyZWF0ZUltYWdlJ106CisgICAgICAgICAgICAgICAgaW1hZ2VfaWQgPSBhY3Rpb25bJ2NyZWF0ZUltYWdlJ11bJ2ltYWdlUmVmJ10KKyAgICAgICAgICAgIGVsaWYgJ2Rpc2snIGluIGFjdGlvblsnY3JlYXRlSW1hZ2UnXToKKyAgICAgICAgICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoRlJPTT0naW5zdGFuY2VfZGV2aWNlcycsCisgICAgICAgICAgICAgICAgICAgIFNFTEVDVD0oJ2ltYWdlX2lkJywnZGV2JyksIFdIRVJFPXsnaW5zdGFuY2VfaWQnOnNlcnZlclsndXVpZCddLCJ0eXBlIjoiZGlzayJ9KQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdDw9MDoKKyAgICAgICAgICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTm90X0ZvdW5kLCAnZGlzayBub3QgZm91bmQgZm9yIHNlcnZlcicpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsaWYgcmVzdWx0PjE6CisgICAgICAgICAgICAgICAgICAgIGRpc2tfaWQ9Tm9uZQorICAgICAgICAgICAgICAgICAgICBpZiBhY3Rpb25bJ2NyZWF0ZUltYWdlJ11bJ2ltYWdlUmVmJ11bJ2Rpc2snXSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRpc2sgaW4gY29udGVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkaXNrWydkZXYnXSA9PSBhY3Rpb25bJ2NyZWF0ZUltYWdlJ11bJ2ltYWdlUmVmJ11bJ2Rpc2snXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlza19pZCA9IGRpc2tbJ2ltYWdlX2lkJ10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpc2tfaWQgPT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsICdkaXNrICVzIG5vdCBmb3VuZCBmb3Igc2VydmVyJyAlIGFjdGlvblsnY3JlYXRlSW1hZ2UnXVsnaW1hZ2VSZWYnXVsnZGlzayddKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTm90X0ZvdW5kLCAnbW9yZSB0aGFuIG9uZSBkaXNrIGZvdW5kIGZvciBzZXJ2ZXInICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBpbWFnZV9pZCA9IGRpc2tfaWQgICAgCisgICAgICAgICAgICAgICAgZWxzZTogI3Jlc3VsdD09MQorICAgICAgICAgICAgICAgICAgICBpbWFnZV9pZCA9IGNvbnRlbnRbMF1bJ2ltYWdlX2lkJ10gICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF90YWJsZShGUk9NPSd0ZW5hbnRzX2ltYWdlcyBhcyB0aSBqb2luIGltYWdlcyBhcyBpIG9uIHRpLmltYWdlX2lkPWkudXVpZCcsCisgICAgICAgICAgICBTRUxFQ1Q9KCdwYXRoJywnbWV0YWRhdGEnKSwgV0hFUkU9eyd1dWlkJzppbWFnZV9pZCwgJ3RlbmFudF9pZCc6dGVuYW50X2lkLCAic3RhdHVzIjoiQUNUSVZFIn0pCisgICAgICAgIGlmIHJlc3VsdDw9MDoKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgJ2ltYWdlX2lkICVzIG5vdCBmb3VuZCBvciBub3QgQUNUSVZFJyAlIGltYWdlX2lkKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGNvbnRlbnRbMF1bJ21ldGFkYXRhJ10gaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBqc29uLmxvYWRzKGNvbnRlbnRbMF1bJ21ldGFkYXRhJ10pCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1IVFRQX0ludGVybmFsX1NlcnZlcl9FcnJvciwgIkNhbiBub3QgZGVjb2RlIGltYWdlIG1ldGFkYXRhIgorICAgICAgICAgICAgY29udGVudFswXVsnbWV0YWRhdGEnXT1tZXRhZGF0YQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udGVudFswXVsnbWV0YWRhdGEnXSA9IHt9CisgICAgICAgIHNlcnZlclsnaW1hZ2UnXT1jb250ZW50WzBdCisgICAgICAgIGlmICdjcmVhdGVJbWFnZScgaW4gYWN0aW9uOgorICAgICAgICAgICAgYWN0aW9uWydjcmVhdGVJbWFnZSddWydzb3VyY2UnXSA9IHsnaW1hZ2VfaWQnOiBpbWFnZV9pZCwgJ3BhdGgnOiBjb250ZW50WzBdWydwYXRoJ119CisgICAgaWYgJ2NyZWF0ZUltYWdlJyBpbiBhY3Rpb246CisgICAgICAgICNDcmVhdGUgYW4gZW50cnkgaW4gRGF0YWJhc2UgZm9yIHRoZSBuZXcgaW1hZ2UKKyAgICAgICAgbmV3X2ltYWdlPXsnc3RhdHVzJzonQlVJTEQnLCAncHJvZ3Jlc3MnOiAwIH0KKyAgICAgICAgbmV3X2ltYWdlX21ldGFkYXRhPWNvbnRlbnRbMF0KKyAgICAgICAgaWYgJ21ldGFkYXRhJyBpbiBzZXJ2ZXJbJ2ltYWdlJ10gYW5kIHNlcnZlclsnaW1hZ2UnXVsnbWV0YWRhdGEnXSAhPSBOb25lOgorICAgICAgICAgICAgbmV3X2ltYWdlX21ldGFkYXRhLnVwZGF0ZShzZXJ2ZXJbJ2ltYWdlJ11bJ21ldGFkYXRhJ10pCisgICAgICAgIG5ld19pbWFnZV9tZXRhZGF0YSA9IHsidXNlX2luY3JlbWVudGFsIjoibm8ifQorICAgICAgICBpZiAnbWV0YWRhdGEnIGluIGFjdGlvblsnY3JlYXRlSW1hZ2UnXToKKyAgICAgICAgICAgIG5ld19pbWFnZV9tZXRhZGF0YS51cGRhdGUoYWN0aW9uWydjcmVhdGVJbWFnZSddWydtZXRhZGF0YSddKQorICAgICAgICBuZXdfaW1hZ2VbJ21ldGFkYXRhJ10gPSBqc29uLmR1bXBzKG5ld19pbWFnZV9tZXRhZGF0YSkKKyAgICAgICAgbmV3X2ltYWdlWyduYW1lJ10gPSBhY3Rpb25bJ2NyZWF0ZUltYWdlJ10uZ2V0KCduYW1lJywgTm9uZSkKKyAgICAgICAgbmV3X2ltYWdlWydkZXNjcmlwdGlvbiddID0gYWN0aW9uWydjcmVhdGVJbWFnZSddLmdldCgnZGVzY3JpcHRpb24nLCBOb25lKQorICAgICAgICBuZXdfaW1hZ2VbJ3V1aWQnXT1teS5kYi5uZXdfdXVpZCgpCisgICAgICAgIGlmICdwYXRoJyBpbiBhY3Rpb25bJ2NyZWF0ZUltYWdlJ106CisgICAgICAgICAgICBuZXdfaW1hZ2VbJ3BhdGgnXSA9IGFjdGlvblsnY3JlYXRlSW1hZ2UnXVsncGF0aCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXdfaW1hZ2VbJ3BhdGgnXT0iL3Byb3Zpc2lvbmFsL3BhdGgvIiArIG5ld19pbWFnZVsndXVpZCddCisgICAgICAgIHJlc3VsdCwgaW1hZ2VfdXVpZCA9IG15LmRiLm5ld19pbWFnZShuZXdfaW1hZ2UsIHRlbmFudF9pZCkKKyAgICAgICAgaWYgcmVzdWx0PD0wOgorICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsICdFcnJvcjogJyArIGltYWdlX3V1aWQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VydmVyWyduZXdfaW1hZ2UnXSA9IG5ld19pbWFnZQorCisgICAgICAgICAgICAgICAgCisgICAgI1Byb2dyYW0gdGFzaworICAgIHIsYyA9IGNvbmZpZ19kaWNbJ2hvc3RfdGhyZWFkcyddWyBzZXJ2ZXJbJ2hvc3RfaWQnXSBdLmluc2VydF90YXNrKCAnaW5zdGFuY2UnLHNlcnZlciApCisgICAgaWYgcjwwOgorICAgICAgICBwcmludCAiVGFzayBxdWV1ZSBmdWxsIGF0IGhvc3QgIiwgc2VydmVyWydob3N0X2lkJ10KKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfUmVxdWVzdF9UaW1lb3V0LCBjKQorICAgIGlmICdjcmVhdGVJbWFnZScgaW4gYWN0aW9uIGFuZCByZXN1bHQgPj0gMDoKKyAgICAgICAgcmV0dXJuIGh0dHBfZ2V0X2ltYWdlX2lkKHRlbmFudF9pZCwgaW1hZ2VfdXVpZCkKKyAgICAKKyAgICAjVXBkYXRlIERCIG9ubHkgZm9yIENSRUFUSU5HIG9yIERFTEVUSU5HIHN0YXR1cworICAgIGRhdGE9eydyZXN1bHQnIDogJ2luIHByb2Nlc3MnfQorICAgIGlmIG5ld19zdGF0dXMgIT0gTm9uZSBhbmQgbmV3X3N0YXR1cyA9PSAnREVMRVRJTkcnOgorICAgICAgICBuZXRzPVtdCisgICAgICAgIHBvcnRzX3RvX2ZyZWU9W10KKyAgICAgICAgI2xvb2sgZm9yIGRoY3AgaXAgYWRkcmVzcyAKKyAgICAgICAgcjIsIGMyID0gbXkuZGIuZ2V0X3RhYmxlKEZST009InBvcnRzIiwgU0VMRUNUPVsibWFjIiwgIm5ldF9pZCJdLCBXSEVSRT17Imluc3RhbmNlX2lkIjogc2VydmVyX2lkfSkKKyAgICAgICAgcixjID0gbXkuZGIuZGVsZXRlX2luc3RhbmNlKHNlcnZlcl9pZCwgdGVuYW50X2lkLCBuZXRzLCBwb3J0c190b19mcmVlLCAicmVxdWVzdGVkIGJ5IGh0dHAiKQorICAgICAgICBmb3IgcG9ydCBpbiBwb3J0c190b19mcmVlOgorICAgICAgICAgICAgcjEsYzEgPSBjb25maWdfZGljWydob3N0X3RocmVhZHMnXVsgc2VydmVyWydob3N0X2lkJ10gXS5pbnNlcnRfdGFzayggJ3Jlc3RvcmUtaWZhY2UnLCpwb3J0ICkKKyAgICAgICAgICAgIGlmIHIxIDwgMDoKKyAgICAgICAgICAgICAgICBwcmludCAnIGh0dHBfcG9zdF9zZXJ2ZXJfYWN0aW9uIGVycm9yIGF0IHNlcnZlciBkZWxldGlvbiBFUlJPUiByZXNvcmUtaWZhY2UgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEnICsgIGMxCisgICAgICAgICAgICAgICAgZGF0YT17J3Jlc3VsdCcgOiAnZGVsZXRpbmcgaW4gcHJvY2VzcywgYnV0IGlmYWNlcyBjYW5ub3QgYmUgcmVzdG9yZWQhISEhISd9CisgICAgICAgIGZvciBuZXQgaW4gbmV0czoKKyAgICAgICAgICAgIHIxLGMxID0gY29uZmlnX2RpY1snb2ZfdGhyZWFkJ10uaW5zZXJ0X3Rhc2soInVwZGF0ZS1uZXQiLCBuZXQpCisgICAgICAgICAgICBpZiByMSA8IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgJyBodHRwX3Bvc3Rfc2VydmVyX2FjdGlvbiBlcnJvciBhdCBzZXJ2ZXIgZGVsZXRpb24gRVJST1IgVVBEQVRJTkcgTkVUUyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIScgKyAgYzEKKyAgICAgICAgICAgICAgICBkYXRhPXsncmVzdWx0JyA6ICdkZWxldGluZyBpbiBwcm9jZXNzLCBidXQgb3BlbmZsb3cgcnVsZXMgY2Fubm90IGJlIGRlbGV0ZWQhISEhISd9CisgICAgICAgICNsb29rIGZvciBkaGNwIGlwIGFkZHJlc3MgCisgICAgICAgIGlmIHIyID4wIGFuZCBjb25maWdfZGljLmdldCgiZGhjcF9zZXJ2ZXIiKToKKyAgICAgICAgICAgIGZvciBpZmFjZSBpbiBjMjoKKyAgICAgICAgICAgICAgICBpZiBpZmFjZVsibmV0X2lkIl0gaW4gY29uZmlnX2RpY1siZGhjcF9uZXRzIl06CisgICAgICAgICAgICAgICAgICAgIHIsYyA9IGNvbmZpZ19kaWNbJ2RoY3BfdGhyZWFkJ10uaW5zZXJ0X3Rhc2soImRlbCIsIGlmYWNlWyJtYWMiXSkKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJkaGNwIGluc2VydCBkZWwgdGFzayIKKyAgICAgICAgICAgICAgICAgICAgaWYgciA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnOmh0dHBfcG9zdF9zZXJ2ZXJzIEVSUk9SIFVQREFUSU5HIGRoY3Bfc2VydmVyICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhJyArICBjIAorCisgICAgcmV0dXJuIGZvcm1hdF9vdXQoZGF0YSkKKworCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnLzx0ZW5hbnRfaWQ+L3NlcnZlcnMvPHNlcnZlcl9pZD4nLCBtZXRob2Q9J0RFTEVURScpCitkZWYgaHR0cF9kZWxldGVfc2VydmVyX2lkKHRlbmFudF9pZCwgc2VydmVyX2lkKToKKyAgICAnJydkZWxldGUgYSBzZXJ2ZXInJycKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjY2hlY2sgdmFsaWQgdGVuYW50X2lkCisgICAgcmVzdWx0LGNvbnRlbnQgPSBjaGVja192YWxpZF90ZW5hbnQobXksIHRlbmFudF9pZCkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisKKyAgICByZXR1cm4gaHR0cF9zZXJ2ZXJfYWN0aW9uKHNlcnZlcl9pZCwgdGVuYW50X2lkLCB7InRlcm1pbmF0ZSI6Tm9uZX0gKQorCisgICAgCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy88dGVuYW50X2lkPi9zZXJ2ZXJzLzxzZXJ2ZXJfaWQ+L2FjdGlvbicsIG1ldGhvZD0nUE9TVCcpCitkZWYgaHR0cF9wb3N0X3NlcnZlcl9hY3Rpb24odGVuYW50X2lkLCBzZXJ2ZXJfaWQpOgorICAgICcnJ3Rha2UgYW4gYWN0aW9uIG92ZXIgYSBzZXJ2ZXInJycKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjY2hlY2sgdmFsaWQgdGVuYW50X2lkCisgICAgcmVzdWx0LGNvbnRlbnQgPSBjaGVja192YWxpZF90ZW5hbnQobXksIHRlbmFudF9pZCkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgYm90dGxlLmFib3J0KHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisgICAgaHR0cF9jb250ZW50ID0gZm9ybWF0X2luKCBzZXJ2ZXJfYWN0aW9uX3NjaGVtYSApCisgICAgI3IgPSByZW1vdmVfZXh0cmFfaXRlbXMoaHR0cF9jb250ZW50LCBzZXJ2ZXJfYWN0aW9uX3NjaGVtYSkKKyAgICAjaWYgciBpcyBub3QgTm9uZTogcHJpbnQgImh0dHBfcG9zdF9zZXJ2ZXJfYWN0aW9uOiBXYXJuaW5nOiByZW1vdmUgZXh0cmEgaXRlbXMgIiwgcgorICAgIAorICAgIHJldHVybiBodHRwX3NlcnZlcl9hY3Rpb24oc2VydmVyX2lkLCB0ZW5hbnRfaWQsIGh0dHBfY29udGVudCkKKworIworIyBORVRXT1JLUworIworCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnL25ldHdvcmtzJywgbWV0aG9kPSdHRVQnKQorZGVmIGh0dHBfZ2V0X25ldHdvcmtzKCk6CisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI29idGFpbiBkYXRhCisgICAgc2VsZWN0Xyx3aGVyZV8sbGltaXRfID0gZmlsdGVyX3F1ZXJ5X3N0cmluZyhib3R0bGUucmVxdWVzdC5xdWVyeSwgaHR0cDJkYl9uZXR3b3JrLAorICAgICAgICAgICAgKCdpZCcsJ25hbWUnLCd0ZW5hbnRfaWQnLCd0eXBlJywKKyAgICAgICAgICAgICAnc2hhcmVkJywncHJvdmlkZXI6dmxhbicsJ3N0YXR1cycsJ2xhc3RfZXJyb3InLCdhZG1pbl9zdGF0ZV91cCcsJ3Byb3ZpZGVyOnBoeXNpY2FsJykgKQorICAgICNUT0RPIHRlbXBvcmFsbHkgcmVtb3ZlIHRlbmFudF9pZAorICAgIGlmICJ0ZW5hbnRfaWQiIGluIHdoZXJlXzoKKyAgICAgICAgZGVsIHdoZXJlX1sidGVuYW50X2lkIl0KKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoU0VMRUNUPXNlbGVjdF8sIEZST009J25ldHMnLCBXSEVSRT13aGVyZV8sIExJTUlUPWxpbWl0XykKKyAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICBwcmludCAiaHR0cF9nZXRfbmV0d29ya3MgZXJyb3IgJWQgJXMiICUgKHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgZWxzZToKKyAgICAgICAgY29udmVydF9ib29sZWFuKGNvbnRlbnQsICgnc2hhcmVkJywgJ2FkbWluX3N0YXRlX3VwJywgJ2VuYWJsZV9kaGNwJykgKQorICAgICAgICBkZWxldGVfbnVsbHMoY29udGVudCkgICAgICAKKyAgICAgICAgY2hhbmdlX2tleXNfaHR0cDJkYihjb250ZW50LCBodHRwMmRiX25ldHdvcmssIHJldmVyc2U9VHJ1ZSkgIAorICAgICAgICBkYXRhPXsnbmV0d29ya3MnIDogY29udGVudH0KKyAgICAgICAgcmV0dXJuIGZvcm1hdF9vdXQoZGF0YSkKKworQGJvdHRsZS5yb3V0ZSh1cmxfYmFzZSArICcvbmV0d29ya3MvPG5ldHdvcmtfaWQ+JywgbWV0aG9kPSdHRVQnKQorZGVmIGh0dHBfZ2V0X25ldHdvcmtfaWQobmV0d29ya19pZCk6CisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI29idGFpbiBkYXRhCisgICAgd2hlcmVfID0gYm90dGxlLnJlcXVlc3QucXVlcnkKKyAgICB3aGVyZV9bJ3V1aWQnXSA9IG5ldHdvcmtfaWQKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoRlJPTT0nbmV0cycsIFdIRVJFPXdoZXJlXywgTElNSVQ9MTAwKQorCisgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgcHJpbnQgImh0dHBfZ2V0X25ldHdvcmtzX2lkIGVycm9yICVkICVzIiAlIChyZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgIGVsaWYgcmVzdWx0PT0wOgorICAgICAgICBwcmludCAiaHR0cF9nZXRfbmV0d29ya3NfaWQgbmV0d29yayAnJXMnIG5vdCBmb3VuZCIgJSBuZXR3b3JrX2lkCisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgJ25ldHdvcmsgJXMgbm90IGZvdW5kJyAlIG5ldHdvcmtfaWQpCisgICAgZWxzZToKKyAgICAgICAgY29udmVydF9ib29sZWFuKGNvbnRlbnQsICgnc2hhcmVkJywgJ2FkbWluX3N0YXRlX3VwJywgJ2VuYWxlX2RoY3AnKSApCisgICAgICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoY29udGVudCwgaHR0cDJkYl9uZXR3b3JrLCByZXZlcnNlPVRydWUpICAgICAgICAKKyAgICAgICAgI2dldCBwb3J0cworICAgICAgICByZXN1bHQsIHBvcnRzID0gbXkuZGIuZ2V0X3RhYmxlKEZST009J3BvcnRzJywgU0VMRUNUPSgndXVpZCBhcyBwb3J0X2lkJywpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRT17J25ldF9pZCc6IG5ldHdvcmtfaWR9LCBMSU1JVD0xMDApCisgICAgICAgIGlmIGxlbihwb3J0cykgPiAwOgorICAgICAgICAgICAgY29udGVudFswXVsncG9ydHMnXSA9IHBvcnRzCisgICAgICAgIGRlbGV0ZV9udWxscyhjb250ZW50WzBdKSAgICAgIAorICAgICAgICBkYXRhPXsnbmV0d29yaycgOiBjb250ZW50WzBdfQorICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy9uZXR3b3JrcycsIG1ldGhvZD0nUE9TVCcpCitkZWYgaHR0cF9wb3N0X25ldHdvcmtzKCk6CisgICAgJycnaW5zZXJ0IGEgbmV0d29yayBpbnRvIHRoZSBkYXRhYmFzZS4nJycKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjcGFyc2UgaW5wdXQgZGF0YQorICAgIGh0dHBfY29udGVudCA9IGZvcm1hdF9pbiggbmV0d29ya19uZXdfc2NoZW1hICkKKyAgICByID0gcmVtb3ZlX2V4dHJhX2l0ZW1zKGh0dHBfY29udGVudCwgbmV0d29ya19uZXdfc2NoZW1hKQorICAgIGlmIHIgaXMgbm90IE5vbmU6IHByaW50ICJodHRwX3Bvc3RfbmV0d29ya3M6IFdhcm5pbmc6IHJlbW92ZSBleHRyYSBpdGVtcyAiLCByCisgICAgY2hhbmdlX2tleXNfaHR0cDJkYihodHRwX2NvbnRlbnRbJ25ldHdvcmsnXSwgaHR0cDJkYl9uZXR3b3JrKQorICAgIG5ldHdvcms9aHR0cF9jb250ZW50WyduZXR3b3JrJ10KKyAgICAjY2hlY2sgdmFsaWQgdGVuYW50X2lkCisgICAgdGVuYW50X2lkPSBuZXR3b3JrLmdldCgndGVuYW50X2lkJykKKyAgICBpZiB0ZW5hbnRfaWQhPU5vbmU6CisgICAgICAgIHJlc3VsdCwgXyA9IG15LmRiLmdldF90YWJsZShGUk9NPSd0ZW5hbnRzJywgU0VMRUNUPSgndXVpZCcsKSwgV0hFUkU9eyd1dWlkJzogdGVuYW50X2lkLCJlbmFibGVkIjpUcnVlfSkKKyAgICAgICAgaWYgcmVzdWx0PD0wOgorICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTm90X0ZvdW5kLCAndGVuYW50ICVzIG5vdCBmb3VuZCBvciBub3QgZW5hYmxlZCcgJSB0ZW5hbnRfaWQpCisgICAgICAgICAgICByZXR1cm4KKyAgICBicmlkZ2VfbmV0ID0gTm9uZQorICAgICNjaGVjayB2YWxpZCBwYXJhbXMKKyAgICBuZXRfcHJvdmlkZXIgPSBuZXR3b3JrLmdldCgncHJvdmlkZXInKQorICAgIG5ldF90eXBlID0gICAgIG5ldHdvcmsuZ2V0KCd0eXBlJykKKyAgICBuZXRfdmxhbiA9ICAgICBuZXR3b3JrLmdldCgidmxhbiIpCisgICAgbmV0X2JpbmRfbmV0ID0gbmV0d29yay5nZXQoImJpbmRfbmV0IikKKyAgICBuZXRfYmluZF90eXBlPSBuZXR3b3JrLmdldCgiYmluZF90eXBlIikKKyAgICBuYW1lID0gbmV0d29ya1sibmFtZSJdCisgICAgCisgICAgI2NoZWNrIGlmIG5ldHdvcmsgbmFtZSBlbmRzIHdpdGggOjx2bGFuX3RhZz4gYW5kIG5ldHdvcmsgZXhpc3QgaW4gb3JkZXIgdG8gbWFrZSBhbmQgYXV0b21hdGVkIGJpbmRuaW5nCisgICAgdmxhbl9pbmRleCA9bmFtZS5yZmluZCgiOiIpCisgICAgaWYgbmV0X2JpbmRfbmV0PT1Ob25lIGFuZCBuZXRfYmluZF90eXBlPT1Ob25lIGFuZCB2bGFuX2luZGV4ID4gMTogCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZsYW5fdGFnID0gaW50KG5hbWVbdmxhbl9pbmRleCsxOl0pCisgICAgICAgICAgICBpZiB2bGFuX3RhZyA+MCBhbmQgdmxhbl90YWcgPCA0MDk2OgorICAgICAgICAgICAgICAgIG5ldF9iaW5kX25ldCA9IG5hbWVbOnZsYW5faW5kZXhdCisgICAgICAgICAgICAgICAgbmV0X2JpbmRfdHlwZSA9ICJ2bGFuOiIgKyBuYW1lW3ZsYW5faW5kZXgrMTpdCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MgCisgICAgICAgIAorICAgIGlmIG5ldF9iaW5kX25ldCAhPSBOb25lOgorICAgICAgICAjbG9vayBmb3IgYSB2YWxpZCBuZXQKKyAgICAgICAgaWYgY2hlY2tfdmFsaWRfdXVpZChuZXRfYmluZF9uZXQpOgorICAgICAgICAgICAgbmV0X2JpbmRfa2V5ID0gInV1aWQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXRfYmluZF9rZXkgPSAibmFtZSIKKyAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZ2V0X3RhYmxlKEZST009J25ldHMnLCBXSEVSRT17bmV0X2JpbmRfa2V5OiBuZXRfYmluZF9uZXR9ICkKKyAgICAgICAgaWYgcmVzdWx0PDA6CisgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9JbnRlcm5hbF9TZXJ2ZXJfRXJyb3IsICdnZXR0aW5nIG5ldHMgZnJvbSBkYiAnICsgY29udGVudCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHJlc3VsdD09MDoKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCAiYmluZF9uZXQgJXMgJyVzJ25vdCBmb3VuZCIgJSAobmV0X2JpbmRfa2V5LCBuZXRfYmluZF9uZXQpICkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHJlc3VsdD4xOgorICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsICJtb3JlIHRoYW4gb25lIGJpbmRfbmV0ICVzICclcycgZm91bmQsIHVzZSB1dWlkIiAlIChuZXRfYmluZF9rZXksIG5ldF9iaW5kX25ldCkgKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5ldHdvcmtbImJpbmRfbmV0Il0gPSBjb250ZW50WzBdWyJ1dWlkIl0KKyAgICBpZiBuZXRfYmluZF90eXBlICE9IE5vbmU6CisgICAgICAgIGlmIG5ldF9iaW5kX3R5cGVbMDo1XSAhPSAidmxhbjoiOgorICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsICJiYWQgZm9ybWF0IGZvciAnYmluZF90eXBlJywgbXVzdCBiZSAndmxhbjo8dGFnPiciKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGludChuZXRfYmluZF90eXBlWzU6XSkgPiA0MDk1IG9yIGludChuZXRfYmluZF90eXBlWzU6XSk8PTAgOgorICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsICJiYWQgZm9ybWF0IGZvciAnYmluZF90eXBlJywgbXVzdCBiZSAndmxhbjo8dGFnPicgd2l0aCBhIHRhZyBiZXR3ZWVuIDEgYW5kIDQwOTUiKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5ldHdvcmtbImJpbmRfdHlwZSJdID0gbmV0X2JpbmRfdHlwZQorICAgIAorICAgIGlmIG5ldF9wcm92aWRlciE9Tm9uZToKKyAgICAgICAgaWYgbmV0X3Byb3ZpZGVyWzo5XT09Im9wZW5mbG93OiI6CisgICAgICAgICAgICBpZiBuZXRfdHlwZSE9Tm9uZToKKyAgICAgICAgICAgICAgICBpZiBuZXRfdHlwZSE9InB0cCIgYW5kIG5ldF90eXBlIT0iZGF0YSI6CisgICAgICAgICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCAiT25seSAncHRwJyBvciAnZGF0YScgbmV0IHR5cGVzIGNhbiBiZSBib3VuZCB0byAnb3BlbmZsb3cnIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV0X3R5cGU9J2RhdGEnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBuZXRfdHlwZSE9Tm9uZToKKyAgICAgICAgICAgICAgICBpZiBuZXRfdHlwZSE9ImJyaWRnZV9tYW4iIGFuZCBuZXRfdHlwZSE9ImJyaWRnZV9kYXRhIjoKKyAgICAgICAgICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsICJPbmx5ICdicmlkZ2VfbWFuJyBvciAnYnJpZGdlX2RhdGEnIG5ldCB0eXBlcyBjYW4gYmUgYm91bmQgdG8gJ2JyaWRnZScsICdtYWN2dGFwJyBvciAnZGVmYXVsdCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ldF90eXBlPSdicmlkZ2VfbWFuJworICAgIAorICAgIGlmIG5ldF90eXBlPT1Ob25lOgorICAgICAgICBuZXRfdHlwZT0nYnJpZGdlX21hbicgCisgICAgICAgIAorICAgIGlmIG5ldF9wcm92aWRlciAhPSBOb25lOgorICAgICAgICBpZiBuZXRfcHJvdmlkZXJbOjddPT0nYnJpZGdlOic6CisgICAgICAgICAgICAjY2hlY2sgaXQgaXMgb25lIG9mIHRoZSBwcmUtcHJvdmlzaW9uZWQgYnJpZGdlcworICAgICAgICAgICAgYnJpZGdlX25ldF9uYW1lID0gbmV0X3Byb3ZpZGVyWzc6XQorICAgICAgICAgICAgZm9yIGJybmV0IGluIGNvbmZpZ19kaWNbJ2JyaWRnZV9uZXRzJ106CisgICAgICAgICAgICAgICAgaWYgYnJuZXRbMF09PWJyaWRnZV9uZXRfbmFtZTogIyBmcmVlCisgICAgICAgICAgICAgICAgICAgIGlmIGJybmV0WzNdICE9IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Db25mbGljdCwgImludmFsaWQgJ3Byb3ZpZGVyOnBoeXNpY2FsJywgYnJpZGdlICclcycgaXMgYWxyZWFkeSB1c2VkIiAlIGJyaWRnZV9uZXRfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBicmlkZ2VfbmV0PWJybmV0CisgICAgICAgICAgICAgICAgICAgIG5ldF92bGFuID0gYnJuZXRbMV0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyMgICAgICAgICAgICBpZiBicmlkZ2VfbmV0PT1Ob25lOiAgICAgCisjICAgICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCAiaW52YWxpZCAncHJvdmlkZXI6cGh5c2ljYWwnLCBicmlkZ2UgJyVzJyBpcyBub3Qgb25lIG9mIHRoZSBwcm92aXNpb25lZCAnYnJpZGdlX2lmYWNlcycgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSIgJSBicmlkZ2VfbmV0X25hbWUpCisjICAgICAgICAgICAgICAgIHJldHVybgorICAgIGVsaWYgbmV0X3R5cGU9PSdicmlkZ2VfZGF0YScgb3IgbmV0X3R5cGU9PSdicmlkZ2VfbWFuJzoKKyAgICAgICAgI2xvb2sgZm9yIGEgZnJlZSBwcmVjcmVhdGVkIG5ldHMKKyAgICAgICAgZm9yIGJybmV0IGluIGNvbmZpZ19kaWNbJ2JyaWRnZV9uZXRzJ106CisgICAgICAgICAgICBpZiBicm5ldFszXT09Tm9uZTogIyBmcmVlCisgICAgICAgICAgICAgICAgaWYgYnJpZGdlX25ldCAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiBuZXRfdHlwZT09J2JyaWRnZV9tYW4nOiAjbG9vayBmb3IgdGhlIHNtYWxsZXIgc3BlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJybmV0WzJdIDwgYnJpZGdlX25ldFsyXTogICBicmlkZ2VfbmV0ID0gYnJuZXQKKyAgICAgICAgICAgICAgICAgICAgZWxzZTogI2xvb2sgZm9yIHRoZSBsYXJnZXIgc3BlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJybmV0WzJdID4gYnJpZGdlX25ldFsyXTogICBicmlkZ2VfbmV0ID0gYnJuZXQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmlkZ2VfbmV0ID0gYnJuZXQKKyAgICAgICAgICAgICAgICAgICAgbmV0X3ZsYW4gPSBicm5ldFsxXQorICAgICAgICBpZiBicmlkZ2VfbmV0PT1Ob25lOgorICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsICJNYXggbGltaXRzIG9mIGJyaWRnZSBuZXR3b3JrcyByZWFjaGVkLiBGdXR1cmUgdmVyc2lvbnMgb2YgVklNIHdpbGwgb3ZlcmNvbWUgdGhpcyBsaW1pdCIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJ1c2luZyBuZXQiLCBicmlkZ2VfbmV0CisgICAgICAgICAgICBuZXRfcHJvdmlkZXIgPSAiYnJpZGdlOiIrYnJpZGdlX25ldFswXQorICAgICAgICAgICAgbmV0X3ZsYW4gPSBicmlkZ2VfbmV0WzFdCisgICAgaWYgbmV0X3ZsYW49PU5vbmUgYW5kIChuZXRfdHlwZT09ImRhdGEiIG9yIG5ldF90eXBlPT0icHRwIik6CisgICAgICAgIG5ldF92bGFuID0gbXkuZGIuZ2V0X2ZyZWVfbmV0X3ZsYW4oKQorICAgICAgICBpZiBuZXRfdmxhbiA8IDA6CisgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9JbnRlcm5hbF9TZXJ2ZXJfRXJyb3IsICJFcnJvciBnZXR0aW5nIGFuIGF2YWlsYWJsZSB2bGFuIikKKyAgICAgICAgICAgIHJldHVybgorICAgIAorICAgIG5ldHdvcmtbJ3Byb3ZpZGVyJ10gPSBuZXRfcHJvdmlkZXIKKyAgICBuZXR3b3JrWyd0eXBlJ10gICAgID0gbmV0X3R5cGUKKyAgICBuZXR3b3JrWyd2bGFuJ10gICAgID0gbmV0X3ZsYW4KKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5uZXdfcm93KCduZXRzJywgbmV0d29yaywgVHJ1ZSwgVHJ1ZSkKKyAgICAKKyAgICBpZiByZXN1bHQgPj0gMDoKKyAgICAgICAgaWYgYnJpZGdlX25ldCE9Tm9uZToKKyAgICAgICAgICAgIGJyaWRnZV9uZXRbM10gPSBjb250ZW50CisgICAgICAgIAorICAgICAgICBpZiBjb25maWdfZGljLmdldCgiZGhjcF9zZXJ2ZXIiKToKKyAgICAgICAgICAgIGlmIG5ldHdvcmtbIm5hbWUiXSBpbiBjb25maWdfZGljWyJkaGNwX3NlcnZlciJdLmdldCgibmV0cyIsICgpICk6CisgICAgICAgICAgICAgICAgY29uZmlnX2RpY1siZGhjcF9uZXRzIl0uYXBwZW5kKGNvbnRlbnQpCisgICAgICAgICAgICAgICAgcHJpbnQgImRoY3Bfc2VydmVyOiBhZGQgbmV3IG5ldCIsIGNvbnRlbnQKKyAgICAgICAgICAgIGVsaWYgYnJpZGdlX25ldCAhPSBOb25lIGFuZCBicmlkZ2VfbmV0WzBdIGluIGNvbmZpZ19kaWNbImRoY3Bfc2VydmVyIl0uZ2V0KCJicmlkZ2VfaWZhY2VzIiwgKCkgKToKKyAgICAgICAgICAgICAgICBjb25maWdfZGljWyJkaGNwX25ldHMiXS5hcHBlbmQoY29udGVudCkKKyAgICAgICAgICAgICAgICBwcmludCAiZGhjcF9zZXJ2ZXI6IGFkZCBuZXcgbmV0IiwgY29udGVudAorICAgICAgICByZXR1cm4gaHR0cF9nZXRfbmV0d29ya19pZChjb250ZW50KQorICAgIGVsc2U6CisgICAgICAgIHByaW50ICJodHRwX3Bvc3RfbmV0d29ya3MgZXJyb3IgJWQgJXMiICUgKHJlc3VsdCwgY29udGVudCkKKyAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIHJldHVybgorCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnL25ldHdvcmtzLzxuZXR3b3JrX2lkPicsIG1ldGhvZD0nUFVUJykKK2RlZiBodHRwX3B1dF9uZXR3b3JrX2lkKG5ldHdvcmtfaWQpOgorICAgICcnJ3VwZGF0ZSBhIG5ldHdvcmtfaWQgaW50byB0aGUgZGF0YWJhc2UuJycnCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI3BhcnNlIGlucHV0IGRhdGEKKyAgICBodHRwX2NvbnRlbnQgPSBmb3JtYXRfaW4oIG5ldHdvcmtfdXBkYXRlX3NjaGVtYSApCisgICAgciA9IHJlbW92ZV9leHRyYV9pdGVtcyhodHRwX2NvbnRlbnQsIG5ldHdvcmtfdXBkYXRlX3NjaGVtYSkKKyAgICBjaGFuZ2Vfa2V5c19odHRwMmRiKGh0dHBfY29udGVudFsnbmV0d29yayddLCBodHRwMmRiX25ldHdvcmspCisgICAgbmV0d29yaz1odHRwX2NvbnRlbnRbJ25ldHdvcmsnXQorCisgICAgI0xvb2sgZm9yIHRoZSBwcmV2aW91cyBkYXRhCisgICAgd2hlcmVfID0geyd1dWlkJzogbmV0d29ya19pZH0KKyAgICByZXN1bHQsIG5ldHdvcmtfb2xkID0gbXkuZGIuZ2V0X3RhYmxlKEZST009J25ldHMnLCBXSEVSRT13aGVyZV8pCisgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgcHJpbnQgImh0dHBfcHV0X25ldHdvcmtfaWQgZXJyb3IgJWQgJXMiICUgKHJlc3VsdCwgbmV0d29ya19vbGQpCisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBuZXR3b3JrX29sZCkKKyAgICAgICAgcmV0dXJuCisgICAgZWxpZiByZXN1bHQ9PTA6CisgICAgICAgIHByaW50ICJodHRwX3B1dF9uZXR3b3JrX2lkIG5ldHdvcmsgJyVzJyBub3QgZm91bmQiICUgbmV0d29ya19pZAorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsICduZXR3b3JrICVzIG5vdCBmb3VuZCcgJSBuZXR3b3JrX2lkKQorICAgICAgICByZXR1cm4KKyAgICAjZ2V0IHBvcnRzCisgICAgbmJwb3J0cywgY29udGVudCA9IG15LmRiLmdldF90YWJsZShGUk9NPSdwb3J0cycsIFNFTEVDVD0oJ3V1aWQgYXMgcG9ydF9pZCcsKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkU9eyduZXRfaWQnOiBuZXR3b3JrX2lkfSwgTElNSVQ9MTAwKQorICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgIHByaW50ICJodHRwX3B1dF9uZXR3b3JrX2lkIGVycm9yICVkICVzIiAlIChyZXN1bHQsIG5ldHdvcmtfb2xkKQorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisgICAgaWYgbmJwb3J0cz4wOgorICAgICAgICBpZiAndHlwZScgaW4gbmV0d29yayBhbmQgbmV0d29ya1sndHlwZSddICE9IG5ldHdvcmtfb2xkWzBdWyd0eXBlJ106CisgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9NZXRob2RfTm90X0FsbG93ZWQsICJDYW4gbm90IGNoYW5nZSB0eXBlIG9mIG5ldHdvcmsgd2hpbGUgaGF2aW5nIHBvcnRzIGF0dGFjaGVkIikKKyAgICAgICAgaWYgJ3ZsYW4nIGluIG5ldHdvcmsgYW5kIG5ldHdvcmtbJ3ZsYW4nXSAhPSBuZXR3b3JrX29sZFswXVsndmxhbiddOgorICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfTWV0aG9kX05vdF9BbGxvd2VkLCAiQ2FuIG5vdCBjaGFuZ2UgdmxhbiBvZiBuZXR3b3JrIHdoaWxlIGhhdmluZyBwb3J0cyBhdHRhY2hlZCIpCisKKyAgICAjY2hlY2sgdmFsaWQgcGFyYW1zCisgICAgbmV0X3Byb3ZpZGVyID0gbmV0d29yay5nZXQoJ3Byb3ZpZGVyJywgbmV0d29ya19vbGRbMF1bJ3Byb3ZpZGVyJ10pCisgICAgbmV0X3R5cGUgICAgID0gbmV0d29yay5nZXQoJ3R5cGUnLCBuZXR3b3JrX29sZFswXVsndHlwZSddKQorICAgIG5ldF9iaW5kX25ldCA9IG5ldHdvcmsuZ2V0KCJiaW5kX25ldCIpCisgICAgbmV0X2JpbmRfdHlwZT0gbmV0d29yay5nZXQoImJpbmRfdHlwZSIpCisgICAgaWYgbmV0X2JpbmRfbmV0ICE9IE5vbmU6CisgICAgICAgICNsb29rIGZvciBhIHZhbGlkIG5ldAorICAgICAgICBpZiBjaGVja192YWxpZF91dWlkKG5ldF9iaW5kX25ldCk6CisgICAgICAgICAgICBuZXRfYmluZF9rZXkgPSAidXVpZCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ldF9iaW5kX2tleSA9ICJuYW1lIgorICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoRlJPTT0nbmV0cycsIFdIRVJFPXtuZXRfYmluZF9rZXk6IG5ldF9iaW5kX25ldH0gKQorICAgICAgICBpZiByZXN1bHQ8MDoKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0ludGVybmFsX1NlcnZlcl9FcnJvciwgJ2dldHRpbmcgbmV0cyBmcm9tIGRiICcgKyBjb250ZW50KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgcmVzdWx0PT0wOgorICAgICAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfQmFkX1JlcXVlc3QsICJiaW5kX25ldCAlcyAnJXMnbm90IGZvdW5kIiAlIChuZXRfYmluZF9rZXksIG5ldF9iaW5kX25ldCkgKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgcmVzdWx0PjE6CisgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgIm1vcmUgdGhhbiBvbmUgYmluZF9uZXQgJXMgJyVzJyBmb3VuZCwgdXNlIHV1aWQiICUgKG5ldF9iaW5kX2tleSwgbmV0X2JpbmRfbmV0KSApCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbmV0d29ya1siYmluZF9uZXQiXSA9IGNvbnRlbnRbMF1bInV1aWQiXQorICAgIGlmIG5ldF9iaW5kX3R5cGUgIT0gTm9uZToKKyAgICAgICAgaWYgbmV0X2JpbmRfdHlwZVswOjVdICE9ICJ2bGFuOiI6CisgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgImJhZCBmb3JtYXQgZm9yICdiaW5kX3R5cGUnLCBtdXN0IGJlICd2bGFuOjx0YWc+JyIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgaW50KG5ldF9iaW5kX3R5cGVbNTpdKSA+IDQwOTUgb3IgaW50KG5ldF9iaW5kX3R5cGVbNTpdKTw9MCA6CisgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgImJhZCBmb3JtYXQgZm9yICdiaW5kX3R5cGUnLCBtdXN0IGJlICd2bGFuOjx0YWc+JyB3aXRoIGEgdGFnIGJldHdlZW4gMSBhbmQgNDA5NSIpCisgICAgICAgICAgICByZXR1cm4KKyAgICBpZiBuZXRfcHJvdmlkZXIhPU5vbmU6CisgICAgICAgIGlmIG5ldF9wcm92aWRlcls6OV09PSJvcGVuZmxvdzoiOgorICAgICAgICAgICAgaWYgbmV0X3R5cGUhPSJwdHAiIGFuZCBuZXRfdHlwZSE9ImRhdGEiOgorICAgICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0JhZF9SZXF1ZXN0LCAiT25seSAncHRwJyBvciAnZGF0YScgbmV0IHR5cGVzIGNhbiBiZSBib3VuZCB0byAnb3BlbmZsb3cnIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5ldF90eXBlIT0iYnJpZGdlX21hbiIgYW5kIG5ldF90eXBlIT0iYnJpZGdlX2RhdGEiOgorICAgICAgICAgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgIk9ubHkgJ2JyaWRnZV9tYW4nIG9yICdicmlkZ2VfZGF0YScgbmV0IHR5cGVzIGNhbiBiZSBib3VuZCB0byAnYnJpZGdlJywgJ21hY3Z0YXAnIG9yICdkZWZhdWx0IikKKworICAgICNpbnNlcnQgaW4gZGF0YSBiYXNlCisgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIudXBkYXRlX3Jvd3MoJ25ldHMnLCBuZXR3b3JrLCBXSEVSRT17J3V1aWQnOiBuZXR3b3JrX2lkfSwgbG9nPVRydWUgKQorICAgIGlmIHJlc3VsdCA+PSAwOgorICAgICAgICBpZiByZXN1bHQ+MDogIyBhbmQgbmJwb3J0cz4wIGFuZCAnYWRtaW5fc3RhdGVfdXAnIGluIG5ldHdvcmsgYW5kIG5ldHdvcmtbJ2FkbWluX3N0YXRlX3VwJ10gIT0gbmV0d29ya19vbGRbMF1bJ2FkbWluX3N0YXRlX3VwJ106CisgICAgICAgICAgICByLGMgPSBjb25maWdfZGljWydvZl90aHJlYWQnXS5pbnNlcnRfdGFzaygidXBkYXRlLW5ldCIsIG5ldHdvcmtfaWQpCisgICAgICAgICAgICBpZiByICA8IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgImh0dHBfcHV0X25ldHdvcmtfaWQgZXJyb3Igd2hpbGUgbGF1bmNoaW5nIG9wZW5mbG93IHJ1bGVzIgorICAgICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0ludGVybmFsX1NlcnZlcl9FcnJvciwgYykKKyAgICAgICAgICAgIGlmIGNvbmZpZ19kaWMuZ2V0KCJkaGNwX3NlcnZlciIpOgorICAgICAgICAgICAgICAgIGlmIG5ldHdvcmtfaWQgaW4gY29uZmlnX2RpY1siZGhjcF9uZXRzIl06CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19kaWNbImRoY3BfbmV0cyJdLnJlbW92ZShuZXR3b3JrX2lkKQorICAgICAgICAgICAgICAgICAgICBwcmludCAiZGhjcF9zZXJ2ZXI6IGRlbGV0ZSBuZXQiLCBuZXR3b3JrX2lkCisgICAgICAgICAgICAgICAgaWYgbmV0d29yay5nZXQoIm5hbWUiLCBuZXR3b3JrX29sZFsibmFtZSJdKSBpbiBjb25maWdfZGljWyJkaGNwX3NlcnZlciJdLmdldCgibmV0cyIsICgpICk6CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19kaWNbImRoY3BfbmV0cyJdLmFwcGVuZChuZXR3b3JrX2lkKQorICAgICAgICAgICAgICAgICAgICBwcmludCAiZGhjcF9zZXJ2ZXI6IGFkZCBuZXcgbmV0IiwgbmV0d29ya19pZAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5ldF9iaW5kID0gbmV0d29yay5nZXQoImJpbmQiLCBuZXR3b3JrX29sZFsiYmluZCJdICkKKyAgICAgICAgICAgICAgICAgICAgaWYgbmV0X2JpbmQgYW5kIG5ldF9iaW5kWzo3XT09ImJyaWRnZToiIGFuZCBuZXRfYmluZFs3Ol0gaW4gY29uZmlnX2RpY1siZGhjcF9zZXJ2ZXIiXS5nZXQoImJyaWRnZV9pZmFjZXMiLCAoKSApOgorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2RpY1siZGhjcF9uZXRzIl0uYXBwZW5kKG5ldHdvcmtfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiZGhjcF9zZXJ2ZXI6IGFkZCBuZXcgbmV0IiwgbmV0d29ya19pZAorICAgICAgICByZXR1cm4gaHR0cF9nZXRfbmV0d29ya19pZChuZXR3b3JrX2lkKQorICAgIGVsc2U6CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKworICAKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnL25ldHdvcmtzLzxuZXR3b3JrX2lkPicsIG1ldGhvZD0nREVMRVRFJykKK2RlZiBodHRwX2RlbGV0ZV9uZXR3b3JrX2lkKG5ldHdvcmtfaWQpOgorICAgICcnJ2RlbGV0ZSBhIG5ldHdvcmtfaWQgZnJvbSB0aGUgZGF0YWJhc2UuJycnCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisKKyAgICAjZGVsZXRlIGZyb20gdGhlIGRhdGEgYmFzZQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmRlbGV0ZV9yb3coJ25ldHMnLCBuZXR3b3JrX2lkICkKKyAgIAorICAgIGlmIHJlc3VsdCA9PSAwOgorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsIGNvbnRlbnQpCisgICAgZWxpZiByZXN1bHQgPjA6CisgICAgICAgIGZvciBicm5ldCBpbiBjb25maWdfZGljWydicmlkZ2VfbmV0cyddOgorICAgICAgICAgICAgaWYgYnJuZXRbM109PW5ldHdvcmtfaWQ6CisgICAgICAgICAgICAgICAgYnJuZXRbM109Tm9uZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGNvbmZpZ19kaWMuZ2V0KCJkaGNwX3NlcnZlciIpIGFuZCBuZXR3b3JrX2lkIGluIGNvbmZpZ19kaWNbImRoY3BfbmV0cyJdOgorICAgICAgICAgICAgY29uZmlnX2RpY1siZGhjcF9uZXRzIl0ucmVtb3ZlKG5ldHdvcmtfaWQpCisgICAgICAgICAgICBwcmludCAiZGhjcF9zZXJ2ZXI6IGRlbGV0ZSBuZXQiLCBuZXR3b3JrX2lkCisgICAgICAgIGRhdGE9eydyZXN1bHQnIDogY29udGVudH0KKyAgICAgICAgcmV0dXJuIGZvcm1hdF9vdXQoZGF0YSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiaHR0cF9kZWxldGVfbmV0d29ya19pZCBlcnJvciIscmVzdWx0LCBjb250ZW50CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKyMKKyMgT1BFTkZMT1cKKyMKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnL25ldHdvcmtzLzxuZXR3b3JrX2lkPi9vcGVuZmxvdycsIG1ldGhvZD0nR0VUJykKK2RlZiBodHRwX2dldF9vcGVuZmxvd19pZChuZXR3b3JrX2lkKToKKyAgICAnJydUbyBvYnRhaW4gdGhlIGxpc3Qgb2Ygb3BlbmZsb3cgcnVsZXMgb2YgYSBuZXR3b3JrCisgICAgJycnCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI2lnbm9yZSBpbnB1dCBkYXRhCisgICAgaWYgbmV0d29ya19pZD09J2FsbCc6CisgICAgICAgIHdoZXJlXz17fQorICAgIGVsc2U6CisgICAgICAgIHdoZXJlXz17Im5ldF9pZCI6IG5ldHdvcmtfaWR9CisgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZ2V0X3RhYmxlKFNFTEVDVD0oIm5hbWUiLCJuZXRfaWQiLCJwcmlvcml0eSIsInZsYW5faWQiLCJpbmdyZXNzX3BvcnQiLCJzcmNfbWFjIiwiZHN0X21hYyIsImFjdGlvbnMiKSwKKyAgICAgICAgICAgIFdIRVJFPXdoZXJlXywgRlJPTT0nb2ZfZmxvd3MnKQorICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKyAgICBkYXRhPXsnb3BlbmZsb3ctcnVsZXMnIDogY29udGVudH0KKyAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy9uZXR3b3Jrcy88bmV0d29ya19pZD4vb3BlbmZsb3cnLCBtZXRob2Q9J1BVVCcpCitkZWYgaHR0cF9wdXRfb3BlbmZsb3dfaWQobmV0d29ya19pZCk6CisgICAgJycnVG8gbWFrZSBhY3Rpb25zIG92ZXIgdGhlIG5ldC4gVGhlIGFjdGlvbiBpcyB0byByZWluc3RhbGwgdGhlIG9wZW5mbG93IHJ1bGVzCisgICAgbmV0d29ya19pZCBjYW4gYmUgJ2FsbCcKKyAgICAnJycKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICBpZiBub3QgbXkuYWRtaW46CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX1VuYXV0aG9yaXplZCwgIk5lZWRlZCBhZG1pbiBwcml2aWxlZ2VzIikKKyAgICAgICAgcmV0dXJuCisgICAgI2lnbm9yZSBpbnB1dCBkYXRhCisgICAgaWYgbmV0d29ya19pZD09J2FsbCc6CisgICAgICAgIHdoZXJlXz17fQorICAgIGVsc2U6CisgICAgICAgIHdoZXJlXz17InV1aWQiOiBuZXR3b3JrX2lkfQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF90YWJsZShTRUxFQ1Q9KCJ1dWlkIiwidHlwZSIpLCBXSEVSRT13aGVyZV8sIEZST009J25ldHMnKQorICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKyAgICAKKyAgICBmb3IgbmV0IGluIGNvbnRlbnQ6CisgICAgICAgIGlmIG5ldFsidHlwZSJdIT0icHRwIiBhbmQgbmV0WyJ0eXBlIl0hPSJkYXRhIjoKKyAgICAgICAgICAgIHJlc3VsdC09MQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcixjID0gY29uZmlnX2RpY1snb2ZfdGhyZWFkJ10uaW5zZXJ0X3Rhc2soInVwZGF0ZS1uZXQiLCBuZXRbJ3V1aWQnXSkKKyAgICAgICAgaWYgciAgPCAwOgorICAgICAgICAgICAgcHJpbnQgImh0dHBfcHV0X29wZW5mbG93X2lkIGVycm9yIHdoaWxlIGxhdW5jaGluZyBvcGVuZmxvdyBydWxlcyIKKyAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0ludGVybmFsX1NlcnZlcl9FcnJvciwgYykKKyAgICBkYXRhPXsncmVzdWx0JyA6IHN0cihyZXN1bHQpKyIgbmV0cyB1cGRhdGVzIn0KKyAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy9uZXR3b3Jrcy9vcGVuZmxvdy9jbGVhcicsIG1ldGhvZD0nREVMRVRFJykKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnL25ldHdvcmtzL2NsZWFyL29wZW5mbG93JywgbWV0aG9kPSdERUxFVEUnKQorZGVmIGh0dHBfY2xlYXJfb3BlbmZsb3dfcnVsZXMoKToKKyAgICAnJydUbyBtYWtlIGFjdGlvbnMgb3ZlciB0aGUgbmV0LiBUaGUgYWN0aW9uIGlzIHRvIGRlbGV0ZSBBTEwgb3BlbmZsb3cgcnVsZXMKKyAgICAnJycKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICBpZiBub3QgbXkuYWRtaW46CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX1VuYXV0aG9yaXplZCwgIk5lZWRlZCBhZG1pbiBwcml2aWxlZ2VzIikKKyAgICAgICAgcmV0dXJuCisgICAgI2lnbm9yZSBpbnB1dCBkYXRhCisgICAgcixjID0gY29uZmlnX2RpY1snb2ZfdGhyZWFkJ10uaW5zZXJ0X3Rhc2soImNsZWFyLWFsbCIpCisgICAgaWYgciAgPCAwOgorICAgICAgICBwcmludCAiaHR0cF9kZWxldGVfb3BlbmZsb3dfaWQgZXJyb3Igd2hpbGUgbGF1bmNoaW5nIG9wZW5mbG93IHJ1bGVzIgorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9JbnRlcm5hbF9TZXJ2ZXJfRXJyb3IsIGMpCisgICAgICAgIHJldHVybgorCisgICAgZGF0YT17J3Jlc3VsdCcgOiAiIENsZWFyaW5nIG9wZW5mbG93IHJ1bGVzIGluIHByb2Nlc3MifQorICAgIHJldHVybiBmb3JtYXRfb3V0KGRhdGEpCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnL25ldHdvcmtzL29wZW5mbG93L3BvcnRzJywgbWV0aG9kPSdHRVQnKQorZGVmIGh0dHBfZ2V0X29wZW5mbG93X3BvcnRzKCk6CisgICAgJycnT2J0YWluIHN3aXRjaCBwb3J0cyBuYW1lcyBvZiBvcGVuZmxvdyBjb250cm9sbGVyCisgICAgJycnCisgICAgZGF0YT17J3BvcnRzJyA6IGNvbmZpZ19kaWNbJ29mX3RocmVhZCddLk9GX2Nvbm5lY3Rvci5wcDJvZml9CisgICAgcmV0dXJuIGZvcm1hdF9vdXQoZGF0YSkKKworCisjCisjIFBPUlRTCisjCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnL3BvcnRzJywgbWV0aG9kPSdHRVQnKQorZGVmIGh0dHBfZ2V0X3BvcnRzKCk6CisgICAgI29idGFpbiBkYXRhCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgc2VsZWN0Xyx3aGVyZV8sbGltaXRfID0gZmlsdGVyX3F1ZXJ5X3N0cmluZyhib3R0bGUucmVxdWVzdC5xdWVyeSwgaHR0cDJkYl9wb3J0LAorICAgICAgICAgICAgKCdpZCcsJ25hbWUnLCd0ZW5hbnRfaWQnLCduZXR3b3JrX2lkJywndnBjaScsJ21hY19hZGRyZXNzJywnZGV2aWNlX293bmVyJywnZGV2aWNlX2lkJywKKyAgICAgICAgICAgICAnYmluZGluZzpzd2l0Y2hfcG9ydCcsJ2JpbmRpbmc6dmxhbicsJ2JhbmR3aWR0aCcsJ3N0YXR1cycsJ2FkbWluX3N0YXRlX3VwJywnaXBfYWRkcmVzcycpICkKKyAgICAjcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZ2V0X3BvcnRzKHdoZXJlXykKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoU0VMRUNUPXNlbGVjdF8sIFdIRVJFPXdoZXJlXywgRlJPTT0ncG9ydHMnLExJTUlUPWxpbWl0XykKKyAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICBwcmludCAiaHR0cF9nZXRfcG9ydHMgRXJyb3IiLCByZXN1bHQsIGNvbnRlbnQKKyAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgICAgIHJldHVybgorICAgIGVsc2U6CisgICAgICAgIGNvbnZlcnRfYm9vbGVhbihjb250ZW50LCAoJ2FkbWluX3N0YXRlX3VwJywpICkKKyAgICAgICAgZGVsZXRlX251bGxzKGNvbnRlbnQpICAgICAgCisgICAgICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoY29udGVudCwgaHR0cDJkYl9wb3J0LCByZXZlcnNlPVRydWUpCisgICAgICAgIGRhdGE9eydwb3J0cycgOiBjb250ZW50fQorICAgICAgICByZXR1cm4gZm9ybWF0X291dChkYXRhKQorCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy9wb3J0cy88cG9ydF9pZD4nLCBtZXRob2Q9J0dFVCcpCitkZWYgaHR0cF9nZXRfcG9ydF9pZChwb3J0X2lkKToKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICAjb2J0YWluIGRhdGEKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5nZXRfdGFibGUoV0hFUkU9eyd1dWlkJzogcG9ydF9pZH0sIEZST009J3BvcnRzJykKKyAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICBwcmludCAiaHR0cF9nZXRfcG9ydHMgZXJyb3IiLCByZXN1bHQsIGNvbnRlbnQKKyAgICAgICAgYm90dGxlLmFib3J0KC1yZXN1bHQsIGNvbnRlbnQpCisgICAgZWxpZiByZXN1bHQ9PTA6CisgICAgICAgIHByaW50ICJodHRwX2dldF9wb3J0cyBwb3J0ICclcycgbm90IGZvdW5kIiAlIHN0cihwb3J0X2lkKQorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Ob3RfRm91bmQsICdwb3J0ICVzIG5vdCBmb3VuZCcgJSBwb3J0X2lkKQorICAgIGVsc2U6CisgICAgICAgIGNvbnZlcnRfYm9vbGVhbihjb250ZW50LCAoJ2FkbWluX3N0YXRlX3VwJywpICkKKyAgICAgICAgZGVsZXRlX251bGxzKGNvbnRlbnQpICAgICAgCisgICAgICAgIGNoYW5nZV9rZXlzX2h0dHAyZGIoY29udGVudCwgaHR0cDJkYl9wb3J0LCByZXZlcnNlPVRydWUpCisgICAgICAgIGRhdGE9eydwb3J0JyA6IGNvbnRlbnRbMF19CisgICAgICAgIHJldHVybiBmb3JtYXRfb3V0KGRhdGEpCisgICAgCisKK0Bib3R0bGUucm91dGUodXJsX2Jhc2UgKyAnL3BvcnRzJywgbWV0aG9kPSdQT1NUJykKK2RlZiBodHRwX3Bvc3RfcG9ydHMoKToKKyAgICAnJydpbnNlcnQgYW4gZXh0ZXJuYWwgcG9ydCBpbnRvIHRoZSBkYXRhYmFzZS4nJycKKyAgICBteSA9IGNvbmZpZ19kaWNbJ2h0dHBfdGhyZWFkcyddWyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lIF0KKyAgICBpZiBub3QgbXkuYWRtaW46CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX1VuYXV0aG9yaXplZCwgIk5lZWRlZCBhZG1pbiBwcml2aWxlZ2VzIikKKyAgICAjcGFyc2UgaW5wdXQgZGF0YQorICAgIGh0dHBfY29udGVudCA9IGZvcm1hdF9pbiggcG9ydF9uZXdfc2NoZW1hICkKKyAgICByID0gcmVtb3ZlX2V4dHJhX2l0ZW1zKGh0dHBfY29udGVudCwgcG9ydF9uZXdfc2NoZW1hKQorICAgIGlmIHIgaXMgbm90IE5vbmU6IHByaW50ICJodHRwX3Bvc3RfcG9ydHM6IFdhcm5pbmc6IHJlbW92ZSBleHRyYSBpdGVtcyAiLCByCisgICAgY2hhbmdlX2tleXNfaHR0cDJkYihodHRwX2NvbnRlbnRbJ3BvcnQnXSwgaHR0cDJkYl9wb3J0KQorICAgIHBvcnQ9aHR0cF9jb250ZW50Wydwb3J0J10KKworICAgIHBvcnRbJ3R5cGUnXSA9ICdleHRlcm5hbCcKKyAgICBpZiAnbmV0X2lkJyBpbiBwb3J0IGFuZCBwb3J0WyduZXRfaWQnXSA9PSBOb25lOgorICAgICAgICBkZWwgcG9ydFsnbmV0X2lkJ10KKworICAgIGlmICduZXRfaWQnIGluIHBvcnQ6CisgICAgICAgICNjaGVjayB0aGF0IG5ldyBuZXQgaGFzIHRoZSBjb3JyZWN0IHR5cGUKKyAgICAgICAgcmVzdWx0LCBuZXdfbmV0ID0gbXkuZGIuY2hlY2tfdGFyZ2V0X25ldChwb3J0WyduZXRfaWQnXSwgTm9uZSwgJ2V4dGVybmFsJyApCisgICAgICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgbmV3X25ldCkKKyAgICAgICAgICAgIHJldHVybgorICAgICNpbnNlcnQgaW4gZGF0YSBiYXNlCisgICAgcmVzdWx0LCB1dWlkID0gbXkuZGIubmV3X3JvdygncG9ydHMnLCBwb3J0LCBUcnVlLCBUcnVlKQorICAgIGlmIHJlc3VsdCA+IDA6CisgICAgICAgIGlmICduZXRfaWQnIGluIHBvcnQ6IAorICAgICAgICAgICAgcixjID0gY29uZmlnX2RpY1snb2ZfdGhyZWFkJ10uaW5zZXJ0X3Rhc2soInVwZGF0ZS1uZXQiLCBwb3J0WyduZXRfaWQnXSkKKyAgICAgICAgICAgIGlmIHIgPCAwOgorICAgICAgICAgICAgICAgIHByaW50ICJodHRwX3Bvc3RfcG9ydHMgZXJyb3Igd2hpbGUgbGF1bmNoaW5nIG9wZW5mbG93IHJ1bGVzIgorICAgICAgICAgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX0ludGVybmFsX1NlcnZlcl9FcnJvciwgYykKKyAgICAgICAgcmV0dXJuIGh0dHBfZ2V0X3BvcnRfaWQodXVpZCkKKyAgICBlbHNlOgorICAgICAgICBib3R0bGUuYWJvcnQoLXJlc3VsdCwgdXVpZCkKKyAgICAgICAgcmV0dXJuCisgICAgCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy9wb3J0cy88cG9ydF9pZD4nLCBtZXRob2Q9J1BVVCcpCitkZWYgaHR0cF9wdXRfcG9ydF9pZChwb3J0X2lkKToKKyAgICAnJyd1cGRhdGUgYSBwb3J0X2lkIGludG8gdGhlIGRhdGFiYXNlLicnJworCisgICAgbXkgPSBjb25maWdfZGljWydodHRwX3RocmVhZHMnXVsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSBdCisgICAgI3BhcnNlIGlucHV0IGRhdGEKKyAgICBodHRwX2NvbnRlbnQgPSBmb3JtYXRfaW4oIHBvcnRfdXBkYXRlX3NjaGVtYSApCisgICAgY2hhbmdlX2tleXNfaHR0cDJkYihodHRwX2NvbnRlbnRbJ3BvcnQnXSwgaHR0cDJkYl9wb3J0KQorICAgIHBvcnRfZGljdD1odHRwX2NvbnRlbnRbJ3BvcnQnXQorCisgICAgI0xvb2sgZm9yIHRoZSBwcmV2aW91cyBwb3J0IGRhdGEKKyAgICB3aGVyZV8gPSB7J3V1aWQnOiBwb3J0X2lkfQorICAgIHJlc3VsdCwgY29udGVudCA9IG15LmRiLmdldF90YWJsZShGUk9NPSJwb3J0cyIsV0hFUkU9d2hlcmVfKQorICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgIHByaW50ICJodHRwX3B1dF9wb3J0X2lkIGVycm9yIiwgcmVzdWx0LCBjb250ZW50CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgICAgICByZXR1cm4KKyAgICBlbGlmIHJlc3VsdD09MDoKKyAgICAgICAgcHJpbnQgImh0dHBfcHV0X3BvcnRfaWQgcG9ydCAnJXMnIG5vdCBmb3VuZCIgJSBwb3J0X2lkCisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgJ3BvcnQgJXMgbm90IGZvdW5kJyAlIHBvcnRfaWQpCisgICAgICAgIHJldHVybgorICAgIHByaW50IHBvcnRfZGljdAorICAgIGZvciBrIGluICgndmxhbicsJ3N3aXRjaF9wb3J0JywnbWFjX2FkZHJlc3MnLCAndGVuYW50X2lkJyk6CisgICAgICAgIGlmIGsgaW4gcG9ydF9kaWN0IGFuZCBub3QgbXkuYWRtaW46CisgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9VbmF1dGhvcml6ZWQsICJOZWVkZWQgYWRtaW4gcHJpdmlsZWdlcyBmb3IgY2hhbmdpbmcgIiArIGspCisgICAgICAgICAgICByZXR1cm4KKyAgICAKKyAgICBwb3J0PWNvbnRlbnRbMF0KKyAgICAjY2hhbmdlX2tleXNfaHR0cDJkYihwb3J0LCBodHRwMmRiX3BvcnQsIHJldmVyc2U9VHJ1ZSkKKyAgICBuZXRzID0gW10KKyAgICBob3N0X2lkID0gTm9uZQorICAgIHJlc3VsdD0xCisgICAgaWYgJ25ldF9pZCcgaW4gcG9ydF9kaWN0OgorICAgICAgICAjY2hhbmdlIG9mIG5ldC4gCisgICAgICAgIG9sZF9uZXQgPSBwb3J0LmdldCgnbmV0X2lkJywgTm9uZSkKKyAgICAgICAgbmV3X25ldCA9IHBvcnRfZGljdFsnbmV0X2lkJ10KKyAgICAgICAgaWYgb2xkX25ldCAhPSBuZXdfbmV0OgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBuZXdfbmV0IGlzIG5vdCBOb25lOiBuZXRzLmFwcGVuZChuZXdfbmV0KSAjcHV0IGZpcnN0IHRoZSBuZXcgbmV0LCBzbyB0aGF0IG5ldyBvcGVuZmxvdyBydWxlcyBhcmUgY3JlYXRlZCBiZWZvcmUgcmVtb3ZpbmcgdGhlIG9sZCBvbmVzIAorICAgICAgICAgICAgaWYgb2xkX25ldCBpcyBub3QgTm9uZTogbmV0cy5hcHBlbmQob2xkX25ldCkKKyAgICAgICAgICAgIGlmIHBvcnRbJ3R5cGUnXSA9PSAnaW5zdGFuY2U6YnJpZGdlJzoKKyAgICAgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9Gb3JiaWRkZW4sICJicmlkZ2UgaW50ZXJmYWNlcyBjYW5ub3QgYmUgYXR0YWNoZWQgdG8gYSBkaWZmZXJlbnQgbmV0IikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsaWYgcG9ydFsndHlwZSddID09ICdleHRlcm5hbCc6CisgICAgICAgICAgICAgICAgaWYgbm90IG15LmFkbWluOgorICAgICAgICAgICAgICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9VbmF1dGhvcml6ZWQsICJOZWVkZWQgYWRtaW4gcHJpdmlsZWdlcyIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBuZXdfbmV0ICE9IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICNjaGVjayB0aGF0IG5ldyBuZXQgaGFzIHRoZSBjb3JyZWN0IHR5cGUKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBuZXdfbmV0X2RpY3QgPSBteS5kYi5jaGVja190YXJnZXRfbmV0KG5ld19uZXQsIE5vbmUsIHBvcnRbJ3R5cGUnXSApCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgI2NoYW5nZSBWTEFOIGZvciBTUi1JT1YgcG9ydHMKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQ+PTAgYW5kIHBvcnRbInR5cGUiXT09Imluc3RhbmNlOmRhdGEiIGFuZCBwb3J0WyJtb2RlbCJdPT0iVkYiOiAjVE9ETyBjb25zaWRlciBhbHNvIFZGbm90U2hhcmVkCisgICAgICAgICAgICAgICAgICAgIGlmIG5ld19uZXQgPT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfZGljdFsidmxhbiJdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9kaWN0WyJ2bGFuIl0gPSBuZXdfbmV0X2RpY3RbInZsYW4iXQorICAgICAgICAgICAgICAgICAgICAjZ2V0IGhvc3Qgd2hlcmUgdGhpcyBWTSBpcyBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gbXkuZGIuZ2V0X3RhYmxlKEZST009Imluc3RhbmNlcyIsV0hFUkU9eyJ1dWlkIjpwb3J0WyJpbnN0YW5jZV9pZCJdfSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0PDA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiaHR0cF9wdXRfcG9ydF9pZCBkYXRhYmFzZSBlcnJvciIsIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgZWxpZiByZXN1bHQ+MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfaWQgPSBjb250ZW50WzBdWyJob3N0X2lkIl0KKyAgICAKKyAgICAjaW5zZXJ0IGluIGRhdGEgYmFzZQorICAgIGlmIHJlc3VsdCA+PSAwOgorICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi51cGRhdGVfcm93cygncG9ydHMnLCBwb3J0X2RpY3QsIFdIRVJFPXsndXVpZCc6IHBvcnRfaWR9LCBsb2c9RmFsc2UgKQorICAgICAgICAKKyAgICAjSW5zZXJ0IHRhc2sgdG8gY29tcGxldGUgYWN0aW9ucworICAgIGlmIHJlc3VsdCA+IDA6IAorICAgICAgICBmb3IgbmV0X2lkIGluIG5ldHM6CisgICAgICAgICAgICByLHYgPSBjb25maWdfZGljWydvZl90aHJlYWQnXS5pbnNlcnRfdGFzaygidXBkYXRlLW5ldCIsIG5ldF9pZCkKKyAgICAgICAgICAgIGlmIHI8MDogcHJpbnQgIkVycm9yICoqKioqKioqKiAgIGh0dHBfcHV0X3BvcnRfaWQgIHVwZGF0ZV9vZl9mbG93czogIiwgdgorICAgICAgICAgICAgI1RPRE8gRG8gc29tZXRoaW5nIGlmIGZhaWxzCisgICAgICAgIGlmIGhvc3RfaWQgIT0gTm9uZToKKyAgICAgICAgICAgIGNvbmZpZ19kaWNbJ2hvc3RfdGhyZWFkcyddW2hvc3RfaWRdLmluc2VydF90YXNrKCJlZGl0LWlmYWNlIiwgcG9ydF9pZCwgb2xkX25ldCwgbmV3X25ldCkKKyAgICAKKyAgICBpZiByZXN1bHQgPj0gMDoKKyAgICAgICAgcmV0dXJuIGh0dHBfZ2V0X3BvcnRfaWQocG9ydF9pZCkKKyAgICBlbHNlOgorICAgICAgICBib3R0bGUuYWJvcnQoSFRUUF9CYWRfUmVxdWVzdCwgY29udGVudCkKKyAgICAgICAgcmV0dXJuCisKKyAgCitAYm90dGxlLnJvdXRlKHVybF9iYXNlICsgJy9wb3J0cy88cG9ydF9pZD4nLCBtZXRob2Q9J0RFTEVURScpCitkZWYgaHR0cF9kZWxldGVfcG9ydF9pZChwb3J0X2lkKToKKyAgICAnJydkZWxldGUgYSBwb3J0X2lkIGZyb20gdGhlIGRhdGFiYXNlLicnJworICAgIG15ID0gY29uZmlnX2RpY1snaHR0cF90aHJlYWRzJ11bIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgXQorICAgIGlmIG5vdCBteS5hZG1pbjoKKyAgICAgICAgYm90dGxlLmFib3J0KEhUVFBfVW5hdXRob3JpemVkLCAiTmVlZGVkIGFkbWluIHByaXZpbGVnZXMiKQorICAgICAgICByZXR1cm4KKworICAgICNMb29rIGZvciB0aGUgcHJldmlvdXMgcG9ydCBkYXRhCisgICAgd2hlcmVfID0geyd1dWlkJzogcG9ydF9pZCwgInR5cGUiOiAiZXh0ZXJuYWwifQorICAgIHJlc3VsdCwgcG9ydHMgPSBteS5kYi5nZXRfdGFibGUoV0hFUkU9d2hlcmVfLCBGUk9NPSdwb3J0cycsTElNSVQ9MTAwKQorICAgIAorICAgIGlmIHJlc3VsdDw9MDoKKyAgICAgICAgcHJpbnQgImh0dHBfZGVsZXRlX3BvcnRfaWQgcG9ydCAnJXMnIG5vdCBmb3VuZCIgJSBwb3J0X2lkCisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgJ3BvcnQgJXMgbm90IGZvdW5kIG9yIGRldmljZV9vd25lciBpcyBub3QgZXh0ZXJuYWwnICUgcG9ydF9pZCkKKyAgICAgICAgcmV0dXJuCisgICAgI2RlbGV0ZSBmcm9tIHRoZSBkYXRhIGJhc2UKKyAgICByZXN1bHQsIGNvbnRlbnQgPSBteS5kYi5kZWxldGVfcm93KCdwb3J0cycsIHBvcnRfaWQgKQorCisgICAgaWYgcmVzdWx0ID09IDA6CisgICAgICAgIGJvdHRsZS5hYm9ydChIVFRQX05vdF9Gb3VuZCwgY29udGVudCkKKyAgICBlbGlmIHJlc3VsdCA+MDoKKyAgICAgICAgbmV0d29yayA9IHBvcnRzWzBdLmdldCgnbmV0X2lkJywgTm9uZSkKKyAgICAgICAgaWYgbmV0d29yayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICNjaGFuZ2Ugb2YgbmV0LiAKKyAgICAgICAgICAgIHIsYyA9IGNvbmZpZ19kaWNbJ29mX3RocmVhZCddLmluc2VydF90YXNrKCJ1cGRhdGUtbmV0IiwgbmV0d29yaykKKyAgICAgICAgICAgIGlmIHI8MDogcHJpbnQgIiEhISEhISBodHRwX2RlbGV0ZV9wb3J0X2lkIHVwZGF0ZV9vZl9mbG93cyBlcnJvciIsIHIsIGMgCisgICAgICAgIGRhdGE9eydyZXN1bHQnIDogY29udGVudH0KKyAgICAgICAgcmV0dXJuIGZvcm1hdF9vdXQoZGF0YSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiaHR0cF9kZWxldGVfcG9ydF9pZCBlcnJvciIscmVzdWx0LCBjb250ZW50CisgICAgICAgIGJvdHRsZS5hYm9ydCgtcmVzdWx0LCBjb250ZW50KQorICAgIHJldHVybgorICAgIApkaWZmIC0tZ2l0IGEvb3BlbmZsb3cgYi9vcGVuZmxvdwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZWE1OWM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmZsb3cKQEAgLTAsMCArMSwzODggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgUFlUSE9OX0FSR0NPTVBMRVRFX09LCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKycnJworVGhpcyBwcm9ncmFtIGlzIHVzZWZ1bCB0byBpbnRlcmFjdCBkaXJlY3RseSB3aXRoIE9wZW5mbG93IENvbnRyb2xsZXJzCit0byBjbGVhciBydWxlcywgYWRkIGFuZCBkZWxldGUgcnVsZXMsIGxpc3QgcnVsZXMsIGV0Yy4KKycnJworCitfX2F1dGhvcl9fPSJHZXJhcmRvIEdhcmNpYSwgQWxmb25zbyBUaWVybm8sIFBhYmxvIE1vbnRlcyIKK19fZGF0ZV9fID0iJDA5LW9jdC0yMDE0IDA5OjA5OjQ4JCIKKworI2ltcG9ydCB0aW1lCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGFyZ2NvbXBsZXRlCitpbXBvcnQgaW1wCitpbXBvcnQgeWFtbAoraW1wb3J0IHJlcXVlc3RzCitpbXBvcnQgbG9nZ2luZworZnJvbSBvcGVuZmxvd190aHJlYWQgaW1wb3J0IGNoYW5nZV9kYjJvZiwgRmxvd0JhZEZvcm1hdAorCitkZWYgb2Zfc3dpdGNoZXMoYXJncyk6CisgICAgcixjID0gb2Zjb25uZWN0b3IuZ2V0X29mX3N3aXRjaGVzKCkKKyAgICBpZiByPDA6CisgICAgICAgIHByaW50IGMKKyAgICAgICAgcmV0dXJuIHIKKyAgICBlbHNlOiAKKyAgICAgICAgZm9yIHMgaW4gYzoKKyAgICAgICAgICAgIHByaW50ICIgJXMgJXMiICUgKHNbMF0sIHNbMV0pCisgICAgcmV0dXJuIDAKKworZGVmIG9mX2xpc3QoYXJncyk6CisgICAgcixjID0gb2Zjb25uZWN0b3IuZ2V0X29mX3J1bGVzKG5vdCBhcmdzLm5vX3RyYW5zbGF0ZSkKKyAgICBpZiByPDA6CisgICAgICAgIHByaW50IGMKKyAgICAgICAgcmV0dXJuIHIKKyAgICBpZiBhcmdzLnZlcmJvc2UgPiAwOgorICAgICAgICBwcmludCB5YW1sLnNhZmVfZHVtcChjLCBpbmRlbnQ9NCwgZGVmYXVsdF9mbG93X3N0eWxlPUZhbHNlKQorICAgICAgICByZXR1cm4gMAorCisgICAgcHJpbnQgIiAgICAgICBzd2l0Y2ggICAgICAgICAgIHByaW9yaXR5ICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmdyZXNzX3BvcnQgICAgZHN0X21hYyAgICAgICB2bGFuX2lkICBhY3Rpb25zIgorICAgIGZvciBuYW1lLHJ1bGUgaW4gYy5pdGVyaXRlbXMoKToKKyAgICAgICAgYWN0aW9uX2xpc3Q9W10KKyAgICAgICAgZm9yIGFjdGlvbiBpbiBydWxlWyJhY3Rpb25zIl06CisgICAgICAgICAgICBhY3Rpb25fbGlzdC5hcHBlbmQoYWN0aW9uWzBdKyI9IitzdHIoYWN0aW9uWzFdKSkKKyAgICAgICAgaWYgInZsYW5faWQiIGluIHJ1bGU6CisgICAgICAgICAgICB2bGFuPXN0cihydWxlWyJ2bGFuX2lkIl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2bGFuPSJhbnkiCisgICAgICAgIHByaW50ICIlcyAgJXMgICVzICAlcyAgJXMgICVzICAlcyIgJSBcCisgICAgICAgICAgICAocnVsZVsic3dpdGNoIl0sIHN0cihydWxlWyJwcmlvcml0eSJdKS5sanVzdCg2KSwgbmFtZS5sanVzdCg0MCksIHJ1bGVbImluZ3Jlc3NfcG9ydCJdLmxqdXN0KDgpLCBcCisgICAgICAgICAgICBydWxlLmdldCgiZHN0X21hYyIsImFueSIpLmxqdXN0KDE4KSwgdmxhbi5sanVzdCg0KSwgIiwiLmpvaW4oYWN0aW9uX2xpc3QpICkKKyAgICByZXR1cm4gMAorCitkZWYgb2ZfY2xlYXIoYXJncyk6CisgICAgaWYgbm90IGFyZ3MuZm9yY2U6CisgICAgICAgIHIgPSByYXdfaW5wdXQoIkNsZWFyIGFsbCBPcGVuZmxvdyBydWxlcyAoeS9OKT8gIikKKyAgICAgICAgaWYgIG5vdCAobGVuKHIpPjAgIGFuZCByWzBdLmxvd2VyKCk9PSJ5Iik6CisgICAgICAgICAgICByZXR1cm4gMAorICAgIHIsYyA9IG9mY29ubmVjdG9yLmNsZWFyX2FsbF9mbG93cygpCisgICAgaWYgcjwwOgorICAgICAgICBwcmludCBjCisgICAgICAgIHJldHVybiByCisgICAgcmV0dXJuIDAKKworZGVmIG9mX3BvcnRfbGlzdChhcmdzKToKKyAgICByLGMgPSBvZmNvbm5lY3Rvci5vYnRhaW5fcG9ydF9jb3JyZXNwb25kZW5jZSgpCisgICAgaWYgcjwwOgorICAgICAgICBwcmludCBjCisgICAgICAgIHJldHVybiByCisgICAgeWFtbC5zYWZlX2R1bXAoeyJwb3J0cyI6IGN9LCBzeXMuc3Rkb3V0LCBpbmRlbnQ9MiwgZGVmYXVsdF9mbG93X3N0eWxlPUZhbHNlKQorCisjZGVmIG9mX2R1bXAoYXJncyk6CisjICAgIGFyZ3MudmVyYm9zZSA9IDMKKyMgICAgYXJncy5ub190cmFuc2xhdGU9RmFsc2UKKyMgICAgb2ZfbGlzdChhcmdzKQorICAgIHJldHVybiAwCisKK2RlZiBvZl9yZWluc3RhbGwoYXJncyk6CisgICAgdHJ5OgorICAgICAgICBVUkxyZXF1ZXN0ID0gImh0dHA6Ly8lczolcy9vcGVudmltL25ldHdvcmtzL2FsbC9vcGVuZmxvdyIgJSh2aW1faG9zdCwgdmltX2FkbWluX3BvcnQpCisgICAgICAgIHByaW50IFVSTHJlcXVlc3QKKyAgICAgICAgb3BlbnZpbV9yZXNwb25zZSA9IHJlcXVlc3RzLnB1dChVUkxyZXF1ZXN0KQorICAgICAgICBwcmludCBvcGVudmltX3Jlc3BvbnNlLnRleHQKKyAgICAgICAgcmV0dXJuIDAKKyAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uIGFzIGU6CisgICAgICAgIHByaW50ICIgRXhjZXB0aW9uIEdFVCBhdCAnIitVUkxyZXF1ZXN0KyInICIgKyBzdHIoZSkKKyAgICAgICAgcmV0dXJuIC0xCisKK2RlZiBvZl9pbnN0YWxsKGFyZ3MpOgorICAgIGxpbmVfbnVtYmVyPTEKKyAgICB0cnk6CisgICAgICAgIGYgPSBvcGVuKGFyZ3MuZmlsZSwgInIiKQorICAgICAgICB0ZXh0ID0gZi5yZWFkKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGxpbmVzPXRleHQuc3BsaXQoIlxuIikKKyAgICAgICAgaGVhZHM9bGluZXNbMF0uc3BsaXQoKQorCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzWzE6XToKKyAgICAgICAgICAgIGxpbmVfbnVtYmVyICs9IDEKKyAgICAgICAgICAgIHJ1bGU9e30KKyAgICAgICAgICAgIGl0ZW1zPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgICAgIGlmIGxlbihpdGVtcyk9PTAgb3IgaXRlbXNbMF1bMF09PSIjIjogI2VtcHR5IGxpbmUgb3IgY29tbWVudGVkCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsbGVuKGl0ZW1zKSk6CisgICAgICAgICAgICAgICAgcnVsZVsgaGVhZHNbaV0gXSA9IGl0ZW1zW2ldCisgICAgICAgICAgICBpZiBydWxlWyJ2bGFuX2lkIl0gPT0gImFueSI6CisgICAgICAgICAgICAgICAgZGVsIHJ1bGVbInZsYW5faWQiXQorICAgICAgICAgICAgaWYgcnVsZVsiZHN0X21hYyJdID09ICJhbnkiOgorICAgICAgICAgICAgICAgIGRlbCBydWxlWyJkc3RfbWFjIl0KKyAgICAgICAgICAgIGlmICdwcmlvcml0eScgaW4gcnVsZSBhbmQgKHJ1bGVbJ3ByaW9yaXR5J109PU5vbmUgb3IgcnVsZVsncHJpb3JpdHknXT09Ik5vbmUiICk6CisgICAgICAgICAgICAgICAgZGVsIHJ1bGVbJ3ByaW9yaXR5J10KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjaGFuZ2VfZGIyb2YocnVsZSkKKyAgICAgICAgICAgIGV4Y2VwdCBGbG93QmFkRm9ybWF0IGFzIGU6CisgICAgICAgICAgICAgICAgcHJpbnQgIkZvcm1hdCBlcnJvciBhdCBsaW5lICVkOiAgJXMiICUgKGxpbmVfbnVtYmVyLCBzdHIoZSkpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHIsYyA9IG9mY29ubmVjdG9yLm5ld19mbG93KHJ1bGUpCisgICAgICAgICAgICBpZiByPDA6CisgICAgICAgICAgICAgICAgZXJyb3I9IkVSUk9SOiAiK2MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXJyb3I9Ik9LIgorICAgICAgICAgICAgcHJpbnQgIiVzICAlcyAgJXMgIGlucHV0PSVzICBkc3RfbWFjPSVzICB2bGFuX2lkPSVzICAlcyIgJSBcCisgICAgICAgICAgICAgICAgICAgIChydWxlWyJzd2l0Y2giXSwgc3RyKHJ1bGUuZ2V0KCJwcmlvcml0eSIpKS5sanVzdCg2KSwgcnVsZVsibmFtZSJdLmxqdXN0KDIwKSwgcnVsZVsiaW5ncmVzc19wb3J0Il0ubGp1c3QoMyksIFwKKyAgICAgICAgICAgICAgICAgICAgIHJ1bGUuZ2V0KCJkc3RfbWFjIiwiYW55IikubGp1c3QoMTgpLCBydWxlLmdldCgidmxhbl9pZCIsImFueSIpLmxqdXN0KDQpLCBlcnJvciApCisgICAgICAgIHJldHVybiAwCisgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgcHJpbnQgIiBFcnJvciBvcGVuaW5nIGZpbGUgJyIgKyBhcmdzLmZpbGUgKyAiJzogIiArIGUuYXJnc1sxXQorICAgICAgICByZXR1cm4gLTEKKyAgICBleGNlcHQgeWFtbC5ZQU1MRXJyb3IgYXMgZXhjOgorICAgICAgICBlcnJvcl9wb3MgPSAiIgorICAgICAgICBpZiBoYXNhdHRyKGV4YywgJ3Byb2JsZW1fbWFyaycpOgorICAgICAgICAgICAgbWFyayA9IGV4Yy5wcm9ibGVtX21hcmsKKyAgICAgICAgICAgIGVycm9yX3BvcyA9ICIgYXQgcG9zaXRpb246ICglczolcykiICUgKG1hcmsubGluZSsxLCBtYXJrLmNvbHVtbisxKQorICAgICAgICBwcmludCAiIEVycm9yIHlhbWwvanNvbiBmb3JtYXQgZXJyb3IgYXQgIiArIGVycm9yX3BvcworICAgICAgICByZXR1cm4gLTEKKworZGVmIG9mX2FkZChhcmdzKToKKyAgICBpZiBhcmdzLmFjdD09Tm9uZSBhbmQgYXJncy5hY3Rpb25zPT1Ob25lOgorICAgICAgICBwcmludCAib3BlbmZsb3cgYWRkOiBlcnJvcjogb25lIG9mIHRoZSBhcmd1bWVudHMgLS1hY3Rpb25zIG9yIFstLXNldHZsYW4sLS1zdHJpcHZsYW5dLC0tb3V0IGlzIHJlcXVpcmVkIgorICAgICAgICByZXR1cm4gLTEKKyAgICBlbGlmIGFyZ3MuYWN0IT1Ob25lIGFuZCBhcmdzLmFjdGlvbnMhPU5vbmU6CisgICAgICAgIHByaW50ICJvcGVuZmxvdyBhZGQ6IGVycm9yOiBVc2UgZWl0aGVyIC0tYWN0aW9ucyBvcHRpb24gb3IgWy0tc2V0dmxhbiwtLXN0cmlwdmxhbl0sLS1vdXQgb3B0aW9uczsgYnV0IG5vdCBib3RoIgorICAgICAgICByZXR1cm4gLTEKKyAgICAKKyAgICBydWxlPXsibmFtZSI6YXJncy5uYW1lLCAicHJpb3JpdHkiOmFyZ3MucHJpb3JpdHksCisgICAgICAgICAgImluZ3Jlc3NfcG9ydCI6IGFyZ3MuaW5wb3J0CisgICAgICAgIH0KKyAgICBpZiBhcmdzLm1hdGNodmxhbjoKKyAgICAgICAgcnVsZVsidmxhbl9pZCJdID0gYXJncy5tYXRjaHZsYW4KKyAgICBpZiBhcmdzLm1hdGNobWFjOgorICAgICAgICBydWxlWyJkc3RfbWFjIl0gPSBhcmdzLm1hdGNobWFjCisKKyAgICBpZiBhcmdzLmFjdGlvbnM6CisgICAgICAgIHJ1bGVbImFjdGlvbnMiXSA9IGFyZ3MuYWN0aW9ucworICAgICAgICB0cnk6CisgICAgICAgICAgICBjaGFuZ2VfZGIyb2YocnVsZSkKKyAgICAgICAgZXhjZXB0IEZsb3dCYWRGb3JtYXQgYXMgZToKKyAgICAgICAgICAgIHByaW50ICJGb3JtYXQgZXJyb3IgYXQgLS1hY3Rpb25zOiAnJXMnIEV4cGVjdGVkICd2bGFuPTxOb25lL3ZsYW5faWQ+LG91dD08ZWdyZXNzX3BvcnQ+LC4uLiciICUgc3RyKGUpCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICBlbGlmIGFyZ3MuYWN0OgorICAgICAgICBydWxlWyJhY3Rpb25zIl09W10KKyAgICAgICAgZXJyb3JfbXNqID0gIm9wZW5mbG93IGFkZDogZXJyb3I6IC0tc2V0dmxhbiwtLXN0cmlwdmxhbiBvcHRpb25zIG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gLS1vdXQgb3B0aW9uIgorICAgICAgICBwcmV2aW91c19vcHRpb25fdmxhbj1GYWxzZSAjIGluZGljYXRlcyBpZiB0aGUgcHJldmlvdXMgb3B0aW9uIHdhcyBhIHNldCBvciBzdHJpcCB2bGFuIHRvIGF2b2lkIGNvbnNlY3V0aXZlIG9uZXMgYW5kIHRvIGZvcmNlIGFuIG91dCBvcHRpb25zIGFmdGVyd2FyZHMKKyAgICAgICAgZm9yIGFjdGlvbiBpbiBhcmdzLmFjdDoKKyAgICAgICAgICAgIGlmIGFjdGlvbj09Tm9uZSBvciB0eXBlKGFjdGlvbik9PWludDoKKyAgICAgICAgICAgICAgICBpZiBwcmV2aW91c19vcHRpb25fdmxhbjogI2NvbnNlY3V0aXZlIHZsYW4gb3B0aW9ucworICAgICAgICAgICAgICAgICAgICBwcmludCBlcnJvcl9tc2oKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgcHJldmlvdXNfb3B0aW9uX3ZsYW49VHJ1ZQorICAgICAgICAgICAgICAgIHJ1bGVbImFjdGlvbnMiXS5hcHBlbmQoICgidmxhbiIsIGFjdGlvbikgKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmV2aW91c19vcHRpb25fdmxhbj1GYWxzZQorICAgICAgICAgICAgICAgIHJ1bGVbImFjdGlvbnMiXS5hcHBlbmQoICgib3V0IiwgYWN0aW9uKSApIAorICAgICAgICBpZiBwcmV2aW91c19vcHRpb25fdmxhbjoKKyAgICAgICAgICAgIHByaW50IGVycm9yX21zagorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgI3ByaW50IHJ1bGUKKyAgICAjcmV0dXJuCisKKyAgICByLGMgPSBvZmNvbm5lY3Rvci5uZXdfZmxvdyhydWxlKQorICAgIGlmIHI8MDoKKyAgICAgICAgcHJpbnQgYworICAgICAgICByZXR1cm4gLTEKKyAgICByZXR1cm4gMAorCitkZWYgb2ZfZGVsZXRlKGFyZ3MpOgorICAgIGlmIG5vdCBhcmdzLmZvcmNlOgorICAgICAgICByID0gcmF3X2lucHV0KCJDbGVhciBydWxlICVzICh5L04pPyAiICUoYXJncy5uYW1lKSkKKyAgICAgICAgaWYgIG5vdCAobGVuKHIpPjAgIGFuZCByWzBdLmxvd2VyKCk9PSJ5Iik6CisgICAgICAgICAgICByZXR1cm4gMAorICAgIHIsYyA9IG9mY29ubmVjdG9yLmRlbF9mbG93KGFyZ3MubmFtZSkKKyAgICBpZiByPDA6CisgICAgICAgIHByaW50IGMKKyAgICAgICAgcmV0dXJuIC0xCisgICAgcmV0dXJuIDAKKworZGVmIGNvbmZpZyhhcmdzKToKKyAgICBwcmludCAiT1BFTlZJTV9IT1NUOiAlcyIgJSh2aW1faG9zdCkKKyAgICBwcmludCAiT1BFTlZJTV9BRE1JTl9QT1JUOiAlcyIgJSh2aW1fYWRtaW5fcG9ydCkKKyAgICBwcmludCAiT0ZfQ09OVFJPTExFUl9UWVBFOiAlcyIgJShvZl9jb250cm9sbGVyX3R5cGUpCisgICAgaWYgb2ZfY29udHJvbGxlcl9tb2R1bGUgb3IgKG9mX2NvbnRyb2xsZXJfdHlwZSE9ImZsb29kbGlnaHQiIGFuZCBvZl9jb250cm9sbGVyX3R5cGUhPSJvcGVuZGF5bGlnaHQiKToKKyAgICAgICAgcHJpbnQgIk9GX0NPTlRST0xMRVJfTU9EVUxFOiAlcyIgJShvZl9jb250cm9sbGVyX21vZHVsZSkKKyAgICBwcmludCAiT0ZfQ09OVFJPTExFUl9VU0VSOiAlcyIgJShvZl9jb250cm9sbGVyX3VzZXIpCisgICAgcHJpbnQgIk9GX0NPTlRST0xMRVJfUEFTU1dPUkQ6ICVzIiAlKG9mX2NvbnRyb2xsZXJfcGFzc3dvcmQpCisgICAgI3ByaW50ICJPRl9DT05UUk9MTEVSX1ZFUlNJT046ICVzIiAlKG9mX2NvbnRyb2xsZXJfdmVyc2lvbikKKyAgICBwcmludCAiT0ZfQ09OVFJPTExFUl9JUDogJXMiICUob2ZfY29udHJvbGxlcl9pcCkKKyAgICBwcmludCAiT0ZfQ09OVFJPTExFUl9QT1JUOiAlcyIgJShvZl9jb250cm9sbGVyX3BvcnQpCisgICAgcHJpbnQgIk9GX0NPTlRST0xMRVJfRFBJRDogJXMiICUob2ZfY29udHJvbGxlcl9kcGlkKQorICAgIHJldHVybgorCit2ZXJzaW9uPSIwLjgiCitnbG9iYWwgdmltX2hvc3QKK2dsb2JhbCB2aW1fYWRtaW5fcG9ydAorZ2xvYmFsIG9mX2NvbnRyb2xsZXJfdHlwZQorZ2xvYmFsIG9mX2NvbnRyb2xsZXJfdXNlcgorZ2xvYmFsIG9mX2NvbnRyb2xsZXJfcGFzc3dvcmQKK2dsb2JhbCBvZl9jb250cm9sbGVyX2lwCitnbG9iYWwgb2ZfY29udHJvbGxlcl9wb3J0CitnbG9iYWwgb2ZfY29udHJvbGxlcl9kcGlkCitnbG9iYWwgb2ZfY29udHJvbGxlcl9tb2R1bGUKK2dsb2JhbCBvZmNvbm5lY3RvcgorICAgCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICAjcHJpbnQgInRlc3Rfb2Zjb25uZWN0b3IgdmVyc2lvbiIsIHZlcnNpb24sICJKdWwgMjAxNSIKKyAgICAjcHJpbnQgIihjKSBDb3B5cmlnaHQgVGVsZWZvbmljYSIKKyAgICAKKyAgICB2aW1faG9zdCA9IG9zLmdldGVudignT1BFTlZJTV9IT1NUJywibG9jYWxob3N0IikKKyAgICB2aW1fYWRtaW5fcG9ydCA9IG9zLmdldGVudignT1BFTlZJTV9BRE1JTl9QT1JUJywiODA4NSIpCisgICAgb2ZfY29udHJvbGxlcl90eXBlID0gb3MuZ2V0ZW52KCdPRl9DT05UUk9MTEVSX1RZUEUnLCJmbG9vZGxpZ2h0IikKKyAgICBvZl9jb250cm9sbGVyX3VzZXIgPSBvcy5nZXRlbnYoJ09GX0NPTlRST0xMRVJfVVNFUicsTm9uZSkKKyAgICBvZl9jb250cm9sbGVyX3Bhc3N3b3JkID0gb3MuZ2V0ZW52KCdPRl9DT05UUk9MTEVSX1BBU1NXT1JEJyxOb25lKQorICAgICNvZl9jb250cm9sbGVyX3ZlcnNpb24gPSBvcy5nZXRlbnYoJ09GX0NPTlRST0xMRVJfVkVSU0lPTicsIjAuOTAiKQorICAgIG9mX2NvbnRyb2xsZXJfaXAgPSBvcy5nZXRlbnYoJ09GX0NPTlRST0xMRVJfSVAnLCJsb2NhbGhvc3QiKQorICAgIG9mX2NvbnRyb2xsZXJfcG9ydCA9IG9zLmdldGVudignT0ZfQ09OVFJPTExFUl9QT1JUJywiNzA3MCIpCisgICAgb2ZfY29udHJvbGxlcl9kcGlkID0gb3MuZ2V0ZW52KCdPRl9DT05UUk9MTEVSX0RQSUQnLCcwMDowMTowMjowMzplNDowNTplNjowNycpCisgICAgb2ZfY29udHJvbGxlcl9tb2R1bGUgPSBvcy5nZXRlbnYoJ09GX0NPTlRST0xMRVJfTU9EVUxFJyxOb25lKQorICAgIAorICAgIG1haW5fcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J1VzZXIgcHJvZ3JhbSB0byBpbnRlcmFjdCB3aXRoIE9wZW5mbG93IGNvbnRyb2xsZXInKQorICAgIG1haW5fcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJzaW9uJywgYWN0aW9uPSd2ZXJzaW9uJywgdmVyc2lvbj0nJShwcm9nKXMgJyArIHZlcnNpb24gKQorICAgIAorICAgICNtYWluX3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBzdWJwYXJzZXJzID0gbWFpbl9wYXJzZXIuYWRkX3N1YnBhcnNlcnMoaGVscD0nY29tbWFuZHMnKQorICAgIAorICAgIGNvbmZpZ19wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJ2NvbmZpZycsIGhlbHA9InByaW50cyBjb25maWd1cmF0aW9uIHZhbHVlcyIpCisgICAgY29uZmlnX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1jb25maWcpCisgICAgCisgICAgYWRkX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignYWRkJywgaGVscD0iYWRkcyBhbiBvcGVuZmxvdyBydWxlIikKKyAgICBhZGRfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdjb3VudCcpCisgICAgYWRkX3BhcnNlci5hZGRfYXJndW1lbnQoIm5hbWUiLCBhY3Rpb249InN0b3JlIiwgaGVscD0ibmFtZSBvZiB0aGUgcnVsZSIpCisgICAgYWRkX3BhcnNlci5hZGRfYXJndW1lbnQoIi0taW5wb3J0IiwgcmVxdWlyZWQ9VHJ1ZSwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9c3RyLCBoZWxwPSJtYXRjaCBydWxlOiBpbmdyZXNzLXBvcnQiKQorICAgIGFkZF9wYXJzZXIuYWRkX2FyZ3VtZW50KCItLWFjdGlvbnMiLCBhY3Rpb249InN0b3JlIiwgdHlwZT1zdHIsIGhlbHA9ImFjdGlvbiB3aXRoIHRoZSBmb3JtYXQ6IHZsYW49PE5vbmUvdmxhbi1pZD4sb3V0PTxlZ3Jlc3MtcG9ydD4sLi4uIikKKyAgICBhZGRfcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wcmlvcml0eSIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPWludCwgaGVscD0icnVsZSBwcmlvcml0eSIpCisgICAgYWRkX3BhcnNlci5hZGRfYXJndW1lbnQoIi0tbWF0Y2htYWMiLCBhY3Rpb249InN0b3JlIiwgaGVscD0ibWF0Y2ggcnVsZTogbWFjIGFkZHJlc3MiKQorICAgIGFkZF9wYXJzZXIuYWRkX2FyZ3VtZW50KCItLW1hdGNodmxhbiIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPWludCwgaGVscD0ibWF0Y2ggcnVsZTogdmxhbiBpZCIpCisgICAgYWRkX3BhcnNlci5hZGRfYXJndW1lbnQoIi0tc3RyaXB2bGFuIiwgYWN0aW9uPSJhcHBlbmRfY29uc3QiLCBkZXN0PSJhY3QiLCBjb25zdD1Ob25lLCBoZWxwPSJhbHRlcm5hdGl2ZSB0byAtLWFjdGlvbnMuIFVzZSBiZWZvcmUgLS1vdXQgdG8gc3RyaXAgdmxhbiIpCisgICAgYWRkX3BhcnNlci5hZGRfYXJndW1lbnQoIi0tc2V0dmxhbiIsIGFjdGlvbj0iYXBwZW5kIiwgZGVzdD0iYWN0IiwgdHlwZT1pbnQsIGhlbHA9ImFsdGVybmF0aXZlIHRvIC0tYWN0aW9ucy4gVXNlIGJlZm9yZSAtLW91dCB0byBzZXQgdmxhbiIpCisgICAgYWRkX3BhcnNlci5hZGRfYXJndW1lbnQoIi0tb3V0IiwgYWN0aW9uPSJhcHBlbmQiLCBkZXN0PSJhY3QiLCB0eXBlPXN0ciwgaGVscD0iYWx0ZXJuYXRpdmUgdG8gLS1hY3Rpb25zLiBvdXQ9PGVncmVzcy1wb3J0PiBjYW4gYmUgdXNlZCBzZXZlcmFsIHRpbWVzIikKKyAgICBhZGRfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZWJ1ZycsICctZCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9InNob3cgZGVidWcgaW5mb3JtYXRpb24iKQorICAgIGFkZF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9b2ZfYWRkKQorICAgIAorICAgIGRlbGV0ZV9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJ2RlbGV0ZScsIGhlbHA9ImRlbGV0ZSBhbiBvcGVuZmxvdyBydWxlIikKKyAgICBkZWxldGVfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdjb3VudCcpCisgICAgZGVsZXRlX3BhcnNlci5hZGRfYXJndW1lbnQoIi1mIiwgIi0tZm9yY2UiLCBhY3Rpb249InN0b3JlX3RydWUiLCBoZWxwPSJmb3JjZSBkZWxldGlvbiB3aXRob3V0IGFza2luZyIpCisgICAgZGVsZXRlX3BhcnNlci5hZGRfYXJndW1lbnQoIm5hbWUiLCBhY3Rpb249InN0b3JlIiwgaGVscD0ibmFtZSBvZiB0aGUgcnVsZSB0byBiZSBkZWxldGVkIikKKyAgICBkZWxldGVfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZWJ1ZycsICctZCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9InNob3cgZGVidWcgaW5mb3JtYXRpb24iKQorICAgIGRlbGV0ZV9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9b2ZfZGVsZXRlKQorICAgIAorICAgIHN3aXRjaGVzX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignc3dpdGNoZXMnLCBoZWxwPSJsaXN0IGFsbCBzd2l0Y2hlcyBjb250cm9sbGVkIGJ5IHRoZSBPRkMiKQorICAgIHN3aXRjaGVzX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsICctdicsIGFjdGlvbj0nY291bnQnKQorICAgIHN3aXRjaGVzX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tZGVidWcnLCAnLWQnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSJzaG93IGRlYnVnIGluZm9ybWF0aW9uIikKKyAgICBzd2l0Y2hlc19wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9b2Zfc3dpdGNoZXMpCisKKyAgICBsaXN0X3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignbGlzdCcsIGhlbHA9Imxpc3Qgb3BlbmZsb3cgcnVsZXMiKQorICAgIGxpc3RfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdjb3VudCcpCisgICAgbGlzdF9wYXJzZXIuYWRkX2FyZ3VtZW50KCItLW5vLXRyYW5zbGF0ZSIsICItbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9IlNraXAgdHJhbnNsYXRpb24gZnJvbSBvcGVuZmxvdyBpbmRleCB0byBzd2l0Y2ggcG9ydCBuYW1lIikKKyAgICBsaXN0X3BhcnNlci5hZGRfYXJndW1lbnQoJy0tZGVidWcnLCAnLWQnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSJzaG93IGRlYnVnIGluZm9ybWF0aW9uIikKKyAgICBsaXN0X3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1vZl9saXN0KQorCisgICAgI2R1bXBfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCdkdW1wJywgaGVscD0iZHVtcCBvcGVuZmxvdyBydWxlcyIpCisgICAgI2R1bXBfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPW9mX2R1bXApCisgICAgCisgICAgY2xlYXJfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCdjbGVhcicsIGhlbHA9ImNsZWFyIGFsbCBvcGVuZmxvdyBydWxlcyIpCisgICAgY2xlYXJfcGFyc2VyLmFkZF9hcmd1bWVudCgiLWYiLCAiLS1mb3JjZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9ImZvcmNlcyBkZWxldGlvbiB3aXRob3V0IGFza2luZyIpCisgICAgY2xlYXJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZWJ1ZycsICctZCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9InNob3cgZGVidWcgaW5mb3JtYXRpb24iKQorICAgIGNsZWFyX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1vZl9jbGVhcikKKworICAgIGluc3RhbGxfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCdpbnN0YWxsJywgaGVscD0iaW5zdGFsbCBvcGVuZmxvdyBydWxlcyBmcm9tIGZpbGUiKQorICAgIGluc3RhbGxfcGFyc2VyLmFkZF9hcmd1bWVudCgiZmlsZSIsIGFjdGlvbj0ic3RvcmUiLCBoZWxwPSJmaWxlIHdpdGggcnVsZXMgZ2VuZXJhdGVkIHVzaW5nICdvcGVuZmxvdyBsaXN0ID4gcnVsZXMudHh0JyIpCisgICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlYnVnJywgJy1kJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0ic2hvdyBkZWJ1ZyBpbmZvcm1hdGlvbiIpCisgICAgaW5zdGFsbF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9b2ZfaW5zdGFsbCkKKworICAgIHJlaW5zdGFsbF9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJ3JlaW5zdGFsbCcsIGhlbHA9InJlaW5zdGFsbCBvcGVuZmxvdyBydWxlcyBmcm9tIFZJTSBydWxlcyIpCisgICAgcmVpbnN0YWxsX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1vZl9yZWluc3RhbGwpCisgICAgcmVpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tZGVidWcnLCAnLWQnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSJzaG93IGRlYnVnIGluZm9ybWF0aW9uIikKKworICAgIHBvcnRsaXN0X3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcigncG9ydC1saXN0JywgaGVscD0ibGlzdCB0aGUgcGh5c2ljYWwgdG8gb3BlbmZsb3cgcG9ydCBjb3JyZXNwb25kZW5jZSIpCisgICAgcG9ydGxpc3RfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPW9mX3BvcnRfbGlzdCkKKyAgICBwb3J0bGlzdF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlYnVnJywgJy1kJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0ic2hvdyBkZWJ1ZyBpbmZvcm1hdGlvbiIpCisKKyAgICBhcmdjb21wbGV0ZS5hdXRvY29tcGxldGUobWFpbl9wYXJzZXIpCisgICAgCisgICAgYXJncyA9IG1haW5fcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIG1vZHVsZV9pbmZvPU5vbmUKKyAgICB0cnk6CisgICAgICAgIGlmIGFyZ3MuZnVuYyBpcyBub3QgY29uZmlnOgorICAgICAgICAgICAgcGFyYW1zPXsgIm9mX2lwIjogICBvZl9jb250cm9sbGVyX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9mX3BvcnQiOiBvZl9jb250cm9sbGVyX3BvcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIm9mX2RwaWQiOiBvZl9jb250cm9sbGVyX2RwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAib2ZfdXNlciI6IG9mX2NvbnRyb2xsZXJfdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZl9wYXNzd29yZCI6IG9mX2NvbnRyb2xsZXJfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgImRlYnVnIiBpbiBhcmdzIGFuZCBhcmdzLmRlYnVnOgorICAgICAgICAgICAgICAgIHN0cmVhbWZvcm1hdCA9ICIlKGFzY3RpbWUpcyAlKG5hbWUpcyAlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZvcm1hdD1zdHJlYW1mb3JtYXQsIGxldmVsPSBsb2dnaW5nLkRFQlVHKQorICAgICAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCd2aW0nKQorICAgICAgICAgICAgICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQorICAgICAgICAgICAgICAgIHBhcmFtc1sib2ZfZGVidWciXT0iREVCVUciCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigndmltJykuYWRkSGFuZGxlcihsb2dnaW5nLk51bGxIYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgI2xvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkNSSVRJQ0FMKQorICAgICAgICAgICAgICAgIHBhcmFtc1sib2ZfZGVidWciXT0iQ1JJVElDQUwiCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIG9mX2NvbnRyb2xsZXJfdHlwZT09J29wZW5kYXlsaWdodCc6CisgICAgICAgICAgICAgICAgbW9kdWxlID0gIk9ETCIKKyAgICAgICAgICAgIGVsaWYgb2ZfY29udHJvbGxlcl9tb2R1bGUgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBvZl9jb250cm9sbGVyX21vZHVsZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBvZl9jb250cm9sbGVyX3R5cGUKKyAgICAgICAgICAgIG1vZHVsZV9pbmZvID0gaW1wLmZpbmRfbW9kdWxlKG1vZHVsZSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgb2ZfY29ubiA9IGltcC5sb2FkX21vZHVsZSgib2ZfY29ubiIsICptb2R1bGVfaW5mbykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvZmNvbm5lY3RvciA9IG9mX2Nvbm4uT0ZfY29ubihwYXJhbXMpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6IAorICAgICAgICAgICAgICAgIHByaW50ICJDYW5ub3Qgb3BlbiB0aGUgT3BlbmZsb3cgY29udHJvbGxlciAnJXMnOiAlcyIgJSAodHlwZShlKS5fX25hbWVfXywgc3RyKGUpKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xCisgICAgICAgICAgICAgICAgZXhpdCgpCisgICAgICAgIHJlc3VsdCA9IGFyZ3MuZnVuYyhhcmdzKQorICAgICAgICBpZiByZXN1bHQgPT0gTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgICAgIAorICAgICAgICAjZm9yIHNvbWUgcmVhc29uIGl0IGZhaWxzIGlmIGNhbGwgZXhpdCBpbnNpZGUgdHJ5IGluc3RhbmNlLiBOZWVkIHRvIGNhbGwgZXhpdCBhdCB0aGUgZW5kICE/CisgICAgZXhjZXB0IChJT0Vycm9yLCBJbXBvcnRFcnJvcikgYXMgZToKKyAgICAgICAgcHJpbnQgIkNhbm5vdCBvcGVuIG9wZW5mbG93IGNvbnRyb2xsZXIgbW9kdWxlICclcyc7ICVzOiAlcyIgJSAobW9kdWxlLCB0eXBlKGUpLl9fbmFtZV9fLCBzdHIoZSkpCisgICAgICAgIHJlc3VsdCA9IC0xCisgICAgI2V4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAjICAgIHByaW50ICJDYW5ub3Qgb3BlbiB0aGUgT3BlbmZsb3cgY29udHJvbGxlciAnJXMnOiAlcyIgJSAodHlwZShlKS5fX25hbWVfXywgc3RyKGUpKQorICAgICMgICAgcmVzdWx0ID0gLTEKKyAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXJyb3IgYXMgZToKKyAgICAgICAgcHJpbnQgIkNhbm5vdCBjb25uZWN0IHRvIHNlcnZlcjsgJXM6ICVzIiAlICh0eXBlKGUpLl9fbmFtZV9fLCBzdHIoZSkpCisgICAgICAgIHJlc3VsdCA9IC0yCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCk6CisgICAgICAgIHByaW50ICdFeGl0aW5nIG9wZW5WSU0nCisgICAgICAgIHJlc3VsdCA9IC0zCisgICAgZXhjZXB0IChTeXN0ZW1FeGl0KToKKyAgICAgICAgcmVzdWx0ID0gLTQKKyAgICAKKyAgICAjY2xvc2Ugb3BlbiBmaWxlCisgICAgaWYgbW9kdWxlX2luZm8gYW5kIG1vZHVsZV9pbmZvWzBdOgorICAgICAgICBmaWxlLmNsb3NlKG1vZHVsZV9pbmZvWzBdKQorICAgIGV4aXQocmVzdWx0KQorICAgIAorCisKZGlmZiAtLWdpdCBhL29wZW5mbG93X3RocmVhZC5weSBiL29wZW5mbG93X3RocmVhZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDAyYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmZsb3dfdGhyZWFkLnB5CkBAIC0wLDAgKzEsNTc2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogdXRmLTggLSotCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKycnJworVGhpcyB0aHJlYWQgaW50ZXJhY3RzIHdpdGggYSBvcGVuZmxvdyBmbG9vZGxpZ3RoIGNvbnRyb2xsZXIgdG8gY3JlYXRlIGRhdGFwbGFuZSBjb25uZWN0aW9ucworJycnCisKK19fYXV0aG9yX189IlBhYmxvIE1vbnRlcywgQWxmb25zbyBUaWVybm8iCitfX2RhdGVfXyA9IjE3LWp1bC0yMDE1IgorCisKKyNpbXBvcnQganNvbgoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHRpbWUKK2ltcG9ydCBRdWV1ZQoraW1wb3J0IHJlcXVlc3RzCitpbXBvcnQgbG9nZ2luZworCitjbGFzcyBGbG93QmFkRm9ybWF0KEV4Y2VwdGlvbik6CisgICAgJycncmFpc2Ugd2hlbiBhIGJhZCBmb3JtYXQgb2YgZmxvdyBpcyBmb3VuZCcnJyAKKworZGVmIGNoYW5nZV9vZjJkYihmbG93KToKKyAgICAnJydDaGFuZ2UgJ2Zsb3cnIGRpY3Rpb25hcnkgZnJvbSBvcGVuZmxvdyBmb3JtYXQgdG8gZGF0YWJhc2UgZm9ybWF0CisgICAgQmFzaWNhbGx5IHRoZSBjaGFuZ2UgY29uc2lzdCBvZiBjaGFuZ2luZyAnZmxvd1thY3Rpb25zXSBmcm9tIGEgbGlzdCBvZgorICAgIGRvdWJsZSB0dXBsZSB0byBhIHN0cmluZworICAgIGZyb20gWyhBLEIpLChDLEQpLC4uXSB0byAiQT1CLEM9RCIgJycnCisgICAgYWN0aW9uX3N0cl9saXN0PVtdCisgICAgaWYgdHlwZShmbG93KSE9ZGljdCBvciAiYWN0aW9ucyIgbm90IGluIGZsb3c6CisgICAgICAgIHJhaXNlIEZsb3dCYWRGb3JtYXQoIkJhZCBpbnB1dCBwYXJhbWV0ZXJzLCBleHBlY3QgZGljdGlvbmFyeSB3aXRoICdhY3Rpb25zJyBhcyBrZXkiKQorICAgIHRyeToKKyAgICAgICAgZm9yIGFjdGlvbiBpbiBmbG93WydhY3Rpb25zJ106CisgICAgICAgICAgICBhY3Rpb25fc3RyX2xpc3QuYXBwZW5kKCBhY3Rpb25bMF0gKyAiPSIgKyBzdHIoYWN0aW9uWzFdKSApCisgICAgICAgIGZsb3dbJ2FjdGlvbnMnXSA9ICIsIi5qb2luKGFjdGlvbl9zdHJfbGlzdCkKKyAgICBleGNlcHQ6CisgICAgICAgIHJhaXNlIEZsb3dCYWRGb3JtYXQoIlVuZXhwZWN0ZWQgZm9ybWF0IGF0ICdhY3Rpb25zJyIpCisKK2RlZiBjaGFuZ2VfZGIyb2YoZmxvdyk6CisgICAgJycnQ2hhbmdlICdmbG93JyBkaWN0aW9uYXJ5IGZyb20gZGF0YWJhc2UgZm9ybWF0IHRvIG9wZW5mbG93IGZvcm1hdAorICAgIEJhc2ljYWxseSB0aGUgY2hhbmdlIGNvbnNpc3Qgb2YgY2hhbmdpbmcgJ2Zsb3dbYWN0aW9uc10nIGZyb20gYSBzdHJpbmcgdG8gCisgICAgYSBkb3VibGUgdHVwbGUgbGlzdAorICAgIGZyb20gIkE9QixDPUQsLi4uIiB0byBbKEEsQiksKEMsRCksLi5dIAorICAgIHJhaXNlIEZsb3dCYWRGb3JtYXQgJycnCisgICAgYWN0aW9ucz1bXQorICAgIGlmIHR5cGUoZmxvdykhPWRpY3Qgb3IgImFjdGlvbnMiIG5vdCBpbiBmbG93IG9yIHR5cGUoZmxvd1siYWN0aW9ucyJdKSE9c3RyOgorICAgICAgICByYWlzZSBGbG93QmFkRm9ybWF0KCJCYWQgaW5wdXQgcGFyYW1ldGVycywgZXhwZWN0IGRpY3Rpb25hcnkgd2l0aCAnYWN0aW9ucycgYXMga2V5IikKKyAgICBhY3Rpb25fbGlzdCA9IGZsb3dbJ2FjdGlvbnMnXS5zcGxpdCgiLCIpCisgICAgZm9yIGFjdGlvbl9pdGVtIGluIGFjdGlvbl9saXN0OgorICAgICAgICBhY3Rpb25fdHVwbGUgPSBhY3Rpb25faXRlbS5zcGxpdCgiPSIpCisgICAgICAgIGlmIGxlbihhY3Rpb25fdHVwbGUpICE9IDI6CisgICAgICAgICAgICByYWlzZSBGbG93QmFkRm9ybWF0KCJFeHBlY3RlZCBrZXk9dmFsdWUgZm9ybWF0IGF0ICdhY3Rpb25zJyIpCisgICAgICAgIGlmIGFjdGlvbl90dXBsZVswXS5zdHJpcCgpLmxvd2VyKCk9PSJ2bGFuIjoKKyAgICAgICAgICAgIGlmIGFjdGlvbl90dXBsZVsxXS5zdHJpcCgpLmxvd2VyKCkgaW4gKCJub25lIiwgInN0cmlwIik6CisgICAgICAgICAgICAgICAgYWN0aW9ucy5hcHBlbmQoICgidmxhbiIsTm9uZSkgKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuYXBwZW5kKCAoInZsYW4iLCBpbnQoYWN0aW9uX3R1cGxlWzFdKSkgKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRmxvd0JhZEZvcm1hdCgiRXhwZWN0ZWQgaW50ZWdlciBhZnRlciB2bGFuPSBhdCAnYWN0aW9ucyciKQorICAgICAgICBlbGlmIGFjdGlvbl90dXBsZVswXS5zdHJpcCgpLmxvd2VyKCk9PSJvdXQiOgorICAgICAgICAgICAgYWN0aW9ucy5hcHBlbmQoICgib3V0Iiwgc3RyKGFjdGlvbl90dXBsZVsxXSkpICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEZsb3dCYWRGb3JtYXQoIlVuZXhwZWN0ZWQgJyVzJyBhdCAnYWN0aW9ucyciJWFjdGlvbl90dXBsZVswXSkKKyAgICBmbG93WydhY3Rpb25zJ10gPSBhY3Rpb25zCisKKworCitjbGFzcyBvZl90ZXN0X2Nvbm5lY3RvcigpOgorICAgICcnJ1RoaXMgaXMgYSBmYWtlIG9wZW5mbG93IGNvbm5lY3RvciBmb3IgdGVzdGluZy4KKyAgICAgICAgSXQgZG9lcyBub3RoaW5nIGFuZCBpdCBpcyB1c2VkIGZvciBydW5uaW5nIG9wZW52aW0gd2l0aG91dCBhbiBvcGVuZmxvdyBjb250cm9sbGVyIAorICAgICcnJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJhbXMpOgorICAgICAgICBzZWxmLm5hbWUgPSAib2ZjX3Rlc3QiCisgICAgICAgIHNlbGYucnVsZXM9e30KKyAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigndmltLk9GLlRFU1QnKQorICAgICAgICBzZWxmLmxvZ2dlci5zZXRMZXZlbCggZ2V0YXR0cihsb2dnaW5nLCBwYXJhbXMuZ2V0KCJvZl9kZWJ1ZyIsICJFUlJPUiIpICkgKQorICAgIGRlZiBnZXRfb2Zfc3dpdGNoZXMoc2VsZik6CisgICAgICAgIHJldHVybiAwLCAoKQorICAgIGRlZiBvYnRhaW5fcG9ydF9jb3JyZXNwb25kZW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDAsICgpCisgICAgZGVmIGRlbF9mbG93KHNlbGYsIGZsb3dfbmFtZSk6CisgICAgICAgIGlmIGZsb3dfbmFtZSBpbiBzZWxmLnJ1bGVzOgorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoImRlbF9mbG93IE9LIikKKyAgICAgICAgICAgIGRlbCBzZWxmLnJ1bGVzW2Zsb3dfbmFtZV0KKyAgICAgICAgICAgIHJldHVybiAwLCBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvZ2dlci53YXJuaW5nKCJkZWxfZmxvdyBub3QgZm91bmQiKQorICAgICAgICAgICAgcmV0dXJuIC0xLCAiZmxvdyAlcyBub3QgZm91bmQiCisgICAgZGVmIG5ld19mbG93KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnJ1bGVzWyBkYXRhWyJuYW1lIl0gXSA9IGRhdGEKKyAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoIm5ld19mbG93IE9LIikKKyAgICAgICAgcmV0dXJuIDAsIE5vbmUKKyAgICBkZWYgZ2V0X29mX3J1bGVzKHNlbGYsIHRyYW5zbGF0ZV9vZl9wb3J0cz1UcnVlKToKKyAgICAgICAgcmV0dXJuIDAsIHNlbGYucnVsZXMKKworICAgIGRlZiBjbGVhcl9hbGxfZmxvd3Moc2VsZik6CisgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJjbGVhcl9hbGxfZmxvd3MgT0siKQorICAgICAgICBzZWxmLnJ1bGVzPXt9CisgICAgICAgIHJldHVybiAwLCBOb25lCisKKworCitjbGFzcyBvcGVuZmxvd190aHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIE9GX2Nvbm5lY3RvciwgZGIsIGRiX2xvY2ssIG9mX3Rlc3QsIHBtcF93aXRoX3NhbWVfdmxhbiwgZGVidWc9J0VSUk9SJyk6CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKworICAgICAgICBzZWxmLmRiID0gZGIKKyAgICAgICAgc2VsZi5wbXBfd2l0aF9zYW1lX3ZsYW4gPSBwbXBfd2l0aF9zYW1lX3ZsYW4KKyAgICAgICAgc2VsZi5uYW1lID0gIm9wZW5mbG93IgorICAgICAgICBzZWxmLnRlc3QgPSBvZl90ZXN0CisgICAgICAgIHNlbGYuZGJfbG9jayA9IGRiX2xvY2sKKyAgICAgICAgc2VsZi5PRl9jb25uZWN0b3IgPSBPRl9jb25uZWN0b3IKKyAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigndmltLk9GJykKKyAgICAgICAgc2VsZi5sb2dnZXIuc2V0TGV2ZWwoIGdldGF0dHIobG9nZ2luZywgZGVidWcpICkKKworICAgICAgICBzZWxmLnF1ZXVlTG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICAgICAgc2VsZi50YXNrUXVldWUgPSBRdWV1ZS5RdWV1ZSgyMDAwKQorICAgICAgICAKKyAgICBkZWYgaW5zZXJ0X3Rhc2soc2VsZiwgdGFzaywgKmFkaXRpb25hbCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucXVldWVMb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgdGFzayA9IHNlbGYudGFza1F1ZXVlLnB1dCggKHRhc2ssKSArIGFkaXRpb25hbCwgdGltZW91dD01KSAKKyAgICAgICAgICAgIHNlbGYucXVldWVMb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgcmV0dXJuIDEsIE5vbmUKKyAgICAgICAgZXhjZXB0IFF1ZXVlLkZ1bGw6CisgICAgICAgICAgICByZXR1cm4gLTEsICJ0aW1lb3V0IGluc2VydGluZyBhIHRhc2sgb3ZlciBvcGVuZmxvdyB0aHJlYWQgIiArIHNlbGYubmFtZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYucXVldWVMb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgaWYgbm90IHNlbGYudGFza1F1ZXVlLmVtcHR5KCk6CisgICAgICAgICAgICAgICAgdGFzayA9IHNlbGYudGFza1F1ZXVlLmdldCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRhc2sgPSBOb25lCisgICAgICAgICAgICBzZWxmLnF1ZXVlTG9jay5yZWxlYXNlKCkKKworICAgICAgICAgICAgaWYgdGFzayBpcyBOb25lOgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAgICAgCisKKyAgICAgICAgICAgIGlmIHRhc2tbMF0gPT0gJ3VwZGF0ZS1uZXQnOgorICAgICAgICAgICAgICAgIHIsYyA9IHNlbGYudXBkYXRlX29mX2Zsb3dzKHRhc2tbMV0pCisgICAgICAgICAgICAgICAgI3VwZGF0ZSBkYXRhYmFzZSBzdGF0dXMKKyAgICAgICAgICAgICAgICBzZWxmLmRiX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgICAgICAgICBVUERBVEU9eydzdGF0dXMnOidFUlJPUicsICdsYXN0X2Vycm9yJzogc3RyKGMpfQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigicHJvY2Vzc2luZyB0YXNrICd1cGRhdGUtbmV0JyAlczogJXMiLCBzdHIodGFza1sxXSksIGMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgVVBEQVRFPXsnc3RhdHVzJzonQUNUSVZFJywgJ2xhc3RfZXJyb3InOiBOb25lfQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygicHJvY2Vzc2luZyB0YXNrICd1cGRhdGUtbmV0JyAlczogT0siLCBzdHIodGFza1sxXSkpCisgICAgICAgICAgICAgICAgc2VsZi5kYi51cGRhdGVfcm93cygnbmV0cycsIFVQREFURSwgV0hFUkU9eyd1dWlkJzp0YXNrWzFdfSkKKyAgICAgICAgICAgICAgICBzZWxmLmRiX2xvY2sucmVsZWFzZSgpCisKKyAgICAgICAgICAgIGVsaWYgdGFza1swXSA9PSAnY2xlYXItYWxsJzoKKyAgICAgICAgICAgICAgICByLGMgPSBzZWxmLmNsZWFyX2FsbF9mbG93cygpCisgICAgICAgICAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigicHJvY2Vzc2luZyB0YXNrICdjbGVhci1hbGwnOiAlcyIsIGMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoInByb2Nlc3NpbmcgdGFzayAnY2xlYXItYWxsJzogT0siKQorICAgICAgICAgICAgZWxpZiB0YXNrWzBdID09ICdleGl0JzoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygiZXhpdCBmcm9tIG9wZW5mbG93X3RocmVhZCIpCisgICAgICAgICAgICAgICAgc2VsZi50ZXJtaW5hdGUoKQorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJ1bmtub3duIHRhc2sgJXMiLCBzdHIodGFzaykpCisgICAgICAgICAgICAgICAgCisgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgcGFzcworICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAiOiBleGl0IGZyb20gb3BlbmZsb3dfdGhyZWFkIgorCisgICAgZGVmIHVwZGF0ZV9vZl9mbG93cyhzZWxmLCBuZXRfaWQpOgorICAgICAgICBwb3J0cz0oKQorICAgICAgICBzZWxmLmRiX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHNlbGVjdF89ICgndHlwZScsJ2FkbWluX3N0YXRlX3VwJywgJ3ZsYW4nLCAncHJvdmlkZXInLCAnYmluZF9uZXQnLCdiaW5kX3R5cGUnLCd1dWlkJykKKyAgICAgICAgcmVzdWx0LCBuZXRzID0gc2VsZi5kYi5nZXRfdGFibGUoRlJPTT0nbmV0cycsIFNFTEVDVD1zZWxlY3RfLCBXSEVSRT17J3V1aWQnOm5ldF9pZH0gKQorICAgICAgICAjZ2V0IGFsbCB0aGUgbmV0d29ya3MgYmluZGluZyB0byB0aGlzCisgICAgICAgIGlmIHJlc3VsdCA+IDA6CisgICAgICAgICAgICBpZiBuZXRzWzBdWydiaW5kX25ldCddOgorICAgICAgICAgICAgICAgIGJpbmRfaWQgPSBuZXRzWzBdWydiaW5kX25ldCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJpbmRfaWQgPSBuZXRfaWQKKyAgICAgICAgICAgICNnZXQgb3VyIG5ldCBhbmQgYWxsIGJpbmRfbmV0cworICAgICAgICAgICAgcmVzdWx0LCBuZXRzID0gc2VsZi5kYi5nZXRfdGFibGUoRlJPTT0nbmV0cycsIFNFTEVDVD1zZWxlY3RfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkVfT1I9eydiaW5kX25ldCc6YmluZF9pZCwgJ3V1aWQnOmJpbmRfaWR9ICkKKyAgICAgICAgICAgIAorICAgICAgICBzZWxmLmRiX2xvY2sucmVsZWFzZSgpCisgICAgICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgICAgICByZXR1cm4gLTEsICJEQiBlcnJvciBnZXR0aW5nIG5ldDogIiArIG5ldHMKKyAgICAgICAgI2VsaWYgcmVzdWx0PT0wOgorICAgICAgICAgICAgI25ldCBoYXMgYmVlbiBkZWxldGVkCisgICAgICAgIGlmYWNlc19uYiA9IDAKKyAgICAgICAgZGF0YWJhc2VfZmxvd3MgPSBbXQorICAgICAgICBmb3IgbmV0IGluIG5ldHM6CisgICAgICAgICAgICBuZXRfaWQgPSBuZXRbInV1aWQiXQorICAgICAgICAgICAgaWYgbmV0WydhZG1pbl9zdGF0ZV91cCddID09ICdmYWxzZSc6CisgICAgICAgICAgICAgICAgbmV0Wydwb3J0cyddID0gKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kYl9sb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgICAgIG5iX3BvcnRzLCBuZXRfcG9ydHMgPSBzZWxmLmRiLmdldF90YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEZST009J3BvcnRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVD0oJ3N3aXRjaF9wb3J0JywndmxhbicsJ3V1aWQnLCdtYWMnLCd0eXBlJywnbW9kZWwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFPXsnbmV0X2lkJzpuZXRfaWQsICdhZG1pbl9zdGF0ZV91cCc6J3RydWUnLCAnc3RhdHVzJzonQUNUSVZFJ30gKQorICAgICAgICAgICAgICAgIHNlbGYuZGJfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICBpZiBuYl9wb3J0cyA8IDA6CisgICAgICAgICAgICAgICAgICAgICNwcmludCBzZWxmLm5hbWUsICI6IHVwZGF0ZV9vZl9mbG93cygpIEVSUk9SIGdldHRpbmcgcG9ydHMiLCBwb3J0cworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJEQiBlcnJvciBnZXR0aW5nIHBvcnRzIGZyb20gbmV0ICclcyc6ICVzIiAlIChuZXRfaWQsIG5ldF9wb3J0cykKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjYWRkIHRoZSBiaW5kaW5nIGFzIGFuIGV4dGVybmFsIHBvcnQKKyAgICAgICAgICAgICAgICBpZiBuZXRbJ3Byb3ZpZGVyJ10gYW5kIG5ldFsncHJvdmlkZXInXVs6OV09PSJvcGVuZmxvdzoiOgorICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9wb3J0PXsidHlwZSI6ImV4dGVybmFsIiwibWFjIjpOb25lfQorICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9wb3J0Wyd1dWlkJ10gPSBuZXRfaWQgKyAiLjEiICNmYWtlIHV1aWQKKyAgICAgICAgICAgICAgICAgICAgaWYgbmV0Wydwcm92aWRlciddWy01Ol09PSI6dmxhbiI6CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9wb3J0WyJ2bGFuIl0gPSBuZXRbInZsYW4iXQorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfcG9ydFsic3dpdGNoX3BvcnQiXSA9IG5ldFsncHJvdmlkZXInXVs5Oi01XQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfcG9ydFsidmxhbiJdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfcG9ydFsic3dpdGNoX3BvcnQiXSA9IG5ldFsncHJvdmlkZXInXVs5Ol0KKyAgICAgICAgICAgICAgICAgICAgbmV0X3BvcnRzID0gbmV0X3BvcnRzICsgKGV4dGVybmFsX3BvcnQsKQorICAgICAgICAgICAgICAgICAgICBuYl9wb3J0cyArPSAxCisgICAgICAgICAgICAgICAgbmV0Wydwb3J0cyddID0gbmV0X3BvcnRzCisgICAgICAgICAgICAgICAgaWZhY2VzX25iICs9IG5iX3BvcnRzCisgICAgICAgIAorICAgICAgICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgZmxvd3MgdGhhdCB3aWxsIGJlIGFmZmVjdGVkIGJ5IHRoaXMgTkVUIAorICAgICAgICAgICAgc2VsZi5kYl9sb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgcmVzdWx0LCBkYXRhYmFzZV9uZXRfZmxvd3MgPSBzZWxmLmRiLmdldF90YWJsZShGUk9NPSdvZl9mbG93cycsIFdIRVJFPXsnbmV0X2lkJzpuZXRfaWR9KQorICAgICAgICAgICAgc2VsZi5kYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAiOiB1cGRhdGVfb2ZfZmxvd3MoKSBFUlJPUiBnZXR0aW5nIGZsb3dzIGZyb20gZGF0YWJhc2UiLCBkYXRhYmFzZV9mbG93cworICAgICAgICAgICAgICAgIHJldHVybiAtMSwgIkRCIGVycm9yIGdldHRpbmcgZmxvd3MgZnJvbSBuZXQgJyVzJzogJXMiICUobmV0X2lkLCBkYXRhYmFzZV9uZXRfZmxvd3MpCisgICAgICAgICAgICBkYXRhYmFzZV9mbG93cyArPSBkYXRhYmFzZV9uZXRfZmxvd3MKKyAgICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgZmxvd3Mgd2hlcmUgbmV0X2lkPT1OVUxMIHRoYXQgbWVhbnMgbmV0IGRlbGV0ZWQgKEF0IERCIGZvcmVpZ24ga2V5OiBPbiBkZWxldGUgc2V0IG51bGwpCisgICAgICAgIHNlbGYuZGJfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgcmVzdWx0LCBkYXRhYmFzZV9uZXRfZmxvd3MgPSBzZWxmLmRiLmdldF90YWJsZShGUk9NPSdvZl9mbG93cycsIFdIRVJFPXsnbmV0X2lkJzpOb25lfSkKKyAgICAgICAgc2VsZi5kYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICAgICAgI3ByaW50IHNlbGYubmFtZSwgIjogdXBkYXRlX29mX2Zsb3dzKCkgRVJST1IgZ2V0dGluZyBmbG93cyBmcm9tIGRhdGFiYXNlIiwgZGF0YWJhc2VfZmxvd3MKKyAgICAgICAgICAgIHJldHVybiAtMSwgIkRCIGVycm9yIGdldHRpbmcgZmxvd3MgZnJvbSBuZXQgJ251bGwnOiAlcyIgJShkYXRhYmFzZV9uZXRfZmxvd3MpCisgICAgICAgIGRhdGFiYXNlX2Zsb3dzICs9IGRhdGFiYXNlX25ldF9mbG93cworCisgICAgICAgICNHZXQgdGhlIGV4aXN0aW5nIGZsb3dzIGF0IG9wZW5mbG93IGNvbnRyb2xsZXIKKyAgICAgICAgcmVzdWx0LCBvZl9mbG93cyA9IHNlbGYuT0ZfY29ubmVjdG9yLmdldF9vZl9ydWxlcygpIAorICAgICAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICAgICAgI3ByaW50IHNlbGYubmFtZSwgIjogdXBkYXRlX29mX2Zsb3dzKCkgRVJST1IgZ2V0dGluZyBmbG93cyBmcm9tIGNvbnRyb2xsZXIiLCBvZl9mbG93cworICAgICAgICAgICAgcmV0dXJuIC0xLCAiT0YgZXJyb3IgZ2V0dGluZyBmbG93czogIiArIG9mX2Zsb3dzCisKKyAgICAgICAgaWYgaWZhY2VzX25iIDwgMjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBuZXRbJ3R5cGUnXSA9PSAncHRwJzoKKyAgICAgICAgICAgIGlmIGlmYWNlc19uYiA+IDI6CisgICAgICAgICAgICAgICAgI3ByaW50IHNlbGYubmFtZSwgJ0Vycm9yLCBuZXR3b3JrICcrc3RyKG5ldF9pZCkrJyBoYXMgYmVlbiBkZWZpbmVkIGFzIHB0cCBidXQgaXQgaGFzICcrXAorICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgIHN0cihpZmFjZXNfbmIpKycgaW50ZXJmYWNlcy4nCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAiJ3B0cCcgdHlwZSBuZXR3b3JrIGNhbm5vdCBjb25uZWN0ICVkIGludGVyZmFjZXMsIG9ubHkgMiIgJSBpZmFjZXNfbmIKKyAgICAgICAgZWxpZiBuZXRbJ3R5cGUnXSA9PSAnZGF0YSc6CisgICAgICAgICAgICBpZiBpZmFjZXNfbmIgPiAyIGFuZCBzZWxmLnBtcF93aXRoX3NhbWVfdmxhbjoKKyAgICAgICAgICAgICAgICAjIGNoZWNrIGFsbCBwb3J0cyBhcmUgVkxBTiAodGFnZ2VkKSBvciBub25lCisgICAgICAgICAgICAgICAgdmxhbl90YWcgPSBOb25lCisgICAgICAgICAgICAgICAgZm9yIHBvcnQgaW4gcG9ydHM6CisgICAgICAgICAgICAgICAgICAgIGlmIHBvcnRbInR5cGUiXT09ImV4dGVybmFsIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcnRbInZsYW4iXSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcnRbInZsYW4iXSE9bmV0WyJ2bGFuIl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9IkV4dGVybmFsIHBvcnQgdmxhbi10YWcgYW5kIG5ldCB2bGFuLXRhZyBtdXN0IGJlIHRoZSBzYW1lIHdoZW4gZmxhZyAnb2ZfY29udHJvbGxlcl9uZXRzX3dpdGhfc2FtZV92bGFuJyBpcyBUcnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAiRXJyb3IiLCB0ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSwgdGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZsYW5fdGFnID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYW5fdGFnPVRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHZsYW5fdGFnPT1GYWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iUGFzc3Rocm91Z2ggYW5kIGV4dGVybmFsIHBvcnQgdmxhbi10YWdnZWQgY2FuIG5vdCBiZSBjb25uZWN0ZWQgd2hlbiBmbGFnICdvZl9jb250cm9sbGVyX25ldHNfd2l0aF9zYW1lX3ZsYW4nIGlzIFRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCBzZWxmLm5hbWUsICJFcnJvciIsIHRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCB0ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZsYW5fdGFnID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYW5fdGFnPUZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiB2bGFuX3RhZyA9PSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJTUi1JT1YgYW5kIGV4dGVybmFsIHBvcnQgbm90IHZsYW4tdGFnZ2VkIGNhbiBub3QgYmUgY29ubmVjdGVkIHdoZW4gZmxhZyAnb2ZfY29udHJvbGxlcl9uZXRzX3dpdGhfc2FtZV92bGFuJyBpcyBUcnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAiRXJyb3IiLCB0ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSwgdGV4dAorICAgICAgICAgICAgICAgICAgICBlbGlmIHBvcnRbIm1vZGVsIl09PSJQRiIgb3IgcG9ydFsibW9kZWwiXT09IlZGbm90U2hhcmVkIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZsYW5fdGFnID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxhbl90YWc9RmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdmxhbl90YWc9PVRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iUGFzc3Rocm91Z2ggYW5kIFNSLUlPViBwb3J0cyBjYW5ub3QgYmUgY29ubmVjdGVkIHdoZW4gZmxhZyAnb2ZfY29udHJvbGxlcl9uZXRzX3dpdGhfc2FtZV92bGFuJyBpcyBUcnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCBzZWxmLm5hbWUsICJFcnJvciIsIHRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsIHRleHQKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBwb3J0WyJtb2RlbCJdID09ICJWRiI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2bGFuX3RhZyA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYW5fdGFnPVRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdmxhbl90YWc9PUZhbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9IlBhc3N0aHJvdWdoIGFuZCBTUi1JT1YgcG9ydHMgY2Fubm90IGJlIGNvbm5lY3RlZCB3aGVuIGZsYWcgJ29mX2NvbnRyb2xsZXJfbmV0c193aXRoX3NhbWVfdmxhbicgaXMgVHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAiRXJyb3IiLCB0ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCB0ZXh0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gLTEsICdPbmx5IHB0cCBhbmQgZGF0YSBuZXR3b3JrcyBhcmUgc3VwcG9ydGVkIGZvciBvcGVuZmxvdycKKyAgICAgICAgICAgIAorICAgICAgICAjIGNhbGN1bGF0ZSBuZXcgZmxvd3MgdG8gYmUgaW5zZXJ0ZWQKKyAgICAgICAgcmVzdWx0LCBuZXdfZmxvd3MgPSBzZWxmLl9jb21wdXRlX25ldF9mbG93cyhuZXRzKQorICAgICAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCwgbmV3X2Zsb3dzCisKKyAgICAgICAgI21vZGlmeSBkYXRhYmFzZSBmbG93cyBmb3JtYXQgYW5kIGdldCB0aGUgdXNlZCBuYW1lcworICAgICAgICB1c2VkX25hbWVzPVtdCisgICAgICAgIGZvciBmbG93IGluIGRhdGFiYXNlX2Zsb3dzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNoYW5nZV9kYjJvZihmbG93KQorICAgICAgICAgICAgZXhjZXB0IEZsb3dCYWRGb3JtYXQgYXMgZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiRXhjZXB0aW9uIEZsb3dCYWRGb3JtYXQ6ICclcycsIGZsb3c6ICclcyciLHN0cihlKSwgc3RyKGZsb3cpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB1c2VkX25hbWVzLmFwcGVuZChmbG93WyduYW1lJ10pCisgICAgICAgIG5hbWVfaW5kZXg9MAorICAgICAgICAjaW5zZXJ0IGF0IGRhdGFiYXNlIHRoZSBuZXcgZmxvd3MsIGNoYW5nZSBhY3Rpb25zIHRvIGh1bWFuIHRleHQKKyAgICAgICAgZm9yIGZsb3cgaW4gbmV3X2Zsb3dzOgorICAgICAgICAgICAgIzEgY2hlY2sgaWYgYW4gZXF1YWwgZmxvdyBpcyBhbHJlYWR5IHByZXNlbnQKKyAgICAgICAgICAgIGluZGV4ID0gc2VsZi5fY2hlY2tfZmxvd19hbHJlYWR5X3ByZXNlbnQoZmxvdywgZGF0YWJhc2VfZmxvd3MpCisgICAgICAgICAgICBpZiBpbmRleD49MDoKKyAgICAgICAgICAgICAgICBkYXRhYmFzZV9mbG93c1tpbmRleF1bIm5vdCBkZWxldGUiXT1UcnVlCisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoIlNraXBwaW5nIGFscmVhZHkgcHJlc2VudCBmbG93ICVzIiwgc3RyKGZsb3cpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjMiBsb29rIGZvciBhIG5vbiB1c2VkIG5hbWUKKyAgICAgICAgICAgIGZsb3dfbmFtZT1mbG93WyJuZXRfaWQiXSsiLiIrc3RyKG5hbWVfaW5kZXgpCisgICAgICAgICAgICB3aGlsZSBmbG93X25hbWUgaW4gdXNlZF9uYW1lcyBvciBmbG93X25hbWUgaW4gb2ZfZmxvd3M6ICAgICAgICAgCisgICAgICAgICAgICAgICAgbmFtZV9pbmRleCArPSAxICAgCisgICAgICAgICAgICAgICAgZmxvd19uYW1lPWZsb3dbIm5ldF9pZCJdKyIuIitzdHIobmFtZV9pbmRleCkKKyAgICAgICAgICAgIHVzZWRfbmFtZXMuYXBwZW5kKGZsb3dfbmFtZSkKKyAgICAgICAgICAgIGZsb3dbJ25hbWUnXSA9IGZsb3dfbmFtZQorICAgICAgICAgICAgIzMgaW5zZXJ0IGF0IG9wZW5mbG93CisgICAgICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBzZWxmLk9GX2Nvbm5lY3Rvci5uZXdfZmxvdyhmbG93KQorICAgICAgICAgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAiOiBFcnJvciAnJXMnIGF0IGZsb3cgaW5zZXJ0aW9uIiAlIGMsIGZsb3cKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEsIGNvbnRlbnQKKyAgICAgICAgICAgICM0IGluc2VydCBhdCBkYXRhYmFzZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNoYW5nZV9vZjJkYihmbG93KQorICAgICAgICAgICAgZXhjZXB0IEZsb3dCYWRGb3JtYXQgYXMgZToKKyAgICAgICAgICAgICAgICAjcHJpbnQgc2VsZi5uYW1lLCAiOiBFcnJvciBFeGNlcHRpb24gRmxvd0JhZEZvcm1hdCAnJXMnIiAlIHN0cihlKSwgZmxvdworICAgICAgICAgICAgICAgIHJldHVybiAtMSwgc3RyKGUpCisgICAgICAgICAgICBzZWxmLmRiX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBzZWxmLmRiLm5ld19yb3coJ29mX2Zsb3dzJywgZmxvdykKKyAgICAgICAgICAgIHNlbGYuZGJfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgICAgICAgICAgI3ByaW50IHNlbGYubmFtZSwgIjogRXJyb3IgJyVzJyBhdCBkYXRhYmFzZSBpbnNlcnRpb24iICUgY29udGVudCwgZmxvdworICAgICAgICAgICAgICAgIHJldHVybiAtMSwgY29udGVudAorCisgICAgICAgICNkZWxldGUgbm90IG5lZWRlZCBvbGQgZmxvd3MgZnJvbSBvcGVuZmxvdyBhbmQgZnJvbSBEREJCLCAKKyAgICAgICAgI2NoZWNrIHRoYXQgdGhlIG5lZWRlZCBmbG93cyBhdCBEREJCIGFyZSBwcmVzZW50IGluIGNvbnRyb2xsZXIgb3IgaW5zZXJ0IHRoZW0gb3RoZXJ3aXNlCisgICAgICAgIGZvciBmbG93IGluIGRhdGFiYXNlX2Zsb3dzOgorICAgICAgICAgICAgaWYgIm5vdCBkZWxldGUiIGluIGZsb3c6CisgICAgICAgICAgICAgICAgaWYgZmxvd1sibmFtZSJdIG5vdCBpbiBvZl9mbG93czoKKyAgICAgICAgICAgICAgICAgICAgI25vdCBpbiBjb250cm9sbGVyLCBpbnNlcnQgaXQKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBjb250ZW50ID0gc2VsZi5PRl9jb25uZWN0b3IubmV3X2Zsb3coZmxvdykKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCBzZWxmLm5hbWUsICI6IEVycm9yICclcycgYXQgZmxvdyBpbnNlcnRpb24iICUgYywgZmxvdworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCBjb250ZW50CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICNEZWxldGUgZmxvdworICAgICAgICAgICAgaWYgZmxvd1sibmFtZSJdIGluIG9mX2Zsb3dzOgorICAgICAgICAgICAgICAgIHJlc3VsdCwgY29udGVudCA9IHNlbGYuT0ZfY29ubmVjdG9yLmRlbF9mbG93KGZsb3dbJ25hbWUnXSkKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQ8MDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoImNhbm5vdCBkZWxldGUgZmxvdyAnJXMnIGZyb20gT0Y6ICVzIiwgZmxvd1snbmFtZSddLCBjb250ZW50ICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgI3NraXAgZGVsZXRpb24gZnJvbSBkYXRhYmFzZQorICAgICAgICAgICAgI2RlbGV0ZSBmcm9tIGRhdGFiYXNlCisgICAgICAgICAgICBzZWxmLmRiX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICByZXN1bHQsIGNvbnRlbnQgPSBzZWxmLmRiLmRlbGV0ZV9yb3dfYnlfa2V5KCdvZl9mbG93cycsICdpZCcsIGZsb3dbJ2lkJ10pCisgICAgICAgICAgICBzZWxmLmRiX2xvY2sucmVsZWFzZSgpCisgICAgICAgICAgICBpZiByZXN1bHQ8MDoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiY2Fubm90IGRlbGV0ZSBmbG93ICclcycgZnJvbSBEQjogJXMiLCBmbG93WyduYW1lJ10sIGNvbnRlbnQgKQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIDAsICdTdWNjZXNzJworCisgICAgZGVmIGNsZWFyX2FsbF9mbG93cyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYudGVzdDoKKyAgICAgICAgICAgICAgICBzZWxmLk9GX2Nvbm5lY3Rvci5jbGVhcl9hbGxfZmxvd3MoKQorICAgICAgICAgICAgI3JlbW92ZSBmcm9tIGRhdGFiYXNlCisgICAgICAgICAgICBzZWxmLmRiX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICBzZWxmLmRiLmRlbGV0ZV9yb3dfYnlfa2V5KCdvZl9mbG93cycsIE5vbmUsIE5vbmUpICN0aGlzIHdpbGwgZGVsZXRlIGFsbCBsaW5lcworICAgICAgICAgICAgc2VsZi5kYl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgcmV0dXJuIDAsIE5vbmUKKyAgICAgICAgZXhjZXB0IHJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVxdWVzdEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgI3ByaW50IHNlbGYubmFtZSwgIjogY2xlYXJfYWxsX2Zsb3dzIEV4Y2VwdGlvbjoiLCBzdHIoZSkKKyAgICAgICAgICAgIHJldHVybiAtMSwgc3RyKGUpCisKKyAgICBmbG93X2ZpZWxkcz0oJ3ByaW9yaXR5JywgJ3ZsYW4nLCAnaW5ncmVzc19wb3J0JywgJ2FjdGlvbnMnLCAnZHN0X21hYycsICdzcmNfbWFjJywgJ25ldF9pZCcpCisgICAgZGVmIF9jaGVja19mbG93X2FscmVhZHlfcHJlc2VudChzZWxmLCBuZXdfZmxvdywgZmxvd19saXN0KToKKyAgICAgICAgJycnY2hlY2sgaWYgdGhlIHNhbWUgZmxvdyBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGZsb3cgbGlzdAorICAgICAgICBUaGUgZmxvdyBpcyByZXBlYXRlZCBpZiBhbGwgdGhlIGZpZWxkcywgYXBhcnQgZnJvbSBuYW1lLCBhcmUgZXF1YWwKKyAgICAgICAgUmV0dXJuIHRoZSBpbmRleCBvZiBtYXRjaGluZyBmbG93LCAtMSBpZiBub3QgbWF0Y2gnJycKKyAgICAgICAgaW5kZXg9MAorICAgICAgICBmb3IgZmxvdyBpbiBmbG93X2xpc3Q6CisgICAgICAgICAgICBlcXVhbD1UcnVlCisgICAgICAgICAgICBmb3IgZiBpbiBzZWxmLmZsb3dfZmllbGRzOgorICAgICAgICAgICAgICAgIGlmIGZsb3cuZ2V0KGYpICE9IG5ld19mbG93LmdldChmKToKKyAgICAgICAgICAgICAgICAgICAgZXF1YWw9RmFsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGVxdWFsOgorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleAorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgCisgICAgZGVmIF9jb21wdXRlX25ldF9mbG93cyhzZWxmLCBuZXRzKToKKyAgICAgICAgbmV3X2Zsb3dzPVtdCisgICAgICAgIG5ld19icm9hZGNhc3RfZmxvd3M9e30KKyAgICAgICAgbmJfcG9ydHMgPSAwCisKKyAgICAgICAgIyBDaGVjayBzd2l0Y2hfcG9ydCBpbmZvcm1hdGlvbiBpcyByaWdodAorICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygiX2NvbXB1dGVfbmV0X2Zsb3dzIG5ldHM6ICVzIiwgc3RyKG5ldHMpKQorICAgICAgICBmb3IgbmV0IGluIG5ldHM6CisgICAgICAgICAgICBmb3IgcG9ydCBpbiBuZXRbJ3BvcnRzJ106CisgICAgICAgICAgICAgICAgbmJfcG9ydHMgKz0gMQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRlc3QgYW5kIHN0cihwb3J0Wydzd2l0Y2hfcG9ydCddKSBub3QgaW4gc2VsZi5PRl9jb25uZWN0b3IucHAyb2ZpOgorICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0PSAic3dpdGNoIHBvcnQgbmFtZSAnJXMnIGlzIG5vdCB2YWxpZCBmb3IgdGhlIG9wZW5mbG93IGNvbnRyb2xsZXIiICUgc3RyKHBvcnRbJ3N3aXRjaF9wb3J0J10pCisgICAgICAgICAgICAgICAgICAgICNwcmludCBzZWxmLm5hbWUsICI6IEVSUk9SICIgKyBlcnJvcl90ZXh0CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dAorCisgICAgICAgIGZvciBuZXRfc3JjIGluIG5ldHM6CisgICAgICAgICAgICBuZXRfaWQgPSBuZXRfc3JjWyJ1dWlkIl0KKyAgICAgICAgICAgIGZvciBuZXRfZHN0IGluIG5ldHM6CisgICAgICAgICAgICAgICAgdmxhbl9uZXRfaW4gID0gTm9uZQorICAgICAgICAgICAgICAgIHZsYW5fbmV0X291dCA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBuZXRfc3JjID09IG5ldF9kc3Q6CisgICAgICAgICAgICAgICAgICAgICNpbnRyYSBuZXQgcnVsZXMgICAgCisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gMTAwMAorICAgICAgICAgICAgICAgIGVsaWYgbmV0X3NyY1snYmluZF9uZXQnXSA9PSBuZXRfZHN0Wyd1dWlkJ106CisgICAgICAgICAgICAgICAgICAgIGlmIG5ldF9zcmMuZ2V0KCdiaW5kX3R5cGUnKSBhbmQgbmV0X3NyY1snYmluZF90eXBlJ11bMDo1XSA9PSAidmxhbjoiOgorICAgICAgICAgICAgICAgICAgICAgICAgdmxhbl9uZXRfb3V0ID0gaW50KG5ldF9zcmNbJ2JpbmRfdHlwZSddWzU6XSkKKyAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSAxMTAwCisgICAgICAgICAgICAgICAgZWxpZiBuZXRfZHN0WydiaW5kX25ldCddID09IG5ldF9zcmNbJ3V1aWQnXToKKyAgICAgICAgICAgICAgICAgICAgaWYgbmV0X2RzdC5nZXQoJ2JpbmRfdHlwZScpIGFuZCBuZXRfZHN0WydiaW5kX3R5cGUnXVswOjVdID09ICJ2bGFuOiI6CisgICAgICAgICAgICAgICAgICAgICAgICB2bGFuX25ldF9pbiA9IGludChuZXRfZHN0WydiaW5kX3R5cGUnXVs1Ol0pCisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gMTEwMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICNuZXRzIG5vdCBiaW5kaW5nCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZm9yIHNyY19wb3J0IGluIG5ldF9zcmNbJ3BvcnRzJ106CisgICAgICAgICAgICAgICAgICAgIHZsYW5faW4gID0gdmxhbl9uZXRfaW4KKyAgICAgICAgICAgICAgICAgICAgaWYgdmxhbl9pbiA9PSBOb25lICBhbmQgc3JjX3BvcnRbJ3ZsYW4nXSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgdmxhbl9pbiAgPSBzcmNfcG9ydFsndmxhbiddCisgICAgICAgICAgICAgICAgICAgIGVsaWYgdmxhbl9pbiAhPSBOb25lICBhbmQgc3JjX3BvcnRbJ3ZsYW4nXSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgI1RPRE8gdGhpcyBpcyBzb21ldGhpbmcgdGhhdCB3ZSBjYW4gbm90IGRvLiBJdCByZXF1aXJlcyBhIGRvdWJsZSBWTEFOIGNoZWNrCisgICAgICAgICAgICAgICAgICAgICAgICAjb3V0ZXIgVkxBTiBzaG91bGQgYmUgc3JjX3BvcnRbJ3ZsYW4nXSBhbmQgaW5uZXIgVkxBTiBzaG91bGQgYmUgdmxhbl9pbgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAjIEJST0FEQ0FTVDoKKyAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0X2tleSA9IHNyY19wb3J0Wyd1dWlkJ10gKyAiLiIgKyBzdHIodmxhbl9pbikKKyAgICAgICAgICAgICAgICAgICAgaWYgYnJvYWRjYXN0X2tleSBpbiBuZXdfYnJvYWRjYXN0X2Zsb3dzOgorICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19icm9hZGNhc3QgPSBuZXdfYnJvYWRjYXN0X2Zsb3dzW2Jyb2FkY2FzdF9rZXldCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2Jyb2FkY2FzdCA9IHsncHJpb3JpdHknOiBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV0X2lkJzogIG5ldF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHN0X21hYyc6ICdmZjpmZjpmZjpmZjpmZjpmZicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZ3Jlc3NfcG9ydCI6IHN0cihzcmNfcG9ydFsnc3dpdGNoX3BvcnQnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbXSAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19icm9hZGNhc3RfZmxvd3NbYnJvYWRjYXN0X2tleV0gPSBmbG93X2Jyb2FkY2FzdAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmxhbl9pbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2Jyb2FkY2FzdFsndmxhbl9pZCddID0gc3RyKHZsYW5faW4pCisKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRzdF9wb3J0IGluIG5ldF9kc3RbJ3BvcnRzJ106CisgICAgICAgICAgICAgICAgICAgICAgICB2bGFuX291dCA9IHZsYW5fbmV0X291dCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZsYW5fb3V0ID09IE5vbmUgYW5kIGRzdF9wb3J0Wyd2bGFuJ10gIT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bGFuX291dCA9IGRzdF9wb3J0Wyd2bGFuJ10KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdmxhbl9vdXQgIT0gTm9uZSBhbmQgZHN0X3BvcnRbJ3ZsYW4nXSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNUT0RPIHRoaXMgaXMgc29tZXRoaW5nIHRoYXQgd2UgY2FuIG5vdCBkby4gSXQgcmVxdWlyZXMgYSBkb3VibGUgVkxBTiBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjb3V0ZXIgVkxBTiBzaG91bGQgYmUgZHN0X3BvcnRbJ3ZsYW4nXSBhbmQgaW5uZXIgVkxBTiBzaG91bGQgYmUgdmxhbl9vdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgI2lmIHNyY19wb3J0ID09IGRzdF9wb3J0OgorICAgICAgICAgICAgICAgICAgICAgICAgIyAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3JjX3BvcnRbJ3N3aXRjaF9wb3J0J10gPT0gZHN0X3BvcnRbJ3N3aXRjaF9wb3J0J10gYW5kIHZsYW5faW4gPT0gdmxhbl9vdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb3cgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaW9yaXR5IjogcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25ldF9pZCc6ICBuZXRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZ3Jlc3NfcG9ydCI6IHN0cihzcmNfcG9ydFsnc3dpdGNoX3BvcnQnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbXQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmxhbl9pbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93Wyd2bGFuX2lkJ10gPSBzdHIodmxhbl9pbikKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYWxsb3cgdGhhdCBvbmUgcG9ydCBoYXZlIG5vIG1hYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgZHN0X3BvcnRbJ21hYyddIGlzIE5vbmUgb3IgbmJfcG9ydHM9PTI6ICAjIHBvaW50IHRvIHBvaW50IG9yIG5ldHMgd2l0aCAyIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd1sncHJpb3JpdHknXSA9IHByaW9yaXR5LTUgICMgbGVzcyBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93Wydkc3RfbWFjJ10gPSBzdHIoZHN0X3BvcnRbJ21hYyddKQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2bGFuX291dCA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZsYW5faW4gIT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd1snYWN0aW9ucyddLmFwcGVuZCggKCd2bGFuJyxOb25lKSApCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dbJ2FjdGlvbnMnXS5hcHBlbmQoICgndmxhbicsIHZsYW5fb3V0ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgZmxvd1snYWN0aW9ucyddLmFwcGVuZCggKCdvdXQnLCBzdHIoZHN0X3BvcnRbJ3N3aXRjaF9wb3J0J10pKSApCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NoZWNrX2Zsb3dfYWxyZWFkeV9wcmVzZW50KGZsb3csIG5ld19mbG93cykgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygiU2tpcHBpbmcgcmVwZWF0ZWQgZmxvdyAnJXMnIiwgc3RyKGZsb3cpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19mbG93cy5hcHBlbmQoZmxvdykKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAjIEJST0FEQ0FTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5iX3BvcnRzIDw9IDI6ICAjIHBvaW50IHRvIG11bHRpcG9pbnQgb3IgbmV0cyB3aXRoIG1vcmUgdGhhbiAyIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9ICh2bGFuX291dCwgc3RyKGRzdF9wb3J0Wydzd2l0Y2hfcG9ydCddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG91dCBub3QgaW4gZmxvd19icm9hZGNhc3RbJ2FjdGlvbnMnXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2Jyb2FkY2FzdFsnYWN0aW9ucyddLmFwcGVuZCggb3V0ICkKKworICAgICAgICAjQlJPQURDQVNUCisgICAgICAgIGZvciBmbG93X2Jyb2FkY2FzdCBpbiBuZXdfYnJvYWRjYXN0X2Zsb3dzLnZhbHVlcygpOiAgICAgIAorICAgICAgICAgICAgaWYgbGVuKGZsb3dfYnJvYWRjYXN0WydhY3Rpb25zJ10pPT0wOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlICNub3RoaW5nIHRvIGRvLCBza2lwCisgICAgICAgICAgICBmbG93X2Jyb2FkY2FzdFsnYWN0aW9ucyddLnNvcnQoKQorICAgICAgICAgICAgaWYgJ3ZsYW5faWQnIGluIGZsb3dfYnJvYWRjYXN0OgorICAgICAgICAgICAgICAgIHByZXZpb3VzX3ZsYW4gPSAwICAjIGluZGljYXRlcyB0aGF0IGEgcGFja2V0IGNvbnRhaW5zIGEgdmxhbiwgYW5kIHRoZSB2bGFuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByZXZpb3VzX3ZsYW4gPSBOb25lCisgICAgICAgICAgICBmaW5hbF9hY3Rpb25zPVtdCisgICAgICAgICAgICBhY3Rpb25fbnVtYmVyID0gMAorICAgICAgICAgICAgZm9yIGFjdGlvbiBpbiBmbG93X2Jyb2FkY2FzdFsnYWN0aW9ucyddOgorICAgICAgICAgICAgICAgIGlmIGFjdGlvblswXSAhPSBwcmV2aW91c192bGFuOgorICAgICAgICAgICAgICAgICAgICBmaW5hbF9hY3Rpb25zLmFwcGVuZCggKCd2bGFuJywgYWN0aW9uWzBdKSApCisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX3ZsYW4gPSBhY3Rpb25bMF0KKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wbXBfd2l0aF9zYW1lX3ZsYW4gYW5kIGFjdGlvbl9udW1iZXI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJDYW4gbm90IGludGVyY29ubmVjdCBkaWZmZXJlbnQgdmxhbiB0YWdzIGluIGEgbmV0d29yayB3aGVuIGZsYWcgJ29mX2NvbnRyb2xsZXJfbmV0c193aXRoX3NhbWVfdmxhbicgaXMgVHJ1ZS4iCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9udW1iZXIgKz0gMQorICAgICAgICAgICAgICAgIGZpbmFsX2FjdGlvbnMuYXBwZW5kKCAoJ291dCcsIGFjdGlvblsxXSkgKQorICAgICAgICAgICAgZmxvd19icm9hZGNhc3RbJ2FjdGlvbnMnXSA9IGZpbmFsX2FjdGlvbnMKKworICAgICAgICAgICAgaWYgc2VsZi5fY2hlY2tfZmxvd19hbHJlYWR5X3ByZXNlbnQoZmxvd19icm9hZGNhc3QsIG5ld19mbG93cykgPj0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygiU2tpcHBpbmcgcmVwZWF0ZWQgZmxvdyAnJXMnIiwgc3RyKGZsb3dfYnJvYWRjYXN0KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgCisgICAgICAgICAgICBuZXdfZmxvd3MuYXBwZW5kKGZsb3dfYnJvYWRjYXN0KSAgICAgICAgCisgICAgICAgIAorICAgICAgICAjVU5JRlkgb3BlbmZsb3cgcnVsZXMgd2l0aCB0aGUgc2FtZSBpbnB1dCBwb3J0IGFuZCB2bGFuIGFuZCB0aGUgc2FtZSBvdXRwdXQgYWN0aW9ucworICAgICAgICAjVGhlc2UgZmxvd3MgZGlmZmVyIGF0IHRoZSBkc3RfbWFjOyBhbmQgdGhleSBhcmUgdW5pZmllZCBieSBub3QgZmlsdGVyaW5nIGJ5IGRzdF9tYWMKKyAgICAgICAgI3RoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSBpcyBvbmx5IHR3byBwb3J0cy4gSXQgaXMgY29udmVydGVkIHRvIGEgcG9pbnQgdG8gcG9pbnQgY29ubmVjdGlvbgorICAgICAgICBmbG93X2RpY3Q9e30gIyB1c2UgYXMga2V5IHZsYW5faWQraW5ncmVzc19wb3J0IGFuZCBhcyB2YWx1ZSB0aGUgbGlzdCBvZiBmbG93cyBtYXRjaGluZyB0aGVzZSB2YWx1ZXMKKyAgICAgICAgZm9yIGZsb3cgaW4gbmV3X2Zsb3dzOgorICAgICAgICAgICAga2V5ID0gc3RyKGZsb3cuZ2V0KCJ2bGFuX2lkIikpKyI6IitmbG93WyJpbmdyZXNzX3BvcnQiXQorICAgICAgICAgICAgaWYga2V5IGluIGZsb3dfZGljdDoKKyAgICAgICAgICAgICAgICBmbG93X2RpY3Rba2V5XS5hcHBlbmQoZmxvdykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmxvd19kaWN0W2tleV09WyBmbG93IF0KKyAgICAgICAgbmV3X2Zsb3dzMj1bXQorICAgICAgICBmb3IgZmxvd19saXN0IGluIGZsb3dfZGljdC52YWx1ZXMoKToKKyAgICAgICAgICAgIGNvbnZlcnQycHRwPUZhbHNlCisgICAgICAgICAgICBpZiBsZW4gKGZsb3dfbGlzdCk+PTI6CisgICAgICAgICAgICAgICAgY29udmVydDJwdHA9VHJ1ZQorICAgICAgICAgICAgICAgIGZvciBmIGluIGZsb3dfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgZlsnYWN0aW9ucyddICE9IGZsb3dfbGlzdFswXVsnYWN0aW9ucyddOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydDJwdHA9RmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBjb252ZXJ0MnB0cDogIyBhZGQgb25seSBvbmUgdW5pZmllZCBydWxlIHdpdGhvdXQgZHN0X21hYworICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJDb252ZXJ0IGZsb3cgcnVsZXMgdG8gTk9OIG1hYyBkc3RfYWRkcmVzcyAiICsgc3RyKGZsb3dfbGlzdCkgKQorICAgICAgICAgICAgICAgIGZsb3dfbGlzdFswXS5wb3AoJ2RzdF9tYWMnKQorICAgICAgICAgICAgICAgIGZsb3dfbGlzdFswXVsicHJpb3JpdHkiXSAtPSA1CisgICAgICAgICAgICAgICAgbmV3X2Zsb3dzMi5hcHBlbmQoZmxvd19saXN0WzBdKQorICAgICAgICAgICAgZWxzZTogICMgYWRkIGFsbCB0aGUgcnVsZXMKKyAgICAgICAgICAgICAgICBuZXdfZmxvd3MyICs9IGZsb3dfbGlzdAorICAgICAgICByZXR1cm4gMCwgbmV3X2Zsb3dzMgorICAgICAgICAKZGlmZiAtLWdpdCBhL29wZW52aW0gYi9vcGVudmltCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlNDllMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVudmltCkBAIC0wLDAgKzEsMTA0NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBQWVRIT05fQVJHQ09NUExFVEVfT0sKKworIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworJycnCitUaGlzIGlzIGEgY2xpZW50IGZvciBtYW5hZ2luZyB0aGUgb3BlbnZpbSBzZXJ2ZXIuCitVc2VmdWwgZm9yIGh1bWFuIENMSSBtYW5hZ2VtZW50IG9mIGl0ZW1zIGF0IG9wZW52aW0gIAorJycnCitfX2F1dGhvcl9fPSJBbGZvbnNvIFRpZXJubywgR2VyYXJkbyBHYXJjaWEiCitfX2RhdGVfXyA9IiQyNi1ub3YtMjAxNCAxOTowOToyOSQiCitfX3ZlcnNpb25fXz0iMC40LjAtcjQ0MyIKK3ZlcnNpb25fZGF0ZT0iTm92IDIwMTUiCituYW1lPSJvcGVudmltIgorCitmcm9tIGFyZ2NvbXBsZXRlLmNvbXBsZXRlcnMgaW1wb3J0IEZpbGVzQ29tcGxldGVyCitpbXBvcnQgb3MKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGFyZ2NvbXBsZXRlCitpbXBvcnQgcmVxdWVzdHMKK2ltcG9ydCBqc29uCitpbXBvcnQgeWFtbAorZnJvbSBqc29uc2NoZW1hIGltcG9ydCB2YWxpZGF0ZSBhcyBqc192LCBleGNlcHRpb25zIGFzIGpzX2UKKworY2xhc3MgQXJndW1lbnRQYXJzZXJFcnJvcihFeGNlcHRpb24pOiBwYXNzCisKK2NsYXNzIFRocm93aW5nQXJndW1lbnRQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgorICAgIGRlZiBlcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgcHJpbnQgIkVycm9yOiAlcyIgJW1lc3NhZ2UKKyAgICAgICAgcHJpbnQKKyAgICAgICAgc2VsZi5wcmludF91c2FnZSgpCisgICAgICAgICNzZWxmLnByaW50X2hlbHAoKQorICAgICAgICBwcmludAorICAgICAgICBwcmludCAiVHlwZSAnb3BlbnZpbSAtaCcgZm9yIGhlbHAiCisgICAgICAgIHJhaXNlIEFyZ3VtZW50UGFyc2VyRXJyb3IKKworZ2xvYmFsIHZpbV9jb25maWcKK2NvbmZpZ19pdGVtcz0oIkhPU1QiLCAiUE9SVCIsICJBRE1JTl9QT1JUIiwgIlRFTkFOVCIpCitzaG93X2F0X3ZlcmJvc2UxPSgnc3RhdHVzJywgJ2NyZWF0ZWQnLCAncGF0aCcsICdsYXN0X2Vycm9yJywnZGVzY3JpcHRpb24nLCdob3N0SWQnLCdwcm9ncmVzcycsCisgICAgICAgICAgICAgICAgICdyYW0nLCd2Y3B1cycsJ3R5cGUnLCdzaGFyZWQnLCdhZG1pbl9zdGF0ZV91cCcsICdlbmFibGVkJywgJ2lwX25hbWUnKQorCisjdGVtcGxhdGUgZm9yIGNyZWF0aW5nIG5ldyBpdGVtcwordGVtcGxhdGU9eworICAgICJwb3J0Ijp7CisgICAgICAgICIke30iOlsKKyAgICAgICAgICAgICIke25hbWV9IHByb3ZpZGUgYSBwb3J0IG5hbWUiLAorICAgICAgICAgICAgIiR7bmV0X2lkfSBwcm92aWRlIHRoZSBuZXR3b3JrIHV1aWQgKG51bGwpOiIsCisgICAgICAgICAgICAiJHt2bGFufSBwcm92aWRlIHRoZSB2bGFuIGlmIGFueSAobnVsbCk6IiwKKyAgICAgICAgICAgICIke3BvcnR9IHByb3ZpZGUgdGhlIGF0dGFjaGVkIHN3aXRjaCBwb3J0IChUZTAvNDcpIiwKKyAgICAgICAgICAgICIke21hY30gcHJvdmlkZSB0aGUgbWFjIG9mIGV4dGVybmFsIGRldmljZSBpZiBrbm93biAobnVsbCk6IgorICAgICAgICBdLAorICAgICAgICAicG9ydCI6eworICAgICAgICAgICAgIm5hbWUiOiAiJHtuYW1lfSIsCisgICAgICAgICAgICAibmV0d29ya19pZCI6ICIke25ldF9pZCBudWxsfSIsCisgICAgICAgICAgICAidHlwZSI6ICJleHRlcm5hbCIsCisgICAgICAgICAgICAiYmluZGluZzp2bGFuIjogIiR7dmxhbiBudWxsLWludH0iLAorICAgICAgICAgICAgImJpbmRpbmc6c3dpdGNoX3BvcnQiOiAiJHtwb3J0fSIsCisgICAgICAgICAgICAibWFjX2FkZHJlc3MiOiAiJHttYWMgbnVsbH0iCisgICAgICAgIH0sCisgICAgfSwKKyAgICAibmV0d29yayI6eworICAgICAgICAiJHt9IjpbCisgICAgICAgICAgICAiJHtuYW1lfSBwcm92aWRlIGEgbmV0d29yayBuYW1lIiwKKyAgICAgICAgICAgICIke3R5cGV9IHByb3ZpZGUgYSB0eXBlOiBicmlkZ2VfZGF0YSxicmlkZ2VfbWFuLGRhdGEscHRwIChkYXRhKSIsCisgICAgICAgICAgICAiJHtzaGFyZWR9IGV4dGVybmFsIG5ldHdvcms6IHRydWUsZmFsc2UgKHRydWUpIiwKKyAgICAgICAgICAgICIke3BoeX0gY29uZWN0ZWQgdG86IGJyaWRnZTpuYW1lLG1hY3Z0YXA6aWZhY2UsZGVmYXVsdCAobnVsbCkiCisgICAgICAgIF0sCisgICAgICAgICJuZXR3b3JrIjp7CisgICAgICAgICAgICAibmFtZSI6ICIke25hbWV9IiwKKyAgICAgICAgICAgICJ0eXBlIjogIiR7dHlwZX0iLAorICAgICAgICAgICAgInByb3ZpZGVyOnBoeXNpY2FsIjogIiR7cGh5IG51bGx9IiwKKyAgICAgICAgICAgICJzaGFyZWQiOiAiJHtzaGFyZWQgYm9vbH0iCisgICAgICAgIH0KKyAgICB9LAorICAgICJob3N0IjogeworICAgICAgICAiJHt9IjpbCisgICAgICAgICAgICAiJHtuYW1lfSBob3N0IG5hbWUiLAorICAgICAgICAgICAgIiR7dXNlcn0gaG9zdCB1c2VyICh1c2VyKSIsCisgICAgICAgICAgICAiJHtpcF9uYW1lfSBob3N0IGFjY2VzcyBJUCBvciBuYW1lICgke25hbWV9KSIsCisgICAgICAgICAgICAiJHtkZXNjcmlwdGlvbn0gaG9zdCBkZXNjcmlwdGlvbiAoJHtuYW1lfSkiCisgICAgICAgIF0sCisgICAgCisgICAgICAgICJob3N0Ijp7CisgICAgICAgICAgICAibmFtZSI6ICIke25hbWV9IiwKKyAgICAgICAgICAgICJ1c2VyIjogIiR7dXNlcn0iLAorICAgICAgICAgICAgImlwX25hbWUiOiAiJHtpcF9uYW1lfSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiJHtkZXNjcmlwdGlvbn0iCisgICAgICAgIH0KKyAgICB9LAorICAgICJmbGF2b3IiOnsKKyAgICAgICAgIiR7fSI6WworICAgICAgICAgICAgIiR7bmFtZX0gZmxhdm9yIG5hbWUiLAorICAgICAgICAgICAgIiR7ZGVzY3JpcHRpb259IGZsYXZvciBkZXNjcmlwdGlvbiAoJHtuYW1lfSkiLAorICAgICAgICAgICAgIiR7cHJvY2Vzc29yX3Jhbmtpbmd9IHByb2Nlc3NvciByYW5raW5nICgxMDApIiwKKyAgICAgICAgICAgICIke21lbW9yeX0gbWVtb3J5IGluIEdCICgyKSIsCisgICAgICAgICAgICAiJHt0aHJlYWRzfSB0aHJlYWRzIG5lZWRlZCAoMikiCisgICAgICAgIF0sCisgICAgICAgICJmbGF2b3IiOnsKKyAgICAgICAgICAgICJuYW1lIjoiJHtuYW1lfSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiIke2Rlc2NyaXB0aW9ufSIsCisgICAgICAgICAgICAiZXh0ZW5kZWQiOnsKKyAgICAgICAgICAgICAgICAicHJvY2Vzc29yX3JhbmtpbmciOiIke3Byb2Nlc3Nvcl9yYW5raW5nIGludH0iLAorICAgICAgICAgICAgICAgICJudW1hcyI6WworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAibWVtb3J5IjoiJHttZW1vcnkgaW50fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkcyI6IiR7dGhyZWFkcyBpbnR9IgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICAidGVuYW50Ijp7CisgICAgICAgICIke30iOlsKKyAgICAgICAgICAgICIke25hbWV9IHRlbmFudCBuYW1lIiwKKyAgICAgICAgICAgICIke2Rlc2NyaXB0aW9ufSB0ZW5hbnQgZGVzY3JpcHRpb24gKCR7bmFtZX0pIgorICAgICAgICBdLAorICAgICAgICAidGVuYW50Ijp7CisgICAgICAgICAgICAibmFtZSI6ICIke25hbWV9IiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICIke2Rlc2NyaXB0aW9ufSIKKyAgICAgICAgfQorICAgIH0sCisgICAgImltYWdlIjp7CisgICAgICAgICIke30iOlsKKyAgICAgICAgICAgICIke25hbWV9IGltYWdlIG5hbWUiLAorICAgICAgICAgICAgIiR7cGF0aH0gaW1hZ2UgcGF0aCAoL3BhdGgvdG8vc2hhcmVkL2NvbXB1dGUvaG9zdC9mb2xkZXIvaW1hZ2UucWNvdzIpIiwKKyAgICAgICAgICAgICIke2Rlc2NyaXB0aW9ufSBpbWFnZSBkZXNjcmlwdGlvbiAoJHtuYW1lfSkiCisgICAgICAgIF0sCisgICAgICAgICJpbWFnZSI6eworICAgICAgICAgICAgIm5hbWUiOiIke25hbWV9IiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IiR7ZGVzY3JpcHRpb259IiwKKyAgICAgICAgICAgICJwYXRoIjoiJHtwYXRofSIKKyAgICAgICAgfQorICAgIH0sCisgICAgInNlcnZlciI6eworICAgICAgICAiJHt9IjpbCisgICAgICAgICAgICAiJHtuYW1lfSBwcm92aWRlIGEgbmFtZSAoVk0pIiwKKyAgICAgICAgICAgICIke2Rlc2NyaXB0aW9ufSBwcm92aWRlIGEgZGVzY3JpcHRpb24gKCR7bmFtZX0pIiwKKyAgICAgICAgICAgICIke2ltYWdlX2lkfSBwcm92aWRlIGltYWdlX2lkIHV1aWQiLAorICAgICAgICAgICAgIiR7Zmxhdm9yX2lkfSBwcm92aWRlIGZsYXZvcl9pZCB1dWlkIiwKKyAgICAgICAgICAgICIke25ldHdvcmswfSBwcm92aWRlIGEgYnJpZGdlIG5ldHdvcmsgaWQ7IGVudGVyPSdkZWZhdWx0JyAoMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSIsCisgICAgICAgICAgICAiJHtuZXR3b3JrMX0gcHJvdmlkZSBhIGJyaWRnZSBuZXR3b3JrIGlkOyBlbnRlcj0ndmlyYnJNYW4nICg2MGY1MjI3ZS0xOTVmLTExZTQtODM2ZC01MjU0MDAzMDU5NGUpIgorICAgICAgICBdLAorICAgICAgICAic2VydmVyIjp7CisgICAgICAgICAgICAibmV0d29ya3MiOlsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJuYW1lIjoibWdtdDAiLAorICAgICAgICAgICAgICAgICAgICAidnBjaSI6ICIwMDAwOjAwOjBhLjAiLAorICAgICAgICAgICAgICAgICAgICAidXVpZCI6IiR7bmV0d29yazB9IgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAibmFtZSI6ImdlMCIsCisgICAgICAgICAgICAgICAgICAgICJ2cGNpIjogIjAwMDA6MDA6MGIuMCIsCisgICAgICAgICAgICAgICAgICAgICJ1dWlkIjoiJHtuZXR3b3JrMX0iCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJuYW1lIjoiJHtuYW1lfSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiIke2Rlc2NyaXB0aW9ufSIsCisgICAgICAgICAgICAiaW1hZ2VSZWYiOiAgIiR7aW1hZ2VfaWR9IiwKKyAgICAgICAgICAgICJmbGF2b3JSZWYiOiAiJHtmbGF2b3JfaWR9IgorICAgICAgICB9CisgICAgfQorfQorCitkZWYgY2hlY2tfY29uZmlndXJhdGlvbigqZXhjZXB0aW9uICk6CisgICAgJycnCisgICAgQ2hlY2sgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgYXJlIHByZXNlbnQuCisgICAgZXhjZXB0aW9uIGNhbiBjb250YWluIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdGVzdGVkLCBub3JtYWxseSBiZWNhdXNlIGlzIG5vdCB1c2VkIGZvciB0aGUgY29tbWFuZAorICAgICcnJworICAgICNwcmludCBleGNlcHRpb24KKyAgICBmb3IgaXRlbSBpbiBjb25maWdfaXRlbXM6CisgICAgICAgIGlmIGl0ZW0gbm90IGluIGV4Y2VwdGlvbiBhbmQgdmltX2NvbmZpZ1tpdGVtXT09Tm9uZToKKyAgICAgICAgICAgIHByaW50ICJPUEVOVklNXyIraXRlbSsiIHZhcmlhYmxlIG5vdCBkZWZpbmVkLiBUcnkgJyIgKyBuYW1lICsgIiBjb25maWcgZmlsZV9jZmcnIG9yICdleHBvcnQgT1BFTlZJTV8iK2l0ZW0rIj1zb21ldGhpbmcnIgorICAgICAgICAgICAgZXhpdCgtNDAxKTsgI0hUVFBfVW5hdXRob3JpemVkCisKK2RlZiBjaGVja192YWxpZF91dWlkKHV1aWQpOgorICAgICcnJworICAgIERldGVybWluZXMgaWYgdGhlIHBhcmFtIHV1aWQgaXMgYSB3ZWxsIGZvcm1lZCB1dWlkLiBPdGhlcndpc2UgaXQgaXMgY29uc2lkZXIgYSBuYW1lCisgICAgJycnCisgICAgaWRfc2NoZW1hID0geyJ0eXBlIiA6ICJzdHJpbmciLCAicGF0dGVybiI6ICJeW2EtZkEtRjAtOV17OH0oLVthLWZBLUYwLTldezR9KXszfS1bYS1mQS1GMC05XXsxMn0kIn0KKyAgICB0cnk6CisgICAgICAgIGpzX3YodXVpZCwgaWRfc2NoZW1hKQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCBqc19lLlZhbGlkYXRpb25FcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBfcHJpbnRfdmVyYm9zZShyb3dfZGF0YSwgZWxlbWVudCwgdmVyYm9zZT0wKToKKyAgICAjcHJpbnQgcm93X2RhdGEKKyAgICBkYXRhID0gcm93X2RhdGFbZWxlbWVudF0KKyAgICBpZiB2ZXJib3NlPT0xIG9yIHZlcmJvc2U9PTI6CisgICAgICAgIGRhdGEyPSBkaWN0KChrLHYpIGZvciAoayx2KSBpbiBkYXRhLml0ZXJpdGVtcygpIGlmIGsgaW4gc2hvd19hdF92ZXJib3NlMSBhbmQgdiE9Tm9uZSkKKyAgICAgICAgaWYgJ2ltYWdlJyBpbiBkYXRhIGFuZCAnaWQnIGluIGRhdGFbJ2ltYWdlJ106CisgICAgICAgICAgICBkYXRhMlsnaW1hZ2UnXSA9IGRhdGFbJ2ltYWdlJ11bJ2lkJ10KKyAgICAgICAgaWYgJ2ZsYXZvcicgaW4gZGF0YSBhbmQgJ2lkJyBpbiBkYXRhWydmbGF2b3InXToKKyAgICAgICAgICAgIGRhdGEyWydmbGF2b3InXSA9IGRhdGFbJ2ZsYXZvciddWydpZCddCisgICAgICAgIGlmIHZlcmJvc2U9PTI6CisgICAgICAgICAgICAjVE9ETyBhZGQgbW9yZSBpbnRlbXMgaW4gYSBkaWdlc3QgbW9kZSwgZXh0ZW5kZWQsIG51bWFzIC4uLgorICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgI2lmICJudW1hcyIgaW4gZGF0YQorICAgICAgICAgICAgI2lmICJleHRlbmRlZCIgaW4gZGF0YQorICAgIGVsc2U6CisgICAgICAgIGRhdGEyPSBkYXRhCisgICAgI3ByaW50IGpzb24uZHVtcHMoYzIsIGluZGVudD00KQorIyAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBkYXRhLmtleXMoKQorIyAgICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4ga2V5czoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGF0YVtrZXldPT1Ob25lOiBkZWwgZGF0YVtrZXldCisjICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYga2V5PT0naWQnIG9yIGtleT09J25hbWUnIG9yIGtleT09J2xpbmtzJzogZGVsIGRhdGFba2V5XQorICAgICAgICAKKyAgICAjcHJpbnQganNvbi5kdW1wcyhkYXRhMiwgaW5kZW50PTQpCisgICAgZGF0YTI9e2VsZW1lbnQ6IGRhdGEyfQorICAgIHByaW50IHlhbWwuc2FmZV9kdW1wKGRhdGEyLCBpbmRlbnQ9NCwgZGVmYXVsdF9mbG93X3N0eWxlPUZhbHNlKQorICAgIAorZGVmIHZpbV9yZWFkKHVybCk6CisgICAgJycnCisgICAgU2VuZCBhIEdFVCBodHRwIHRvIFZJTQorICAgICcnJworICAgIGhlYWRlcnNfcmVxID0geydjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9CisgICAgdHJ5OgorICAgICAgICB2aW1fcmVzcG9uc2UgPSByZXF1ZXN0cy5nZXQodXJsLCBoZWFkZXJzID0gaGVhZGVyc19yZXEpCisgICAgICAgIGlmIHZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSA9PSAyMDA6CisgICAgICAgICNwcmludCB2aW1fcmVzcG9uc2UuanNvbigpCisgICAgICAgICNwcmludCBqc29uLmR1bXBzKHZpbV9yZXNwb25zZS5qc29uKCksIGluZGVudD00KQorICAgICAgICAgICAgY29udGVudCA9IHZpbV9yZXNwb25zZS5qc29uKCkKKyAgICAgICAgICAgIHJldHVybiAxLCBjb250ZW50CisgICAgICAgICAgICAjcHJpbnQgaHR0cF9jb250ZW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjcHJpbnQgIiBFcnJvci4gVklNIHJlc3BvbnNlICclcyc6IG5vdCBwb3NzaWJsZSB0byBHRVQgJXMsIGVycm9yICVzIiAlICh2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHVybCwgdmltX3Jlc3BvbnNlLnRleHQpCisgICAgICAgICAgICByZXR1cm4gLXZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSwgdmltX3Jlc3BvbnNlLnRleHQKKyAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uLCBlOgorICAgICAgICByZXR1cm4gLTEsICIgRXhjZXB0aW9uIEdFVCBhdCAnIit1cmwrIicgIiArIHN0cihlLm1lc3NhZ2UpCisKK2RlZiB2aW1fZGVsZXRlKHVybCk6CisgICAgJycnCisgICAgU2VuZCBhIERFTEVURSBodHRwIHRvIFZJTQorICAgICcnJworICAgIGhlYWRlcnNfcmVxID0geydjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9CisgICAgdHJ5OgorICAgICAgICB2aW1fcmVzcG9uc2UgPSByZXF1ZXN0cy5kZWxldGUodXJsLCBoZWFkZXJzID0gaGVhZGVyc19yZXEpCisgICAgICAgIGlmIHZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSAhPSAyMDA6CisgICAgICAgICAgICAjcHJpbnQgIiBFcnJvci4gVklNIHJlc3BvbnNlICclcyc6IG5vdCBwb3NzaWJsZSB0byBERUxFVEUgJXMsIGVycm9yICVzIiAlICh2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHVybCwgdmltX3Jlc3BvbnNlLnRleHQpCisgICAgICAgICAgICByZXR1cm4gLXZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSwgdmltX3Jlc3BvbnNlLnRleHQKKyAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uLCBlOgorICAgICAgICByZXR1cm4gLTEsICIgRXhjZXB0aW9uIERFTEVURSBhdCAnIit1cmwrIicgIiArIHN0cihlLm1lc3NhZ2UpCisgICAgcmV0dXJuIDEsIHZpbV9yZXNwb25zZS5qc29uKCkKKworZGVmIHZpbV9hY3Rpb24odXJsLCBwYXlsb2FkKToKKyAgICAnJycKKyAgICBTZW5kIGEgUE9TVCBodHRwIHRvIFZJTQorICAgICcnJworICAgIGhlYWRlcnNfcmVxID0geydjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9CisgICAgdHJ5OgorICAgICAgICB2aW1fcmVzcG9uc2UgPSByZXF1ZXN0cy5wb3N0KHVybCwgZGF0YT1qc29uLmR1bXBzKHBheWxvYWQpLCBoZWFkZXJzID0gaGVhZGVyc19yZXEpCisgICAgICAgIGlmIHZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSAhPSAyMDA6CisgICAgICAgICAgICAjcHJpbnQgIiBFcnJvci4gVklNIHJlc3BvbnNlICclcyc6IG5vdCBwb3NzaWJsZSB0byBQT1NUICVzLCBlcnJvciAlcyIgJSAodmltX3Jlc3BvbnNlLnN0YXR1c19jb2RlLCB1cmwsIHZpbV9yZXNwb25zZS50ZXh0KQorICAgICAgICAgICAgcmV0dXJuIC12aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHZpbV9yZXNwb25zZS50ZXh0CisgICAgZXhjZXB0IHJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVxdWVzdEV4Y2VwdGlvbiwgZToKKyAgICAgICAgcmV0dXJuIC0xLCAiIEV4Y2VwdGlvbiBQT1NUIGF0ICciK3VybCsiJyAiICsgc3RyKGUubWVzc2FnZSkKKyAgICByZXR1cm4gMSwgdmltX3Jlc3BvbnNlLmpzb24oKQorCitkZWYgdmltX2VkaXQodXJsLCBwYXlsb2FkKToKKyAgICBoZWFkZXJzX3JlcSA9IHsnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfQorICAgIHRyeToKKyAgICAgICAgdmltX3Jlc3BvbnNlID0gcmVxdWVzdHMucHV0KHVybCwgZGF0YT1qc29uLmR1bXBzKHBheWxvYWQpLCBoZWFkZXJzID0gaGVhZGVyc19yZXEpCisgICAgICAgIGlmIHZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSAhPSAyMDA6CisgICAgICAgICAgICAjcHJpbnQgIiBFcnJvci4gVklNIHJlc3BvbnNlICclcyc6IG5vdCBwb3NzaWJsZSB0byBQVVQgJXMsIGVycm9yICVzIiAlICh2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHVybCwgdmltX3Jlc3BvbnNlLnRleHQpCisgICAgICAgICAgICByZXR1cm4gLXZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSwgdmltX3Jlc3BvbnNlLnRleHQKKyAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uLCBlOgorICAgICAgICByZXR1cm4gLTEsICIgRXhjZXB0aW9uIFBVVCBhdCAnIit1cmwrIicgIiArIHN0cihlLm1lc3NhZ2UpCisgICAgcmV0dXJuIDEsIHZpbV9yZXNwb25zZS5qc29uKCkKKworZGVmIHZpbV9jcmVhdGUodXJsLCBwYXlsb2FkKToKKyAgICBoZWFkZXJzX3JlcSA9IHsnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfQorICAgICNwcmludCBzdHIocGF5bG9hZCkKKyAgICB0cnk6CisgICAgICAgIHZpbV9yZXNwb25zZSA9IHJlcXVlc3RzLnBvc3QodXJsLCBkYXRhPWpzb24uZHVtcHMocGF5bG9hZCksIGhlYWRlcnM9aGVhZGVyc19yZXEpCisgICAgICAgIGlmIHZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSAhPSAyMDA6CisgICAgICAgICAgICAjcHJpbnQgIiBFcnJvci4gVklNIHJlc3BvbnNlICclcyc6IG5vdCBwb3NzaWJsZSB0byBQT1NUICVzLCBlcnJvciAlcyIgJSAodmltX3Jlc3BvbnNlLnN0YXR1c19jb2RlLCB1cmwsIHZpbV9yZXNwb25zZS50ZXh0KQorICAgICAgICAgICAgcmV0dXJuIC12aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHZpbV9yZXNwb25zZS50ZXh0CisgICAgZXhjZXB0IHJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVxdWVzdEV4Y2VwdGlvbiwgZToKKyAgICAgICAgcmV0dXJuIC0xLCAiIEV4Y2VwdGlvbiBQT1NUIGF0ICciK3VybCsiJyAiICsgc3RyKGUubWVzc2FnZSkKKyAgICByZXR1cm4gMSwgdmltX3Jlc3BvbnNlLmpzb24oKQorCitkZWYgcGFyc2VfeWFtbF9qc29uKHRleHQsIGZpbGVfbmFtZT1Ob25lKToKKyAgICBwYXJzZXJfanNvbj1Ob25lCisgICAgaWYgZmlsZV9uYW1lOgorICAgICAgICBpZiBmaWxlX25hbWVbLTU6XT09Jy55YW1sJyBvciBmaWxlX25hbWVbLTQ6XT09Jy55bWwnOgorICAgICAgICAgICAgcGFyc2VyX2pzb24gPSBGYWxzZQorICAgICAgICBlbGlmIGZpbGVfbmFtZVstNTpdPT0nLmpzb24nOgorICAgICAgICAgICAgcGFyc2VyX2pzb24gPSBUcnVlCisgICAgaWYgcGFyc2VyX2pzb249PU5vbmU6CisgICAgICAgIHBhcnNlcl9qc29uPVRydWUgaWYgJ1x0JyBpbiB0ZXh0IGVsc2UgRmFsc2UKKyAgICAgICAgICAgIAorICAgIGlmIHBhcnNlcl9qc29uOiAjdHJ5IHBhcnNlIGluIGpzb24gZm9ybWF0LCBiZWNhdXNlIHlhbWwgZG9lcyBub3QgYWRtaXQgdGFicworICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0ganNvbi5sb2Fkcyh0ZXh0KSAKKyAgICAgICAgICAgIHJldHVybiAwLCBkYXRhCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHJldHVybiAtMSwgIkVycm9yIGpzb24gZm9ybWF0OiAiICsgc3RyKGUpCisgICAgI3RyeSB0byBwYXJzZSBpbiB5YW1sIGZvcm1hdAorICAgIHRyeToKKyAgICAgICAgZGF0YSA9IHlhbWwubG9hZCh0ZXh0KQorICAgICAgICByZXR1cm4gMCwgZGF0YQorICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciBhcyBleGM6CisgICAgICAgIGVycm9yX3BvcyA9ICIiCisgICAgICAgIGlmIGhhc2F0dHIoZXhjLCAncHJvYmxlbV9tYXJrJyk6CisgICAgICAgICAgICBtYXJrID0gZXhjLnByb2JsZW1fbWFyaworICAgICAgICAgICAgZXJyb3JfcG9zID0gIiBhdCBsaW5lOiVzIGNvbHVtbjolcyIgJSAobWFyay5saW5lKzEsIG1hcmsuY29sdW1uKzEpCisgICAgICAgIHJldHVybiAtMSwgIiBFcnJvciB5YW1sIGZvcm1hdCBlcnJvciIgKyBlcnJvcl9wb3MKKworZGVmIGNoYW5nZV9zdHJpbmcodGV4dCwgdmFyX2xpc3QpOgorICAgICcnJworICAgIFNlZSBjaGFuZ2VfdmFyX3JlY3Vyc2l2ZWx5IGhlbHAKKyAgICBVc2VkIGZvciBjaGFuZ2VkIGFueSAnJHt2YXIgZm9ybWF0fScgY29udGVudCBpbnNpZGUgdGhlICd0ZXh0JyBzdHJpbmcgCisgICAgaW50byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBhdCAndmFyX2xpc3QnW3Zhcl0KKyAgICAnZm9ybWF0JyBpcyBvcHRpb25hbCwgc3RyaW5nIGJ5IGRlZmF1bHQuIENvbnRhaW4gYSAtIHNlcGFyYXRlZCBmb3JtYXRzLGVqLCBpbnQtbnVsbAorICAgICcnJworICAgIGVuZD0wCisgICAgdHlwZV89Tm9uZQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGluaSA9IHRleHQuZmluZCgiJHsiLCBlbmQpCisgICAgICAgIGlmIGluaTwwOiByZXR1cm4gdGV4dAorICAgICAgICBlbmQgPSB0ZXh0LmZpbmQoIn0iLCBpbmkpIAorICAgICAgICBpZiBlbmQ8MDogcmV0dXJuIHRleHQKKyAgICAgICAgZW5kKz0xCisgICAgICAgIAorICAgICAgICB2YXIgPSB0ZXh0W2luaTplbmRdCisgICAgICAgIGlmICcgJyBpbiB2YXI6CisgICAgICAgICAgICBraz12YXIuc3BsaXQoIiAiKQorICAgICAgICAgICAgdmFyPWtrWzBdKyJ9IgorICAgICAgICAgICAgdHlwZV89a2tbLTFdWzotMV0KKyAgICAgICAgdmFyID0gdmFyX2xpc3QuZ2V0KHZhciwgTm9uZSkKKyAgICAgICAgaWYgdmFyPT1Ob25lOiByZXR1cm4gdGV4dAorICAgICAgICAKKyAgICAgICAgdGV4dCA9ICB0ZXh0WzppbmldICsgdmFyICsgdGV4dFtlbmQ6XQorICAgICAgICBpZiB0eXBlXyAhPSBOb25lOgorICAgICAgICAgICAgaWYgJ251bGwnIGluIHR5cGVfIGFuZCB0ZXh0PT0ibnVsbCI6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGlmICdpbnQnIGluIHR5cGVfIDogI2FuZCB0ZXh0LmlzbnVtZXJpYygpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQodGV4dCkKKyAgICAgICAgICAgIGlmICdib29sJyBpbiB0eXBlXyA6ICNhbmQgdGV4dC5pc251bWVyaWMoKToKKyAgICAgICAgICAgICAgICBpZiB0ZXh0Lmxvd2VyKCk9PSJ0cnVlIjogcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICBlbGlmIHRleHQubG93ZXIoKT09ImZhbHNlIjogcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImlucHV0IGJvb2xlYW4gcGFyYW10ZXIgbXVzdCBiZSAndHJ1ZScgb3IgJ2ZhbHNlJyIKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKQorICAgIHJldHVybiB0ZXh0CisKK2RlZiBjaGFnZV92YXJfcmVjdXJzaXZlbHkoZGF0YSwgdmFyX2xpc3QpOgorICAgICcnJworICAgIENoZWNrIHJlY3Vyc2l2ZWx5IHRoZSBjb250ZW50IG9mICdkYXRhJywgYW5kIGxvb2sgZm9yICIqJHsqfSoiIHZhcmlhYmxlcyBhbmQgY2hhbmdlcyAgCisgICAgSXQgYXNzdW1lcyB0aGF0IHRoaXMgdmFyaWFibGVzIGFyZSBub3QgaW4gdGhlIGtleSBvZiBkaWN0aW9uYXJ5LAorICAgIFRoZSBvdmVyYWxsIHRhcmdldCBpcyBoYXZpbmcganNvbi95YW1sIHRlbXBsYXRlcyB3aXRoIHRoaXMgdmFyaWFibGVzIGluIHRoZSB0ZXh0LiAKKyAgICBUaGUgdXNlciBpcyBhc2tlZCBmb3IgYSB2YWx1ZSB0aGF0IGlzIHJlcGxhY2VkIHdoZXJldmVyIGFwcGVhcnMgCisgICAgQXR0cmlidXRlczoKKyAgICAgICAgJ2RhdGEnOiBkaWN0aW9uYXJ5LCBvciBsaXN0LiBOb25lIG9yIGVtcHR5IGlzIGNvbnNpZGVyZWQgdmFsaWQKKyAgICAgICAgJ3Zhcl9saXN0JzogZGljdGlvbmFyeSAobmFtZTpjaGFuZ2UpIHBhaXJzCisgICAgUmV0dXJuOgorICAgICAgICBOb25lLCBkYXRhIGlzIG1vZGlmaWVkCisgICAgJycnCisgICAgICAgIAorICAgIGlmIHR5cGUoZGF0YSkgaXMgZGljdDoKKyAgICAgICAgZm9yIGsgaW4gZGF0YS5rZXlzKCk6CisgICAgICAgICAgICBpZiB0eXBlKGRhdGFba10pIGlzIGRpY3Qgb3IgdHlwZShkYXRhW2tdKSBpcyB0dXBsZSBvciB0eXBlKGRhdGFba10pIGlzIGxpc3Q6CisgICAgICAgICAgICAgICAgY2hhZ2VfdmFyX3JlY3Vyc2l2ZWx5KGRhdGFba10sIHZhcl9saXN0KQorICAgICAgICAgICAgZWxpZiB0eXBlKGRhdGFba10pIGlzIHN0cjoKKyAgICAgICAgICAgICAgICBkYXRhW2tdID0gY2hhbmdlX3N0cmluZyhkYXRhW2tdLCB2YXJfbGlzdCkKKyAgICBpZiB0eXBlKGRhdGEpIGlzIGxpc3Q6CisgICAgICAgIGZvciBrIGluIHJhbmdlKDAsbGVuKGRhdGEpKToKKyAgICAgICAgICAgIGlmIHR5cGUoZGF0YVtrXSkgaXMgZGljdCBvciB0eXBlKGRhdGFba10pIGlzIGxpc3Q6CisgICAgICAgICAgICAgICAgY2hhZ2VfdmFyX3JlY3Vyc2l2ZWx5KGRhdGFba10sIHZhcl9saXN0KQorICAgICAgICAgICAgZWxpZiB0eXBlKGRhdGFba10pIGlzIHN0cjoKKyAgICAgICAgICAgICAgICBkYXRhW2tdID0gY2hhbmdlX3N0cmluZyhkYXRhW2tdLCB2YXJfbGlzdCkKKworZGVmIGNoYW5nZV92YXIoZGF0YSwgZGVmYXVsdF92YWx1ZXM9e30pOgorICAgICcnJyBMb29rIGZvciBhIHRleHQgIiR7fSIga2V5IGF0ICdkYXRhJyB0aGF0IGluZGljYXRlcyB0aGF0IHRoaXMganNvbiBjb250YWlucyAKKyAgICB2YXJpYWJsZXMgdGhhdCBtdXN0IGJlIGFzayBmb3IgdmFsdWVzIHRvIHRoZSB1c2VyIGFuZCBjaGFuZ2VzIGluIHRoZSB0ZXh0IG9mIAorICAgIHRoZSBkaWN0aW9uYXJ5CisgICAgJ2RlZmF1bHRfdmFsdWVzJyBjb250YWluIGEgZGljdGlvbmFyeSBvZiB2YWx1ZXMgdGhhdCBtdXN0IGJlIHVzZWQgYW5kIG5vdCBiZSBhc2tlZCAgIAorICAgIFVzZWZ1bCBmb3IgY3JlYXRpbmcgdGVtcGxhdGVzCisgICAgIiR7fSIgZW50cnkgY29udGFpbiBhIGxpc3Qgd2l0aCB0aGUgdGV4dDoKKyAgICAgICAgJHt2YXItbmFtZX0gcHJvbXB0IHRleHQgdG8gc2hvdyB1c2VyIChEZWZhdWx0IHZhbHVlIHRvIGFsbG9jYXRlIGlmIHVzZXIgdHlwZSBDUikKKyAgICAnJycKKyAgICBpZiB0eXBlKGRhdGEpIGlzIG5vdCBkaWN0OgorICAgICAgICByZXR1cm4gLTEsICJGb3JtYXQgZXJyb3IsIG5vdCBhIG9iamVjdCAoZGljdGlvbmFyeSkiCisgICAgaWYgIiR7fSIgbm90IGluIGRhdGE6CisgICAgICAgIHJldHVybiAwLCBkYXRhCisKKyAgICB2YXJfbGlzdD17fQorICAgIGZvciB2YXIgaW4gZGF0YVsiJHt9Il06CisgICAgICAgIHIgPSB2YXIuZmluZCgifSIsKSArIDEKKyAgICAgICAgaWYgcjw9MiBvciB2YXJbOjJdICE9ICckeyc6CisgICAgICAgICAgICByZXR1cm4gLTEsICJGb3JtYXQgZXJyb3IgYXQgJyR7fSc6IiArIHZhcgorICAgICAgICAjY2hhbmdlIHZhcmlhYmxlcyBpbnNpZGUgZGVzY3JpcHRpb24gdGV4dAorICAgICAgICBpZiAiJHsiIGluIHZhcltyOl06CisgICAgICAgICAgICB2YXIgPSB2YXJbOnJdICsgY2hhbmdlX3N0cmluZyh2YXJbcjpdLCB2YXJfbGlzdCkKKyAgICAgICAgZF9zdGFydCA9IHZhci5yZmluZCgiKCIsKSArIDEKKyAgICAgICAgZF9lbmQgICA9IHZhci5yZmluZCgiKSIsKSAKKyAgICAgICAgaWYgZF9zdGFydD4wIGFuZCBkX2VuZD49ZF9zdGFydDoKKyAgICAgICAgICAgIGRlZmF1bHQgPSB2YXJbZF9zdGFydDpkX2VuZF0KKyAgICAgICAgZWxzZTogZGVmYXVsdD1Ob25lCisgICAgICAgIGlmIHZhclsyOnItMV0gaW4gZGVmYXVsdF92YWx1ZXM6CisgICAgICAgICAgICB2YXJfbGlzdFsgdmFyWzpyXSBdID0gZGVmYXVsdF92YWx1ZXNbIHZhclsyOnItMV0gXQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgdiA9IHJhd19pbnB1dCh2YXJbcjpdICsgIj8gIikKKyAgICAgICAgaWYgdj09IiI6CisgICAgICAgICAgICBpZiBkZWZhdWx0ICE9IE5vbmU6CisgICAgICAgICAgICAgICAgdiA9IGRlZmF1bHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdiA9IHJhd19pbnB1dCgiICBlbXB0eSBzdHJpbmc/IHRyeSBhZ2FpbjogIikKKyAgICAgICAgdmFyX2xpc3RbIHZhcls6cl0gXSA9IHN0cih2KSAKKyAgICBkZWwgZGF0YVsiJHt9Il0KKyAgICBjaGFnZV92YXJfcmVjdXJzaXZlbHkoZGF0YSwgdmFyX2xpc3QpCisgICAgcmV0dXJuIDAsIGRhdGEKKworZGVmIGxvYWRfZmlsZShmaWxlXywgcGFyc2U9RmFsc2UpOgorICAgIHRyeToKKyAgICAgICAgZiA9IG9wZW4oZmlsZV8sICdyJykKKyAgICAgICAgcmVhZF9kYXRhID0gZi5yZWFkKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGlmIG5vdCBwYXJzZToKKyAgICAgICAgICAgIHJldHVybiAwLCByZWFkX2RhdGEKKyAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgcmV0dXJuIC0xLCAiIEVycm9yIG9wZW5pbmcgZmlsZSAnIiArIGZpbGVfICsgIic6ICIgKyBlLmFyZ3NbMV0KKyAgICByZXR1cm4gcGFyc2VfeWFtbF9qc29uKHJlYWRfZGF0YSwgZmlsZV8pCisKK2RlZiBsb2FkX2ZpbGVfb3JfeWFtbChjb250ZW50KToKKyAgICAnJycKKyAgICAnY29udGVudCcgY2FuIGJlIG9yIGEgeWFtbC9qc29uIGZpbGUgb3IgYSB0ZXh0IGNvbnRhaW5pbmcgYSB5YW1sL2pzb24gdGV4dCBmb3JtYXQKKyAgICBUaGlzIGZ1bmN0aW9uIGF1dG9kZXRlY3QsIHRyeWluZyB0byBsb2FkIGFuZCBwYXJzZSB0aGUgZmlsZW5hbWUgJ2NvbnRlbnQnLAorICAgIGlmIGZhaWxzIHRyeWluZyB0byBwYXJzZSB0aGUgJ2NvbnRlbnQnIGFzIHRleHQKKyAgICBSZXR1cm5zIHRoZSBkaWN0aW9uYXJ5IG9uY2UgcGFyc2VkLCBvciBwcmludCBhbiBlcnJvciBhbmQgZmluaXNoIHRoZSBwcm9ncmFtCisgICAgJycnCisgICAgcixwYXlsb2FkID0gbG9hZF9maWxlKGNvbnRlbnQsIHBhcnNlPVRydWUpCisgICAgaWYgcjwwOgorICAgICAgICBpZiByPT0tMSBhbmQgInsiIGluIGNvbnRlbnQgb3IgIjoiIGluIGNvbnRlbnQ6CisgICAgICAgICAgICAjdHJ5IHRvIHBhcnNlIGRpcmVjdGx5CisgICAgICAgICAgICByLHBheWxvYWQgPSBwYXJzZV95YW1sX2pzb24oY29udGVudCkKKyAgICAgICAgICAgIGlmIHI8MDoKKyAgICAgICAgICAgICAgICBwcmludCBwYXlsb2FkCisgICAgICAgICAgICAgICAgZXhpdCAoLTEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBwYXlsb2FkCisgICAgICAgICAgICBleGl0ICgtMSkKKyAgICByZXR1cm4gcGF5bG9hZAorCitkZWYgY29uZmlnKGFyZ3MpOgorICAgICNwcmludCAiY29uZmlnLWxpc3QiLGFyZ3MKKyAgICBpZiBhcmdzLmZpbGUgIT0gTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oYXJncy5maWxlLCAncicpCisgICAgICAgICAgICByZWFkX2RhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgcHJpbnQgIiBFcnJvciBvcGVuaW5nIGZpbGUgJyIgKyBhcmdzLmZpbGUgKyAiJzogIiArIGUuYXJnc1sxXQorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSB5YW1sLmxvYWQocmVhZF9kYXRhKQorICAgICAgICAgICAgI3ByaW50IGRhdGEKKyAgICAgICAgICAgIGlmICJodHRwX2hvc3QiIGluIGRhdGE6CisgICAgICAgICAgICAgICAgcHJpbnQgIiAgZXhwb3J0IE9QRU5WSU1fSE9TVD0iKyBkYXRhWyJodHRwX2hvc3QiXQorICAgICAgICAgICAgaWYgImh0dHBfcG9ydCIgaW4gZGF0YToKKyAgICAgICAgICAgICAgICBwcmludCAiICBleHBvcnQgT1BFTlZJTV9QT1JUPSIrIHN0cihkYXRhWyJodHRwX3BvcnQiXSkKKyAgICAgICAgICAgICAgICAjdmltX2NvbmZpZ1tpdGVtXSA9IGRhdGFbIk9QRU5WSU1fIitpdGVtXSAgI1RPRE8gZmluZCB0aGUgd2F5IHRvIGNoYW5nZSBlbnZpb3Jvbm1lbnQKKyAgICAgICAgICAgICAgICAjb3Muc2V0ZW52KCdPUEVOVklNXycraXRlbSwgdmltX2NvbmZpZ1tpdGVtXSkKKyAgICAgICAgICAgIGlmICJodHRwX2FkbWluX3BvcnQiIGluIGRhdGE6CisgICAgICAgICAgICAgICAgcHJpbnQgIiAgZXhwb3J0IE9QRU5WSU1fQURNSU5fUE9SVD0iKyBzdHIoZGF0YVsiaHR0cF9hZG1pbl9wb3J0Il0pCisgICAgICAgICAgICBpZiAidGVuYW50X2lkIiBpbiBkYXRhOgorICAgICAgICAgICAgICAgIHByaW50ICIgIGV4cG9ydCBPUEVOVklNX1RFTkFOVD0iKyBkYXRhWyJ0ZW5hbnRfaWQiXQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZXhjZXB0IHlhbWwuWUFNTEVycm9yLCBleGM6CisgICAgICAgICAgICBlcnJvcl9wb3MgPSAiIgorICAgICAgICAgICAgaWYgaGFzYXR0cihleGMsICdwcm9ibGVtX21hcmsnKToKKyAgICAgICAgICAgICAgICBtYXJrID0gZXhjLnByb2JsZW1fbWFyaworICAgICAgICAgICAgICAgIGVycm9yX3BvcyA9ICIgYXQgcG9zaXRpb246ICglczolcykiICUgKG1hcmsubGluZSsxLCBtYXJrLmNvbHVtbisxKQorICAgICAgICAgICAgICAgIHByaW50ICIgRXJyb3IgeWFtbC9qc29uIGZvcm1hdCBlcnJvciBhdCAnIisgYXJncy5maWxlICsiJyIrZXJyb3JfcG9zCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgcHJpbnQgYXJncy5maWxlCisgICAgcHJpbnQgIk9QRU5WSU1fSE9TVDogJXMiICV2aW1fY29uZmlnWyJIT1NUIl0KKyAgICBwcmludCAiT1BFTlZJTV9QT1JUOiAlcyIgJXZpbV9jb25maWdbIlBPUlQiXQorICAgIHByaW50ICJPUEVOVklNX0FETUlOX1BPUlQ6ICVzIiAldmltX2NvbmZpZ1siQURNSU5fUE9SVCJdCisgICAgcHJpbnQgIk9QRU5WSU1fVEVOQU5UOiAlcyIgJXZpbV9jb25maWdbIlRFTkFOVCJdCisgICAgcmV0dXJuIDAKKworZGVmIGVsZW1lbnRfbmV3KGFyZ3MpOgorICAgICNwcmludCBhcmdzCisgICAgdGVuYW50PSIiCisgICAgaWYgYXJncy5lbGVtZW50IGluICgnZmxhdm9ycycsJ2ltYWdlcycsJ3NlcnZlcnMnKToKKyAgICAgICAgY2hlY2tfY29uZmlndXJhdGlvbiggIkFETUlOX1BPUlQiICkKKyAgICAgICAgdGVuYW50PSIvIit2aW1fY29uZmlnWyJURU5BTlQiXQorICAgIGVsc2U6CisgICAgICAgIGNoZWNrX2NvbmZpZ3VyYXRpb24oIkFETUlOX1BPUlQiLCAiVEVOQU5UIikKKyAgICAgICAgdGVuYW50PSIiCisgICAgICAgIAorICAgIGRlZmF1bHRfdmFsdWVzPXt9CisgICAgaWYgYXJncy5uYW1lICE9IE5vbmU6CisgICAgICAgIGRlZmF1bHRfdmFsdWVzWyJuYW1lIl0gPSBhcmdzLm5hbWUKKyAgICBpZiAiZGVzY3JpcHRpb24iIGluIGFyZ3MgYW5kIGFyZ3MuZGVzY3JpcHRpb24gIT0gTm9uZToKKyAgICAgICAgZGVmYXVsdF92YWx1ZXNbImRlc2NyaXB0aW9uIl0gPSBhcmdzLmRlc2NyaXB0aW9uCisgICAgaWYgInBhdGgiIGluIGFyZ3MgYW5kIGFyZ3MucGF0aCAhPSBOb25lOgorICAgICAgICBkZWZhdWx0X3ZhbHVlc1sicGF0aCJdID0gYXJncy5wYXRoCisgICAgaWYgYXJncy5maWxlPT1Ob25lOgorICAgICAgICBwYXlsb2FkPSB0ZW1wbGF0ZVthcmdzLmVsZW1lbnRbOi0xXSBdCisgICAgICAgIHBheWxvYWQgPSB5YW1sLmxvYWQoc3RyKHBheWxvYWQpKSAgI3dpdGggdGhpcyB0cmljayB3ZSBtYWtlIGEgY29tcGxldGVseSBjb3B5IG9mIHRoZSBkYXRhLCBzbyB0byBub3QgbW9kaWZpZWQgdGhlIG9yaWdpbmFsIG9uZQorICAgIGVsc2U6CisgICAgICAgIHBheWxvYWQ9bG9hZF9maWxlX29yX3lhbWwoYXJncy5maWxlKQorICAgIHIsYz0gY2hhbmdlX3ZhcihwYXlsb2FkLCBkZWZhdWx0X3ZhbHVlcykKKyAgICBpZiByPDA6CisgICAgICAgIHByaW50ICJUZW1wbGF0ZSBlcnJvciIsIGMKKyAgICAgICAgcmV0dXJuIC0xCisgICAgcGF5bG9hZD1jCisgICAgI3ByaW50IHBheWxvYWQKKyAgICBpZiBhcmdzLmVsZW1lbnRbOi0xXSBub3QgaW4gcGF5bG9hZDoKKyAgICAgICAgcGF5bG9hZCA9IHthcmdzLmVsZW1lbnRbOi0xXTogcGF5bG9hZCB9CisgICAgaXRlbSA9IHBheWxvYWRbYXJncy5lbGVtZW50WzotMV1dCisgICAgICAgIAorICAgIHVybCA9ICJodHRwOi8vJXM6JXMvb3BlbnZpbSVzLyVzIiAlKHZpbV9jb25maWdbIkhPU1QiXSwgdmltX2NvbmZpZ1siUE9SVCJdLCB0ZW5hbnQsIGFyZ3MuZWxlbWVudCkKKyAgICBpZiAiQURNSU5fUE9SVCIgaW4gdmltX2NvbmZpZyBhbmQgdmltX2NvbmZpZ1siQURNSU5fUE9SVCJdIT1Ob25lOgorICAgICAgICB1cmxfYWRtaW4gPSAiaHR0cDovLyVzOiVzL29wZW52aW0lcy8lcyIgJSh2aW1fY29uZmlnWyJIT1NUIl0sIHZpbV9jb25maWdbIkFETUlOX1BPUlQiXSwgdGVuYW50LCBhcmdzLmVsZW1lbnQpCisgICAgZWxzZToKKyAgICAgICAgdXJsX2FkbWluID0gTm9uZQorICAgICAgICAKKyAgICBpZiBhcmdzLm5hbWUgIT0gTm9uZToKKyAgICAgICAgaXRlbVsibmFtZSJdID0gYXJncy5uYW1lCisgICAgaWYgImRlc2NyaXB0aW9uIiBpbiBhcmdzIGFuZCBhcmdzLmRlc2NyaXB0aW9uICE9IE5vbmU6CisgICAgICAgIGl0ZW1bImRlc2NyaXB0aW9uIl0gPSBhcmdzLmRlc2NyaXB0aW9uCisgICAgaWYgInBhdGgiIGluIGFyZ3MgYW5kIGFyZ3MucGF0aCAhPSBOb25lOgorICAgICAgICBpdGVtWyJwYXRoIl0gPSBhcmdzLnBhdGgKKyAgICAKKworICAgIHIsYyA9IHZpbV9jcmVhdGUodXJsLCBwYXlsb2FkKQorICAgIGlmIHI9PS00MDEgYW5kIHVybF9hZG1pbiE9Tm9uZSBhbmQgdXJsICE9IHVybF9hZG1pbjogI1VuYXV0aG9yaXplZCwgdHJ5IHdpdGggYWRtaW4gcHJpdmlsZWdlcworICAgICAgICB1cmw9dXJsX2FkbWluCisgICAgICAgIHIsYyA9IHZpbV9jcmVhdGUodXJsLCBwYXlsb2FkKQorICAgIGlmIHI8MDoKKyAgICAgICAgcHJpbnQgYworICAgICAgICByZXR1cm4gLXIKKyAgICBlbHNlOgorICAgICAgICAjcHJpbnQgYworICAgICAgICBpdGVtPWNbIGFyZ3MuZWxlbWVudFs6LTFdIF0KKyAgICAgICAgdXVpZD1pdGVtLmdldCgnaWQnLCBOb25lKQorICAgICAgICBpZiB1dWlkIGlzIE5vbmU6CisgICAgICAgICAgICB1dWlkPWl0ZW0uZ2V0KCd1dWlkJywgJ3V1aWQtbm90LWZvdW5kPycpCisgICAgICAgIG5hbWUgPSBpdGVtLmdldCgnbmFtZScsICcnKQorICAgICAgICBwcmludCAiICIgKyB1dWlkICsiICAgIisgbmFtZS5sanVzdCgyMCkgKyAiIENyZWF0ZWQiCisgICAgICAgIGZvciBlIGluICgnd2FybmluZycsICdlcnJvcicsICdsYXN0X2Vycm9yJyk6CisgICAgICAgICAgICBpZiBlIGluIGl0ZW06ICAgIHByaW50IGUgKyAiXG4iICsgaXRlbVtlXQorICAgICAgICBpZiBhcmdzLnZlcmJvc2UhPU5vbmU6CisgICAgICAgICAgICBfcHJpbnRfdmVyYm9zZShjLCBhcmdzLmVsZW1lbnRbOi0xXSwgYXJncy52ZXJib3NlKQorICAgICAgICByZXR1cm4gMAorCitkZWYgZWxlbWVudF9hY3Rpb24oYXJncyk6CisgICAgZmlsdGVyX3FzID0gIiIKKyAgICB0ZW5hbnQ9IiIKKyAgICBpZiBhcmdzLmVsZW1lbnQgaW4gKCdmbGF2b3JzJywnaW1hZ2VzJywnc2VydmVycycpOgorICAgICAgICBjaGVja19jb25maWd1cmF0aW9uKCAiQURNSU5fUE9SVCIpCisgICAgICAgIHRlbmFudD0iLyIrdmltX2NvbmZpZ1siVEVOQU5UIl0KKyAgICBlbHNlOgorICAgICAgICBjaGVja19jb25maWd1cmF0aW9uKCJBRE1JTl9QT1JUIiwgIlRFTkFOVCIpCisgICAgICAgIHRlbmFudD0iIgorICAgIHVybCA9ICJodHRwOi8vJXM6JXMvb3BlbnZpbSVzLyVzIiAlKHZpbV9jb25maWdbIkhPU1QiXSwgdmltX2NvbmZpZ1siUE9SVCJdLCB0ZW5hbnQsIGFyZ3MuZWxlbWVudCkKKyAgICBpZiAiQURNSU5fUE9SVCIgaW4gdmltX2NvbmZpZyBhbmQgdmltX2NvbmZpZ1siQURNSU5fUE9SVCJdIT1Ob25lOgorICAgICAgICB1cmxfYWRtaW4gPSAiaHR0cDovLyVzOiVzL29wZW52aW0lcy8lcyIgJSh2aW1fY29uZmlnWyJIT1NUIl0sIHZpbV9jb25maWdbIkFETUlOX1BPUlQiXSwgdGVuYW50LCBhcmdzLmVsZW1lbnQpCisgICAgZWxzZToKKyAgICAgICAgdXJsX2FkbWluID0gTm9uZQorCisgICAgaWYgYXJncy5maWx0ZXI6CisgICAgICAgIGZpbHRlcl9xcyArPSAiPyIgKyBhcmdzLmZpbHRlcgorICAgIGlmIGFyZ3MubmFtZSE9Tm9uZToKKyAgICAgICAgaWYgY2hlY2tfdmFsaWRfdXVpZChhcmdzLm5hbWUpOgorICAgICAgICAgICAgaWYgbGVuKGZpbHRlcl9xcykgPiAwOiAgZmlsdGVyX3FzICs9ICImIiArICJpZD0iICsgc3RyKGFyZ3MubmFtZSkKKyAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgIGZpbHRlcl9xcyArPSAiPyIgKyAiaWQ9IiArIHN0cihhcmdzLm5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBsZW4oZmlsdGVyX3FzKSA+IDA6ICBmaWx0ZXJfcXMgKz0gIiYiICsgIm5hbWU9IiArIHN0cihhcmdzLm5hbWUpCisgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICBmaWx0ZXJfcXMgKz0gIj8iICsgIm5hbWU9IiArIHN0cihhcmdzLm5hbWUpCisgICAgCisKKyAgICByLGMgPSB2aW1fcmVhZCh1cmwgKyBmaWx0ZXJfcXMpCisgICAgaWYgcj09LTQwMSBhbmQgdXJsX2FkbWluIT1Ob25lIGFuZCB1cmwgIT0gdXJsX2FkbWluOiAjVW5hdXRob3JpemVkLCB0cnkgd2l0aCBhZG1pbiBwcml2aWxlZ2VzCisgICAgICAgIHIsYyA9IHZpbV9yZWFkKHVybF9hZG1pbiArIGZpbHRlcl9xcykKKyAgICBpZiByPDA6ICAgICAgICAgICAKKyAgICAgICAgcHJpbnQgIkVycm9yOiIsIGMKKyAgICAgICAgcmV0dXJuIC1yCisgICAgaWYgYXJncy5hY3Rpb249PSdjcmVhdGVJbWFnZSc6CisgICAgICAgIHBheWxvYWQ9eyBhcmdzLmFjdGlvbjogeyJuYW1lIjphcmdzLmltYWdlTmFtZX0gfQorICAgICAgICBpZiBhcmdzLmRlc2NyaXB0aW9uICE9IE5vbmU6CisgICAgICAgICAgICBwYXlsb2FkW2FyZ3MuYWN0aW9uXVsiZGVzY3JpcHRpb24iXT1hcmdzLmRlc2NyaXB0aW9uCisgICAgICAgIGlmIGFyZ3MucGF0aCAhPSBOb25lOgorICAgICAgICAgICAgcGF5bG9hZFthcmdzLmFjdGlvbl1bInBhdGgiXT1hcmdzLnBhdGgKKyAgICBlbHNlOgorICAgICAgICBwYXlsb2FkPXsgYXJncy5hY3Rpb246IE5vbmV9CisgICAgI3ByaW50IGpzb24uZHVtcHMoYywgaW5kZW50PTQpCisgICAgaXRlbV9saXN0ID0gY1sgYXJncy5lbGVtZW50IF0KKyAgICBpZiBsZW4oaXRlbV9saXN0KT09MCBhbmQgYXJncy5uYW1lICE9IE5vbmU6CisgICAgICAgIHByaW50ICAiIE5vdCBmb3VuZCAiICsgYXJncy5lbGVtZW50ICsgIiAiICsgYXJncy5uYW1lCisgICAgICAgIHJldHVybiA0MDQgI0hUVFBfTm90X0ZvdW5kCisgICAgcmVzdWx0ID0gMAorICAgIGZvciBpdGVtIGluIGl0ZW1fbGlzdDoKKyAgICAgICAgdXVpZD1pdGVtLmdldCgnaWQnLCBOb25lKQorICAgICAgICBpZiB1dWlkIGlzIE5vbmU6CisgICAgICAgICAgICB1dWlkPWl0ZW0uZ2V0KCd1dWlkJywgTm9uZSkKKyAgICAgICAgaWYgdXVpZCBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQgIklkIG5vdCBmb3VuZCIKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG5hbWUgPSBpdGVtLmdldCgnbmFtZScsICcnKQorICAgICAgICBpZiBub3QgYXJncy5mb3JjZToKKyAgICAgICAgICAgIHIgPSByYXdfaW5wdXQoIiBBY3Rpb24gb3ZlciAiICsgYXJncy5lbGVtZW50ICsgIiAiICsgdXVpZCArICIgIiArIG5hbWUgKyAiICh5L04pPyAiKQorICAgICAgICAgICAgaWYgIGxlbihyKT4wICBhbmQgclswXS5sb3dlcigpPT0ieSI6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICByLGMgPSB2aW1fYWN0aW9uKHVybCArICIvIiArIHV1aWQgKyAiL2FjdGlvbiIsIHBheWxvYWQpCisgICAgICAgIGlmIHI9PS00MDEgYW5kIHVybF9hZG1pbiE9Tm9uZSBhbmQgdXJsICE9IHVybF9hZG1pbjogI1VuYXV0aG9yaXplZCwgdHJ5IHdpdGggYWRtaW4gcHJpdmlsZWdlcworICAgICAgICAgICAgdXJsPXVybF9hZG1pbgorICAgICAgICAgICAgcixjID0gdmltX2FjdGlvbih1cmwgKyAiLyIgKyB1dWlkICsgIi9hY3Rpb24iLCBwYXlsb2FkKQorICAgICAgICBpZiByPDA6CisgICAgICAgICAgICBwcmludCAiICIgKyB1dWlkICsiICAgIisgbmFtZS5sanVzdCgyMCkgKyAiICAgIiArIGMKKyAgICAgICAgICAgIHJlc3VsdCA9IC1yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBhcmdzLmFjdGlvbiA9PSAiY3JlYXRlSW1hZ2UiOiAgI3Jlc3BvbnNlIGNvbnRhaW4gYW4ge2ltYWdlOiB7Li4ufSB9LCBub3QgYSB7c2VydmVyOiB7Li4ufSB9LgorICAgICAgICAgICAgICAgIHByaW50ICIgIiArIGNbImltYWdlIl1bImlkIl0gKyIgICAiKyBjWyJpbWFnZSJdWyJuYW1lIl0ubGp1c3QoMjApCisgICAgICAgICAgICAgICAgYXJncy5lbGVtZW50PSJpbWFnZXMiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICIgIiArIHV1aWQgICAgICAgICAgICAgKyIgICAiKyBuYW1lLmxqdXN0KDIwKSArICIgICAiKyBhcmdzLmFjdGlvbgorICAgICAgICAgICAgaWYgInZlcmJvc2UiIGluIGFyZ3MgYW5kIGFyZ3MudmVyYm9zZSE9Tm9uZToKKyAgICAgICAgICAgICAgICBfcHJpbnRfdmVyYm9zZShjLCBhcmdzLmVsZW1lbnRbOi0xXSwgYXJncy52ZXJib3NlKQorICAgIHJldHVybiByZXN1bHQKKworZGVmIGVsZW1lbnRfZWRpdChhcmdzKToKKyAgICBmaWx0ZXJfcXMgPSAiIgorICAgIHRlbmFudD0iIgorICAgIGlmIGFyZ3MuZWxlbWVudCBpbiAoJ2ZsYXZvcnMnLCdpbWFnZXMnLCdzZXJ2ZXJzJyk6CisgICAgICAgIGNoZWNrX2NvbmZpZ3VyYXRpb24oICJBRE1JTl9QT1JUIikKKyAgICAgICAgdGVuYW50PSIvIit2aW1fY29uZmlnWyJURU5BTlQiXQorICAgIGVsc2U6CisgICAgICAgIGNoZWNrX2NvbmZpZ3VyYXRpb24oIkFETUlOX1BPUlQiLCAiVEVOQU5UIikKKyAgICAgICAgdGVuYW50PSIiCisKKyAgICB1cmwgPSAiaHR0cDovLyVzOiVzL29wZW52aW0lcy8lcyIgJSh2aW1fY29uZmlnWyJIT1NUIl0sIHZpbV9jb25maWdbIlBPUlQiXSwgdGVuYW50LCBhcmdzLmVsZW1lbnQpCisgICAgaWYgIkFETUlOX1BPUlQiIGluIHZpbV9jb25maWcgYW5kIHZpbV9jb25maWdbIkFETUlOX1BPUlQiXSE9Tm9uZToKKyAgICAgICAgdXJsX2FkbWluID0gImh0dHA6Ly8lczolcy9vcGVudmltJXMvJXMiICUodmltX2NvbmZpZ1siSE9TVCJdLCB2aW1fY29uZmlnWyJBRE1JTl9QT1JUIl0sIHRlbmFudCwgYXJncy5lbGVtZW50KQorICAgIGVsc2U6CisgICAgICAgIHVybF9hZG1pbiA9IE5vbmUKKyAgICAKKyAgICBpZiBhcmdzLmZpbHRlcjoKKyAgICAgICAgZmlsdGVyX3FzICs9ICI/IiArIGFyZ3MuZmlsdGVyCisgICAgaWYgYXJncy5uYW1lIT1Ob25lOgorICAgICAgICBpZiBjaGVja192YWxpZF91dWlkKGFyZ3MubmFtZSk6CisgICAgICAgICAgICBpZiBsZW4oZmlsdGVyX3FzKSA+IDA6ICBmaWx0ZXJfcXMgKz0gIiYiICsgImlkPSIgKyBzdHIoYXJncy5uYW1lKQorICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgZmlsdGVyX3FzICs9ICI/IiArICJpZD0iICsgc3RyKGFyZ3MubmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGxlbihmaWx0ZXJfcXMpID4gMDogIGZpbHRlcl9xcyArPSAiJiIgKyAibmFtZT0iICsgc3RyKGFyZ3MubmFtZSkKKyAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgIGZpbHRlcl9xcyArPSAiPyIgKyAibmFtZT0iICsgc3RyKGFyZ3MubmFtZSkKKyAgICAKKworICAgIHIsYyA9IHZpbV9yZWFkKHVybCArIGZpbHRlcl9xcykKKyAgICBpZiByPT0tNDAxIGFuZCB1cmxfYWRtaW4hPU5vbmUgYW5kIHVybCAhPSB1cmxfYWRtaW46ICNVbmF1dGhvcml6ZWQsIHRyeSB3aXRoIGFkbWluIHByaXZpbGVnZXMKKyAgICAgICAgcixjID0gdmltX3JlYWQodXJsX2FkbWluICsgZmlsdGVyX3FzKQorICAgIGlmIHI8MDogICAgICAgICAgIAorICAgICAgICBwcmludCAiRXJyb3I6IiwgYworICAgICAgICByZXR1cm4gLXIKKworICAgIHBheWxvYWQ9bG9hZF9maWxlX29yX3lhbWwoYXJncy5maWxlKQorICAgIHIyLGMyPSBjaGFuZ2VfdmFyKHBheWxvYWQpCisgICAgaWYgcjI8MDoKKyAgICAgICAgcHJpbnQgIlRlbXBsYXRlIGVycm9yIiwgYzIKKyAgICAgICAgcmV0dXJuIC0xCisgICAgcGF5bG9hZD1jMgorICAgIGlmIGFyZ3MuZWxlbWVudFs6LTFdIG5vdCBpbiBwYXlsb2FkOgorICAgICAgICBwYXlsb2FkID0ge2FyZ3MuZWxlbWVudFs6LTFdOiBwYXlsb2FkIH0KKworICAgICNwcmludCBqc29uLmR1bXBzKGMsIGluZGVudD00KQorICAgIGl0ZW1fbGlzdCA9IGNbIGFyZ3MuZWxlbWVudCBdCisgICAgaWYgbGVuKGl0ZW1fbGlzdCk9PTAgYW5kIGFyZ3MubmFtZSAhPSBOb25lOgorICAgICAgICBwcmludCAgIiBOb3QgZm91bmQgIiArIGFyZ3MuZWxlbWVudCArICIgIiArIGFyZ3MubmFtZQorICAgICAgICByZXR1cm4gNDA0ICNIVFRQX05vdF9Gb3VuZAorICAgIHJlc3VsdCA9IDAKKyAgICBmb3IgaXRlbSBpbiBpdGVtX2xpc3Q6CisgICAgICAgIHV1aWQ9aXRlbS5nZXQoJ2lkJywgTm9uZSkKKyAgICAgICAgaWYgdXVpZCBpcyBOb25lOgorICAgICAgICAgICAgdXVpZD1pdGVtLmdldCgndXVpZCcsIE5vbmUpCisgICAgICAgIGlmIHV1aWQgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50ICJJZCBub3QgZm91bmQiCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBuYW1lID0gaXRlbS5nZXQoJ25hbWUnLCAnJykKKyAgICAgICAgaWYgbm90IGFyZ3MuZm9yY2Ugb3IgKGFyZ3MubmFtZT09Tm9uZSBhbmQgYXJncy5maWxlcj09Tm9uZSk6CisgICAgICAgICAgICByID0gcmF3X2lucHV0KCIgRWRpdCAiICsgYXJncy5lbGVtZW50ICsgIiAiICsgdXVpZCArICIgIiArIG5hbWUgKyAiICh5L04pPyAiKQorICAgICAgICAgICAgaWYgIGxlbihyKT4wICBhbmQgclswXS5sb3dlcigpPT0ieSI6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICByLGMgPSB2aW1fZWRpdCh1cmwgKyAiLyIgKyB1dWlkLCBwYXlsb2FkKQorICAgICAgICBpZiByPT0tNDAxIGFuZCB1cmxfYWRtaW4hPU5vbmUgYW5kIHVybCAhPSB1cmxfYWRtaW46ICNVbmF1dGhvcml6ZWQsIHRyeSB3aXRoIGFkbWluIHByaXZpbGVnZXMKKyAgICAgICAgICAgIHVybD11cmxfYWRtaW4KKyAgICAgICAgICAgIHIsYyA9IHZpbV9lZGl0KHVybCArICIvIiArIHV1aWQsIHBheWxvYWQpCisgICAgICAgIGlmIHI8MDoKKyAgICAgICAgICAgIHByaW50ICIgIiArIHV1aWQgKyIgICAiKyBuYW1lLmxqdXN0KDIwKSArICIgIiArIGMKKyAgICAgICAgICAgIHJlc3VsdCA9IC1yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiICIgKyB1dWlkICsiICAgIisgbmFtZS5sanVzdCgyMCkgKyAiIGVkaXRlZCIKKyAgICAgICAgICAgIGlmICJ2ZXJib3NlIiBpbiBhcmdzIGFuZCBhcmdzLnZlcmJvc2UhPU5vbmU6CisgICAgICAgICAgICAgICAgX3ByaW50X3ZlcmJvc2UoYywgYXJncy5lbGVtZW50WzotMV0sIGFyZ3MudmVyYm9zZSkKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBlbGVtZW50X2FjdGlvbl9lZGl0KGFyZ3MpOgorICAgICNwcmludCBhcmdzCisgICAgaWYgYXJncy5lbGVtZW50PT0ncG9ydHMnOgorICAgICAgICBpZiBhcmdzLmFjdGlvbj09J2F0dGFjaCc6CisgICAgICAgICAgICBhcmdzLmZpbGU9J25ldHdvcmtfaWQ6ICcgKyBhcmdzLm5ldHdvcmtfaWQKKyAgICAgICAgZWxzZTogI2FyZ3MuYWN0aW9uPT0nZGV0YWNoJworICAgICAgICAgICAgYXJncy5maWxlPSduZXR3b3JrX2lkOiBudWxsJworICAgIGlmIGFyZ3MuYWN0aW9uPT0ndXAnOgorICAgICAgICBhcmdzLmZpbGU9J2FkbWluX3N0YXRlX3VwOiB0cnVlJworICAgIGlmIGFyZ3MuYWN0aW9uPT0nZG93bic6CisgICAgICAgIGFyZ3MuZmlsZT0nYWRtaW5fc3RhdGVfdXA6IGZhbHNlJworICAgIHJldHVybiBlbGVtZW50X2VkaXQoYXJncykKKyAgICAKK2RlZiBlbGVtZW50X2RlbGV0ZShhcmdzKToKKyAgICBmaWx0ZXJfcXMgPSAiIgorICAgIHRlbmFudD0iIgorICAgIGlmIGFyZ3MuZWxlbWVudCBpbiAoJ2ZsYXZvcnMnLCdpbWFnZXMnLCdzZXJ2ZXJzJyk6CisgICAgICAgIGNoZWNrX2NvbmZpZ3VyYXRpb24oIkFETUlOX1BPUlQiICkKKyAgICAgICAgdGVuYW50PSIvIit2aW1fY29uZmlnWyJURU5BTlQiXQorICAgIGVsc2U6CisgICAgICAgIGNoZWNrX2NvbmZpZ3VyYXRpb24oIkFETUlOX1BPUlQiLCAiVEVOQU5UIikKKyAgICAgICAgdGVuYW50PSIiCisKKyAgICB1cmwgPSAiaHR0cDovLyVzOiVzL29wZW52aW0lcy8lcyIgJSh2aW1fY29uZmlnWyJIT1NUIl0sIHZpbV9jb25maWdbIlBPUlQiXSwgdGVuYW50LCBhcmdzLmVsZW1lbnQpCisgICAgaWYgIkFETUlOX1BPUlQiIGluIHZpbV9jb25maWcgYW5kIHZpbV9jb25maWdbIkFETUlOX1BPUlQiXSE9Tm9uZToKKyAgICAgICAgdXJsX2FkbWluID0gImh0dHA6Ly8lczolcy9vcGVudmltJXMvJXMiICUodmltX2NvbmZpZ1siSE9TVCJdLCB2aW1fY29uZmlnWyJBRE1JTl9QT1JUIl0sIHRlbmFudCwgYXJncy5lbGVtZW50KQorICAgIGVsc2U6CisgICAgICAgIHVybF9hZG1pbiA9IE5vbmUKKworICAgIGlmIGFyZ3MuZmlsdGVyOgorICAgICAgICBmaWx0ZXJfcXMgKz0gIj8iICsgYXJncy5maWx0ZXIKKyAgICBpZiBhcmdzLm5hbWUhPU5vbmU6CisgICAgICAgIGlmIGNoZWNrX3ZhbGlkX3V1aWQoYXJncy5uYW1lKToKKyAgICAgICAgICAgIGlmIGxlbihmaWx0ZXJfcXMpID4gMDogIGZpbHRlcl9xcyArPSAiJiIgKyAiaWQ9IiArIHN0cihhcmdzLm5hbWUpCisgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICBmaWx0ZXJfcXMgKz0gIj8iICsgImlkPSIgKyBzdHIoYXJncy5uYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbGVuKGZpbHRlcl9xcykgPiAwOiAgZmlsdGVyX3FzICs9ICImIiArICJuYW1lPSIgKyBzdHIoYXJncy5uYW1lKQorICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgZmlsdGVyX3FzICs9ICI/IiArICJuYW1lPSIgKyBzdHIoYXJncy5uYW1lKQorICAgIAorCisgICAgcixjID0gdmltX3JlYWQodXJsICsgZmlsdGVyX3FzKQorICAgIGlmIHI9PS00MDEgYW5kIHVybF9hZG1pbiE9Tm9uZSBhbmQgdXJsICE9IHVybF9hZG1pbjogI1VuYXV0aG9yaXplZCwgdHJ5IHdpdGggYWRtaW4gcHJpdmlsZWdlcworICAgICAgICByLGMgPSB2aW1fcmVhZCh1cmxfYWRtaW4gKyBmaWx0ZXJfcXMpCisgICAgaWYgcjwwOiAgICAgICAgICAgCisgICAgICAgIHByaW50ICJFcnJvcjoiLCBjCisgICAgICAgIHJldHVybiAtcgorCisgICAgI3ByaW50IGpzb24uZHVtcHMoYywgaW5kZW50PTQpCisgICAgaXRlbV9saXN0ID0gY1sgYXJncy5lbGVtZW50IF0KKyAgICBpZiBsZW4oaXRlbV9saXN0KT09MCBhbmQgYXJncy5uYW1lICE9IE5vbmU6CisgICAgICAgIHByaW50ICAiIE5vdCBmb3VuZCAiICsgYXJncy5lbGVtZW50ICsgIiAiICsgYXJncy5uYW1lCisgICAgICAgIHJldHVybiA0MDQgI0hUVFBfTm90X0ZvdW5kCisgICAgcmVzdWx0ID0gMAorICAgIGZvciBpdGVtIGluIGl0ZW1fbGlzdDoKKyAgICAgICAgdXVpZD1pdGVtLmdldCgnaWQnLCBOb25lKQorICAgICAgICBpZiB1dWlkIGlzIE5vbmU6CisgICAgICAgICAgICB1dWlkPWl0ZW0uZ2V0KCd1dWlkJywgTm9uZSkKKyAgICAgICAgaWYgdXVpZCBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQgIklkIG5vdCBmb3VuZCIKKyAgICAgICAgICAgIHJlc3VsdCA9IC01MDAKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG5hbWUgPSBpdGVtLmdldCgnbmFtZScsICcnKQorICAgICAgICBpZiBub3QgYXJncy5mb3JjZToKKyAgICAgICAgICAgIHIgPSByYXdfaW5wdXQoIiBEZWxldGUgIiArIGFyZ3MuZWxlbWVudCArICIgIiArIHV1aWQgKyAiICIgKyBuYW1lICsgIiAoeS9OKT8gIikKKyAgICAgICAgICAgIGlmICBsZW4ocik+MCAgYW5kIHJbMF0ubG93ZXIoKT09InkiOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcixjID0gdmltX2RlbGV0ZSh1cmwgKyAiLyIgKyB1dWlkKQorICAgICAgICBpZiByPT0tNDAxIGFuZCB1cmxfYWRtaW4hPU5vbmUgYW5kIHVybCAhPSB1cmxfYWRtaW46ICNVbmF1dGhvcml6ZWQsIHRyeSB3aXRoIGFkbWluIHByaXZpbGVnZXMKKyAgICAgICAgICAgIHVybD11cmxfYWRtaW4KKyAgICAgICAgICAgIHIsYyA9IHZpbV9kZWxldGUodXJsICsgIi8iICsgdXVpZCkKKyAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgcHJpbnQgIiAiICsgdXVpZCArIiAgICIrIG5hbWUubGp1c3QoMjApICsgIiAiICsgYworICAgICAgICAgICAgcmVzdWx0ID0gLXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICIgIiArIHV1aWQgKyIgICAiKyBuYW1lLmxqdXN0KDIwKSArICIgZGVsZXRlZCIKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBlbGVtZW50X2xpc3QoYXJncyk6CisgICAgI3ByaW50ICJlbGVtZW50X2xpc3QiLCBhcmdzCisgICAgZmlsdGVyX3FzID0gIiIKKyAgICB0ZW5hbnQ9IiIKKyAgICBpZiBhcmdzLmVsZW1lbnQgaW4gKCdmbGF2b3JzJywnaW1hZ2VzJywnc2VydmVycycpOgorICAgICAgICBjaGVja19jb25maWd1cmF0aW9uKCAiQURNSU5fUE9SVCIgKQorICAgICAgICB0ZW5hbnQ9Ii8iK3ZpbV9jb25maWdbIlRFTkFOVCJdCisgICAgZWxzZToKKyAgICAgICAgY2hlY2tfY29uZmlndXJhdGlvbiggIkFETUlOX1BPUlQiLCAiVEVOQU5UIiApCisgICAgICAgIHRlbmFudD0iIgorICAgICNpZiBhcmdzLm5hbWU6CisgICAgIyAgICB3aGF0ICs9ICIvIiArIGFyZ3MubmFtZQorICAgIHVybCA9ICJodHRwOi8vJXM6JXMvb3BlbnZpbSVzLyVzIiAlKHZpbV9jb25maWdbIkhPU1QiXSwgdmltX2NvbmZpZ1siUE9SVCJdLCB0ZW5hbnQsIGFyZ3MuZWxlbWVudCkKKyAgICBpZiAiQURNSU5fUE9SVCIgaW4gdmltX2NvbmZpZyBhbmQgdmltX2NvbmZpZ1siQURNSU5fUE9SVCJdIT1Ob25lOgorICAgICAgICB1cmxfYWRtaW4gPSAiaHR0cDovLyVzOiVzL29wZW52aW0lcy8lcyIgJSh2aW1fY29uZmlnWyJIT1NUIl0sIHZpbV9jb25maWdbIkFETUlOX1BPUlQiXSwgdGVuYW50LCBhcmdzLmVsZW1lbnQpCisgICAgZWxzZToKKyAgICAgICAgdXJsX2FkbWluID0gTm9uZQorICAgICNwcmludCAiIGdldCIsIHdoYXQsICIgICAgID4+Pj4+Pj4+ICIsCisgICAgaWYgYXJncy5maWx0ZXI6CisgICAgICAgIGZpbHRlcl9xcyArPSAiPyIgKyBhcmdzLmZpbHRlcgorICAgIGlmIGFyZ3MubmFtZSE9Tm9uZToKKyAgICAgICAgaWYgY2hlY2tfdmFsaWRfdXVpZChhcmdzLm5hbWUpOgorICAgICAgICAgICAgaWYgbGVuKGZpbHRlcl9xcykgPiAwOiAgZmlsdGVyX3FzICs9ICImIiArICJpZD0iICsgc3RyKGFyZ3MubmFtZSkKKyAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgIGZpbHRlcl9xcyArPSAiPyIgKyAiaWQ9IiArIHN0cihhcmdzLm5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBsZW4oZmlsdGVyX3FzKSA+IDA6ICBmaWx0ZXJfcXMgKz0gIiYiICsgIm5hbWU9IiArIHN0cihhcmdzLm5hbWUpCisgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICBmaWx0ZXJfcXMgKz0gIj8iICsgIm5hbWU9IiArIHN0cihhcmdzLm5hbWUpCisgICAgCisKKyAgICByLGMgPSB2aW1fcmVhZCh1cmwgKyBmaWx0ZXJfcXMpCisgICAgaWYgcj09LTQwMSBhbmQgdXJsX2FkbWluIT1Ob25lIGFuZCB1cmwgIT0gdXJsX2FkbWluOiAjVW5hdXRob3JpemVkLCB0cnkgd2l0aCBhZG1pbiBwcml2aWxlZ2VzCisgICAgICAgIHIsYyA9IHZpbV9yZWFkKHVybF9hZG1pbiArIGZpbHRlcl9xcykKKyAgICBpZiByPDA6ICAgICAgICAgICAKKyAgICAgICAgcHJpbnQgIkVycm9yOiIsIGMKKyAgICAgICAgcmV0dXJuIC1yCisgICAgI3ByaW50IGpzb24uZHVtcHMoYywgaW5kZW50PTQpCisgICAgcmVzdWx0ID0gMAorICAgIGl0ZW1fbGlzdCA9IGNbIGFyZ3MuZWxlbWVudCBdCisgICAgdmVyYm9zZT0wCisgICAgI2lmIGFyZ3MubmFtZSE9Tm9uZSBhbmQgbGVuKGl0ZW1fbGlzdCk9PTE6CisgICAgIyAgICB2ZXJib3NlKz0xCisgICAgaWYgYXJncy52ZXJib3NlIT1Ob25lOgorICAgICAgICB2ZXJib3NlICs9IGFyZ3MudmVyYm9zZQorICAgIGZvciBpdGVtIGluIGl0ZW1fbGlzdDoKKyAgICAgICAgZXh0cmE9IiIKKyAgICAgICAgaWYgYXJncy5lbGVtZW50PT0ic2VydmVycyIgb3IgYXJncy5lbGVtZW50PT0ibmV0d29ya3MiOiBleHRyYSA9ICIgIitpdGVtWydzdGF0dXMnXQorICAgICAgICBpZiBhcmdzLmVsZW1lbnQgaW4gKCJob3N0cyIsIm5ldHdvcmtzIiwicG9ydHMiKSBhbmQgbm90IGl0ZW1bJ2FkbWluX3N0YXRlX3VwJ106IGV4dHJhICs9ICIgYWRtaW5fc3RhdGVfdXA9ZmFsc2UiCisgICAgICAgIHByaW50IGl0ZW1bJ2lkJ10rIiAgICIraXRlbVsnbmFtZSddLmxqdXN0KDIwKSArIGV4dHJhCisgICAgICAgIGlmIHZlcmJvc2U+MDoKKyAgICAgICAgICAgIHIyLGMyID0gdmltX3JlYWQodXJsICsgIi8iKyBpdGVtWydpZCddKQorICAgICAgICAgICAgaWYgcjI9PS00MDEgYW5kIHVybF9hZG1pbiE9Tm9uZSBhbmQgdXJsICE9IHVybF9hZG1pbjogI1VuYXV0aG9yaXplZCwgdHJ5IHdpdGggYWRtaW4gcHJpdmlsZWdlcworICAgICAgICAgICAgICAgIHVybD11cmxfYWRtaW4KKyAgICAgICAgICAgICAgICByMixjMiA9IHZpbV9yZWFkKHVybCArICIvIisgaXRlbVsnaWQnXSkKKyAgICAgICAgICAgIGlmIHIyPjA6CisgICAgICAgICAgICAgICAgX3ByaW50X3ZlcmJvc2UoYzIsIGFyZ3MuZWxlbWVudFs6LTFdLCB2ZXJib3NlKQorCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgb3BlbmZsb3dfYWN0aW9uKGFyZ3MpOgorICAgIGlmIGFyZ3MuYWN0aW9uPT0ncG9ydC1saXN0JzoKKyAgICAgICAgdXJsID0gImh0dHA6Ly8lczolcy9vcGVudmltL25ldHdvcmtzL29wZW5mbG93L3BvcnRzIiAlKHZpbV9jb25maWdbIkhPU1QiXSwgdmltX2NvbmZpZ1siUE9SVCJdKQorICAgICAgICByLGMgPSB2aW1fcmVhZCh1cmwpCisgICAgZWxpZiBhcmdzLmFjdGlvbj09J3J1bGVzLWxpc3QnIG9yIGFyZ3MuYWN0aW9uPT0ncmVpbnN0YWxsJzoKKyAgICAgICAgUE9SVCA9IHZpbV9jb25maWdbIlBPUlQiXQorICAgICAgICBpZiBhcmdzLmFjdGlvbj09J3JlaW5zdGFsbCc6CisgICAgICAgICAgICBpZiAiQURNSU5fUE9SVCIgbm90IGluIHZpbV9jb25maWc6CisgICAgICAgICAgICAgICAgcHJpbnQgIk9QRU5WSU1fQURNSU5fUE9SVCB2YXJpYWJsZSBub3QgZGVmaW5lZCIKKyAgICAgICAgICAgICAgICByZXR1cm4gNDA0ICNIVFRQX05vdF9Gb3VuZAorICAgICAgICAgICAgUE9SVCA9IHZpbV9jb25maWdbIkFETUlOX1BPUlQiXQorICAgICAgICBpZiBhcmdzLm5hbWUhPU5vbmU6CisgICAgICAgICAgICB1cmwgPSAiaHR0cDovLyVzOiVzL29wZW52aW0vbmV0d29ya3MiICUodmltX2NvbmZpZ1siSE9TVCJdLCBQT1JUKQorICAgICAgICAgICAgaWYgY2hlY2tfdmFsaWRfdXVpZChhcmdzLm5hbWUpOgorICAgICAgICAgICAgICAgIHVybCArPSAiP2lkPSIgKyBzdHIoYXJncy5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB1cmwgKz0gIj9uYW1lPSIgKyBzdHIoYXJncy5uYW1lKQorICAgICAgICAgICAgcixjID0gdmltX3JlYWQodXJsKQorICAgICAgICAgICAgaWYgcjwwOiAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcHJpbnQgIkVycm9yOiIsIGMKKyAgICAgICAgICAgICAgICByZXR1cm4gLXIKKyAgICAgICAgICAgIGlmIGxlbiAoY1sibmV0d29ya3MiXSkgPT0gMDoKKyAgICAgICAgICAgICAgICBwcmludCAiICBOZXR3b3JrIG5vdCBmb3VuZCIKKyAgICAgICAgICAgICAgICByZXR1cm4gNDA0ICNIVFRQX05vdF9Gb3VuZAorICAgICAgICAgICAgaWYgbGVuIChjWyJuZXR3b3JrcyJdKSA+IDE6CisgICAgICAgICAgICAgICAgcHJpbnQgIiAgTW9yZSB0aGFuIG9uZSBuZXQgd2l0aCB0aGlzIG5hbWUgZm91bmQuIFVzZSB1dWlkIGluc3RlYWQgb2YgbmFtZSB0byBjb25jcmV0aXplIgorICAgICAgICAgICAgICAgIHJldHVybiA0MDQgI0hUVFBfTm90X0ZvdW5kCisgICAgICAgICAgICBuZXR3b3JrID0gY1sibmV0d29ya3MiXVswXVsiaWQiXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV0d29yaz0iYWxsIgorICAgICAgICB1cmwgPSAiaHR0cDovLyVzOiVzL29wZW52aW0vbmV0d29ya3MvJXMvb3BlbmZsb3ciICUodmltX2NvbmZpZ1siSE9TVCJdLCBQT1JULCBuZXR3b3JrKQorICAgICAgICBpZiBhcmdzLmFjdGlvbj09J3JlaW5zdGFsbCc6CisgICAgICAgICAgICByLGMgPSB2aW1fZWRpdCh1cmwsIE5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByLGMgPSB2aW1fcmVhZCh1cmwpCisgICAgZWxpZiBhcmdzLmFjdGlvbj09J2NsZWFyLWFsbCc6CisgICAgICAgIGlmICJBRE1JTl9QT1JUIiBub3QgaW4gdmltX2NvbmZpZzoKKyAgICAgICAgICAgIHByaW50ICJPUEVOVklNX0FETUlOX1BPUlQgdmFyaWFibGUgbm90IGRlZmluZWQiCisgICAgICAgICAgICByZXR1cm4gNDAxICMgSFRUUF9VbmF1dGhvcml6ZWQKKyAgICAgICAgdXJsID0gImh0dHA6Ly8lczolcy9vcGVudmltL25ldHdvcmtzL29wZW5mbG93L2NsZWFyIiAlKHZpbV9jb25maWdbIkhPU1QiXSwgdmltX2NvbmZpZ1siQURNSU5fUE9SVCJdKQorICAgICAgICByLGMgPSB2aW1fZGVsZXRlKHVybCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gNDAwICNIVFRQX0JhZF9SZXF1ZXN0CisgICAgaWYgcjwwOiAgICAgICAgICAgCisgICAgICAgIHByaW50ICJFcnJvcjoiLCBjCisgICAgICAgIHJldHVybiAtcgorICAgIGVsc2U6CisgICAgICAgIHByaW50IHlhbWwuc2FmZV9kdW1wKGMsIGluZGVudD00LCBkZWZhdWx0X2Zsb3dfc3R5bGU9RmFsc2UpCisgICAgICAgIHJldHVybiAwCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIAorICAgIGl0ZW1fZGljdD17J3ZtJzonc2VydmVycycsJ2hvc3QnOidob3N0cycsJ3RlbmFudCc6J3RlbmFudHMnLCdpbWFnZSc6J2ltYWdlcycsJ2ZsYXZvcic6J2ZsYXZvcnMnLCduZXQnOiduZXR3b3JrcycsJ3BvcnQnOidwb3J0cyd9CisgICAgCisgICAgdmltX2NvbmZpZz17fQorICAgIHZpbV9jb25maWdbIkhPU1QiXSA9ICAgICAgIG9zLmdldGVudignT1BFTlZJTV9IT1NUJywgJ2xvY2FsaG9zdCcpCisgICAgdmltX2NvbmZpZ1siUE9SVCJdID0gICAgICAgb3MuZ2V0ZW52KCdPUEVOVklNX1BPUlQnLCAnOTA4MCcpCisgICAgdmltX2NvbmZpZ1siQURNSU5fUE9SVCJdID0gb3MuZ2V0ZW52KCdPUEVOVklNX0FETUlOX1BPUlQnLCAnOTA4NScpCisgICAgdmltX2NvbmZpZ1siVEVOQU5UIl0gPSAgICAgb3MuZ2V0ZW52KCdPUEVOVklNX1RFTkFOVCcsIE5vbmUpCisgICAgCisgICAKKyAgICBtYWluX3BhcnNlciA9IFRocm93aW5nQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J1VzZXIgcHJvZ3JhbSB0byBpbnRlcmFjdCB3aXRoIE9QRU5WSU0tU0VSVkVSIChvcGVudmltZCknKQorICAgICNtYWluX3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSdVc2VyIHByb2dyYW0gdG8gaW50ZXJhY3Qgd2l0aCBPUEVOVklNLVNFUlZFUiAob3BlbnZpbWQpJykKKyAgICBtYWluX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyc2lvbicsIGFjdGlvbj0ndmVyc2lvbicsIHZlcnNpb249JyUocHJvZylzICcgKyBfX3ZlcnNpb25fXyArICcgJyt2ZXJzaW9uX2RhdGUpCisgICAgCisgICAgc3VicGFyc2VycyA9IG1haW5fcGFyc2VyLmFkZF9zdWJwYXJzZXJzKGhlbHA9J2NvbW1hbmRzJykKKyAgICAKKyAgICBjb25maWdfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCdjb25maWcnLCBoZWxwPSJwcmludHMgY29uZmlndXJhdGlvbiB2YWx1ZXMiKQorICAgIGNvbmZpZ19wYXJzZXIuYWRkX2FyZ3VtZW50KCJmaWxlIiwgbmFyZ3M9Jz8nLCBoZWxwPSJjb25maWd1cmF0aW9uIGZpbGUgdG8gZXh0cmFjdCB0aGUgY29uZmlndXJhdGlvbiIpLmNvbXBsZXRlciA9IEZpbGVzQ29tcGxldGVyCisgICAgY29uZmlnX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1jb25maWcpCisgICAgI0hFTFAKKyAgICBmb3IgaXRlbSBpbiBpdGVtX2RpY3Q6CisgICAgICAgICNMSVNUCisgICAgICAgIGVsZW1lbnRfbGlzdF9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoaXRlbSsnLWxpc3QnLCBoZWxwPSJsaXN0cyBpbmZvcm1hdGlvbiBhYm91dCAiK2l0ZW1fZGljdFtpdGVtXSkKKyAgICAgICAgZWxlbWVudF9saXN0X3BhcnNlci5hZGRfYXJndW1lbnQoIm5hbWUiLCBuYXJncz0nPycsIGhlbHA9Im5hbWUgb3IgSUQgb2YgdGhlICIgKyBpdGVtKQorICAgICAgICBlbGVtZW50X2xpc3RfcGFyc2VyLmFkZF9hcmd1bWVudCgiLUYiLCItLWZpbHRlciIsIGFjdGlvbj0ic3RvcmUiLCBoZWxwPSJmaWx0ZXIgcXVlcnkgc3RyaW5nIikKKyAgICAgICAgZWxlbWVudF9saXN0X3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsICctdicsIGFjdGlvbj0nY291bnQnLCBoZWxwPSJpbmNyZW1lbnQgdGhlIHZlcmJvc2l0eSIpCisgICAgICAgIGVsZW1lbnRfbGlzdF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9ZWxlbWVudF9saXN0LCBlbGVtZW50PWl0ZW1fZGljdFtpdGVtXSkKKyAgICAgICAgI05FVworICAgICAgICBpZiBpdGVtPT0naG9zdCc6CisgICAgICAgICAgICBlbGVtZW50X25ld19wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoaXRlbSsnLWFkZCcsIGhlbHA9ImFkZHMgYSBuZXcgY29tcHV0ZSBub2RlIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVsZW1lbnRfbmV3X3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcihpdGVtKyctY3JlYXRlJywgaGVscD0iY3JlYXRlcyBhIG5ldyAiK2l0ZW1fZGljdFtpdGVtXVs6LTFdKQorICAgICAgICBlbGVtZW50X25ld19wYXJzZXIuYWRkX2FyZ3VtZW50KCJmaWxlIiwgbmFyZ3M9Jz8nLCBoZWxwPSJqc29uL3lhbWwgdGV4dCBvciBmaWxlIHdpdGggY29udGVudCIpLmNvbXBsZXRlciA9IEZpbGVzQ29tcGxldGVyCisgICAgICAgIGVsZW1lbnRfbmV3X3BhcnNlci5hZGRfYXJndW1lbnQoIi0tbmFtZSIsIGFjdGlvbj0ic3RvcmUiLCBoZWxwPSJVc2UgdGhpcyBuYW1lIikKKyAgICAgICAgaWYgaXRlbSE9Im5ldHdvcmsiOgorICAgICAgICAgICAgZWxlbWVudF9uZXdfcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1kZXNjcmlwdGlvbiIsIGFjdGlvbj0ic3RvcmUiLCBoZWxwPSJVc2UgdGhpcyBkZXNjcml0aW9uIikKKyAgICAgICAgaWYgaXRlbT09ImltYWdlIjoKKyAgICAgICAgICAgIGVsZW1lbnRfbmV3X3BhcnNlci5hZGRfYXJndW1lbnQoIi0tcGF0aCIsIGFjdGlvbj0ic3RvcmUiLCBoZWxwPSJVc2UgdGhpcyBwYXRoIikKKyAgICAgICAgZWxlbWVudF9uZXdfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdjb3VudCcsIGhlbHA9ImluY3JlbWVudCB0aGUgdmVyYm9zaXR5IikKKyAgICAgICAgZWxlbWVudF9uZXdfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWVsZW1lbnRfbmV3LCBlbGVtZW50PWl0ZW1fZGljdFtpdGVtXSkKKyAgICAgICAgI0RFTEVURQorICAgICAgICBpZiBpdGVtPT0naG9zdCc6CisgICAgICAgICAgICBlbGVtZW50X2RlbF9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoaXRlbSsnLXJlbW92ZScsIGhlbHA9InJlbW92ZXMgYSBjb21wdXRlIG5vZGUiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZWxlbWVudF9kZWxfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKGl0ZW0rJy1kZWxldGUnLCBoZWxwPSJkZWxldGVzIG9uZSBvciBzZXZlcmFsICIraXRlbV9kaWN0W2l0ZW1dKQorICAgICAgICBlbGVtZW50X2RlbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCJuYW1lIiwgbmFyZ3M9Jz8nLCBoZWxwPSJuYW1lIG9yIElEIG9mIHRoZSAiK2l0ZW0rIiwgaWYgbWlzc2luZyBtZWFucyBhbGwiKQorICAgICAgICBlbGVtZW50X2RlbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCItRiIsIi0tZmlsdGVyIiwgYWN0aW9uPSJzdG9yZSIsIGhlbHA9ImZpbHRlciBxdWVyeSBzdHJpbmciKQorICAgICAgICBlbGVtZW50X2RlbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCItZiIsIi0tZm9yY2UiLCBhY3Rpb249InN0b3JlX3RydWUiLCBoZWxwPSJkbyBub3QgcHJvbXB0IGZvciBjb25maXJtYXRpb24iKQorICAgICAgICBlbGVtZW50X2RlbF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9ZWxlbWVudF9kZWxldGUsIGVsZW1lbnQ9aXRlbV9kaWN0W2l0ZW1dKQorICAgICAgICAjRURJVAorICAgICAgICBlbGVtZW50X2VkaXRfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKGl0ZW0rJy1lZGl0JywgaGVscD0iZWRpdHMgb25lIG9yIHNldmVyYWwgIitpdGVtX2RpY3RbaXRlbV0pCisgICAgICAgIGVsZW1lbnRfZWRpdF9wYXJzZXIuYWRkX2FyZ3VtZW50KCJuYW1lIiwgaGVscD0ibmFtZSBvciBJRCBvZiB0aGUgIitpdGVtKyIiKQorICAgICAgICBlbGVtZW50X2VkaXRfcGFyc2VyLmFkZF9hcmd1bWVudCgiZmlsZSIsIGhlbHA9Impzb24veWFtbCB0ZXh0IG9yIGZpbGUgd2l0aCB0aGUgY2hhbmdlcyIpLmNvbXBsZXRlciA9IEZpbGVzQ29tcGxldGVyCisgICAgICAgIGVsZW1lbnRfZWRpdF9wYXJzZXIuYWRkX2FyZ3VtZW50KCItRiIsIi0tZmlsdGVyIiwgYWN0aW9uPSJzdG9yZSIsIGhlbHA9ImZpbHRlciBxdWVyeSBzdHJpbmciKQorICAgICAgICBlbGVtZW50X2VkaXRfcGFyc2VyLmFkZF9hcmd1bWVudCgiLWYiLCItLWZvcmNlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgaGVscD0iZG8gbm90IHByb21wdCBmb3IgY29uZmlybWF0aW9uIikKKyAgICAgICAgZWxlbWVudF9lZGl0X3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsICctdicsIGFjdGlvbj0nY291bnQnLCBoZWxwPSJpbmNyZW1lbnQgdGhlIHZlcmJvc2l0eSIpCisgICAgICAgIGVsZW1lbnRfZWRpdF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9ZWxlbWVudF9lZGl0LCBlbGVtZW50PWl0ZW1fZGljdFtpdGVtXSkKKyAgICAgICAgI0FDVElPTgorICAgICAgICBpZiBpdGVtPT0ndm0nOgorICAgICAgICAgICAgZm9yIGl0ZW0yIGluICgnc2h1dGRvd24nLCAnc3RhcnQnLCAncmVidWlsZCcsICdyZWJvb3QnKToKKyAgICAgICAgICAgICAgICB2bV9hY3Rpb25fcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCJ2bS0iK2l0ZW0yLCBoZWxwPSJwZXJmb3JtcyB0aGlzIGFjdGlvbiBvdmVyIHRoZSB2aXJ0dWFsIG1hY2hpbmUiKQorICAgICAgICAgICAgICAgIHZtX2FjdGlvbl9wYXJzZXIuYWRkX2FyZ3VtZW50KCJuYW1lIiwgbmFyZ3M9Jz8nLCBoZWxwPSJuYW1lIG9yIElEIG9mIHRoZSBzZXJ2ZXIsIGlmIG1pc3NpbmcgbWVhbnMgYWxsIikKKyAgICAgICAgICAgICAgICB2bV9hY3Rpb25fcGFyc2VyLmFkZF9hcmd1bWVudCgiLUYiLCItLWZpbHRlciIsIGFjdGlvbj0ic3RvcmUiLCBoZWxwPSJmaWx0ZXIgcXVlcnkgc3RyaW5nIikKKyAgICAgICAgICAgICAgICB2bV9hY3Rpb25fcGFyc2VyLmFkZF9hcmd1bWVudCgiLWYiLCItLWZvcmNlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgaGVscD0iZG8gbm90IHByb21wdCBmb3IgY29uZmlybWF0aW9uIikKKyAgICAgICAgICAgICAgICB2bV9hY3Rpb25fcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWVsZW1lbnRfYWN0aW9uLCBlbGVtZW50PSJzZXJ2ZXJzIiwgYWN0aW9uPWl0ZW0yICkKKyAgICAgICAgICAgIHZtX2FjdGlvbl9pbWFnZV9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoInZtLWNyZWF0ZUltYWdlIiwgaGVscD0iY3JlYXRlcyBhIHNuYXBzaG90IG9mIHRoZSB2aXJ0dWFsIG1hY2hpbmUgZGlzayBpbnRvIGEgbmV3IGltYWdlIikKKyAgICAgICAgICAgIHZtX2FjdGlvbl9pbWFnZV9wYXJzZXIuYWRkX2FyZ3VtZW50KCJuYW1lIiwgaGVscD0ibmFtZSBvciBJRCBvZiB0aGUgc2VydmVyIikKKyAgICAgICAgICAgIHZtX2FjdGlvbl9pbWFnZV9wYXJzZXIuYWRkX2FyZ3VtZW50KCJpbWFnZU5hbWUiLCBoZWxwPSJpbWFnZSBuYW1lIikKKyAgICAgICAgICAgIHZtX2FjdGlvbl9pbWFnZV9wYXJzZXIuYWRkX2FyZ3VtZW50KCItLWRlc2NyaXB0aW9uIiwgYWN0aW9uPSJzdG9yZSIsIGhlbHA9IlByb3ZpZGUgYSBuZXcgaW1hZ2UgZGVzY3JpcHRpb24iKQorICAgICAgICAgICAgdm1fYWN0aW9uX2ltYWdlX3BhcnNlci5hZGRfYXJndW1lbnQoIi0tcGF0aCIsIGFjdGlvbj0ic3RvcmUiLCBoZWxwPSJQcm92aWRlIGEgbmV3IGltYWdlIGNvbXBsZXRlIHBhdGgiKQorICAgICAgICAgICAgdm1fYWN0aW9uX2ltYWdlX3BhcnNlci5hZGRfYXJndW1lbnQoIi1GIiwiLS1maWx0ZXIiLCBhY3Rpb249InN0b3JlIiwgaGVscD0iZmlsdGVyIHF1ZXJ5IHN0cmluZyIpCisgICAgICAgICAgICB2bV9hY3Rpb25faW1hZ2VfcGFyc2VyLmFkZF9hcmd1bWVudCgiLWYiLCItLWZvcmNlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgaGVscD0iZG8gbm90IHByb21wdCBmb3IgY29uZmlybWF0aW9uIikKKyAgICAgICAgICAgIHZtX2FjdGlvbl9pbWFnZV9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLCAnLXYnLCBhY3Rpb249J2NvdW50JywgaGVscD0iaW5jcmVtZW50IHRoZSB2ZXJib3NpdHkiKQorICAgICAgICAgICAgdm1fYWN0aW9uX2ltYWdlX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1lbGVtZW50X2FjdGlvbiwgZWxlbWVudD0ic2VydmVycyIsIGFjdGlvbj0iY3JlYXRlSW1hZ2UiICkKKyAgICAgICAgI0FDVElPTiB0aGF0IGFyZSBpbXBsZW1lbnRlZCB3aXRoIEVESVRJT04KKyAgICAgICAgaWYgaXRlbT09J3BvcnQnOgorICAgICAgICAgICAgcG9ydF9hY3Rpb25fYXR0YWNoX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcigicG9ydC1hdHRhY2giLCBoZWxwPSJjb25uZWN0cyBhIHBvcnQgdG8gYSBuZXR3b3JrIikKKyAgICAgICAgICAgIHBvcnRfYWN0aW9uX2F0dGFjaF9wYXJzZXIuYWRkX2FyZ3VtZW50KCJuYW1lIiwgaGVscD0ibmFtZSBvciBJRCBvZiB0aGUgcG9ydCIpCisgICAgICAgICAgICBwb3J0X2FjdGlvbl9hdHRhY2hfcGFyc2VyLmFkZF9hcmd1bWVudCgibmV0d29ya19pZCIsIGhlbHA9IklEIG9mIHRoZSBuZXR3b3JrIikKKyAgICAgICAgICAgIHBvcnRfYWN0aW9uX2F0dGFjaF9wYXJzZXIuYWRkX2FyZ3VtZW50KCItRiIsIi0tZmlsdGVyIiwgYWN0aW9uPSJzdG9yZSIsIGhlbHA9ImZpbHRlciBxdWVyeSBzdHJpbmciKQorICAgICAgICAgICAgcG9ydF9hY3Rpb25fYXR0YWNoX3BhcnNlci5hZGRfYXJndW1lbnQoIi1mIiwiLS1mb3JjZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9ImRvIG5vdCBwcm9tcHQgZm9yIGNvbmZpcm1hdGlvbiIpCisgICAgICAgICAgICBwb3J0X2FjdGlvbl9hdHRhY2hfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWVsZW1lbnRfYWN0aW9uX2VkaXQsIGVsZW1lbnQ9InBvcnRzIiwgYWN0aW9uPSJhdHRhY2giKQorCisgICAgICAgICAgICBwb3J0X2FjdGlvbl9kZXRhY2hfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCJwb3J0LWRldGFjaCIsIGhlbHA9InJlbW92ZXMgYSBwb3J0IGZyb20gYSBuZXR3b3JrIikKKyAgICAgICAgICAgIHBvcnRfYWN0aW9uX2RldGFjaF9wYXJzZXIuYWRkX2FyZ3VtZW50KCJuYW1lIiwgaGVscD0ibmFtZSBvciBJRCBvZiB0aGUgcG9ydCIpCisgICAgICAgICAgICBwb3J0X2FjdGlvbl9kZXRhY2hfcGFyc2VyLmFkZF9hcmd1bWVudCgiLUYiLCItLWZpbHRlciIsIGFjdGlvbj0ic3RvcmUiLCBoZWxwPSJmaWx0ZXIgcXVlcnkgc3RyaW5nIikKKyAgICAgICAgICAgIHBvcnRfYWN0aW9uX2RldGFjaF9wYXJzZXIuYWRkX2FyZ3VtZW50KCItZiIsIi0tZm9yY2UiLCBhY3Rpb249InN0b3JlX3RydWUiLCBoZWxwPSJkbyBub3QgcHJvbXB0IGZvciBjb25maXJtYXRpb24iKQorICAgICAgICAgICAgcG9ydF9hY3Rpb25fZGV0YWNoX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1lbGVtZW50X2FjdGlvbl9lZGl0LCBlbGVtZW50PSJwb3J0cyIsIGFjdGlvbj0iZGV0dGFjaCIpCisKKyAgICAgICAgaWYgaXRlbT09J25ldCcgb3IgaXRlbT09J2hvc3QnOgorICAgICAgICAgICAgbmV0aG9zdF9hY3Rpb25fdXBfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKGl0ZW0rIi11cCIsIGhlbHA9InB1dHMgYWRtaW5fc3RhdGVfdXAgb2YgIitpdGVtX2RpY3RbaXRlbV1bOi0xXSsiIHRvIHRydWUiKQorICAgICAgICAgICAgbmV0aG9zdF9hY3Rpb25fdXBfcGFyc2VyLmFkZF9hcmd1bWVudCgibmFtZSIsIGhlbHA9Im5hbWUgb3IgSUQgb2YgdGhlICIraXRlbV9kaWN0W2l0ZW1dWzotMV0pCisgICAgICAgICAgICBuZXRob3N0X2FjdGlvbl91cF9wYXJzZXIuYWRkX2FyZ3VtZW50KCItRiIsIi0tZmlsdGVyIiwgYWN0aW9uPSJzdG9yZSIsIGhlbHA9ImZpbHRlciBxdWVyeSBzdHJpbmciKQorICAgICAgICAgICAgbmV0aG9zdF9hY3Rpb25fdXBfcGFyc2VyLmFkZF9hcmd1bWVudCgiLWYiLCItLWZvcmNlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgaGVscD0iZG8gbm90IHByb21wdCBmb3IgY29uZmlybWF0aW9uIikKKyAgICAgICAgICAgIG5ldGhvc3RfYWN0aW9uX3VwX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1lbGVtZW50X2FjdGlvbl9lZGl0LCBlbGVtZW50PWl0ZW1fZGljdFtpdGVtXSwgYWN0aW9uPSJ1cCIpCisgICAgICAgIAorICAgICAgICAgICAgbmV0aG9zdF9hY3Rpb25fZG93bl9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoaXRlbSsiLWRvd24iLCBoZWxwPSJwdXRzIGFkbWluX3N0YXRlX3VwIG9mICIraXRlbV9kaWN0W2l0ZW1dWzotMV0rIiB0byBmYWxzZSIpCisgICAgICAgICAgICBuZXRob3N0X2FjdGlvbl9kb3duX3BhcnNlci5hZGRfYXJndW1lbnQoIm5hbWUiLCBoZWxwPSJuYW1lIG9yIElEIG9mIHRoZSAiK2l0ZW1fZGljdFtpdGVtXVs6LTFdKQorICAgICAgICAgICAgbmV0aG9zdF9hY3Rpb25fZG93bl9wYXJzZXIuYWRkX2FyZ3VtZW50KCItRiIsIi0tZmlsdGVyIiwgYWN0aW9uPSJzdG9yZSIsIGhlbHA9ImZpbHRlciBxdWVyeSBzdHJpbmciKQorICAgICAgICAgICAgbmV0aG9zdF9hY3Rpb25fZG93bl9wYXJzZXIuYWRkX2FyZ3VtZW50KCItZiIsIi0tZm9yY2UiLCBhY3Rpb249InN0b3JlX3RydWUiLCBoZWxwPSJkbyBub3QgcHJvbXB0IGZvciBjb25maXJtYXRpb24iKQorICAgICAgICAgICAgbmV0aG9zdF9hY3Rpb25fZG93bl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9ZWxlbWVudF9hY3Rpb25fZWRpdCwgZWxlbWVudD1pdGVtX2RpY3RbaXRlbV0sIGFjdGlvbj0iZG93biIpCisKKyAgICAjb3BlbmZsb3cgcnVsZXMKKyAgICBvcGVuZmxvd19saXN0X2FjdGlvbiA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcigib3BlbmZsb3ctcG9ydC1saXN0IiwgaGVscD0ibGlzdCBvcGVuZmxvdyBzd2l0Y2ggcG9ydHMgbmFtZSIpCisgICAgb3BlbmZsb3dfbGlzdF9hY3Rpb24uc2V0X2RlZmF1bHRzKGZ1bmM9b3BlbmZsb3dfYWN0aW9uLCBhY3Rpb249InBvcnQtbGlzdCIpCisgICAgCisgICAgb3BlbmZsb3dfbGlzdF9hY3Rpb24gPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoIm9wZW5mbG93LWNsZWFyLWFsbCIsIGhlbHA9InJlbW92ZXMgYWxsIG9wZW5mbG93IHJ1bGVzIikKKyAgICBvcGVuZmxvd19saXN0X2FjdGlvbi5zZXRfZGVmYXVsdHMoZnVuYz1vcGVuZmxvd19hY3Rpb24sIGFjdGlvbj0iY2xlYXItYWxsIikKKworICAgIG9wZW5mbG93X2xpc3RfYWN0aW9uID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCJvcGVuZmxvdy1uZXQtcmVpbnN0YWxsIiwgaGVscD0icmVpbnN0YWxsIHRoZSBvcGVuZmxvdyBydWxlcyBmb3IgYSBuZXR3b3JrIikKKyAgICBvcGVuZmxvd19saXN0X2FjdGlvbi5hZGRfYXJndW1lbnQoIm5hbWUiLCBuYXJncz0nPycsIGhlbHA9Im5ldHdvcmsgbmFtZSwgaWYgbWlzc2luZyBhbGwgbmV0d29ya3MiKQorICAgIG9wZW5mbG93X2xpc3RfYWN0aW9uLnNldF9kZWZhdWx0cyhmdW5jPW9wZW5mbG93X2FjdGlvbiwgYWN0aW9uPSJyZWluc3RhbGwiKQorICAgIAorICAgIG9wZW5mbG93X2xpc3RfYWN0aW9uID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCJvcGVuZmxvdy1uZXQtbGlzdCIsIGhlbHA9Imxpc3QgaW5zdGFsbGVkIG9wZW5mbG93IHJ1bGVzIGZvciBhIG5ldHdvcmsiKQorICAgIG9wZW5mbG93X2xpc3RfYWN0aW9uLmFkZF9hcmd1bWVudCgibmFtZSIsIG5hcmdzPSc/JywgaGVscD0ibmV0d29yayBuYW1lLCBpZiBtaXNzaW5nIGFsbCBuZXR3b3JrcyIpCisgICAgb3BlbmZsb3dfbGlzdF9hY3Rpb24uc2V0X2RlZmF1bHRzKGZ1bmM9b3BlbmZsb3dfYWN0aW9uLCBhY3Rpb249InJ1bGVzLWxpc3QiKQorCisgICAgYXJnY29tcGxldGUuYXV0b2NvbXBsZXRlKG1haW5fcGFyc2VyKQorICAgIAorICAgIHRyeToKKyAgICAgICAgYXJncyA9IG1haW5fcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgICAgICByZXN1bHQgPSBhcmdzLmZ1bmMoYXJncykKKyAgICAgICAgaWYgcmVzdWx0ID09IE5vbmU6CisgICAgICAgICAgICByZXN1bHQgPSAwCisgICAgICAgICNmb3Igc29tZSByZWFzb24gaXQgZmFpbHMgaWYgY2FsbCBleGl0IGluc2lkZSB0cnkgaW5zdGFuY2UuIE5lZWQgdG8gY2FsbCBleGl0IGF0IHRoZSBlbmQgIT8KKyAgICBleGNlcHQgKHJlcXVlc3RzLmV4Y2VwdGlvbnMuQ29ubmVjdGlvbkVycm9yKToKKyAgICAgICAgcHJpbnQgIkNvbm5lY3Rpb24gZXJyb3I6IG5vdCBwb3NzaWJsZSB0byBjb250YWN0IE9QRU5WSU0tU0VSVkVSIChvcGVudmltZCkiCisgICAgICAgIHJlc3VsdCA9IC0yCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCk6CisgICAgICAgIHByaW50ICdFeGl0aW5nIG9wZW5WSU0nCisgICAgICAgIHJlc3VsdCA9IC0zCisgICAgZXhjZXB0IChTeXN0ZW1FeGl0LCBBcmd1bWVudFBhcnNlckVycm9yKToKKyAgICAgICAgcmVzdWx0ID0gLTQKKyAgICAKKyAgICAjcHJpbnQgcmVzdWx0CisgICAgZXhpdChyZXN1bHQpCisKZGlmZiAtLWdpdCBhL29wZW52aW1kLmNmZyBiL29wZW52aW1kLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJhNWUzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbnZpbWQuY2ZnCkBAIC0wLDAgKzEsMTI3IEBACisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisKKworI01pc2NlbGxhbmVvdXMKKyNPcHRpb24gdG8gdGVzdCBvcGVudmltIHdpdGhvdXQgdGhlIG5lZWRlZCBpbmZyYXN0cnVjdHVyZSwgcG9zc2libGUgdmFsdWVzIGFyZQorIyAgICAibm9ybWFsIiAgICAgIGJ5IGRlZmF1bHQsIE9wZW5mbG93IGNvbnRyb2xsZXIgKE9GQyksIHN3aXRjaCBhbmQgcmVhbCBob3N0IGFyZSBuZWVkZWQKKyMgICAgInRlc3QiICAgICAgICBVc2VkIGZvciB0ZXN0aW5nIGh0dHAgQVBJIGFuZCBkYXRhYmFzZSB3aXRob3V0IGNvbm5lY3RpbmcgdG8gaG9zdCBvciB0byBPRkMKKyMgICAgImhvc3Qgb25seSIgICBVc2VkIHdoZW4gbmVpdGhlciBPRkMgbm9yIE9GIHN3aXRjaCBhcmUgcHJvdmlkZWQuIAorIyAgICAgICAgICAgICAgICAgIERhdGFwbGFuZSBuZXR3b3JrIGNvbm5lY3Rpb24gbXVzdCBiZSBkb25lIG1hbnVhbGx5LgorIyAgICAiT0Ygb25seSIgICAgIFVzZWQgZm9yIHRlc3Rpbmcgb2YgbmV3IG9wZW5mbG93IGNvbnRyb2xsZXJzIHN1cHBvcnQuIE5vIHJlYWwgVk0gZGVwbG95bWVudHMgd2lsbCBiZSBkb25lIGJ1dAorIyAgICAgICAgICAgICAgICAgIE9GQyB3aWxsIGJlIHVzZWQgYXMgaW4gcmVhbCBtb2RlCisjICAgICJkZXZlbG9wbWVudCIgRm9yY2VkIGEgY2xvdWQtdHlwZSBkZXBsb3ltZW50LCBub21hbCBtZW1vcnkgaW5zdGVhZCBvZiBodWdlcGFnZXMgaXMgdXNlZCwgCisjICAgICAgICAgICAgICAgICAgd2l0aG91dCBjcHUgcGlubmluZywgYW5kIHVzaW5nIGEgYnJpZGdlIG5ldHdvcmsgaW5zdGVhZCBvZiBhIHJlYWwgT0ZDIGRhdGFwbGFuZSBuZXR3b3Jrcy4KKyMgICAgICAgICAgICAgICAgICBUaGUgc2FtZSAnZGV2ZWxvcG1lbnRfYnJpZGdlJyAoc2VlIGJlbG93KSBpcyB1c2VkIGZvciBhbGwgZGF0YXBsYW5lIG5ldHdvcmtzCittb2RlOiB0ZXN0CisKKyNPcGVuZmxvdyBjb250cm9sbGVyIGluZm9ybWF0aW9uCitvZl9jb250cm9sbGVyOiAgICAgIGZsb29kbGlnaHQgICAgICAgICAgICAgICAgICAgIyBUeXBlIG9mIGNvbnRyb2xsZXIgdG8gYmUgdXNlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBWYWxpZCBjb250cm9sbGVycyBhcmUgJ29wZW5kYXlsaWdodCcsICdmbG9vZGxpZ2h0JyBvciA8Y3VzdG9tPgorI29mX2NvbnRyb2xsZXJfbW9kdWxlOiBtb2R1bGUgICAgICAgICAgICAgICAgICAgICMgT25seSBuZWVkZWQgZm9yIDxjdXN0b20+LiAgUHl0aG9uIG1vZHVsZSB0aGF0IGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhpcyBjb250cm9sbGVyLiBCeSBkZWZhdWx0IGEgZmlsZSB3aXRoIHRoZSBuYW1lICA8Y3VzdG9tPi5weSBpcyB1c2VkIAorI29mXzxvdGhlcj46ICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICMgT3RoZXIgcGFyYW1ldGVycyByZXF1aXJlZCBieSA8Y3VzdG9tPiBjb250cm9sbGVyLiBDb25zdW1lZCBieSBfX2luaXRfXworb2ZfdXNlcjogICAgICAgICAgICB1c2VyIGNyZWRlbnRpYWxzICAgICAgICAgICAgICMgVXNlciBjcmVkZW50aWFscyBmb3IgdGhlIGNvbnRyb2xsZXIgaWYgbmVlZGVkCitvZl9wYXNzd29yZDogICAgICAgIHBhc3N3ZCBjcmVkZW50aWFscyAgICAgICAgICAgIyBQYXNzd29yZCBjcmVkZW50aWFscyBmb3IgdGhlIGNvbnRyb2xsZXIgaWYgbmVlZGVkCitvZl9jb250cm9sbGVyX2lwOiAgIDEyNy4wLjAuMSAgICAgICAgICAgICAgICAgICAgIyBJUCBhZGRyZXNzIHdoZXJlIHRoZSBPcGVuZmxvdyBjb250cm9sbGVyIGlzIGxpc3RlbmluZworb2ZfY29udHJvbGxlcl9wb3J0OiA3MDcwICAgICAgICAgICAgICAgICAgICAgICAgICMgVENQIHBvcnQgd2hlcmUgdGhlIE9wZW5mbG93IGNvbnRyb2xsZXIgaXMgbGlzdGVuaW5nIChSRVNUIEFQSSBzZXJ2ZXIpCitvZl9jb250cm9sbGVyX2RwaWQ6ICcwMDowMTowMjowMzowNDowNTowNjowNycgICAgIyBPcGVuZmxvdyBTd2l0Y2ggaWRlbnRpZmllciAocHV0IGhlcmUgdGhlIHJpZ2h0IG51bWJlcikKKworI1RoaXMgb3B0aW9uIGlzIHVzZWQgZm9yIHRob3NlIG9wZW5mbG93IHN3aXRjaCB0aGF0IGNhbm5vdCBkZWxpdmVyIG9uZSBwYWNrZXQgdG8gc2V2ZXJhbCBvdXRwdXQgd2l0aCBkaWZmZXJlbnQgdmxhbiB0YWdzCisjV2hlbiBzZXQgdG8gdHJ1ZSwgaXQgZmFpbHMgd2hlbiB0cnlpbmcgdG8gYXR0YWNoIGRpZmZlcmVudCB2bGFuIHRhZ2dlZCBwb3J0cyB0byB0aGUgc2FtZSBuZXQKK29mX2NvbnRyb2xsZXJfbmV0c193aXRoX3NhbWVfdmxhbjogZmFsc2UgICAgICAgICAjIChieSBkZWZhdWx0LCB0cnVlKQorCisjU2VydmVyIHBhcmFtZXRlcnMKK2h0dHBfaG9zdDogICAgICAgbG9jYWxob3N0ICAgICAgICAgICAjIElQIGFkZHJlc3Mgd2hlcmUgb3BlbnZpbSBpcyBsaXN0ZW5pbmcgKGJ5IGRlZmF1bHQsIGxvY2FsaG9zdCkKK2h0dHBfcG9ydDogICAgICAgOTA4MCAgICAgICAgICAgICAgICAjIEdlbmVyYWwgcG9ydCB3aGVyZSBvcGVudmltIGlzIGxpc3RlbmluZyAoYnkgZGVmYXVsdCwgOTA4MCkKK2h0dHBfYWRtaW5fcG9ydDogOTA4NSAgICAgICAgICAgICAgICAjIEFkbWluIHBvcnQgd2hlcmUgb3BlbnZpbSBpcyBsaXN0ZW5pbmcgKHdoZW4gbWlzc2luZywgbm8gYWRtaW5pc3RyYXRpb24gc2VydmVyIGlzIGxhdW5jaGVkKQorCisjZGF0YWJhc2UgcGFyYW1ldGVycworZGJfaG9zdDogICBsb2NhbGhvc3QgICAgICAgICAgICAgICAgICMgYnkgZGVmYXVsdCBsb2NhbGhvc3QKK2RiX3VzZXI6ICAgdmltICAgICAgICAgICAgICAgICAgICAgICAjIERCIHVzZXIKK2RiX3Bhc3N3ZDogdmltcHcgICAgICAgICAgICAgICAgICAgICAjIERCIHBhc3N3b3JkCitkYl9uYW1lOiAgIHZpbV9kYiAgICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBWSU0gREIKKworI2hvc3QgcGFyZW1ldGVycworaW1hZ2VfcGF0aDogIi9vcHQvVk5GL2ltYWdlcyIgICAgICAgICMgRm9sZGVyLCBzYW1lIGZvciBldmVyeSBob3N0LCB3aGVyZSB0aGUgVk5GIGltYWdlcyB3aWxsIGJlIGNvcGllZAorCisjdGVzdGluZyBwYXJhbWV0ZXJzICh1c2VkIGJ5IC4vdGVzdC90ZXN0X29wZW52aW0ucHkpCit0ZW5hbnRfaWQ6IGZjN2I0M2I2LTZiZmEtMTFlNC04NGQyLTUyNTQwMDZkNjc3NyAgICMgRGVmYXVsdCB0ZW5hbnQgaWRlbnRpZmllciBmb3IgdGVzdGluZworCisjVkxBTiByYW5nZXMgdXNlZCBmb3IgdGhlIGRhdGFwbGFuZSBuZXR3b3JrcyAocHRwLCBkYXRhKQorI1doZW4gYSBuZXR3b3JrIGlzIGNyZWF0ZWQgYW4gdW51c2VkIHZhbHVlIGluIHRoaXMgcmFuZ2UgaXMgdXNlZAorbmV0d29ya192bGFuX3JhbmdlX3N0YXJ0OiAzMDAwCituZXR3b3JrX3ZsYW5fcmFuZ2VfZW5kOiAgIDQwMDAKKworI2hvc3QgYnJpZGdlIGludGVyZmFjZXMgZm9yIG5ldHdvcmtzCisjIE9wZW52aW0gY2Fubm90IGNyZWF0ZSBicmlkZ2UgbmV0d29ya3MgYXV0b21hdGljYWxseSwgaW4gdGhlIHNhbWUgd2F5IGFzIG90aGVyIENNUyBkby4KKyMgQnJpZGdlIG5ldHdvcmtzIG5lZWQgdG8gYmUgcHJlLXByb3Zpc2lvbmVkIG9uIGVhY2ggaG9zdCBhbmQgT3BlbnZpbSB1c2VzIHRob3NlIHByZS1wcm92aXNpb25lZCBicmlkZ2UgbmV0d29ya3MuCisjIE9wZW52aW0gYXNzdW1lcyB0aGF0IHRoZSBmb2xsb3dpbmcgYnJpZGdlIGludGVyZmFjZXMgaGF2ZSBiZWVuIGNyZWF0ZWQgb24gZWFjaCBob3N0LCBhcHByb3ByaWF0ZWx5IGFzc29jaWF0ZWQgdG8gYSBwaHlzaWNhbCBwb3J0LgorIyBUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb3ZpZGVkOgorIyAgICAtIE5hbWUgb2YgdGhlIGJyaWRnZSAoaWRlbnRpY2FsIGluIGFsbCBob3N0cykKKyMgICAgLSBWTEFOIHRhZyBhc3NvY2lhdGVkIHRvIGVhY2ggYnJpZGdlIGludGVyZmFjZQorIyAgICAtIFRoZSBzcGVlZCBvZiB0aGUgcGh5c2ljYWwgcG9ydCBpbiBHYnBzLCB3aGVyZSB0aGF0IGJyaWRnZSBpbnRlcmZhY2Ugd2FzIGNyZWF0ZWQKKyMgRm9yIGluc3RhbmNlLCBuZXh0IGV4YW1wbGUgYXNzdW1lcyB0aGF0IDEwIGJyaWRnZXMgaGF2ZSBiZWVuIGNyZWF0ZWQgb24gZWFjaCBob3N0CisjIHVzaW5nIHZsYW5zIDIwMDEgdG8gMjAxMCwgYXNzb2NpYXRlZCB0byBhIDFHYnBzIHBoeXNpY2FsIHBvcnQgCiticmlkZ2VfaWZhY2VzOgorICAgI25hbWU6ICAgICAgW3ZsYW4sIHNwZWVkIGluIEdicHNdCisgICB2aXJick1hbjE6ICBbMjAwMSwgMV0KKyAgIHZpcmJyTWFuMjogIFsyMDAyLCAxXQorICAgdmlyYnJNYW4zOiAgWzIwMDMsIDFdCisgICB2aXJick1hbjQ6ICBbMjAwNCwgMV0KKyAgIHZpcmJyTWFuNTogIFsyMDA1LCAxXQorICAgdmlyYnJNYW42OiAgWzIwMDYsIDFdCisgICB2aXJick1hbjc6ICBbMjAwNywgMV0KKyAgIHZpcmJyTWFuODogIFsyMDA4LCAxXQorICAgdmlyYnJNYW45OiAgWzIwMDksIDFdCisgICB2aXJick1hbjEwOiBbMjAxMCwgMV0KKworI1VzZWQgb25seSB3aGVuICdtb2RlJyBpcyBhdCBkZXZlbG9wbWVudCcuIEluZGljYXRlcyB3aGljaCAnYnJpZGdlX2lmYWNlcycgaXMgdXNlZCBmb3IgZGF0YXBsYW5lIG5ldHdvcmtzCitkZXZlbG9wbWVudF9icmlkZ2U6IHZpcmJyTWFuMTAKKworI0RIQ1AgU0VSVkVSIFBBUkFNRVRFUlMuIAorI0luIGNhc2Ugc29tZSBvZiB0aGUgcHJldmlvdXMgJ2JyaWRnZV9pZmFjZXMnIGFyZSBjb25uZWN0ZWQgdG8gYW4gRVhURVJOQUwgZGhjcCBzZXJ2ZXIsIHByb3ZpZGUgCisjICAgdGhlIHNlcnZlciBwYXJhbWV0ZXJzIHRvIGFsbG93IG9wZW52aW0gZ2V0dGluZyB0aGUgYWxsb2NhdGVkIElQIGFkZHJlc3NlcyBvZiB2aXJ0dWFsIG1hY2hpbmVzCisjICAgY29ubmVjdGVkIHRvIHRoZSBpbmRpY2F0ZWQgJ2JyaWRnZV9pZmFjZXMnIGFuZCBvciAnbmV0cycuIE9wZW52aW0gd2lsbCBjb25uZWN0IHRvIHRoZSBkaGNwIHNlcnZlciBieSBzc2guCisjREhDUCBzZXJ2ZXIgbXVzdCBjb250YWluIGEgc2hlbGwgc2NyaXB0ICIuL2dldF9kaGNwX2xlYXNlLnNoIiB0aGF0IGFjY2VwdCBhIG1hYyBhZGRyZXNzIGFzIHBhcmFtZXRlciAKKyMgICBhbmQgcmV0dXJuIGVtcHR5IG9yIHRoZSBhbGxvY2F0ZWQgSVAgYWRkcmVzcy4gU2VlIGFuIGV4YW1wbGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAuL29wZW52aW0vZGhjcF90aHJlYWQucHkgCisjQ09NTUVOVCBhbGwgbGluZXMgaW4gY2FzZSB5b3UgZG8gbm90IGhhdmUgYSBESENQIHNlcnZlciBpbiAnbm9ybWFsJywgJ2RldmVsb3BtZW50JyAgb3IgJ2hvc3Qgb25seScgbW9kZXMuCisjICAgRm9yICd0ZXN0JyBvciAnT0Ygb25seScgbW9kZXMgeW91IGNhbiBsZWF2ZSB0aGVuIHVuY29tbWVudGVkLCBiZWNhdXNlIGluIHRoZXNlIG1vZGVzIGZha2UgSVAgCisjICAgYWRkcmVzcyBhcmUgZ2VuZXJhdGVkIGluc3RlYWQgb2YgY29ubmVjdGluZyB3aXRoIGEgcmVhbCBESENQIHNlcnZlci4KK2RoY3Bfc2VydmVyOgorICAgaG9zdDogICAgIGhvc3QtaXAtb3ItbmFtZSAgCisgICAjcG9ydDogICAgIDIyICAgICAgICAgICAgICAgI3NzaCBwb3J0LCBieSBkZWZhdWx0IDIyCisgICBwcm92aWRlcjogaXNjLWRoY3Atc2VydmVyICAjZGhjcC1zZXJ2ZXIgdHlwZQorICAgdXNlcjogICAgIHVzZXIKKyAgICNwcm92aWRlIHBhc3N3b3JkLCBvciBrZXkgaWYgbmVlZGVkCisgICBwYXNzd29yZDogcGFzc3dkICAgICAgICAgICAKKyAgICNrZXk6ICAgICBzc2gtYWNjZXNzLWtleQorICAgI2xpc3Qgb2YgdGhlIHByZXZpb3VzIGJyaWRnZSBpbnRlcmZhY2VzIGF0dGFjaGVkIHRvIHRoaXMgZGhjcCBzZXJ2ZXIKKyAgIGJyaWRnZV9pZmFjZXM6ICAgWyB2aXJick1hbjEsIHZpcmJyTWFuMiBdIAorICAgI2xpc3Qgb2YgdGhlIG5ldHdvcmtzIGF0dGFjaGVkIHRvIHRoaXMgZGhjcCBzZXJ2ZXIKKyAgIG5ldHM6IFtkZWZhdWx0XQorCisKKyNsb2dnaW5nIHBhcmFtZXRlcnMgICAgICAgIyBERUJVRywgSU5GTywgV0FSTklORywgRVJST1IsIENSSVRJQ0FMCitsb2dfbGV2ZWw6ICAgICAgIEVSUk9SCitsb2dfbGV2ZWxfZGI6ICAgIERFQlVHCitsb2dfbGV2ZWxfb2Y6ICAgIERFQlVHCmRpZmYgLS1naXQgYS9vcGVudmltZC5weSBiL29wZW52aW1kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIyMGM5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVudmltZC5weQpAQCAtMCwwICsxLDM1NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisnJycKK1RoaXMgaXMgdGhlIG1haW4gcHJvZ3JhbSBvZiBvcGVudmltLCBpdCByZWFkcyB0aGUgY29uZmlndXJhdGlvbiAKK2FuZCBsYXVuY2hlcyB0aGUgcmVzdCBvZiB0aHJlYWRzOiBodHRwIGNsaWVudHMsIG9wZW5mbG93IGNvbnRyb2xsZXIKK2FuZCBob3N0IGNvbnRyb2xsZXJzICAKKycnJworCitfX2F1dGhvcl9fPSJBbGZvbnNvIFRpZXJubyIKK19fZGF0ZV9fID0iJDEwLWp1bC0yMDE0IDEyOjA3OjE1JCIKK19fdmVyc2lvbl9fPSIwLjQuNi1yNDY2IgordmVyc2lvbl9kYXRlPSJKdWwgMjAxNiIKK2RhdGFiYXNlX3ZlcnNpb249IjAuNyIgICAgICAjZXhwZWN0ZWQgZGF0YWJhc2Ugc2NoZW1hIHZlcnNpb24KKworaW1wb3J0IGh0dHBzZXJ2ZXIKK2Zyb20gdXRpbHMgaW1wb3J0IGF1eGlsaWFyeV9mdW5jdGlvbnMgYXMgYWYKK2ltcG9ydCBzeXMKK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCB0aW1lCitpbXBvcnQgdmltX2RiCitpbXBvcnQgeWFtbAoraW1wb3J0IG9zCitmcm9tIGpzb25zY2hlbWEgaW1wb3J0IHZhbGlkYXRlIGFzIGpzX3YsIGV4Y2VwdGlvbnMgYXMganNfZQoraW1wb3J0IGhvc3RfdGhyZWFkIGFzIGh0CitpbXBvcnQgZGhjcF90aHJlYWQgYXMgZHQKK2ltcG9ydCBvcGVuZmxvd190aHJlYWQgYXMgb2Z0CitpbXBvcnQgdGhyZWFkaW5nCitmcm9tIHZpbV9zY2hlbWEgaW1wb3J0IGNvbmZpZ19zY2hlbWEKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgaW1wCisKK2dsb2JhbCBjb25maWdfZGljCitnbG9iYWwgbG9nZ2VyCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigndmltJykKKworZGVmIGxvYWRfY29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uX2ZpbGUpOgorICAgIGRlZmF1bHRfdG9rZW5zID17J2h0dHBfcG9ydCc6OTA4MCwgJ2h0dHBfaG9zdCc6J2xvY2FsaG9zdCcsIAorICAgICAgICAgICAgICAgICAgICAgJ29mX2NvbnRyb2xsZXJfbmV0c193aXRoX3NhbWVfdmxhbic6VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICdpbWFnZV9wYXRoJzonL29wdC9WTkYvaW1hZ2VzJywKKyAgICAgICAgICAgICAgICAgICAgICduZXR3b3JrX3ZsYW5fcmFuZ2Vfc3RhcnQnOjEwMDAsCisgICAgICAgICAgICAgICAgICAgICAnbmV0d29ya192bGFuX3JhbmdlX2VuZCc6IDQwOTYsCisgICAgICAgICAgICAgICAgICAgICAnbG9nX2xldmVsJzogIkRFQlVHIiwKKyAgICAgICAgICAgICAgICAgICAgICdsb2dfbGV2ZWxfZGInOiAiRVJST1IiLAorICAgICAgICAgICAgICAgICAgICAgJ2xvZ19sZXZlbF9vZic6ICdFUlJPUicsCisgICAgICAgICAgICB9CisgICAgdHJ5OgorICAgICAgICAjRmlyc3QgbG9hZCBjb25maWd1cmF0aW9uIGZyb20gY29uZmlndXJhdGlvbiBmaWxlCisgICAgICAgICNDaGVjayBjb25maWcgZmlsZSBleGlzdHMKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGNvbmZpZ3VyYXRpb25fZmlsZSk6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAiQ29uZmlndXJhdGlvbiBmaWxlICciK2NvbmZpZ3VyYXRpb25fZmlsZSsiJyBkb2VzIG5vdCBleGlzdHMiKQorICAgICAgICAgICAgCisgICAgICAgICNSZWFkIGFuZCBwYXJzZSBmaWxlCisgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IGFmLnJlYWRfZmlsZShjb25maWd1cmF0aW9uX2ZpbGUpCisgICAgICAgIGlmIG5vdCByZXR1cm5fc3RhdHVzOgorICAgICAgICAgICAgcmV0dXJuIChyZXR1cm5fc3RhdHVzLCAiRXJyb3IgbG9hZGluZyBjb25maWd1cmF0aW9uIGZpbGUgJyIrY29uZmlndXJhdGlvbl9maWxlKyInOiAiK2NvZGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbmZpZyA9IHlhbWwubG9hZChjb2RlKQorICAgICAgICBleGNlcHQgeWFtbC5ZQU1MRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIGVycm9yX3BvcyA9ICIiCisgICAgICAgICAgICBpZiBoYXNhdHRyKGV4YywgJ3Byb2JsZW1fbWFyaycpOgorICAgICAgICAgICAgICAgIG1hcmsgPSBleGMucHJvYmxlbV9tYXJrCisgICAgICAgICAgICAgICAgZXJyb3JfcG9zID0gIiBhdCBwb3NpdGlvbjogKCVzOiVzKSIgJSAobWFyay5saW5lKzEsIG1hcmsuY29sdW1uKzEpCisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAiRXJyb3IgbG9hZGluZyBjb25maWd1cmF0aW9uIGZpbGUgJyIrY29uZmlndXJhdGlvbl9maWxlKyInIitlcnJvcl9wb3MrIjogY29udGVudCBmb3JtYXQgZXJyb3I6IEZhaWxlZCB0byBwYXJzZSB5YW1sIGZvcm1hdCIpCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAganNfdihjb25maWcsIGNvbmZpZ19zY2hlbWEpCisgICAgICAgIGV4Y2VwdCBqc19lLlZhbGlkYXRpb25FcnJvciwgZXhjOgorICAgICAgICAgICAgZXJyb3JfcG9zID0gIiIKKyAgICAgICAgICAgIGlmIGxlbihleGMucGF0aCk+MDogZXJyb3JfcG9zPSIgYXQgJyIgKyAiOiIuam9pbihtYXAoc3RyLCBleGMucGF0aCkpKyInIgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlLCAiRXJyb3IgbG9hZGluZyBjb25maWd1cmF0aW9uIGZpbGUgJyIrY29uZmlndXJhdGlvbl9maWxlKyInIitlcnJvcl9wb3MrIjogIitleGMubWVzc2FnZSAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAjQ2hlY2sgZGVmYXVsdCB2YWx1ZXMgdG9rZW5zCisgICAgICAgIGZvciBrLHYgaW4gZGVmYXVsdF90b2tlbnMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGsgbm90IGluIGNvbmZpZzogY29uZmlnW2tdPXYKKyAgICAgICAgI0NoZWNrIHZsYW4gcmFuZ2VzCisgICAgICAgIGlmIGNvbmZpZ1sibmV0d29ya192bGFuX3JhbmdlX3N0YXJ0Il0rMTAgPj0gY29uZmlnWyJuZXR3b3JrX3ZsYW5fcmFuZ2VfZW5kIl06CisgICAgICAgICAgICByZXR1cm4gRmFsc2UsICJFcnJvciBpbnZhbGlkIG5ldHdvcmtfdmxhbl9yYW5nZSBsZXNzIHRoYW4gMTAgZWxlbWVudHMiCisgICAgCisgICAgZXhjZXB0IEV4Y2VwdGlvbixlOgorICAgICAgICByZXR1cm4gKEZhbHNlLCAiRXJyb3IgbG9hZGluZyBjb25maWd1cmF0aW9uIGZpbGUgJyIrY29uZmlndXJhdGlvbl9maWxlKyInOiAiK3N0cihlKSkKKyAgICByZXR1cm4gKFRydWUsIGNvbmZpZykKKworZGVmIGNyZWF0ZV9kYXRhYmFzZV9jb25uZWN0aW9uKGNvbmZpZ19kaWMpOgorICAgIGRiID0gdmltX2RiLnZpbV9kYiggKGNvbmZpZ19kaWNbIm5ldHdvcmtfdmxhbl9yYW5nZV9zdGFydCJdLGNvbmZpZ19kaWNbIm5ldHdvcmtfdmxhbl9yYW5nZV9lbmQiXSksIGNvbmZpZ19kaWNbJ2xvZ19sZXZlbF9kYiddICk7CisgICAgaWYgZGIuY29ubmVjdChjb25maWdfZGljWydkYl9ob3N0J10sIGNvbmZpZ19kaWNbJ2RiX3VzZXInXSwgY29uZmlnX2RpY1snZGJfcGFzc3dkJ10sIGNvbmZpZ19kaWNbJ2RiX25hbWUnXSkgPT0gLTE6CisgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IGNvbm5lY3QgdG8gZGF0YWJhc2UgJXMgYXQgJXNAJXMiLCBjb25maWdfZGljWydkYl9uYW1lJ10sIGNvbmZpZ19kaWNbJ2RiX3VzZXInXSwgY29uZmlnX2RpY1snZGJfaG9zdCddKQorICAgICAgICBleGl0KC0xKQorICAgIHJldHVybiBkYgorCitkZWYgdXNhZ2UoKToKKyAgICBwcmludCAiVXNhZ2U6ICIsIHN5cy5hcmd2WzBdLCAiW29wdGlvbnNdIgorICAgIHByaW50ICIgICAgICAtdnwtLXZlcnNpb246IHByaW50cyBjdXJyZW50IHZlcnNpb24iCisgICAgcHJpbnQgIiAgICAgIC1jfC0tY29uZmlnIFtjb25maWd1cmF0aW9uX2ZpbGVdOiBsb2FkcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIChkZWZhdWx0OiBvcGVudmltZC5jZmcpIgorICAgIHByaW50ICIgICAgICAtaHwtLWhlbHA6IHNob3dzIHRoaXMgaGVscCIKKyAgICBwcmludCAiICAgICAgLXB8LS1wb3J0IFtwb3J0X251bWJlcl06IGNoYW5nZXMgcG9ydCBudW1iZXIgYW5kIG92ZXJyaWRlcyB0aGUgcG9ydCBudW1iZXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAoZGVmYXVsdDogOTA5MCkiCisgICAgcHJpbnQgIiAgICAgIC1QfC0tYWRtaW5wb3J0IFtwb3J0X251bWJlcl06IGNoYW5nZXMgYWRtaW4gcG9ydCBudW1iZXIgYW5kIG92ZXJyaWRlcyB0aGUgcG9ydCBudW1iZXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAoZGVmYXVsdDogOTA5NSkiCisgICAgcmV0dXJuCisKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgI3N0cmVhbWZvcm1hdCA9ICIlKGxldmVsbmFtZSlzICglKG1vZHVsZSlzOiUobGluZW5vKWQpICUobWVzc2FnZSlzIgorICAgIHN0cmVhbWZvcm1hdCA9ICIlKGFzY3RpbWUpcyAlKG5hbWUpcyAlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIKKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZvcm1hdD1zdHJlYW1mb3JtYXQsIGxldmVsPSBsb2dnaW5nLkRFQlVHKQorICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiaHZjOnA6UDoiLCBbImNvbmZpZyIsICJoZWxwIiwgInZlcnNpb24iLCAicG9ydCIsICJhZG1pbnBvcnQiXSkKKyAgICBleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yLCBlcnI6CisgICAgICAgICMgcHJpbnQgaGVscCBpbmZvcm1hdGlvbiBhbmQgZXhpdDoKKyAgICAgICAgbG9nZ2VyLmVycm9yKCIlcy4gVHlwZSAtaCBmb3IgaGVscCIsIGVycikgIyB3aWxsIHByaW50IHNvbWV0aGluZyBsaWtlICJvcHRpb24gLWEgbm90IHJlY29nbml6ZWQiCisgICAgICAgICN1c2FnZSgpCisgICAgICAgIHN5cy5leGl0KC0yKQorCisgICAgcG9ydD1Ob25lCisgICAgcG9ydF9hZG1pbiA9IE5vbmUKKyAgICBjb25maWdfZmlsZSA9ICdvcGVudmltZC5jZmcnCisKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvIGluICgiLXYiLCAiLS12ZXJzaW9uIik6CisgICAgICAgICAgICBwcmludCAib3BlbnZpbWQgdmVyc2lvbiIsIF9fdmVyc2lvbl9fLCB2ZXJzaW9uX2RhdGUKKyAgICAgICAgICAgIHByaW50ICIoYykgQ29weXJpZ2h0IFRlbGVmb25pY2EiCisgICAgICAgICAgICBzeXMuZXhpdCgwKQorICAgICAgICBlbGlmIG8gaW4gKCItaCIsICItLWhlbHAiKToKKyAgICAgICAgICAgIHVzYWdlKCkKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGVsaWYgbyBpbiAoIi1jIiwgIi0tY29uZmlnIik6CisgICAgICAgICAgICBjb25maWdfZmlsZSA9IGEKKyAgICAgICAgZWxpZiBvIGluICgiLXAiLCAiLS1wb3J0Iik6CisgICAgICAgICAgICBwb3J0ID0gYQorICAgICAgICBlbGlmIG8gaW4gKCItUCIsICItLWFkbWlucG9ydCIpOgorICAgICAgICAgICAgcG9ydF9hZG1pbiA9IGEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIlVuaGFuZGxlZCBvcHRpb24iCisKKyAgICAKKyAgICB0cnk6CisgICAgICAgICNMb2FkIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICByLCBjb25maWdfZGljID0gbG9hZF9jb25maWd1cmF0aW9uKGNvbmZpZ19maWxlKQorICAgICAgICAjcHJpbnQgY29uZmlnX2RpYworICAgICAgICBpZiBub3QgcjoKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihjb25maWdfZGljKQorICAgICAgICAgICAgY29uZmlnX2RpYz17fQorICAgICAgICAgICAgZXhpdCgtMSkKKyAgICAgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbCA9IGdldGF0dHIobG9nZ2luZywgY29uZmlnX2RpY1snbG9nX2xldmVsJ10pKQorICAgICAgICBsb2dnZXIuc2V0TGV2ZWwoZ2V0YXR0cihsb2dnaW5nLCBjb25maWdfZGljWydsb2dfbGV2ZWwnXSkpCisgICAgICAgICNvdmVycmlkZSBwYXJhbWV0ZXJzIG9idGFpbmVkIGJ5IGNvbW1hbmQgbGluZQorICAgICAgICBpZiBwb3J0IGlzIG5vdCBOb25lOiBjb25maWdfZGljWydodHRwX3BvcnQnXSA9IHBvcnQKKyAgICAgICAgaWYgcG9ydF9hZG1pbiBpcyBub3QgTm9uZTogY29uZmlnX2RpY1snaHR0cF9hZG1pbl9wb3J0J10gPSBwb3J0X2FkbWluCisgICAgICAgIAorICAgICAgICAjY2hlY2sgbW9kZQorICAgICAgICBpZiAnbW9kZScgbm90IGluIGNvbmZpZ19kaWM6CisgICAgICAgICAgICBjb25maWdfZGljWydtb2RlJ10gPSAnbm9ybWFsJworICAgICAgICAgICAgI2FsbG93IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb2YgdGVzdF9tb2RlIG9wdGlvbgorICAgICAgICAgICAgaWYgJ3Rlc3RfbW9kZScgaW4gY29uZmlnX2RpYyBhbmQgY29uZmlnX2RpY1sndGVzdF9tb2RlJ109PVRydWU6CisgICAgICAgICAgICAgICAgY29uZmlnX2RpY1snbW9kZSddID0gJ3Rlc3QnIAorICAgICAgICBpZiBjb25maWdfZGljWydtb2RlJ10gPT0gJ2RldmVsb3BtZW50JyBhbmQgKCAnZGV2ZWxvcG1lbnRfYnJpZGdlJyBub3QgaW4gY29uZmlnX2RpYyBvciBjb25maWdfZGljWydkZXZlbG9wbWVudF9icmlkZ2UnXSBub3QgaW4gY29uZmlnX2RpYy5nZXQoImJyaWRnZV9pZmFjZXMiLE5vbmUpICk6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIiclcycgaXMgbm90IGEgdmFsaWQgJ2RldmVsb3BtZW50X2JyaWRnZScsIG5vdCBvbmUgb2YgdGhlICdicmlkZ2VfaWZhY2VzJyIsIGNvbmZpZ19maWxlKQorICAgICAgICAgICAgZXhpdCgtMSkKKyAgICAgICAgICAgIAorICAgICAgICBpZiBjb25maWdfZGljWydtb2RlJ10gIT0gJ25vcm1hbCc6CisgICAgICAgICAgICBwcmludCAnISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEnCisgICAgICAgICAgICBwcmludCAiISEgV2FybmluZywgb3BlbnZpbWQgaW4gVEVTVCBtb2RlICclcyciICUgY29uZmlnX2RpY1snbW9kZSddCisgICAgICAgICAgICBwcmludCAnISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEnCisgICAgICAgIGNvbmZpZ19kaWNbJ3ZlcnNpb24nXSA9IF9fdmVyc2lvbl9fCisKKyAgICAjQ29ubmVjdCB0byBkYXRhYmFzZQorICAgICAgICBkYl9odHRwID0gY3JlYXRlX2RhdGFiYXNlX2Nvbm5lY3Rpb24oY29uZmlnX2RpYykKKyAgICAgICAgciA9IGRiX2h0dHAuZ2V0X2RiX3ZlcnNpb24oKQorICAgICAgICBpZiByWzBdPDA6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkRBVEFCQVNFIGlzIG5vdCBhIFZJTSBvbmUgb3IgaXQgaXMgYSAnMC4wJyB2ZXJzaW9uLiBUcnkgdG8gdXBncmFkZSB0byB2ZXJzaW9uICclcycgd2l0aCAnLi9kYXRhYmFzZV91dGlscy9taWdyYXRlX3ZpbV9kYi5zaCciLCBkYXRhYmFzZV92ZXJzaW9uKQorICAgICAgICAgICAgZXhpdCgtMSkKKyAgICAgICAgZWxpZiByWzFdIT1kYXRhYmFzZV92ZXJzaW9uOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJEQVRBQkFTRSB3cm9uZyB2ZXJzaW9uICclcycuIFRyeSB0byB1cGdyYWRlL2Rvd25ncmFkZSB0byB2ZXJzaW9uICclcycgd2l0aCAnLi9kYXRhYmFzZV91dGlscy9taWdyYXRlX3ZpbV9kYi5zaCciLCByWzFdLCBkYXRhYmFzZV92ZXJzaW9uKSAKKyAgICAgICAgICAgIGV4aXQoLTEpCisgICAgICAgIGRiX29mID0gY3JlYXRlX2RhdGFiYXNlX2Nvbm5lY3Rpb24oY29uZmlnX2RpYykKKyAgICAgICAgZGJfbG9jaz0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICBjb25maWdfZGljWydkYiddID0gZGJfb2YKKyAgICAgICAgY29uZmlnX2RpY1snZGJfbG9jayddID0gZGJfbG9jaworCisgICAgI3ByZWNyZWF0ZSBpbnRlcmZhY2VzOyBbYnJpZGdlOjxob3N0X2JyaWRnZV9uYW1lPiwgVkxBTiB1c2VkIGF0IEhvc3QsIHV1aWQgb2YgbmV0d29yayBjYW1waW5nIGluIHRoaXMgYnJpZGdlLCBzcGVlZCBpbiBHYml0L3MKKyAgICAgICAgY29uZmlnX2RpY1snZGhjcF9uZXRzJ109W10KKyAgICAgICAgY29uZmlnX2RpY1snYnJpZGdlX25ldHMnXT1bXQorICAgICAgICBmb3IgYnJpZGdlLHZsYW5fc3BlZWQgaW4gY29uZmlnX2RpY1siYnJpZGdlX2lmYWNlcyJdLml0ZW1zKCk6CisgICAgICAgICAgICAjc2tpcCAnZGV2ZWxvcG1lbnRfYnJpZGdlJworICAgICAgICAgICAgaWYgY29uZmlnX2RpY1snbW9kZSddID09ICdkZXZlbG9wbWVudCcgYW5kIGNvbmZpZ19kaWNbJ2RldmVsb3BtZW50X2JyaWRnZSddID09IGJyaWRnZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgY29uZmlnX2RpY1snYnJpZGdlX25ldHMnXS5hcHBlbmQoIFticmlkZ2UsIHZsYW5fc3BlZWRbMF0sIHZsYW5fc3BlZWRbMV0sIE5vbmVdICkKKyAgICAgICAgZGVsIGNvbmZpZ19kaWNbImJyaWRnZV9pZmFjZXMiXQorCisgICAgICAgICNjaGVjayBpZiB0aGlzIGJyaWRnZSBpcyBhbHJlYWR5IHVzZWQgKHByZXNlbnQgYXQgZGF0YWJhc2UpIGZvciBhIG5ldHdvcmspCisgICAgICAgIHVzZWRfYnJpZGdlX25ldHM9W10KKyAgICAgICAgZm9yIGJybmV0IGluIGNvbmZpZ19kaWNbJ2JyaWRnZV9uZXRzJ106CisgICAgICAgICAgICByLG5ldHMgPSBkYl9vZi5nZXRfdGFibGUoU0VMRUNUPSgndXVpZCcsKSwgRlJPTT0nbmV0cycsV0hFUkU9eydwcm92aWRlcic6ICJicmlkZ2U6Iiticm5ldFswXX0pCisgICAgICAgICAgICBpZiByPjA6CisgICAgICAgICAgICAgICAgYnJuZXRbM10gPSBuZXRzWzBdWyd1dWlkJ10KKyAgICAgICAgICAgICAgICB1c2VkX2JyaWRnZV9uZXRzLmFwcGVuZChicm5ldFswXSkKKyAgICAgICAgICAgICAgICBpZiBjb25maWdfZGljLmdldCgiZGhjcF9zZXJ2ZXIiKToKKyAgICAgICAgICAgICAgICAgICAgaWYgYnJuZXRbMF0gaW4gY29uZmlnX2RpY1siZGhjcF9zZXJ2ZXIiXVsiYnJpZGdlX2lmYWNlcyJdOgorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2RpY1snZGhjcF9uZXRzJ10uYXBwZW5kKG5ldHNbMF1bJ3V1aWQnXSkKKyAgICAgICAgaWYgbGVuKHVzZWRfYnJpZGdlX25ldHMpID4gMCA6CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiZm91bmQgdXNlZCBicmlkZ2UgbmV0czogIiArICIsIi5qb2luKHVzZWRfYnJpZGdlX25ldHMpKQorICAgICAgICAjZ2V0IG5ldHMgdXNlZCBieSBkaGNwCisgICAgICAgIGlmIGNvbmZpZ19kaWMuZ2V0KCJkaGNwX3NlcnZlciIpOgorICAgICAgICAgICAgZm9yIG5ldCBpbiBjb25maWdfZGljWyJkaGNwX3NlcnZlciJdLmdldCgibmV0cyIsICgpICk6CisgICAgICAgICAgICAgICAgcixuZXRzID0gZGJfb2YuZ2V0X3RhYmxlKFNFTEVDVD0oJ3V1aWQnLCksIEZST009J25ldHMnLFdIRVJFPXsnbmFtZSc6IG5ldH0pCisgICAgICAgICAgICAgICAgaWYgcj4wOgorICAgICAgICAgICAgICAgICAgICBjb25maWdfZGljWydkaGNwX25ldHMnXS5hcHBlbmQobmV0c1swXVsndXVpZCddKQorICAgIAorICAgICMgZ2V0IGhvc3QgbGlzdCBmcm9tIGRhdGEgYmFzZSBiZWZvcmUgc3RhcnRpbmcgdGhyZWFkcworICAgICAgICByLGhvc3RzID0gZGJfb2YuZ2V0X3RhYmxlKFNFTEVDVD0oJ25hbWUnLCdpcF9uYW1lJywndXNlcicsJ3V1aWQnKSwgRlJPTT0naG9zdHMnLCBXSEVSRT17J3N0YXR1cyc6J29rJ30pCisgICAgICAgIGlmIHI8MDoKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IGdldCBob3N0cyBmcm9tIGRhdGFiYXNlICVzIiwgaG9zdHMpCisgICAgICAgICAgICBleGl0KC0xKQorICAgICMgY3JlYXRlIGNvbm5lY3RvciB0byB0aGUgb3BlbmZsb3cgY29udHJvbGxlcgorICAgICAgICBvZl90ZXN0X21vZGUgPSBGYWxzZSBpZiBjb25maWdfZGljWydtb2RlJ109PSdub3JtYWwnIG9yIGNvbmZpZ19kaWNbJ21vZGUnXT09Ik9GIG9ubHkiIGVsc2UgVHJ1ZQorCisgICAgICAgIGlmIG9mX3Rlc3RfbW9kZToKKyAgICAgICAgICAgIE9GX2Nvbm4gPSBvZnQub2ZfdGVzdF9jb25uZWN0b3IoeyJvZl9kZWJ1ZyI6IGNvbmZpZ19kaWNbJ2xvZ19sZXZlbF9vZiddfSApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjbG9hZCBvdGhlciBwYXJhbWV0ZXJzIHN0YXJ0aW5nIGJ5IG9mXyBmcm9tIGNvbmZpZyBkaWN0IGluIGEgdGVtcG9yYWwgZGljdAorICAgICAgICAgICAgdGVtcF9kaWN0PXsgIm9mX2lwIjogIGNvbmZpZ19kaWNbJ29mX2NvbnRyb2xsZXJfaXAnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZl9wb3J0IjogY29uZmlnX2RpY1snb2ZfY29udHJvbGxlcl9wb3J0J10sIAorICAgICAgICAgICAgICAgICAgICAgICAgIm9mX2RwaWQiOiBjb25maWdfZGljWydvZl9jb250cm9sbGVyX2RwaWQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZl9kZWJ1ZyI6ICAgY29uZmlnX2RpY1snbG9nX2xldmVsX29mJ10KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3Igayx2IGluIGNvbmZpZ19kaWMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgdHlwZShrKSBpcyBzdHIgYW5kIGtbMDozXT09Im9mXyIgYW5kIGtbMDoxM10gIT0gIm9mX2NvbnRyb2xsZXIiOgorICAgICAgICAgICAgICAgICAgICB0ZW1wX2RpY3Rba109dgorICAgICAgICAgICAgaWYgY29uZmlnX2RpY1snb2ZfY29udHJvbGxlciddPT0nb3BlbmRheWxpZ2h0JzoKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSAiT0RMIgorICAgICAgICAgICAgZWxpZiAib2ZfY29udHJvbGxlcl9tb2R1bGUiIGluIGNvbmZpZ19kaWM6CisgICAgICAgICAgICAgICAgbW9kdWxlID0gY29uZmlnX2RpY1sib2ZfY29udHJvbGxlcl9tb2R1bGUiXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBjb25maWdfZGljWydvZl9jb250cm9sbGVyJ10KKyAgICAgICAgICAgIG1vZHVsZV9pbmZvPU5vbmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2R1bGVfaW5mbyA9IGltcC5maW5kX21vZHVsZShtb2R1bGUpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPRl9jb25uID0gaW1wLmxvYWRfbW9kdWxlKCJPRl9jb25uIiwgKm1vZHVsZV9pbmZvKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgT0ZfY29ubiA9IE9GX2Nvbm4uT0ZfY29ubih0ZW1wX2RpY3QpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3Qgb3BlbiB0aGUgT3BlbmZsb3cgY29udHJvbGxlciAnJXMnOiAlcyIsIHR5cGUoZSkuX19uYW1lX18sIHN0cihlKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbW9kdWxlX2luZm8gYW5kIG1vZHVsZV9pbmZvWzBdOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZShtb2R1bGVfaW5mb1swXSkKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgtMSkKKyAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgSW1wb3J0RXJyb3IpIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgbW9kdWxlX2luZm8gYW5kIG1vZHVsZV9pbmZvWzBdOgorICAgICAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKG1vZHVsZV9pbmZvWzBdKQorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IG9wZW4gb3BlbmZsb3cgY29udHJvbGxlciBtb2R1bGUgJyVzJzsgJXM6ICVzOyByZXZpc2UgJ29mX2NvbnRyb2xsZXInIGZpZWxkIG9mIGNvbmZpZ3VyYXRpb24gZmlsZS4iLCBtb2R1bGUsIHR5cGUoZSkuX19uYW1lX18sIHN0cihlKSkKKyAgICAgICAgICAgICAgICBleGl0KC0xKQorCisKKyAgICAjY3JlYXRlIG9wZW5mbG93IHRocmVhZAorICAgICAgICB0aHJlYWQgPSBvZnQub3BlbmZsb3dfdGhyZWFkKE9GX2Nvbm4sIG9mX3Rlc3Q9b2ZfdGVzdF9tb2RlLCBkYj1kYl9vZiwgIGRiX2xvY2s9ZGJfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtcF93aXRoX3NhbWVfdmxhbj1jb25maWdfZGljWydvZl9jb250cm9sbGVyX25ldHNfd2l0aF9zYW1lX3ZsYW4nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPWNvbmZpZ19kaWNbJ2xvZ19sZXZlbF9vZiddKQorICAgICAgICByLGMgPSB0aHJlYWQuT0ZfY29ubmVjdG9yLm9idGFpbl9wb3J0X2NvcnJlc3BvbmRlbmNlKCkKKyAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3QgZ2V0IG9wZW5mbG93IGluZm9ybWF0aW9uICVzIiwgYykKKyAgICAgICAgICAgIGV4aXQoKQorICAgICAgICB0aHJlYWQuc3RhcnQoKQorICAgICAgICBjb25maWdfZGljWydvZl90aHJlYWQnXSA9IHRocmVhZAorCisgICAgI2NyZWF0ZSBkaGNwX3NlcnZlciB0aHJlYWQKKyAgICAgICAgaG9zdF90ZXN0X21vZGUgPSBUcnVlIGlmIGNvbmZpZ19kaWNbJ21vZGUnXT09J3Rlc3QnIG9yIGNvbmZpZ19kaWNbJ21vZGUnXT09Ik9GIG9ubHkiIGVsc2UgRmFsc2UKKyAgICAgICAgZGhjcF9wYXJhbXMgPSBjb25maWdfZGljLmdldCgiZGhjcF9zZXJ2ZXIiKQorICAgICAgICBpZiBkaGNwX3BhcmFtczoKKyAgICAgICAgICAgIHRocmVhZCA9IGR0LmRoY3BfdGhyZWFkKGRoY3BfcGFyYW1zPWRoY3BfcGFyYW1zLCB0ZXN0PWhvc3RfdGVzdF9tb2RlLCBkaGNwX25ldHM9Y29uZmlnX2RpY1siZGhjcF9uZXRzIl0sIGRiPWRiX29mLCAgZGJfbG9jaz1kYl9sb2NrLCBkZWJ1Zz1jb25maWdfZGljWydsb2dfbGV2ZWxfb2YnXSkKKyAgICAgICAgICAgIHRocmVhZC5zdGFydCgpCisgICAgICAgICAgICBjb25maWdfZGljWydkaGNwX3RocmVhZCddID0gdGhyZWFkCisKKyAgICAgICAgCisgICAgI0NyZWF0ZSBvbmUgdGhyZWFkIGZvciBlYWNoIGhvc3QKKyAgICAgICAgaG9zdF90ZXN0X21vZGUgPSBUcnVlIGlmIGNvbmZpZ19kaWNbJ21vZGUnXT09J3Rlc3QnIG9yIGNvbmZpZ19kaWNbJ21vZGUnXT09Ik9GIG9ubHkiIGVsc2UgRmFsc2UKKyAgICAgICAgaG9zdF9kZXZlbG9wX21vZGUgPSBUcnVlIGlmIGNvbmZpZ19kaWNbJ21vZGUnXT09J2RldmVsb3BtZW50JyBlbHNlIEZhbHNlCisgICAgICAgIGhvc3RfZGV2ZWxvcF9icmlkZ2VfaWZhY2UgPSBjb25maWdfZGljLmdldCgnZGV2ZWxvcG1lbnRfYnJpZGdlJywgTm9uZSkKKyAgICAgICAgY29uZmlnX2RpY1snaG9zdF90aHJlYWRzJ10gPSB7fQorICAgICAgICBmb3IgaG9zdCBpbiBob3N0czoKKyAgICAgICAgICAgIGhvc3RbJ2ltYWdlX3BhdGgnXSA9ICcvb3B0L1ZORi9pbWFnZXMvb3BlbnZpbScKKyAgICAgICAgICAgIHRocmVhZCA9IGh0Lmhvc3RfdGhyZWFkKG5hbWU9aG9zdFsnbmFtZSddLCB1c2VyPWhvc3RbJ3VzZXInXSwgaG9zdD1ob3N0WydpcF9uYW1lJ10sIGRiPWRiX29mLCBkYl9sb2NrPWRiX2xvY2ssCisgICAgICAgICAgICAgICAgICAgIHRlc3Q9aG9zdF90ZXN0X21vZGUsIGltYWdlX3BhdGg9Y29uZmlnX2RpY1snaW1hZ2VfcGF0aCddLCB2ZXJzaW9uPWNvbmZpZ19kaWNbJ3ZlcnNpb24nXSwKKyAgICAgICAgICAgICAgICAgICAgaG9zdF9pZD1ob3N0Wyd1dWlkJ10sIGRldmVsb3BfbW9kZT1ob3N0X2RldmVsb3BfbW9kZSwgZGV2ZWxvcF9icmlkZ2VfaWZhY2U9aG9zdF9kZXZlbG9wX2JyaWRnZV9pZmFjZSAgKQorICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgICAgIGNvbmZpZ19kaWNbJ2hvc3RfdGhyZWFkcyddWyBob3N0Wyd1dWlkJ10gXSA9IHRocmVhZAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgIAorICAgICNDcmVhdGUgdGhyZWFkIHRvIGxpc3RlbiB0byB3ZWIgcmVxdWVzdHMKKyAgICAgICAgaHR0cF90aHJlYWQgPSBodHRwc2VydmVyLmh0dHBzZXJ2ZXIoZGJfaHR0cCwgJ2h0dHAnLCBjb25maWdfZGljWydodHRwX2hvc3QnXSwgY29uZmlnX2RpY1snaHR0cF9wb3J0J10sIEZhbHNlLCBjb25maWdfZGljKQorICAgICAgICBodHRwX3RocmVhZC5zdGFydCgpCisgICAgICAgIAorICAgICAgICBpZiAnaHR0cF9hZG1pbl9wb3J0JyBpbiBjb25maWdfZGljOiAKKyAgICAgICAgICAgIGRiX2h0dHAgPSBjcmVhdGVfZGF0YWJhc2VfY29ubmVjdGlvbihjb25maWdfZGljKQorICAgICAgICAgICAgaHR0cF90aHJlYWRfYWRtaW4gPSBodHRwc2VydmVyLmh0dHBzZXJ2ZXIoZGJfaHR0cCwgJ2h0dHAtYWRtaW4nLCBjb25maWdfZGljWydodHRwX2hvc3QnXSwgY29uZmlnX2RpY1snaHR0cF9hZG1pbl9wb3J0J10sIFRydWUpCisgICAgICAgICAgICBodHRwX3RocmVhZF9hZG1pbi5zdGFydCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBodHRwX3RocmVhZF9hZG1pbiA9IE5vbmUKKyAgICAgICAgdGltZS5zbGVlcCgxKSAgICAgIAorICAgICAgICBsb2dnZXIuaW5mbygnV2FpdGluZyBmb3IgaHR0cCBjbGllbnRzJykKKyAgICAgICAgcHJpbnQgKCdvcGVudmltZCByZWFkeScpCisgICAgICAgIHByaW50ICgnPT09PT09PT09PT09PT09PT09PT0nKQorICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgCisgICAgICAgICNUT0RPOiBJbnRlcmFjdGl2ZSBjb25zb2xlIHdvdWxkIGJlIG5pY2UgaGVyZSBpbnN0ZWFkIG9mIGpvaW4gb3Igc2xlZXAKKyAgICAgICAgCisgICAgICAgIHI9ImhlbHAiICNmb3JjZSBwcmludCBoZWxwIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHI9PSdleGl0JzoKKyAgICAgICAgICAgICAgICBicmVhayAgICAgIAorICAgICAgICAgICAgZWxpZiByIT0nJzoKKyAgICAgICAgICAgICAgICBwcmludCAidHlwZSAnZXhpdCcgZm9yIHRlcm1pbmF0ZSIKKyAgICAgICAgICAgIHIgPSByYXdfaW5wdXQoJz4gJykKKworICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICBwYXNzCisKKyAgICBsb2dnZXIuaW5mbygnRXhpdGluZyBvcGVudmltZCcpCisgICAgdGhyZWFkcyA9IGNvbmZpZ19kaWMuZ2V0KCdob3N0X3RocmVhZHMnLCB7fSkKKyAgICBpZiAnb2ZfdGhyZWFkJyBpbiBjb25maWdfZGljOgorICAgICAgICB0aHJlYWRzWydvZiddID0gKGNvbmZpZ19kaWNbJ29mX3RocmVhZCddKQorICAgIGlmICdkaGNwX3RocmVhZCcgaW4gY29uZmlnX2RpYzoKKyAgICAgICAgdGhyZWFkc1snZGhjcCddID0gKGNvbmZpZ19kaWNbJ2RoY3BfdGhyZWFkJ10pCisgICAgCisgICAgZm9yIHRocmVhZCBpbiB0aHJlYWRzLnZhbHVlcygpOgorICAgICAgICB0aHJlYWQuaW5zZXJ0X3Rhc2soImV4aXQiKQorICAgIGZvciB0aHJlYWQgaW4gdGhyZWFkcy52YWx1ZXMoKToKKyAgICAgICAgdGhyZWFkLmpvaW4oKQorICAgICNodHRwX3RocmVhZC5qb2luKCkKKyAgICAjaWYgaHR0cF90aHJlYWRfYWRtaW4gaXMgbm90IE5vbmU6IAorICAgICNodHRwX3RocmVhZF9hZG1pbi5qb2luKCkKKyAgICBsb2dnZXIuZGVidWcoICJieWUhIikKKyAgICBleGl0KCkKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25maWd1cmUtY29tcHV0ZS1ub2RlLVJIRUw3LjEuc2ggYi9zY3JpcHRzL2NvbmZpZ3VyZS1jb21wdXRlLW5vZGUtUkhFTDcuMS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZmI0MDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb25maWd1cmUtY29tcHV0ZS1ub2RlLVJIRUw3LjEuc2gKQEAgLTAsMCArMSw1MjggQEAKKyMhL2Jpbi9iYXNoIAorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisjIEF1dGhvcnM6IEFudG9uaW8gTG9wZXosIFBhYmxvIE1vbnRlcywgQWxmb25zbyBUaWVybm8KKyMgSnVseSAyMDE1CisKKyMgUGVyc29uYWxpemUgUkhFTDcuMSBvbiBjb21wdXRlIG5vZGVzCisjIFByZXBhcmVkIHRvIHdvcmsgd2l0aCB0aGUgZm9sbG93aW5nIG5ldHdvcmsgY2FyZCBkcml2ZXJzOgorIyAJdGczLCBpZ2IgZHJpdmVycyBmb3IgbWFuYWdlbWVudCBpbnRlcmZhY2VzCisjIAlpeGdiZSAoSW50ZWwgTmlhbnRpYykgYW5kIGk0MGUgKEludGVsIEZvcnR2aWxsZSkgZHJpdmVycyBmb3IgZGF0YSBwbGFuZSBpbnRlcmZhY2VzCisKKyMgVG8gZG93bmxvYWQ6CisjIHdnZXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL25mdmxhYnMvb3Blbm1hbm8vbWFzdGVyL3NjcmlwdHMvY29uZmlndXJlLWNvbXB1dGUtbm9kZS1SSEVMNy4xLnNoCisjIFRvIGV4ZWN1dGU6CisjIGNobW9kICt4IC4vY29uZmlndXJlLWNvbXB1dGUtbm9kZS1SSEVMNy4xLnNoCisjIHN1ZG8gLi9jb25maWd1cmUtY29tcHV0ZS1ub2RlLVJIRUw3LjEuc2ggPHVzZXI+IDxpZmFjZT4KKworIyBBc3N1bXB0aW9uczoKKyMgQWxsIHZpcnR1YWxpemF0aW9uIG9wdGlvbnMgYWN0aXZhdGVkIG9uIEJJT1MgKHZ0LWQsIHZ0LXgsIFNSLUlPViwgbm8gcG93ZXIgc2F2aW5ncy4uLikKKyMgUkhFTDcuMSBpbnN0YWxsZWQgd2l0aG91dCAvaG9tZSBwYXJ0aXRpb24gYW5kIHdpdGggdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBzZWxlY3Rpb246CisjIEBiYXNlLCBAY29yZSwgQGRldmVsb3BtZW50LCBAbmV0d29yay1maWxlLXN5c3RlbS1jbGllbnQsIEB2aXJ0dWFsaXphdGlvbi1oeXBlcnZpc29yLCBAdmlydHVhbGl6YXRpb24tcGxhdGZvcm0sIEB2aXJ0dWFsaXphdGlvbi10b29scworCisKK2Z1bmN0aW9uIHVzYWdlKCl7CisgICAgZWNobyAtZSAiVXNhZ2U6IHN1ZG8gJDAgWy15XSA8dXNlci1uYW1lPiAgWyA8aWZhY2UtbmFtZT4gIFs8aXAtYWRkcmVzcz58ZGhjcF0gXSIKKyAgICBlY2hvIC1lICIgIENvbmZpZ3VyZSBjb21wdXRlIGhvc3QgZm9yIFZJTSB1c2FnZS4gKHZlcnNpb24gMC40KS4gUGFyYW1zOiIKKyAgICBlY2hvIC1lICIgICAgIC15ICBkbyBub3QgcHJvbXB0IGZvciBjb25maXJtYXRpb24uIElmIGEgbmV3IHVzZXIgaXMgY3JlYXRlZCwgdGhlIHVzZXIgbmFtZSBpcyBzZXQgYXMgcGFzc3dvcmQiCisgICAgZWNobyAtZSAiICAgICA8dXNlci1uYW1lPiBDcmVhdGUgaWYgbm90IGV4aXN0IGFuZCBjb25maWd1cmUgdGhpcyB1c2VyIGZvciBvcGVudmltIHRvIGNvbm5lY3QiCisgICAgZWNobyAtZSAiICAgICA8aWZhY2UtbmFtZT4gaWYgc3VwbGllZCBjcmVhdGVzIGJyaWRnZSBpbnRlcmZhY2VzIG9uIHRoaXMgaW50ZXJmYWNlLCBuZWVkZWQgZm9yIG9wZW52aW0iCisgICAgZWNobyAtZSAiICAgICBpcCBvciBkaGNwIGlmIHN1cGxpZWQsIGNvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlIHdpdGggdGhpcyBpcCBhZGRyZXNzICgvMjQpIG9yICdkaGNwJyAiCit9CisKKworIzEgQ0hFQ0sgaW5wdXQgcGFyYW1ldGVycworIzEuMSByb290IHByaXZpbGVnZXMKK1sgIiRVU0VSIiAhPSAicm9vdCIgXSAmJiBlY2hvICJOZWVkZWQgcm9vdCBwcml2aWxlZ2VzIiAmJiB1c2FnZSAmJiBleGl0IC0xCisKKyMxLjIgaW5wdXQgcGFyYW1ldGVycworRk9SQ0U9IiIKK3doaWxlIGdldG9wdHMgInkiIG87IGRvCisgICAgY2FzZSAiJHtvfSIgaW4KKyAgICAgICAgeSkKKyAgICAgICAgICAgIEZPUkNFPSJ5ZXMiCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgdXNhZ2UKKyAgICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorc2hpZnQgJCgoT1BUSU5ELTEpKQorCisKK2lmIFsgJCMgLWx0IDEgXSAgCit0aGVuCisgIHVzYWdlCisgIGV4aXQKK2ZpCisKK3VzZXJfbmFtZT0kMQoraW50ZXJmYWNlPSQyCitpcF9pZmFjZT0kMworCitpZiBbIC1uICIkaW50ZXJmYWNlIiBdICYmICEgaWZjb25maWcgJGludGVyZmFjZSAmPiAvZGV2L251bGwKK3RoZW4KKyAgZWNobyAiRXJyb3I6IGludGVyZmFjZSAnJGludGVyZmFjZScgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN5c3RlbSIKKyAgdXNhZ2UKKyAgZXhpdCAxCitmaQorCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBJTlNUQUxMIE5FRURFRCBQQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKKyMgUmVxdWlyZWQgcGFja2FnZXMKK3l1bSByZXBvbGlzdAoreXVtIGNoZWNrLXVwZGF0ZQoreXVtIHVwZGF0ZSAteQoreXVtIGluc3RhbGwgLXkgc2NyZWVuIHZpcnQtbWFuYWdlciBldGh0b29sIGdjYyBnY2MtYysrIHhvcmcteDExLXhhdXRoIHhvcmcteDExLXhpbml0IHhvcmcteDExLWRlcHJlY2F0ZWQtbGlicyBsaWJYdHN0IGd1ZXN0ZmlzaCBod2xvYyBsaWJodWdldGxiZnMtdXRpbHMgbGliZ3Vlc3Rmcy10b29scyBudW1hY3RsCisjIFNlbGludXggbWFuYWdlbWVudAoreXVtIGluc3RhbGwgLXkgcG9saWN5Y29yZXV0aWxzLXB5dGhvbgorCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBJTlNUQUxMIFVTRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKKyMgQWRkIHJlcXVpcmVkIGdyb3VwcworZ3JvdXBhZGQgLWYgbmZ2Z3JvdXAKK2dyb3VwYWRkIC1mIGxpYnZpcnQgICAjZm9yIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIG1heSBiZSBsaWJ2aXJ0ZAorCisjIEFkZHMgdXNlciwgZGVmYXVsdCBwYXNzd29yZCBzYW1lIGFzIG5hbWUKK2lmIGdyZXAgLXEgIl4ke3VzZXJfbmFtZX06IiAvZXRjL3Bhc3N3ZAordGhlbiAKKyAgI3VzZXIgZXhpc3QsIGFkZCB0byBncm91cAorICBlY2hvICJhZGRpbmcgdXNlciAke3VzZXJfbmFtZX0gdG8gZ3JvdXBzIGxpYnZpcnQsbmZ2Z3JvdXAiCisgIHVzZXJtb2QgLWEgLUcgbGlidmlydCxuZnZncm91cCAtZyBuZnZncm91cCAkdXNlcl9uYW1lCitlbHNlIAorICAjY3JlYXRlIHVzZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QKKyAgWyAteiAiJEZPUkNFIiBdICYmIHJlYWQgLXAgInVzZXIgJyR7dXNlcl9uYW1lfScgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSAoWS9uKSIga2sKKyAgaWYgISBbIC16ICIka2siIC1vICIka2siPSJ5IiAtbyAiJGtrIj0iWSIgXQorICB0aGVuCisgICAgZXhpdAorICBmaQorICBlY2hvICJjcmVhdGluZyBhbmQgY29uZmlndXJpbmcgdXNlciAke3VzZXJfbmFtZX0iCisgIHVzZXJhZGQgLW0gLUcgbGlidmlydCxuZnZncm91cCAtZyBuZnZncm91cCAkdXNlcl9uYW1lICAgICAgIAorICAjUGFzc3dvcmQKKyAgaWYgWyAteiAiJEZPUkNFIiBdIAorICB0aGVuIAorICAgICBlY2hvICJQcm92aWRlIGEgcGFzc3dvcmQgZm9yICR1c2VyX25hbWUiCisgICAgIHBhc3N3ZCAkdXNlcl9uYW1lCisgIGVsc2UKKyAgICAgZWNobyAtZSAiJHVzZXJfbmFtZVxuJHVzZXJfbmFtZSIgfCBwYXNzd2QgLS1zdGRpbiAkdXNlcl9uYW1lCisgIGZpCitmaQorCisjU2V0dGluZyBkZWZhdWx0IGxpYnZpcnQgVVJJIGZvciB0aGUgdXNlcgorZWNobyAiU2V0dGluZyBkZWZhdWx0IGxpYnZpcnQgVVJJIGZvciB0aGUgdXNlciIKK2VjaG8gImlmIHRlc3QgLXggYHdoaWNoIHZpcnNoYDsgdGhlbiIgPj4gL2hvbWUvJHt1c2VyX25hbWV9Ly5iYXNoX3Byb2ZpbGUKK2VjaG8gIiAgZXhwb3J0IExJQlZJUlRfREVGQVVMVF9VUkk9cWVtdTovLy9zeXN0ZW0iID4+IC9ob21lLyR7dXNlcl9uYW1lfS8uYmFzaF9wcm9maWxlCitlY2hvICJmaSIgPj4gL2hvbWUvJHt1c2VyX25hbWV9Ly5iYXNoX3Byb2ZpbGUKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgSU5TVEFMTCBIVUdFUEFHRVMgSVNPTENQVVMgR1JVQiAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCisjIEh1Z2UgcGFnZXMgMUcgYXV0byBtb3VudAorbWtkaXIgLXAgL21udC9odWdlCitpZiAhIGdyZXAgLXEgIkh1Z2UgcGFnZXMiIC9ldGMvZnN0YWIKK3RoZW4KKyAgZWNobyAiIiA+PiAvZXRjL2ZzdGFiCisgIGVjaG8gIiMgSHVnZSBwYWdlcyIgPj4gL2V0Yy9mc3RhYgorICBlY2hvICJub2RldiAvbW50L2h1Z2UgaHVnZXRsYmZzIHBhZ2VzaXplPTFHQiAwIDAiID4+IC9ldGMvZnN0YWIKKyAgZWNobyAiIiA+PiAvZXRjL2ZzdGFiCitmaQorCisjIEh1Z2UgcGFnZXMgcmVzZXJ2YXRpb24gc2VydmljZQoraWYgISBbIC1mIC91c3IvbGliL3N5c3RlbWQvc3lzdGVtL2h1Z2V0bGItZ2lnYW50aWMtcGFnZXMuc2VydmljZSBdCit0aGVuCisgIGVjaG8gImNvbmZpZ3VyaW5nIGh1Z2UgcGFnZXMgc2VydmljZSIKKyAgY2F0ID4gL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vaHVnZXRsYi1naWdhbnRpYy1wYWdlcy5zZXJ2aWNlIDw8IEVPTAorW1VuaXRdCitEZXNjcmlwdGlvbj1IdWdlVExCIEdpZ2FudGljIFBhZ2VzIFJlc2VydmF0aW9uCitEZWZhdWx0RGVwZW5kZW5jaWVzPW5vCitCZWZvcmU9ZGV2LWh1Z2VwYWdlcy5tb3VudAorQ29uZGl0aW9uUGF0aEV4aXN0cz0vc3lzL2RldmljZXMvc3lzdGVtL25vZGUKK0NvbmRpdGlvbktlcm5lbENvbW1hbmRMaW5lPWh1Z2VwYWdlc3o9MUcKKworW1NlcnZpY2VdCitUeXBlPW9uZXNob3QKK1JlbWFpbkFmdGVyRXhpdD15ZXMKK0V4ZWNTdGFydD0vdXNyL2xpYi9zeXN0ZW1kL2h1Z2V0bGItcmVzZXJ2ZS1wYWdlcworCitbSW5zdGFsbF0KK1dhbnRlZEJ5PXN5c2luaXQudGFyZ2V0CitFT0wKK2ZpCisjIEdydWIgdmlydHVhbGl6YXRpb24gb3B0aW9uczoKKworIyBHZXQgaXNvbGNwdXMKK2lzb2xjcHVzPWBnYXdrICdCRUdJTntwcmU9LTI7fQorICAoJDE9PSJwcm9jZXNzb3IiKXtwcm89JDM7fQorICAoJDE9PSJjb3JlIiAmJiAkNCE9MCl7CisgICAgIGlmIChwcmUrMT09cHJvKXtlbmRyYW5nZT0iLSIgcHJvfQorICAgICBlbHNle2NwdXM9Y3B1cyBlbmRyYW5nZSBzZXAgcHJvOyBzZXA9IiwiOyBlbmRyYW5nZT0iIjt9OworICAgICBwcmU9cHJvO30KKyAgRU5Ee3ByaW50ZigiJXMiLGNwdXMgZW5kcmFuZ2UpO30nIC9wcm9jL2NwdWluZm9gCisKKworIyBIdWdlIHBhZ2VzIHJlc2VydmF0aW9uIGZpbGU6IHJlc2VydmluZyBhbGwgbWVtb3J5IGFwYXJ0IGZyb20gNEdCIHBlciBOVU1BIG5vZGUKKyMgR2V0IHRoZSBudW1iZXIgb2YgaHVnZXBhZ2VzOiBhbGwgbWVtb3J5IGJ1dCA4R0IgcmVzZXJ2ZWQgZm9yIHRoZSBPUworI3RvdGFsbWVtPWBkbWlkZWNvZGUgLS10eXBlIDE3fGdyZXAgU2l6ZSB8Z3JlcCBNQiB8Z2F3ayAne3N1bWErPSQyfSBFTkQge3ByaW50IHN1bWEvMTAyNH0nYAorI2h1Z2VwYWdlcz0kKCgkdG90YWxtZW0tOCkpCisKK2lmICEgWyAtZiAvdXNyL2xpYi9zeXN0ZW1kL2h1Z2V0bGItcmVzZXJ2ZS1wYWdlcyBdCit0aGVuCisgIGNhdCA+IC91c3IvbGliL3N5c3RlbWQvaHVnZXRsYi1yZXNlcnZlLXBhZ2VzIDw8IEVPTAorIyEvYmluL2Jhc2gKK25vZGVzX3BhdGg9L3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlLworaWYgWyAhIC1kIFwkbm9kZXNfcGF0aCBdOyB0aGVuCisgICAgICAgIGVjaG8gIkVSUk9SOiBcJG5vZGVzX3BhdGggZG9lcyBub3QgZXhpc3QiCisgICAgICAgIGV4aXQgMQorZmkKKworcmVzZXJ2ZV9wYWdlcygpCit7CisgICAgICAgIGVjaG8gXCQxID4gXCRub2Rlc19wYXRoL1wkMi9odWdlcGFnZXMvaHVnZXBhZ2VzLTEwNDg1NzZrQi9ucl9odWdlcGFnZXMKK30KKworIyBUaGlzIGV4YW1wbGUgcmVzZXJ2ZXMgYWxsIGF2YWlsYWJsZSBtZW1vcnkgYXBhcnQgZnJvbSA0IEdCIGZvciBsaW51eAorIyB1c2luZyAxR0Igc2l6ZS4gWW91IGNhbiBtb2RpZnkgaXQgdG8geW91ciBuZWVkcyBvciBjb21tZW50IHRoZSBsaW5lcworIyB0byBhdm9pZCByZXNlcnZlIG1lbW9yeSBpbiBhIG51bWEgbm9kZQorRU9MCisgIGZvciBmIGluIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlPy9tZW1pbmZvCisgIGRvCisgICAgbm9kZT1gaGVhZCAtbjEgJGYgfCBnYXdrICcoJDU9PSJrQiIpe3ByaW50ICQyfSdgCisgICAgbWVtb3J5PWBoZWFkIC1uMSAkZiB8IGdhd2sgJygkNT09ImtCIil7cHJpbnQgJDR9J2AKKyAgICBtZW1vcnk9JCgobWVtb3J5KzEwNDg1NzYtMSkpICAgI21lbW9yeSBtdXN0IGJlIGNlaWxlZCAgCisgICAgbWVtb3J5PSQoKG1lbW9yeS8xMDQ4NTc2KSkgICAjZnJvbSBga0IgdG8gR0IgCisgICAgI2lmIG1lbW9yeSAKKyAgICBbICRtZW1vcnkgLWd0IDQgXSAmJiBlY2hvICJyZXNlcnZlX3BhZ2VzICQoKG1lbW9yeS00KSkgbm9kZSRub2RlIiA+PiAvdXNyL2xpYi9zeXN0ZW1kL2h1Z2V0bGItcmVzZXJ2ZS1wYWdlcworICBkb25lCisKKyAgIyBSdW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcyB0byBlbmFibGUgaHVnZSBwYWdlcyBlYXJseSBib290IHJlc2VydmF0aW9uOgorICBjaG1vZCAreCAvdXNyL2xpYi9zeXN0ZW1kL2h1Z2V0bGItcmVzZXJ2ZS1wYWdlcworICBzeXN0ZW1jdGwgZW5hYmxlIGh1Z2V0bGItZ2lnYW50aWMtcGFnZXMKK2ZpCisKKyMgUHJlcGFyZXMgdGhlIHRleHQgdG8gYWRkIGF0IHRoZSBlbmQgb2YgdGhlIGdydWIgbGluZSwgaW5jbHVkaW5nIGJsYWNrbGlzdGluZyBpeGdiZXZmIGRyaXZlciBpbiB0aGUgaG9zdAordGV4dG9rZXJuZWw9ImludGVsX2lvbW11PW9uIGRlZmF1bHRfaHVnZXBhZ2Vzej0xRyBodWdlcGFnZXN6PTFHIGlzb2xjcHVzPSRpc29sY3B1cyBtb2Rwcm9iZS5ibGFja2xpc3Q9aXhnYmV2ZiBtb2Rwcm9iZS5ibGFja2xpc3Q9aTQwZXZmIiAgCisKKyMgQWRkIHRleHQgdG8gdGhlIGtlcm5lbCBsaW5lCitpZiAhIGdyZXAgLXEgImludGVsX2lvbW11PW9uIGRlZmF1bHRfaHVnZXBhZ2Vzej0xRyBodWdlcGFnZXN6PTFHIiAvZXRjL2RlZmF1bHQvZ3J1YgordGhlbgorICBlY2hvICJhZGRpbmcgY21kbGluZSAke3RleHRva2VybmVsfSIKKyAgc2VkIC1pICIvXkdSVUJfQ01ETElORV9MSU5VWD0vcy9cIlwkLyAke3RleHRva2VybmVsfVwiLyIgL2V0Yy9kZWZhdWx0L2dydWIKKyAgIyBncnViMiB1cGdyYWRlCisgIGdydWIyLW1rY29uZmlnIC1vIC9ib290L2dydWIyL2dydWIuY2ZnCitmaQorCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBPVEhFUiBDT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKKyMgRGlzYWJsZSByZXF1aXJldHR5CitpZiAhIGdyZXAgLXEgIiNvcGVubWFubyIgL2V0Yy9zdWRvZXJzCit0aGVuCisgICAgY2F0ID4+IC9ob21lLyR7dXNlcl9uYW1lfS9zY3JpcHRfdmlzdWRvLnNoIDw8IEVPTAorIyEvYmluL2Jhc2gKK2NhdCBcJDEgfCBhd2sgJyhcJDB+InJlcXVpcmV0dHkiKXtwcmludCAiIyJcJDB9KFwkMCF+InJlcXVpcmV0dHkiKXtwcmludCBcJDB9JyA+IHRtcAorY2F0IHRtcCA+IFwkMQorcm0gdG1wCitFT0wKKyAgICBjaG1vZCAreCAvaG9tZS8ke3VzZXJfbmFtZX0vc2NyaXB0X3Zpc3Vkby5zaAorICAgIGVjaG8gIkRpc2FibGluZyByZXF1aXRldHR5IgorICAgIGV4cG9ydCBFRElUT1I9L2hvbWUvJHt1c2VyX25hbWV9L3NjcmlwdF92aXN1ZG8uc2ggJiYgc3VkbyAtRSB2aXN1ZG8KKyAgICBybSAtZiAvaG9tZS8ke3VzZXJfbmFtZX0vc2NyaXB0X3Zpc3Vkby5zaAorZmkKKworI0NvbmZpZ3VyZSBwb2xraW50IHRvIHJ1biB2aXJzaCBhcyBhIG5vcm1hbCB1c2VyCitlY2hvICJDb25maWd1cmluZyBwb2xraW50IHRvIHJ1biB2aXJzaCBhcyBhIG5vcm1hbCB1c2VyIgorY2F0ID4+IC9ldGMvcG9sa2l0LTEvbG9jYWxhdXRob3JpdHkvNTAtbG9jYWwuZC81MC1vcmcubGlidmlydC1hY2Nlc3MucGtsYSAgPDwgRU9MCitbbGlidmlydCBBZG1pbiBBY2Nlc3NdCitJZGVudGl0eT11bml4LWdyb3VwOmxpYnZpcnQKK0FjdGlvbj1vcmcubGlidmlydC51bml4Lm1hbmFnZQorUmVzdWx0QW55PXllcworUmVzdWx0SW5hY3RpdmU9eWVzCitSZXN1bHRBY3RpdmU9eWVzCitFT0wKKworIyBMaW5rcyB0aGUgT3Blbk1BTk8gcmVxdWlyZWQgZm9sZGVyIC9vcHQvVk5GL2ltYWdlcyB0byAvdmFyL2xpYi9saWJ2aXJ0L2ltYWdlcy4gVGhlIE9TIGluc3RhbGxhdGlvbgorIyBzaG91bGQgaGF2ZSBvbmx5IGEgLyBwYXJ0aXRpb24gd2l0aCBhbGwgcG9zc2libGUgc3BhY2UgYXZhaWxhYmxlCisKK2VjaG8gIiBsaW5rIC9vcHQvVk5GL2ltYWdlcyB0byAvdmFyL2xpYi9saWJ2aXJ0L2ltYWdlcyIKK2lmIFsgIiR1c2VyX25hbWUiICE9ICIiIF0KK3RoZW4KKyAgI21rZGlyIC1wIC9ob21lLyR7dXNlcl9uYW1lfS9WTkZfaW1hZ2VzCisgICNjaG93biAtUiAke3VzZXJfbmFtZX06bmZ2Z3JvdXAgL2hvbWUvJHt1c2VyX25hbWV9L1ZORl9pbWFnZXMKKyAgI2NobW9kIGdvK3ggJEhPTUUKKworICAjIFRoZSBvcmNoZXN0YXRvciBuZWVkcyB0byBsaW5rIHRoZSBpbWFnZXMgZm9sZGVyIAorICBybSAtZiAvb3B0L1ZORi9pbWFnZXMKKyAgbWtkaXIgLXAgL29wdC9WTkYvCisgIGxuIC1zIC92YXIvbGliL2xpYnZpcnQvaW1hZ2VzIC9vcHQvVk5GL2ltYWdlcworICBjaG93biAtUiAke3VzZXJfbmFtZX06bmZ2Z3JvdXAgL29wdC9WTkYKKyAgY2hvd24gLVIgcm9vdDpuZnZncm91cCAvdmFyL2xpYi9saWJ2aXJ0L2ltYWdlcworICBjaG1vZCBnK3J3eCAvdmFyL2xpYi9saWJ2aXJ0L2ltYWdlcworCisgICMgU2VsaW51eCBtYW5hZ2VtZW50CisgICNlY2hvICJjb25maWd1cmUgIFNlbGludXggbWFuYWdlbWVudCIKKyAgI3NlbWFuYWdlIGZjb250ZXh0IC1hIC10IHZpcnRfaW1hZ2VfdCAiL2hvbWUvJHt1c2VyX25hbWV9L1ZORl9pbWFnZXMoLy4qKT8iCisgICNjYXQgL2V0Yy9zZWxpbnV4L3RhcmdldGVkL2NvbnRleHRzL2ZpbGVzL2ZpbGVfY29udGV4dHMubG9jYWwgfGdyZXAgdmlydF9pbWFnZQorICAjcmVzdG9yZWNvbiAtUiAtdiAvaG9tZS8ke3VzZXJfbmFtZX0vVk5GX2ltYWdlcworZWxzZQorICBta2RpciAtcCAvb3B0L1ZORi9pbWFnZXMKKyAgY2htb2QgbytyeCAvb3B0L1ZORi9pbWFnZXMKK2ZpCisKK2VjaG8gImNyZWF0aW5nIGxvY2FsIGluZm9ybWF0aW9uIC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sIgorZWNobyAiI0J5IGRlZmF1bHQgb3BlbnZpbSBhc3N1bWVzIGNvbnRyb2wgcGxhbmUgaW50ZXJmYWNlIG5hbWluZyBhcyBlbTEsZW0yLGVtMyxlbTQgIiA+IC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCitlY2hvICIjYW5kIGJyaWRnZSBpZmFjZXMgYXMgdmlyYnJNYW4xLCB2aXJick1hbjIsIC4uLiIgPj4gL29wdC9WTkYvaW1hZ2VzL2hvc3RpbmZvLnlhbWwKK2VjaG8gIiNpZiBjb21wdXRlIG5vZGUgY29udGFpbiBhIGRpZmZlcmVudCBuYW1lIGl0IG11c3QgYmUgaW5kaWNhdGVkIGluIHRoaXMgZmlsZSIgPj4gL29wdC9WTkYvaW1hZ2VzL2hvc3RpbmZvLnlhbWwKK2VjaG8gIiN3aXRoIHRoZSBmb3JtYXQgZXh0YW5kYXJkLW5hbWU6IGNvbXB1dGUtbmFtZSIgPj4gL29wdC9WTkYvaW1hZ2VzL2hvc3RpbmZvLnlhbWwKK2lmIFsgIiRpbnRlcmZhY2UiICE9ICIiIC1hICIkaW50ZXJmYWNlIiAhPSAiZW0xIiBdCit0aGVuCisgIGVjaG8gImlmYWNlX25hbWVzOiIgID4+IC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCisgIGVjaG8gIiAgZW0xOiAke2ludGVyZmFjZX0iID4+IC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCitmaQorY2htb2QgbytyIC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCisKKyMgZGVhY3RpdmF0ZSBtZW1vcnkgb3ZlcmNvbW1pdAorZWNobyAiZGVhY3RpdmF0ZSBtZW1vcnkgb3ZlcmNvbW1pdCIKK3NlcnZpY2Uga3NtdHVuZWQgc3RvcAorc2VydmljZSBrc20gc3RvcAorY2hrY29uZmlnIGtzbXR1bmVkIG9mZgorY2hrY29uZmlnIGtzbSBvZmYKKworCisjIExpYnZpcnQgb3B0aW9ucyAodW5jb21tZW50IHRoZSBmb2xsb3dpbmcpCitlY2hvICJjb25maWd1cmUgTGlidmlydCBvcHRpb25zIgorc2VkIC1pICdzLyN1bml4X3NvY2tfZ3JvdXAgPSAibGlidmlydCIvdW5peF9zb2NrX2dyb3VwID0gImxpYnZpcnQiLycgL2V0Yy9saWJ2aXJ0L2xpYnZpcnRkLmNvbmYKK3NlZCAtaSAncy8jdW5peF9zb2NrX3J3X3Blcm1zID0gIjA3NzAiL3VuaXhfc29ja19yd19wZXJtcyA9ICIwNzcwIi8nIC9ldGMvbGlidmlydC9saWJ2aXJ0ZC5jb25mCitzZWQgLWkgJ3MvI3VuaXhfc29ja19kaXIgPSAiXC92YXJcL3J1blwvbGlidmlydCIvdW5peF9zb2NrX2RpciA9ICJcL3ZhclwvcnVuXC9saWJ2aXJ0Ii8nIC9ldGMvbGlidmlydC9saWJ2aXJ0ZC5jb25mCitzZWQgLWkgJ3MvI2F1dGhfdW5peF9ydyA9ICJub25lIi9hdXRoX3VuaXhfcncgPSAibm9uZSIvJyAvZXRjL2xpYnZpcnQvbGlidmlydGQuY29uZgorCisjY3JlYXRpbmcgdGhlIHBvbGtpdCBncmFudCBhY2Nlc3MgZm9yIGxpYnZpcnQgdXNlci4gCisjVGhpcyBkb2VzIG5vdCB3b3JrICEhISEgc28gY29tbWVudGVkLiBObyB3YXkgdG8gZ2V0IHJ1bm5pbmcgd2l0aG91dCB1bmNvbWVudGVkIHRoZSBhdXRoX3VuaXhfcncgPSAibm9uZSIgbGluZQorIworI2NhdCA+IC9ldGMvcG9sa2l0LTEvbG9jYWxhdXRob3JpdHkvNTAtbG9jYWwuZC81MC1vcmcuZXhhbXBsZS1saWJ2aXJ0LXJlbW90ZS1hY2Nlc3MucGtsYSA8PCBFT0wKKyNbbGlidmlydCBNYW5hZ2VtZW50IEFjY2Vzc10KKyMgSWRlbnRpdHk9dW5peC11c2VyOm4yO3VuaXgtdXNlcjpraworIyBBY3Rpb249b3JnLmxpYnZpcnQudW5peC5tYW5hZ2UKKyMgUmVzdWx0QW55PXllcworIyBSZXN1bHRJbmFjdGl2ZT15ZXMKKyMgUmVzdWx0QWN0aXZlPXllcworI0VPTAorCisjIENvbmZpZ3VyYXRpb24gY2hhbmdlIG9mIHFlbXUgZm9yIHRoZSBudW1hdHVuZSBidWcgaXNzdWUKKyMgUkhFTDcuMTogZm9yIHRoaXMgdmVyc2lvbiBzaG91bGQgbm90IGJlIG5lY2VzYXJ5IC0gdG8gcmV2aXNlCisjaWYgISBncmVwIC1xICJjZ3JvdXBfY29udHJvbGxlcnMgPSBbIFwiY3B1XCIsIFwiZGV2aWNlc1wiLCBcIm1lbW9yeVwiLCBcImJsa2lvXCIsIFwiY3B1YWNjdFwiIF0iIC9ldGMvbGlidmlydC9xZW11LmNvbmYKKyN0aGVuCisjY2F0IC9ldGMvbGlidmlydC9xZW11LmNvbmYgfCBhd2sgJ3twcmludCAkMH0oJDB+IiNjZ3JvdXBfY29udHJvbGxlcnMiKXtwcmludCAiY2dyb3VwX2NvbnRyb2xsZXJzID0gWyBcImNwdVwiLCBcImRldmljZXNcIiwgXCJtZW1vcnlcIiwgXCJibGtpb1wiLCBcImNwdWFjY3RcIiBdIn0nID4gdG1wCisjbXYgdG1wIC9ldGMvbGlidmlydC9xZW11LmNvbmYKKyNmaQorCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBORVRXT1JLIENPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisjIE5ldHdvcmsgY29uZmlnIChpZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBuZXQpCitpZiBbIC1uICIkaW50ZXJmYWNlIiBdCit0aGVuCisKKyAgIyBEZWFjdGl2YXRlIG5ldHdvcmsgbWFuYWdlcgorICBzeXN0ZW1jdGwgc3RvcCBOZXR3b3JrTWFuYWdlcgorICBzeXN0ZW1jdGwgZGlzYWJsZSBOZXR3b3JrTWFuYWdlcgorCisgICMgRm9yIG1hbmFnZW1lbnQgYW5kIGRhdGEgaW50ZXJmYWNlcworICBybSAtZiAvZXRjL3VkZXYvcnVsZXMuZC9wY2lfY29uZmlnLnJ1bGVzICMgaXQgd2lsbCBiZSBjcmVhdGVkIHRvIGRlZmluZSBWRnMKKworICBwdXNoZCAvZXRjL3N5c2NvbmZpZy9uZXR3b3JrLXNjcmlwdHMvCisKKyAgIyBTZXQgT05CT09UPW9uIGFuZCBNVFU9OTAwMCBvbiB0aGUgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBicmlkZ2VzCisgIGVjaG8gImNvbmZpZ3VyaW5nIGlmYWNlICRpbnRlcmZhY2UiCisgIGNhdCBpZmNmZy0kaW50ZXJmYWNlIHwgZ3JlcCAtZSBIV0FERFIgLWUgVVVJRCA+ICRpbnRlcmZhY2UudG1wCisgIGVjaG8gIlRZUEU9RXRoZXJuZXQKK05BTUU9JGludGVyZmFjZQorREVWSUNFPSRpbnRlcmZhY2UKK1RZUEU9RXRoZXJuZXQKK09OQk9PVD15ZXMKK05NX0NPTlRST0xMRUQ9bm8KK01UVT05MDAwCitCT09UUFJPVE89bm9uZQorSVBWNklOSVQ9bm8iID4+ICRpbnRlcmZhY2UudG1wCisgICAgbXYgJGludGVyZmFjZS50bXAgIGlmY2ZnLSRpbnRlcmZhY2UKKworICAjIE1hbmFnZW1lbnQgaW50ZXJmYWNlcworIyAgaW50ZWdyYXRlZF9pbnRlcmZhY2VzPSIiCisjICBuYl9pZmFjZXM9MAorIyAgZm9yIGlmYWNlIGluIGBpZmNvbmZpZyAtYSB8IGdyZXAgIjpcICIgfCBjdXQgLWYgMSAtZCI6InwgZ3JlcCAtdiAiXyIgfCBncmVwIC12ICJcLiIgfCBncmVwIC12ICJsbyIgfCBzb3J0YAorIyAgZG8gCisjICAgIGRyaXZlcj1gZXRodG9vbCAtaSAkaWZhY2V8IGF3ayAnKCQwfiJkcml2ZXIiKXtwcmludCAkMn0nYAorIyAgICBpZiBbICRkcml2ZXIgIT0gIml4Z2JlIiBdICYmIFsgJGRyaXZlciAhPSAiYnJpZGdlIiBdCisjICAgIHRoZW4KKyMgICAgICBpbnRlZ3JhdGVkX2ludGVyZmFjZXM9IiRpbnRlZ3JhdGVkX2ludGVyZmFjZXMgJGlmYWNlIgorIyAgICAgIG5iX2lmYWNlcz0kKChuYl9pZmFjZXMrMSkpCisjICAgICAgZXZhbCBpZmFjZSR7bmJfaWZhY2VzfT0kaWZhY2UKKyMgICAgZmkKKyMgIGRvbmUKKworICAjQ3JlYXRlIGluZnJhc3RydWN0dXJlIGJyaWRnZSwgbm9ybWFsbHkgdXNlZCBmb3IgY29ubmVjdGluZyB0byBjb21wdXRlIG5vZGVzLCBvcGVuZmxvdyBjb250cm9sbGVyLCAuLi4gIAorICBlY2hvICJERVZJQ0U9dmlyYnJJbmYKK1RZUEU9QnJpZGdlCitPTkJPT1Q9eWVzCitERUxBWT0wCitOTV9DT05UUk9MTEVEPW5vCitVU0VSQ1RMPW5vIiA+IGlmY2ZnLXZpcmJySW5mCisKKyAgICAjQ3JlYXRlIFZMQU4gZm9yIGluZnJhc3RydWN0dXJlIGJyaWRnZQorICAgIGVjaG8gIkRFVklDRT0ke2ludGVyZmFjZX0uMTAwMQorT05CT09UPXllcworTk1fQ09OVFJPTExFRD1ubworVVNFUkNUTD1ubworVkxBTj15ZXMKK0JPT1RQUk9UTz1ub25lCitCUklER0U9dmlyYnJJbmYiID4gaWZjZmctJHtpbnRlcmZhY2V9LjEwMDEKKworCisgICNDcmVhdGUgYnJpZGdlIGludGVyZmFjZXMKKyAgZWNobyAiQ3JlYXRpbmcgYnJpZGdlIGlmYWNlczogIgorICBmb3IgKChpPTE7aTw9MjA7aSsrKSkKKyAgZG8KKyAgICBpMmRpZ2l0cz0kaQorICAgIFsgJGkgLWx0IDEwIF0gJiYgaTJkaWdpdHM9IjAkaSIKKyAgICBlY2hvICIgICAgdmlyYnJNYW4kaSAgdmxhbiAyMCRpMmRpZ2l0cyIKKyAgICBlY2hvICJERVZJQ0U9dmlyYnJNYW4kaQorVFlQRT1CcmlkZ2UKK09OQk9PVD15ZXMKK0RFTEFZPTAKK05NX0NPTlRST0xMRUQ9bm8KK1VTRVJDVEw9bm8iID4gaWZjZmctdmlyYnJNYW4kaQorCisjV2l0aG91dCBJUDoKKyNCT09UUFJPVE89c3RhdGljCisjSVBBRERSPTEwLjEwLjEwLiQoKGkrMjA5KSkKKyNORVRNQVNLPTI1NS4yNTUuMjU1LjAiID4gaWZjZmctdmlyYnJNYW4kaQorCisgICAgIyBjcmVhdGUgdGhlIHJlcXVpcmVkIGludGVyZmFjZXMgdG8gY29ubmVjdCB0aGUgYnJpZGdlcworICAgIGVjaG8gIkRFVklDRT0ke2ludGVyZmFjZX0uMjAkaTJkaWdpdHMKK09OQk9PVD15ZXMKK05NX0NPTlRST0xMRUQ9bm8KK1VTRVJDVEw9bm8KK1ZMQU49eWVzCitCT09UUFJPVE89bm9uZQorQlJJREdFPXZpcmJyTWFuJGkiID4gaWZjZmctJHtpbnRlcmZhY2V9LjIwJGkyZGlnaXRzCisgIGRvbmUKKworICBpZiBbIC1uICIkaXBfaWZhY2UiIF0KKyAgdGhlbgorICAgIGVjaG8gImNvbmZpZ3VyaW5nIGlmYWNlICRpZmFjZSBpbnRlcmZhY2Ugd2l0aCBpcCAkaXBfaWZhY2UiCisgICAgIyBOZXR3b3JrIGludGVyZmFjZXMKKyAgICAjIDFHYnBzIGludGVyZmFjZXMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBPTkJPT1Q9eWVzIGFuZCBzdGF0aWMgSVAgYWRkcmVzcworICAgIGNhdCBpZmNmZy0kaWZhY2UgfCBncmVwIC1lIEhXQUREUiAtZSBVVUlEID4gJGlmYWNlLnRtcAorICAgIGVjaG8gIlRZUEU9RXRoZXJuZXQKK05BTUU9JGlmYWNlCitERVZJQ0U9JGlmYWNlCitUWVBFPUV0aGVybmV0CitPTkJPT1Q9eWVzCitOTV9DT05UUk9MTEVEPW5vCitJUFY2SU5JVD1ubyIgPj4gJGlmYWNlLnRtcAorICAgIFsgJGlwX2lmYWNlID0gImRoY3AiIF0gJiYgZWNobyAtZSAiQk9PVFBST1RPPWRoY3BcbkRIQ1BfSE9TVE5BTUU9JEhPU1ROQU1FIiA+PiAkaWZhY2UudG1wCisgICAgWyAkaXBfaWZhY2UgIT0gImRoY3AiIF0gJiYgZWNobyAtZSAiQk9PVFBST1RPPXN0YXRpY1xuSVBBRERSPSR7aXBfaWZhY2V9XG5ORVRNQVNLPTI1NS4yNTUuMjU1LjAiID4+ICRpZmFjZS50bXAKKyAgICBtdiAkaWZhY2UudG1wICBpZmNmZy0kaWZhY2UKKyAgZmkKKworICBmb3IgaWZhY2UgaW4gYGlmY29uZmlnIC1hIHwgZ3JlcCAiOiAiIHwgY3V0IC1mIDEgLWQiOiIgfCBncmVwIC12IC1lICJfIiAtZSAiXC4iIC1lICJsbyIgLWUgInZpcmJyIiAtZSAidGFwImAKKyAgZG8KKyAgICAjIDEwLzQwIEdicHMgaW50ZXJmYWNlcworICAgICMgSW50ZWwgWDUyMCBjYXJkczogZHJpdmVyIGl4Z2JlCisgICAgIyBJbnRlbCBYTDcxMCBGb3J0dmlsbGUgY2FyZHM6IGRyaXZlciBpNDBlCisgICAgZHJpdmVyPWBldGh0b29sIC1pICRpZmFjZXwgYXdrICcoJDB+ImRyaXZlciIpe3ByaW50ICQyfSdgCisgICAgaWYgWyAiJGRyaXZlciIgPSAiaTQwZSIgLW8gIiRkcml2ZXIiID0gIml4Z2JlIiBdCisgICAgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJpbmcgZGF0YXBsYW5lIGlmYWNlICRpZmFjZSIKKyAgICAgIAorICAgICAgIyBDcmVhdGUgOCBTUi1JT1YgcGVyIFBGIGJ5IHVkZXYgcnVsZXMgb25seSBmb3IgRm9ydHZpbGxlIGNhcmRzIChpNDBlIGRyaXZlcikKKyAgICAgIGlmIFsgIiRkcml2ZXIiID0gImk0MGUiIF0KKyAgICAgIHRoZW4KKyAgICAgIAlwY2k9YGV0aHRvb2wgLWkgJGlmYWNlIHwgYXdrICcoJDB+ImJ1cy1pbmZvIil7cHJpbnQgJDJ9J2AKKyAgICAgIAllY2hvICJBQ1RJT049PVwiYWRkXCIsIEtFUk5FTD09XCIkcGNpXCIsIFNVQlNZU1RFTT09XCJwY2lcIiwgUlVOKz1cIi91c3IvYmluL2Jhc2ggLWMgJ2VjaG8gOCA+IC9zeXMvYnVzL3BjaS9kZXZpY2VzLyRwY2kvc3Jpb3ZfbnVtdmZzJ1wiIiA+PiAvZXRjL3VkZXYvcnVsZXMuZC9wY2lfY29uZmlnLnJ1bGVzCisgICAgICBmaQorCisgICAgICAjIENvbmZpZ3VyZSBQRiB0byBib290IGF1dG9tYXRpY2FsbHkgYW5kIHRvIGhhdmUgYSBiaWcgTVRVCisgICAgICAjIDEwR2JwcyBpbnRlcmZhY2VzIGFyZSBjb25maWd1cmVkIHdpdGggT05CT09UPXllcyBhbmQgIE1UVT0yMDAwCisgICAgICBjYXQgaWZjZmctJGlmYWNlIHwgZ3JlcCAtZSBIV0FERFIgLWUgVVVJRCA+ICRpZmFjZS50bXAKKyAgICAgIGVjaG8gIlRZUEU9RXRoZXJuZXQKK05BTUU9JGlmYWNlCitERVZJQ0U9JGlmYWNlCitPTkJPT1Q9eWVzCitNVFU9OTAwMAorTk1fQ09OVFJPTExFRD1ubworSVBWNklOSVQ9bm8KK0JPT1RQUk9UTz1ub25lIiA+PiAkaWZhY2UudG1wCisgICAgICBtdiAkaWZhY2UudG1wIGlmY2ZnLSRpZmFjZQorICAgIGZpCisgIGRvbmUKKyAgcG9wZAorZmkKKworCisjIEFjdGl2YXRlIDggVmlydHVhbCBGdW5jdGlvbnMgcGVyIFBGIG9uIE5pYW50aWMgY2FyZHMgKGl4Z2JlIGRyaXZlcikKK2lmIFtbIGBsc21vZCB8IGN1dCAtZCIgIiAtZjEgfCBncmVwICJpeGdiZSIgfCBncmVwIC12IHZmYCBdXQordGhlbgorCWlmICEgZ3JlcCAtcSAiaXhnYmUiIC9ldGMvbW9kcHJvYmUuZC9peGdiZS5jb25mCisJdGhlbgorCWVjaG8gIm9wdGlvbnMgaXhnYmUgbWF4X3Zmcz04IiA+PiAvZXRjL21vZHByb2JlLmQvaXhnYmUuY29uZgorCWZpCisKK2ZpCisKKyMgRXhlY3V0ZXMgZHJhY3V0IHRvIGxvYWQgZHJpdmVycyBvbiBib290CitlY2hvICJSZWdlbmVyYXRpbmcgaW5pdHJhbWZzIgorZHJhY3V0IC0tZm9yY2UKKworIyBUbyBkZWZpbmUgOCBWRnMgcGVyIFBGIHdlIGRvIGl0IG9uIHJjLmxvY2FsLCBiZWNhdXNlIHRoZSBkcml2ZXIgbmVlZHMgdG8gYmUgdW5sb2FkZWQgYW5kIGxvYWRlZCBhZ2FpbgorI2lmICEgZ3JlcCAtcSAiTkZWIiAvZXRjL3JjLmxvY2FsCisjdGhlbgorIyAgZWNobyAiIiA+PiAvZXRjL3JjLmxvY2FsCisjICBlY2hvICIjIE5GViIgPj4gL2V0Yy9yYy5sb2NhbAorIyAgZWNobyAibW9kcHJvYmUgLXIgaXhnYmUiID4+IC9ldGMvcmMubG9jYWwKKyMgIGVjaG8gIm1vZHByb2JlIGl4Z2JlIG1heF92ZnM9OCIgPj4gL2V0Yy9yYy5sb2NhbAorIyAgZWNobyAiIiA+PiAvZXRjL3JjLmxvY2FsCisKKyMgIGNobW9kICt4IC9ldGMvcmMuZC9yYy5sb2NhbAorCisjZmkKKworZWNobyAKK2VjaG8gIkRvIG5vdCBmb3JnZXQgdG8gY3JlYXRlIGEgc2hhcmVkIChORlMsIFNhbWJhLCAuLi4pIHdoZXJlIG9yaWdpbmFsIHZpcnR1YWwgbWFjaGluZSBpbWFnZXMgYXJlIGFsbG9jYXRlZCIKK2VjaG8KK2VjaG8gIkRvIG5vdCBmb3JnZXQgdG8gY29weSB0aGUgcHVibGljIHNzaCBrZXkgaW50byAvaG9tZS8ke3VzZXJfbmFtZX0vLnNzaC9hdXRob3JpemVkX2tleXMgZm9yIGF1dGhvbWF0aWMgbG9naW4gZnJvbSBvcGVudmltIGNvbnRyb2xsZXIiCitlY2hvCisKK2VjaG8gIlJlYm9vdCB0aGUgc3lzdGVtIHRvIG1ha2UgdGhlIGNoYW5nZXMgZWZmZWN0aXZlIgorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvbmZpZ3VyZS1jb21wdXRlLW5vZGUtUkhFTDcuMi5zaCBiL3NjcmlwdHMvY29uZmlndXJlLWNvbXB1dGUtbm9kZS1SSEVMNy4yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OGFlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NvbmZpZ3VyZS1jb21wdXRlLW5vZGUtUkhFTDcuMi5zaApAQCAtMCwwICsxLDU2MCBAQAorIyEvYmluL2Jhc2ggCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKyMgQXV0aG9yczogQW50b25pbyBMb3BleiwgUGFibG8gTW9udGVzLCBBbGZvbnNvIFRpZXJubworIyAyMDE2IE1hcmNoIDE4CisjIE1vZGlmaWVkIHRvIHJ1biBvbiBncnViMiBhbmQgZWZpIGJvb3QKKworIyBQZXJzb25hbGl6ZSBSSEVMNy4yIG9uIGNvbXB1dGUgbm9kZXMKKyMgUHJlcGFyZWQgdG8gd29yayB3aXRoIHRoZSBmb2xsb3dpbmcgbmV0d29yayBjYXJkIGRyaXZlcnM6CisjIAl0ZzMsIGlnYiBkcml2ZXJzIGZvciBtYW5hZ2VtZW50IGludGVyZmFjZXMKKyMgCWl4Z2JlIChJbnRlbCBOaWFudGljKSBhbmQgaTQwZSAoSW50ZWwgRm9ydHZpbGxlKSBkcml2ZXJzIGZvciBkYXRhIHBsYW5lIGludGVyZmFjZXMKKworIyBUbyBkb3dubG9hZDoKKyMgd2dldCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbmZ2bGFicy9vcGVubWFuby9tYXN0ZXIvc2NyaXB0cy9jb25maWd1cmUtY29tcHV0ZS1ub2RlLVJIRUw3LjEuc2gKKyMgVG8gZXhlY3V0ZToKKyMgY2htb2QgK3ggLi9jb25maWd1cmUtY29tcHV0ZS1ub2RlLVJIRUw3LjEuc2gKKyMgc3VkbyAuL2NvbmZpZ3VyZS1jb21wdXRlLW5vZGUtUkhFTDcuMS5zaCA8dXNlcj4gPGlmYWNlPgorCisjIEFzc3VtcHRpb25zOgorIyBBbGwgdmlydHVhbGl6YXRpb24gb3B0aW9ucyBhY3RpdmF0ZWQgb24gQklPUyAodnQtZCwgdnQteCwgU1ItSU9WLCBubyBwb3dlciBzYXZpbmdzLi4uKQorIyBSSEVMNy4yIGluc3RhbGxlZCB3aXRob3V0IC9ob21lIHBhcnRpdGlvbiBhbmQgd2l0aCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIHNlbGVjdGlvbjoKKyMgQGJhc2UsIEBjb3JlLCBAZGV2ZWxvcG1lbnQsIEBuZXR3b3JrLWZpbGUtc3lzdGVtLWNsaWVudCwgQHZpcnR1YWxpemF0aW9uLWh5cGVydmlzb3IsIEB2aXJ0dWFsaXphdGlvbi1wbGF0Zm9ybSwgQHZpcnR1YWxpemF0aW9uLXRvb2xzCisKKyMgMjAxNiBBdWcgMTcgQW50b25pbyBMw7NwZXoKKyMgQ2hhbmdlZCB2aXJickluZiB0byB2aXJiclZJTSwgdG8gcmVmbGVjdCB0aGF0IHRoaXMgYnJpZGdlIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgVklNIChPcGVuVklNKQorIyBDaGFuZ2VkIHRoZSB2bGFuIHRhZyB1c2VkIGJ5IHZpcmJyVklNIGZyb20gMjAwMCB0byAxMTAwCisKK2Z1bmN0aW9uIHVzYWdlKCl7CisgICAgZWNobyAtZSAiVXNhZ2U6IHN1ZG8gJDAgWy15XSA8dXNlci1uYW1lPiAgWyA8aWZhY2UtbmFtZT4gIFs8aXAtYWRkcmVzcz58ZGhjcF0gXSIKKyAgICBlY2hvIC1lICIgIENvbmZpZ3VyZSBjb21wdXRlIGhvc3QgZm9yIFZJTSB1c2FnZS4gKHZlcnNpb24gMC40KS4gUGFyYW1zOiIKKyAgICBlY2hvIC1lICIgICAgIC15ICBkbyBub3QgcHJvbXB0IGZvciBjb25maXJtYXRpb24uIElmIGEgbmV3IHVzZXIgaXMgY3JlYXRlZCwgdGhlIHVzZXIgbmFtZSBpcyBzZXQgYXMgcGFzc3dvcmQiCisgICAgZWNobyAtZSAiICAgICA8dXNlci1uYW1lPiBDcmVhdGUgaWYgbm90IGV4aXN0IGFuZCBjb25maWd1cmUgdGhpcyB1c2VyIGZvciBvcGVudmltIHRvIGNvbm5lY3QiCisgICAgZWNobyAtZSAiICAgICA8aWZhY2UtbmFtZT4gaWYgc3VwbGllZCBjcmVhdGVzIGJyaWRnZSBpbnRlcmZhY2VzIG9uIHRoaXMgaW50ZXJmYWNlLCBuZWVkZWQgZm9yIG9wZW52aW0iCisgICAgZWNobyAtZSAiICAgICBpcCBvciBkaGNwIGlmIHN1cGxpZWQsIGNvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlIHdpdGggdGhpcyBpcCBhZGRyZXNzICgvMjQpIG9yICdkaGNwJyAiCit9CisKKworIzEgQ0hFQ0sgaW5wdXQgcGFyYW1ldGVycworIzEuMSByb290IHByaXZpbGVnZXMKK1sgIiRVU0VSIiAhPSAicm9vdCIgXSAmJiBlY2hvICJOZWVkZWQgcm9vdCBwcml2aWxlZ2VzIiAmJiB1c2FnZSAmJiBleGl0IC0xCisKKyMxLjIgaW5wdXQgcGFyYW1ldGVycworRk9SQ0U9IiIKK3doaWxlIGdldG9wdHMgInkiIG87IGRvCisgICAgY2FzZSAiJHtvfSIgaW4KKyAgICAgICAgeSkKKyAgICAgICAgICAgIEZPUkNFPSJ5ZXMiCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgdXNhZ2UKKyAgICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorc2hpZnQgJCgoT1BUSU5ELTEpKQorCisKK2lmIFsgJCMgLWx0IDEgXSAgCit0aGVuCisgIHVzYWdlCisgIGV4aXQKK2ZpCisKK3VzZXJfbmFtZT0kMQoraW50ZXJmYWNlPSQyCitpcF9pZmFjZT0kMworCitpZiBbIC1uICIkaW50ZXJmYWNlIiBdICYmICEgaWZjb25maWcgJGludGVyZmFjZSAmPiAvZGV2L251bGwKK3RoZW4KKyAgZWNobyAiRXJyb3I6IGludGVyZmFjZSAnJGludGVyZmFjZScgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN5c3RlbSIKKyAgdXNhZ2UKKyAgZXhpdCAxCitmaQorCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBJTlNUQUxMIE5FRURFRCBQQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKKyMgUmVxdWlyZWQgcGFja2FnZXMKK3l1bSByZXBvbGlzdAoreXVtIGNoZWNrLXVwZGF0ZQoreXVtIHVwZGF0ZSAteQoreXVtIGluc3RhbGwgLXkgc2NyZWVuIHZpcnQtbWFuYWdlciBldGh0b29sIGdjYyBnY2MtYysrIHhvcmcteDExLXhhdXRoIHhvcmcteDExLXhpbml0IHhvcmcteDExLWRlcHJlY2F0ZWQtbGlicyBsaWJYdHN0IGd1ZXN0ZmlzaCBod2xvYyBsaWJodWdldGxiZnMtdXRpbHMgbGliZ3Vlc3Rmcy10b29scyBudW1hY3RsCisjIFNlbGludXggbWFuYWdlbWVudAoreXVtIGluc3RhbGwgLXkgcG9saWN5Y29yZXV0aWxzLXB5dGhvbgorCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBJTlNUQUxMIFVTRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKKyMgQWRkIHJlcXVpcmVkIGdyb3VwcworZ3JvdXBhZGQgLWYgbmZ2Z3JvdXAKK2dyb3VwYWRkIC1mIGxpYnZpcnQgICAjZm9yIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIG1heSBiZSBsaWJ2aXJ0ZAorCisjIEFkZHMgdXNlciwgZGVmYXVsdCBwYXNzd29yZCBzYW1lIGFzIG5hbWUKK2lmIGdyZXAgLXEgIl4ke3VzZXJfbmFtZX06IiAvZXRjL3Bhc3N3ZAordGhlbiAKKyAgI3VzZXIgZXhpc3QsIGFkZCB0byBncm91cAorICBlY2hvICJhZGRpbmcgdXNlciAke3VzZXJfbmFtZX0gdG8gZ3JvdXBzIGxpYnZpcnQsbmZ2Z3JvdXAiCisgIHVzZXJtb2QgLWEgLUcgbGlidmlydCxuZnZncm91cCAtZyBuZnZncm91cCAkdXNlcl9uYW1lCitlbHNlIAorICAjY3JlYXRlIHVzZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QKKyAgWyAteiAiJEZPUkNFIiBdICYmIHJlYWQgLXAgInVzZXIgJyR7dXNlcl9uYW1lfScgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSAoWS9uKSIga2sKKyAgaWYgISBbIC16ICIka2siIC1vICIka2siPSJ5IiAtbyAiJGtrIj0iWSIgXQorICB0aGVuCisgICAgZXhpdAorICBmaQorICBlY2hvICJjcmVhdGluZyBhbmQgY29uZmlndXJpbmcgdXNlciAke3VzZXJfbmFtZX0iCisgIHVzZXJhZGQgLW0gLUcgbGlidmlydCxuZnZncm91cCAtZyBuZnZncm91cCAkdXNlcl9uYW1lICAgICAgIAorICAjUGFzc3dvcmQKKyAgaWYgWyAteiAiJEZPUkNFIiBdIAorICB0aGVuIAorICAgICBlY2hvICJQcm92aWRlIGEgcGFzc3dvcmQgZm9yICR1c2VyX25hbWUiCisgICAgIHBhc3N3ZCAkdXNlcl9uYW1lCisgIGVsc2UKKyAgICAgZWNobyAtZSAiJHVzZXJfbmFtZVxuJHVzZXJfbmFtZSIgfCBwYXNzd2QgLS1zdGRpbiAkdXNlcl9uYW1lCisgIGZpCitmaQorCisjU2V0dGluZyBkZWZhdWx0IGxpYnZpcnQgVVJJIGZvciB0aGUgdXNlcgorZWNobyAiU2V0dGluZyBkZWZhdWx0IGxpYnZpcnQgVVJJIGZvciB0aGUgdXNlciIKK2VjaG8gImlmIHRlc3QgLXggYHdoaWNoIHZpcnNoYDsgdGhlbiIgPj4gL2hvbWUvJHt1c2VyX25hbWV9Ly5iYXNoX3Byb2ZpbGUKK2VjaG8gIiAgZXhwb3J0IExJQlZJUlRfREVGQVVMVF9VUkk9cWVtdTovLy9zeXN0ZW0iID4+IC9ob21lLyR7dXNlcl9uYW1lfS8uYmFzaF9wcm9maWxlCitlY2hvICJmaSIgPj4gL2hvbWUvJHt1c2VyX25hbWV9Ly5iYXNoX3Byb2ZpbGUKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgSU5TVEFMTCBIVUdFUEFHRVMgSVNPTENQVVMgR1JVQiAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCisjIEh1Z2UgcGFnZXMgMUcgYXV0byBtb3VudAorbWtkaXIgLXAgL21udC9odWdlCitpZiAhIGdyZXAgLXEgIkh1Z2UgcGFnZXMiIC9ldGMvZnN0YWIKK3RoZW4KKyAgZWNobyAiIiA+PiAvZXRjL2ZzdGFiCisgIGVjaG8gIiMgSHVnZSBwYWdlcyIgPj4gL2V0Yy9mc3RhYgorICBlY2hvICJub2RldiAvbW50L2h1Z2UgaHVnZXRsYmZzIHBhZ2VzaXplPTFHQiAwIDAiID4+IC9ldGMvZnN0YWIKKyAgZWNobyAiIiA+PiAvZXRjL2ZzdGFiCitmaQorCisjIEh1Z2UgcGFnZXMgcmVzZXJ2YXRpb24gc2VydmljZQoraWYgISBbIC1mIC91c3IvbGliL3N5c3RlbWQvc3lzdGVtL2h1Z2V0bGItZ2lnYW50aWMtcGFnZXMuc2VydmljZSBdCit0aGVuCisgIGVjaG8gImNvbmZpZ3VyaW5nIGh1Z2UgcGFnZXMgc2VydmljZSIKKyAgY2F0ID4gL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vaHVnZXRsYi1naWdhbnRpYy1wYWdlcy5zZXJ2aWNlIDw8IEVPTAorW1VuaXRdCitEZXNjcmlwdGlvbj1IdWdlVExCIEdpZ2FudGljIFBhZ2VzIFJlc2VydmF0aW9uCitEZWZhdWx0RGVwZW5kZW5jaWVzPW5vCitCZWZvcmU9ZGV2LWh1Z2VwYWdlcy5tb3VudAorQ29uZGl0aW9uUGF0aEV4aXN0cz0vc3lzL2RldmljZXMvc3lzdGVtL25vZGUKK0NvbmRpdGlvbktlcm5lbENvbW1hbmRMaW5lPWh1Z2VwYWdlc3o9MUcKKworW1NlcnZpY2VdCitUeXBlPW9uZXNob3QKK1JlbWFpbkFmdGVyRXhpdD15ZXMKK0V4ZWNTdGFydD0vdXNyL2xpYi9zeXN0ZW1kL2h1Z2V0bGItcmVzZXJ2ZS1wYWdlcworCitbSW5zdGFsbF0KK1dhbnRlZEJ5PXN5c2luaXQudGFyZ2V0CitFT0wKK2ZpCisjIEdydWIgdmlydHVhbGl6YXRpb24gb3B0aW9uczoKKworIyBHZXQgaXNvbGNwdXMKK2lzb2xjcHVzPWBnYXdrICdCRUdJTntwcmU9LTI7fQorICAoJDE9PSJwcm9jZXNzb3IiKXtwcm89JDM7fQorICAoJDE9PSJjb3JlIiAmJiAkNCE9MCl7CisgICAgIGlmIChwcmUrMT09cHJvKXtlbmRyYW5nZT0iLSIgcHJvfQorICAgICBlbHNle2NwdXM9Y3B1cyBlbmRyYW5nZSBzZXAgcHJvOyBzZXA9IiwiOyBlbmRyYW5nZT0iIjt9OworICAgICBwcmU9cHJvO30KKyAgRU5Ee3ByaW50ZigiJXMiLGNwdXMgZW5kcmFuZ2UpO30nIC9wcm9jL2NwdWluZm9gCisKKworIyBIdWdlIHBhZ2VzIHJlc2VydmF0aW9uIGZpbGU6IHJlc2VydmluZyBhbGwgbWVtb3J5IGFwYXJ0IGZyb20gNEdCIHBlciBOVU1BIG5vZGUKKyMgR2V0IHRoZSBudW1iZXIgb2YgaHVnZXBhZ2VzOiBhbGwgbWVtb3J5IGJ1dCA4R0IgcmVzZXJ2ZWQgZm9yIHRoZSBPUworI3RvdGFsbWVtPWBkbWlkZWNvZGUgLS10eXBlIDE3fGdyZXAgU2l6ZSB8Z3JlcCBNQiB8Z2F3ayAne3N1bWErPSQyfSBFTkQge3ByaW50IHN1bWEvMTAyNH0nYAorI2h1Z2VwYWdlcz0kKCgkdG90YWxtZW0tOCkpCisKK2lmICEgWyAtZiAvdXNyL2xpYi9zeXN0ZW1kL2h1Z2V0bGItcmVzZXJ2ZS1wYWdlcyBdCit0aGVuCisgIGNhdCA+IC91c3IvbGliL3N5c3RlbWQvaHVnZXRsYi1yZXNlcnZlLXBhZ2VzIDw8IEVPTAorIyEvYmluL2Jhc2gKK25vZGVzX3BhdGg9L3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlLworaWYgWyAhIC1kIFwkbm9kZXNfcGF0aCBdOyB0aGVuCisgICAgICAgIGVjaG8gIkVSUk9SOiBcJG5vZGVzX3BhdGggZG9lcyBub3QgZXhpc3QiCisgICAgICAgIGV4aXQgMQorZmkKKworcmVzZXJ2ZV9wYWdlcygpCit7CisgICAgICAgIGVjaG8gXCQxID4gXCRub2Rlc19wYXRoL1wkMi9odWdlcGFnZXMvaHVnZXBhZ2VzLTEwNDg1NzZrQi9ucl9odWdlcGFnZXMKK30KKworIyBUaGlzIGV4YW1wbGUgcmVzZXJ2ZXMgYWxsIGF2YWlsYWJsZSBtZW1vcnkgYXBhcnQgZnJvbSA0IEdCIGZvciBsaW51eAorIyB1c2luZyAxR0Igc2l6ZS4gWW91IGNhbiBtb2RpZnkgaXQgdG8geW91ciBuZWVkcyBvciBjb21tZW50IHRoZSBsaW5lcworIyB0byBhdm9pZCByZXNlcnZlIG1lbW9yeSBpbiBhIG51bWEgbm9kZQorRU9MCisgIGZvciBmIGluIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlPy9tZW1pbmZvCisgIGRvCisgICAgbm9kZT1gaGVhZCAtbjEgJGYgfCBnYXdrICcoJDU9PSJrQiIpe3ByaW50ICQyfSdgCisgICAgbWVtb3J5PWBoZWFkIC1uMSAkZiB8IGdhd2sgJygkNT09ImtCIil7cHJpbnQgJDR9J2AKKyAgICBtZW1vcnk9JCgobWVtb3J5KzEwNDg1NzYtMSkpICAgI21lbW9yeSBtdXN0IGJlIGNlaWxlZCAgCisgICAgbWVtb3J5PSQoKG1lbW9yeS8xMDQ4NTc2KSkgICAjZnJvbSBga0IgdG8gR0IgCisgICAgI2lmIG1lbW9yeSAKKyAgICBbICRtZW1vcnkgLWd0IDQgXSAmJiBlY2hvICJyZXNlcnZlX3BhZ2VzICQoKG1lbW9yeS00KSkgbm9kZSRub2RlIiA+PiAvdXNyL2xpYi9zeXN0ZW1kL2h1Z2V0bGItcmVzZXJ2ZS1wYWdlcworICBkb25lCisKKyAgIyBSdW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcyB0byBlbmFibGUgaHVnZSBwYWdlcyBlYXJseSBib290IHJlc2VydmF0aW9uOgorICBjaG1vZCAreCAvdXNyL2xpYi9zeXN0ZW1kL2h1Z2V0bGItcmVzZXJ2ZS1wYWdlcworICBzeXN0ZW1jdGwgZW5hYmxlIGh1Z2V0bGItZ2lnYW50aWMtcGFnZXMKK2ZpCisKKyMgUHJlcGFyZXMgdGhlIHRleHQgdG8gYWRkIGF0IHRoZSBlbmQgb2YgdGhlIGdydWIgbGluZSwgaW5jbHVkaW5nIGJsYWNrbGlzdGluZyBpeGdiZXZmIGRyaXZlciBpbiB0aGUgaG9zdAorCit0ZXh0b2tlcm5lbD0iaW50ZWxfaW9tbXU9b24gZGVmYXVsdF9odWdlcGFnZXN6PTFHIGh1Z2VwYWdlc3o9MUcgaXNvbGNwdXM9JGlzb2xjcHVzIG1vZHByb2JlLmJsYWNrbGlzdD1peGdiZXZmIG1vZHByb2JlLmJsYWNrbGlzdD1pNDBldmYiICAKKworIyBBZGQgdGV4dCB0byB0aGUga2VybmVsIGxpbmUKK2lmICEgZ3JlcCAtcSAiaW50ZWxfaW9tbXU9b24gZGVmYXVsdF9odWdlcGFnZXN6PTFHIGh1Z2VwYWdlc3o9MUciIC9ldGMvZGVmYXVsdC9ncnViCit0aGVuCisgIGVjaG8gImFkZGluZyBjbWRsaW5lICR7dGV4dG9rZXJuZWx9IgorICBzZWQgLWkgIi9eR1JVQl9DTURMSU5FX0xJTlVYPS9zL1wiXCQvICR7dGV4dG9rZXJuZWx9XCIvIiAvZXRjL2RlZmF1bHQvZ3J1YgorICAKKyAgIyBncnViMiB1cGdyYWRlCisKKyAgIyBCSU9TIGJhc2VkIHN5c3RlbXMKKyAgZ3J1YjItbWtjb25maWcgLW8gL2Jvb3QvZ3J1YjIvZ3J1Yi5jZmcKKworICAjIFVFRkkgYmFzZWQgc3lzdGVtcworICBncnViMi1ta2NvbmZpZyAtbyAvYm9vdC9lZmkvRUZJL3JlZGhhdC9ncnViLmNmZyAKKworZmkKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgT1RIRVIgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCisjIERpc2FibGUgcmVxdWlyZXR0eQoraWYgISBncmVwIC1xICIjb3Blbm1hbm8iIC9ldGMvc3Vkb2VycwordGhlbgorICAgIGNhdCA+PiAvaG9tZS8ke3VzZXJfbmFtZX0vc2NyaXB0X3Zpc3Vkby5zaCA8PCBFT0wKKyMhL2Jpbi9iYXNoCitjYXQgXCQxIHwgYXdrICcoXCQwfiJyZXF1aXJldHR5Iil7cHJpbnQgIiMiXCQwfShcJDAhfiJyZXF1aXJldHR5Iil7cHJpbnQgXCQwfScgPiB0bXAKK2NhdCB0bXAgPiBcJDEKK3JtIHRtcAorRU9MCisgICAgY2htb2QgK3ggL2hvbWUvJHt1c2VyX25hbWV9L3NjcmlwdF92aXN1ZG8uc2gKKyAgICBlY2hvICJEaXNhYmxpbmcgcmVxdWl0ZXR0eSIKKyAgICBleHBvcnQgRURJVE9SPS9ob21lLyR7dXNlcl9uYW1lfS9zY3JpcHRfdmlzdWRvLnNoICYmIHN1ZG8gLUUgdmlzdWRvCisgICAgcm0gLWYgL2hvbWUvJHt1c2VyX25hbWV9L3NjcmlwdF92aXN1ZG8uc2gKK2ZpCisKKyNDb25maWd1cmUgcG9sa2ludCB0byBydW4gdmlyc2ggYXMgYSBub3JtYWwgdXNlcgorZWNobyAiQ29uZmlndXJpbmcgcG9sa2ludCB0byBydW4gdmlyc2ggYXMgYSBub3JtYWwgdXNlciIKK2NhdCA+PiAvZXRjL3BvbGtpdC0xL2xvY2FsYXV0aG9yaXR5LzUwLWxvY2FsLmQvNTAtb3JnLmxpYnZpcnQtYWNjZXNzLnBrbGEgIDw8IEVPTAorW2xpYnZpcnQgQWRtaW4gQWNjZXNzXQorSWRlbnRpdHk9dW5peC1ncm91cDpsaWJ2aXJ0CitBY3Rpb249b3JnLmxpYnZpcnQudW5peC5tYW5hZ2UKK1Jlc3VsdEFueT15ZXMKK1Jlc3VsdEluYWN0aXZlPXllcworUmVzdWx0QWN0aXZlPXllcworRU9MCisKKyMgTGlua3MgdGhlIE9wZW5NQU5PIHJlcXVpcmVkIGZvbGRlciAvb3B0L1ZORi9pbWFnZXMgdG8gL3Zhci9saWIvbGlidmlydC9pbWFnZXMuIFRoZSBPUyBpbnN0YWxsYXRpb24KKyMgc2hvdWxkIGhhdmUgb25seSBhIC8gcGFydGl0aW9uIHdpdGggYWxsIHBvc3NpYmxlIHNwYWNlIGF2YWlsYWJsZQorCitlY2hvICIgbGluayAvb3B0L1ZORi9pbWFnZXMgdG8gL3Zhci9saWIvbGlidmlydC9pbWFnZXMiCitpZiBbICIkdXNlcl9uYW1lIiAhPSAiIiBdCit0aGVuCisgICNta2RpciAtcCAvaG9tZS8ke3VzZXJfbmFtZX0vVk5GX2ltYWdlcworICAjY2hvd24gLVIgJHt1c2VyX25hbWV9Om5mdmdyb3VwIC9ob21lLyR7dXNlcl9uYW1lfS9WTkZfaW1hZ2VzCisgICNjaG1vZCBnbyt4ICRIT01FCisKKyAgIyBUaGUgb3JjaGVzdGF0b3IgbmVlZHMgdG8gbGluayB0aGUgaW1hZ2VzIGZvbGRlciAKKyAgcm0gLWYgL29wdC9WTkYvaW1hZ2VzCisgIG1rZGlyIC1wIC9vcHQvVk5GLworICBsbiAtcyAvdmFyL2xpYi9saWJ2aXJ0L2ltYWdlcyAvb3B0L1ZORi9pbWFnZXMKKyAgY2hvd24gLVIgJHt1c2VyX25hbWV9Om5mdmdyb3VwIC9vcHQvVk5GCisgIGNob3duIC1SIHJvb3Q6bmZ2Z3JvdXAgL3Zhci9saWIvbGlidmlydC9pbWFnZXMKKyAgY2htb2QgZytyd3ggL3Zhci9saWIvbGlidmlydC9pbWFnZXMKKworICAjIFNlbGludXggbWFuYWdlbWVudAorICAjZWNobyAiY29uZmlndXJlICBTZWxpbnV4IG1hbmFnZW1lbnQiCisgICNzZW1hbmFnZSBmY29udGV4dCAtYSAtdCB2aXJ0X2ltYWdlX3QgIi9ob21lLyR7dXNlcl9uYW1lfS9WTkZfaW1hZ2VzKC8uKik/IgorICAjY2F0IC9ldGMvc2VsaW51eC90YXJnZXRlZC9jb250ZXh0cy9maWxlcy9maWxlX2NvbnRleHRzLmxvY2FsIHxncmVwIHZpcnRfaW1hZ2UKKyAgI3Jlc3RvcmVjb24gLVIgLXYgL2hvbWUvJHt1c2VyX25hbWV9L1ZORl9pbWFnZXMKK2Vsc2UKKyAgbWtkaXIgLXAgL29wdC9WTkYvaW1hZ2VzCisgIGNobW9kIG8rcnggL29wdC9WTkYvaW1hZ2VzCitmaQorCitlY2hvICJjcmVhdGluZyBsb2NhbCBpbmZvcm1hdGlvbiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbCIKK2VjaG8gIiNCeSBkZWZhdWx0IG9wZW52aW0gYXNzdW1lcyBjb250cm9sIHBsYW5lIGludGVyZmFjZSBuYW1pbmcgYXMgZW0xLGVtMixlbTMsZW00ICIgPiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorZWNobyAiI2FuZCBicmlkZ2UgaWZhY2VzIGFzIHZpcmJyTWFuMSwgdmlyYnJNYW4yLCAuLi4iID4+IC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCitlY2hvICIjaWYgY29tcHV0ZSBub2RlIGNvbnRhaW4gYSBkaWZmZXJlbnQgbmFtZSBpdCBtdXN0IGJlIGluZGljYXRlZCBpbiB0aGlzIGZpbGUiID4+IC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCitlY2hvICIjd2l0aCB0aGUgZm9ybWF0IGV4dGFuZGFyZC1uYW1lOiBjb21wdXRlLW5hbWUiID4+IC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCitpZiBbICIkaW50ZXJmYWNlIiAhPSAiIiAtYSAiJGludGVyZmFjZSIgIT0gImVtMSIgXQordGhlbgorICBlY2hvICJpZmFjZV9uYW1lczoiICA+PiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorICBlY2hvICIgIGVtMTogJHtpbnRlcmZhY2V9IiA+PiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorZmkKK2NobW9kIG8rciAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorCisjIGRlYWN0aXZhdGUgbWVtb3J5IG92ZXJjb21taXQKK2VjaG8gImRlYWN0aXZhdGUgbWVtb3J5IG92ZXJjb21taXQiCitzZXJ2aWNlIGtzbXR1bmVkIHN0b3AKK3NlcnZpY2Uga3NtIHN0b3AKK2Noa2NvbmZpZyBrc210dW5lZCBvZmYKK2Noa2NvbmZpZyBrc20gb2ZmCisKKworIyBMaWJ2aXJ0IG9wdGlvbnMgKHVuY29tbWVudCB0aGUgZm9sbG93aW5nKQorZWNobyAiY29uZmlndXJlIExpYnZpcnQgb3B0aW9ucyIKK3NlZCAtaSAncy8jdW5peF9zb2NrX2dyb3VwID0gImxpYnZpcnQiL3VuaXhfc29ja19ncm91cCA9ICJsaWJ2aXJ0Ii8nIC9ldGMvbGlidmlydC9saWJ2aXJ0ZC5jb25mCitzZWQgLWkgJ3MvI3VuaXhfc29ja19yd19wZXJtcyA9ICIwNzcwIi91bml4X3NvY2tfcndfcGVybXMgPSAiMDc3MCIvJyAvZXRjL2xpYnZpcnQvbGlidmlydGQuY29uZgorc2VkIC1pICdzLyN1bml4X3NvY2tfZGlyID0gIlwvdmFyXC9ydW5cL2xpYnZpcnQiL3VuaXhfc29ja19kaXIgPSAiXC92YXJcL3J1blwvbGlidmlydCIvJyAvZXRjL2xpYnZpcnQvbGlidmlydGQuY29uZgorc2VkIC1pICdzLyNhdXRoX3VuaXhfcncgPSAibm9uZSIvYXV0aF91bml4X3J3ID0gIm5vbmUiLycgL2V0Yy9saWJ2aXJ0L2xpYnZpcnRkLmNvbmYKKworI2NyZWF0aW5nIHRoZSBwb2xraXQgZ3JhbnQgYWNjZXNzIGZvciBsaWJ2aXJ0IHVzZXIuIAorI1RoaXMgZG9lcyBub3Qgd29yayAhISEhIHNvIGNvbW1lbnRlZC4gTm8gd2F5IHRvIGdldCBydW5uaW5nIHdpdGhvdXQgdW5jb21lbnRlZCB0aGUgYXV0aF91bml4X3J3ID0gIm5vbmUiIGxpbmUKKyMKKyNjYXQgPiAvZXRjL3BvbGtpdC0xL2xvY2FsYXV0aG9yaXR5LzUwLWxvY2FsLmQvNTAtb3JnLmV4YW1wbGUtbGlidmlydC1yZW1vdGUtYWNjZXNzLnBrbGEgPDwgRU9MCisjW2xpYnZpcnQgTWFuYWdlbWVudCBBY2Nlc3NdCisjIElkZW50aXR5PXVuaXgtdXNlcjpuMjt1bml4LXVzZXI6a2sKKyMgQWN0aW9uPW9yZy5saWJ2aXJ0LnVuaXgubWFuYWdlCisjIFJlc3VsdEFueT15ZXMKKyMgUmVzdWx0SW5hY3RpdmU9eWVzCisjIFJlc3VsdEFjdGl2ZT15ZXMKKyNFT0wKKworIyBDb25maWd1cmF0aW9uIGNoYW5nZSBvZiBxZW11IGZvciB0aGUgbnVtYXR1bmUgYnVnIGlzc3VlCisjIFJIRUw3LjE6IGZvciB0aGlzIHZlcnNpb24gc2hvdWxkIG5vdCBiZSBuZWNlc2FyeSAtIHRvIHJldmlzZQorI2lmICEgZ3JlcCAtcSAiY2dyb3VwX2NvbnRyb2xsZXJzID0gWyBcImNwdVwiLCBcImRldmljZXNcIiwgXCJtZW1vcnlcIiwgXCJibGtpb1wiLCBcImNwdWFjY3RcIiBdIiAvZXRjL2xpYnZpcnQvcWVtdS5jb25mCisjdGhlbgorI2NhdCAvZXRjL2xpYnZpcnQvcWVtdS5jb25mIHwgYXdrICd7cHJpbnQgJDB9KCQwfiIjY2dyb3VwX2NvbnRyb2xsZXJzIil7cHJpbnQgImNncm91cF9jb250cm9sbGVycyA9IFsgXCJjcHVcIiwgXCJkZXZpY2VzXCIsIFwibWVtb3J5XCIsIFwiYmxraW9cIiwgXCJjcHVhY2N0XCIgXSJ9JyA+IHRtcAorI212IHRtcCAvZXRjL2xpYnZpcnQvcWVtdS5jb25mCisjZmkKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgTkVUV09SSyBDT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworIyBOZXR3b3JrIGNvbmZpZyAoaWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgbmV0KQoraWYgWyAtbiAiJGludGVyZmFjZSIgXQordGhlbgorCisgICMgRGVhY3RpdmF0ZSBuZXR3b3JrIG1hbmFnZXIKKyAgc3lzdGVtY3RsIHN0b3AgTmV0d29ya01hbmFnZXIKKyAgc3lzdGVtY3RsIGRpc2FibGUgTmV0d29ya01hbmFnZXIKKworICAjIEZvciBtYW5hZ2VtZW50IGFuZCBkYXRhIGludGVyZmFjZXMKKyAgI3JtIC1mIC9ldGMvdWRldi9ydWxlcy5kL3BjaV9jb25maWcucnVsZXMgIyBpdCB3aWxsIGJlIGNyZWF0ZWQgdG8gZGVmaW5lIFZGcworCisgIHB1c2hkIC9ldGMvc3lzY29uZmlnL25ldHdvcmstc2NyaXB0cy8KKworICAjIFNldCBPTkJPT1Q9b24gYW5kIE1UVT05MDAwIG9uIHRoZSBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIGJyaWRnZXMKKyAgZWNobyAiY29uZmlndXJpbmcgaWZhY2UgJGludGVyZmFjZSIKKyAgY2F0IGlmY2ZnLSRpbnRlcmZhY2UgfCBncmVwIC1lIEhXQUREUiAtZSBVVUlEID4gJGludGVyZmFjZS50bXAKKyAgZWNobyAiVFlQRT1FdGhlcm5ldAorTkFNRT0kaW50ZXJmYWNlCitERVZJQ0U9JGludGVyZmFjZQorVFlQRT1FdGhlcm5ldAorT05CT09UPXllcworTk1fQ09OVFJPTExFRD1ubworTVRVPTkwMDAKK0JPT1RQUk9UTz1ub25lCitJUFY2SU5JVD1ubyIgPj4gJGludGVyZmFjZS50bXAKKyAgICBtdiAkaW50ZXJmYWNlLnRtcCAgaWZjZmctJGludGVyZmFjZQorCisgICMgTWFuYWdlbWVudCBpbnRlcmZhY2VzCisjICBpbnRlZ3JhdGVkX2ludGVyZmFjZXM9IiIKKyMgIG5iX2lmYWNlcz0wCisjICBmb3IgaWZhY2UgaW4gYGlmY29uZmlnIC1hIHwgZ3JlcCAiOlwgIiB8IGN1dCAtZiAxIC1kIjoifCBncmVwIC12ICJfIiB8IGdyZXAgLXYgIlwuIiB8IGdyZXAgLXYgImxvIiB8IHNvcnRgCisjICBkbyAKKyMgICAgZHJpdmVyPWBldGh0b29sIC1pICRpZmFjZXwgYXdrICcoJDB+ImRyaXZlciIpe3ByaW50ICQyfSdgCisjICAgIGlmIFsgJGRyaXZlciAhPSAiaXhnYmUiIF0gJiYgWyAkZHJpdmVyICE9ICJicmlkZ2UiIF0KKyMgICAgdGhlbgorIyAgICAgIGludGVncmF0ZWRfaW50ZXJmYWNlcz0iJGludGVncmF0ZWRfaW50ZXJmYWNlcyAkaWZhY2UiCisjICAgICAgbmJfaWZhY2VzPSQoKG5iX2lmYWNlcysxKSkKKyMgICAgICBldmFsIGlmYWNlJHtuYl9pZmFjZXN9PSRpZmFjZQorIyAgICBmaQorIyAgZG9uZQorCisgICNDcmVhdGUgaW5mcmFzdHJ1Y3R1cmUgYnJpZGdlLCBub3JtYWxseSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIGNvbXB1dGUgbm9kZXMsIG9wZW5mbG93IGNvbnRyb2xsZXIsIC4uLiAgCisgIGVjaG8gIkRFVklDRT12aXJiclZJTQorTkFNRT12aXJiclZJTQorVFlQRT1CcmlkZ2UKK09OQk9PVD15ZXMKK0RFTEFZPTAKK05NX0NPTlRST0xMRUQ9bm8KK01UVT05MDAwCitVU0VSQ1RMPW5vIiA+IGlmY2ZnLXZpcmJyVklNCitbWyAkaXBfaWZhY2UgIT0gImRoY3AiIF1dICYmIFtbICRpcF9pZmFjZSAhPSAiIiBdXSAmJiBlY2hvIC1lICJCT09UUFJPVE89c3RhdGljXG5JUEFERFI9JHtpcF9pZmFjZX1cbk5FVE1BU0s9MjU1LjI1NS4yNTUuMCIgPj4gaWZjZmctdmlyYnJWSU0KKworICAgICNDcmVhdGUgVkxBTiBmb3IgaW5mcmFzdHJ1Y3R1cmUgYnJpZGdlCisgICAgZWNobyAiREVWSUNFPSR7aW50ZXJmYWNlfS4xMTAwCitOQU1FPSR7aW50ZXJmYWNlfS4xMTAwCitPTkJPT1Q9eWVzCitOTV9DT05UUk9MTEVEPW5vCitVU0VSQ1RMPW5vCitWTEFOPXllcworTVRVPTkwMDAKK0JPT1RQUk9UTz1ub25lCitCUklER0U9dmlyYnJWSU0iID4gaWZjZmctJHtpbnRlcmZhY2V9LjExMDAKKworCisgICNDcmVhdGUgYnJpZGdlIGludGVyZmFjZXMKKyAgZWNobyAiQ3JlYXRpbmcgYnJpZGdlIGlmYWNlczogIgorICBmb3IgKChpPTE7aTw9MjA7aSsrKSkKKyAgZG8KKyAgICBpMmRpZ2l0cz0kaQorICAgIFsgJGkgLWx0IDEwIF0gJiYgaTJkaWdpdHM9IjAkaSIKKyAgICBlY2hvICIgICAgdmlyYnJNYW4kaSAgdmxhbiAyMCRpMmRpZ2l0cyIKKyAgICBlY2hvICJERVZJQ0U9dmlyYnJNYW4kaQorTkFNRT12aXJick1hbiRpCitUWVBFPUJyaWRnZQorT05CT09UPXllcworREVMQVk9MAorTk1fQ09OVFJPTExFRD1ubworTVRVPTkwMDAKK1VTRVJDVEw9bm8iID4gaWZjZmctdmlyYnJNYW4kaQorCisjV2l0aG91dCBJUDoKKyNCT09UUFJPVE89c3RhdGljCisjSVBBRERSPTEwLjEwLjEwLiQoKGkrMjA5KSkKKyNORVRNQVNLPTI1NS4yNTUuMjU1LjAiID4gaWZjZmctdmlyYnJNYW4kaQorCisgICAgIyBjcmVhdGUgdGhlIHJlcXVpcmVkIGludGVyZmFjZXMgdG8gY29ubmVjdCB0aGUgYnJpZGdlcworICAgIGVjaG8gIkRFVklDRT0ke2ludGVyZmFjZX0uMjAkaTJkaWdpdHMKK05BTUU9JHtpbnRlcmZhY2V9LjIwJGkyZGlnaXRzCitPTkJPT1Q9eWVzCitOTV9DT05UUk9MTEVEPW5vCitVU0VSQ1RMPW5vCitWTEFOPXllcworQk9PVFBST1RPPW5vbmUKK01UVT05MDAwCitCUklER0U9dmlyYnJNYW4kaSIgPiBpZmNmZy0ke2ludGVyZmFjZX0uMjAkaTJkaWdpdHMKKyAgZG9uZQorCisgIGlmYWNlPSRpbnRlcmZhY2UKKyAgaWYgWyAtbiAiJGlwX2lmYWNlIiBdCisgIHRoZW4KKyAgICBlY2hvICJjb25maWd1cmluZyBpZmFjZSAkaWZhY2UgaW50ZXJmYWNlIHdpdGggaXAgJGlwX2lmYWNlIgorICAgICMgTmV0d29yayBpbnRlcmZhY2VzCisgICAgIyAxR2JwcyBpbnRlcmZhY2VzIGFyZSBjb25maWd1cmVkIHdpdGggT05CT09UPXllcyBhbmQgc3RhdGljIElQIGFkZHJlc3MKKyAgICBjYXQgaWZjZmctJGlmYWNlIHwgZ3JlcCAtZSBIV0FERFIgLWUgVVVJRCA+ICRpZmFjZS50bXAKKyAgICBlY2hvICJUWVBFPUV0aGVybmV0CitOQU1FPSRpZmFjZQorREVWSUNFPSRpZmFjZQorVFlQRT1FdGhlcm5ldAorT05CT09UPXllcworTk1fQ09OVFJPTExFRD1ubworTVRVPTkwMDAKK0lQVjZJTklUPW5vIiA+PiAkaWZhY2UudG1wCisgICAgWyAkaXBfaWZhY2UgPSAiZGhjcCIgXSAmJiBlY2hvIC1lICJCT09UUFJPVE89ZGhjcFxuREhDUF9IT1NUTkFNRT0kSE9TVE5BTUUiID4+ICRpZmFjZS50bXAKKyAgICBbICRpcF9pZmFjZSAhPSAiZGhjcCIgXSAmJiBlY2hvIC1lICJCT09UUFJPVE89c3RhdGljXG5JUEFERFI9JHtpcF9pZmFjZX1cbk5FVE1BU0s9MjU1LjI1NS4yNTUuMCIgPj4gJGlmYWNlLnRtcAorICAgIG12ICRpZmFjZS50bXAgIGlmY2ZnLSRpZmFjZQorICBmaQorICAjIFNjcmlwdCB0byBjcmVhdGUgdmZzCisgIGVjaG8gIiMhL2Jpbi9iYXNoIiA+IC9yb290L2FjdGl2YXRlLXZmcy5zaAorICBjaG1vZCAreCAvcm9vdC9hY3RpdmF0ZS12ZnMuc2gKKyAgZm9yIGlmYWNlIGluIGBpZmNvbmZpZyAtYSB8IGdyZXAgIjogIiB8IGN1dCAtZiAxIC1kIjoiIHwgZ3JlcCAtdiAtZSAiXyIgLWUgIlwuIiAtZSAibG8iIC1lICJ2aXJiciIgLWUgInRhcCJgCisgIGRvCisgICAgIyAxMC80MCBHYnBzIGludGVyZmFjZXMKKyAgICAjIEludGVsIFg1MjAgY2FyZHM6IGRyaXZlciBpeGdiZQorICAgICMgSW50ZWwgWEw3MTAgRm9ydHZpbGxlIGNhcmRzOiBkcml2ZXIgaTQwZQorICAgIGRyaXZlcj1gZXRodG9vbCAtaSAkaWZhY2V8IGF3ayAnKCQwfiJkcml2ZXIiKXtwcmludCAkMn0nYAorICAgIGlmIFsgIiRkcml2ZXIiID0gImk0MGUiIC1vICIkZHJpdmVyIiA9ICJpeGdiZSIgXQorICAgIHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyaW5nIGRhdGFwbGFuZSBpZmFjZSAkaWZhY2UiCisgICAgICAKKyAgICAgICMgQ3JlYXRlIDggU1ItSU9WIHBlciBQRiBieSB1ZGV2IHJ1bGVzIG9ubHkgZm9yIEZvcnR2aWxsZSBjYXJkcyAoaTQwZSBkcml2ZXIpCisgICAgICBpZiBbICIkZHJpdmVyIiA9ICJpNDBlIiBdCisgICAgICB0aGVuCisgICAgICBwY2k9YGV0aHRvb2wgLWkgJGlmYWNlIHwgYXdrICcoJDB+ImJ1cy1pbmZvIil7cHJpbnQgJDJ9J2AKKyAgICAgICBlY2hvICJlY2hvIDggPiAvc3lzL2J1cy9wY2kvZGV2aWNlcy8kcGNpL3NyaW92X251bXZmcyIgPj4gL3Jvb3QvYWN0aXZhdGUtdmZzLnNoCisgICAgICBmaQorCisgICAgICAjIENvbmZpZ3VyZSBQRiB0byBib290IGF1dG9tYXRpY2FsbHkgYW5kIHRvIGhhdmUgYSBiaWcgTVRVCisgICAgICAjIDEwR2JwcyBpbnRlcmZhY2VzIGFyZSBjb25maWd1cmVkIHdpdGggT05CT09UPXllcyBhbmQgIE1UVT0yMDAwCisgICAgICBjYXQgaWZjZmctJGlmYWNlIHwgZ3JlcCAtZSBIV0FERFIgLWUgVVVJRCA+ICRpZmFjZS50bXAKKyAgICAgIGVjaG8gIlRZUEU9RXRoZXJuZXQKK05BTUU9JGlmYWNlCitERVZJQ0U9JGlmYWNlCitPTkJPT1Q9eWVzCitNVFU9OTAwMAorTk1fQ09OVFJPTExFRD1ubworSVBWNklOSVQ9bm8KK0JPT1RQUk9UTz1ub25lIiA+PiAkaWZhY2UudG1wCisgICAgICBtdiAkaWZhY2UudG1wIGlmY2ZnLSRpZmFjZQorICAgIGZpCisgIGRvbmUKKyAgcG9wZAorZmkKKyMgYWRkIGVudHJ5IGluIHJjLmxvY2FsIGZvciBhY3RpdmF0ZS12ZnMKK2dyZXAgLXEgJ3RvdWNoIC92YXIvbG9jay9zdWJzeXMvbG9jYWwnICcvZXRjL3JjLmQvcmMubG9jYWwnCitpZiBbWyAkPyA9PSAwIF1dCit0aGVuCisgIGVjaG8gIi9yb290L2FjdGl2YXRlLXZmcy5zaCIgPj4gL2V0Yy9yYy5sb2NhbAorZmkKKworCisKKyMgQWN0aXZhdGUgOCBWaXJ0dWFsIEZ1bmN0aW9ucyBwZXIgUEYgb24gTmlhbnRpYyBjYXJkcyAoaXhnYmUgZHJpdmVyKQoraWYgW1sgYGxzbW9kIHwgY3V0IC1kIiAiIC1mMSB8IGdyZXAgIml4Z2JlIiB8IGdyZXAgLXYgdmZgIF1dCit0aGVuCisJaWYgISBncmVwIC1xICJpeGdiZSIgL2V0Yy9tb2Rwcm9iZS5kL2l4Z2JlLmNvbmYKKwl0aGVuCisJZWNobyAib3B0aW9ucyBpeGdiZSBtYXhfdmZzPTgiID4+IC9ldGMvbW9kcHJvYmUuZC9peGdiZS5jb25mCisJZmkKKworZmkKKworIyBFeGVjdXRlcyBkcmFjdXQgdG8gbG9hZCBkcml2ZXJzIG9uIGJvb3QKK2VjaG8gIlJlZ2VuZXJhdGluZyBpbml0cmFtZnMiCitkcmFjdXQgLS1mb3JjZQorCisjIFRvIGRlZmluZSA4IFZGcyBwZXIgUEYgd2UgZG8gaXQgb24gcmMubG9jYWwsIGJlY2F1c2UgdGhlIGRyaXZlciBuZWVkcyB0byBiZSB1bmxvYWRlZCBhbmQgbG9hZGVkIGFnYWluCisjaWYgISBncmVwIC1xICJORlYiIC9ldGMvcmMubG9jYWwKKyN0aGVuCisjICBlY2hvICIiID4+IC9ldGMvcmMubG9jYWwKKyMgIGVjaG8gIiMgTkZWIiA+PiAvZXRjL3JjLmxvY2FsCisjICBlY2hvICJtb2Rwcm9iZSAtciBpeGdiZSIgPj4gL2V0Yy9yYy5sb2NhbAorIyAgZWNobyAibW9kcHJvYmUgaXhnYmUgbWF4X3Zmcz04IiA+PiAvZXRjL3JjLmxvY2FsCisjICBlY2hvICIiID4+IC9ldGMvcmMubG9jYWwKKworIyAgY2htb2QgK3ggL2V0Yy9yYy5kL3JjLmxvY2FsCisKKyNmaQorCitlY2hvIAorZWNobyAiRG8gbm90IGZvcmdldCB0byBjcmVhdGUgYSBzaGFyZWQgKE5GUywgU2FtYmEsIC4uLikgd2hlcmUgb3JpZ2luYWwgdmlydHVhbCBtYWNoaW5lIGltYWdlcyBhcmUgYWxsb2NhdGVkIgorZWNobworZWNobyAiRG8gbm90IGZvcmdldCB0byBjb3B5IHRoZSBwdWJsaWMgc3NoIGtleSBvZiBvcGVudmltIHVzZXIgaW50byAvaG9tZS8ke3VzZXJfbmFtZX0vLnNzaC9hdXRob3JpemVkX2tleXMgZm9yIGF1dGhvbWF0aWMgbG9naW4gZnJvbSBvcGVudmltIGNvbnRyb2xsZXIiCitlY2hvCisKK2VjaG8gIlJlYm9vdCB0aGUgc3lzdGVtIHRvIG1ha2UgdGhlIGNoYW5nZXMgZWZmZWN0aXZlIgorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvbmZpZ3VyZS1jb21wdXRlLW5vZGUtVUJVTlRVMTQuMDQuc2ggYi9zY3JpcHRzL2NvbmZpZ3VyZS1jb21wdXRlLW5vZGUtVUJVTlRVMTQuMDQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWQ3ZGFhNwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY29uZmlndXJlLWNvbXB1dGUtbm9kZS1VQlVOVFUxNC4wNC5zaApAQCAtMCwwICsxLDQ3OCBAQAorIyEvYmluL2Jhc2ggCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKyMgQXV0aG9yczogQW50b25pbyBMb3BleiwgUGFibG8gTW9udGVzLCBBbGZvbnNvIFRpZXJubworIyBKdW5lIDIwMTUKKworIyBQZXJzb25hbGl6ZSBSSEVMNy4xIG9uIGNvbXB1dGUgbm9kZXMKKyMgUHJlcGFyZWQgdG8gd29yayB3aXRoIHRoZSBmb2xsb3dpbmcgbmV0d29yayBjYXJkIGRyaXZlcnM6CisjIAl0ZzMsIGlnYiBkcml2ZXJzIGZvciBtYW5hZ2VtZW50IGludGVyZmFjZXMKKyMgCWl4Z2JlIChJbnRlbCBOaWFudGljKSBhbmQgaTQwZSAoSW50ZWwgRm9ydHZpbGxlKSBkcml2ZXJzIGZvciBkYXRhIHBsYW5lIGludGVyZmFjZXMKKworIyBUbyBkb3dubG9hZDoKKyMgd2dldCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbmZ2bGFicy9vcGVubWFuby9tYXN0ZXIvc2NyaXB0cy9jb25maWd1cmUtY29tcHV0ZS1ub2RlLVJIRUw3LjEuc2gKKyMgVG8gZXhlY3V0ZToKKyMgY2htb2QgK3ggLi9jb25maWd1cmUtY29tcHV0ZS1ub2RlLVJIRUw3LjEuc2gKKyMgc3VkbyAuL2NvbmZpZ3VyZS1jb21wdXRlLW5vZGUtUkhFTDcuMS5zaCA8dXNlcj4gPGlmYWNlPgorCisjIEFzc3VtcHRpb25zOgorIyBBbGwgdmlydHVhbGl6YXRpb24gb3B0aW9ucyBhY3RpdmF0ZWQgb24gQklPUyAodnQtZCwgdnQteCwgU1ItSU9WLCBubyBwb3dlciBzYXZpbmdzLi4uKQorIyBSSEVMNy4xIGluc3RhbGxlZCB3aXRob3V0IC9ob21lIHBhcnRpdGlvbiBhbmQgd2l0aCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIHNlbGVjdGlvbjoKKyMgQGJhc2UsIEBjb3JlLCBAZGV2ZWxvcG1lbnQsIEBuZXR3b3JrLWZpbGUtc3lzdGVtLWNsaWVudCwgQHZpcnR1YWxpemF0aW9uLWh5cGVydmlzb3IsIEB2aXJ0dWFsaXphdGlvbi1wbGF0Zm9ybSwgQHZpcnR1YWxpemF0aW9uLXRvb2xzCisKKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvIC1lICJVc2FnZTogc3VkbyAkMCBbLXldIDx1c2VyLW5hbWU+ICBbIDxpZmFjZS1uYW1lPiAgWzxpcC1hZGRyZXNzPnxkaGNwXSBdIgorICAgIGVjaG8gLWUgIiAgQ29uZmlndXJlIGNvbXB1dGUgaG9zdCBmb3IgVklNIHVzYWdlLiAodmVyc2lvbiAwLjQpLiBQYXJhbXM6IgorICAgIGVjaG8gLWUgIiAgICAgLXkgIGRvIG5vdCBwcm9tcHQgZm9yIGNvbmZpcm1hdGlvbi4gSWYgYSBuZXcgdXNlciBpcyBjcmVhdGVkLCB0aGUgdXNlciBuYW1lIGlzIHNldCBhcyBwYXNzd29yZCIKKyAgICBlY2hvIC1lICIgICAgIDx1c2VyLW5hbWU+IENyZWF0ZSBpZiBub3QgZXhpc3QgYW5kIGNvbmZpZ3VyZSB0aGlzIHVzZXIgZm9yIG9wZW52aW0gdG8gY29ubmVjdCIKKyAgICBlY2hvIC1lICIgICAgIDxpZmFjZS1uYW1lPiBpZiBzdXBsaWVkIGNyZWF0ZXMgYnJpZGdlIGludGVyZmFjZXMgb24gdGhpcyBpbnRlcmZhY2UsIG5lZWRlZCBmb3Igb3BlbnZpbSIKKyAgICBlY2hvIC1lICIgICAgIGlwIG9yIGRoY3AgaWYgc3VwbGllZCwgY29uZmlndXJlIHRoZSBpbnRlcmZhY2Ugd2l0aCB0aGlzIGlwIGFkZHJlc3MgKC8yNCkgb3IgJ2RoY3AnICIKK30KKworCisjMSBDSEVDSyBpbnB1dCBwYXJhbWV0ZXJzCisjMS4xIHJvb3QgcHJpdmlsZWdlcworWyAiJFVTRVIiICE9ICJyb290IiBdICYmIGVjaG8gIk5lZWRlZCByb290IHByaXZpbGVnZXMiICYmIHVzYWdlICYmIGV4aXQgLTEKKworIzEuMiBpbnB1dCBwYXJhbWV0ZXJzCitGT1JDRT0iIgord2hpbGUgZ2V0b3B0cyAieSIgbzsgZG8KKyAgICBjYXNlICIke299IiBpbgorICAgICAgICB5KQorICAgICAgICAgICAgRk9SQ0U9InllcyIKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICB1c2FnZQorICAgICAgICAgICAgZXhpdCAtMQorICAgICAgICAgICAgOzsKKyAgICBlc2FjCitkb25lCitzaGlmdCAkKChPUFRJTkQtMSkpCisKKworCitpZiBbICQjIC1sdCAxIF0gIAordGhlbgorICB1c2FnZQorICBleGl0CitmaQorCisKK3VzZXJfbmFtZT0kMQoraW50ZXJmYWNlPSQyCitpcF9pZmFjZT0kMworCitpZiBbIC1uICIkaW50ZXJmYWNlIiBdICYmICEgaWZjb25maWcgJGludGVyZmFjZSAmPiAvZGV2L251bGwKK3RoZW4KKyAgZWNobyAiRXJyb3I6IGludGVyZmFjZSAnJGludGVyZmFjZScgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN5c3RlbSIKKyAgdXNhZ2UKKyAgZXhpdCAxCitmaQorCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBJTlNUQUxMIE5FRURFRCBQQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKKyMgUmVxdWlyZWQgcGFja2FnZXMKK2FwdC1nZXQgLXkgdXBkYXRlCisjYXB0LWdldCAteSBpbnN0YWxsIGdydWItY29tbW9uIHNjcmVlbiB2aXJ0LW1hbmFnZXIgZXRodG9vbCBidWlsZC1lc3NlbnRpYWwgeDExLWNvbW1vbiB4MTEtdXRpbHMgeDExLWFwcHMgbGliZ3Vlc3Rmcy10b29scyBod2xvYyBsaWJndWVzdGZzLXRvb2xzIG51bWFjdGwgdmxhbiBuZnMtY29tbW9uIG5mcy1rZXJuZWwtc2VydmVyCithcHQtZ2V0IC15IGluc3RhbGwgZ3J1Yi1jb21tb24gc2NyZWVuIHZpcnQtbWFuYWdlciBldGh0b29sIGJ1aWxkLWVzc2VudGlhbCB4MTEtY29tbW9uIHgxMS11dGlscyBsaWJndWVzdGZzLXRvb2xzIGh3bG9jIGxpYmd1ZXN0ZnMtdG9vbHMgbnVtYWN0bCB2bGFuIG5mcy1jb21tb24gbmZzLWtlcm5lbC1zZXJ2ZXIKKworZWNobyAiUmVtb3ZlIHVubmVlZGVkIHBhY2thZ2VzLi4uLi4iCithcHQtZ2V0IC15IGF1dG9yZW1vdmUKKyMgU2VsaW51eCBtYW5hZ2VtZW50CisjeXVtIGluc3RhbGwgLXkgcG9saWN5Y29yZXV0aWxzLXB5dGhvbgorCisKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgSU5TVEFMTCBVU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCisjIEFkZCByZXF1aXJlZCBncm91cHMKK2dyb3VwYWRkIC1mIGFkbWluCitncm91cGFkZCAtZiBsaWJ2aXJ0ICAgI2ZvciBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyBtYXkgYmUgbGlidmlydGQKKworIyBBZGRzIHVzZXIsIGRlZmF1bHQgcGFzc3dvcmQgc2FtZSBhcyBuYW1lCitpZiBncmVwIC1xICJeJHt1c2VyX25hbWV9OiIgL2V0Yy9wYXNzd2QKK3RoZW4gCisgICN1c2VyIGV4aXN0LCBhZGQgdG8gZ3JvdXAKKyAgZWNobyAiYWRkaW5nIHVzZXIgJHt1c2VyX25hbWV9IHRvIGdyb3VwcyBsaWJ2aXJ0LGFkbWluIgorICB1c2VybW9kIC1hIC1HIGxpYnZpcnQsYWRtaW4gLWcgYWRtaW4gJHVzZXJfbmFtZQorZWxzZSAKKyAgI2NyZWF0ZSB1c2VyIGlmIGl0IGRvZXMgbm90IGV4aXN0CisgIFsgLXogIiRGT1JDRSIgXSAmJiByZWFkIC1wICJ1c2VyICcke3VzZXJfbmFtZX0nIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgKFkvbikiIGtrCisgIGlmICEgWyAteiAiJGtrIiAtbyAiJGtrIj0ieSIgLW8gIiRrayI9IlkiIF0KKyAgdGhlbgorICAgIGV4aXQKKyAgZmkKKyAgZWNobyAiY3JlYXRpbmcgYW5kIGNvbmZpZ3VyaW5nIHVzZXIgJHt1c2VyX25hbWV9IgorICB1c2VyYWRkIC1tIC1HIGxpYnZpcnQsYWRtaW4gLWcgYWRtaW4gJHVzZXJfbmFtZSAgICAgICAKKyAgI1Bhc3N3b3JkCisgIGlmIFsgLXogIiRGT1JDRSIgXSAKKyAgdGhlbiAKKyAgICAgZWNobyAiUHJvdmlkZSBhIHBhc3N3b3JkIGZvciAkdXNlcl9uYW1lIgorICAgICBwYXNzd2QgJHVzZXJfbmFtZQorICBlbHNlCisgICAgIGVjaG8gLWUgIiR1c2VyX25hbWVcbiR1c2VyX25hbWUiIHwgcGFzc3dkIC0tc3RkaW4gJHVzZXJfbmFtZQorICBmaQorZmkKKworIyBBbGxvdyBhZG1pbiB1c2VycyB0byBhY2Nlc3Mgd2l0aG91dCBwYXNzd29yZAoraWYgISBncmVwIC1xICIjb3Blbm1hbm8iIC9ldGMvc3Vkb2VycwordGhlbgorICAgIGNhdCA+PiAvaG9tZS8ke3VzZXJfbmFtZX0vc2NyaXB0X3Zpc3Vkby5zaCA8PCBFT0wKKyMhL2Jpbi9iYXNoCitjYXQgXCQxIHwgYXdrICcoXCQwfiJyZXF1aXJldHR5Iil7cHJpbnQgIiMiXCQwfShcJDAhfiJyZXF1aXJldHR5Iil7cHJpbnQgXCQwfScgPiB0bXAKK2NhdCB0bXAgPiBcJDEKK3JtIHRtcAorZWNobyAiIiA+PiBcJDEKK2VjaG8gIiNvcGVubWFubyBhbGxvdyB0byBncm91cCBhZG1pbiB0byBncmFudCByb290IHByaXZpbGVnZXMgd2l0aG91dCBwYXNzd29yZCIgPj4gXCQxCitlY2hvICIlYWRtaW4gQUxMPShBTEwpIE5PUEFTU1dEOiBBTEwiID4+IFwkMQorRU9MCisgICAgY2htb2QgK3ggL2hvbWUvJHt1c2VyX25hbWV9L3NjcmlwdF92aXN1ZG8uc2gKKyAgICBlY2hvICJhbGxvd2luZyBhZG1pbiB1c2VyIHRvIGdldCByb290IHByaXZpbGVnZXMgd2l0aHV0IHBhc3N3b3JkIgorICAgIGV4cG9ydCBFRElUT1I9L2hvbWUvJHt1c2VyX25hbWV9L3NjcmlwdF92aXN1ZG8uc2ggJiYgc3VkbyAtRSB2aXN1ZG8KKyAgICBybSAtZiAvaG9tZS8ke3VzZXJfbmFtZX0vc2NyaXB0X3Zpc3Vkby5zaAorZmkKKworCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBJTlNUQUxMIEhVR0VQQUdFUyBJU09MQ1BVUyBHUlVCICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKKyMgSHVnZSBwYWdlcyAxRyBhdXRvIG1vdW50Citta2RpciAtcCAvbW50L2h1Z2UKK2lmICEgZ3JlcCAtcSAiSHVnZSBwYWdlcyIgL2V0Yy9mc3RhYgordGhlbgorICBlY2hvICIiID4+IC9ldGMvZnN0YWIKKyAgZWNobyAiIyBIdWdlIHBhZ2VzIiA+PiAvZXRjL2ZzdGFiCisgIGVjaG8gIm5vZGV2IC9tbnQvaHVnZSBodWdldGxiZnMgcGFnZXNpemU9MUdCIDAgMCIgPj4gL2V0Yy9mc3RhYgorICBlY2hvICIiID4+IC9ldGMvZnN0YWIKK2ZpCisKKyMgR3J1YiB2aXJ0dWFsaXphdGlvbiBvcHRpb25zOgorCisjIEdldCBpc29sY3B1cworaXNvbGNwdXM9YGdhd2sgJ0JFR0lOe3ByZT0tMjt9CisgICgkMT09InByb2Nlc3NvciIpe3Bybz0kMzt9CisgICgkMT09ImNvcmUiICYmICQ0IT0wKXsKKyAgICAgaWYgKHByZSsxPT1wcm8pe2VuZHJhbmdlPSItIiBwcm99CisgICAgIGVsc2V7Y3B1cz1jcHVzIGVuZHJhbmdlIHNlcCBwcm87IHNlcD0iLCI7IGVuZHJhbmdlPSIiO307CisgICAgIHByZT1wcm87fQorICBFTkR7cHJpbnRmKCIlcyIsY3B1cyBlbmRyYW5nZSk7fScgL3Byb2MvY3B1aW5mb2AKKworCitlY2hvICJDUFVTOiAkaXNvbGNwdXMiCisKKyMgSHVnZSBwYWdlcyByZXNlcnZhdGlvbiBmaWxlOiByZXNlcnZpbmcgYWxsIG1lbW9yeSBhcGFydCBmcm9tIDRHQiBwZXIgTlVNQSBub2RlCisjIEdldCB0aGUgbnVtYmVyIG9mIGh1Z2VwYWdlczogYWxsIG1lbW9yeSBidXQgOEdCIHJlc2VydmVkIGZvciB0aGUgT1MKKyN0b3RhbG1lbT1gZG1pZGVjb2RlIC0tdHlwZSAxN3xncmVwIFNpemUgfGdyZXAgTUIgfGdhd2sgJ3tzdW1hKz0kMn0gRU5EIHtwcmludCBzdW1hLzEwMjR9J2AKKyNodWdlcGFnZXM9JCgoJHRvdGFsbWVtLTgpKQorCitpZiAhIFsgLWYgL3Vzci9saWIvc3lzdGVtZC9odWdldGxiLXJlc2VydmUtcGFnZXMgXQordGhlbgorICBjYXQgPiAvdXNyL2xpYi9zeXN0ZW1kL2h1Z2V0bGItcmVzZXJ2ZS1wYWdlcyA8PCBFT0wKKyMhL2Jpbi9iYXNoCitub2Rlc19wYXRoPS9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS8KK2lmIFsgISAtZCBcJG5vZGVzX3BhdGggXTsgdGhlbgorICAgICAgICBlY2hvICJFUlJPUjogXCRub2Rlc19wYXRoIGRvZXMgbm90IGV4aXN0IgorICAgICAgICBleGl0IDEKK2ZpCisKK3Jlc2VydmVfcGFnZXMoKQoreworICAgICAgICBlY2hvIFwkMSA+IFwkbm9kZXNfcGF0aC9cJDIvaHVnZXBhZ2VzL2h1Z2VwYWdlcy0xMDQ4NTc2a0IvbnJfaHVnZXBhZ2VzCit9CisKKyMgVGhpcyBleGFtcGxlIHJlc2VydmVzIGFsbCBhdmFpbGFibGUgbWVtb3J5IGFwYXJ0IGZyb20gNCBHQiBmb3IgbGludXgKKyMgdXNpbmcgMUdCIHNpemUuIFlvdSBjYW4gbW9kaWZ5IGl0IHRvIHlvdXIgbmVlZHMgb3IgY29tbWVudCB0aGUgbGluZXMKKyMgdG8gYXZvaWQgcmVzZXJ2ZSBtZW1vcnkgaW4gYSBudW1hIG5vZGUKK0VPTAorICBmb3IgZiBpbiAvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZT8vbWVtaW5mbworICBkbworICAgIG5vZGU9YGhlYWQgLW4xICRmIHwgZ2F3ayAnKCQ1PT0ia0IiKXtwcmludCAkMn0nYAorICAgIG1lbW9yeT1gaGVhZCAtbjEgJGYgfCBnYXdrICcoJDU9PSJrQiIpe3ByaW50ICQ0fSdgCisgICAgbWVtb3J5PSQoKG1lbW9yeSsxMDQ4NTc2LTEpKSAgICNtZW1vcnkgbXVzdCBiZSBjZWlsZWQgIAorICAgIG1lbW9yeT0kKChtZW1vcnkvMTA0ODU3NikpICAgI2Zyb20gYGtCIHRvIEdCIAorICAgICNpZiBtZW1vcnkgCisgICAgWyAkbWVtb3J5IC1ndCA0IF0gJiYgZWNobyAicmVzZXJ2ZV9wYWdlcyAkKChtZW1vcnktNCkpIG5vZGUkbm9kZSIgPj4gL3Vzci9saWIvc3lzdGVtZC9odWdldGxiLXJlc2VydmUtcGFnZXMKKyAgZG9uZQorCisgICMgUnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdG8gZW5hYmxlIGh1Z2UgcGFnZXMgZWFybHkgYm9vdCByZXNlcnZhdGlvbjoKKyAgY2htb2QgK3ggL3Vzci9saWIvc3lzdGVtZC9odWdldGxiLXJlc2VydmUtcGFnZXMKKyAgc3lzdGVtY3RsIGVuYWJsZSBodWdldGxiLWdpZ2FudGljLXBhZ2VzCitmaQorCisjIFByZXBhcmVzIHRoZSB0ZXh0IHRvIGFkZCBhdCB0aGUgZW5kIG9mIHRoZSBncnViIGxpbmUsIGluY2x1ZGluZyBibGFja2xpc3RpbmcgaXhnYmV2ZiBkcml2ZXIgaW4gdGhlIGhvc3QKK21lbXRvdGFsPWBncmVwIE1lbVRvdGFsIC9wcm9jL21lbWluZm8gfCBhd2sgJ3sgcHJpbnQgJDIgfScgYAoraHBhZ2VzPSQoKCAoJG1lbXRvdGFsLygxMDI0KjEwMjQpKS04ICkpCisKK21lbXRvdGFsPSQoKG1lbXRvdGFsKzEwNDg1NzYtMSkpICAgI21lbW9yeSBtdXN0IGJlIGNlaWxlZAorbWVtdG90YWw9JCgobWVtdG90YWwvMTA0ODU3NikpICAgI2Zyb20gYGtCIHRvIEdCYQoraHBhZ2VzPSQoKG1lbXRvdGFsLTgpKQorW1sgJGhwYWdlcyAtbHQgMCBdXSAkJCBocGFnZXM9MAorCisKK2VjaG8gIi0tLS0tLT4gbWVtdG90YWw6ICRtZW10b3RhbCIKKwordGV4dG9rZXJuZWw9ImludGVsX2lvbW11PW9uIGRlZmF1bHRfaHVnZXBhZ2Vzej0xRyBodWdlcGFnZXN6PTFHIGh1Z2VwYWdlcz0kaHBhZ2VzIGlzb2xjcHVzPSRpc29sY3B1cyBtb2Rwcm9iZS5ibGFja2xpc3Q9aXhnYmV2ZiBtb2Rwcm9iZS5ibGFja2xpc3Q9aTQwZXZmIiAgCisKK2VjaG8gIlRleHQgdG8ga2VybmVsOiAkdGV4dG9rZXJuZWwiCisKKworIyBBZGQgdGV4dCB0byB0aGUga2VybmVsIGxpbmUKK2lmICEgZ3JlcCAtcSAiaW50ZWxfaW9tbXU9b24gZGVmYXVsdF9odWdlcGFnZXN6PTFHIGh1Z2VwYWdlc3o9MUciIC9ldGMvZGVmYXVsdC9ncnViCit0aGVuCisgIGVjaG8gIj4+Pj4+Pj4gIGFkZGluZyBjbWRsaW5lICR7dGV4dG9rZXJuZWx9IgorICBzZWQgLWkgIi9eR1JVQl9DTURMSU5FX0xJTlVYX0RFRkFVTFQ9L3MvXCJcJC8ke3RleHRva2VybmVsfVwiLyIgL2V0Yy9kZWZhdWx0L2dydWIKKyAgIyBncnViMiB1cGdyYWRlCisgICNncnViMi1ta2NvbmZpZyAtbyAvYm9vdC9ncnViMi9ncnViLmNmZworICB1cGRhdGUtZ3J1YgorZmkKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgT1RIRVIgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCisjIExpbmtzIHRoZSBPcGVuTUFOTyByZXF1aXJlZCBmb2xkZXIgL29wdC9WTkYvaW1hZ2VzIHRvIC92YXIvbGliL2xpYnZpcnQvaW1hZ2VzLiBUaGUgT1MgaW5zdGFsbGF0aW9uCisjIHNob3VsZCBoYXZlIG9ubHkgYSAvIHBhcnRpdGlvbiB3aXRoIGFsbCBwb3NzaWJsZSBzcGFjZSBhdmFpbGFibGUKKworZWNobyAiIGxpbmsgL29wdC9WTkYvaW1hZ2VzIHRvIC92YXIvbGliL2xpYnZpcnQvaW1hZ2VzIgoraWYgWyAiJHVzZXJfbmFtZSIgIT0gIiIgXQordGhlbgorICAjbWtkaXIgLXAgL2hvbWUvJHt1c2VyX25hbWV9L1ZORl9pbWFnZXMKKyAgI2Nob3duIC1SICR7dXNlcl9uYW1lfTphZG1pbiAvaG9tZS8ke3VzZXJfbmFtZX0vVk5GX2ltYWdlcworICAjY2htb2QgZ28reCAkSE9NRQorCisgICMgVGhlIG9yY2hlc3RhdG9yIG5lZWRzIHRvIGxpbmsgdGhlIGltYWdlcyBmb2xkZXIgCisgIHJtIC1mIC9vcHQvVk5GL2ltYWdlcworICBta2RpciAtcCAvb3B0L1ZORi8KKyAgbG4gLXMgL3Zhci9saWIvbGlidmlydC9pbWFnZXMgL29wdC9WTkYvaW1hZ2VzCisgIGNob3duIC1SICR7dXNlcl9uYW1lfTphZG1pbiAvb3B0L1ZORgorICBjaG93biAtUiByb290OmFkbWluIC92YXIvbGliL2xpYnZpcnQvaW1hZ2VzCisgIGNobW9kIGcrcnd4IC92YXIvbGliL2xpYnZpcnQvaW1hZ2VzCisKKyAgIyBTZWxpbnV4IG1hbmFnZW1lbnQKKyAgI2VjaG8gImNvbmZpZ3VyZSAgU2VsaW51eCBtYW5hZ2VtZW50IgorICAjc2VtYW5hZ2UgZmNvbnRleHQgLWEgLXQgdmlydF9pbWFnZV90ICIvaG9tZS8ke3VzZXJfbmFtZX0vVk5GX2ltYWdlcygvLiopPyIKKyAgI2NhdCAvZXRjL3NlbGludXgvdGFyZ2V0ZWQvY29udGV4dHMvZmlsZXMvZmlsZV9jb250ZXh0cy5sb2NhbCB8Z3JlcCB2aXJ0X2ltYWdlCisgICNyZXN0b3JlY29uIC1SIC12IC9ob21lLyR7dXNlcl9uYW1lfS9WTkZfaW1hZ2VzCitlbHNlCisgIG1rZGlyIC1wIC9vcHQvVk5GL2ltYWdlcworICBjaG1vZCBvK3J4IC9vcHQvVk5GL2ltYWdlcworZmkKKworZWNobyAiY3JlYXRpbmcgbG9jYWwgaW5mb3JtYXRpb24gL29wdC9WTkYvaW1hZ2VzL2hvc3RpbmZvLnlhbWwiCitlY2hvICIjQnkgZGVmYXVsdCBvcGVudmltIGFzc3VtZXMgY29udHJvbCBwbGFuZSBpbnRlcmZhY2UgbmFtaW5nIGFzIGVtMSxlbTIsZW0zLGVtNCAiID4gL29wdC9WTkYvaW1hZ2VzL2hvc3RpbmZvLnlhbWwKK2VjaG8gIiNhbmQgYnJpZGdlIGlmYWNlcyBhcyB2aXJick1hbjEsIHZpcmJyTWFuMiwgLi4uIiA+PiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorZWNobyAiI2lmIGNvbXB1dGUgbm9kZSBjb250YWluIGEgZGlmZmVyZW50IG5hbWUgaXQgbXVzdCBiZSBpbmRpY2F0ZWQgaW4gdGhpcyBmaWxlIiA+PiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorZWNobyAiI3dpdGggdGhlIGZvcm1hdCBleHRhbmRhcmQtbmFtZTogY29tcHV0ZS1uYW1lIiA+PiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAoraWYgWyAiJGludGVyZmFjZSIgIT0gIiIgLWEgIiRpbnRlcmZhY2UiICE9ICJlbTEiIF0KK3RoZW4KKyAgZWNobyAiaWZhY2VfbmFtZXM6IiAgPj4gL29wdC9WTkYvaW1hZ2VzL2hvc3RpbmZvLnlhbWwKKyAgZWNobyAiICBlbTE6ICR7aW50ZXJmYWNlfSIgPj4gL29wdC9WTkYvaW1hZ2VzL2hvc3RpbmZvLnlhbWwKK2ZpCitjaG1vZCBvK3IgL29wdC9WTkYvaW1hZ2VzL2hvc3RpbmZvLnlhbWwKKworIyBkZWFjdGl2YXRlIG1lbW9yeSBvdmVyY29tbWl0CisjZWNobyAiZGVhY3RpdmF0ZSBtZW1vcnkgb3ZlcmNvbW1pdCIKKyNzZXJ2aWNlIGtzbXR1bmVkIHN0b3AKKyNzZXJ2aWNlIGtzbSBzdG9wCisjY2hrY29uZmlnIGtzbXR1bmVkIG9mZgorI2Noa2NvbmZpZyBrc20gb2ZmCisKKworIyBMaWJ2aXJ0IG9wdGlvbnMgKHVuY29tbWVudCB0aGUgZm9sbG93aW5nKQorZWNobyAiY29uZmlndXJlIExpYnZpcnQgb3B0aW9ucyIKK3NlZCAtaSAncy8jdW5peF9zb2NrX2dyb3VwID0gImxpYnZpcnQiL3VuaXhfc29ja19ncm91cCA9ICJsaWJ2aXJ0Ii8nIC9ldGMvbGlidmlydC9saWJ2aXJ0ZC5jb25mCitzZWQgLWkgJ3MvI3VuaXhfc29ja19yd19wZXJtcyA9ICIwNzcwIi91bml4X3NvY2tfcndfcGVybXMgPSAiMDc3MCIvJyAvZXRjL2xpYnZpcnQvbGlidmlydGQuY29uZgorc2VkIC1pICdzLyN1bml4X3NvY2tfZGlyID0gIlwvdmFyXC9ydW5cL2xpYnZpcnQiL3VuaXhfc29ja19kaXIgPSAiXC92YXJcL3J1blwvbGlidmlydCIvJyAvZXRjL2xpYnZpcnQvbGlidmlydGQuY29uZgorc2VkIC1pICdzLyNhdXRoX3VuaXhfcncgPSAibm9uZSIvYXV0aF91bml4X3J3ID0gIm5vbmUiLycgL2V0Yy9saWJ2aXJ0L2xpYnZpcnRkLmNvbmYKKworCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBORVRXT1JLIENPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisjIE5ldHdvcmsgY29uZmlnIChpZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBuZXQpCitlY2hvICJJbnRlcmZhY2UgPT0+ICRpbnRlcmZhY2UiCitpZiBbIC1uICIkaW50ZXJmYWNlIiBdCit0aGVuCisKKworICAjIEZvciBtYW5hZ2VtZW50IGFuZCBkYXRhIGludGVyZmFjZXMKKyAgcm0gLWYgL2V0Yy91ZGV2L3J1bGVzLmQvcGNpX2NvbmZpZy5ydWxlcyAjIGl0IHdpbGwgYmUgY3JlYXRlZCB0byBkZWZpbmUgVkZzCisKKworICAjIFNldCBPTkJPT1Q9b24gYW5kIE1UVT05MDAwIG9uIHRoZSBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIGJyaWRnZXMKKyAgZWNobyAiY29uZmlndXJpbmcgaWZhY2UgJGludGVyZmFjZSIKKworI01UVSBmb3IgaW50ZXJmYWNlcyBhbmQgYnJpZGdlcworTVRVPTkwMDAKKworY3AgL2V0Yy9uZXR3b3JrL2ludGVyZmFjZXMgaW50ZXJmYWNlcy50bXAKKworCisgICNDcmVhdGUgaW5mcmFzdHJ1Y3R1cmUgYnJpZGdlLCBub3JtYWxseSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIGNvbXB1dGUgbm9kZXMsIG9wZW5mbG93IGNvbnRyb2xsZXIsIC4uLiAgCisKKworICAgICNDcmVhdGUgVkxBTiBmb3IgaW5mcmFzdHJ1Y3R1cmUgYnJpZGdlCisKKyBlY2hvICIKKyMjIyMjIyMjIyBDVVRMSU5FICMjIyMjIyMjIworCithdXRvICR7aW50ZXJmYWNlfQoraWZhY2UgJHtpbnRlcmZhY2V9IGluZXQgc3RhdGljCisJbXR1ICRNVFUKKworYXV0byAke2ludGVyZmFjZX0uMTAwMQoraWZhY2UgJHtpbnRlcmZhY2V9LjEwMDEgaW5ldCBzdGF0aWMKKwltdHUgJE1UVQorIiA+PiBpbnRlcmZhY2VzLnRtcAorCisgZWNobyAiaWZjb25maWcgJHtpbnRlcmZhY2V9IG10dSAkTVRVCisgaWZjb25maWcgJHtpbnRlcmZhY2V9IHVwCisiID4gbXR1LnRtcAorCisKKyAgI0NyZWF0ZSBicmlkZ2UgaW50ZXJmYWNlcworICBlY2hvICJDcmVhdGluZyBicmlkZ2UgaWZhY2VzOiAiCisgIGZvciAoKGk9MTtpPD0yMDtpKyspKQorICBkbworICAgIGkyZGlnaXRzPSRpCisgICAgWyAkaSAtbHQgMTAgXSAmJiBpMmRpZ2l0cz0iMCRpIgorICAgIGVjaG8gIiAgICB2aXJick1hbiRpICB2bGFuIDIwJGkyZGlnaXRzIgorCisgICAgaj0kaQorCisgZWNobyAiCithdXRvICR7aW50ZXJmYWNlfS4yMCRpMmRpZ2l0cworaWZhY2UgJHtpbnRlcmZhY2V9LjIwJGkyZGlnaXRzIGluZXQgc3RhdGljCisJbXR1ICRNVFUKKworYXV0byB2aXJick1hbiRqCitpZmFjZSB2aXJick1hbiRqIGluZXQgc3RhdGljCisJYnJpZGdlX3BvcnRzICR7aW50ZXJmYWNlfS4yMCRpMmRpZ2l0cworCW10dSAkTVRVCisiID4+IGludGVyZmFjZXMudG1wCisKKyBlY2hvICJpZmNvbmZpZyAke2ludGVyZmFjZX0uMjAkaTJkaWdpdHMgbXR1ICRNVFUKK2lmY29uZmlnIHZpcmJyTWFuJGogbXR1ICRNVFUKK2lmY29uZmlnIHZpcmJyTWFuJGogdXAKKyIgPj4gbXR1LnRtcAorCisgIGRvbmUKKworIGVjaG8gIgorYXV0byBlbTIuMTAwMQoraWZhY2UgZW0yLjEwMDEgaW5ldCBzdGF0aWMKKworYXV0byB2aXJickluZgoraWZhY2UgdmlyYnJJbmYgaW5ldCBzdGF0aWMKKwlicmlkZ2VfcG9ydHMgZW0yLjEwMDEKKyIgPj4gaW50ZXJmYWNlcy50bXAKKworIGVjaG8gImlmY29uZmlnIGVtMi4xMDAxIG10dSAkTVRVCitpZmNvbmZpZyB2aXJickluZiBtdHUgJE1UVQoraWZjb25maWcgdmlyYnJJbmYgdXAKKyIgPj4gbXR1LnRtcAorCitpZiAhIGdyZXAgLXEgIiMjIyMgQ1VUTElORSAjIyMjIiAvZXRjL25ldHdvcmsvaW50ZXJmYWNlcwordGhlbgorCWVjaG8gIj09PT09PSBDb3B5aW5nIGludGVyZmFjZXMudG1wIHRvIC9ldGMvbmV0d29yay9pbnRlcmZhY2VzIgorCWNwIGludGVyZmFjZXMudG1wIC9ldGMvbmV0d29yay9pbnRlcmZhY2VzCitmaQorCisKKyAgI3BvcGQKK2ZpCisKKworIyBBY3RpdmF0ZSA4IFZpcnR1YWwgRnVuY3Rpb25zIHBlciBQRiBvbiBOaWFudGljIGNhcmRzIChpeGdiZSBkcml2ZXIpCitpZiBbWyBgbHNtb2QgfCBjdXQgLWQiICIgLWYxIHwgZ3JlcCAiaXhnYmUiIHwgZ3JlcCAtdiB2ZmAgXV0KK3RoZW4KKwlpZiAhIGdyZXAgLXEgIml4Z2JlIiAvZXRjL21vZHByb2JlLmQvaXhnYmUuY29uZgorCXRoZW4KKwllY2hvICJvcHRpb25zIGl4Z2JlIG1heF92ZnM9OCIgPj4gL2V0Yy9tb2Rwcm9iZS5kL2l4Z2JlLmNvbmYKKwlmaQorCitmaQorCisjIFNldCBkYXRhcGxhbmUgTVRVCisKK2VjaG8gInNsZWVwIDEwIiA+PiBtdHUudG1wCisKK2ludGVyZmFjZXM9YGlmY29uZmlnIC1hIHwgZ3JlcCBecCB8IGN1dCAtZCAiICIgLWYgMWAKK2ZvciBwaCBpbiAkaW50ZXJmYWNlcworZG8KKyAgICAgICAgZWNobyAiaWZjb25maWcgJHBoIG10dSAkTVRVIiA+PiBtdHUudG1wCisgICAgICAgIGVjaG8gImlmY29uZmlnICRwaCB1cCIgPj4gbXR1LnRtcAorZG9uZQorCisKKworY3AgbXR1LnRtcCAvZXRjL3NldG10dS5zaAorY2htb2QgK3ggL2V0Yy9zZXRtdHUuc2gKKworIyBUbyBkZWZpbmUgOCBWRnMgcGVyIFBGIHdlIGRvIGl0IG9uIHJjLmxvY2FsLCBiZWNhdXNlIHRoZSBkcml2ZXIgbmVlZHMgdG8gYmUgdW5sb2FkZWQgYW5kIGxvYWRlZCBhZ2FpbgorI2lmICEgZ3JlcCAtcSAiTkZWIiAvZXRjL3JjLmxvY2FsCisjdGhlbgorICBlY2hvICIjIS9iaW4vc2ggLWUKKyIgPiAvZXRjL3JjLmxvY2FsCisgIGVjaG8gIiMgTkZWIiA+PiAvZXRjL3JjLmxvY2FsCisgIGVjaG8gIm1vZHByb2JlIC1yIGl4Z2JlIiA+PiAvZXRjL3JjLmxvY2FsCisgIGVjaG8gIm1vZHByb2JlIGl4Z2JlIG1heF92ZnM9OCIgPj4gL2V0Yy9yYy5sb2NhbAorICBlY2hvICIvZXRjL3NldG10dS5zaCIgPj4gL2V0Yy9yYy5sb2NhbAorICBlY2hvICIKK2V4aXQgMCIgPj4gL2V0Yy9yYy5sb2NhbAorICBlY2hvICIiID4+IC9ldGMvcmMubG9jYWwKKworICBjaG1vZCAreCAvZXRjL3JjLmQvcmMubG9jYWwKKworI2ZpCisKK2NobW9kIGErcnd4IC92YXIvbGliL2xpYnZpcnQvaW1hZ2VzCitta2RpciAvdXNyL2xpYmV4ZWMvCitwdXNoZCAvdXNyL2xpYmV4ZWMvCitsbiAtcyAvdXNyL2Jpbi9xZW11LXN5c3RlbS14ODZfNjQgcWVtdS1rdm0KK3BvcGQKKworI0RlYWN0aXZhdGluZyBhcHBhcm1vciB3aGlsZSBsb29raW5nIGZvciBhIGJldHRlciBzb2x1dGlvbgorL2V0Yy9pbml0LmQvYXBwYXJtb3Igc3RvcAordXBkYXRlLXJjLmQgLWYgYXBwYXJtb3IgcmVtb3ZlCisKK2VjaG8gCitlY2hvICJEbyBub3QgZm9yZ2V0IHRvIGNyZWF0ZSBhIHNoYXJlZCAoTkZTLCBTYW1iYSwgLi4uKSB3aGVyZSBvcmlnaW5hbCB2aXJ0dWFsIG1hY2hpbmUgaW1hZ2VzIGFyZSBhbGxvY2F0ZWQiCitlY2hvCitlY2hvICJEbyBub3QgZm9yZ2V0IHRvIGNvcHkgdGhlIHB1YmxpYyBzc2gga2V5IGludG8gL2hvbWUvJHt1c2VyX25hbWV9Ly5zc2gvYXV0aG9yaXplZF9rZXlzIGZvciBhdXRob21hdGljIGxvZ2luIGZyb20gb3BlbnZpbSBjb250cm9sbGVyIgorZWNobworCitlY2hvICJSZWJvb3QgdGhlIHN5c3RlbSB0byBtYWtlIHRoZSBjaGFuZ2VzIGVmZmVjdGl2ZSIKKworCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvbmZpZ3VyZS1jb21wdXRlLW5vZGUtZGV2ZWxvcC5zaCBiL3NjcmlwdHMvY29uZmlndXJlLWNvbXB1dGUtbm9kZS1kZXZlbG9wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMzNzg0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NvbmZpZ3VyZS1jb21wdXRlLW5vZGUtZGV2ZWxvcC5zaApAQCAtMCwwICsxLDI1MiBAQAorIyEvYmluL2Jhc2ggCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKyMgdjEuMDogMjAxNSBKdW5lIAorIyBBdXRob3JzOiBBbnRvbmlvIExvcGV6LCBQYWJsbyBNb250ZXMsIEFsZm9uc28gVGllcm5vCisKKyMgUGVyc29uYWxpemUgUkhFTDcvQ0VOVE9TIGNvbXB1dGUgbm9kZXMgZm9yIHVzaW5nIG9wZW52aW0gaW4gJ2RldmVsb3BtZW50JyBtb2RlOiAKKyMgICBub3QgdXNpbmcgaHVnZSBwYWdlcyBuZWl0aGVyIGlzb2xjcHVzCisKKyMgVG8gZG93bmxvYWQ6CisjIHdnZXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL25mdmxhYnMvb3Blbm1hbm8vbWFzdGVyL3NjcmlwdHMvY29uZmlndXJlLWNvbXB1dGUtbm9kZS1kZXZlbG9wLnNoCisjIFRvIGV4ZWN1dGU6CisjIGNobW9kICt4IC4vY29uZmlndXJlLWNvbXB1dGUtbm9kZS1kZXZlbG9wLnNoCisjIHN1ZG8gLi9jb25maWd1cmUtY29tcHV0ZS1ub2RlLWRldmVsb3Auc2ggPHVzZXI+IDxpZmFjZT4KKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvIC1lICJVc2FnZTogc3VkbyAkMCBbLXldIDx1c2VyLW5hbWU+ICBbIDxpZmFjZS1uYW1lPiAgWzxpcC1hZGRyZXNzPnxkaGNwXSBdIgorICAgIGVjaG8gLWUgIiAgQ29uZmlndXJlIGNvbXB1dGUgaG9zdCBmb3IgVklNIHVzYWdlIGluIG1vZGUgJ2RldmVsb3BtZW50Jy4gUGFyYW1zOiIKKyAgICBlY2hvIC1lICIgICAgIC15ICBkbyBub3QgcHJvbXB0IGZvciBjb25maXJtYXRpb24uIElmIGEgbmV3IHVzZXIgaXMgY3JlYXRlZCwgdGhlIHVzZXIgbmFtZSBpcyBzZXQgYXMgcGFzc3dvcmQiCisgICAgZWNobyAtZSAiICAgICA8dXNlci1uYW1lPiBDcmVhdGUgaWYgbm90IGV4aXN0IGFuZCBjb25maWd1cmUgdGhpcyB1c2VyIGZvciBvcGVudmltIHRvIGNvbm5lY3QiCisgICAgZWNobyAtZSAiICAgICA8aWZhY2UtbmFtZT4gaWYgc3VwcGxpZWQgY3JlYXRlcyBicmlkZ2UgaW50ZXJmYWNlcyBvbiB0aGlzIGludGVyZmFjZSwgbmVlZGVkIGZvciBvcGVudmltIgorICAgIGVjaG8gLWUgIiAgICAgaXAgb3IgZGhjcCBpZiBzdXBwbGllZCwgY29uZmlndXJlIHRoZSBpbnRlcmZhY2Ugd2l0aCB0aGlzIGlwIGFkZHJlc3MgKC8yNCkgb3IgJ2RoY3AnICIKK30KKworIzEgQ0hFQ0sgaW5wdXQgcGFyYW1ldGVycworIzEuMSByb290IHByaXZpbGVnZXMKK1sgIiRVU0VSIiAhPSAicm9vdCIgXSAmJiBlY2hvICJOZWVkZWQgcm9vdCBwcml2aWxlZ2VzIiAmJiB1c2FnZSAmJiBleGl0IC0xCisKKyMxLjIgaW5wdXQgcGFyYW1ldGVycworRk9SQ0U9IiIKK3doaWxlIGdldG9wdHMgInkiIG87IGRvCisgICAgY2FzZSAiJHtvfSIgaW4KKyAgICAgICAgeSkKKyAgICAgICAgICAgIEZPUkNFPSJ5ZXMiCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgdXNhZ2UKKyAgICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorc2hpZnQgJCgoT1BUSU5ELTEpKQorCisKK2lmIFsgJCMgLWx0IDEgXSAgCit0aGVuCisgIHVzYWdlCisgIGV4aXQKK2ZpCisKK3VzZXJfbmFtZT0kMQoraW50ZXJmYWNlPSQyCitpcF9pZmFjZT0kMworCitpZiBbIC1uICIkaW50ZXJmYWNlIiBdICYmICEgaWZjb25maWcgJGludGVyZmFjZSAmPiAvZGV2L251bGwKK3RoZW4KKyAgZWNobyAiRXJyb3I6IGludGVyZmFjZSAnJGludGVyZmFjZScgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN5c3RlbSIKKyAgdXNhZ2UKKyAgZXhpdCAxCitmaQorCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICBJTlNUQUxMIE5FRURFRCBQQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKKyMgUmVxdWlyZWQgcGFja2FnZXMKK3l1bSByZXBvbGlzdAoreXVtIGNoZWNrLXVwZGF0ZQoreXVtIHVwZGF0ZSAteQoreXVtIGluc3RhbGwgLXkgc2NyZWVuIHZpcnQtbWFuYWdlciBldGh0b29sIGdjYyBnY2MtYysrIHhvcmcteDExLXhhdXRoIHhvcmcteDExLXhpbml0IHhvcmcteDExLWRlcHJlY2F0ZWQtbGlicyBsaWJYdHN0IGd1ZXN0ZmlzaCBod2xvYyBsaWJodWdldGxiZnMtdXRpbHMgbGliZ3Vlc3Rmcy10b29scworIyBTZWxpbnV4IG1hbmFnZW1lbnQKK3l1bSBpbnN0YWxsIC15IHBvbGljeWNvcmV1dGlscy1weXRob24KKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgSU5TVEFMTCBVU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCisjIEFkZCByZXF1aXJlZCBncm91cHMKK2dyb3VwYWRkIC1mIGFkbWluCitncm91cGFkZCAtZiBsaWJ2aXJ0ICAgI2ZvciBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyBtYXkgYmUgbGlidmlydGQKKworIyBBZGRzIHVzZXIsIGRlZmF1bHQgcGFzc3dvcmQgc2FtZSBhcyBuYW1lCitpZiBncmVwIC1xICJeJHt1c2VyX25hbWV9OiIgL2V0Yy9wYXNzd2QKK3RoZW4gCisgICN1c2VyIGV4aXN0LCBhZGQgdG8gZ3JvdXAKKyAgZWNobyAiYWRkaW5nIHVzZXIgJHt1c2VyX25hbWV9IHRvIGdyb3VwcyBsaWJ2aXJ0LGFkbWluIgorICB1c2VybW9kIC1hIC1HIGxpYnZpcnQsYWRtaW4gLWcgYWRtaW4gJHVzZXJfbmFtZQorZWxzZSAKKyAgI2NyZWF0ZSB1c2VyIGlmIGl0IGRvZXMgbm90IGV4aXN0CisgIFsgLXogIiRGT1JDRSIgXSAmJiByZWFkIC1wICJ1c2VyICcke3VzZXJfbmFtZX0nIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgKFkvbikiIGtrCisgIGlmICEgWyAteiAiJGtrIiAtbyAiJGtrIj0ieSIgLW8gIiRrayI9IlkiIF0KKyAgdGhlbgorICAgIGV4aXQKKyAgZmkKKyAgZWNobyAiY3JlYXRpbmcgYW5kIGNvbmZpZ3VyaW5nIHVzZXIgJHt1c2VyX25hbWV9IgorICB1c2VyYWRkIC1tIC1HIGxpYnZpcnQsYWRtaW4gLWcgYWRtaW4gJHVzZXJfbmFtZSAgICAgICAKKyAgI1Bhc3N3b3JkCisgIGlmIFsgLXogIiRGT1JDRSIgXSAKKyAgdGhlbiAKKyAgICAgZWNobyAiUHJvdmlkZSBhIHBhc3N3b3JkIGZvciAkdXNlcl9uYW1lIgorICAgICBwYXNzd2QgJHVzZXJfbmFtZQorICBlbHNlCisgICAgIGVjaG8gLWUgIiR1c2VyX25hbWVcbiR1c2VyX25hbWUiIHwgcGFzc3dkIC0tc3RkaW4gJHVzZXJfbmFtZQorICBmaQorZmkKKworIyBBbGxvdyBhZG1pbiB1c2VycyB0byBhY2Nlc3Mgd2l0aG91dCBwYXNzd29yZAoraWYgISBncmVwIC1xICIjb3Blbm1hbm8iIC9ldGMvc3Vkb2VycwordGhlbgorICAgIGNhdCA+PiAvaG9tZS8ke3VzZXJfbmFtZX0vc2NyaXB0X3Zpc3Vkby5zaCA8PCBFT0wKKyMhL2Jpbi9iYXNoCitjYXQgXCQxIHwgYXdrICcoXCQwfiJyZXF1aXJldHR5Iil7cHJpbnQgIiMiXCQwfShcJDAhfiJyZXF1aXJldHR5Iil7cHJpbnQgXCQwfScgPiB0bXAKK2NhdCB0bXAgPiBcJDEKK3JtIHRtcAorZWNobyAiIiA+PiBcJDEKK2VjaG8gIiNvcGVubWFubyBhbGxvdyB0byBncm91cCBhZG1pbiB0byBncmFudCByb290IHByaXZpbGVnZXMgd2l0aG91dCBwYXNzd29yZCIgPj4gXCQxCitlY2hvICIlYWRtaW4gQUxMPShBTEwpIE5PUEFTU1dEOiBBTEwiID4+IFwkMQorRU9MCisgICAgY2htb2QgK3ggL2hvbWUvJHt1c2VyX25hbWV9L3NjcmlwdF92aXN1ZG8uc2gKKyAgICBlY2hvICJhbGxvd2luZyBhZG1pbiB1c2VyIHRvIGdldCByb290IHByaXZpbGVnZXMgd2l0aHV0IHBhc3N3b3JkIgorICAgIGV4cG9ydCBFRElUT1I9L2hvbWUvJHt1c2VyX25hbWV9L3NjcmlwdF92aXN1ZG8uc2ggJiYgc3VkbyAtRSB2aXN1ZG8KKyAgICBybSAtZiAvaG9tZS8ke3VzZXJfbmFtZX0vc2NyaXB0X3Zpc3Vkby5zaAorZmkKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgT1RIRVIgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworIyBDcmVhdGVzIGEgZm9sZGVyIHRvIHN0b3JlIGltYWdlcyBpbiB0aGUgdXNlciBob21lCisjQ3JlYXRlcyBhIGxpbmsgdG8gdGhlIC9ob21lIGZvbGRlciBiZWNhdXNlIGluIFJIRUwgdGhpcyBmb2xkZXIgaXMgbGFyZ2VyCitlY2hvICJjcmVhdGluZyBjb21wdXRlIG5vZGUgZm9sZGVyIGZvciBsb2NhbCBpbWFnZXMgL29wdC9WTkYvaW1hZ2VzIgoraWYgWyAiJHVzZXJfbmFtZSIgIT0gIiIgXQordGhlbgorICBta2RpciAtcCAvaG9tZS9WTkZfaW1hZ2VzCisgIGNob3duIC1SICR7dXNlcl9uYW1lfTphZG1pbiAvaG9tZS9WTkZfaW1hZ2VzCisgIGNobW9kIGdvK3ggL2hvbWUvVk5GX2ltYWdlcworCisgICMgVGhlIG9yY2hlc3RhdG9yIG5lZWRzIHRvIGxpbmsgdGhlIGltYWdlcyBmb2xkZXIgCisgIHJtIC1mIC9vcHQvVk5GL2ltYWdlcworICBta2RpciAtcCAvb3B0L1ZORi8KKyAgbG4gLXMgL2hvbWUvVk5GX2ltYWdlcyAvb3B0L1ZORi9pbWFnZXMKKyAgY2hvd24gLVIgJHt1c2VyX25hbWV9OmFkbWluIC9vcHQvVk5GCisKK2Vsc2UKKyAgbWtkaXIgLXAgL29wdC9WTkYvaW1hZ2VzCisgIGNobW9kIG8rcnggL29wdC9WTkYvaW1hZ2VzCitmaQorCitlY2hvICJjcmVhdGluZyBsb2NhbCBpbmZvcm1hdGlvbiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbCIKK2VjaG8gIiNCeSBkZWZhdWx0IG9wZW52aW0gYXNzdW1lcyBjb250cm9sIHBsYW5lIGludGVyZmFjZSBuYW1pbmcgYXMgZW0xLGVtMixlbTMsZW00ICIgPiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorZWNobyAiI2FuZCBicmlkZ2UgaWZhY2VzIGFzIHZpcmJyTWFuMSwgdmlyYnJNYW4yLCAuLi4iID4+IC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCitlY2hvICIjaWYgY29tcHV0ZSBub2RlIGNvbnRhaW4gYSBkaWZmZXJlbnQgbmFtZSBpdCBtdXN0IGJlIGluZGljYXRlZCBpbiB0aGlzIGZpbGUiID4+IC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCitlY2hvICIjd2l0aCB0aGUgZm9ybWF0IGV4dGFuZGFyZC1uYW1lOiBjb21wdXRlLW5hbWUiID4+IC9vcHQvVk5GL2ltYWdlcy9ob3N0aW5mby55YW1sCitpZiBbICIkaW50ZXJmYWNlIiAhPSAiIiAtYSAiJGludGVyZmFjZSIgIT0gImVtMSIgXQordGhlbgorICBlY2hvICJpZmFjZV9uYW1lczoiICAgICAgICA+PiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorICBlY2hvICIgIGVtMTogJHtpbnRlcmZhY2V9IiA+PiAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorZmkKK2NobW9kIG8rciAvb3B0L1ZORi9pbWFnZXMvaG9zdGluZm8ueWFtbAorCisjIGRlYWN0aXZhdGUgbWVtb3J5IG92ZXJjb21taXQKK2VjaG8gImRlYWN0aXZhdGUgbWVtb3J5IG92ZXJjb21taXQiCitzZXJ2aWNlIGtzbXR1bmVkIHN0b3AKK3NlcnZpY2Uga3NtIHN0b3AKK2Noa2NvbmZpZyBrc210dW5lZCBvZmYKK2Noa2NvbmZpZyBrc20gb2ZmCisKKyMgTGlidmlydCBvcHRpb25zICh1bmNvbW1lbnQgdGhlIGZvbGxvd2luZykKK2VjaG8gImNvbmZpZ3VyZSBMaWJ2aXJ0IG9wdGlvbnMiCitzZWQgLWkgJ3MvI3VuaXhfc29ja19ncm91cCA9ICJsaWJ2aXJ0Ii91bml4X3NvY2tfZ3JvdXAgPSAibGlidmlydCIvJyAvZXRjL2xpYnZpcnQvbGlidmlydGQuY29uZgorc2VkIC1pICdzLyN1bml4X3NvY2tfcndfcGVybXMgPSAiMDc3MCIvdW5peF9zb2NrX3J3X3Blcm1zID0gIjA3NzAiLycgL2V0Yy9saWJ2aXJ0L2xpYnZpcnRkLmNvbmYKK3NlZCAtaSAncy8jdW5peF9zb2NrX2RpciA9ICJcL3ZhclwvcnVuXC9saWJ2aXJ0Ii91bml4X3NvY2tfZGlyID0gIlwvdmFyXC9ydW5cL2xpYnZpcnQiLycgL2V0Yy9saWJ2aXJ0L2xpYnZpcnRkLmNvbmYKK3NlZCAtaSAncy8jYXV0aF91bml4X3J3ID0gIm5vbmUiL2F1dGhfdW5peF9ydyA9ICJub25lIi8nIC9ldGMvbGlidmlydC9saWJ2aXJ0ZC5jb25mCisKK2VjaG8gJworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjICAgICAgIE5FVFdPUksgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKyMgTmV0d29yayBjb25maWcgKGlmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIG5ldCkKK2lmIFsgLW4gIiRpbnRlcmZhY2UiIF0KK3RoZW4KKworICAjIERlYWN0aXZhdGUgbmV0d29yayBtYW5hZ2VyCisgICNzeXN0ZW1jdGwgc3RvcCBOZXR3b3JrTWFuYWdlcgorICAjc3lzdGVtY3RsIGRpc2FibGUgTmV0d29ya01hbmFnZXIKKworICBwdXNoZCAvZXRjL3N5c2NvbmZpZy9uZXR3b3JrLXNjcmlwdHMvCisKKyAgI0NyZWF0ZSBpbmZyYXN0cnVjdHVyZSBicmlkZ2UKKyAgZWNobyAiREVWSUNFPXZpcmJySW5mCitUWVBFPUJyaWRnZQorT05CT09UPXllcworREVMQVk9MAorTk1fQ09OVFJPTExFRD1ubworSVBBRERSPTEwLjEwLjAuMQorTkVUTUFTSz0yNTUuMjU1LjI1NS4wCitVU0VSQ1RMPW5vIiA+IGlmY2ZnLXZpcmJySW5mCisKKyAgI0NyZWF0ZSBicmlkZ2UgaW50ZXJmYWNlcworICBlY2hvICJDcmVhdGluZyBicmlkZ2UgaWZhY2VzOiAiCisgIGZvciAoKGk9MTtpPD0yMDtpKyspKQorICBkbworICAgIGkyZGlnaXRzPSRpCisgICAgWyAkaSAtbHQgMTAgXSAmJiBpMmRpZ2l0cz0iMCRpIgorICAgIGVjaG8gIiAgICB2aXJick1hbiRpIgorICAgIGVjaG8gIkRFVklDRT12aXJick1hbiRpCitUWVBFPUJyaWRnZQorT05CT09UPXllcworREVMQVk9MAorTk1fQ09OVFJPTExFRD1ubworVVNFUkNUTD1ubyIgPiBpZmNmZy12aXJick1hbiRpCisKKyAgZG9uZQorCisgIHBvcGQKK2ZpCisKK2VjaG8gCitlY2hvICJEbyBub3QgZm9yZ2V0IHRvIGNyZWF0ZSBhIGZvbGRlciB3aGVyZSBvcmlnaW5hbCB2aXJ0dWFsIG1hY2hpbmUgaW1hZ2VzIGFyZSBhbGxvY2F0ZWQgKGV4LiAkSE9NRS9zdGF0aWNfc3RvcmFnZSkiCitlY2hvCitlY2hvICJEbyBub3QgZm9yZ2V0IHRvIGFsbG93IG9wZW52aW0gbWFjaGluZSBhY2Nlc3NpbmcgZGlyZWN0bHkgdG8gdGhlIGhvc3Qgd2l0aCBzc2guIENhbiBiZSBkb25lIGJ5OiIKK2VjaG8gIiAgIENvcHkgdGhlIHB1YmxpYyBzc2gga2V5IG9mIHRoZSBvcGVudmltIHVzZXIgZnJvbSAkSE9NRS8uc3NoL2lkX2RzYS5wdWIgKGluIG9wZW52aW0pIGludG8gL2hvbWUvJHt1c2VyX25hbWV9Ly5zc2gvYXV0aG9yaXplZF9rZXlzIChpbiB0aGUgaG9zdCkgZm9yIGF1dG9tYXRpYyBsb2dpbiBmcm9tIG9wZW52aW0gY29udHJvbGxlciIKK2VjaG8gIiAgIE9yIHJ1bm5pbmcgb24gb3BlbnZpbSBtYWNoaW5lICdzc2gta2V5Z2VuJyAoZ2VuZXJhdGUgc3NoIGtleXMpIGFuZCAnc3NoLWNvcHktaWQgPHVzZXI+QDxjb21wdXRlIGhvc3Q+JyIKK2VjaG8KK2VjaG8gIkRvIG5vdCBmb3JnZXQgdG8gcGVyZm9ybSBhbiBpbml0aWFsIHNzaCBsb2dpbiBmcm9tIG9wZW5tYW5vIFZNIGludG8gdGhlIGhvc3Qgc28gdGhlIG9wZW5tYW5vIHNzaCBob3N0IGtleSBpcyBhZGRlZCB0byAvaG9tZS8ke3VzZXJfbmFtZX0vLnNzaC9rbm93bl9ob3N0cyIKK2VjaG8KKworZWNobyAiUmVib290IHRoZSBzeXN0ZW0gdG8gbWFrZSB0aGUgY2hhbmdlcyBlZmZlY3RpdmUiCisKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9mbG93LWxvZ2JhY2sueG1sIGIvc2NyaXB0cy9mbG93LWxvZ2JhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjAwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Zsb3ctbG9nYmFjay54bWwKQEAgLTAsMCArMSwzOCBAQAorPCEtLQorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKy0tPgorCis8Y29uZmlndXJhdGlvbiBzY2FuPSJ0cnVlIj4KKyAgPGFwcGVuZGVyIG5hbWU9IlNURE9VVCIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKyAgICA8ZW5jb2Rlcj4KKyAgICAgIDxwYXR0ZXJuPiVsZXZlbCBbJWxvZ2dlcjoldGhyZWFkXSAlbXNnJW48L3BhdHRlcm4+CisgICAgPC9lbmNvZGVyPgorICA8L2FwcGVuZGVyPgorICA8cm9vdCBsZXZlbD0iRVJST1IiPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJTVERPVVQiIC8+CisgIDwvcm9vdD4KKyAgPGxvZ2dlciBuYW1lPSJvcmciIGxldmVsPSJFUlJPUiIvPgorICA8bG9nZ2VyIG5hbWU9IkxvZ1NlcnZpY2UiIGxldmVsPSJFUlJPUiIvPiA8IS0tIFJlc3RsZXQgYWNjZXNzIGxvZ2dpbmcgLS0+CisgIDxsb2dnZXIgbmFtZT0ibmV0LmZsb29kbGlnaHRjb250cm9sbGVyIiBsZXZlbD0iVFJBQ0UiLz4KKyAgPGxvZ2dlciBuYW1lPSJuZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIubG9nZ2luZyIgbGV2ZWw9IkVSUk9SIi8+Cis8L2NvbmZpZ3VyYXRpb24+CisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZmxvdy5wcm9wZXJ0aWVzIGIvc2NyaXB0cy9mbG93LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmMGJmYQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZmxvdy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDIgQEAKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKK2Zsb29kbGlnaHQubW9kdWxlcyA9IG5ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5zdG9yYWdlLm1lbW9yeS5NZW1vcnlTdG9yYWdlU291cmNlLFwKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5jb3JlLkZsb29kbGlnaHRQcm92aWRlcixcCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIudGhyZWFkcG9vbC5UaHJlYWRQb29sLFwKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5zdGF0aWNmbG93ZW50cnkuU3RhdGljRmxvd0VudHJ5UHVzaGVyLFwKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5maXJld2FsbC5GaXJld2FsbCxcCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIuanl0aG9uLkp5dGhvbkRlYnVnSW50ZXJmYWNlLFwKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5jb3VudGVyLkNvdW50ZXJTdG9yZSxcCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIucGVyZm1vbi5Qa3RJblByb2Nlc3NpbmdUaW1lLFwKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci51aS53ZWIuU3RhdGljV2ViUm91dGFibGUKKworI1BPUlQgQVBJIGZsb29kbGlnaHQgd2lsbCBsaXN0ZW4gdG8uIE11c3QgbWF0Y2ggdGhlICdvZl9jb250cm9sbGVyX3BvcnQnIG9mIG9wZW52aW1kLmNmZworbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLnJlc3RzZXJ2ZXIuUmVzdEFwaVNlcnZlci5wb3J0ID0gICAgICAgIDcwNzAKKworI1BPUlQgdXNlZCBieSB0aGUgc3dpdGNoIHRvIGNvbm5lY3QgdG8gZmxvb2RsaWdodAorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLmNvcmUuRmxvb2RsaWdodFByb3ZpZGVyLm9wZW5mbG93cG9ydCA9IDY2MzMKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5qeXRob24uSnl0aG9uRGVidWdJbnRlcmZhY2UucG9ydCA9ICAgICA2NjU1CisKKyN0aW1lb3V0IHBhcmFtZXRlcnMKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5mb3J3YXJkaW5nLkZvcndhcmRpbmcuaWRsZXRpbWVvdXQgPSAgICA1CituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIuZm9yd2FyZGluZy5Gb3J3YXJkaW5nLmhhcmR0aW1lb3V0ID0gICAgMAorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Zsb3cucHJvcGVydGllc192MS4xIGIvc2NyaXB0cy9mbG93LnByb3BlcnRpZXNfdjEuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWRlNDliCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9mbG93LnByb3BlcnRpZXNfdjEuMQpAQCAtMCwwICsxLDM2IEBACitmbG9vZGxpZ2h0Lm1vZHVsZXM9XAorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLmp5dGhvbi5KeXRob25EZWJ1Z0ludGVyZmFjZSxcCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIuc3RvcmFnZS5tZW1vcnkuTWVtb3J5U3RvcmFnZVNvdXJjZSxcCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIuY29yZS5pbnRlcm5hbC5GbG9vZGxpZ2h0UHJvdmlkZXIsXAorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLnRocmVhZHBvb2wuVGhyZWFkUG9vbCxcCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIuZGVidWdjb3VudGVyLkRlYnVnQ291bnRlclNlcnZpY2VJbXBsLFwKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5wZXJmbW9uLlBrdEluUHJvY2Vzc2luZ1RpbWUsXAorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLmRlYnVnZXZlbnQuRGVidWdFdmVudFNlcnZpY2UsXAorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLnN0YXRpY2Zsb3dlbnRyeS5TdGF0aWNGbG93RW50cnlQdXNoZXIsXAorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLnJlc3RzZXJ2ZXIuUmVzdEFwaVNlcnZlcixcCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIudG9wb2xvZ3kuVG9wb2xvZ3lNYW5hZ2VyLFwKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5mb3J3YXJkaW5nLkZvcndhcmRpbmcsXAorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLmxpbmtkaXNjb3ZlcnkuaW50ZXJuYWwuTGlua0Rpc2NvdmVyeU1hbmFnZXIsXAorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLnVpLndlYi5TdGF0aWNXZWJSb3V0YWJsZSxcCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIubG9hZGJhbGFuY2VyLkxvYWRCYWxhbmNlcixcCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIuZmlyZXdhbGwuRmlyZXdhbGwsXAorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLmRldmljZW1hbmFnZXIuaW50ZXJuYWwuRGV2aWNlTWFuYWdlckltcGwKK29yZy5zZG5wbGF0Zm9ybS5zeW5jLmludGVybmFsLlN5bmNNYW5hZ2VyLmF1dGhTY2hlbWU9Q0hBTExFTkdFX1JFU1BPTlNFCitvcmcuc2RucGxhdGZvcm0uc3luYy5pbnRlcm5hbC5TeW5jTWFuYWdlci5rZXlTdG9yZVBhdGg9L2V0Yy9mbG9vZGxpZ2h0L2F1dGhfY3JlZGVudGlhbHMuamNla3MKK29yZy5zZG5wbGF0Zm9ybS5zeW5jLmludGVybmFsLlN5bmNNYW5hZ2VyLmRiUGF0aD0vdmFyL2xpYi9mbG9vZGxpZ2h0Lworb3JnLnNkbnBsYXRmb3JtLnN5bmMuaW50ZXJuYWwuU3luY01hbmFnZXIucG9ydD02NjQyCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIuY29yZS5pbnRlcm5hbC5GbG9vZGxpZ2h0UHJvdmlkZXIub3BlbmZsb3dQb3J0PTY2NTMKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5jb3JlLmludGVybmFsLkZsb29kbGlnaHRQcm92aWRlci5yb2xlPUFDVElWRQorbmV0LmZsb29kbGlnaHRjb250cm9sbGVyLmNvcmUuaW50ZXJuYWwuT0ZTd2l0Y2hNYW5hZ2VyLmNsZWFyVGFibGVzT25Jbml0aWFsSGFuZHNoYWtlQXNNYXN0ZXI9WUVTCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIuY29yZS5pbnRlcm5hbC5PRlN3aXRjaE1hbmFnZXIuY2xlYXJUYWJsZXNPbkVhY2hUcmFuc2l0aW9uVG9NYXN0ZXI9WUVTCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIuY29yZS5pbnRlcm5hbC5PRlN3aXRjaE1hbmFnZXIua2V5U3RvcmVQYXRoPS9wYXRoL3RvL3lvdXIva2V5c3RvcmUtZmlsZS5qa3MKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5jb3JlLmludGVybmFsLk9GU3dpdGNoTWFuYWdlci5rZXlTdG9yZVBhc3N3b3JkPXlvdXIta2V5c3RvcmUtcGFzc3dvcmQKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5jb3JlLmludGVybmFsLk9GU3dpdGNoTWFuYWdlci51c2VTc2w9Tk8KK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5yZXN0c2VydmVyLlJlc3RBcGlTZXJ2ZXIua2V5U3RvcmVQYXRoPS9wYXRoL3RvL3lvdXIva2V5c3RvcmUtZmlsZS5qa3MKK25ldC5mbG9vZGxpZ2h0Y29udHJvbGxlci5yZXN0c2VydmVyLlJlc3RBcGlTZXJ2ZXIua2V5U3RvcmVQYXNzd29yZD15b3VyLWtleXN0b3JlLXBhc3N3b3JkCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIucmVzdHNlcnZlci5SZXN0QXBpU2VydmVyLmh0dHBzTmVlZENsaWVudEF1dGhlbnRpY2F0aW9uPU5PCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIucmVzdHNlcnZlci5SZXN0QXBpU2VydmVyLnVzZUh0dHBzPU5PCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIucmVzdHNlcnZlci5SZXN0QXBpU2VydmVyLnVzZUh0dHA9WUVTCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIucmVzdHNlcnZlci5SZXN0QXBpU2VydmVyLmh0dHBzUG9ydD04MDgxCituZXQuZmxvb2RsaWdodGNvbnRyb2xsZXIucmVzdHNlcnZlci5SZXN0QXBpU2VydmVyLmh0dHBQb3J0PTgwODAKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZXRfZGhjcF9sZWFzZS5zaCBiL3NjcmlwdHMvZ2V0X2RoY3BfbGVhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDJmMDRjMwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2V0X2RoY3BfbGVhc2Uuc2gKQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL2Jhc2gKK2F3ayAnCisoJDE9PSJsZWFzZSIgJiYgJDM9PSJ7Iil7IGxlYXNlPSQyOyBhY3RpdmU9Im5vIjsgZm91bmQ9Im5vIiB9CisoJDE9PSJiaW5kaW5nIiAmJiAkMj09InN0YXRlIiAmJiAkMz09ImFjdGl2ZTsiKXsgYWN0aXZlPSJ5ZXMiIH0KKygkMT09ImhhcmR3YXJlIiAmJiAkMj09ImV0aGVybmV0IiAmJiAkMz09dG9sb3dlcigiJyQxJzsiKSl7IGZvdW5kPSJ5ZXMiIH0KKygkMT09ImNsaWVudC1ob3N0bmFtZSIpeyBuYW1lPSQyIH0KKygkMT09In0iKXsgaWYgKGFjdGl2ZT09InllcyIgJiYgZm91bmQ9PSJ5ZXMiKXsgdGFyZ2V0X2xlYXNlPWxlYXNlOyB0YXJnZXRfbmFtZT1uYW1lfX0KK0VORHtwcmludGYoIiVzIiwgdGFyZ2V0X2xlYXNlKX0gI3ByaW50IHRhcmdldF9uYW1lCisnIC92YXIvbGliL2RoY3AvZGhjcGQubGVhc2VzCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvaG9zdC1hZGQtZGV2ZWxvcC5zaCBiL3NjcmlwdHMvaG9zdC1hZGQtZGV2ZWxvcC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kY2U0YmRlCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ob3N0LWFkZC1kZXZlbG9wLnNoCkBAIC0wLDAgKzEsMTUxIEBACisjIS9iaW4vYmFzaAorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisjR2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBob3N0IGZvciB1c2luZyBpdCBhcyBhIGNvbXB1dGUgbm9kZQorCitmdW5jdGlvbiB1c2FnZSgpeworICAgIGVjaG8gIC1lICJ1c2FnZTogJDAgdXNlciBpcF9uYW1lIG5iX2NvcmVzIEdpQl9tZW1vcnkgbmJfMTBHQl9pbnRlcmZhY2VzIFtob3N0bmFtZV0gWz4+IGhvc3QueWFtbF1cbiAgR2V0IGhvc3QgcGFyYW1ldGVycyBhbmQgZ2VuZXJhdGVkIGEgeWFtbCBmaWxlIHRvIGJlIHVzZWQgZm9yIG9wZW52aW0gaG9zdC1hZGQiCisgICAgZWNobyAtZSAiICAtIEluIGNhc2UgaG9zdG5hbWUgaXMgbm90IHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgdGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgd2hlcmUgdGhlIHNjcmlwdCBpcyBydW4iCisgICAgZWNobyAtZSAiICAtIG5iX2NvcmVzIG11c3QgYmUgYW4gb2RkIG51bWJlciBhbmQgYmlnZ2VyIG9yIGVxdWFsIHRvIDQuIgorICAgIGVjaG8gLWUgIiAgLSBHaUJfbWVtb3J5IG11c3QgYmUgYW4gb2RkIG51bWJlciBhbmQgYmlnZ2VyIG9yIGVxdWFsIHRvIDE2LiA0R2lCIG9mIG1lbW9yeSB3aWxsIGJlIHJlc2VydmVkIGZvciB0aGUgaG9zdCBPUywgdGhlIHJlc3Qgd2lsbCBiZSB1c2VkIGJ5IFZNLiIKKyAgICBlY2hvIC1lICIgIC0gbmJfMTBHQl9pbnRlcmZhY2VzIG11c3QgYmUgYW4gb2RkIG51bWJlciBhbmQgYmlnZ2VyIG9yIGVxdWFsIHRvIDQuIgorICAgIGVjaG8gLWUgIiAgLSBUaGUgb3V0cHV0IHdpbGwgYmUgYSBzZXJ2ZXIgZGVzY3JpcHRvciB3aXRoIHR3byBudW1hcyBhbmQgcmVzb3VyY2VzIChtZW1vcnksIGNvcmVzIGFuZCBpbnRlcmZhY2VzKSBlcXVhbGx5IGRpc3RyaWJ1dGVkIGJldHdlZW4gdGhlbS4iCisgICAgZWNobyAtZSAiICAtIEVhY2ggaW50ZXJmYWNlIChwaHlzaWNhbCBmdW50aW9uKSB3aWxsIGhhdmUgZGVmaW5lZCA4IFNSLUlPViAodmlydHVhbCBmdW5jdGlvbnMpLiIKKyAgICBleGl0IDEKK30KKworZnVuY3Rpb24gZ2V0X2hhc2hfdmFsdWUoKSB7ICAgZWNobyBgZXZhbCAgZWNobyAkXHtcYGVjaG8gJDFbJDJdXGBcfWA7IH0KKworZnVuY3Rpb24gZ2V0X21hYygpeworICBzZWVkPSQxCisgIGIxPSQoKHNlZWQlMTYpKTsgc2VlZD0kKChzZWVkLzE2KSkKKyAgYjI9JCgoc2VlZCUxNikpOyBzZWVkPSQoKHNlZWQvMTYpKQorICBiMz0kKChzZWVkJTE2KSk7IHNlZWQ9JCgoc2VlZC8xNikpCisgIGI0PSQoKHNlZWQlMTYpKTsgc2VlZD0kKChzZWVkLzE2KSkKKyAgYjU9JCgoc2VlZCUxNikpOyBzZWVkPSQoKHNlZWQvMTYpKQorICBtYWM9YHByaW50ZiAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiIDIgJGI1ICRiNCAkYjMgJGIyICRiMWAKKyAgZWNobyAkbWFjCit9CisKKworI2NoZWNrIHJvb3QgcHJpdmlsZWdlcyBhbmQgbm9uIGEgcm9vdCB1c2VyIGJlaGluZAorCitbICIkIyIgLWx0ICI1IiBdICYmIGVjaG8gIk1pc3NpbmcgcGFyYW1ldGVycyIgJiYgdXNhZ2UKK1sgIiQjIiAtZ3QgIjYiIF0gJiYgZWNobyAiVG9vIG1hbnkgcGFyYW1ldGVycyIgJiYgdXNhZ2UKK0hPU1RfTkFNRT1gY2F0IC9ldGMvaG9zdG5hbWVgCitbICIkIyIgLWVxICI2IiBdICYmIEhPU1RfTkFNRT0kNgorRkVBVFVSRVNfTElTVD0ibHBzLGRpb2MsaHdzdix0bGJwcyxodCxscHMsNjRiLGlvbW11IgorTlVNQVM9MgorQ09SRVM9JDMKK01FTU9SWT0kNAorSU5URVJGQUNFUz0kNQorCisjRW5zdXJlIHRoZSB1c2VyIGlucHV0IGlzIGJpZyBlbm91Z2gKKyhbICQoKENPUkVTJTIpKSAtbmUgMCBdIHx8IFsgJENPUkVTIC1sdCA0IF0gKSAmJiBlY2hvIC1lICJFUlJPUjogV3JvbmcgbnVtYmVyIG9mIGNvcmVzXG4iICYmIHVzYWdlCisoWyAkKChNRU1PUlklMikpIC1uZSAwIF0gfHwgWyAkTUVNT1JZIC1sdCAxNiBdICkgJiYgZWNobyAtZSAiRVJST1I6IFdyb25nIG51bWJlciBvZiBtZW1vcnlcbiIgJiYgdXNhZ2UKKyhbICQoKElOVEVSRkFDRVMlMikpIC1uZSAwIF0gfHwgWyAkSU5URVJGQUNFUyAtbHQgNCBdICkgJiYgZWNobyAtZSAiRVJST1I6IFdyb25nIG51bWJlciBvZiBpbnRlcmZhY2VzXG4iICYmIHVzYWdlCisKKyNHZW5lcmF0ZSBhIGNwdSB0b3BvbG9neSBmb3IgNCBudW1hcyB3aXRoIGh5cGVydGhyZWFkaW5nCitDUFVTPWBwYWlyc19nYXA9JCgoQ09SRVMvTlVNQVMpKTtudW1hPTA7aW5jPTA7c2libGluZz0wO2ZvcigodGhyZWFkPTA7dGhyZWFkPD0kKChwYWlyc19nYXAtMSkpO3RocmVhZCsrKSk7IGRvIHByaW50ZiAiICR7bnVtYX0tJHtzaWJsaW5nfS0ke3RocmVhZH0gJHtudW1hfS0ke3NpYmxpbmd9LSQoKHRocmVhZCtwYWlyc19nYXApKSI7bnVtYT0kKCgobnVtYSsxKSUkTlVNQVMpKTsgc2libGluZz0kKChzaWJsaW5nK2luYykpOyBpbmM9JCgoKGluYysxKSUyKSk7ICBkb25lYCAgICAgCisKKyNpbiB0aGlzIGRldmVsb3BpbmcvZmFrZSBzZXJ2ZXIgYWxsIGNvcmVzIGNhbiBiZSB1c2VkCisKK2VjaG8gIiNUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkgJDAiCitlY2hvICIjZm9yIGFkZGluZyB0aGlzIGNvbXB1dGUgbm9kZSB0byBvcGVudmltIgorZWNobyAiI2NvcHkgdGhpcyBmaWxlIHRvIG9wZW52aW0gY29udHJvbGxlciBhbmQgcnVuIgorZWNobyAiI29wZW52aW0gaG9zdC1hZGQgPHRoaXM+IgorZWNobworZWNobyAiaG9zdDoiCitlY2hvICIgIG5hbWU6ICAgICRIT1NUX05BTUUiCitlY2hvICIgIHVzZXI6ICAgICQxIgorZWNobyAiICBpcF9uYW1lOiAkMiIKK2VjaG8gImhvc3QtZGF0YToiCitlY2hvICIgIG5hbWU6ICAgICAgICAkSE9TVF9OQU1FIgorZWNobyAiICB1c2VyOiAgICAgICAgJDEiCitlY2hvICIgIGlwX25hbWU6ICAgICAkMiIKK2VjaG8gIiAgcmFua2luZzogICAgIDEwMCIKK2VjaG8gIiAgZGVzY3JpcHRpb246ICRIT1NUX05BTUUiCitlY2hvICIgIGZlYXR1cmVzOiAgICAkRkVBVFVSRVNfTElTVCIKK2VjaG8gIiAgbnVtYXM6IgorCitudW1hPTAKK2xhc3RfaWZhY2U9MAoraWZhY2VfY291bnRlcj0wCit3aGlsZSBbICRudW1hIC1sdCAkTlVNQVMgXQorZG8KKyAgZWNobyAiICAtIG51bWFfc29ja2V0OiAgJG51bWEiCisjTUVNT1JZCisgIGVjaG8gIiAgICBodWdlcGFnZXM6ICQoKE1FTU9SWS8yLTIpKSIKKyAgZWNobyAiICAgIG1lbW9yeTogICAgJCgoTUVNT1JZLzIpKSIKKworI0NPUkVTCisgIGVjaG8gIiAgICBjb3JlczoiCisgIGZvciBjcHUgaW4gJENQVVMKKyAgZG8KKyAgICBQSFlTSUNBTD1gZWNobyAkY3B1IHwgY3V0IC1mIDEgLWQiLSJgCisgICAgQ09SRT1gZWNobyAkY3B1IHwgY3V0IC1mIDIgLWQiLSJgCisgICAgVEhSRUFEPWBlY2hvICRjcHUgfCBjdXQgLWYgMyAtZCItImAKKyAgICBbICRQSFlTSUNBTCAhPSAkbnVtYSBdICYmIGNvbnRpbnVlICAgI3NraXAgbm9uIHBoeXNpY2FsCisgICAgZWNobyAiICAgIC0gY29yZV9pZDogICAkQ09SRSIKKyAgICBlY2hvICIgICAgICB0aHJlYWRfaWQ6ICRUSFJFQUQiCisgICAgWyAkQ09SRSAtZXEgMCBdICYmIGVjaG8gIiAgICAgIHN0YXR1czogICAgbm90ZWxpZ2libGUiCisgIGRvbmUKKyAKKworICAjR0VORVJBVEUgSU5URVJGQUNFUyBJTkZPUk1BVElPTiBBTkQgUFJJTlQgSVQKKyAgc2VlZD0kUkFORE9NCisgIGVjaG8gIiAgICBpbnRlcmZhY2VzOiIKKyAgZm9yICgoaWZhY2U9MDtpZmFjZTwkSU5URVJGQUNFUztpZmFjZSs9MikpCisgIGRvCisgICAgbmFtZT0iaWZhY2UkaWZhY2VfY291bnRlciIKKyAgICBidXM9JCgoaWZhY2UrbGFzdF9pZmFjZSkpCisgICAgcGNpPWBwcmludGYgIjAwMDA6JTAyWDowMC4wIiAkYnVzYAorICAgIG1hYz1gZ2V0X21hYyAkc2VlZGAKKyAgICBzZWVkPSQoKHNlZWQrMSkpCisgIAorICAgIGVjaG8gIiAgICAtIHNvdXJjZV9uYW1lOiAkbmFtZSIKKyAgICBlY2hvICIgICAgICBNYnBzOiAxMDAwMCIKKyAgICBlY2hvICIgICAgICBwY2k6IFwiJHBjaVwiIgorICAgIGVjaG8gIiAgICAgIG1hYzogXCIkbWFjXCIiCisgICAgZWNobyAiICAgICAgc3dpdGNoX2RwaWQ6IFwiMDE6MDI6MDM6MDQ6MDU6MDZcIiIKKyAgICBlY2hvICIgICAgICBzd2l0Y2hfcG9ydDogZmFrZTAvJGlmYWNlX2NvdW50ZXIiCisgICAgZWNobyAiICAgICAgc3Jpb3ZzOiIKKworICAgIGZvcigobmJfc3Jpb3Y9MDtuYl9zcmlvdjw4O25iX3NyaW92KyspKQorICAgIGRvCisgICAgICBwY2k9YHByaW50ZiAiMDAwMDolMDJYOjEwLiVpIiAkYnVzICRuYl9zcmlvdmAKKyAgICAgIG1hYz1gZ2V0X21hYyAkc2VlZGAKKyAgICAgIHNlZWQ9JCgoc2VlZCsxKSkKKyAgICAgIGVjaG8gIiAgICAgIC0gbWFjOiBcIiRtYWNcIiIKKyAgICAgIGVjaG8gIiAgICAgICAgcGNpOiBcIiRwY2lcIiIKKyAgICAgIGVjaG8gIiAgICAgICAgc291cmNlX25hbWU6ICRuYl9zcmlvdiIKKyAgICBkb25lCisgIAorICBpZmFjZV9jb3VudGVyPSQoKGlmYWNlX2NvdW50ZXIrMSkpCisgIGRvbmUKKyAgbGFzdF9pZmFjZT0kKCgobnVtYSsxKSoxMjcvTlVNQVMrNSkpICNtYWRlLXVwIGZvcm11bGEgZm9yIG1vcmUgcmVhbGlzdGljIHBjaSBudW1iZXJzIAorICAKKworICBudW1hPSQoKG51bWErMSkpCitkb25lCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvaG9zdC1hZGQuc2ggYi9zY3JpcHRzL2hvc3QtYWRkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmMjEzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2hvc3QtYWRkLnNoCkBAIC0wLDAgKzEsNDA2IEBACisjIS9iaW4vYmFzaAorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZvNuaWNhIEludmVzdGlnYWNp824geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworI0dldCBjb25maWd1cmF0aW9uIG9mIGEgaG9zdCBmb3IgdXNpbmcgaXQgYXMgYSBjb21wdXRlIG5vZGUKKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvICAtZSAidXNhZ2U6ICQwIHVzZXIgaXBfbmFtZSBbPj4gaG9zdC55YW1sXVxuICBHZXQgaG9zdCBwYXJhbWV0ZXJzIGFuZCBnZW5lcmF0ZWQgYSB5YW1sIGZpbGUgdG8gYmUgdXNlZCBmb3Igb3BlbnZpbSBob3N0LWFkZCIKKyAgICBleGl0IDEKK30KKworZnVuY3Rpb24gbG9hZF92Zl9kcml2ZXIoKXsKKyAgbG9jYWwgcGZfZHJpdmVyPSQxCisgIGlmIFtbIGBsc21vZCB8IGN1dCAtZCIgIiAtZjEgfCBncmVwICRwZl9kcml2ZXIgfCBncmVwIC12IHZmYCBdXSAmJiBbWyAhIGBsc21vZCB8IGN1dCAtZCIgIiAtZjEgfCBncmVwICR7cGZfZHJpdmVyfXZmYCBdXQorICB0aGVuCisgICAgPiYyIGVjaG8gIiRwZl9kcml2ZXIgaXMgbG9hZGVkIGJ1dCBub3QgJHtwZl9kcml2ZXJ9dmYuIFRoaXMgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gcHJvcGVybHkgYWRkIFNSLUlPVi4iCisgICAgcmVhZCAtcCAiRG8geW91IHdhbnQgdG8gbG9hZCAke3BmX2RyaXZlcn12ZiBbWS9uXSAiIGxvYWRfZHJpdmVyCisgICAgY2FzZSAkbG9hZF9kcml2ZXIgaW4KKyAgICAgIFtuTl0qICkgZXhpdCAxOzsKKyAgICAgICogKSA+JjIgZWNobyAiTG9hZGluZyAke3BmX2RyaXZlcn12Zi4uLiIKKyAgICAgICAgICBtb2Rwcm9iZSAke3BmX2RyaXZlcn12ZjsKKyAgICAgICAgICA+JjIgZWNobyAiUmVsb2FkaW5nICR7cGZfZHJpdmVyfS4uLiIKKyAgICAgICAgICBtb2Rwcm9iZSAtciAkcGZfZHJpdmVyOworICAgICAgICAgIG1vZHByb2JlICRwZl9kcml2ZXI7OworICAgIGVzYWMKKyAgZmkKK30KKworZnVuY3Rpb24gcmVtb3ZlX3ZmX2RyaXZlcigpeworICBsb2NhbCBwZl9kcml2ZXI9JDEKKyAgaWYgW1sgYGxzbW9kIHwgY3V0IC1kIiAiIC1mMSB8IGdyZXAgJHBmX2RyaXZlciB8IGdyZXAgLXYgdmZgIF1dICYmIFtbIGBsc21vZCB8IGN1dCAtZCIgIiAtZjEgfCBncmVwICR7cGZfZHJpdmVyfXZmYCBdXQorICB0aGVuCisgICAgPiYyIGVjaG8gIiR7cGZfZHJpdmVyfXZmIGlzIGxvYWRlZC4gSW4gb3JkZXIgdG8gZW5zdXJlIHByb3BlciBTUi1JT1YgYmVoYXZpb3IgdGhlIGRyaXZlciBtdXN0IGJlIHJlbW92ZWQuIgorICAgIHJlYWQgLXAgIkRvIHlvdSB3YW50IHRvIHJlbW92ZSAke3BmX2RyaXZlcn12ZiBub3c/IFtZL25dICIgcmVtb3ZlX2RyaXZlcgorICAgIGNhc2UgJHJlbW92ZV9kcml2ZXIgaW4KKyAgICAgIFtuTl0qICkgPiYyIGVjaG8gIk9LLiBSZW1lbWJlciB0byByZW1vdmUgdGhlIGRyaXZlciBwcmlvciBzdGFydCB1c2luZyB0aGUgY29tcHV0ZSBub2RlIGV4ZWN1dGluZzoiOworICAgICAgICAgICAgICA+JjIgZWNobyAibW9kcHJvYmUgLXIgJHtwZl9kcml2ZXJ9dmYiOworICAgICAgICAgICAgICA+JjIgZWNobyAibW9kcHJvYmUgLXIgJHtwZl9kcml2ZXJ9IjsKKyAgICAgICAgICAgICAgPiYyIGVjaG8gIm1vZHByb2JlICR7cGZfZHJpdmVyfSI7OworICAgICAgKiApID4mMiBlY2hvICJSZW1vdmluZyAke3BmX2RyaXZlcn12Zi4uLiIKKyAgICAgICAgICBtb2Rwcm9iZSAtciAke3BmX2RyaXZlcn12ZjsKKyAgICAgICAgICA+JjIgZWNobyAiUmVsb2FkaW5nICR7cGZfZHJpdmVyfS4uLiIKKyAgICAgICAgICBtb2Rwcm9iZSAtciAkcGZfZHJpdmVyOworICAgICAgICAgIG1vZHByb2JlICRwZl9kcml2ZXI7OworICAgIGVzYWMKKyAgZmkKK30KKworZnVuY3Rpb24gZ2V0X2hhc2hfdmFsdWUoKSB7ICAgZWNobyBgZXZhbCAgZWNobyAkXHtcYGVjaG8gJDFbJDJdXGBcfWA7IH0KKworZnVuY3Rpb24geG1scGF0aF9hcmdzKCkKK3sKKyAgbG9jYWwgZXhwcj0iJHsxLy9cLy8gfSIKKyAgbG9jYWwgcGF0aD0oKQorICBsb2NhbCBjaHVuayB0YWcgZGF0YQorICBsb2NhbCBleGl0X2NvZGU9MQorICBsb2NhbCBwcmludF9saW5lPTAKKyAgbG9jYWwgY2xvc2luZ190YWc9MAorCisgIHdoaWxlIElGUz0nJyByZWFkIC1yIC1kICc8JyBjaHVuazsgZG8KKyAgICBkYXRhPWFyZ3VtZW50cz0iIgorICAgIElGUz0nPicgcmVhZCAtciB0YWdfYXJnIGRhdGEgPDw8ICIkY2h1bmsiCisgICAgSUZTPScgJyByZWFkIC1yIHRhZyBhcmd1bWVudHMgPDw8ICIkdGFnX2FyZyIKKyAgICAjSWYgbGFzdCB0YWcgd2FzIHNpbmdsZSBsZXZlbCByZW1vdmUgaXQgZnJvbSBwYXRoCisgICAgaWYgW1sgJGNsb3NpbmdfdGFnIC1lcSAxIF1dIAorICAgIHRoZW4gCisgICAgICB1bnNldCBwYXRoWyR7I3BhdGhbQF19LTFdCisgICAgICBjbG9zaW5nX3RhZz0wCisgICAgZmkKKyAgICAjSW4gY2FzZSB0aGUgdGFnIGlzIGNsb3NlZCBpbiB0aGUgc2FtZSBsaW5lIG1hcmsgaXQKKyAgICBbWyAkYXJndW1lbnRzID0gPyonLycgXV0gJiYgY2xvc2luZ190YWc9MQorICAgIGFyZ3VtZW50cz0iJHthcmd1bWVudHMvL1wvL30iCisgICAgY2FzZSAiJHRhZyIgaW4KKyAgICAgICc/JyopIDs7CisgICAgICAnIS0tJyopIDs7CisgICAgICA/KicvJykgOzsKKyAgICAgICcvJz8qKSB1bnNldCBwYXRoWyR7I3BhdGhbQF19LTFdIDs7CisgICAgICA/KikgcGF0aCs9KCIkdGFnIik7OyAgICAgICAgCisgICAgZXNhYworICAgIAorICAgICNlY2hvICJcIiR7cGF0aFtAXX1cIiBcIiRleHByXCIgXCIkZGF0YVwiIFwiJGFyZ3VtZW50c1wiICRleGl0X2NvZGUgJHByaW50X2xpbmUiCisgICAgCisgICAgaWYgW1sgIiR7cGF0aFtAXX0iID09ICIkZXhwciIgXV0KKyAgICB0aGVuCisgICAgICAjSWYgdGhlcmUgaXMgZGF0YSBwcmludCBpdCBhbmQgYXBwZW5kIGFyZ3VtZW50cyBpZiBhbnkKKyAgICAgIGlmIFsgIiRkYXRhIiAhPSAiIiBdIAorICAgICAgdGhlbgorICAgICAgICBlY2hvICIkZGF0YSAkYXJndW1lbnRzIgorICAgICAgICAjcmV0dXJuIGNvZGUgMCBtZWFucyBkYXRhIHdhcyBmb3VuZAorICAgICAgICBleGl0X2NvZGU9MAorICAgICAgICBjb250aW51ZQorICAgICAgI2lmIHRoZXJlIGlzIG5vIGRhdGEgYnV0IHRoZXJlIGFyZSBhcmd1bWVudHMgcHJpbnQgYXJndW1lbnRzCisgICAgICBlbGlmIFsgIiRhcmd1bWVudHMiICE9ICIiIF0KKyAgICAgIHRoZW4KKyAgICAgICAgZWNobyAiJGFyZ3VtZW50cyIKKyAgICAgICAgI3JldHVybiBjb2RlIDIgbWVhbnMgbm8gZGF0YSBidXQgYXJndW1lbnRzIHdlcmUgZm91bmQKKyAgICAgICAgZXhpdF9jb2RlPTIKKyAgICAgICAgY29udGludWUKKyAgICAgICNvdGhlcndpc2Ugc3dpdGNoIGZsYWcgdG8gc3RhcnQvc3RvcCBlY2hvaW5nIGVhY2ggbGluZSB1bnRpbCB0aGUgdGFnIGlzIGNsb3NlZAorICAgICAgZWxpZiBbWyAkZXhpdF9jb2RlIC1lcSAxIF1dCisgICAgICB0aGVuCisgICAgICAgIHByaW50X2xpbmU9JCgoKHByaW50X2xpbmUrMSklMikpCisgICAgICAgICNyZXR1cm4gY29kZSAzIG1lYW5zIHRoYXQgdGhlIHdob2xlIHhtbCBzZWdtZW50IGlzIHJldHVybmVkCisgICAgICAgIGV4aXRfY29kZT0zCisgICAgICBmaQorICAgIGZpCisgICAgW1sgJHByaW50X2xpbmUgPT0gIjEiIF1dICYmIGVjaG8gIjwiJGNodW5rCisgIGRvbmUKKyAgcmV0dXJuICRleGl0X2NvZGUKK30KKworCisjY2hlY2sgcm9vdCBwcml2aWxlZ2VzIGFuZCBub24gYSByb290IHVzZXIgYmVoaW5kCisKK1tbICIkIyIgLWx0ICIyIiBdXSAmJiBlY2hvICJNaXNzaW5nIHBhcmFtZXRlcnMiICYmIHVzYWdlCitsb2FkX3ZmX2RyaXZlciBpeGdiZQorbG9hZF92Zl9kcml2ZXIgaTQwZQorCitIT1NUX05BTUU9YGNhdCAvZXRjL2hvc3RuYW1lYAorRkVBVFVSRVM9YGdyZXAgIl5mbGFncyIgIC9wcm9jL2NwdWluZm9gCitGRUFUVVJFU19MSVNUPSIiCitpZiBlY2hvICRGRUFUVVJFUyB8IGdyZXAgLXEgcGRwZTFnYiA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSxscHMiOyAgZmkKK2lmIGVjaG8gJEZFQVRVUkVTIHwgZ3JlcCAtcSBkY2EgICAgIDsgdGhlbiBGRUFUVVJFU19MSVNUPSIke0ZFQVRVUkVTX0xJU1R9LGRpb2MiOyBmaQoraWYgZWNobyAkRkVBVFVSRVMgfCBlZ3JlcCAtcSAiKHZteHxzdm0pIiA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSxod3N2IjsgZmkKK2lmIGVjaG8gJEZFQVRVUkVTIHwgZWdyZXAgLXEgIihlcHR8bnB0KSIgOyB0aGVuIEZFQVRVUkVTX0xJU1Q9IiR7RkVBVFVSRVNfTElTVH0sdGxicHMiOyBmaQoraWYgZWNobyAkRkVBVFVSRVMgfCBncmVwIC1xIGh0ICAgICAgOyB0aGVuIEZFQVRVUkVTX0xJU1Q9IiR7RkVBVFVSRVNfTElTVH0saHQiOyAgIGZpCitpZiB1bmFtZSAtbSB8IGdyZXAgLXEgeDg2XzY0ICAgICAgICA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSw2NGIiOyAgZmkKK2lmIGNhdCAvdmFyL2xvZy9kbWVzZyB8IGdyZXAgLXEgLWUgSW50ZWwtSU9NTVUgICA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSxpb21tdSI7ICBmaQorRkVBVFVSRVNfTElTVD0ke0ZFQVRVUkVTX0xJU1QjLH0KKworTlVNQVM9YGdhd2sgJ0JFR0lOe251bWFzPTA7fQorICAoJDE9PSJwaHlzaWNhbCIgJiYgJDI9PSJpZCIgKXsgaWYgKCQ0KzE+bnVtYXMpe251bWFzPSQ0KzF9IH07CisgIEVORHtwcmludGYoIiVkIixudW1hcyk7fScgL3Byb2MvY3B1aW5mb2AKKworQ1BVUz1gZ2F3ayAnKCQxPT0icHJvY2Vzc29yIil7cHJvPSQzO30KKyAgKCQxPT0icGh5c2ljYWwiICYmICQyPT0iaWQiKXsgcGh5PSQ0O30KKyAgKCQxPT0iY29yZSIgJiYgJDI9PSJpZCIpe3ByaW50ZiAiICVkLSVkLSVkIiwgcGh5LCQ0LHBybzt9JyAvcHJvYy9jcHVpbmZvYAorCitpZiBncmVwIC1xIGlzb2xjcHVzIC9wcm9jL2NtZGxpbmUKK3RoZW4KKyAgaXNvbGNwdXM9YGNhdCAvcHJvYy9jbWRsaW5lYAorICBpc29sY3B1cz0ke2lzb2xjcHVzIyMqaXNvbGNwdXM9fQorICBpc29sY3B1cz0ke2lzb2xjcHVzJSUgKn0KKyAgaXNvbGNwdXM9JHtpc29sY3B1cy8vLC8gfQorZWxzZQorICBpc29sY3B1cz0iIgorZmkKKworCisjb2J0YWluIGludGVyZmFjZXMgaW5mb3JtYXRpb24KK3Vuc2V0IGRwaWQKK3JlYWQgLXAgIkRvIHlvdSB3YW50IHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgY29ubmVjdGl2aXR5IGluZm9ybWF0aW9uIChkYXRhcGF0aGlkL2RwaWQgb2YgdGhlIHN3aXRjaCBhbmQgc3dpdGNoIHBvcnQgaWQpPyBbWS9uXSAiIGNvbm5faW5mbworY2FzZSAkY29ubl9pbmZvIGluCisgICAgW05uXSogKSBwcm92X2Nvbm49ZmFsc2U7OworICAgICogKSBwcm92X2Nvbm49dHJ1ZTsKKyAgICAgICAgcmVhZCAtcCAiV2hhdCBpcyB0aGUgc3dpdGNoIGRhcGFwYXRoaWQvZHBkaT8gKDAxOjAyOjAzOjA0OjA1OjA2OjA3OjA4KSAiIGRwaWQ7CisgICAgICAgIFtbIC16ICRkcGlkIF1dICYmIGRwaWQ9IjAxOjAyOjAzOjA0OjA1OjA2OjA3OjA4IjsKKyAgICAgICAgUE9SVF9SQU5ET009JFJBTkRPTQorICAgICAgICBpZmFjZV9jb3VudGVyPTA7OworZXNhYyAgICAgICAKK09MRElGUz0kSUZTCitJRlM9JCdcbicKK3Vuc2V0IFBGX2xpc3QKK3Vuc2V0IFZGX2xpc3QKK2ZvciBkZXZpY2UgaW4gYHZpcnNoIG5vZGVkZXYtbGlzdCAtLWNhcCBuZXQgfCBncmVwIC12IG5ldF9sb18wMF8wMF8wMF8wMF8wMF8wMGAKK2RvCit2aXJzaCBub2RlZGV2LWR1bXB4bWwgJGRldmljZSA+IGRldmljZV94bWwKK25hbWU9YHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvaW50ZXJmYWNlIiA8IGRldmljZV94bWxgCituYW1lPSIke25hbWUvLyAvfSIKK2FkZHJlc3M9YHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvYWRkcmVzcyIgPCBkZXZpY2VfeG1sYAorYWRkcmVzcz0iJHthZGRyZXNzLy8gL30iCitwYXJlbnQ9YHhtbHBhdGhfYXJncyAiZGV2aWNlL3BhcmVudCIgPCBkZXZpY2VfeG1sYAorcGFyZW50PSIke3BhcmVudC8vIC99IgorI3RoZSBmb2xsb3dpbmcgbGluZSBjcmVhdGVkIHZhcmlhYmxlcyAnc3BlZWQnIGFuZCAnc3RhdGUnCitldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2xpbmsiIDwgZGV2aWNlX3htbGAKK3ZpcnNoIG5vZGVkZXYtZHVtcHhtbCAkcGFyZW50ID4gcGFyZW50X3htbAorZHJpdmVyPWB4bWxwYXRoX2FyZ3MgImRldmljZS9kcml2ZXIvbmFtZSIgPCBwYXJlbnRfeG1sYAorWyAkPyAtZXEgMSBdICYmIGRyaXZlcj0iTi9BIgorZHJpdmVyPSIke2RyaXZlci8vIC99IgorCisjSWYgdGhlIGRldmljZSBpcyBub3QgdXAgdHJ5IHRvIGJyaW5nIGl0IHVwIGFuZCByZWxvYWQgc3RhdGUKK2lmIFtbICRzdGF0ZSA9PSAnZG93bicgXV0gJiYgKCBbWyAkZHJpdmVyID09ICJpeGdiZSIgXV0gfHwgW1sgJGRyaXZlciA9PSAiaTQwZSIgXV0gKQordGhlbgorICA+JjIgZWNobyAiJG5hbWUgaXMgZG93bi4gVHJ5aW5nIHRvIGJyaW5nIGl0IHVwIgorICBpZmNvbmZpZyAkbmFtZSB1cAorICBzbGVlcCAyCisgIHZpcnNoIG5vZGVkZXYtZHVtcHhtbCAkZGV2aWNlID4gZGV2aWNlX3htbAorICBldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2xpbmsiIDwgZGV2aWNlX3htbGAKK2ZpCisKK2lmIFtbICRzdGF0ZSA9PSAnZG93bicgXV0gICYmICggW1sgJGRyaXZlciA9PSAiaXhnYmUiIF1dIHx8IFtbICRkcml2ZXIgPT0gImk0MGUiIF1dICkKK3RoZW4KKyAgICA+JjIgZWNobyAiSW50ZXJmYWNlcyBtdXN0IGJlIGNvbm5lY3RlZCBhbmQgdXAgaW4gb3JkZXIgdG8gcHJvcGVybHkgZGV0ZWN0IHRoZSBzcGVlZC4gWW91IGNhbiBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24gbWFudWFsbHkgb3Igc2tpcCB0aGUgaW50ZXJmYWNlIgorICAgIGtlZXBfYXNraW5nPXRydWUKKyAgICBza2lwX2ludGVyZmFjZT10cnVlCisgICAgdW5zZXQgc3BlZWQKKyAgICB3aGlsZSAka2VlcF9hc2tpbmc7IGRvCisgICAgICAgIHJlYWQgLXAgIkRvIHlvdSB3YW50IHRvIHNraXAgaW50ZXJmYWNlICRuYW1lICgkYWRkcmVzcykgW3kvTl0gIiAtaSAibiIgc2tpcAorICAgICAgICBjYXNlICRza2lwIGluCisgICAgICAgICAgICBbWXldKiApIGtlZXBfYXNraW5nPWZhbHNlOzsKKyAgICAgICAgICAgICogKSBza2lwX2ludGVyZmFjZT1mYWxzZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0X3NwZWVkPSIxMDAwMCIKKyAgICAgICAgICAgICAgICB3aGlsZSAka2VlcF9hc2tpbmc7IGRvCisgICAgICAgICAgICAgICAgICAgcmVhZCAtcCAiV2hhdCBpcyB0aGUgc3BlZWQgb2YgdGhlIGludGVyZmFjZSBleHByZXNzZWQgaW4gTWJwcz8gKCRkZWZhdWx0X3NwZWVkKSAiIHNwZWVkOworICAgICAgICAgICAgICAgICAgIFtbIC16ICRzcGVlZCBdXSAmJiBzcGVlZD0kZGVmYXVsdF9zcGVlZAorICAgICAgICAgICAgICAgICAgIFtbICRzcGVlZCA9fiAnJ3wqWyEwLTldIF1dICYmIGVjaG8gIlRoZSBpbnB1dCBtdXN0IGJlIGFuIGludGVnZXIiICYmIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgIGtlZXBfYXNraW5nPWZhbHNlIDsKKyAgICAgICAgICAgICAgICBkb25lOzsKKyAgICAgICAgZXNhYworICAgIGRvbmUKKworICAgJHNraXBfaW50ZXJmYWNlICYmIGNvbnRpbnVlCitmaQorI3RoZSBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgJ25vZGUnIHZhcmlhYmxlCitldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L251bWEiIDwgcGFyZW50X3htbGAKKyN0aGUgZm9sbG93aW5nIGxpbmUgY3JlYXRlcyB0aGUgdmFyaWFibGUgJ3R5cGUnCisjaW4gY2FzZSB0aGUgaW50ZXJmYWNlIGlzIGEgUEYgdGhlIHZhbHVlIGlzICd2aXJ0X2Z1bmN0aW9ucycKKyNpbiBjYXNlIHRoZSBpbnRlcmZhY2UgaXMgYSBWRiB0aGUgdmFsdWUgaXMgJ3BoeXNfZnVuY3Rpb24nCit0eXBlPSJOL0EiCitldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2NhcGFiaWxpdHkiIDwgcGFyZW50X3htbGAKKyNvYnRhaW4gcGNpCisjdGhlIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgdGhlIHZhcmlhYmxlcyAnZG9tYWluJyAnYnVzJyAnc2xvdCcgYW5kICdmdW5jdGlvbicKK2V2YWwgYHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvaW9tbXVHcm91cC9hZGRyZXNzIiA8IHBhcmVudF94bWxgCitwY2k9IiR7ZG9tYWluIyp4fToke2J1cyMqeH06JHtzbG90Iyp4fS4ke2Z1bmN0aW9uIyp4fSIKK3VuZGVyc2NvcmVkX3BjaT0iJHtwY2kvL1w6L199IgordW5kZXJzY29yZWRfcGNpPSJwY2lfJHt1bmRlcnNjb3JlZF9wY2kvL1wuL199IgorCitpZiAoIFtbICRkcml2ZXIgPT0gIml4Z2JlIiBdXSB8fCBbWyAkZHJpdmVyID09ICJpNDBlIiBdXSApIAordGhlbgorICB1bmRlcnNjb3JlZF9wY2k9InBmIiR1bmRlcnNjb3JlZF9wY2kKKyAgUEZfbGlzdFskeyNQRl9saXN0W0BdfV09JHVuZGVyc2NvcmVkX3BjaQorICBldmFsIGRlY2xhcmUgLUEgJHVuZGVyc2NvcmVkX3BjaQorICBldmFsICR1bmRlcnNjb3JlZF9wY2lbIm5hbWUiXT0kbmFtZQorICBldmFsICR1bmRlcnNjb3JlZF9wY2lbIm51bWEiXT0kbm9kZQorICBldmFsICR1bmRlcnNjb3JlZF9wY2lbIm1hYyJdPSRhZGRyZXNzCisgIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsic3BlZWQiXT0kc3BlZWQKKyAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJwY2kiXT0kcGNpCisgICNyZXF1ZXN0IHN3aXRjaCBwb3J0IHRvIHRoZSB1c2VyIGlmIHRoaXMgaW5mb3JtYXRpb24gaXMgYmVpbmcgcHJvdmlkZWQgYW5kIGluY2x1ZGUgaXQKKyAgaWYgICRwcm92X2Nvbm4gCisgIHRoZW4KKyAgICB1bnNldCBzd2l0Y2hfcG9ydAorICAgIHJlYWQgLXAgIldoYXQgaXMgdGhlIHBvcnQgbmFtZSBpbiB0aGUgc3dpdGNoICRkcGlkIHdoZXJlIHBvcnQgJG5hbWUgKCRwY2kpIGlzIGNvbm5lY3RlZD8gKCR7bmFtZX0tJHtQT1JUX1JBTkRPTX0vJGlmYWNlX2NvdW50ZXIpICIgc3dpdGNoX3BvcnQKKyAgICBbWyAteiAkc3dpdGNoX3BvcnQgXV0gJiYgc3dpdGNoX3BvcnQ9IiR7bmFtZX0tJHtQT1JUX1JBTkRPTX0vJGlmYWNlX2NvdW50ZXIiCisgICAgaWZhY2VfY291bnRlcj0kKChpZmFjZV9jb3VudGVyKzEpKQorICAgIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsiZHBpZCJdPSRkcGlkCisgICAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJzd2l0Y2hfcG9ydCJdPSRzd2l0Y2hfcG9ydAorICBmaQorCisgICNB8WFkbyBlbCBwY2kgZGUgY2FkYSB1bm8gZGUgbG9zIGhpam9zCisgIFNSSU9WX2NvdW50ZXI9MAorICBmb3IgY2hpbGQgaW4gYHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvY2FwYWJpbGl0eS9hZGRyZXNzIiA8IHBhcmVudF94bWxgCisgIGRvIAorICAgIFNSSU9WX2NvdW50ZXI9JCgoU1JJT1ZfY291bnRlcisxKSkKKyAgICAjdGhlIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgdGhlIHZhcmlhYmxlcyAnZG9tYWluJyAnYnVzJyAnc2xvdCcgYW5kICdmdW5jdGlvbicKKyAgICBldmFsICRjaGlsZAorICAgIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsiU1JJT1YiJFNSSU9WX2NvdW50ZXJdPSIke2RvbWFpbiMqeH1fJHtidXMjKnh9XyR7c2xvdCMqeH1fJHtmdW5jdGlvbiMqeH0iCisgIGRvbmUKKyAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJTUklPViJdPSRTUklPVl9jb3VudGVyCisgIAorI1NpIHNlIHRyYXRhIGRlIHVuIFNSSU9WICh0aWVuZSB1bmEgY2FwYWJpbGl0eSBjb24gdHlwZSAncGh5c19mdW5jdGlvbicpCitlbGlmIFtbICR0eXBlID09ICdwaHlzX2Z1bmN0aW9uJyBdXQordGhlbgorICB1bmRlcnNjb3JlZF9wY2k9InZmIiR1bmRlcnNjb3JlZF9wY2kKKyAgVkZfbGlzdFskeyNWRl9saXN0W0BdfV09JHVuZGVyc2NvcmVkX3BjaQorICBldmFsIGRlY2xhcmUgLUEgJHVuZGVyc2NvcmVkX3BjaQorICBldmFsICR1bmRlcnNjb3JlZF9wY2lbInNvdXJjZV9uYW1lIl09JG5hbWUKKyAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJtYWMiXT0kYWRkcmVzcworICBldmFsICR1bmRlcnNjb3JlZF9wY2lbInBjaSJdPSRwY2kKK2ZpCitybSAtZiBkZXZpY2VfeG1sIHBhcmVudF94bWwKK2RvbmUKK0lGUz0kT0xESUZTCisKK2VjaG8gIiNUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkgJDAiCitlY2hvICIjZm9yIGFkZGluZyB0aGlzIGNvbXB1dGUgbm9kZSB0byBvcGVudmltIgorZWNobyAiI2NvcHkgdGhpcyBmaWxlIHRvIG9wZW52aW0gY29udHJvbGxlciBhbmQgcnVuIgorZWNobyAiI29wZW52aW0gaG9zdC1hZGQgPHRoaXM+IgorZWNobworZWNobyAiaG9zdDoiCitlY2hvICIgIG5hbWU6ICAgICRIT1NUX05BTUUiCitlY2hvICIgIHVzZXI6ICAgICQxIgorZWNobyAiICBpcF9uYW1lOiAkMiIKK2VjaG8gImhvc3QtZGF0YToiCitlY2hvICIgIG5hbWU6ICAgICAgICAkSE9TVF9OQU1FIgorZWNobyAiICB1c2VyOiAgICAgICAgJDEiCitlY2hvICIgIGlwX25hbWU6ICAgICAkMiIKK2VjaG8gIiAgcmFua2luZzogICAgIDEwMCIKK2VjaG8gIiAgZGVzY3JpcHRpb246ICRIT1NUX05BTUUiCitlY2hvICIgIGZlYXR1cmVzOiAgICAkRkVBVFVSRVNfTElTVCIKK2VjaG8gIiAgbnVtYXM6IgorCitudW1hPTAKK3doaWxlIFtbICRudW1hIC1sdCAkTlVNQVMgXV0KK2RvCisgIGVjaG8gIiAgLSBudW1hX3NvY2tldDogICRudW1hIgorI01FTU9SWQorICBpZiBbIC1mIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlJHtudW1hfS9odWdlcGFnZXMvaHVnZXBhZ2VzLTEwNDg1NzZrQi9ucl9odWdlcGFnZXMgXQorICB0aGVuCisgICAgZWNobyAiICAgIGh1Z2VwYWdlczogIiBgY2F0IC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlJHtudW1hfS9odWdlcGFnZXMvaHVnZXBhZ2VzLTEwNDg1NzZrQi9ucl9odWdlcGFnZXNgCisgIGVsc2UKKyAgICAjVE9ETyBodWdlcGFnZXMgb2YgMjA0OGtCIHNpemUKKyAgICBlY2hvICIgICAgaHVnZXBhZ2VzOiAgMCIKKyAgZmkKKyAgbWVtb3J5PWBoZWFkIC1uMSAvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZSR7bnVtYX0vbWVtaW5mbyAgfCBnYXdrICcoJDU9PSJrQiIpe3ByaW50ICQ0fSdgCisgIG1lbW9yeT0kKChtZW1vcnkrMTA0ODU3Ni0xKSkgICAjbWVtb3J5IG11c3QgYmUgY2VpbGVkCisgIG1lbW9yeT0kKChtZW1vcnkvMTA0ODU3NikpICAgI2Zyb20gYGtCIHRvIEdCCisgIGVjaG8gIiAgICBtZW1vcnk6ICAgICRtZW1vcnkiCisKKyNDT1JFUworICBlY2hvICIgICAgY29yZXM6IgorICBGSVJTVD0iLSIgI2ZpcnN0IGl0ZW0gaW4gYSBsaXN0IHN0YXJ0IHdpdGggIi0iIGluIHlhbWwgZmlsZXMsIHRoZW4gaXQgd2lsbCBzZXQgdG8gIiAiCisgIGZvciBjcHUgaW4gJENQVVMKKyAgZG8KKyAgICBQSFlTSUNBTD1gZWNobyAkY3B1IHwgY3V0IC1mIDEgLWQiLSJgCisgICAgQ09SRT1gZWNobyAkY3B1IHwgY3V0IC1mIDIgLWQiLSJgCisgICAgVEhSRUFEPWBlY2hvICRjcHUgfCBjdXQgLWYgMyAtZCItImAKKyAgICBbWyAkUEhZU0lDQUwgIT0gJG51bWEgXV0gJiYgY29udGludWUgICAjc2tpcCBub24gcGh5c2ljYWwKKyAgICBlY2hvICIgICAgLSBjb3JlX2lkOiAgICRDT1JFIgorICAgIGVjaG8gIiAgICAgIHRocmVhZF9pZDogJFRIUkVBRCIKKyAgICAjY2hlY2sgaWYgZWxpZ2libGUKKyAgICBjcHVfaXNvbGF0ZWQ9Im5vIgorICAgIGZvciBpc29sY3B1IGluICRpc29sY3B1cworICAgIGRvCisgICAgICBpc29sY3B1X3N0YXJ0PWBlY2hvICRpc29sY3B1IHwgY3V0IC1mIDEgLWQiLSJgCisgICAgICBpc29sY3B1X2VuZD1gZWNobyAkaXNvbGNwdSB8IGN1dCAtZiAyIC1kIi0iYAorICAgICAgaWYgWyAiJFRIUkVBRCIgLWdlICIkaXNvbGNwdV9zdGFydCIgLWEgIiRUSFJFQUQiIC1sZSAiJGlzb2xjcHVfZW5kIiBdCisgICAgICB0aGVuCisgICAgICAgIGNwdV9pc29sYXRlZD0ieWVzIgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgW1sgJGNwdV9pc29sYXRlZCA9PSAibm8iIF1dICYmICAgZWNobyAiICAgICAgc3RhdHVzOiAgICBub3RlbGlnaWJsZSIKKyAgICBGSVJTVD0iICIKKyAgZG9uZQorIAorICAjTklDIElOVEVSRkFDRVMKKyAgaW50ZXJmYWNlc19uYj0wCisgIGZvciAoKGk9MDsgaTwkeyNQRl9saXN0W0BdfTtpKyspKQorICBkbworICAgIHVuZGVyc2NvcmVkX3BjaT0ke1BGX2xpc3RbJGldfQorICAgIHBuYW1lPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAibmFtZSIpCisgICAgcG51bWE9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJudW1hIikKKyAgICBbWyAkcG51bWEgIT0gJG51bWEgXV0gJiYgY29udGludWUgCisgICAgcG1hYz0kKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgIm1hYyIpCisgICAgcHBjaT0kKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgInBjaSIpCisgICAgcHNwZWVkPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAic3BlZWQiKQorICAgIHBTUklPVj0kKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgIlNSSU9WIikKKyAgICBbWyAkaW50ZXJmYWNlc19uYiAtZXEgMCBdXSAmJiBlY2hvICIgICAgaW50ZXJmYWNlczoiCisgICAgaW50ZXJmYWNlc19uYj0kKChpbnRlcmZhY2VzX25iKzEpKQorICAgIHNyaW92X25iPTAKKyAgICBlY2hvICIgICAgLSBzb3VyY2VfbmFtZTogJHBuYW1lIgorICAgIGVjaG8gIiAgICAgIE1icHM6ICRwc3BlZWQiCisgICAgZWNobyAiICAgICAgcGNpOiBcIiRwcGNpXCIiCisgICAgZWNobyAiICAgICAgbWFjOiBcIiRwbWFjXCIiCisgICAgaWYgJHByb3ZfY29ubiAKKyAgICAgIHRoZW4KKyAgICAgICAgcGRwaWQ9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJkcGlkIikKKyAgICAgICAgcHN3aXRjaF9wb3J0PSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAic3dpdGNoX3BvcnQiKQorICAgICAgICBlY2hvICIgICAgICBzd2l0Y2hfZHBpZDogJHBkcGlkIgorICAgICAgICBlY2hvICIgICAgICBzd2l0Y2hfcG9ydDogJHBzd2l0Y2hfcG9ydCIKKyAgICBmaQorICAgIGZvciAoKGo9MTtqPD0kcFNSSU9WO2orKykpCisgICAgZG8KKyAgICAgIGNoaWxkU1JJT1Y9InZmcGNpXyIkKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgIlNSSU9WIiRqKQorICAgICAgcG5hbWU9JChnZXRfaGFzaF92YWx1ZSAkY2hpbGRTUklPViAic291cmNlX25hbWUiKQorICAgICAgaW5kZXg9JHtwbmFtZSMjKl99CisgICAgICBwbWFjPSQoZ2V0X2hhc2hfdmFsdWUgJGNoaWxkU1JJT1YgIm1hYyIpCisgICAgICBwcGNpPSQoZ2V0X2hhc2hfdmFsdWUgJGNoaWxkU1JJT1YgInBjaSIpCisgICAgICBbWyAkc3Jpb3ZfbmIgLWVxIDAgXV0gJiYgZWNobyAiICAgICAgc3Jpb3ZzOiIKKyAgICAgIHNyaW92X25iPSQoKHNyaW92X25iKzEpKQorICAgICAgZWNobyAiICAgICAgLSBtYWM6IFwiJHBtYWNcIiIKKyAgICAgIGVjaG8gIiAgICAgICAgcGNpOiBcIiRwcGNpXCIiCisgICAgICBlY2hvICIgICAgICAgIHNvdXJjZV9uYW1lOiAkaW5kZXgiCisgICAgZG9uZQorICBkb25lCisKKyAgbnVtYT0kKChudW1hKzEpKQorZG9uZQorcmVtb3ZlX3ZmX2RyaXZlciBpeGdiZQorcmVtb3ZlX3ZmX2RyaXZlciBpNDBlCisjQnJpbmcgdXAgYWxsIGludGVyZmFjZXMKK2ZvciAoKGk9MDsgaTwkeyNQRl9saXN0W0BdfTtpKyspKQorZG8KKyAgdW5kZXJzY29yZWRfcGNpPSR7UEZfbGlzdFskaV19CisgIHBuYW1lPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAibmFtZSIpCisgIGlmY29uZmlnICRwbmFtZSB1cAorZG9uZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9pbml0b3BlbnZpbS5zaCBiL3NjcmlwdHMvaW5pdG9wZW52aW0uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjlmMzY2NwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvaW5pdG9wZW52aW0uc2gKQEAgLTAsMCArMSwyMTMgQEAKKyMhL2Jpbi9iYXNoCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKyNUaGlzIHNjcmlwdCBjYW4gYmUgdXNlZCBhcyBhIGJhc2ljIHRlc3Qgb2Ygb3BlbnZpbSAKKyNzdG9wcGluZyBvbiBhbiBlcnJvcgorI1dBUk5JTkc6IEl0IGRlc3Ryb3kgdGhlIGRhdGFiYXNlIGNvbnRlbnQKKworCitmdW5jdGlvbiB1c2FnZSgpeworICAgIGVjaG8gLWUgInVzYWdlOiAke0JBU0hfU09VUkNFWzBdfSBbT1BUSU9OU10gPGFjdGlvbj5cbiAgRGVsZXRlcyBvcGVudmltIGNvbnRlbnQgYW5kIGFkZCBmYWtlIGhvc3RzLCBuZXR3b3JrcyIKKyAgICBlY2hvIC1lICIgIDxhY3Rpb24+IGlzIGEgbGlzdCBvZiB0aGUgZm9sbG93aW5nIGl0ZW1zIChieSBkZWZhdWx0ICdyZXNldCBjcmVhdGUnKSIKKyAgICBlY2hvIC1lICIgICAgcmVzZXQgICAgIHJlc2V0IHRoZSBvcGVudmltIGRhdGFiYXNlIGNvbnRlbnQiCisgICAgZWNobyAtZSAiICAgIGNyZWF0ZSAgICBjcmVhdGVzIGZha2UgaG9zdHMgYW5kIG5ldHdvcmtzIgorICAgIGVjaG8gLWUgIiAgICBkZWxldGUgICAgZGVsZXRlIGNyZWF0ZWQgaXRlbXMiCisgICAgZWNobyAtZSAiICAgIGRlbGV0ZS1hbGwgZGVsZXRlIHZtcy4gZmxhdm9ycywgaW1hZ2VzLCAuLi4iCisgICAgZWNobyAtZSAiICBPUFRJT05TOiIKKyAgICBlY2hvIC1lICIgICAgLWYgLS1mb3JjZSA6IGRvZXMgbm90IHByb21wdCBmb3IgY29uZmlybWF0aW9uIgorICAgIGVjaG8gLWUgIiAgICAtZCAtLWRlbGV0ZSA6IHNhbWUgdG8gYWN0aW9uIGRlbGV0ZS1hbGwiCisgICAgZWNobyAtZSAiICAgIC0taW5zZXJ0LWJhc2hyYyAgaW5zZXJ0IHRoZSBjcmVhdGVkIHRlbmFudCB2YXJpYWJsZXMgYXQiCisgICAgZWNobyAtZSAiICAgICAgICAgICAgICAgICAgICAgfi8uYmFzaHJjIHRvIGJlIGF2YWlsYWJsZSBieSBvcGVudmltIENMSSIKKyAgICBlY2hvIC1lICIgICAgLWggLS1oZWxwICA6IHNob3dzIHRoaXMgaGVscCIKK30KKworZnVuY3Rpb24gaXNfdmFsaWRfdXVpZCgpeworICAgIGVjaG8gIiQxIiB8IGdyZXAgLXEgLUUgJ15bMC05YS1mXXs4fS0oWzAtOWEtZl17NH0tKXszfVswLTlhLWZdezEyfSQnICYmIHJldHVybiAwCisgICAgcmV0dXJuIDEKK30KKworCisjZGV0ZWN0IGlmIGlzIGNhbGxlZCB3aXRoIGEgc291cmNlIHRvIHVzZSB0aGUgJ2V4aXQnLydyZXR1cm4nIGNvbW1hbmQgZm9yIGV4aXRpbmcKK1tbICR7QkFTSF9TT1VSQ0VbMF19ICE9ICQwIF1dICYmIF9leGl0PSJyZXR1cm4iIHx8IF9leGl0PSJleGl0IgorCisjY2hlY2sgY29ycmVjdCBhcmd1bWVudHMKK2ZvcmNlPSIiCithY3Rpb25fbGlzdD0iIgoraW5zZXJ0X2Jhc2hyYz0iIgorCit3aGlsZSBbWyAkIyAtZ3QgMCBdXQorZG8KKyAgICBhcmd1bWVudD0iJDEiCisgICAgc2hpZnQKKyAgICBpZiBbWyAkYXJndW1lbnQgPT0gcmVzZXQgXV0gfHwgW1sgJGFyZ3VtZW50ID09IGNyZWF0ZSBdXSB8fCBbWyAkYXJndW1lbnQgPT0gZGVsZXRlIF1dIHx8IFtbICRhcmd1bWVudCA9PSBkZWxldGUtYWxsIF1dCisgICAgdGhlbgorICAgICAgICBhY3Rpb25fbGlzdD0iJGFjdGlvbl9saXN0ICRhcmd1bWVudCIKKyAgICAgICAgY29udGludWUKKyAgICAjc2hvcnQgb3B0aW9ucworICAgIGVsaWYgW1sgJHthcmd1bWVudDowOjF9ID09ICItIiBdXSAmJiBbWyAke2FyZ3VtZW50OjE6MX0gIT0gIi0iIF1dICYmIFtbICR7I2FyZ3VtZW50fSAtZ2UgMiBdXQorICAgIHRoZW4KKyAgICAgICAgaW5kZXg9MAorICAgICAgICB3aGlsZSBpbmRleD0kKChpbmRleCsxKSkgJiYgW1sgJGluZGV4IC1sdCAkeyNhcmd1bWVudH0gXV0KKyAgICAgICAgZG8KKyAgICAgICAgICAgIFtbICR7YXJndW1lbnQ6JGluZGV4OjF9ID09IGggXV0gICYmIHVzYWdlICAgJiYgJF9leGl0IDAKKyAgICAgICAgICAgIFtbICR7YXJndW1lbnQ6JGluZGV4OjF9ID09IGYgXV0gICYmIGZvcmNlPXkgJiYgY29udGludWUKKyAgICAgICAgICAgIFtbICR7YXJndW1lbnQ6JGluZGV4OjF9ID09IGQgXV0gICYmIGFjdGlvbl9saXN0PSJkZWxldGUtYWxsICRhY3Rpb25fbGlzdCIgJiYgY29udGludWUKKyAgICAgICAgICAgIGVjaG8gImludmFsaWQgb3B0aW9uICcke2FyZ3VtZW50OiRpbmRleDoxfSc/ICBUeXBlIC1oIGZvciBoZWxwIiA+JjIgJiYgJF9leGl0IDEKKyAgICAgICAgZG9uZQorICAgICAgICBjb250aW51ZQorICAgIGZpCisgICAgI2xvbmcgb3B0aW9ucworICAgIFtbICRhcmd1bWVudCA9PSAtLWhlbHAgXV0gICAmJiB1c2FnZSAgICYmICRfZXhpdCAwCisgICAgW1sgJGFyZ3VtZW50ID09IC0tZm9yY2UgXV0gICYmIGZvcmNlPXkgJiYgY29udGludWUKKyAgICBbWyAkYXJndW1lbnQgPT0gLS1kZWxldGUgXV0gJiYgYWN0aW9uX2xpc3Q9ImRlbGV0ZS1hbGwgJGFjdGlvbl9saXN0IiAmJiBjb250aW51ZQorICAgIFtbICRhcmd1bWVudCA9PSAtLWluc2VydC1iYXNocmMgXV0gJiYgaW5zZXJ0X2Jhc2hyYz15ICYmIGNvbnRpbnVlCisgICAgZWNobyAiaW52YWxpZCBhcmd1bWVudCAnJGFyZ3VtZW50Jz8gIFR5cGUgLWggZm9yIGhlbHAiID4mMiAmJiAkX2V4aXQgMQorZG9uZQorCitESVJOQU1FPSQoZGlybmFtZSAkKHJlYWRsaW5rIC1mICR7QkFTSF9TT1VSQ0VbMF19KSkKK0RJUnZpbT0kKGRpcm5hbWUgJERJUk5BTUUpCitleHBvcnQgT1BFTlZJTV9IT1NUPWxvY2FsaG9zdAorZXhwb3J0IE9QRU5WSU1fUE9SVD05MDgwCitbWyAkaW5zZXJ0X2Jhc2hyYyA9PSB5IF1dICYmIGVjaG8gLWUgIlxuZXhwb3J0IE9QRU5WSU1fSE9TVD1sb2NhbGhvc3QiICA+PiB+Ly5iYXNocmMKK1tbICRpbnNlcnRfYmFzaHJjID09IHkgXV0gJiYgZWNobyAtZSAiXG5leHBvcnQgT1BFTlZJTV9QT1JUPTkwODAiICA+PiB+Ly5iYXNocmMKKyNieSBkZWZhdWx0IGFjdGlvbiBzaG91bGQgYmUgcmVzZXQgYW5kIGNyZWF0ZQorW1sgLXogJGFjdGlvbl9saXN0IF1dICAmJiBhY3Rpb25fbGlzdD0icmVzZXQgY3JlYXRlIgorCisKK2ZvciBhY3Rpb24gaW4gJGFjdGlvbl9saXN0CitkbworaWYgW1sgJGFjdGlvbiA9PSAicmVzZXQiIF1dCit0aGVuCisgICAgI2FzayBmb3IgY29uZmlybWF0aW9uIGlmIGFyZ3VtZW50IGlzIG5vdCAtZiAtLWZvcmNlCisgICAgZm9yY2VfPSJ5IgorICAgIFtbICRmb3JjZSAgIT0geSBdXSAmJiByZWFkIC1lIC1wICJXQVJOSU5HOiBvcGVudmltIGRhdGFiYXNlIGNvbnRlbnQgd2lsbCBiZSBsb3N0ISEhICBDb250aW51ZSh5L04pIiBmb3JjZV8KKyAgICBbWyAkZm9yY2VfICE9IHkgXV0gJiYgW1sgJGZvcmNlXyAhPSB5ZXMgXV0gJiYgZWNobyAiYWJvcnRlZCEiICYmICRfZXhpdAorICAgIGVjaG8gImRlbGV0aW5nIGRlcGxveWVkIHZtIgorICAgICR7RElSdmltfS9vcGVudmltIHZtLWRlbGV0ZSAtZiB8IGdyZXAgLXEgZGVsZXRlZCAmJiBzbGVlcCAxMCAjZ2l2ZSBzb21lIHRpbWUgdG8gZ2V0IHZpcnR1YWwgbWFjaGluZXMgZGVsZXRlZAorICAgIGVjaG8gIlN0b3BwaW5nIG9wZW52aW0iCisgICAgJERJUk5BTUUvc2VydmljZS1vcGVudmltLnNoIHN0b3AKKyAgICBlY2hvICJJbml0aWFsaXppbmcgZGF0YWJhc2VzIgorICAgICRESVJ2aW0vZGF0YWJhc2VfdXRpbHMvaW5pdF92aW1fZGIuc2ggLXUgdmltIC1wIHZpbXB3CisgICAgZWNobyAiU3RhcnRpbmcgb3BlbnZpbSIKKyAgICAkRElSTkFNRS9zZXJ2aWNlLW9wZW52aW0uc2ggc3RhcnQKKworZWxpZiBbWyAkYWN0aW9uID09IGRlbGV0ZS1hbGwgXV0gCit0aGVuCisgICAgZm9yIHQgaW4gYCR7RElSdmltfS9vcGVudmltIHRlbmFudC1saXN0IHwgYXdrICcvXiAqWzAtOWEtZl17OH0tKFswLTlhLWZdezR9LSl7M31bMC05YS1mXXsxMn0gKy97cHJpbnRmKCIlczolcyIsJDEsJDIpfSdgCisgICAgZG8KKyAgICAgICAgdF9pZD0ke3QlJToqfQorICAgICAgICB0X25hbWU9JHt0Iyo6fQorICAgICAgICBbWyAteiAkdF9pZCBdXSAmJiBjb250aW51ZSAKKyAgICAgICAgZXhwb3J0IE9QRU5WSU1fVEVOQU5UPSR7dF9pZH0KKyAgICAgICAgZm9yIHdoYXQgaW4gdm0gaW1hZ2UgZmxhdm9yIHBvcnQgbmV0CisgICAgICAgIGRvCisgICAgICAgICAgICBpdGVtcz1gJHtESVJ2aW19L29wZW52aW0gJHdoYXQtbGlzdCB8IGF3ayAnL14gKlswLTlhLWZdezh9LShbMC05YS1mXXs0fS0pezN9WzAtOWEtZl17MTJ9ICsve3ByaW50ICQxfSdgCisgICAgICAgICAgICBpZiBbWyAtbiAkaXRlbXMgXV0KKyAgICAgICAgICAgIHRoZW4gCisgICAgICAgICAgICAgICAgW1sgJGZvcmNlID09IHkgXV0gJiYgZWNobyBkZWxldGluZyBvcGVudmltICR7d2hhdH1zIGZyb20gdGVuYW50ICR7dF9uYW1lfQorICAgICAgICAgICAgICAgIFtbICRmb3JjZSAhPSB5IF1dICYmIHJlYWQgLWUgLXAgIkRlbGV0ZSBvcGVudmltICR7d2hhdH1zIGZyb20gdGVuYW50ICR7dF9uYW1lfT8oeS9OKSAiIGZvcmNlXworICAgICAgICAgICAgICAgIFtbICRmb3JjZV8gIT0geSBdXSAmJiBbWyAkZm9yY2VfICE9IHllcyBdXSAmJiBlY2hvICJhYm9ydGVkISIgJiYgJF9leGl0CisgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gJGl0ZW1zCisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgZWNobyAtbiAiJGl0ZW0gICAiCisgICAgICAgICAgICAgICAgICAgICR7RElSdmltfS9vcGVudmltICR3aGF0LWRlbGV0ZSAtZiAkaXRlbSAgfHwgISBlY2hvICJmYWlsIiA+JjIgfHwgJF9leGl0IDEKKyAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgICAgICR7RElSdmltfS9vcGVudmltIHRlbmFudC1kZWxldGUgLWYgJHRfaWQgIHx8ICEgZWNobyAiZmFpbCIgPiYyIHx8ICRfZXhpdCAxCisgICAgICAgIGZvciB3aGF0IGluIGhvc3QKKyAgICAgICAgZG8KKyAgICAgICAgICAgIGl0ZW1zPWAke0RJUnZpbX0vb3BlbnZpbSAkd2hhdC1saXN0IHwgYXdrICcvXiAqWzAtOWEtZl17OH0tKFswLTlhLWZdezR9LSl7M31bMC05YS1mXXsxMn0gKy97cHJpbnQgJDF9J2AKKyAgICAgICAgICAgIGlmIFtbIC1uICRpdGVtcyBdXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIFtbICRmb3JjZSA9PSB5IF1dICYmIGVjaG8gZGVsZXRpbmcgb3BlbnZpbSAke3doYXR9cworICAgICAgICAgICAgICAgIFtbICRmb3JjZSAhPSB5IF1dICYmIHJlYWQgLWUgLXAgIkRlbGV0ZSBvcGVudmltICR7d2hhdH1zPyh5L04pICIgZm9yY2VfCisgICAgICAgICAgICAgICAgW1sgJGZvcmNlXyAhPSB5IF1dICYmIFtbICRmb3JjZV8gIT0geWVzIF1dICYmIGVjaG8gImFib3J0ZWQhIiAmJiAkX2V4aXQKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiAkaXRlbXMKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICBlY2hvIC1uICIkaXRlbSAgICIKKyAgICAgICAgICAgICAgICAgICAgJHtESVJ2aW19L29wZW52aW0gJHdoYXQtZGVsZXRlIC1mICRpdGVtICB8fCAhIGVjaG8gImZhaWwiID4mMiB8fCAkX2V4aXQgMQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKworICAgIGRvbmUKK2VsaWYgW1sgJGFjdGlvbiA9PSAiZGVsZXRlIiBdXQordGhlbgorICAgICR7RElSdmltfS9vcGVudmltIG5ldC1kZWxldGUgLWYgZGVmYXVsdCAgICAgICAgICAgfHwgZWNobyAiZmFpbCIKKyAgICAke0RJUnZpbX0vb3BlbnZpbSBuZXQtZGVsZXRlIC1mIG1hY3Z0YXA6ZW0xICAgICAgIHx8IGVjaG8gImZhaWwiCisgICAgJHtESVJ2aW19L29wZW52aW0gbmV0LWRlbGV0ZSAtZiBzaGFyZWRfYnJpZGdlX25ldCB8fCBlY2hvICJmYWlsIgorICAgICR7RElSdmltfS9vcGVudmltIG5ldC1kZWxldGUgLWYgZGF0YV9uZXQgICAgICAgICAgfHwgZWNobyAiZmFpbCIKKyAgICAke0RJUnZpbX0vb3BlbnZpbSBob3N0LXJlbW92ZSAtZiBmYWtlLWhvc3QtMCAgICAgIHx8IGVjaG8gImZhaWwiCisgICAgJHtESVJ2aW19L29wZW52aW0gaG9zdC1yZW1vdmUgLWYgZmFrZS1ob3N0LTEgICAgICB8fCBlY2hvICJmYWlsIgorICAgICR7RElSdmltfS9vcGVudmltIGhvc3QtcmVtb3ZlIC1mIGZha2UtaG9zdC0yICAgICAgfHwgZWNobyAiZmFpbCIKKyAgICAke0RJUnZpbX0vb3BlbnZpbSBob3N0LXJlbW92ZSAtZiBmYWtlLWhvc3QtMyAgICAgIHx8IGVjaG8gImZhaWwiCisgICAgcmVzdWx0PWBvcGVudmltIHRlbmFudC1saXN0IFRFU1QtYWRtaW5gCisgICAgdmltdGVuYW50PWBlY2hvICRyZXN1bHQgfGdhd2sgJ3twcmludCAkMX0nYAorICAgICNjaGVjayBhIHZhbGlkIHV1aWQgaXMgb2J0YWluZWQKKyAgICBpc192YWxpZF91dWlkICR2aW10ZW5hbnQgfHwgISBlY2hvICJUZW5hbnQgVEVTVC1hZG1pbiBub3QgZm91bmQuIEFscmVhZHkgZGVsZXRlPyIgPiYyIHx8ICRfZXhpdCAxCisgICAgZXhwb3J0IE9QRU5WSU1fVEVOQU5UPSR2aW10ZW5hbnQKKyAgICAke0RJUnZpbX0vb3BlbnZpbSB0ZW5hbnQtZGVsZXRlIC1mIFRFU1QtYWRtaW4gICAgIHx8IGVjaG8gImZhaWwiCisgICAgZWNobworCitlbGlmIFtbICRhY3Rpb24gPT0gImNyZWF0ZSIgXV0KK3RoZW4KKyAgICBlY2hvICJBZGRpbmcgZXhhbXBsZSBob3N0cyIKKyAgICAke0RJUnZpbX0vb3BlbnZpbSBob3N0LWFkZCAkRElSdmltL3Rlc3QvaG9zdHMvaG9zdC1leGFtcGxlMC5qc29uIHx8ICEgZWNobyAiZmFpbCIgPiYyIHx8ICRfZXhpdCAxCisgICAgJHtESVJ2aW19L29wZW52aW0gaG9zdC1hZGQgJERJUnZpbS90ZXN0L2hvc3RzL2hvc3QtZXhhbXBsZTEuanNvbiB8fCAhIGVjaG8gImZhaWwiID4mMiB8fCAkX2V4aXQgMQorICAgICR7RElSdmltfS9vcGVudmltIGhvc3QtYWRkICRESVJ2aW0vdGVzdC9ob3N0cy9ob3N0LWV4YW1wbGUyLmpzb24gfHwgISBlY2hvICJmYWlsIiA+JjIgfHwgJF9leGl0IDEKKyAgICAke0RJUnZpbX0vb3BlbnZpbSBob3N0LWFkZCAkRElSdmltL3Rlc3QvaG9zdHMvaG9zdC1leGFtcGxlMy5qc29uIHx8ICEgZWNobyAiZmFpbCIgPiYyIHx8ICRfZXhpdCAxCisgICAgZWNobyAiQWRkaW5nIGV4YW1wbGUgbmV0cyIKKyAgICAke0RJUnZpbX0vb3BlbnZpbSBuZXQtY3JlYXRlICRESVJ2aW0vdGVzdC9uZXR3b3Jrcy9uZXQtZXhhbXBsZTAueWFtbCB8fCAhIGVjaG8gImZhaWwiID4mMiB8fCAkX2V4aXQgMQorICAgICR7RElSdmltfS9vcGVudmltIG5ldC1jcmVhdGUgJERJUnZpbS90ZXN0L25ldHdvcmtzL25ldC1leGFtcGxlMS55YW1sIHx8ICEgZWNobyAiZmFpbCIgPiYyIHx8ICRfZXhpdCAxCisgICAgJHtESVJ2aW19L29wZW52aW0gbmV0LWNyZWF0ZSAkRElSdmltL3Rlc3QvbmV0d29ya3MvbmV0LWV4YW1wbGUyLnlhbWwgfHwgISBlY2hvICJmYWlsIiA+JjIgfHwgJF9leGl0IDEKKyAgICAke0RJUnZpbX0vb3BlbnZpbSBuZXQtY3JlYXRlICRESVJ2aW0vdGVzdC9uZXR3b3Jrcy9uZXQtZXhhbXBsZTMueWFtbCB8fCAhIGVjaG8gImZhaWwiID4mMiB8fCAkX2V4aXQgMQorCisgICAgcHJpbnRmICIlLTUwcyIgIkNyZWF0aW5nIG9wZW52aW0gdGVuYW50ICdURVNULWFkbWluJzogIgorICAgIHJlc3VsdD1gb3BlbnZpbSB0ZW5hbnQtY3JlYXRlICd7InRlbmFudCI6IHsibmFtZSI6IlRFU1QtYWRtaW4iLCAiZGVzY3JpcHRpb24iOiJhZG1pbiJ9fSdgCisgICAgdmltdGVuYW50PWBlY2hvICRyZXN1bHQgfGdhd2sgJ3twcmludCAkMX0nYAorICAgICNjaGVjayBhIHZhbGlkIHV1aWQgaXMgb2J0YWluZWQKKyAgICAhIGlzX3ZhbGlkX3V1aWQgJHZpbXRlbmFudCAmJiBlY2hvICJGQUlMIiAmJiBlY2hvICIgICAgJHJlc3VsdCIgJiYgJF9leGl0IDEKKyAgICBlY2hvICIgICR2aW10ZW5hbnQiCisgICAgZXhwb3J0IE9QRU5WSU1fVEVOQU5UPSR2aW10ZW5hbnQKKyAgICBbWyAkaW5zZXJ0X2Jhc2hyYyA9PSB5IF1dICYmIGVjaG8gLWUgIlxuZXhwb3J0IE9QRU5WSU1fVEVOQU5UPSR2aW10ZW5hbnQiID4+IH4vLmJhc2hyYworCisgICAgZWNobworICAgICNlY2hvICJDaGVjayB2aXJ0dWFsIG1hY2hpbmVzIGFyZSBkZXBsb3llZCIKKyAgICAjdm1zX2Vycm9yPWBvcGVudmltIHZtLWxpc3QgfCBncmVwIEVSUk9SIHwgd2MgLWxgCisgICAgI3Ztcz1gb3BlbnZpbSB2bS1saXN0IHwgd2MgLWxgCisgICAgI1tbICR2bXMgLW5lIDggXV0gICAgICAgJiYgIGVjaG8gIldBUk5JTkc6ICR2bXMgVk1zIGNyZWF0ZWQsIG11c3QgYmUgOCBWTXMiID4mMiAmJiAkX2V4aXQgMQorICAgICNbWyAkdm1zX2Vycm9yIC1ndCAwIF1dICYmICBlY2hvICJXQVJOSU5HOiAkdm1zX2Vycm9yIFZNcyB3aXRoIEVSUk9SIiA+JjIgICAgICAgJiYgJF9leGl0IDEKK2ZpCitkb25lCisKK2VjaG8KK2VjaG8gRE9ORQorI2VjaG8gIkxpc3RpbmcgVk5GcyIKKyNvcGVudmltIHZuZi1saXN0CisjZWNobyAiTGlzdGluZyBzY2VuYXJpb3MiCisjb3BlbnZpbSBzY2VuYXJpby1saXN0CisjZWNobyAiTGlzdGluZyBzY2VuYXJpbyBpbnN0YW5jZXMiCisjb3BlbnZpbSBpbnN0YW5jZS1zY2VuYXJpby1saXN0CisKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9pbnN0YWxsLWZsb29kbGlnaHQuc2ggYi9zY3JpcHRzL2luc3RhbGwtZmxvb2RsaWdodC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MDZkNWMxCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9pbnN0YWxsLWZsb29kbGlnaHQuc2gKQEAgLTAsMCArMSwxNTAgQEAKKyMhL2Jpbi9iYXNoCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKyNPTkxZIFRFU1RFRCBmb3IgVWJ1bnR1IDE0LjEwIDE0LjA0LCBDZW50T1M3IGFuZCBSSEVMNworI0dldCBuZWVkZWQgcGFja2FnZXMsIHRvIHJ1biBmbG9vZGxpZ2h0CisKK2Z1bmN0aW9uIHVzYWdlKCl7CisgICAgZWNobyAgLWUgInVzYWdlOiBzdWRvICQwIFxuICBJbnN0YWxsIGZsb29kbGlnaHQgdjAuOSBpbiAuL2Zsb29kbGlnaHQtMC45MCIKK30KKworZnVuY3Rpb24gaW5zdGFsbF9wYWNrYWdlcygpeworICAgIFsgLXggL3Vzci9iaW4vYXB0LWdldCBdICYmIGFwdC1nZXQgaW5zdGFsbCAteSAkKgorICAgIFsgLXggL3Vzci9iaW4veXVtIF0gICAgICYmIHl1bSBpbnN0YWxsIC15ICQqICAgCisgICAgCisgICAgI2NoZWNrIHByb3Blcmx5IGluc3RhbGxlZAorICAgIGZvciBQQUNLQUdFIGluICQqCisgICAgZG8KKyAgICAgICAgUEFDS0FHRV9JTlNUQUxMRUQ9Im5vIgorICAgICAgICBbIC14IC91c3IvYmluL2FwdC1nZXQgXSAmJiBkcGtnIC1sICRQQUNLQUdFICAgICAgICAgICAgJj4+IC9kZXYvbnVsbCAmJiBQQUNLQUdFX0lOU1RBTExFRD0ieWVzIgorICAgICAgICBbIC14IC91c3IvYmluL3l1bSBdICAgICAmJiB5dW0gbGlzdCBpbnN0YWxsZWQgJFBBQ0tBR0UgJj4+IC9kZXYvbnVsbCAmJiBQQUNLQUdFX0lOU1RBTExFRD0ieWVzIiAKKyAgICAgICAgaWYgWyAiJFBBQ0tBR0VfSU5TVEFMTEVEIiA9ICJubyIgXQorICAgICAgICB0aGVuCisgICAgICAgICAgICBlY2hvICJmYWlsZWQgdG8gaW5zdGFsbCBwYWNrYWdlICckUEFDS0FHRScuIFJldmlzZSBuZXR3b3JrIGNvbm5lY3Rpdml0eSBhbmQgdHJ5IGFnYWluIgorICAgICAgICAgICAgZXhpdCAtMQorICAgICAgIGZpCisgICAgZG9uZQorfQorCisjY2hlY2sgcm9vdCBwcml2aWxlZ2VzIGFuZCBub24gYSByb290IHVzZXIgYmVoaW5kCitbICIkMSIgPT0gIi1oIiAtbyAiJDEiID09ICItLWhlbHAiIF0gJiYgdXNhZ2UgJiYgZXhpdCAwCitbICIkVVNFUiIgIT0gInJvb3QiIF0gJiYgZWNobyAiTmVlZGVkIHJvb3QgcHJpdmlsZWdlcyIgPiYyICYmIHVzYWdlID4mMiAmJiBleGl0IC0xCitbIC16ICIkU1VET19VU0VSIiAtbyAiJFNVRE9fVVNFUiIgPSAicm9vdCIgXSAmJiBlY2hvICJNdXN0IGJlIHJ1bm5lZCB3aXRoIHN1ZG8gZnJvbSBhIG5vbiByb290IHVzZXIiICA+JjIgJiYgdXNhZ2UgPiYyICYmIGV4aXQgLTEKKworZWNobyAiVGhpcyBzY3JpcHQgd2lsbCB1cGRhdGUgcmVwb3NpdG9yaWVzIGFuZCBJbnN0YWxsaW5nIEZsb29kTGlnaHQuIgorZWNobyAiSXQgd2lsbCBpbnN0YWxsIEphdmEgYW5kIG90aGVyIHBhY2thZ2VzLCB0aGF0IHRha2VzIGEgd2hpbGUgdG8gZG93bmxvYWQiCityZWFkIC1lIC1wICJEbyB5b3UgYWdyZWUgb24gZG93bmxvYWQgYW5kIGluc3RhbGwgRmxvb2RMaWdodCBmcm9tIGh0dHA6Ly93d3cucHJvamVjdGZsb29kbGlnaHQub3JnIHVwb24gdGhlIG93bmVyIGxpY2Vuc2U/ICh5L04pIiBLSworW1sgIiRLSyIgIT0gInkiIF1dICYmIFtbICIkS0siICE9ICJ5ZXMiIF1dICYmIGV4aXQgMAorCisjRGlzY292ZXIgTGludXggZGlzdHJpYnV0aW9uCisjdHJ5IHJlZGhhdCB0eXBlCitbIC1mIC9ldGMvcmVkaGF0LXJlbGVhc2UgXSAmJiBfRElTVFJPPSQoY2F0IC9ldGMvcmVkaGF0LXJlbGVhc2UgMj4vZGV2L251bGwgfCBjdXQgIC1kIiAiIC1mMSkgCisjaWYgbm90IGFzc3VtaW5nIHVidW50dSB0eXBlCitbIC1mIC9ldGMvcmVkaGF0LXJlbGVhc2UgXSB8fCBfRElTVFJPPSQobHNiX3JlbGVhc2UgLWlzICAyPi9kZXYvbnVsbCkgICAgICAgICAgICAKK2lmIFsgIiRfRElTVFJPIiA9PSAiVWJ1bnR1IiBdCit0aGVuCisgICAgX1JFTEVBU0U9IjE0IgorICAgIGlmICEgbHNiX3JlbGVhc2UgLXJzIHwgZ3JlcCAtcSAiMTQuIgorICAgIHRoZW4gCisgICAgICAgIHJlYWQgLWUgLXAgIldBUk5JTkchIE5vdCB0ZXN0ZWQgVWJ1bnR1IHZlcnNpb24uIENvbnRpbnVlIGFzc3VtaW5nIGEgJyRfUkVMRUFTRScgdHlwZT8gKHkvTikiIEtLCisgICAgICAgIFsgIiRLSyIgIT0gInkiIC1hICAiJEtLIiAhPSAieWVzIiBdICYmIGVjaG8gIkNhbmNlbGxlZCIgJiYgZXhpdCAwCisgICAgZmkKK2VsaWYgWyAiJF9ESVNUUk8iID09ICJDZW50T1MiIF0KK3RoZW4KKyAgICBfUkVMRUFTRT0iNyIgCisgICAgaWYgISBjYXQgL2V0Yy9yZWRoYXQtcmVsZWFzZSB8IGdyZXAgLXEgIjcuIgorICAgIHRoZW4KKyAgICAgICAgcmVhZCAtZSAtcCAiV0FSTklORyEgTm90IHRlc3RlZCBDZW50T1MgdmVyc2lvbi4gQ29udGludWUgYXNzdW1pbmcgYSAnX1JFTEVBU0UnIHR5cGU/ICh5L04pIiBLSworICAgICAgICBbICIkS0siICE9ICJ5IiAtYSAgIiRLSyIgIT0gInllcyIgXSAmJiBlY2hvICJDYW5jZWxsZWQiICYmIGV4aXQgMAorICAgIGZpCitlbGlmIFsgIiRfRElTVFJPIiA9PSAiUmVkIiBdCit0aGVuCisgICAgX1JFTEVBU0U9IjciIAorICAgIGlmICEgY2F0IC9ldGMvcmVkaGF0LXJlbGVhc2UgfCBncmVwIC1xICI3LiIKKyAgICB0aGVuCisgICAgICAgIHJlYWQgLWUgLXAgIldBUk5JTkchIE5vdCB0ZXN0ZWQgUmVkIEhhdCBPUyB2ZXJzaW9uLiBDb250aW51ZSBhc3N1bWluZyBhICdfUkVMRUFTRScgdHlwZT8gKHkvTikiIEtLCisgICAgICAgIFsgIiRLSyIgIT0gInkiIC1hICAiJEtLIiAhPSAieWVzIiBdICYmIGVjaG8gIkNhbmNlbGxlZCIgJiYgZXhpdCAwCisgICAgZmkKK2Vsc2UgICNbICIkX0RJU1RSTyIgIT0gIlVidW50dSIgLWEgIiRfRElTVFJPIiAhPSAiQ2VudE9TIiAtYSAiJF9ESVNUUk8iICE9ICJSZWQiIF0gCisgICAgX0RJU1RST19ESVNDT1ZFUj0kX0RJU1RSTworICAgIFsgLXggL3Vzci9iaW4vYXB0LWdldCBdICYmIF9ESVNUUk89IlVidW50dSIgJiYgX1JFTEVBU0U9IjE0IgorICAgIFsgLXggL3Vzci9iaW4veXVtIF0gICAgICYmIF9ESVNUUk89IkNlbnRPUyIgJiYgX1JFTEVBU0U9IjciCisgICAgcmVhZCAtZSAtcCAiV0FSTklORyEgTm90IHRlc3RlZCBMaW51eCBkaXN0cmlidXRpb24gJyRfRElTVFJPX0RJU0NPVkVSICcuIENvbnRpbnVlIGFzc3VtaW5nIGEgJyRfRElTVFJPICRfUkVMRUFTRScgdHlwZT8gKHkvTikiIEtLCisgICAgWyAiJEtLIiAhPSAieSIgLWEgICIkS0siICE9ICJ5ZXMiIF0gJiYgZWNobyAiQ2FuY2VsbGVkIiAmJiBleGl0IDAKK2ZpCisKKworCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICAgICAgICAgIFVQREFURSBSRVBPU0lUT1JJRVMgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCitbICIkX0RJU1RSTyIgPT0gIlVidW50dSIgXSAmJiBhcHQtZ2V0IHVwZGF0ZSAteQorCitbICIkX0RJU1RSTyIgPT0gIkNlbnRPUyIgLW8gIiRfRElTVFJPIiA9PSAiUmVkIiBdICYmIHl1bSBjaGVjay11cGRhdGUgLXkKK1sgIiRfRElTVFJPIiA9PSAiQ2VudE9TIiAtbyAiJF9ESVNUUk8iID09ICJSZWQiIF0gJiYgc3VkbyB5dW0gcmVwb2xpc3QKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgIERPV05MT0FESU5HIEFORCBDT05GSUdVUkUgRkxPT0RMSUdIVCAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworICAgICNJbnN0YWxsIEphdmEgSkRLIGFuZCBBbnQgcGFja2FnZXMgYXQgdGhlIFZNIAorICAgIFsgIiRfRElTVFJPIiA9PSAiVWJ1bnR1IiBdICYmIGluc3RhbGxfcGFja2FnZXMgImJ1aWxkLWVzc2VudGlhbCBkZWZhdWx0LWpkayBhbnQgcHl0aG9uLWRldiBzY3JlZW4gd2dldCIgI1RPRE8gcmV2aXNlIGlmIHBhY2thZ2VzIGFyZSBuZWVkZWQgYXBhcnQgZnJvbSBhbnQKKyAgICBbICIkX0RJU1RSTyIgPT0gIkNlbnRPUyIgLW8gIiRfRElTVFJPIiA9PSAiUmVkIiBdICYmIGluc3RhbGxfcGFja2FnZSAiICAgICAgICAgICAgICAgICBhbnQgc2NyZWVuIHdnZXQiCisKKyAgI2Zsb29kbGlnaHQgMC45CisgICAgZWNobyAiZG93bmxvYWRpbmcgdjAuOTAgZnJvbSB0aGUgb2ZpY2lhbCBwYWdlIgorICAgIHN1ICRTVURPX1VTRVIgLWMgJ3dnZXQgaHR0cHM6Ly9naXRodWIuY29tL2Zsb29kbGlnaHQvZmxvb2RsaWdodC9hcmNoaXZlL3YwLjkwLnRhci5neicKKyAgICBzdSAkU1VET19VU0VSIC1jICd0YXIgeHZ6ZiB2MC45MC50YXIuZ3onCisgICNmbG9vZGxpZ2h0IDEuMQorICAgICNlY2hvICJkb3dubG9hZGluZyB2MS4xIGZyb20gdGhlIG9maWNpYWwgcGFnZSIKKyAgICAjc3UgJFNVRE9fVVNFUiAtYyAnd2dldCBodHRwczovL2dpdGh1Yi5jb20vZmxvb2RsaWdodC9mbG9vZGxpZ2h0L2FyY2hpdmUvdjEuMS50YXIuZ3onCisgICAgI3N1ICRTVURPX1VTRVIgLWMgJ3RhciB4dnpmIHYwMS4xLnRhci5neicKKyAgICAKKyAgICAjQ29uZmlndXJlIEphdmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBJdCBpcyBzZWVtIHRoYXQgaXMgbm90IG5lZWRlZCEhIQorICAgICNleHBvcnQgSkFWQV9IT01FPS91c3IvbGliL2p2bS9kZWZhdWx0LWphdmEiID4+IC9ob21lLyR7U1VET19VU0VSfS8uYmFzaHIKKyAgICAjZXhwb3J0IFBBVEg9JFBBVEg6JEpBVkFfSE9NRQorICAgICNlY2hvICJleHBvcnQgSkFWQV9IT01FPS91c3IvbGliL2p2bS9kZWZhdWx0LWphdmEiID4+IC9ob21lLyR7U1VET19VU0VSfS8uYmFzaHJjCisgICAgI2VjaG8gImV4cG9ydCBQQVRIPSRQQVRIOiRKQVZBX0hPTUUiID4+IC9ob21lLyR7U1VET19VU0VSfS8uYmFzaHJjCisKKyAgICAjQ29tcGlsZSBmbG9vZGxpZ2h0CisgICAgcHVzaGQgLi9mbG9vZGxpZ2h0LTAuOTAKKyAgICAjcHVzaGQgLi9mbG9vZGxpZ2h0LTEuMQorICAgIHN1ICRTVURPX1VTRVIgLWMgJ2FudCcKKyAgICBleHBvcnQgRkxPT0RMSUdIVF9QQVRIPSQocHdkKQorICAgIHBvcGQKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgIENPTkZJR1VSRSBlbnZpb3Jvbm1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworI2luc2VydCBpbnRvIC5iYXNocmMKKyAgICBlY2hvICIgICAgaW5zZXJ0aW5nIEZMT09ETElHSFRfUEFUSCBhdCAuYmFzaHJjIgorICAgIHN1ICRTVURPX1VTRVIgLWMgImVjaG8gJ2V4cG9ydCBGTE9PRExJR0hUX1BBVEg9XCIke0ZMT09ETElHSFRfUEFUSH1cIicgID4+IH4vLmJhc2hyYyIKKworZWNobworZWNobyAiRG9uZSEgIHlvdSBtYXkgbmVlZCB0byBsb2dvdXQgYW5kIGxvZ2luIGFnYWluIGZvciBsb2FkaW5nIHRoZSBjb25maWd1cmF0aW9uIgorZWNobyAiIElmIHlvdXIgaGF2ZSBpbnN0YWxsZWQgb3BlbnZpbSwgcnVuICcuL29wZW52aW0vc2NyaXB0cy9zZXJ2aWNlLWZsb29kbGlnaHQuc2ggc3RhcnQnIGZvciBzdGFydGluZyBmbG9vZGxpZ2h0IGluIGEgc2NyZWVuIgorCisKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9pbnN0YWxsLW9wZW52aW0uc2ggYi9zY3JpcHRzL2luc3RhbGwtb3BlbnZpbS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYmYwZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9pbnN0YWxsLW9wZW52aW0uc2gKQEAgLTAsMCArMSwyNjAgQEAKKyMhL2Jpbi9iYXNoCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKyNPTkxZIFRFU1RFRCBmb3IgVWJ1bnR1IDE0LjEwIDE0LjA0LCBDZW50T1M3IGFuZCBSSEVMNworI0dldCBuZWVkZWQgcGFja2FnZXMsIHNvdXJjZSBjb2RlIGFuZCBjb25maWd1cmUgdG8gcnVuIG9wZW52aW0KKyNBc2sgZm9yIGRhdGFiYXNlIHVzZXIgYW5kIHBhc3N3b3JkIGlmIG5vdCBwcm92aWRlZAorIyAgICAgICAgJDE6IGRhdGFiYXNlIHVzZXIKKyMgICAgICAgICQyOiBkYXRhYmFzZSBwYXNzd29yZCAKKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvICAtZSAidXNhZ2U6IHN1ZG8gJDAgW2RiLXVzZXIgW2RiLXBhc3N3ZF1dXG4gIEluc3RhbGwgc291cmNlIGNvZGUgaW4gLi9vcGVudmltIgorfQorCitmdW5jdGlvbiBpbnN0YWxsX3BhY2thZ2VzKCl7CisgICAgWyAteCAvdXNyL2Jpbi9hcHQtZ2V0IF0gJiYgYXB0LWdldCBpbnN0YWxsIC15ICQqCisgICAgWyAteCAvdXNyL2Jpbi95dW0gXSAgICAgJiYgeXVtIGluc3RhbGwgLXkgJCogICAKKyAgICAKKyAgICAjY2hlY2sgcHJvcGVybHkgaW5zdGFsbGVkCisgICAgZm9yIFBBQ0tBR0UgaW4gJCoKKyAgICBkbworICAgICAgICBQQUNLQUdFX0lOU1RBTExFRD0ibm8iCisgICAgICAgIFsgLXggL3Vzci9iaW4vYXB0LWdldCBdICYmIGRwa2cgLWwgJFBBQ0tBR0UgICAgICAgICAgICAmPj4gL2Rldi9udWxsICYmIFBBQ0tBR0VfSU5TVEFMTEVEPSJ5ZXMiCisgICAgICAgIFsgLXggL3Vzci9iaW4veXVtIF0gICAgICYmIHl1bSBsaXN0IGluc3RhbGxlZCAkUEFDS0FHRSAmPj4gL2Rldi9udWxsICYmIFBBQ0tBR0VfSU5TVEFMTEVEPSJ5ZXMiIAorICAgICAgICBpZiBbICIkUEFDS0FHRV9JTlNUQUxMRUQiID0gIm5vIiBdCisgICAgICAgIHRoZW4KKyAgICAgICAgICAgIGVjaG8gImZhaWxlZCB0byBpbnN0YWxsIHBhY2thZ2UgJyRQQUNLQUdFJy4gUmV2aXNlIG5ldHdvcmsgY29ubmVjdGl2aXR5IGFuZCB0cnkgYWdhaW4iCisgICAgICAgICAgICBleGl0IC0xCisgICAgICAgZmkKKyAgICBkb25lCit9CisKKyNjaGVjayByb290IHByaXZpbGVnZXMgYW5kIG5vbiBhIHJvb3QgdXNlciBiZWhpbmQKK1sgIiQxIiA9PSAiLWgiIC1vICIkMSIgPT0gIi0taGVscCIgXSAmJiB1c2FnZSAmJiBleGl0IDAKK1sgIiRVU0VSIiAhPSAicm9vdCIgXSAmJiBlY2hvICJOZWVkZWQgcm9vdCBwcml2aWxlZ2VzIiA+JjIgJiYgdXNhZ2UgPiYyICYmIGV4aXQgLTEKK1sgLXogIiRTVURPX1VTRVIiIC1vICIkU1VET19VU0VSIiA9ICJyb290IiBdICYmIGVjaG8gIk11c3QgYmUgcnVubmVkIHdpdGggc3VkbyBmcm9tIGEgbm9uIHJvb3QgdXNlciIgID4mMiAmJiB1c2FnZSA+JjIgJiYgZXhpdCAtMQorCisKKyNEaXNjb3ZlciBMaW51eCBkaXN0cmlidXRpb24KKyN0cnkgcmVkaGF0IHR5cGUKK1sgLWYgL2V0Yy9yZWRoYXQtcmVsZWFzZSBdICYmIF9ESVNUUk89JChjYXQgL2V0Yy9yZWRoYXQtcmVsZWFzZSAyPi9kZXYvbnVsbCB8IGN1dCAgLWQiICIgLWYxKSAKKyNpZiBub3QgYXNzdW1pbmcgdWJ1bnR1IHR5cGUKK1sgLWYgL2V0Yy9yZWRoYXQtcmVsZWFzZSBdIHx8IF9ESVNUUk89JChsc2JfcmVsZWFzZSAtaXMgIDI+L2Rldi9udWxsKSAgICAgICAgICAgIAoraWYgWyAiJF9ESVNUUk8iID09ICJVYnVudHUiIF0KK3RoZW4KKyAgICBfUkVMRUFTRT0iMTQiCisgICAgaWYgISBsc2JfcmVsZWFzZSAtcnMgfCBncmVwIC1xICIxNC4iCisgICAgdGhlbiAKKyAgICAgICAgcmVhZCAtZSAtcCAiV0FSTklORyEgTm90IHRlc3RlZCBVYnVudHUgdmVyc2lvbi4gQ29udGludWUgYXNzdW1pbmcgYSAnJF9SRUxFQVNFJyB0eXBlPyAoeS9OKSIgS0sKKyAgICAgICAgWyAiJEtLIiAhPSAieSIgLWEgICIkS0siICE9ICJ5ZXMiIF0gJiYgZWNobyAiQ2FuY2VsbGVkIiAmJiBleGl0IDAKKyAgICBmaQorZWxpZiBbICIkX0RJU1RSTyIgPT0gIkNlbnRPUyIgXQordGhlbgorICAgIF9SRUxFQVNFPSI3IiAKKyAgICBpZiAhIGNhdCAvZXRjL3JlZGhhdC1yZWxlYXNlIHwgZ3JlcCAtcSAiNy4iCisgICAgdGhlbgorICAgICAgICByZWFkIC1lIC1wICJXQVJOSU5HISBOb3QgdGVzdGVkIENlbnRPUyB2ZXJzaW9uLiBDb250aW51ZSBhc3N1bWluZyBhICdfUkVMRUFTRScgdHlwZT8gKHkvTikiIEtLCisgICAgICAgIFsgIiRLSyIgIT0gInkiIC1hICAiJEtLIiAhPSAieWVzIiBdICYmIGVjaG8gIkNhbmNlbGxlZCIgJiYgZXhpdCAwCisgICAgZmkKK2VsaWYgWyAiJF9ESVNUUk8iID09ICJSZWQiIF0KK3RoZW4KKyAgICBfUkVMRUFTRT0iNyIgCisgICAgaWYgISBjYXQgL2V0Yy9yZWRoYXQtcmVsZWFzZSB8IGdyZXAgLXEgIjcuIgorICAgIHRoZW4KKyAgICAgICAgcmVhZCAtZSAtcCAiV0FSTklORyEgTm90IHRlc3RlZCBSZWQgSGF0IE9TIHZlcnNpb24uIENvbnRpbnVlIGFzc3VtaW5nIGEgJ19SRUxFQVNFJyB0eXBlPyAoeS9OKSIgS0sKKyAgICAgICAgWyAiJEtLIiAhPSAieSIgLWEgICIkS0siICE9ICJ5ZXMiIF0gJiYgZWNobyAiQ2FuY2VsbGVkIiAmJiBleGl0IDAKKyAgICBmaQorZWxzZSAgI1sgIiRfRElTVFJPIiAhPSAiVWJ1bnR1IiAtYSAiJF9ESVNUUk8iICE9ICJDZW50T1MiIC1hICIkX0RJU1RSTyIgIT0gIlJlZCIgXSAKKyAgICBfRElTVFJPX0RJU0NPVkVSPSRfRElTVFJPCisgICAgWyAteCAvdXNyL2Jpbi9hcHQtZ2V0IF0gJiYgX0RJU1RSTz0iVWJ1bnR1IiAmJiBfUkVMRUFTRT0iMTQiCisgICAgWyAteCAvdXNyL2Jpbi95dW0gXSAgICAgJiYgX0RJU1RSTz0iQ2VudE9TIiAmJiBfUkVMRUFTRT0iNyIKKyAgICByZWFkIC1lIC1wICJXQVJOSU5HISBOb3QgdGVzdGVkIExpbnV4IGRpc3RyaWJ1dGlvbiAnJF9ESVNUUk9fRElTQ09WRVIgJy4gQ29udGludWUgYXNzdW1pbmcgYSAnJF9ESVNUUk8gJF9SRUxFQVNFJyB0eXBlPyAoeS9OKSIgS0sKKyAgICBbICIkS0siICE9ICJ5IiAtYSAgIiRLSyIgIT0gInllcyIgXSAmJiBlY2hvICJDYW5jZWxsZWQiICYmIGV4aXQgMAorZmkKKworCisKK2VjaG8gJworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjICAgICAgICAgICAgICAgVVBEQVRFIFJFUE9TSVRPUklFUyAgICAgICAgICAgICAgICAgICAgICMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKK1sgIiRfRElTVFJPIiA9PSAiVWJ1bnR1IiBdICYmIGFwdC1nZXQgdXBkYXRlIC15CisKK1sgIiRfRElTVFJPIiA9PSAiQ2VudE9TIiAtbyAiJF9ESVNUUk8iID09ICJSZWQiIF0gJiYgeXVtIGNoZWNrLXVwZGF0ZSAteQorWyAiJF9ESVNUUk8iID09ICJDZW50T1MiIF0gJiYgc3VkbyB5dW0gaW5zdGFsbCAteSBlcGVsLXJlbGVhc2UKK1sgIiRfRElTVFJPIiA9PSAiUmVkIiBdICYmIHdnZXQgaHR0cDovL2RsLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsLzcveDg2XzY0L2UvZXBlbC1yZWxlYXNlLTctNS5ub2FyY2gucnBtIFwKKyAgJiYgc3VkbyBycG0gLWl2aCBlcGVsLXJlbGVhc2UtNy01Lm5vYXJjaC5ycG0gJiYgc3VkbyB5dW0gaW5zdGFsbCAteSBlcGVsLXJlbGVhc2UgJiYgcm0gLWYgZXBlbC1yZWxlYXNlLTctNS5ub2FyY2gucnBtCitbICIkX0RJU1RSTyIgPT0gIkNlbnRPUyIgLW8gIiRfRElTVFJPIiA9PSAiUmVkIiBdICYmIHN1ZG8geXVtIHJlcG9saXN0CisKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgICAgICAgICBJTlNUQUxMIFJFUVVJUkVEIFBBQ0tBR0VTICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworWyAiJF9ESVNUUk8iID09ICJVYnVudHUiIF0gJiYgaW5zdGFsbF9wYWNrYWdlcyAibXlzcWwtc2VydmVyIgorWyAiJF9ESVNUUk8iID09ICJDZW50T1MiIC1vICIkX0RJU1RSTyIgPT0gIlJlZCIgXSAmJiBpbnN0YWxsX3BhY2thZ2VzICJtYXJpYWRiIG1hcmlhZGItc2VydmVyIgorCitpZiBbICIkX0RJU1RSTyIgPT0gIkNlbnRPUyIgLW8gIiRfRElTVFJPIiA9PSAiUmVkIiBdCit0aGVuCisgICAgI3N0YXJ0IHNlcnZpY2VzLiBCeSBkZWZhdWx0IENlbnRPUyBkb2VzIG5vdCBzdGFydCBzZXJ2aWNlcworICAgIHNlcnZpY2UgbWFyaWFkYiBzdGFydAorICAgIHNlcnZpY2UgaHR0cGQgICBzdGFydAorICAgIHN5c3RlbWN0bCBlbmFibGUgbWFyaWFkYgorICAgIHN5c3RlbWN0bCBlbmFibGUgaHR0cGQKKyAgICByZWFkIC1lIC1wICJEbyB5b3Ugd2FudCB0byBjb25maWd1cmUgbWFyaWFkYiAocmVjb21lbmRlZCBpZiBub3QgZG9uZSBiZWZvcmUpIChZL24pIiBLSworICAgIFsgIiRLSyIgIT0gIm4iIC1hICAiJEtLIiAhPSAibm8iIF0gJiYgbXlzcWxfc2VjdXJlX2luc3RhbGxhdGlvbgorCisgICAgcmVhZCAtZSAtcCAiRG8geW91IHdhbnQgdG8gc2V0IGZpcmV3YWxsIHRvIGdyYW50IHdlYiBhY2Nlc3MgcG9ydCA4MCw0NDMgIChZL24pIiBLSworICAgIFsgIiRLSyIgIT0gIm4iIC1hICAiJEtLIiAhPSAibm8iIF0gJiYgCisgICAgICAgIGZpcmV3YWxsLWNtZCAtLXBlcm1hbmVudCAtLXpvbmU9cHVibGljIC0tYWRkLXNlcnZpY2U9aHR0cCAmJgorICAgICAgICBmaXJld2FsbC1jbWQgLS1wZXJtYW5lbnQgLS16b25lPXB1YmxpYyAtLWFkZC1zZXJ2aWNlPWh0dHBzICYmCisgICAgICAgIGZpcmV3YWxsLWNtZCAtLXJlbG9hZAorZmkKKworI2NoZWNrIGFuZCBhc2sgZm9yIGRhdGFiYXNlIHVzZXIgcGFzc3dvcmQuIE11c3QgYmUgZG9uZSBhZnRlciBkYXRhYmFzZSBpbnN0YWxhdGlvbgorWyAtbiAiJDEiIF0gJiYgREJVU0VSPSQxCitbIC16ICIkMSIgXSAmJiBEQlVTRVI9cm9vdAorWyAtbiAiJDIiIF0gJiYgREJQQVNTV0Q9Ii1wJDIiCitbIC16ICIkMiIgXSAmJiBEQlBBU1NXRD0iIgorZWNobyAtZSAiXG5DaGVraW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIGFzayBmb3IgY3JlZGVudGlhbHMiCit3aGlsZSAhICBlY2hvICIiIHwgbXlzcWwgLXUkREJVU0VSICREQlBBU1NXRAorZG8KKyAgICAgICAgWyAtbiAiJGxvZ2ludHJ5IiBdICYmICBlY2hvIC1lICJcbkludmFsaWQgZGF0YWJhc2UgY3JlZGVudGlhbHMhISEuIFRyeSBhZ2FpbiAoQ3RybCtjIHRvIGFib3J0KSIKKyAgICAgICAgWyAteiAiJGxvZ2ludHJ5IiBdICYmICBlY2hvIC1lICJcblByb3ZpZGUgZGF0YWJhc2UgY3JlZGVudGlhbHMiCisgICAgICAgIHJlYWQgLWUgLXAgImRhdGFiYXNlIHVzZXI/ICgkREJVU0VSKSAiIERCVVNFUl8KKyAgICAgICAgWyAtbiAiJERCVVNFUl8iIF0gJiYgREJVU0VSPSREQlVTRVJfCisgICAgICAgIHJlYWQgLWUgLXMgLXAgImRhdGFiYXNlIHBhc3N3b3JkPyAoRW50ZXIgZm9yIG5vdCB1c2luZyBwYXNzd29yZCkgIiBEQlBBU1NXRF8KKyAgICAgICAgWyAtbiAiJERCUEFTU1dEXyIgXSAmJiBEQlBBU1NXRD0iLXAkREJQQVNTV0RfIgorICAgICAgICBbIC16ICIkREJQQVNTV0RfIiBdICYmIERCUEFTU1dEPSIiCisgICAgICAgIGxvZ2ludHJ5PSJ5ZXMiCitkb25lCisKK2VjaG8gJworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjICAgICAgICAgICAgICAgSU5TVEFMTCBQWVRIT04gUEFDS0FHRVMgICAgICAgICAgICAgICAgICMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKK1sgIiRfRElTVFJPIiA9PSAiVWJ1bnR1IiBdICYmIGluc3RhbGxfcGFja2FnZXMgInB5dGhvbi15YW1sIHB5dGhvbi1saWJ2aXJ0IHB5dGhvbi1ib3R0bGUgcHl0aG9uLW15c3FsZGIgcHl0aG9uLWpzb25zY2hlbWEgcHl0aG9uLXBhcmFtaWtvIHB5dGhvbi1hcmdjb21wbGV0ZSBweXRob24tcmVxdWVzdHMgZ2l0IHNjcmVlbiB3Z2V0IgorWyAiJF9ESVNUUk8iID09ICJDZW50T1MiIC1vICIkX0RJU1RSTyIgPT0gIlJlZCIgXSAmJiBpbnN0YWxsX3BhY2thZ2VzICJQeVlBTUwgbGlidmlydC1weXRob24gTXlTUUwtcHl0aG9uIHB5dGhvbi1qc29uc2NoZW1hIHB5dGhvbi1wYXJhbWlrbyBweXRob24tYXJnY29tcGxldGUgcHl0aG9uLXJlcXVlc3RzIGdpdCBzY3JlZW4gd2dldCIKKworI1RoZSBvbmx5IHdheSB0byBpbnN0YWxsIHB5dGhvbi1ib3R0bGUgb24gQ2VudG9zNyBpcyB3aXRoIGVhc3lfaW5zdGFsbCBvciBwaXAKK1sgIiRfRElTVFJPIiA9PSAiQ2VudE9TIiAtbyAiJF9ESVNUUk8iID09ICJSZWQiIF0gJiYgZWFzeV9pbnN0YWxsIC1VIGJvdHRsZQorCitlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICAgICAgICAgICAgRE9XTkxPQUQgU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCitzdSAkU1VET19VU0VSIC1jICdnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL25mdmxhYnMvb3BlbnZpbS5naXQgb3BlbnZpbScKKyNVbm5jb21lbnQgdG8gdXNlIGEgY29uY3JldGUgYnJhbmNoLCBpZiBub3QgbWFpbiBicmFuY2ggCisjcHVzaGQgb3BlbnZpbQorI3N1ICRTVURPX1VTRVIgLWMgJ2dpdCBjaGVja291dCB2MC40JworI3BvcGQKKworZWNobyAnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMgICAgICAgICAgICAgICBDUkVBVEUgREFUQUJBU0UgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworbXlzcWxhZG1pbiAtdSREQlVTRVIgJERCUEFTU1dEIGNyZWF0ZSB2aW1fZGIKKworZWNobyAiQ1JFQVRFIFVTRVIgJ3ZpbSdAJ2xvY2FsaG9zdCcgaWRlbnRpZmllZCBieSAndmltcHcnOyIgICAgIHwgbXlzcWwgLXUkREJVU0VSICREQlBBU1NXRAorZWNobyAiR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gdmltX2RiLiogVE8gJ3ZpbSdAJ2xvY2FsaG9zdCc7IiAgIHwgbXlzcWwgLXUkREJVU0VSICREQlBBU1NXRAorCitlY2hvICJ2aW0gZGF0YWJhc2UiCitzdSAkU1VET19VU0VSIC1jICcuL29wZW52aW0vZGF0YWJhc2VfdXRpbHMvaW5pdF92aW1fZGIuc2ggLXUgdmltIC1wIHZpbXB3JworCisKK2lmIFsgIiRfRElTVFJPIiA9PSAiQ2VudE9TIiAtbyAiJF9ESVNUUk8iID09ICJSZWQiIF0KK3RoZW4KKyAgICBlY2hvICcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyAgICAgICAgQ09ORklHVVJFIGZpcmV3YWxsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisgICAgcmVhZCAtZSAtcCAiQ29uZmlndXJlIGZpcmV3YWxsZCBmb3Igb3BlbnZpbWQgcG9ydCA5MDgwPyAoWS9uKSIgS0sKKyAgICBpZiBbICIkS0siICE9ICJuIiAtYSAgIiRLSyIgIT0gIm5vIiBdCisgICAgdGhlbgorICAgICAgICAjQ3JlYXRlcyBhIHNlcnZpY2UgZmlsZSBmb3Igb3BlbnZpbQorICAgICAgICBlY2hvICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHNlcnZpY2U+CisgPHNob3J0Pm9wZW52aW1kPC9zaG9ydD4KKyA8ZGVzY3JpcHRpb24+b3BlbnZpbWQgc2VydmljZTwvZGVzY3JpcHRpb24+CisgPHBvcnQgcHJvdG9jb2w9InRjcCIgcG9ydD0iOTA4MCIvPgorPC9zZXJ2aWNlPicgPiAvZXRjL2ZpcmV3YWxsZC9zZXJ2aWNlcy9vcGVudmltZC54bWwKKyAgICAgICAgI3B1dCBwcm9wZXIgcGVybWlzc2lvbnMKKyAgICAgICAgcHVzaGQgL2V0Yy9maXJld2FsbGQvc2VydmljZXMgPiAvZGV2L251bGwKKyAgICAgICAgcmVzdG9yZWNvbiBvcGVudmltCisgICAgICAgIGNobW9kIDY0MCBvcGVudmltCisgICAgICAgIHBvcGQgPiAvZGV2L251bGwKKyAgICAgICAgI0FkZCB0aGUgb3BlbnZpbSBzZXJ2aWNlIHRvIHRoZSBkZWZhdWx0IHpvbmUgcGVybWFuZW50bHkgYW5kIHJlbG9hZCB0aGUgZmlyZXdhbGwgY29uZmlndXJhdGlvbgorICAgICAgICBmaXJld2FsbC1jbWQgLS1wZXJtYW5lbnQgLS1hZGQtc2VydmljZT1vcGVudmltID4gL2Rldi9udWxsCisgICAgICAgIGZpcmV3YWxsLWNtZCAtLXJlbG9hZCA+IC9kZXYvbnVsbAorICAgICAgICBlY2hvICJkb25lLiIgCisgICAgZWxzZQorICAgICAgICBlY2hvICJza2lwcGluZy4iCisgICAgZmkKK2ZpCisKK2VjaG8gJworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjICAgICAgICBDT05GSUdVUkUgb3BlbnZpbSBDTElFTlRTICAgICAgICAgICAgICAgICAgICAgICMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKyNjcmVhdGVzIGEgbGluayBhdCB+L2Jpbgorc3UgJFNVRE9fVVNFUiAtYyAnbWtkaXIgLXAgfi9iaW4nCitybSAtZiAvaG9tZS8ke1NVRE9fVVNFUn0vYmluL29wZW52aW0KK3JtIC1mIC9ob21lLyR7U1VET19VU0VSfS9iaW4vb3BlbmZsb3cKK3JtIC1mIC9ob21lLyR7U1VET19VU0VSfS9iaW4vc2VydmljZS1vcGVudmltCitybSAtZiAvaG9tZS8ke1NVRE9fVVNFUn0vYmluL2luaXRvcGVudmltCitybSAtZiAvaG9tZS8ke1NVRE9fVVNFUn0vYmluL3NlcnZpY2UtZmxvb2RsaWdodAorcm0gLWYgL2hvbWUvJHtTVURPX1VTRVJ9L2Jpbi9zZXJ2aWNlLW9wZW5kYXlsaWdodAorcm0gLWYgL2hvbWUvJHtTVURPX1VTRVJ9L2Jpbi9nZXRfZGhjcF9sZWFzZS5zaAorbG4gLXMgJHtQV0R9L29wZW52aW0vb3BlbnZpbSAgIC9ob21lLyR7U1VET19VU0VSfS9iaW4vb3BlbnZpbQorbG4gLXMgJHtQV0R9L29wZW52aW0vb3BlbmZsb3cgIC9ob21lLyR7U1VET19VU0VSfS9iaW4vb3BlbmZsb3cKK2xuIC1zICR7UFdEfS9vcGVudmltL3NjcmlwdHMvc2VydmljZS1vcGVudmltLnNoICAvaG9tZS8ke1NVRE9fVVNFUn0vYmluL3NlcnZpY2Utb3BlbnZpbQorbG4gLXMgJHtQV0R9L29wZW52aW0vc2NyaXB0cy9pbml0b3BlbnZpbS5zaCAgL2hvbWUvJHtTVURPX1VTRVJ9L2Jpbi9pbml0b3BlbnZpbQorbG4gLXMgJHtQV0R9L29wZW52aW0vc2NyaXB0cy9zZXJ2aWNlLWZsb29kbGlnaHQuc2ggIC9ob21lLyR7U1VET19VU0VSfS9iaW4vc2VydmljZS1mbG9vZGxpZ2h0CitsbiAtcyAke1BXRH0vb3BlbnZpbS9zY3JpcHRzL3NlcnZpY2Utb3BlbmRheWxpZ2h0LnNoICAvaG9tZS8ke1NVRE9fVVNFUn0vYmluL3NlcnZpY2Utb3BlbmRheWxpZ2h0CitsbiAtcyAke1BXRH0vb3BlbnZpbS9zY3JpcHRzL2dldF9kaGNwX2xlYXNlLnNoICAvaG9tZS8ke1NVRE9fVVNFUn0vYmluL2dldF9kaGNwX2xlYXNlLnNoCisKKyNpbnNlcnQgL2hvbWUvPHVzZXI+L2JpbiBpbiB0aGUgUEFUSAorI3NraXBlZCBiZWNhdXNlIG5vcm1hbGx5IHRoaXMgaXMgZG9uZSBhdXRob21hdGljYWxseSB3aGVuIH4vYmluIGV4aXN0CisjaWYgISBzdSAkU1VET19VU0VSIC1jICdlY2hvICRQQVRIJyB8IGdyZXAgLXEgIi9ob21lLyR7U1VET19VU0VSfS9iaW4iCisjdGhlbgorIyAgICBlY2hvICIgICAgaW5zZXJ0aW5nIC9ob21lLyRTVURPX1VTRVIvYmluIGluIHRoZSBQQVRIIGF0IC5iYXNocmMiCisjICAgIHN1ICRTVURPX1VTRVIgLWMgJ2VjaG8gIlBBVEg9XCRQQVRIOi9ob21lL1wke1VTRVJ9L2JpbiIgPj4gfi8uYmFzaHJjJworI2ZpCisKKyNjb25maWd1cmUgYXJnLWF1dG9jb21wbGV0ZSBmb3IgdGhpcyB1c2VyCisjaW4gY2FzZSBvZiBtaW5tYWwgaW5zdGFsYXRpb24gdGhpcyBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQgYnkgZGVmYXVsdAorW1sgIiRfRElTVFJPIiA9PSAiQ2VudE9TIiB8fCAiJF9ESVNUUk8iID09ICJSZWQiIF1dICYmIHl1bSBpbnN0YWxsIC15IGJhc2gtY29tcGxldGlvbgorI3N1ICRTVURPX1VTRVIgLWMgJ21rZGlyIC1wIH4vLmJhc2hfY29tcGxldGlvbi5kJworc3UgJFNVRE9fVVNFUiAtYyAnYWN0aXZhdGUtZ2xvYmFsLXB5dGhvbi1hcmdjb21wbGV0ZSAtLXVzZXInCitpZiAhIGdyZXAgLXEgYmFzaF9jb21wbGV0aW9uLmQvcHl0aG9uLWFyZ2NvbXBsZXRlLnNoIC9ob21lLyR7U1VET19VU0VSfS8uYmFzaHJjCit0aGVuCisgICAgZWNobyAiICAgIGluc2VydGluZyAuYmFzaF9jb21wbGV0aW9uLmQvcHl0aG9uLWFyZ2NvbXBsZXRlLnNoIGV4ZWN1dGlvbiBhdCAuYmFzaHJjIgorICAgIHN1ICRTVURPX1VTRVIgLWMgJ2VjaG8gIi4gL2hvbWUvJHtVU0VSfS8uYmFzaF9jb21wbGV0aW9uLmQvcHl0aG9uLWFyZ2NvbXBsZXRlLnNoIiA+PiB+Ly5iYXNocmMnCitmaQorCitlY2hvCitlY2hvICJEb25lISAgeW91IG1heSBuZWVkIHRvIGxvZ291dCBhbmQgbG9naW4gYWdhaW4gZm9yIGxvYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24iCitlY2hvICIgUnVuICcuL29wZW52aW0vc2NyaXB0cy9zZXJ2aWNlLW9wZW52aW0uc2ggc3RhcnQnIGZvciBzdGFydGluZyBvcGVudmltIGluIGEgc2NyZWVuIgorCisKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9vcGVudmltLXJlcG9ydC5zaCBiL3NjcmlwdHMvb3BlbnZpbS1yZXBvcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTUxNjM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvb3BlbnZpbS1yZXBvcnQuc2gKQEAgLTAsMCArMSw5MiBAQAorIyEvYmluL2Jhc2gKKworIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworI0l0IGdlbmVyYXRlcyBhIHJlcG9ydCBmb3IgZGVidWdnaW5nCisKK0RJUk5BTUU9JChyZWFkbGluayAtZiAke0JBU0hfU09VUkNFWzBdfSkKK0RJUk5BTUU9JChkaXJuYW1lICRESVJOQU1FICkKK09WQ0xJRU5UPSRESVJOQU1FLy4uL29wZW52aW0KKworI2dldCBzY3JlZW4gbG9nIGZpbGVzIGF0IHRoZSBiZWdpbm5pbmcKK2VjaG8KK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitlY2hvICJsb2cgZmlsZXMiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobworZWNobyAiY2F0ICRESVJOQU1FLy4uL2xvZ3Mvb3BlbnZpbS5sb2cqIgorY2F0ICRESVJOQU1FLy4uL2xvZ3Mvb3BlbnZpbS5sb2cqCitlY2hvCitlY2hvCisKKyNnZXQgdmVyc2lvbgorZWNobworZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gInZlcnNpb24iCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiY2F0ICRESVJOQU1FLy4uL29wZW52aW1kLnB5fGdyZXAgXl9fdmVyc2lvbl9fIgorY2F0ICRESVJOQU1FLy4uL29wZW52aW1kLnB5fGdyZXAgXl9fdmVyc2lvbl9fCitlY2hvCitlY2hvCisKKyNnZXQgY29uZmlndXJhdGlvbiBmaWxlcworZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIkNvbmZpZ3VyYXRpb24gZmlsZXMiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiY2F0ICRESVJOQU1FLy4uL29wZW52aW1kLmNmZyIKK2NhdCAkRElSTkFNRS8uLi9vcGVudmltZC5jZmcKK2VjaG8KKworI2dldCBsaXN0IG9mIGl0ZW1zCitmb3IgdmVyYm9zZSBpbiAiIiAiLXZ2diIKK2RvCisgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgIGVjaG8gIk9QRU5WSU0kdmVyYm9zZSIKKyAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgZWNobyAiJE9WQ0xJRU5UIGNvbmZpZyIKKyAgJE9WQ0xJRU5UIGNvbmZpZworICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICBlY2hvICIkT1ZDTElFTlQgdGVuYW50LWxpc3QgJHZlcmJvc2UiCisgICRPVkNMSUVOVCB0ZW5hbnQtbGlzdCAkdmVyYm9zZQorICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICBlY2hvICIkT1ZDTElFTlQgaG9zdC1saXN0ICR2ZXJib3NlIgorICAkT1ZDTElFTlQgaG9zdC1saXN0ICR2ZXJib3NlCisgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgIGVjaG8gIiRPVkNMSUVOVCBuZXQtbGlzdCAkdmVyYm9zZSIKKyAgJE9WQ0xJRU5UIG5ldC1saXN0ICR2ZXJib3NlCisgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgIGVjaG8gIiRPVkNMSUVOVCBwb3J0LWxpc3QgJHZlcmJvc2UiCisgICRPVkNMSUVOVCBwb3J0LWxpc3QgJHZlcmJvc2UKKyAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgZWNobyAiJE9WQ0xJRU5UIGZsYXZvci1saXN0ICR2ZXJib3NlIgorICAkT1ZDTElFTlQgZmxhdm9yLWxpc3QgJHZlcmJvc2UKKyAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgZWNobyAiJE9WQ0xJRU5UIGltYWdlLWxpc3QgJHZlcmJvc2UiCisgICRPVkNMSUVOVCBpbWFnZS1saXN0ICR2ZXJib3NlCisgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgIGVjaG8gIiRPVkNMSUVOVCB2bS1saXN0ICR2ZXJib3NlIgorICAkT1ZDTElFTlQgdm0tbGlzdCAkdmVyYm9zZQorICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICBlY2hvCisKK2RvbmUKK2VjaG8KZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2VydmljZS1mbG9vZGxpZ2h0LnNoIGIvc2NyaXB0cy9zZXJ2aWNlLWZsb29kbGlnaHQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjcxMzBhNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvc2VydmljZS1mbG9vZGxpZ2h0LnNoCkBAIC0wLDAgKzEsMTYzIEBACisjIS9iaW4vYmFzaAorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisjbGF1bmNoIGZsb29kbGlnaHQgaW5zaWRlIGEgc2NyZWVuLiBJdCBhc3N1bWVzIHNoZWxsIHZhcmlhYmxlICRGTE9PRExJR0hUX1BBVEgKKyMgY29udGFpbiB0aGUgaW5zdGFsbGF0aW9uIHBhdGgKKworCitESVJOQU1FPSQocmVhZGxpbmsgLWYgJHtCQVNIX1NPVVJDRVswXX0pCitESVJOQU1FPSQoZGlybmFtZSAkRElSTkFNRSApCitESVJfT009JChkaXJuYW1lICRESVJOQU1FICkKKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvIC1lICJVc2FnZTogJDAgc3RhcnR8c3RvcHxyZXN0YXJ0fHN0YXR1cyIKKyAgICBlY2hvIC1lICIgIExhdW5jaHxSZW1vdmVzfFJlc3RhcnR8R2V0c3RhdHVzIGZsb29kbGlnaHQgb24gYSBzY3JlZW4iCisgICAgZWNobyAtZSAiICBTaGVsbCB2YXJpYWJsZSBGTE9PRExJR0hUX1BBVEggbXVzdCBpbmRpY2F0ZSBmbG9vZGxpZ2h0IGluc3RhbGxhdGlvbnBhdGgiCit9CisKK2Z1bmN0aW9uIGtpbGxfcGlkKCl7CisgICAgI3NlbmQgVEVSTSBzaWduYWwgYW5kIHdhaXQgNSBzZWNvbmRzIGFuZCBzZW5kIEtJTEwgc2lnbmFsIGlyIHN0aWxsIHJ1bm5pbmcKKyAgICAjUEFSQU1TOiAkMTogUElEIG9mIHByb2Nlc3MgdG8gdGVybWluYXRlCisgICAga2lsbCAkMSAjc2VuZCBURVJNIHNpZ25hbAorICAgIFdBSVQ9NQorICAgIHdoaWxlIFsgJFdBSVQgLWd0IDAgXSAmJiBwcyAtbyBwaWQgLVUgJFVTRVIgLXUgJFVTRVIgfCBncmVwIC1xICQxCisgICAgZG8KKyAgICAgICAgc2xlZXAgMQorICAgICAgICBXQUlUPSQoKFdBSVQtMSkpCisgICAgICAgIFsgJFdBSVQgLWVxIDAgXSAmJiBlY2hvIC1uICJzZW5kaW5nIFNJR0tJTEwuLi4gICIgJiYgIGtpbGwgLTkgJDEgICNraWxsIHdoZW4gY291bnQgcmVhY2ggMAorICAgIGRvbmUKKyAgICBlY2hvICJkb25lIgorICAgCit9CisKKyNvYnRhaW4gcGFyYW1ldGVycworI29tX2FjdGlvbj0ic3RhcnQiICAjdW5jb21lbnQgdG8gZ2V0IGEgZGVmYXVsdCBhY3Rpb24KK2ZvciBwYXJhbSBpbiAkKgorZG8KKyAgICBbICIkcGFyYW0iID09ICJzdGFydCIgLW8gIiRwYXJhbSIgPT0gInN0b3AiICAtbyAiJHBhcmFtIiA9PSAicmVzdGFydCIgLW8gIiRwYXJhbSIgPT0gInN0YXR1cyIgXSAmJiBvbV9hY3Rpb249JHBhcmFtICAmJiBjb250aW51ZQorICAgIFsgIiRwYXJhbSIgPT0gIm9wZW5mbG93IiAtbyAiJHBhcmFtIiA9PSAiZmxvdyIgLW8gIiRwYXJhbSIgPT0gImZsb29kbGlnaHQiIF0gJiYgY29udGludWUKKyAgICBbICIkcGFyYW0iID09ICItaCIgLW8gIiRwYXJhbSIgPT0gIi0taGVscCIgXSAmJiB1c2FnZSAmJiBleGl0IDAKKyAgICAKKyAgICAjaWYgbm9uZSBvZiBhYm92ZSwgcmVhY2ggdGhpcyBsaW5lIGJlY2F1c2UgYSBwYXJhbSBpcyBpbmNvcnJlY3QKKyAgICBlY2hvICJVbmtub3duIHBhcmFtICckcGFyYW0nIHR5cGUgJDAgLS1oZWxwIiA+JjIKKyAgICBleGl0IC0xCitkb25lCisKKyNjaGVjayBhY3Rpb24gaXMgcHJvdmlkZWQKK1sgLXogIiRvbV9hY3Rpb24iIF0gJiYgdXNhZ2UgPiYyICYmIGV4aXQgLTEKKworICAgIG9tX2NtZD0iZmxvb2RsaWdodC5qYXIiCisgICAgb21fbmFtZT0iZmxvb2RsaWdodCIKKyAgICAKKyAgICAjb2J0YWluIFBJRCBvZiBwcm9ncmFtCisgICAgY29tcG9uZW50X2lkPWBwcyAtbyBwaWQsY21kIC1VICRVU0VSIC11ICRVU0VSIHwgZ3JlcCAtdiBncmVwIHwgZ3JlcCAke29tX2NtZH0gfCBhd2sgJ3twcmludCAkMX0nYAorCisgICAgI3N0YXR1cworICAgIGlmIFsgIiRvbV9hY3Rpb24iID09ICJzdGF0dXMiIF0KKyAgICB0aGVuCisgICAgICAgIFsgLW4gIiRjb21wb25lbnRfaWQiIF0gJiYgZWNobyAiICAgICRvbV9uYW1lIHJ1bm5pbmcsIHBpZCAkY29tcG9uZW50X2lkIgorICAgICAgICBbIC16ICIkY29tcG9uZW50X2lkIiBdICYmIGVjaG8gIiAgICAkb21fbmFtZSBzdG9wcGVkIgorICAgIGZpCisKKyAgICAjc3RvcAorICAgIGlmIFsgIiRvbV9hY3Rpb24iID09ICJzdG9wIiAtbyAiJG9tX2FjdGlvbiIgPT0gInJlc3RhcnQiIF0KKyAgICB0aGVuCisgICAgICAgICN0ZXJtaW5hdGVzIHByb2dyYW0KKyAgICAgICAgWyAtbiAiJGNvbXBvbmVudF9pZCIgXSAmJiBlY2hvIC1uICIgICAgc3RvcHBpbmcgJG9tX25hbWUgLi4uICIgJiYga2lsbF9waWQgJGNvbXBvbmVudF9pZCAKKyAgICAgICAgY29tcG9uZW50X2lkPSIiCisgICAgICAgICN0ZXJtaW5hdGVzIHNjcmVlbgorICAgICAgICBpZiBzY3JlZW4gLXdpcGUgfCBncmVwIC1GcSAuZmxvdworICAgICAgICB0aGVuCisgICAgICAgICAgICBzY3JlZW4gLVMgZmxvdyAtcCAwIC1YIHN0dWZmICJleGl0XG4iCisgICAgICAgICAgICBzbGVlcCAxCisgICAgICAgIGZpCisgICAgZmkKKworICAgICNzdGFydAorICAgIGlmIFsgIiRvbV9hY3Rpb24iID09ICJzdGFydCIgLW8gIiRvbV9hY3Rpb24iID09ICJyZXN0YXJ0IiBdCisgICAgdGhlbgorICAgICAgICBbWyAteiAkRkxPT0RMSUdIVF9QQVRIIF1dICYmIGVjaG8gIkZMT09ETElHSFRfUEFUSCBzaGVsbCB2YXJpYWJsZSBtdXN0IGluZGljYXRlIGZsb29kbGlnaHQgaW5zdGFsbGF0aW9uIHBhdGgiID4mMiAmJiBleGl0IC0xCisgICAgICAgICNjYWxjdWxhdGVzIGxvZyBmaWxlIG5hbWUKKyAgICAgICAgbG9nZmlsZT0iIgorICAgICAgICBta2RpciAtcCAkRElSX09NL2xvZ3MgJiYgbG9nZmlsZT0kRElSX09NL2xvZ3Mvb3BlbmZsb3cubG9nIHx8IGVjaG8gImNhbiBub3QgY3JlYXRlIGxvZ3MgZGlyZWN0b3J5ICAkRElSX09NL2xvZ3MiCisgICAgICAgICNjaGVjayBhbHJlYWR5IHJ1bm5pbmcKKyAgICAgICAgWyAtbiAiJGNvbXBvbmVudF9pZCIgXSAmJiBlY2hvICIgICAgJG9tX25hbWUgaXMgYWxyZWFkeSBydW5uaW5nLiBTa2lwcGluZyIgJiYgY29udGludWUKKyAgICAgICAgI2NyZWF0ZSBzY3JlZW4gaWYgbm90IGNyZWF0ZWQKKyAgICAgICAgZWNobyAtbiAiICAgIHN0YXJ0aW5nICRvbV9uYW1lIC4uLiAiCisgICAgICAgIGlmICEgc2NyZWVuIC13aXBlIHwgZ3JlcCAtRnEgLmZsb3cKKyAgICAgICAgdGhlbgorICAgICAgICAgICAgcHVzaGQgJHtGTE9PRExJR0hUX1BBVEh9ID4gL2Rldi9udWxsCisgICAgICAgICAgICBzY3JlZW4gLWRtUyBmbG93ICBiYXNoCisgICAgICAgICAgICBzbGVlcCAxCisgICAgICAgICAgICBwb3BkID4gL2Rldi9udWxsCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gLW4gIiB1c2luZyBleGlzdGluZyBzY3JlZW4gJ2Zsb3cnIC4uLiAiCisgICAgICAgICAgICBzY3JlZW4gLVMgZmxvdyAtcCAwIC1YIGxvZyBvZmYKKyAgICAgICAgICAgIHNjcmVlbiAtUyBmbG93IC1wIDAgLVggc3R1ZmYgImNkICR7RkxPT0RMSUdIVF9QQVRIfVxuIgorICAgICAgICAgICAgc2xlZXAgMQorICAgICAgICBmaQorICAgICAgICAjbW92ZSBvbGQgbG9nIGZpbGUgaW5kZXggb25lIG51bWJlciB1cCBhbmQgbG9nIGFnYWluIGluIGluZGV4IDAKKyAgICAgICAgaWYgW1sgLW4gJGxvZ2ZpbGUgXV0KKyAgICAgICAgdGhlbgorICAgICAgICAgICAgZm9yIGluZGV4IGluIDggNyA2IDUgNCAzIDIgMQorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICBbWyAtZiAke2xvZ2ZpbGV9LiR7aW5kZXh9IF1dICYmIG12ICR7bG9nZmlsZX0uJHtpbmRleH0gJHtsb2dmaWxlfS4kKChpbmRleCsxKSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIFtbIC1mICR7bG9nZmlsZX0gXV0gJiYgbXYgJHtsb2dmaWxlfSAke2xvZ2ZpbGV9LjEKKyAgICAgICAgICAgIHNjcmVlbiAtUyBmbG93IC1wIDAgLVggbG9nZmlsZSAke2xvZ2ZpbGV9CisgICAgICAgICAgICBzY3JlZW4gLVMgZmxvdyAtcCAwIC1YIGxvZyBvbgorICAgICAgICBmaQorICAgICAgICAjbGF1bmNoIGNvbW1hbmQgdG8gc2NyZWVuCisgICAgICAgIHNjcmVlbiAtUyBmbG93IC1wIDAgLVggc3R1ZmYgImphdmEgIC1EbG9nYmFjay5jb25maWd1cmF0aW9uRmlsZT0ke0RJUk5BTUV9L2Zsb3ctbG9nYmFjay54bWwgLWphciAuL3RhcmdldC9mbG9vZGxpZ2h0LmphciAtY2YgJHtESVJOQU1FfS9mbG93LnByb3BlcnRpZXNfdjAuOVxuIgorICAgICAgICAjY2hlY2sgaWYgaXMgcnVubmluZworICAgICAgICBbWyAtbiAkbG9nZmlsZSBdXSAmJiB0aW1lb3V0PTEyMCAjMiBtaW51dGUKKyAgICAgICAgW1sgLXogJGxvZ2ZpbGUgXV0gJiYgdGltZW91dD0yMAorICAgICAgICB3aGlsZSBbWyAkdGltZW91dCAtZ3QgMCBdXQorICAgICAgICBkbworICAgICAgICAgICAjY2hlY2sgaWYgaXMgcnVubmluZworICAgICAgICAgICAjZWNobyB0aW1lb3V0ICR0aW1lb3V0CisgICAgICAgICAgICNpZiAhICBwcyAtZiAtVSAkVVNFUiAtdSAkVVNFUiB8IGdyZXAgLXYgZ3JlcCB8IGdyZXAgLXEgJHtvbV9jbWR9CisgICAgICAgICAgIGxvZ19saW5lcz0wCisgICAgICAgICAgIFtbIC1uICRsb2dmaWxlIF1dICYmIGxvZ19saW5lcz1gaGVhZCAke2xvZ2ZpbGV9IHwgd2MgLWxgCisgICAgICAgICAgIGNvbXBvbmVudF9pZD1gcHMgLW8gcGlkLGNtZCAtVSAkVVNFUiAtdSAkVVNFUiB8IGdyZXAgLXYgZ3JlcCB8IGdyZXAgJHtvbV9jbWR9IHwgYXdrICd7cHJpbnQgJDF9J2AKKyAgICAgICAgICAgaWYgW1sgLXogJGNvbXBvbmVudF9pZCBdXQorICAgICAgICAgICB0aGVuICNwcm9jZXNzIG5vdCBzdGFydGVkIG9yIGZpbmlzaGVkCisgICAgICAgICAgICAgICBbWyAkbG9nX2xpbmVzIC1nZSAyIF1dICYmICBlY2hvIC1uICJFUlJPUiwgaXQgaGFzIGV4aXRlZC4iICYmIGJyZWFrCisgICAgICAgICAgICAgICAjc3RhcnRlZCBiZWNhdXNlIHdyaXR0ZWQgc2VydmVyYWwgbGluZXMgYXQgbG9nIHNvIHJlcG9ydCBlcnJvcgorICAgICAgICAgICBmaQorICAgICAgICAgICBbWyAtbiAkbG9nZmlsZSBdXSAmJiBncmVwIC1xICJMaXN0ZW5pbmcgZm9yIHN3aXRjaCBjb25uZWN0aW9ucyIgJHtsb2dmaWxlfSAmJiBzbGVlcCAxICYmIGJyZWFrCisgICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgICAgdGltZW91dD0kKCh0aW1lb3V0IC0xKSkKKyAgICAgICAgZG9uZQorICAgICAgICBpZiBbWyAtbiAkbG9nZmlsZSBdXSAmJiBbWyAkdGltZW91dCA9PSAwIF1dIAorICAgICAgICB0aGVuIAorICAgICAgICAgICBlY2hvIC1uICJ0aW1lb3V0ISIKKyAgICAgICAgZWxzZQorICAgICAgICAgICBlY2hvIC1uICJydW5uaW5nIG9uICdzY3JlZW4gLXggZmxvdycuIgorICAgICAgICBmaQorICAgICAgICBbWyAtbiAkbG9nZmlsZSBdXSAmJiBlY2hvICIgIExvZ2dpbmcgYXQgJyR7bG9nZmlsZX0nIiB8fCBlY2hvCisgICAgZmkKKworCisKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9zZXJ2aWNlLW9wZW5kYXlsaWdodC5zaCBiL3NjcmlwdHMvc2VydmljZS1vcGVuZGF5bGlnaHQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2MwNjBjNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvc2VydmljZS1vcGVuZGF5bGlnaHQuc2gKQEAgLTAsMCArMSwxNjQgQEAKKyMhL2Jpbi9iYXNoCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKyNsYXVuY2ggb3BlbmRheWxpZ2h0IGluc2lkZSBhIHNjcmVlbi4gSXQgYXNzdW1lcyBzaGVsbCB2YXJpYWJsZSAkT1BFTkRBWUxJR0hUX1BBVEgKKyMgY29udGFpbiB0aGUgaW5zdGFsbGF0aW9uIHBhdGgKKworCitESVJOQU1FPSQocmVhZGxpbmsgLWYgJHtCQVNIX1NPVVJDRVswXX0pCitESVJOQU1FPSQoZGlybmFtZSAkRElSTkFNRSApCitESVJfT009JChkaXJuYW1lICRESVJOQU1FICkKKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvIC1lICJVc2FnZTogJDAgc3RhcnR8c3RvcHxyZXN0YXJ0fHN0YXR1cyIKKyAgICBlY2hvIC1lICIgIExhdW5jaHxSZW1vdmVzfFJlc3RhcnR8R2V0c3RhdHVzIG9wZW5kYXlsaWdodCBvbiBhIHNjcmVlbiIKKyAgICBlY2hvIC1lICIgIFNoZWxsIHZhcmlhYmxlIE9QRU5EQVlETElHSFRfUEFUSCBtdXN0IGluZGljYXRlIG9wZW5kYXlsaWdodCBpbnN0YWxsYXRpb24gcGF0aCIKK30KKworZnVuY3Rpb24ga2lsbF9waWQoKXsKKyAgICAjc2VuZCBURVJNIHNpZ25hbCBhbmQgd2FpdCA1IHNlY29uZHMgYW5kIHNlbmQgS0lMTCBzaWduYWwgaXIgc3RpbGwgcnVubmluZworICAgICNQQVJBTVM6ICQxOiBQSUQgb2YgcHJvY2VzcyB0byB0ZXJtaW5hdGUKKyAgICBraWxsICQxICNzZW5kIFRFUk0gc2lnbmFsCisgICAgV0FJVD01CisgICAgd2hpbGUgWyAkV0FJVCAtZ3QgMCBdICYmIHBzIC1vIHBpZCAtVSAkVVNFUiAtdSAkVVNFUiB8IGdyZXAgLXEgJDEKKyAgICBkbworICAgICAgICBzbGVlcCAxCisgICAgICAgIFdBSVQ9JCgoV0FJVC0xKSkKKyAgICAgICAgWyAkV0FJVCAtZXEgMCBdICYmIGVjaG8gLW4gInNlbmRpbmcgU0lHS0lMTC4uLiAgIiAmJiAga2lsbCAtOSAkMSAgI2tpbGwgd2hlbiBjb3VudCByZWFjaCAwCisgICAgZG9uZQorICAgIGVjaG8gImRvbmUiCisgICAKK30KKworI29idGFpbiBwYXJhbWV0ZXJzCisjb21fYWN0aW9uPSJzdGFydCIgICN1bmNvbWVudCB0byBnZXQgYSBkZWZhdWx0IGFjdGlvbgorZm9yIHBhcmFtIGluICQqCitkbworICAgIFsgIiRwYXJhbSIgPT0gInN0YXJ0IiAtbyAiJHBhcmFtIiA9PSAic3RvcCIgIC1vICIkcGFyYW0iID09ICJyZXN0YXJ0IiAtbyAiJHBhcmFtIiA9PSAic3RhdHVzIiBdICYmIG9tX2FjdGlvbj0kcGFyYW0gICYmIGNvbnRpbnVlCisgICAgWyAiJHBhcmFtIiA9PSAib3BlbmZsb3ciIC1vICIkcGFyYW0iID09ICJmbG93IiAtbyAiJHBhcmFtIiA9PSAib3BlbmRheWxpZ2h0IiBdICYmIGNvbnRpbnVlCisgICAgWyAiJHBhcmFtIiA9PSAiLWgiIC1vICIkcGFyYW0iID09ICItLWhlbHAiIF0gJiYgdXNhZ2UgJiYgZXhpdCAwCisgICAgCisgICAgI2lmIG5vbmUgb2YgYWJvdmUsIHJlYWNoIHRoaXMgbGluZSBiZWNhdXNlIGEgcGFyYW0gaXMgaW5jb3JyZWN0CisgICAgZWNobyAiVW5rbm93biBwYXJhbSAnJHBhcmFtJyB0eXBlICQwIC0taGVscCIgPiYyCisgICAgZXhpdCAtMQorZG9uZQorCisjY2hlY2sgYWN0aW9uIGlzIHByb3ZpZGVkCitbIC16ICIkb21fYWN0aW9uIiBdICYmIHVzYWdlID4mMiAmJiBleGl0IC0xCisKKyAgICBvbV9jbWQ9Ii4va2FyYWYiCisgICAgb21fbmFtZT0ib3BlbmRheWxpZ2h0IgorICAgIAorICAgICNvYnRhaW4gUElEIG9mIHByb2dyYW0KKyAgICBjb21wb25lbnRfaWQ9YHBzIC1vIHBpZCxjbWQgLVUgJFVTRVIgLXUgJFVTRVIgfCBncmVwIC12IGdyZXAgfCBncmVwICR7b21fY21kfSB8IGF3ayAne3ByaW50ICQxfSdgCisKKyAgICAjc3RhdHVzCisgICAgaWYgWyAiJG9tX2FjdGlvbiIgPT0gInN0YXR1cyIgXQorICAgIHRoZW4KKyAgICAgICAgWyAtbiAiJGNvbXBvbmVudF9pZCIgXSAmJiBlY2hvICIgICAgJG9tX25hbWUgcnVubmluZywgcGlkICRjb21wb25lbnRfaWQiCisgICAgICAgIFsgLXogIiRjb21wb25lbnRfaWQiIF0gJiYgZWNobyAiICAgICRvbV9uYW1lIHN0b3BwZWQiCisgICAgZmkKKworICAgICNzdG9wCisgICAgaWYgWyAiJG9tX2FjdGlvbiIgPT0gInN0b3AiIC1vICIkb21fYWN0aW9uIiA9PSAicmVzdGFydCIgXQorICAgIHRoZW4KKyAgICAgICAgI3Rlcm1pbmF0ZXMgcHJvZ3JhbQorICAgICAgICBbIC1uICIkY29tcG9uZW50X2lkIiBdICYmIGVjaG8gLW4gIiAgICBzdG9wcGluZyAkb21fbmFtZSAuLi4gIiAmJiBraWxsX3BpZCAkY29tcG9uZW50X2lkIAorICAgICAgICBjb21wb25lbnRfaWQ9IiIKKyAgICAgICAgI3Rlcm1pbmF0ZXMgc2NyZWVuCisgICAgICAgIGlmIHNjcmVlbiAtd2lwZSB8IGdyZXAgLUZxIC5mbG93CisgICAgICAgIHRoZW4KKyAgICAgICAgICAgIHNjcmVlbiAtUyBmbG93IC1wIDAgLVggc3R1ZmYgImV4aXRcbiIKKyAgICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgI3N0YXJ0CisgICAgaWYgWyAiJG9tX2FjdGlvbiIgPT0gInN0YXJ0IiAtbyAiJG9tX2FjdGlvbiIgPT0gInJlc3RhcnQiIF0KKyAgICB0aGVuCisgICAgICAgIFtbIC16ICRPUEVOREFZRExJR0hUX1BBVEggXV0gJiYgZWNobyAiT1BFTkRBWURMSUdIVF9QQVRIIHNoZWxsIHZhcmlhYmxlIG11c3QgaW5kaWNhdGUgb3BlbmRheWxpZ2h0IGluc3RhbGxhdGlvbiBwYXRoIiA+JjIgJiYgZXhpdCAtMQorICAgICAgICAjY2FsY3VsYXRlcyBsb2cgZmlsZSBuYW1lCisgICAgICAgIGxvZ2ZpbGU9IiIKKyAgICAgICAgbWtkaXIgLXAgJERJUl9PTS9sb2dzICYmIGxvZ2ZpbGU9JERJUl9PTS9sb2dzL29wZW5mbG93LmxvZyAmJiBsb2dmaWxlX2NvbnNvbGU9JERJUl9PTS9sb2dzL29wZW5mbG93X2NvbnNvbGUubG9nIHx8IGVjaG8gImNhbiBub3QgY3JlYXRlIGxvZ3MgZGlyZWN0b3J5ICAkRElSX09NL2xvZ3MiCisgICAgICAgICNjaGVjayBhbHJlYWR5IHJ1bm5pbmcKKyAgICAgICAgWyAtbiAiJGNvbXBvbmVudF9pZCIgXSAmJiBlY2hvICIgICAgJG9tX25hbWUgaXMgYWxyZWFkeSBydW5uaW5nLiBTa2lwcGluZyIgJiYgY29udGludWUKKyAgICAgICAgI2NyZWF0ZSBzY3JlZW4gaWYgbm90IGNyZWF0ZWQKKyAgICAgICAgZWNobyAtbiAiICAgIHN0YXJ0aW5nICRvbV9uYW1lIC4uLiAiCisgICAgICAgIGlmICEgc2NyZWVuIC13aXBlIHwgZ3JlcCAtRnEgLmZsb3cKKyAgICAgICAgdGhlbgorICAgICAgICAgICAgcHVzaGQgJHtPUEVOREFZRExJR0hUX1BBVEh9L2JpbiA+IC9kZXYvbnVsbAorICAgICAgICAgICAgc2NyZWVuIC1kbVMgZmxvdyAgYmFzaAorICAgICAgICAgICAgc2xlZXAgMQorICAgICAgICAgICAgcG9wZCA+IC9kZXYvbnVsbAorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvIC1uICIgdXNpbmcgZXhpc3Rpbmcgc2NyZWVuICdmbG93JyAuLi4gIgorICAgICAgICAgICAgc2NyZWVuIC1TIGZsb3cgLXAgMCAtWCBsb2cgb2ZmCisgICAgICAgICAgICBzY3JlZW4gLVMgZmxvdyAtcCAwIC1YIHN0dWZmICJjZCAke09QRU5EQVlETElHSFRfUEFUSH0vYmluXG4iCisgICAgICAgICAgICBzbGVlcCAxCisgICAgICAgIGZpCisgICAgICAgICNtb3ZlIG9sZCBsb2cgZmlsZSBpbmRleCBvbmUgbnVtYmVyIHVwIGFuZCBsb2cgYWdhaW4gaW4gaW5kZXggMAorICAgICAgICBpZiBbWyAtbiAkbG9nZmlsZSBdXQorICAgICAgICB0aGVuCisgICAgICAgICAgICBmb3IgaW5kZXggaW4gLjkgLjggLjcgLjYgLjUgLjQgLjMgLjIgLjEgIiIKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgcm0gLWYgJHtsb2dmaWxlfSR7aW5kZXh9CisgICAgICAgICAgICAgICAgbG4gLXMgJHtPUEVOREFZRExJR0hUX1BBVEh9L2RhdGEvbG9nL2thcmFmLmxvZyR7aW5kZXh9ICR7bG9nZmlsZX0ke2luZGV4fQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgcm0gLXJmICR7bG9nZmlsZV9jb25zb2xlfQorICAgICAgICAgICAgc2NyZWVuIC1TIGZsb3cgLXAgMCAtWCBsb2dmaWxlICR7bG9nZmlsZV9jb25zb2xlfQorICAgICAgICAgICAgc2NyZWVuIC1TIGZsb3cgLXAgMCAtWCBsb2cgb24KKyAgICAgICAgZmkKKyAgICAgICAgI2xhdW5jaCBjb21tYW5kIHRvIHNjcmVlbgorICAgICAgICBzY3JlZW4gLVMgZmxvdyAtcCAwIC1YIHN0dWZmICIke29tX2NtZH1cbiIKKyAgICAgICAgI2NoZWNrIGlmIGlzIHJ1bm5pbmcKKyAgICAgICAgW1sgLW4gJGxvZ2ZpbGUgXV0gJiYgdGltZW91dD0xMjAgIzIgbWludXRlCisgICAgICAgIFtbIC16ICRsb2dmaWxlIF1dICYmIHRpbWVvdXQ9MjAKKyAgICAgICAgd2hpbGUgW1sgJHRpbWVvdXQgLWd0IDAgXV0KKyAgICAgICAgZG8KKyAgICAgICAgICAgI2NoZWNrIGlmIGlzIHJ1bm5pbmcKKyAgICAgICAgICAgI2VjaG8gdGltZW91dCAkdGltZW91dAorICAgICAgICAgICAjaWYgISAgcHMgLWYgLVUgJFVTRVIgLXUgJFVTRVIgfCBncmVwIC12IGdyZXAgfCBncmVwIC1xICR7b21fY21kfQorICAgICAgICAgICBsb2dfbGluZXM9MAorICAgICAgICAgICBbWyAtbiAkbG9nZmlsZV9jb25zb2xlIF1dICYmIGxvZ19saW5lcz1gaGVhZCAke2xvZ2ZpbGVfY29uc29sZX0gfCB3YyAtbGAKKyAgICAgICAgICAgY29tcG9uZW50X2lkPWBwcyAtbyBwaWQsY21kIC1VICRVU0VSIC11ICRVU0VSIHwgZ3JlcCAtdiBncmVwIHwgZ3JlcCAke29tX2NtZH0gfCBhd2sgJ3twcmludCAkMX0nYAorICAgICAgICAgICBpZiBbWyAteiAkY29tcG9uZW50X2lkIF1dCisgICAgICAgICAgIHRoZW4gI3Byb2Nlc3Mgbm90IHN0YXJ0ZWQgb3IgZmluaXNoZWQKKyAgICAgICAgICAgICAgIFtbICRsb2dfbGluZXMgLWdlIDIgXV0gJiYgIGVjaG8gLW4gIkVSUk9SLCBpdCBoYXMgZXhpdGVkLiIgJiYgYnJlYWsKKyAgICAgICAgICAgICAgICNzdGFydGVkIGJlY2F1c2Ugd3JpdHRlZCBzZXJ2ZXJhbCBsaW5lcyBhdCBsb2cgc28gcmVwb3J0IGVycm9yCisgICAgICAgICAgIGZpCisgICAgICAgICAgIFtbIC1uICRsb2dmaWxlX2NvbnNvbGUgXV0gJiYgZ3JlcCAtcSAiTGlzdGVuaW5nIG9uIHBvcnQiICR7bG9nZmlsZV9jb25zb2xlfSAmJiBzbGVlcCAxICYmIGJyZWFrCisgICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgICAgdGltZW91dD0kKCh0aW1lb3V0IC0xKSkKKyAgICAgICAgZG9uZQorICAgICAgICBpZiBbWyAtbiAkbG9nZmlsZV9jb25zb2xlIF1dICYmIFtbICR0aW1lb3V0ID09IDAgXV0gCisgICAgICAgIHRoZW4gCisgICAgICAgICAgIGVjaG8gLW4gInRpbWVvdXQhIgorICAgICAgICBlbHNlCisgICAgICAgICAgIGVjaG8gLW4gInJ1bm5pbmcgb24gJ3NjcmVlbiAteCBmbG93Jy4iCisgICAgICAgIGZpCisgICAgICAgIFtbIC1uICRsb2dmaWxlIF1dICYmIGVjaG8gIiAgTG9nZ2luZyBhdCAnJHtsb2dmaWxlfSciIHx8IGVjaG8KKyAgICBmaQorCisKKworCmRpZmYgLS1naXQgYS9zY3JpcHRzL3NlcnZpY2Utb3BlbnZpbS5zaCBiL3NjcmlwdHMvc2VydmljZS1vcGVudmltLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhYTlhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3NlcnZpY2Utb3BlbnZpbS5zaApAQCAtMCwwICsxLDE4MCBAQAorIyEvYmluL2Jhc2gKKworIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworI2xhdW5jaCBvcGVudmltIChhbmRyIGZsb29kbGlnaHQpIGluc2lkZSBhIHNjcmVlbi4gCisjSXQgYXNzdW1lcyBhIHJlbGF0aXZlIHBhdGggJy4uJyBmb3Igb3BlbnZpbSAKKyNmb3IgZmxvb2RsaWdodCwgdGhlIHZhcmlhYmxlIEZMT09ETElHSFRfUEFUSCBpbmRpY2F0ZXMgdGhlIGluc3RhbGxhdGlvbiBwYXRoCisKKworRElSTkFNRT0kKHJlYWRsaW5rIC1mICR7QkFTSF9TT1VSQ0VbMF19KQorRElSTkFNRT0kKGRpcm5hbWUgJERJUk5BTUUgKQorRElSX09NPSQoZGlybmFtZSAkRElSTkFNRSApCisjW1sgLXogJEZMT09ETElHSFRfUEFUSCBdXSAmJiBGTE9PRExJR0hUX1BBVEg9JChkaXJuYW1lICR7RElSX09NfSkvZmxvb2RsaWdodC0xLjEKKyNbWyAteiAkRkxPT0RMSUdIVF9QQVRIIF1dICYmIEZMT09ETElHSFRfUEFUSD0kKGRpcm5hbWUgJHtESVJfT019KS9mbG9vZGxpZ2h0LTAuOTAKKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvIC1lICJVc2FnZTogJDAgW29wZW52aW0vdmltXSBbZmxvb2RsaWdodC9mbG93XSBzdGFydHxzdG9wfHJlc3RhcnR8c3RhdHVzIgorICAgIGVjaG8gLWUgIiAgTGF1bmNofFJlbW92ZXN8UmVzdGFydHxHZXRzdGF0dXMgb3BlbnZpbSAoYnkgZGVmYXVsdCkgb3IvYW5kIGZsb29kbGlnaHQgb24gYSBzY3JlZW4iCisgICAgZWNobyAtZSAiICBGb3IgZmxvb2RsaWdodCB2YXJpYWJsZSBGTE9PRExJR0hUX1BBVEggbXVzdCBpbmRpY2F0ZSBpbnN0YWxsYXRpb24gcGF0aCIKK30KKworZnVuY3Rpb24ga2lsbF9waWQoKXsKKyAgICAjc2VuZCBURVJNIHNpZ25hbCBhbmQgd2FpdCA1IHNlY29uZHMgYW5kIHNlbmQgS0lMTCBzaWduYWwgaXIgc3RpbGwgcnVubmluZworICAgICNQQVJBTVM6ICQxOiBQSUQgb2YgcHJvY2VzcyB0byB0ZXJtaW5hdGUKKyAgICBraWxsICQxICNzZW5kIFRFUk0gc2lnbmFsCisgICAgV0FJVD01CisgICAgd2hpbGUgWyAkV0FJVCAtZ3QgMCBdICYmIHBzIC1vIHBpZCAtVSAkVVNFUiAtdSAkVVNFUiB8IGdyZXAgLXEgJDEKKyAgICBkbworICAgICAgICBzbGVlcCAxCisgICAgICAgIFdBSVQ9JCgoV0FJVC0xKSkKKyAgICAgICAgWyAkV0FJVCAtZXEgMCBdICYmIGVjaG8gLW4gInNlbmRpbmcgU0lHS0lMTC4uLiAgIiAmJiAga2lsbCAtOSAkMSAgI2tpbGwgd2hlbiBjb3VudCByZWFjaCAwCisgICAgZG9uZQorICAgIGVjaG8gImRvbmUiCisgICAKK30KKworI29idGFpbiBwYXJhbWV0ZXJzCitvbV9saXN0PSIiCisjb21fYWN0aW9uPSJzdGFydCIgICN1bmNvbWVudCB0byBnZXQgYSBkZWZhdWx0IGFjdGlvbgorZm9yIHBhcmFtIGluICQqCitkbworICAgIFsgIiRwYXJhbSIgPT0gInN0YXJ0IiAtbyAiJHBhcmFtIiA9PSAic3RvcCIgIC1vICIkcGFyYW0iID09ICJyZXN0YXJ0IiAtbyAiJHBhcmFtIiA9PSAic3RhdHVzIiBdICYmIG9tX2FjdGlvbj0kcGFyYW0gICYmIGNvbnRpbnVlCisgICAgWyAiJHBhcmFtIiA9PSAib3BlbnZpbSIgLW8gIiRwYXJhbSIgPT0gInZpbSIgIF0gICAgJiYgb21fbGlzdD0iJG9tX2xpc3QgdmltIiAgICAgICAgICAgICAgJiYgY29udGludWUKKyAgICBbICIkcGFyYW0iID09ICJvcGVubWFubyIgLW8gIiRwYXJhbSIgPT0gIm1hbm8iIF0gICAmJiBjb250aW51ZSAjYWxsb3cgYW5kIGluZ29yZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICBbICIkcGFyYW0iID09ICJvcGVuZmxvdyIgLW8gIiRwYXJhbSIgPT0gImZsb3ciIC1vICIkcGFyYW0iID09ICJmbG9vZGxpZ2h0IiBdICYmIG9tX2xpc3Q9ImZsb3cgJG9tX2xpc3QiICYmIGNvbnRpbnVlCisgICAgWyAiJHBhcmFtIiA9PSAiLWgiIC1vICIkcGFyYW0iID09ICItLWhlbHAiIF0gJiYgdXNhZ2UgJiYgZXhpdCAwCisgICAgI25vdGUgZmxvdyB0aGF0IGl0IG11c3QgYmUgdGhlIGZpcnN0IGVsZW1lbnQsIGJlY2F1c2Ugb3BlbnZpbSByZWxheSBvbiB0aGlzCisgICAgCisgICAgI2lmIG5vbmUgb2YgYWJvdmUsIHJlYWNoIHRoaXMgbGluZSBiZWNhdXNlIGEgcGFyYW0gaXMgaW5jb3JyZWN0CisgICAgZWNobyAiVW5rbm93biBwYXJhbSAnJHBhcmFtJyB0eXBlICQwIC0taGVscCIgPiYyCisgICAgZXhpdCAtMQorZG9uZQorCisjY2hlY2sgYWN0aW9uIGlzIHByb3ZpZGVkCitbIC16ICIkb21fYWN0aW9uIiBdICYmIHVzYWdlID4mMiAmJiBleGl0IC0xCisKKyNpZiBubyBjb21wb25lbmV0cyBzdXBwbGllZCBhc3N1bWUgYWxsCitbIC16ICIkb21fbGlzdCIgXSAmJiBvbV9saXN0PSJ2aW0iCisKK2ZvciBvbV9jb21wb25lbnQgaW4gJG9tX2xpc3QKK2RvCisgICAgWyAiJHtvbV9jb21wb25lbnR9IiA9PSAiZmxvdyIgXSAmJiBvbV9jbWQ9ImZsb29kbGlnaHQuamFyIiAmJiBvbV9uYW1lPSJmbG9vZGxpZ2h0IiAmJiBvbV9kaXI9JEZMT09ETElHSFRfUEFUSAorICAgIFsgIiR7b21fY29tcG9uZW50fSIgPT0gInZpbSIgXSAgJiYgb21fY21kPSJvcGVudmltZC5weSIgICAgJiYgb21fbmFtZT0ib3BlbnZpbSAgICIgJiYgb21fZGlyPSR7RElSX09NfQorICAgICNvYnRhaW4gUElEIG9mIHByb2dyYW0KKyAgICBjb21wb25lbnRfaWQ9YHBzIC1vIHBpZCxjbWQgLVUgJFVTRVIgLXUgJFVTRVIgfCBncmVwIC12IGdyZXAgfCBncmVwICR7b21fY21kfSB8IGF3ayAne3ByaW50ICQxfSdgCisKKyAgICAjc3RhdHVzCisgICAgaWYgWyAiJG9tX2FjdGlvbiIgPT0gInN0YXR1cyIgXQorICAgIHRoZW4KKyAgICAgICAgWyAtbiAiJGNvbXBvbmVudF9pZCIgXSAmJiBlY2hvICIgICAgJG9tX25hbWUgcnVubmluZywgcGlkICRjb21wb25lbnRfaWQiCisgICAgICAgIFsgLXogIiRjb21wb25lbnRfaWQiIF0gJiYgZWNobyAiICAgICRvbV9uYW1lIHN0b3BwZWQiCisgICAgZmkKKworICAgICNzdG9wCisgICAgaWYgWyAiJG9tX2FjdGlvbiIgPT0gInN0b3AiIC1vICIkb21fYWN0aW9uIiA9PSAicmVzdGFydCIgXQorICAgIHRoZW4KKyAgICAgICAgI3Rlcm1pbmF0ZXMgcHJvZ3JhbQorICAgICAgICBbIC1uICIkY29tcG9uZW50X2lkIiBdICYmIGVjaG8gLW4gIiAgICBzdG9wcGluZyAkb21fbmFtZSAuLi4gIiAmJiBraWxsX3BpZCAkY29tcG9uZW50X2lkIAorICAgICAgICBjb21wb25lbnRfaWQ9IiIKKyAgICAgICAgI3Rlcm1pbmF0ZXMgc2NyZWVuCisgICAgICAgIGlmIHNjcmVlbiAtd2lwZSB8IGdyZXAgLUZxIC4kb21fY29tcG9uZW50CisgICAgICAgIHRoZW4KKyAgICAgICAgICAgIHNjcmVlbiAtUyAkb21fY29tcG9uZW50IC1wIDAgLVggc3R1ZmYgImV4aXRcbiIKKyAgICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgI3N0YXJ0CisgICAgaWYgWyAiJG9tX2FjdGlvbiIgPT0gInN0YXJ0IiAtbyAiJG9tX2FjdGlvbiIgPT0gInJlc3RhcnQiIF0KKyAgICB0aGVuCisgICAgICAgIFtbIC16ICRGTE9PRExJR0hUX1BBVEggXV0gJiYgW1sgJG9tX2NvbXBvbmVudCA9PSBmbG93IF1dICYmIAorICAgICAgICAgICAgZWNobyAiRkxPT0RMSUdIVF9QQVRIIHNoZWxsIHZhcmlhYmxlIG11c3QgaW5kaWNhdGUgZmxvb2RsaWdodCBpbnN0YWxsYXRpb24gcGF0aCIgPiYyICYmIGV4aXQgLTEKKyAgICAgICAgI2NhbGN1bGF0ZXMgbG9nIGZpbGUgbmFtZQorICAgICAgICBsb2dmaWxlPSIiCisgICAgICAgIG1rZGlyIC1wICRESVJfT00vbG9ncyAmJiBsb2dmaWxlPSRESVJfT00vbG9ncy9vcGVuJHtvbV9jb21wb25lbnR9LmxvZyB8fCBlY2hvICJjYW4gbm90IGNyZWF0ZSBsb2dzIGRpcmVjdG9yeSAgJERJUl9PTS9sb2dzIgorICAgICAgICAjY2hlY2sgYWxyZWFkeSBydW5uaW5nCisgICAgICAgIFsgLW4gIiRjb21wb25lbnRfaWQiIF0gJiYgZWNobyAiICAgICRvbV9uYW1lIGlzIGFscmVhZHkgcnVubmluZy4gU2tpcHBpbmciICYmIGNvbnRpbnVlCisgICAgICAgICNjcmVhdGUgc2NyZWVuIGlmIG5vdCBjcmVhdGVkCisgICAgICAgIGVjaG8gLW4gIiAgICBzdGFydGluZyAkb21fbmFtZSAuLi4gIgorICAgICAgICBpZiAhIHNjcmVlbiAtd2lwZSB8IGdyZXAgLUZxIC4ke29tX2NvbXBvbmVudH0KKyAgICAgICAgdGhlbgorICAgICAgICAgICAgcHVzaGQgJHtvbV9kaXJ9ID4gL2Rldi9udWxsCisgICAgICAgICAgICBzY3JlZW4gLWRtUyAke29tX2NvbXBvbmVudH0gIGJhc2gKKyAgICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgICAgIHBvcGQgPiAvZGV2L251bGwKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAtbiAiIHVzaW5nIGV4aXN0aW5nIHNjcmVlbiAnJHtvbV9jb21wb25lbnR9JyAuLi4gIgorICAgICAgICAgICAgc2NyZWVuIC1TICR7b21fY29tcG9uZW50fSAtcCAwIC1YIGxvZyBvZmYKKyAgICAgICAgICAgIHNjcmVlbiAtUyAke29tX2NvbXBvbmVudH0gLXAgMCAtWCBzdHVmZiAiY2QgJHtvbV9kaXJ9XG4iCisgICAgICAgICAgICBzbGVlcCAxCisgICAgICAgIGZpCisgICAgICAgICNtb3ZlIG9sZCBsb2cgZmlsZSBpbmRleCBvbmUgbnVtYmVyIHVwIGFuZCBsb2cgYWdhaW4gaW4gaW5kZXggMAorICAgICAgICBpZiBbWyAtbiAkbG9nZmlsZSBdXQorICAgICAgICB0aGVuCisgICAgICAgICAgICBmb3IgaW5kZXggaW4gOCA3IDYgNSA0IDMgMiAxCisgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIFtbIC1mICR7bG9nZmlsZX0uJHtpbmRleH0gXV0gJiYgbXYgJHtsb2dmaWxlfS4ke2luZGV4fSAke2xvZ2ZpbGV9LiQoKGluZGV4KzEpKQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgW1sgLWYgJHtsb2dmaWxlfSBdXSAmJiBtdiAke2xvZ2ZpbGV9ICR7bG9nZmlsZX0uMQorICAgICAgICAgICAgc2NyZWVuIC1TICR7b21fY29tcG9uZW50fSAtcCAwIC1YIGxvZ2ZpbGUgJHtsb2dmaWxlfQorICAgICAgICAgICAgc2NyZWVuIC1TICR7b21fY29tcG9uZW50fSAtcCAwIC1YIGxvZyBvbgorICAgICAgICBmaQorICAgICAgICAjbGF1bmNoIGNvbW1hbmQgdG8gc2NyZWVuCisgICAgICAgICNbICIke29tX2NvbXBvbmVudH0iICE9ICJmbG93IiBdICYmIHNjcmVlbiAtUyAke29tX2NvbXBvbmVudH0gLXAgMCAtWCBzdHVmZiAiY2QgJHtESVJfT019L29wZW4ke29tX2NvbXBvbmVudH1cbiIgJiYgc2xlZXAgMQorICAgICAgICBbICIke29tX2NvbXBvbmVudH0iID09ICJmbG93IiBdICYmIHNjcmVlbiAtUyBmbG93IC1wIDAgLVggc3R1ZmYgImphdmEgIC1EbG9nYmFjay5jb25maWd1cmF0aW9uRmlsZT0ke0RJUk5BTUV9L2Zsb3ctbG9nYmFjay54bWwgLWphciAuL3RhcmdldC9mbG9vZGxpZ2h0LmphciAtY2YgJHtESVJOQU1FfS9mbG93LnByb3BlcnRpZXNfdjAuOVxuIgorICAgICAgICAjWyAiJHtvbV9jb21wb25lbnR9IiA9PSAiZmxvdyIgXSAmJiBzY3JlZW4gLVMgZmxvdyAtcCAwIC1YIHN0dWZmICJqYXZhICAtRGxvZ2JhY2suY29uZmlndXJhdGlvbkZpbGU9JHtESVJOQU1FfS9mbG93LWxvZ2JhY2sueG1sIC1qYXIgLi90YXJnZXQvZmxvb2RsaWdodC5qYXIgLWNmICR7RElSTkFNRX0vZmxvdy5wcm9wZXJ0aWVzX3YxLjFcbiIgJiYgc2xlZXAgNQorICAgICAgICBbICIke29tX2NvbXBvbmVudH0iICE9ICJmbG93IiBdICYmIHNjcmVlbiAtUyAke29tX2NvbXBvbmVudH0gLXAgMCAtWCBzdHVmZiAiLi8ke29tX2NtZH1cbiIKKyAgICAgICAgI2NoZWNrIGlmIGlzIHJ1bm5pbmcKKyAgICAgICAgW1sgLW4gJGxvZ2ZpbGUgXV0gJiYgdGltZW91dD0xMjAgIzIgbWludXRlCisgICAgICAgIFtbIC16ICRsb2dmaWxlIF1dICYmIHRpbWVvdXQ9MjAKKyAgICAgICAgd2hpbGUgW1sgJHRpbWVvdXQgLWd0IDAgXV0KKyAgICAgICAgZG8KKyAgICAgICAgICAgI2NoZWNrIGlmIGlzIHJ1bm5pbmcKKyAgICAgICAgICAgI2VjaG8gdGltZW91dCAkdGltZW91dAorICAgICAgICAgICAjaWYgISAgcHMgLWYgLVUgJFVTRVIgLXUgJFVTRVIgfCBncmVwIC12IGdyZXAgfCBncmVwIC1xICR7b21fY21kfQorICAgICAgICAgICBsb2dfbGluZXM9MAorICAgICAgICAgICBbWyAtbiAkbG9nZmlsZSBdXSAmJiBsb2dfbGluZXM9YGhlYWQgJHtsb2dmaWxlfSB8IHdjIC1sYAorICAgICAgICAgICBjb21wb25lbnRfaWQ9YHBzIC1vIHBpZCxjbWQgLVUgJFVTRVIgLXUgJFVTRVIgfCBncmVwIC12IGdyZXAgfCBncmVwICR7b21fY21kfSB8IGF3ayAne3ByaW50ICQxfSdgCisgICAgICAgICAgIGlmIFtbIC16ICRjb21wb25lbnRfaWQgXV0KKyAgICAgICAgICAgdGhlbiAjcHJvY2VzcyBub3Qgc3RhcnRlZCBvciBmaW5pc2hlZAorICAgICAgICAgICAgICAgW1sgJGxvZ19saW5lcyAtZ2UgMiBdXSAmJiAgZWNobyAtbiAiRVJST1IsIGl0IGhhcyBleGl0ZWQuIiAmJiBicmVhaworICAgICAgICAgICAgICAgI3N0YXJ0ZWQgYmVjYXVzZSB3cml0dGVkIHNlcnZlcmFsIGxpbmVzIGF0IGxvZyBzbyByZXBvcnQgZXJyb3IKKyAgICAgICAgICAgZmkKKyAgICAgICAgICAgW1sgLW4gJGxvZ2ZpbGUgXV0gJiYgW1sgJHtvbV9jb21wb25lbnR9ID09IGZsb3cgXV0gJiYgZ3JlcCAtcSAiTGlzdGVuaW5nIGZvciBzd2l0Y2ggY29ubmVjdGlvbnMiICR7bG9nZmlsZX0gJiYgc2xlZXAgMSAmJiBicmVhaworICAgICAgICAgICBbWyAtbiAkbG9nZmlsZSBdXSAmJiBbWyAke29tX2NvbXBvbmVudH0gIT0gZmxvdyBdXSAmJiBncmVwIC1xICJvcGVuJHtvbV9jb21wb25lbnR9ZCByZWFkeSIgJHtsb2dmaWxlfSAmJiBicmVhaworICAgICAgICAgICBzbGVlcCAxCisgICAgICAgICAgIHRpbWVvdXQ9JCgodGltZW91dCAtMSkpCisgICAgICAgIGRvbmUKKyAgICAgICAgaWYgW1sgLW4gJGxvZ2ZpbGUgXV0gJiYgW1sgJHRpbWVvdXQgPT0gMCBdXSAKKyAgICAgICAgdGhlbiAKKyAgICAgICAgICAgZWNobyAtbiAidGltZW91dCEiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgZWNobyAtbiAicnVubmluZyBvbiAnc2NyZWVuIC14ICR7b21fY29tcG9uZW50fScuIgorICAgICAgICBmaQorICAgICAgICBbWyAtbiAkbG9nZmlsZSBdXSAmJiBlY2hvICIgIExvZ2dpbmcgYXQgJyR7bG9nZmlsZX0nIiB8fCBlY2hvCisgICAgZmkKK2RvbmUKKworCisKKwpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2ZsYXZvci55YW1sIGIvdGVtcGxhdGVzL2ZsYXZvci55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMjQwYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvZmxhdm9yLnlhbWwKQEAgLTAsMCArMSw2NyBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworCitmbGF2b3I6CisgICAgbmFtZTogICAgICAgIGZsYXZvci1uYW1lCisgICAgZGVzY3JpcHRpb246IGZsYXZvci1kZXNjcmlwdGlvbgorICAgICMgY2xvdWQgdHlwZSByZXF1aXJlbWVudHMKKyAgICByYW06ICAgICAgICAgMTAyNCAgICAgICAgICAgICAgICAgICAgIyBNZW1vcnkgaW4gTUIuIElnbm9yZWQgaWYgcHJvdmlkZWQgJ21lbW9yeScgYXQgJ2V4dGVuZGVkJworICAgIHZjcHVzOiAgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBjcHVzLiAgSWdub3JlZCBpZiBwcm92aWRlZCBhdCAnZXh0ZW5kZWQnIAorCisgICAgIyBORlYgdHlwZSByZXF1aXJlbWVudHMKKyAgICAjIGFsbG9jYXRpbmcgRVhDTFVTSVZFIHJlc291cmVjZXMgaW4gdGhlIHNhbWUgTlVNQSBub2RlLiAKKyAgICBleHRlbmRlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKKyAgICAgICAgcHJvY2Vzc29yX3Jhbmtpbmc6IDEwMCAgICAgICAgICAgICMgbWluaW1hbCBwcm9jZXNzb3IgZmFtaWx5LiBOb3QgdXNlZCBpbiBjdXJyZW50IHZlcnNpb24KKyAgICAgICAgbnVtYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdCBvZiBudW1hIHNldC4gT25seSBvbmUgc3VwcG9ydGVkIGluIGN1cnJlbnQgdmVyc2lvbgorICAgICAgICAtICBtZW1vcnk6ICAgICAgICAgOCAgICAgICAgICAgICAgIyBHQnl0ZSBvZiBodWdlIHBhZ2VzIGF0IHRoaXMgbnVtYQorCisgICAgICAgICAgICNDaG9vc2UgYW1vbmcgb25lIG9mICJjb3JlcyIsICJwYWlyZWQtdGhyZWFkcyIsICJ0aHJlYWRzIgorICAgICAgICAgICBwYWlyZWQtdGhyZWFkczogNSAgICAgICAgICAgICAgIyBDb3JlcyB3aXRoIHR3byBwYWlyZWQgaHlwZXIgdGhyZWFkcworICAgICAgICAgICAjcGFpcmVkLXRocmVhZHMtaWQ6IFtbMCwxXSxbMiwzXSxbNCw1XSxbNiw3XSxbOCw5XV0gIyBHdWVzcyBwaW5uaW5nLiBCeSBkZWZhdWx0IGZvbGxvd3MgaW5jcmVtZW50YWwgb3JkZXIKKyAgICAgICAgICAgI3RocmVhZHM6ICAgICAgIDEwICAgICAgICAgICAgICMgdGhyZWFkcyBhd2VyZW5lc3Mgb2YgdGhlIGh5cGVydGhyZWFkaW5nCisgICAgICAgICAgICMjdGhyZWFkcy1pZDogWzAsMSwyLDMsNCw1LDYsNyw4LDldICNPcHRpb25hbC4gR3Vlc3MgcGlubmluZworICAgICAgICAgICAjY29yZXM6ICAgICAgICAgNSAgICAgICAgICAgICAgIyBDb21wbGV0ZSBjb3Jlcywgd2l0aG91dCBoeXBlcnRocmVhZGluZy4gVklNIGVuc3VyZXMgdGhlIG90aGVyIHBhaXJlZCB0aHJlYWQgaXMgaWRsZQorICAgICAgICAgICAjI2NvcmVzLWlkOiAgICAgIFswLDEsMiwzLDRdICAgIyBPcHRpb25hbC4gR3Vlc3MgcGlubmluZyBvZiBjb3JlcworCisgICAgICAgICAgICNPcHRpb25hbDogRGF0YXBsYW5lIG5lZWRlZCBpbnRlcmZhY2VzCisgICAgICAgICAgIGludGVyZmFjZXM6ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgLSAgIG5hbWU6ICAgICAgIHhlMCAgICAgICAgICAgICMgT3B0aW9uYWwuIFVzZXIgZnJpZW5kbHkgbmFtZQorICAgICAgICAgICAgICAgdnBjaTogICAgICAgIjAwMDA6MDA6MTAuMCIgIyBPcHRpb25hbC4gR3Vlc3MgUENJIAorICAgICAgICAgICAgICAgYmFuZHdpZHRoOiAgMTAgR2JwcyAgICAgICAgIyBOZWVkZWQgbWluaW11biBiYW5kd2lkdGgKKyAgICAgICAgICAgICAgIGRlZGljYXRlZDogICJ5ZXMiICAgICAgICAgICMgInllcyIocGFzc3Rocm91Z2gpLCAibm8iKHNyaW92IHdpdGggdmxhbiB0YWdzKSwgInllczpzcmlvdiIoc3Jpb3ZpLCBidXQgZXhjbHVzaXZlIGFuZCB3aXRob3V0IHZsYW4gdGFnKQorICAgICAgICAgICAtICAgbmFtZTogICAgICAgeGUxCisgICAgICAgICAgICAgICB2cGNpOiAgICAgICAiMDAwMDowMDoxMS4wIgorICAgICAgICAgICAgICAgYmFuZHdpZHRoOiAgMTAgR2JwcworICAgICAgICAgICAgICAgZGVkaWNhdGVkOiAgIm5vIgorICAgICAgICAgICAKKyAgICAgICAgI09wdGlvbmFsOiBMaXN0IG9mIGV4dHJhIGRldmljZXMKKyAgICAgICAgZGV2aWNlczogICAgICAgICAgICAgICAgICAgICAgICMgb3JkZXIgZGV0ZXJtaW5lcyBkZXZpY2UgbGV0dGVyIGFzaWduYXRpb24gKGhkYSwgaGRiLCAuLi4pCisgICAgICAgIC0gICB0eXBlOiAgICAgIGRpc2sgICAgICAgICAgICAjICJkaXNrIiwiY2Ryb20iLCJ4bWwiLCJ1c2IiCisgICAgICAgICAgICBpbWFnZVJlZjogIDM3NTk4ZTM0LWNjYjMtMTFlNC1hOTk2LTUyNTQwMDMwNTk0ZSAjIFVVSUQgb2YgYW4gaW1hZ2UsIG9ubHkgZm9yIGRpc2ssY2Ryb20seG1sCisgICAgICAgICAgICAjIHZwY2k6ICAgICAgIjAwMDA6MDA6MDMuMCIgICAjIE9wdGlvbmFsLCBub3QgZm9yIGRpc2sgb3IgY2Ryb20KKyAgICAgICAgICAgICMgeG1sOiAgICAgJ09ubHkgZm9yIHR5cGUgeG1sOiBhIFhNTCBkZXNjcmliZWQgZGV2aWNlIHhtbCB0ZXh0LiBEbyBub3QgdXNlIHNpbmdsZSBxdW90ZXMgaW5zaWRlCisgICAgICAgICAgICAjICAgICAgICBUaGUgZm9sbG93aW5nIHdvcmRzLCBpZiBmb3VuZCwgd2lsbCBiZSByZXBsYWNlZDoKKyAgICAgICAgICAgICMgICAgICAgIF9fZmlsZV9fICAgIGJ5IGltYWdlIHBhdGgsIChpbWFnZWlSZWYgbXVzdCBiZSBwcm92aWRlZCkKKyAgICAgICAgICAgICMgICAgICAgIF9fZm9ybWF0X18gIGJ5IHFjb3cyIG9yIHJhdyAoaW1hZ2VSZWYgbXVzdCBiZSBwcm92aWRlZCkKKyAgICAgICAgICAgICMgICAgICAgIF9fZGV2X18gICAgIGJ5IGRldmljZSBsZXR0ZXIgKGIsIGMsIGQgLi4uKQorICAgICAgICAgICAgIyAgICAgICAgX192cGNpX18gICAgYnkgdnBjaSAodnBjaSBtdXN0IGJlIHByb3ZpZGVkKQorCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaW1hZ2UueWFtbCBiL3RlbXBsYXRlcy9pbWFnZS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDQ1YjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaW1hZ2UueWFtbApAQCAtMCwwICsxLDMzIEBACisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisKK2ltYWdlOgorICAgIG5hbWU6ICAgICAgICAgaW1hZ2UtbmFtZQorICAgIGRlc2NyaXB0aW9uOiAgaW1hZ2UtZGVzY3JpcHRpb24KKyAgICBwYXRoOiAgICAgICAgIC9pbWFnZS1wYXRoL2F0L3RoZS9jb21wdXRlLW5vZGUvc3RvcmFnZS9pbWFnZSAKKyAgICBtZXRhZGF0YTogICAgICMgT3B0aW9uYWwgZXh0cmEgbWV0YWRhdGEgb2YgdGhlIGltYWdlLiBBbGwgZmllbGRzIGFyZSBvcHRpb25hbAorICAgICAgICB1c2VfaW5jcmVtZW50YWw6ICJ5ZXMiICAgICAgICAgICMgInllcyIgYnkgZGVmYXVsdCwgIm5vIiBEZXBsb3llZCB1c2luZyBhIGluY3JlbWVudGFsIHFjb3cyIGltYWdlCisgICAgICAgIHZwY2k6ICAgICAgICAgICAgIjAwMDA6MTA6MDAuMCIgI3JlcXVpZXJlZCBQQ0kgYXQgZ3Vlc3MKKyAgICAgICAgb3NfZGlzdHJvOiAgICAgICB3aW4gICAgICAgICAgICAjIG9wZXJhdGluZyBzeXN0ZW0gZGlzdHJpYnV0aW9uCisgICAgICAgIG9zX3R5cGU6ICAgICAgICAgd2luZG93cyAgICAgICAgIyBvcGVyYXRpbmcgc3lzdGVtIHR5cGUgImxpbnV4IiBieSBkZWZhdWx0LCAid2luZG93cyIKKyAgICAgICAgb3NfdmVyc2lvbjogICAgICAiNyIgICAgICAgICAgICAjIG9wZXJhdGluZyBzeXN0ZW0gdmVyc2lvbgorICAgICAgICBidXM6ICAgICAgICAgICAgImlkZSIgICAgICAgICAgICMgQnkgZGVmYXVsdCAidmlydGlvIiBmb3IgbGludXgsICJpZGUiIGZvciB3aW5kb3dzCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvbmV0d29yay55YW1sIGIvdGVtcGxhdGVzL25ldHdvcmsueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZhNDJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL25ldHdvcmsueWFtbApAQCAtMCwwICsxLDMyIEBACisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCituZXR3b3JrOgorICAgIG5hbWU6ICAgIG5ldHdvcmstbmFtZQorICAgIHR5cGU6ICAgIGRhdGEgICAgICAgICAgICAgIyAiYnJpZGdlX2RhdGEiIG9yICJicmlkZ2VfbWFuIiBmb3IgY29udHJvbCBwbGFuZSwgImRhdGEiIGZvciBkYXRhcGxhbmUsIG9yICJwdHAiIGZvciBwb2ludCB0byBwb2ludCBkYXRhcGxhbmUKKyAgICBwcm92aWRlcjpwaHlzaWNhbDogICBudWxsICMgbmVlZGVkIGEgdmFsdWUgZm9yIGEgYnJpZGdlX2RhdGEsIGJyaWRnZV9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbiBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgYnJpZGdlOmlmYWNlX25hbWUgIDogYXR0YWNoZWQgdG8gYSBpZmFjZV9uYW1lIGhvc3QgYnJpZGdlIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICBtYWN2dGFwOmlmYWNlX25hbWUgOiBhdHRhY2hlZCB0byBhIGlmYWNlX25hbWUgaG9zdCBwaHlzaWNhbCBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgZGVmYXVsdCAgICAgICAgICAgIDogYXR0YWNoZWQgdG8gdGhlIGRlZmF1bHQgaG9zdCBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgbnVsbCAgICAgICAgICAgICAgIDogZm9yIGRhdGEgb3IgcHRwIHR5cGVzLiAoVG8gYmUgY2hhbmdlZCBpbiBmdXR1cmUgdmVyc2lvbnMpCisgICAgc2hhcmVkOiAgICAgICAgICAgICAgdHJ1ZSAjIHRydWUsIGZhbHNlOiBpZiBzaGFyZWQgaXQgd2lsbCBjb25zaWRlciBieSBPUEVOVklNIGFuIEVYVEVSTkFMIG5ldHdvcmsgYXZhaWxhYmxlIGF0IE9QRU5NQU5PCisKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9wb3J0LnlhbWwgYi90ZW1wbGF0ZXMvcG9ydC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Mjk3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvcG9ydC55YW1sCkBAIC0wLDAgKzEsMjkgQEAKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKworcG9ydDoKKyAgICBuYW1lOiAgICAgICAgICBwb3J0LW5hbWUKKyAgICAjbmV0d29ya19pZDogICAgbmV0d29yayB1dWlkIHRoaXMgcG9ydCBtdXN0IGJlIGF0dGFjaGVkCisgICAgdHlwZTogICAgICAgICAgZXh0ZXJuYWwKKyAgICBiaW5kaW5nOnZsYW46ICAxMDMgICAgICAgICAgICAgICAgIyBpZiBwcm92aWRlZCBwYWNrZXRzIHRvL2Zyb20gdGhpcyBzd2l0Y2ggcG9ydCB3aWxsIGJlIHZsYW4gdGFnZ2VkCisgICAgYmluZGluZzpzd2l0Y2hfcG9ydCI6ICJUZS8wMSIgICAgICMgcHJvdmlkZSB0aGUgb3BlbmZsb3cgc3dpdGNoIHBvcnQKKyAgICAjbWFjX2FkZHJlc3M6ICAgMzQ6NDQ6NDU6Njc6Nzg6MTIgICMgbWFjIGFkZHJlc3Mgb2YgdGhlIGVsZW1lbnQgYmVoaW5kIHRoaXMgcG9ydC4gQXMgbm9ybWFsbHkgaXMgbm90IGtub3csIGxlYXZlIGNvbW1lbnRlZApkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL3NlcnZlci55YW1sIGIvdGVtcGxhdGVzL3NlcnZlci55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZjQ1NjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvc2VydmVyLnlhbWwKQEAgLTAsMCArMSw3NiBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworc2VydmVyOgorICAgIG5hbWU6ICAgICAgICAgdm0tbmFtZSAgICAgICAgICMgbmFtZSAKKyAgICBkZXNjcmlwdGlvbjogIHZtLWRlc2NyaXB0aW9uICAjIE9wdGlvbmFsIHVzZXIgZGVzY3JpcHRpb24KKyAgICBpbWFnZVJlZjogICAgIDI0NjQwZmUwLThhOWUtMTFlNC1hMjM2LTUyNTQwMDU2YzMxNyAgICMgdmFsaWQgaW1hZ2UgdXVpZCAKKyAgICBmbGF2b3JSZWY6ICAgIGUyMmRkOGE4LTljYTUtMTFlNC05OWI2LTUyNTQwMDU2YzMxNyAgICMgdmFsaWQgZmxhdm9yIHV1aWQKKyAgICBuZXR3b3JrczogICMgTGlzdCBvZiBjb250cm9sIHBsYW5lIGludGVyZmFjZXMsIE9wdGlvbmFsCisgICAgLSAgIG5hbWU6ICAgICBtZ210MCAgICAgICAgICAjZnJpZW5kbHkgdXNlciBuYW1lCisgICAgICAgIHZwY2k6ICAgICAiMDAwMDowMDowYS4wIiAjT3B0aW9uYWwgZ3Vlc3MgUENJCisgICAgICAgIHV1aWQ6ICAgICBjMDliMmYxYS04YTllLTExZTQtYTIzNi01MjU0MDA1NmMzMTcgICAjIHZhbGlkIG5ldHdvcmsgdXVpZAorICAgICAgICAjbWFjX2FkZHJlc3M6ICAjZ3Vlc3MgY29uY3JldGUgbWFjIGFkZHJlc3MsIGJ5IGRlZmF1bHQgb25lIGlzIGFzaWduZWQKKyAgICAgICAgI21vZGVsOiAgICAgICAgInZpcnRpbyIsImUxMDAwIiwibmUya19wY2kiLCJwY25ldCIsInJ0bDgxMzkiLCBCeSBkZWZhdWx0IGF1dG8sIG5vcm1hbGx5IHZpcnRpbworICAgIHN0YXJ0OiAgICAieWVzIiAgICAjICJ5ZXMiLCJubyIsInBhdXNlZCIuICBCeSBkZWZhdWx0IGl0IGlzIHN0YXJ0ZWQgdXBvbiBjcmV0ZWQKKyAgICBob3N0SWQ6ICAgZWM2NTZiYzQtOWNhNS0xMWU0LTk5YjYtNTI1NDAwNTZjMzE3ICAgICAgI3ByZWZlcmVkIGhvc3Qgd2hlcmUgdG8gYWxsb2NhdGUKKyAgIAorICAgICMgYWxsb2NhdGluZyBFWENMVVNJVkUgcmVzb3VyZWNlcyBpbiB0aGUgc2FtZSBOVU1BIG5vZGUuIAorICAgICMgSWYgcHJvdmlkZWQsIGl0IG92ZXJyaWRlcyBleHRlbmRlZCB2YWx1ZXMgYXQgZmxhdm9yCisgICAgZXh0ZW5kZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCisgICAgICAgIHByb2Nlc3Nvcl9yYW5raW5nOiAxMDAgICAgICAgICAgICAjIG1pbmltYWwgcHJvY2Vzc29yIGZhbWlseS4gTm90IHVzZWQgaW4gY3VycmVudCB2ZXJzaW9uCisgICAgICAgIG51bWFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3Qgb2YgbnVtYSBzZXQuIE9ubHkgb25lIHN1cHBvcnRlZCBpbiBjdXJyZW50IHZlcnNpb24KKyAgICAgICAgLSAgbWVtb3J5OiAgICAgICAgIDggICAgICAgICAgICAgICMgR0J5dGUgb2YgaHVnZSBwYWdlcyBhdCB0aGlzIG51bWEKKworICAgICAgICAgICAjQ2hvb3NlIGFtb25nIG9uZSBvZiAiY29yZXMiLCAicGFpcmVkLXRocmVhZHMiLCAidGhyZWFkcyIKKyAgICAgICAgICAgcGFpcmVkLXRocmVhZHM6IDUgICAgICAgICAgICAgICMgQ29yZXMgd2l0aCB0d28gcGFpcmVkIGh5cGVyIHRocmVhZHMKKyAgICAgICAgICAgI3BhaXJlZC10aHJlYWRzLWlkOiBbWzAsMV0sWzIsM10sWzQsNV0sWzYsN10sWzgsOV1dICMgR3Vlc3MgcGlubmluZy4gQnkgZGVmYXVsdCBmb2xsb3dzIGluY3JlbWVudGFsIG9yZGVyCisgICAgICAgICAgICN0aHJlYWRzOiAgICAgICAxMCAgICAgICAgICAgICAjIHRocmVhZHMgYXdlcmVuZXNzIG9mIHRoZSBoeXBlcnRocmVhZGluZworICAgICAgICAgICAjI3RocmVhZHMtaWQ6IFswLDEsMiwzLDQsNSw2LDcsOCw5XSAjT3B0aW9uYWwuIEd1ZXNzIHBpbm5pbmcKKyAgICAgICAgICAgI2NvcmVzOiAgICAgICAgIDUgICAgICAgICAgICAgICMgQ29tcGxldGUgY29yZXMsIHdpdGhvdXQgaHlwZXJ0aHJlYWRpbmcuIFZJTSBlbnN1cmVzIHRoZSBvdGhlciBwYWlyZWQgdGhyZWFkIGlzIGlkbGUKKyAgICAgICAgICAgIyNjb3Jlcy1pZDogICAgICBbMCwxLDIsMyw0XSAgICMgT3B0aW9uYWwuIEd1ZXNzIHBpbm5pbmcgb2YgY29yZXMKKworICAgICAgICAgICAjT3B0aW9uYWw6IERhdGFwbGFuZSBuZWVkZWQgaW50ZXJmYWNlcworICAgICAgICAgICBpbnRlcmZhY2VzOiAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIC0gICBuYW1lOiAgICAgICB4ZTAgICAgICAgICAgICAjIE9wdGlvbmFsLiBVc2VyIGZyaWVuZGx5IG5hbWUKKyAgICAgICAgICAgICAgIHZwY2k6ICAgICAgICIwMDAwOjAwOjEwLjAiICMgT3B0aW9uYWwuIEd1ZXNzIFBDSSAKKyAgICAgICAgICAgICAgIGJhbmR3aWR0aDogIDEwIEdicHMgICAgICAgICMgTmVlZGVkIG1pbmltdW4gYmFuZHdpZHRoCisgICAgICAgICAgICAgICBkZWRpY2F0ZWQ6ICAieWVzIiAgICAgICAgICAjICJ5ZXMiKHBhc3N0aHJvdWdoKSwgIm5vIihzcmlvdiB3aXRoIHZsYW4gdGFncyksICJ5ZXM6c3Jpb3YiKHNyaW92aSwgYnV0IGV4Y2x1c2l2ZSBhbmQgd2l0aG91dCB2bGFuIHRhZykKKyAgICAgICAgICAgICAgICMgeW91IGNhbiBhdHRhY2ggdGhpcyBpbnRlZmFjZSB0byBhIG5ldHdvcmsgYXQgc2VydmVyIGNyZWF0aW9uIG9yIGxhdGVyIHdpdGggYSBwb3J0IGF0dGFjaAorICAgICAgICAgICAgICAgI3V1aWQ6ICAgICAgIDQxYmNhYzU4LTliZTktMTFlNC1iMWI2LTUyNTQwMDU2YzMxNyAjIEF0dGFjaCB0aGUgaW50ZXJmYWNlIHRvIHRoaXMgbmV0d29yayB1dWlkCisgICAgICAgICAgIC0gICBuYW1lOiAgICAgICB4ZTEKKyAgICAgICAgICAgICAgIHZwY2k6ICAgICAgICIwMDAwOjAwOjExLjAiCisgICAgICAgICAgICAgICBiYW5kd2lkdGg6ICAxMCBHYnBzCisgICAgICAgICAgICAgICBkZWRpY2F0ZWQ6ICAibm8iCisgICAgICAgICAgICAgICAjbWFjX2FkZHJlc3M6ICAjZ3Vlc3MgY29uY3JldGUgbWFjIGFkZHJlc3MsIGJ5IGRlZmF1bHQgb25lIGlzIGFzaWduZWQuIE5vdCBwb3NzaWJsZSBmb3IgZGVkaWNhdGVkOiAieWVzIgorICAgICAgICAgICAKKyAgICAgICAgI09wdGlvbmFsOiBMaXN0IG9mIGV4dHJhIGRldmljZXMKKyAgICAgICAgZGV2aWNlczogICAgICAgICAgICAgICAgICAgICAgICMgb3JkZXIgZGV0ZXJtaW5lcyBkZXZpY2UgbGV0dGVyIGFzaWduYXRpb24gKGhkYSwgaGRiLCAuLi4pCisgICAgICAgIC0gICB0eXBlOiAgICAgIGRpc2sgICAgICAgICAgICAjICJkaXNrIiwiY2Ryb20iLCJ4bWwiLCJ1c2IiCisgICAgICAgICAgICBpbWFnZVJlZjogIDM3NTk4ZTM0LWNjYjMtMTFlNC1hOTk2LTUyNTQwMDMwNTk0ZSAjIFVVSUQgb2YgYW4gaW1hZ2UsIG9ubHkgZm9yIGRpc2ssY2Ryb20seG1sCisgICAgICAgICAgICAjIHZwY2k6ICAgICAgIjAwMDA6MDA6MDMuMCIgICAjIE9wdGlvbmFsLCBub3QgZm9yIGRpc2sgb3IgY2Ryb20KKyAgICAgICAgICAgICMgeG1sOiAgICAgJ09ubHkgZm9yIHR5cGUgeG1sOiBhIFhNTCBkZXNjcmliZWQgZGV2aWNlIHhtbCB0ZXh0LiBEbyBub3QgdXNlIHNpbmdsZSBxdW90ZXMgaW5zaWRlCisgICAgICAgICAgICAjICAgICAgICBUaGUgZm9sbG93aW5nIHdvcmRzLCBpZiBmb3VuZCwgd2lsbCBiZSByZXBsYWNlZDoKKyAgICAgICAgICAgICMgICAgICAgIF9fZmlsZV9fICAgIGJ5IGltYWdlIHBhdGgsIChpbWFnZWlSZWYgbXVzdCBiZSBwcm92aWRlZCkKKyAgICAgICAgICAgICMgICAgICAgIF9fZm9ybWF0X18gIGJ5IHFjb3cyIG9yIHJhdyAoaW1hZ2VSZWYgbXVzdCBiZSBwcm92aWRlZCkKKyAgICAgICAgICAgICMgICAgICAgIF9fZGV2X18gICAgIGJ5IGRldmljZSBsZXR0ZXIgKGIsIGMsIGQgLi4uKQorICAgICAgICAgICAgIyAgICAgICAgX192cGNpX18gICAgYnkgdnBjaSAodnBjaSBtdXN0IGJlIHByb3ZpZGVkKQorCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvdGVuYW50LnlhbWwgYi90ZW1wbGF0ZXMvdGVuYW50LnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjNmIyNAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy90ZW5hbnQueWFtbApAQCAtMCwwICsxLDI1IEBACisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisKK3RlbmFudDoKKyAgICBuYW1lOiAgICAgICAgICB0ZW5hbnQtbmFtZQorICAgIGRlc2NyaXB0aW9uOiAgIHRlbmFudC1kZXNjcmlwdGlvbiAKZGlmZiAtLWdpdCBhL3Rlc3QvMlZNXzJJLnNoIGIvdGVzdC8yVk1fMkkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTZmODEwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvMlZNXzJJLnNoCkBAIC0wLDAgKzEsMjg2IEBACisjIS9iaW4vYmFzaAorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisjCisjYXV0aG9yIEFsZm9uc28gVGllcm5vCisjCisjc2NyaXB0IHRvIHRlc3Qgb3BlbnZpbSB3aXRoIHRoZSBjcmVhdGlvbiBvZiBmbGF2b3JzIGFuZCBpbnRlcmZhY2VzCisjdXNpbmcgaW1hZ2VzIGFscmVhZHkgaW5zZXJ0ZWQKKyMKKworZWNobyAiIENyZWF0ZXMgMSBmbGF2b3IsIDMgbmV0cywgMiBWTXMgKFVTKQorICBJbnRlcmZhY2VzOiAyIHNyaW92LCAxIHBhc3N0aHJvdWdoLCAxIHNyaW92IGRlZGljYXRlZAorICBUZXN0IG1hYyBhZGRyZXNzIGFsbG9jYXRpb24sIDEgVk0gd2l0aCBkaXJlY3QgbmV0d29yayBhdHRhY2gsIAorICBhbm90aGVyIFZNIHdpdGggbmV0d29yayBhdHRhY2ggYWZ0ZXIgY3JlYXRpb24iCitlY2hvCitlY2hvIC1uICJ0eXBlIG5ldHdvcmsgbW9kZWwgdG8gdGVzdCBuZXR3b3JrIG1vZGVsIChlbXB0eSB0byBza2lwKT8gIgorcmVhZCBtb2RlbAorZWNobyAiUHJlc3MgZW50ZXIgdG8gY29udGludWUiCityZWFkIGtrCitpZiBbIC1uICIkbW9kZWwiIF0KK3RoZW4KKwltb2RlbD0ibW9kZWw6ICcke21vZGVsfSciCitmaQorI2VjaG8gXyR7bW9kZWx9XworCisjaW1hZ2UgdG8gbG9hZAoraW1hZ2VQYXRoPS9tbnQvcG93ZXJ2YXVsdC92aXJ0dWFsaXphdGlvbi92bmZzL29zL1VTMTQwNC5xY293MgorI2ltYWdlIHRvIGxvYWQgYXMgYW4gZXh0cmEgZGlzaywgY2FuIGJlIGFueQoraW1hZ2VQYXRoX2V4dHJhPS9tbnQvcG93ZXJ2YXVsdC92aXJ0dWFsaXphdGlvbi92bmZzL29zL1VTMTQwNHVzZXIucWNvdzIKKyNkZWZhdWx0IG5ldHdvcmsgdG8gdXNlCituZXR3b3JrX2V0aDA9ZGVmYXVsdAorCisKK0RJUk5BTUU9YGRpcm5hbWUgJDBgCisKK2Z1bmN0aW9uIGRlbF9ydWJiaXNoKCl7CisgIGVjaG8gIlByZXNzIGVudGVyIHRvIGRlbGV0ZSB0aGUgZGVwbG95ZWQgdGhpbmdzIgorICByZWFkIGtrCisgIFsgLW4gIiRERUxfc2VydmVyIiBdICAmJiAke0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtZiBkZWwgc2VydmVyICRERUxfc2VydmVyCisgIFsgLW4gIiRERUxfbmV0d29yayIgXSAmJiAke0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtZiBkZWwgbmV0d29yayAkREVMX25ldHdvcmsKKyAgWyAtbiAiJERFTF9mbGF2b3IiIF0gICYmICR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IC1mIGRlbCBmbGF2b3IgJERFTF9mbGF2b3IKKyAgWyAtbiAiJERFTF9pbWFnZSIgXSAgICYmICR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IC1mIGRlbCBpbWFnZSAkREVMX2ltYWdlCisgIHJtIC1mIGtrLm91dAorfQorCitmdW5jdGlvbiBwcm9jY2Vzc19vdXQoKXsgIyBhY3Rpb25fdGV4dCAgZmllbGQgdG8gcmV0cmlldmUKKyAgaWYgZWdyZXAgLXEgIlwiZXJyb3JcIiIgIGtrLm91dAorICB0aGVuCisgICAgZWNobyAiZmFpbGVkIHRvIiAkMQorICAgIGNhdCBray5vdXQKKyAgICBkZWxfcnViYmlzaAorICAgIGV4aXQgLTEKKyAgZmkKKyAgaWYgWyAteiAiJDIiIF0gOyB0aGVuIHBhdHRlcm49JyJpZCInIDsgZWxzZSBwYXR0ZXJuPSIkMiIgOyBmaQorICB2YWx1ZT1gZWdyZXAgICIkcGF0dGVybiIgIGtrLm91dCBgCisgIHZhbHVlPSR7dmFsdWUjIyogXCJ9CisgIHZhbHVlPSR7dmFsdWUlXCIqfQorICBpZiBbWyAteiAiJHZhbHVlIiBdXQorICB0aGVuIAorICAgIGVjaG8gIm5vdCBmb3VuZCB0aGUgZmllbGQiICQyCisgICAgY2F0IGtrLm91dAorICAgIGRlbF9ydWJiaXNoCisgICAgZXhpdCAtMQorICBmaQorfQorCisjcHJvY2Nlc3Nfb3V0ICJpbnNlcnQgc2VydmVyIHRpZGdlbjEiICdeICAgICAgICAgICAgImlkIicKKyNlY2hvICR2YWx1ZQorI2V4aXQgMAorCisKKworZWNobyAtbiAiZ2V0ICR7aW1hZ2VQYXRoIyMqL30gaW1hZ2U6ICAgICAgICAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtRiJwYXRoPSRpbWFnZVBhdGgiIGltYWdlcyA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJnZXQgJHtpbWFnZVBhdGgjIyovfSIgCitlY2hvICR2YWx1ZQoraW1hZ2UxPSR2YWx1ZQorCisKK2VjaG8gLW4gImdldCAke2ltYWdlUGF0aF9leHRyYSMjKi99IGltYWdlOiAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgLUYicGF0aD0kaW1hZ2VQYXRoX2V4dHJhIiBpbWFnZXMgPiBray5vdXQKK3Byb2NjZXNzX291dCAiZ2V0ICR7aW1hZ2VQYXRoX2V4dHJhIyMqL30iIAorZWNobyAkdmFsdWUKK2ltYWdlMj0kdmFsdWUKKworCitlY2hvIC1uICJnZXQgJHtuZXR3b3JrX2V0aDB9IG5ldHdvcms6ICAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtRiJuYW1lPSRuZXR3b3JrX2V0aDAiIG5ldHdvcmsgPiBray5vdXQKK3Byb2NjZXNzX291dCAiZ2V0ICAke25ldHdvcmtfZXRoMH0gbmV0d29yayIgCitlY2hvICR2YWx1ZQorbmV0d29ya19ldGgwPSR2YWx1ZQorCisKK2VjaG8gLW4gImluc2VydCBmbGF2b3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgbmV3IGZsYXZvciAnCistLS0KK2ZsYXZvcjoKKyAgbmFtZTogNVBUaF84R18ySQorICBkZXNjcmlwdGlvbjogZmxhdm9yIHRvIHRlc3Qgb3BlbnZpbQorICBleHRlbmRlZDogCisgICAgcHJvY2Vzc29yX3Jhbmtpbmc6IDIwNQorICAgIG51bWFzOgorICAgIC0gIG1lbW9yeTogOAorICAgICAgIHBhaXJlZC10aHJlYWRzOiA1CisgICAgICAgaW50ZXJmYWNlczoKKyAgICAgICAtIG5hbWU6IHhlMAorICAgICAgICAgZGVkaWNhdGVkOiAieWVzIgorICAgICAgICAgYmFuZHdpZHRoOiAiMTAgR2JwcyIKKyAgICAgICAgIHZwY2k6ICIwMDAwOjAwOjEwLjAiCisgICAgICAgICAjbWFjX2FkZHJlc3M6ICIxMDoxMDoxMDoxMDoxMDoxMCIKKyAgICAgICAtIG5hbWU6IHhlMQorICAgICAgICAgZGVkaWNhdGVkOiAieWVzOnNyaW92IgorICAgICAgICAgYmFuZHdpZHRoOiAiMTAgR2JwcyIKKyAgICAgICAgIHZwY2k6ICIwMDAwOjAwOjExLjAiCisgICAgICAgICBtYWNfYWRkcmVzczogIjEwOjEwOjEwOjEwOjEwOjExIgorJyAgPiBray5vdXQKK3Byb2NjZXNzX291dCAiaW5zZXJ0IGZsYXZvciIgCitlY2hvICR2YWx1ZQorZmxhdm9yMT0kdmFsdWUKK0RFTF9mbGF2b3I9IiRERUxfZmxhdm9yICRmbGF2b3IxIgorCisKK2VjaG8gLW4gImluc2VydCBwdHAgbmV0MTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgbmV3IG5ldHdvcmsgJworLS0tCituZXR3b3JrOgorICBuYW1lOiBuZXR3b3JrLXhlMAorICB0eXBlOiBwdHAKKycgID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImluc2VydCBuZXR3b3JrIDAiIAorZWNobyAkdmFsdWUKK25ldHdvcmswPSR2YWx1ZQorREVMX25ldHdvcms9IiRERUxfbmV0d29yayAkdmFsdWUiCisKKworZWNobyAtbiAiaW5zZXJ0IHB0cCBuZXQyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSBuZXcgbmV0d29yayAnCistLS0KK25ldHdvcms6CisgIG5hbWU6IG5ldHdvcmsteGUxCisgIHR5cGU6IHB0cAorJyAgPiBray5vdXQKK3Byb2NjZXNzX291dCAiaW5zZXJ0IG5ldHdvcmsgMSIKK2VjaG8gJHZhbHVlCituZXR3b3JrMT0kdmFsdWUKK0RFTF9uZXR3b3JrPSIkREVMX25ldHdvcmsgJHZhbHVlIgorCisKKworZWNobyAtbiAiaW5zZXJ0IGJyaWRnZSBuZXR3b3JrIG5ldDI6ICAgICAgICAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSBuZXcgbmV0d29yayAnCistLS0KK25ldHdvcms6CisgIG5hbWU6IG5ldHdvcmstbmV0MgorICB0eXBlOiBicmlkZ2VfZGF0YQorJyAgPiBray5vdXQKK3Byb2NjZXNzX291dCAiaW5zZXJ0IG5ldHdvcmsgMiIKK2VjaG8gJHZhbHVlCituZXR3b3JrMj0kdmFsdWUKK0RFTF9uZXR3b3JrPSIkREVMX25ldHdvcmsgJHZhbHVlIgorCitlY2hvIC1uICJpbnNlcnQgdGVzdCBWTSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IG5ldyBzZXJ2ZXIgIgorLS0tCitzZXJ2ZXI6CisgIG5hbWU6IHRlc3RfVk0xCisgIGRlc2NyaXRpb246IFVTIG9yIHRpZGdlbiB3aXRoIDEgU1JJT1YgMSBQQVNTVEhST1VHSAorICBpbWFnZVJlZjogJyRpbWFnZTEnCisgIGZsYXZvclJlZjogJyRmbGF2b3IxJworICBuZXR3b3JrczoKKyAgLSBuYW1lOiBtZ210MAorICAgIHZwY2k6ICcwMDAwOjAwOjBhLjAnCisgICAgdXVpZDogJHtuZXR3b3JrX2V0aDB9CisgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDoxMDoxMicKKyAgLSBuYW1lOiBldGgwCisgICAgdnBjaTogJzAwMDA6MDA6MGIuMCcKKyAgICB1dWlkOiAnJG5ldHdvcmsyJworICAgIG1hY19hZGRyZXNzOiAnMTA6MTA6MTA6MTA6MTA6MTMnCisgICAgJHttb2RlbH0KKyIgID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImluc2VydCB0ZXN0IFZNIDIiICdeICAgICAgICAiaWQiJworZWNobyAkdmFsdWUKK3NlcnZlcjE9JHZhbHVlCitERUxfc2VydmVyPSIkREVMX3NlcnZlciAkdmFsdWUiCisKKworCitlY2hvIC1uICJpbnNlcnQgdGVzdCBWTSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IG5ldyBzZXJ2ZXIgIgorLS0tCitzZXJ2ZXI6CisgIG5hbWU6IHRlc3RfVk0yCisgIGRlc2NyaXRpb246IFVTIG9yIHRpZGdlbiB3aXRoIGRpcmVjdCBuZXR3b3JrIGF0dGFjaAorICBpbWFnZVJlZjogJyRpbWFnZTEnCisgIGZsYXZvclJlZjogJyRmbGF2b3IxJworICBleHRlbmRlZDoKKyAgICBwcm9jZXNzb3JfcmFua2luZzogMjA1CisgICAgbnVtYXM6CisgICAgLSAgbWVtb3J5OiA4CisgICAgICAgdGhyZWFkczogMTAKKyAgICAgICBpbnRlcmZhY2VzOgorICAgICAgIC0gbmFtZTogeGUwCisgICAgICAgICBkZWRpY2F0ZWQ6ICd5ZXMnCisgICAgICAgICBiYW5kd2lkdGg6ICcxMCBHYnBzJworICAgICAgICAgdnBjaTogJzAwMDA6MDA6MTAuMCcKKyAgICAgICAgICNtYWNfYWRkcmVzczogJzEwOjEwOjEwOjEwOmFhOjEwJworICAgICAgICAgdXVpZDogJyRuZXR3b3JrMCcKKyAgICAgICAtIG5hbWU6IHhlMQorICAgICAgICAgZGVkaWNhdGVkOiAnbm8nCisgICAgICAgICBiYW5kd2lkdGg6ICc3IEdicHMnCisgICAgICAgICB2cGNpOiAnMDAwMDowMDoxMS4wJworICAgICAgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDphYToxMScKKyAgICAgICAgIHV1aWQ6ICckbmV0d29yazEnCisgICAgZGV2aWNlczoKKyAgICAtIHR5cGU6IGRpc2sKKyAgICAgIGltYWdlUmVmOiAnJGltYWdlMicKKyAgbmV0d29ya3M6CisgIC0gbmFtZTogbWdtdDAKKyAgICB2cGNpOiAnMDAwMDowMDowYS4wJworICAgIHV1aWQ6ICR7bmV0d29ya19ldGgwfQorICAgIG1hY19hZGRyZXNzOiAnMTA6MTA6MTA6MTA6YWE6MTInCisgIC0gbmFtZTogZXRoMAorICAgIHZwY2k6ICcwMDAwOjAwOjBiLjAnCisgICAgdXVpZDogJyRuZXR3b3JrMicKKyAgICBtYWNfYWRkcmVzczogJzEwOjEwOjEwOjEwOmFhOjEzJworICAgICR7bW9kZWx9CisiICA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJpbnNlcnQgdGVzdCBWTSAyIiAnXiAgICAgICAgImlkIicKK2VjaG8gJHZhbHVlCitzZXJ2ZXIyPSR2YWx1ZQorREVMX3NlcnZlcj0iJERFTF9zZXJ2ZXIgJHZhbHVlIgorCitlY2hvIC1uICJnZXQgeGUwIGlmYWNlIHV1aWQgZnJvbSB0aWRnZW4xOiAgICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IC1GICJkZXZpY2VfaWQ9JHtzZXJ2ZXIxfSZuYW1lPXhlMCIgIHBvcnRzID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImdldCB4ZTAgdXVpZCBwb3J0IGZyb20gdGlkZ2VuMSIgCitlY2hvICR2YWx1ZQoraWZhY2VfeGUwPSR2YWx1ZQorCisKK2VjaG8gLW4gImdldCB4ZTEgaWZhY2UgdXVpZCBmcm9tIHRpZGdlbjE6ICAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgLUYgImRldmljZV9pZD0ke3NlcnZlcjF9Jm5hbWU9eGUxIiAgcG9ydHMgPiBray5vdXQKK3Byb2NjZXNzX291dCAiZ2V0IHhlMSB1dWlkIHBvcnQgZnJvbSB0aWRnZW4xIiAKK2VjaG8gJHZhbHVlCitpZmFjZV94ZTE9JHZhbHVlCisKKworZWNobyAtbiAiYXR0YWNoIHhlMCBmcm9tIHRpZGdlbjEgdG8gbmV0d29yayAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtZiBlZGl0IHBvcnRzICRpZmFjZV94ZTAgIm5ldHdvcmtfaWQ6ICRuZXR3b3JrMCIgPiBray5vdXQKK3Byb2NjZXNzX291dCAiYXR0YWNoIHhlMCBmcm9tIHRpZGdlbjEgdG8gbmV0d29yayIKK2VjaG8gIm9rIgorCisKK2VjaG8gLW4gImF0dGFjaCB4ZTEgZnJvbSB0aWRnZW4xIHRvIG5ldHdvcmsgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgLWYgZWRpdCBwb3J0cyAkaWZhY2VfeGUxICJuZXR3b3JrX2lkOiAkbmV0d29yazEiID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImF0dGFjaCB4ZTEgZnJvbSB0aWRnZW4xIHRvIG5ldHdvcmsiCitlY2hvICJvayIKKworCitlY2hvIAorZWNobyBmaW5pc2guIENoZWNrIGNvbm5lY3Rpb25zISEKK2VjaG8gY2xpY2sgcmV0dXJuIHRvIGRlbGV0ZSBhbGwgZGVwbG95ZWQgdGhpbmdzCitlY2hvCisKK2RlbF9ydWJiaXNoCitleGl0IDAKKwpkaWZmIC0tZ2l0IGEvdGVzdC8yVk1fMklfMlZMQU4uc2ggYi90ZXN0LzJWTV8ySV8yVkxBTi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZTBmNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC8yVk1fMklfMlZMQU4uc2gKQEAgLTAsMCArMSwyNzYgQEAKKyMhL2Jpbi9iYXNoCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKyMKKyNhdXRob3IgQWxmb25zbyBUaWVybm8KKyMKKyNzY3JpcHQgdG8gdGVzdCBvcGVudmltIHdpdGggdGhlIGNyZWF0aW9uIG9mIGZsYXZvcnMgYW5kIGludGVyZmFjZXMKKyN1c2luZyBpbWFnZXMgYWxyZWFkeSBpbnNlcnRlZAorIworCitlY2hvICIgQ3JlYXRlcyAxIGZsYXZvciwgMyBuZXRzLCAyIFZNcyAoVVMpCisgIEludGVyZmFjZXM6IDIgc3Jpb3YsIDEgcGFzc3Rocm91Z2gsIDEgc3Jpb3YgZGVkaWNhdGVkCisgIFRlc3QgbWFjIGFkZHJlc3MgYWxsb2NhdGlvbiwgMSBWTSB3aXRoIGRpcmVjdCBuZXR3b3JrIGF0dGFjaCwgCisgIGFub3RoZXIgVk0gd2l0aCBuZXR3b3JrIGF0dGFjaCBhZnRlciBjcmVhdGlvbiIKK2VjaG8KK2VjaG8gIlByZXNzIGVudGVyIHRvIGNvbnRpbnVlIgorcmVhZCBraworCisjaW1hZ2UgdG8gbG9hZAoraW1hZ2VQYXRoPS9tbnQvcG93ZXJ2YXVsdC92aXJ0dWFsaXphdGlvbi92bmZzL29zL1VTMTQwNC5xY293MgorI2ltYWdlIHRvIGxvYWQgYXMgYW4gZXh0cmEgZGlzaywgY2FuIGJlIGFueQoraW1hZ2VQYXRoX2V4dHJhPS9tbnQvcG93ZXJ2YXVsdC92aXJ0dWFsaXphdGlvbi92bmZzL29zL1VTMTQwNHVzZXIucWNvdzIKKyNkZWZhdWx0IG5ldHdvcmsgdG8gdXNlCituZXR3b3JrX2V0aDA9ZGVmYXVsdAorCisKK0RJUk5BTUU9YGRpcm5hbWUgJDBgCisKK2Z1bmN0aW9uIGRlbF9ydWJiaXNoKCl7CisgIGVjaG8gIlByZXNzIGVudGVyIHRvIGRlbGV0ZSB0aGUgZGVwbG95ZWQgdGhpbmdzIgorICByZWFkIGtrCisgIFsgLW4gIiRERUxfc2VydmVyIiBdICAmJiAke0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtZiBkZWwgc2VydmVyICRERUxfc2VydmVyCisgIFsgLW4gIiRERUxfbmV0d29yayIgXSAmJiAke0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtZiBkZWwgbmV0d29yayAkREVMX25ldHdvcmsKKyAgWyAtbiAiJERFTF9mbGF2b3IiIF0gICYmICR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IC1mIGRlbCBmbGF2b3IgJERFTF9mbGF2b3IKKyAgWyAtbiAiJERFTF9pbWFnZSIgXSAgICYmICR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IC1mIGRlbCBpbWFnZSAkREVMX2ltYWdlCisgIHJtIC1mIGtrLm91dAorfQorCitmdW5jdGlvbiBwcm9jY2Vzc19vdXQoKXsgIyBhY3Rpb25fdGV4dCAgZmllbGQgdG8gcmV0cmlldmUKKyAgaWYgZWdyZXAgLXEgIlwiZXJyb3JcIiIgIGtrLm91dAorICB0aGVuCisgICAgZWNobyAiZmFpbGVkIHRvIiAkMQorICAgIGNhdCBray5vdXQKKyAgICBkZWxfcnViYmlzaAorICAgIGV4aXQgLTEKKyAgZmkKKyAgaWYgWyAteiAiJDIiIF0gOyB0aGVuIHBhdHRlcm49JyJpZCInIDsgZWxzZSBwYXR0ZXJuPSIkMiIgOyBmaQorICB2YWx1ZT1gZWdyZXAgICIkcGF0dGVybiIgIGtrLm91dCBgCisgIHZhbHVlPSR7dmFsdWUjIyogXCJ9CisgIHZhbHVlPSR7dmFsdWUlXCIqfQorICBpZiBbWyAteiAiJHZhbHVlIiBdXQorICB0aGVuIAorICAgIGVjaG8gIm5vdCBmb3VuZCB0aGUgZmllbGQiICQyCisgICAgY2F0IGtrLm91dAorICAgIGRlbF9ydWJiaXNoCisgICAgZXhpdCAtMQorICBmaQorfQorCisjcHJvY2Nlc3Nfb3V0ICJpbnNlcnQgc2VydmVyIHRpZGdlbjEiICdeICAgICAgICAgICAgImlkIicKKyNlY2hvICR2YWx1ZQorI2V4aXQgMAorCisKKworZWNobyAtbiAiZ2V0ICR7aW1hZ2VQYXRoIyMqL30gaW1hZ2U6ICAgICAgICAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtRiJwYXRoPSRpbWFnZVBhdGgiIGltYWdlcyA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJnZXQgJHtpbWFnZVBhdGgjIyovfSIgCitlY2hvICR2YWx1ZQoraW1hZ2UxPSR2YWx1ZQorCisKK2VjaG8gLW4gImdldCAke2ltYWdlUGF0aF9leHRyYSMjKi99IGltYWdlOiAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgLUYicGF0aD0kaW1hZ2VQYXRoX2V4dHJhIiBpbWFnZXMgPiBray5vdXQKK3Byb2NjZXNzX291dCAiZ2V0ICR7aW1hZ2VQYXRoX2V4dHJhIyMqL30iIAorZWNobyAkdmFsdWUKK2ltYWdlMj0kdmFsdWUKKworCitlY2hvIC1uICJnZXQgJHtuZXR3b3JrX2V0aDB9IG5ldHdvcms6ICAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtRiJuYW1lPSRuZXR3b3JrX2V0aDAiIG5ldHdvcmsgPiBray5vdXQKK3Byb2NjZXNzX291dCAiZ2V0ICAke25ldHdvcmtfZXRoMH0gbmV0d29yayIgCitlY2hvICR2YWx1ZQorbmV0d29ya19ldGgwPSR2YWx1ZQorCisKK2VjaG8gLW4gImluc2VydCBmbGF2b3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgbmV3IGZsYXZvciAnCistLS0KK2ZsYXZvcjoKKyAgbmFtZTogNVBUaF84R18ySQorICBkZXNjcmlwdGlvbjogZmxhdm9yIHRvIHRlc3Qgb3BlbnZpbQorICBleHRlbmRlZDogCisgICAgcHJvY2Vzc29yX3Jhbmtpbmc6IDIwNQorICAgIG51bWFzOgorICAgIC0gIG1lbW9yeTogOAorICAgICAgIHBhaXJlZC10aHJlYWRzOiA1CisgICAgICAgaW50ZXJmYWNlczoKKyAgICAgICAtIG5hbWU6IHhlMAorICAgICAgICAgZGVkaWNhdGVkOiAieWVzIgorICAgICAgICAgYmFuZHdpZHRoOiAiMTAgR2JwcyIKKyAgICAgICAgIHZwY2k6ICIwMDAwOjAwOjEwLjAiCisgICAgICAgICAjbWFjX2FkZHJlc3M6ICIxMDoxMDoxMDoxMDoxMDoxMCIKKyAgICAgICAtIG5hbWU6IHhlMQorICAgICAgICAgZGVkaWNhdGVkOiAibm8iCisgICAgICAgICBiYW5kd2lkdGg6ICIxMCBHYnBzIgorICAgICAgICAgdnBjaTogIjAwMDA6MDA6MTEuMCIKKyAgICAgICAgIG1hY19hZGRyZXNzOiAiMTA6MTA6MTA6MTA6MTA6MTEiCisnICA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJpbnNlcnQgZmxhdm9yIiAKK2VjaG8gJHZhbHVlCitmbGF2b3IxPSR2YWx1ZQorREVMX2ZsYXZvcj0iJERFTF9mbGF2b3IgJGZsYXZvcjEiCisKKworZWNobyAtbiAiaW5zZXJ0IHB0cCBuZXQxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSBuZXcgbmV0d29yayAnCistLS0KK25ldHdvcms6CisgIG5hbWU6IG5ldHdvcmsteGUwCisgIHR5cGU6IHB0cAorJyAgPiBray5vdXQKK3Byb2NjZXNzX291dCAiaW5zZXJ0IG5ldHdvcmsgMCIgCitlY2hvICR2YWx1ZQorbmV0d29yazA9JHZhbHVlCitERUxfbmV0d29yaz0iJERFTF9uZXR3b3JrICR2YWx1ZSIKKworCitlY2hvIC1uICJpbnNlcnQgcHRwIG5ldDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IG5ldyBuZXR3b3JrICcKKy0tLQorbmV0d29yazoKKyAgbmFtZTogbmV0d29yay14ZTEKKyAgdHlwZTogcHRwCisnICA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJpbnNlcnQgbmV0d29yayAxIgorZWNobyAkdmFsdWUKK25ldHdvcmsxPSR2YWx1ZQorREVMX25ldHdvcms9IiRERUxfbmV0d29yayAkdmFsdWUiCisKKworCitlY2hvIC1uICJpbnNlcnQgYnJpZGdlIG5ldHdvcmsgbmV0MjogICAgICAgICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IG5ldyBuZXR3b3JrICcKKy0tLQorbmV0d29yazoKKyAgbmFtZTogbmV0d29yay1uZXQyCisgIHR5cGU6IGJyaWRnZV9kYXRhCisnICA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJpbnNlcnQgbmV0d29yayAyIgorZWNobyAkdmFsdWUKK25ldHdvcmsyPSR2YWx1ZQorREVMX25ldHdvcms9IiRERUxfbmV0d29yayAkdmFsdWUiCisKK2VjaG8gLW4gImluc2VydCB0ZXN0IFZNIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgbmV3IHNlcnZlciAiCistLS0KK3NlcnZlcjoKKyAgbmFtZTogdGVzdF9WTTEKKyAgZGVzY3JpdGlvbjogVVMgb3IgdGlkZ2VuIHdpdGggMSBTUklPViAxIFBBU1NUSFJPVUdICisgIGltYWdlUmVmOiAnJGltYWdlMScKKyAgZmxhdm9yUmVmOiAnJGZsYXZvcjEnCisgIG5ldHdvcmtzOgorICAtIG5hbWU6IG1nbXQwCisgICAgdnBjaTogJzAwMDA6MDA6MGEuMCcKKyAgICB1dWlkOiAke25ldHdvcmtfZXRoMH0KKyAgICBtYWNfYWRkcmVzczogJzEwOjEwOjEwOjEwOjEwOjEyJworICAtIG5hbWU6IGV0aDAKKyAgICB2cGNpOiAnMDAwMDowMDowYi4wJworICAgIHV1aWQ6ICckbmV0d29yazInCisgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDoxMDoxMycKKyIgID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImluc2VydCB0ZXN0IFZNIDIiICdeICAgICAgICAiaWQiJworZWNobyAkdmFsdWUKK3NlcnZlcjE9JHZhbHVlCitERUxfc2VydmVyPSIkREVMX3NlcnZlciAkdmFsdWUiCisKKworCitlY2hvIC1uICJpbnNlcnQgdGVzdCBWTSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IG5ldyBzZXJ2ZXIgIgorLS0tCitzZXJ2ZXI6CisgIG5hbWU6IHRlc3RfVk0yCisgIGRlc2NyaXRpb246IFVTIG9yIHRpZGdlbiB3aXRoIGRpcmVjdCBuZXR3b3JrIGF0dGFjaAorICBpbWFnZVJlZjogJyRpbWFnZTEnCisgIGZsYXZvclJlZjogJyRmbGF2b3IxJworICBuZXR3b3JrczoKKyAgLSBuYW1lOiBtZ210MAorICAgIHZwY2k6ICcwMDAwOjAwOjBhLjAnCisgICAgdXVpZDogJHtuZXR3b3JrX2V0aDB9CisgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDphYToxMicKKyAgLSBuYW1lOiBldGgwCisgICAgdnBjaTogJzAwMDA6MDA6MGIuMCcKKyAgICB1dWlkOiAnJG5ldHdvcmsyJworICAgIG1hY19hZGRyZXNzOiAnMTA6MTA6MTA6MTA6YWE6MTMnCisgIGV4dGVuZGVkOgorICAgIHByb2Nlc3Nvcl9yYW5raW5nOiAyMDUKKyAgICBudW1hczoKKyAgICAtICBtZW1vcnk6IDgKKyAgICAgICB0aHJlYWRzOiAxMAorICAgICAgIGludGVyZmFjZXM6CisgICAgICAgLSBuYW1lOiB4ZTAKKyAgICAgICAgIGRlZGljYXRlZDogJ3llcycKKyAgICAgICAgIGJhbmR3aWR0aDogJzEwIEdicHMnCisgICAgICAgICB2cGNpOiAnMDAwMDowMDoxMC4wJworICAgICAgICAgI21hY19hZGRyZXNzOiAnMTA6MTA6MTA6MTA6YWE6MTAnCisgICAgICAgICB1dWlkOiAnJG5ldHdvcmswJworICAgICAgIC0gbmFtZTogeGUxCisgICAgICAgICBkZWRpY2F0ZWQ6ICdubycKKyAgICAgICAgIGJhbmR3aWR0aDogJzcgR2JwcycKKyAgICAgICAgIHZwY2k6ICcwMDAwOjAwOjExLjAnCisgICAgICAgICBtYWNfYWRkcmVzczogJzEwOjEwOjEwOjEwOmFhOjExJworICAgICAgICAgdXVpZDogJyRuZXR3b3JrMScKKyAgICBkZXZpY2VzOgorICAgIC0gdHlwZTogZGlzaworICAgICAgaW1hZ2VSZWY6ICckaW1hZ2UyJworIiAgPiBray5vdXQKK3Byb2NjZXNzX291dCAiaW5zZXJ0IHRlc3QgVk0gMiIgJ14gICAgICAgICJpZCInCitlY2hvICR2YWx1ZQorc2VydmVyMj0kdmFsdWUKK0RFTF9zZXJ2ZXI9IiRERUxfc2VydmVyICR2YWx1ZSIKKworZWNobyAtbiAiZ2V0IHhlMCBpZmFjZSB1dWlkIGZyb20gdGlkZ2VuMTogICAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtRiAiZGV2aWNlX2lkPSR7c2VydmVyMX0mbmFtZT14ZTAiICBwb3J0cyA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJnZXQgeGUwIHV1aWQgcG9ydCBmcm9tIHRpZGdlbjEiIAorZWNobyAkdmFsdWUKK2lmYWNlX3hlMD0kdmFsdWUKKworCitlY2hvIC1uICJnZXQgeGUxIGlmYWNlIHV1aWQgZnJvbSB0aWRnZW4xOiAgICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IC1GICJkZXZpY2VfaWQ9JHtzZXJ2ZXIxfSZuYW1lPXhlMSIgIHBvcnRzID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImdldCB4ZTEgdXVpZCBwb3J0IGZyb20gdGlkZ2VuMSIgCitlY2hvICR2YWx1ZQoraWZhY2VfeGUxPSR2YWx1ZQorCisKK2VjaG8gLW4gImF0dGFjaCB4ZTAgZnJvbSB0aWRnZW4xIHRvIG5ldHdvcmsgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgLWYgZWRpdCBwb3J0cyAkaWZhY2VfeGUwICJuZXR3b3JrX2lkOiAkbmV0d29yazAiID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImF0dGFjaCB4ZTAgZnJvbSB0aWRnZW4xIHRvIG5ldHdvcmsiCitlY2hvICJvayIKKworCitlY2hvIC1uICJhdHRhY2ggeGUxIGZyb20gdGlkZ2VuMSB0byBuZXR3b3JrICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IC1mIGVkaXQgcG9ydHMgJGlmYWNlX3hlMSAibmV0d29ya19pZDogJG5ldHdvcmsxIiA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJhdHRhY2ggeGUxIGZyb20gdGlkZ2VuMSB0byBuZXR3b3JrIgorZWNobyAib2siCisKKworZWNobyAKK2VjaG8gZmluc2lzaC4gQ2hlY2sgY29ubmVjdGlvbnMhIQorZWNobworCitkZWxfcnViYmlzaAorZXhpdCAwCisKZGlmZiAtLWdpdCBhL3Rlc3QvMlZNX05vSHVnZS5zaCBiL3Rlc3QvMlZNX05vSHVnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MzI2ZWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC8yVk1fTm9IdWdlLnNoCkBAIC0wLDAgKzEsMTk5IEBACisjIS9iaW4vYmFzaAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworIworI2F1dGhvciBBbGZvbnNvIFRpZXJubworIworI3NjcmlwdCB0byB0ZXN0IG9wZW52aW0gd2l0aCB0aGUgY3JlYXRpb24gb2YgZmxhdm9ycyBhbmQgaW50ZXJmYWNlcworI2luIGNsb3VkIHN0eWxlCisjCisKK2VjaG8gIiBDcmVhdGVzIDEgZmxhdm9yLCAzIG5ldHMsIDIgVk1zIChVUykKKyAgV0lUSE9VVCBodWdlIHBhZ2VzLCBub3IgTlVNQSBhc3NpZ21lbnQKKyAgbmV0d29yayBhdHRhY2ggYWZ0ZXIgY3JlYXRpb24iCitlY2hvCitlY2hvICJQcmVzcyBlbnRlciB0byBjb250aW51ZSIKK3JlYWQga2sKKworI2ltYWdlIHRvIGxvYWQKK2ltYWdlUGF0aD0vbW50L3Bvd2VydmF1bHQvdmlydHVhbGl6YXRpb24vdm5mcy9vcy9VUzE0MDQucWNvdzIKKyNpbWFnZSB0byBsb2FkIGFzIGFuIGV4dHJhIGRpc2ssIGNhbiBiZSBhbnkKK2ltYWdlUGF0aF9leHRyYT0vbW50L3Bvd2VydmF1bHQvdmlydHVhbGl6YXRpb24vdm5mcy9vcy9VUzE0MDR1c2VyLnFjb3cyCisjZGVmYXVsdCBuZXR3b3JrIHRvIHVzZQorbmV0d29ya19ldGgwPWRlZmF1bHQKKworCitESVJOQU1FPWBkaXJuYW1lICQwYAorCitmdW5jdGlvbiBkZWxfcnViYmlzaCgpeworICBlY2hvICJQcmVzcyBlbnRlciB0byBkZWxldGUgdGhlIGRlcGxveWVkIHRoaW5ncyIKKyAgcmVhZCBraworICBbIC1uICIkREVMX3NlcnZlciIgXSAgJiYgJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgLWYgZGVsIHNlcnZlciAkREVMX3NlcnZlcgorICBbIC1uICIkREVMX25ldHdvcmsiIF0gJiYgJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgLWYgZGVsIG5ldHdvcmsgJERFTF9uZXR3b3JrCisgIFsgLW4gIiRERUxfZmxhdm9yIiBdICAmJiAke0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtZiBkZWwgZmxhdm9yICRERUxfZmxhdm9yCisgIFsgLW4gIiRERUxfaW1hZ2UiIF0gICAmJiAke0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSAtZiBkZWwgaW1hZ2UgJERFTF9pbWFnZQorICBybSAtZiBray5vdXQKK30KKworZnVuY3Rpb24gcHJvY2Nlc3Nfb3V0KCl7ICMgYWN0aW9uX3RleHQgIGZpZWxkIHRvIHJldHJpZXZlCisgIGlmIGVncmVwIC1xICJcImVycm9yXCIiICBray5vdXQKKyAgdGhlbgorICAgIGVjaG8gImZhaWxlZCB0byIgJDEKKyAgICBjYXQga2sub3V0CisgICAgZGVsX3J1YmJpc2gKKyAgICBleGl0IC0xCisgIGZpCisgIGlmIFsgLXogIiQyIiBdIDsgdGhlbiBwYXR0ZXJuPSciaWQiJyA7IGVsc2UgcGF0dGVybj0iJDIiIDsgZmkKKyAgdmFsdWU9YGVncmVwICAiJHBhdHRlcm4iICBray5vdXQgYAorICB2YWx1ZT0ke3ZhbHVlIyMqIFwifQorICB2YWx1ZT0ke3ZhbHVlJVwiKn0KKyAgaWYgW1sgLXogIiR2YWx1ZSIgXV0KKyAgdGhlbiAKKyAgICBlY2hvICJub3QgZm91bmQgdGhlIGZpZWxkIiAkMgorICAgIGNhdCBray5vdXQKKyAgICBkZWxfcnViYmlzaAorICAgIGV4aXQgLTEKKyAgZmkKK30KKworI3Byb2NjZXNzX291dCAiaW5zZXJ0IHNlcnZlciB0aWRnZW4xIiAnXiAgICAgICAgICAgICJpZCInCisjZWNobyAkdmFsdWUKKyNleGl0IDAKKworCisKK2VjaG8gLW4gImdldCAke2ltYWdlUGF0aCMjKi99IGltYWdlOiAgICAgICAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgLUYicGF0aD0kaW1hZ2VQYXRoIiBpbWFnZXMgPiBray5vdXQKK3Byb2NjZXNzX291dCAiZ2V0ICR7aW1hZ2VQYXRoIyMqL30iIAorZWNobyAkdmFsdWUKK2ltYWdlMT0kdmFsdWUKKworCitlY2hvIC1uICJnZXQgJHtpbWFnZVBhdGhfZXh0cmEjIyovfSBpbWFnZTogICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IC1GInBhdGg9JGltYWdlUGF0aF9leHRyYSIgaW1hZ2VzID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImdldCAke2ltYWdlUGF0aF9leHRyYSMjKi99IiAKK2VjaG8gJHZhbHVlCitpbWFnZTI9JHZhbHVlCisKKworZWNobyAtbiAiZ2V0ICR7bmV0d29ya19ldGgwfSBuZXR3b3JrOiAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgLUYibmFtZT0kbmV0d29ya19ldGgwIiBuZXR3b3JrID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImdldCAgJHtuZXR3b3JrX2V0aDB9IG5ldHdvcmsiIAorZWNobyAkdmFsdWUKK25ldHdvcmtfZXRoMD0kdmFsdWUKKworCitlY2hvIC1uICJpbnNlcnQgZmxhdm9yOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IG5ldyBmbGF2b3IgJworLS0tCitmbGF2b3I6CisgIG5hbWU6IENsb3VkVk0KKyAgZGVzY3JpcHRpb246IG5vcm1hbCBjbG91ZCBpbWFnZSB3aXRoIDFHLCAxY29yZQorICByYW06IDEwMjQKKyAgdmNwdXM6IDEKKycgID4ga2sub3V0Citwcm9jY2Vzc19vdXQgImluc2VydCBmbGF2b3IiIAorZWNobyAkdmFsdWUKK2ZsYXZvcjE9JHZhbHVlCitERUxfZmxhdm9yPSIkREVMX2ZsYXZvciAkZmxhdm9yMSIKKworCitlY2hvCitlY2hvICJQcmVzcyBlbnRlciB0byBjb250aW51ZSIKK3JlYWQga2sKKworZWNobyAtbiAiaW5zZXJ0IGJyaWRnZSBuZXR3b3JrIG5ldDI6ICAgICAgICAgICAgICAgICAgICAgICAiCiske0RJUk5BTUV9L3Rlc3Rfb3BlbnZpbS5weSBuZXcgbmV0d29yayAnCistLS0KK25ldHdvcms6CisgIG5hbWU6IG5ldHdvcmstYnJpZGdlCisgIHR5cGU6IGJyaWRnZV9kYXRhCisnICA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJpbnNlcnQgbmV0d29yayAyIgorZWNobyAkdmFsdWUKK25ldHdvcmsyPSR2YWx1ZQorREVMX25ldHdvcms9IiRERUxfbmV0d29yayAkdmFsdWUiCisKK2VjaG8gLW4gImluc2VydCB0ZXN0IFZNIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorJHtESVJOQU1FfS90ZXN0X29wZW52aW0ucHkgbmV3IHNlcnZlciAiCistLS0KK3NlcnZlcjoKKyAgbmFtZTogdGVzdF9WTTEKKyAgZGVzY3JpdGlvbjogVVMgIDEgY29yZQorICBpbWFnZVJlZjogJyRpbWFnZTEnCisgIGZsYXZvclJlZjogJyRmbGF2b3IxJworICBuZXR3b3JrczoKKyAgLSBuYW1lOiBtZ210MAorICAgIHZwY2k6ICcwMDAwOjAwOjBhLjAnCisgICAgdXVpZDogJHtuZXR3b3JrX2V0aDB9CisgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDoxMDoxMicKKyAgLSBuYW1lOiBldGgwCisgICAgdnBjaTogJzAwMDA6MDA6MGIuMCcKKyAgICB1dWlkOiAnJG5ldHdvcmsyJworICAgIG1hY19hZGRyZXNzOiAnMTA6MTA6MTA6MTA6MTA6MTMnCisiICA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJpbnNlcnQgdGVzdCBWTSAyIiAnXiAgICAgICAgImlkIicKK2VjaG8gJHZhbHVlCitzZXJ2ZXIxPSR2YWx1ZQorREVMX3NlcnZlcj0iJERFTF9zZXJ2ZXIgJHZhbHVlIgorCisKK2VjaG8KK2VjaG8gIlByZXNzIGVudGVyIHRvIGNvbnRpbnVlIgorcmVhZCBraworCitlY2hvIC1uICJpbnNlcnQgdGVzdCBWTSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyR7RElSTkFNRX0vdGVzdF9vcGVudmltLnB5IG5ldyBzZXJ2ZXIgIgorLS0tCitzZXJ2ZXI6CisgIG5hbWU6IHRlc3RfVk0yCisgIGRlc2NyaXRpb246IFVTIDFHIDFjb3JlCisgIGltYWdlUmVmOiAnJGltYWdlMScKKyAgZmxhdm9yUmVmOiAnJGZsYXZvcjEnCisgIHJhbTogMTAyNAorICB2Y3B1czogMQorICBuZXR3b3JrczoKKyAgLSBuYW1lOiBtZ210MAorICAgIHZwY2k6ICcwMDAwOjAwOjBhLjAnCisgICAgdXVpZDogJHtuZXR3b3JrX2V0aDB9CisgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDphYToxMicKKyAgLSBuYW1lOiBldGgwCisgICAgdnBjaTogJzAwMDA6MDA6MGIuMCcKKyAgICB1dWlkOiAnJG5ldHdvcmsyJworICAgIG1hY19hZGRyZXNzOiAnMTA6MTA6MTA6MTA6YWE6MTMnCisgIGV4dGVuZGVkOgorICAgIGRldmljZXM6CisgICAgLSB0eXBlOiBkaXNrCisgICAgICBpbWFnZVJlZjogJyRpbWFnZTInCisiICA+IGtrLm91dAorcHJvY2Nlc3Nfb3V0ICJpbnNlcnQgdGVzdCBWTSAyIiAnXiAgICAgICAgImlkIicKK2VjaG8gJHZhbHVlCitzZXJ2ZXIyPSR2YWx1ZQorREVMX3NlcnZlcj0iJERFTF9zZXJ2ZXIgJHZhbHVlIgorCitlY2hvIAorZWNobyBmaW5zaXNoLiBDaGVjayBjb25uZWN0aW9ucyEhCitlY2hvCisKK2RlbF9ydWJiaXNoCitleGl0IDAKKwpkaWZmIC0tZ2l0IGEvdGVzdC9mbGF2b3JzLzJUaF8yRy55YW1sIGIvdGVzdC9mbGF2b3JzLzJUaF8yRy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjk1NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZsYXZvcnMvMlRoXzJHLnlhbWwKQEAgLTAsMCArMSwzNyBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworCit7CisiZmxhdm9yIjp7CisgICAgIm5hbWUiOiIyVGhfMkciLAorICAgICJkZXNjcmlwdGlvbiI6IjIgVGhyZWFkcywgMkdieXRlLCBvbmx5IDIgbWFuYWdlbWVudCBpbnRlcmZhY2VzIiwKKyAgICAiZXh0ZW5kZWQiOnsKKyAgICAgICAgInByb2Nlc3Nvcl9yYW5raW5nIjoyMDUsIAorICAgICAgICAibnVtYXMiOlsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAibWVtb3J5IjoyLCAKKyAgICAgICAgICAgICAgICAidGhyZWFkcyI6MgorICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfQorfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9mbGF2b3JzLzVQVGhfOEdfMkkueWFtbCBiL3Rlc3QvZmxhdm9ycy81UFRoXzhHXzJJLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmZWI0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmxhdm9ycy81UFRoXzhHXzJJLnlhbWwKQEAgLTAsMCArMSwzOSBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworIyA1VGhfOEdfMlAKK2ZsYXZvcjoKKyAgICBuYW1lOiAgICAgICAgNVBUaF84R18ySQorICAgIGRlc2NyaXB0aW9uOiA1UGFpciB0aHJlYWRzICgxMHR0aHJlYWRzKSA4R0IgbWVtb3J5IGFuZCAyIGRhdGFwbGFuZSBwYXNzdGhyb3VnaCBpbnRlcmZhY2VzCisgICAgZXh0ZW5kZWQ6CisgICAgICAgIHByb2Nlc3Nvcl9yYW5raW5nOiAxMDAgCisgICAgICAgIG51bWFzOgorICAgICAgICAtICBtZW1vcnk6ICAgICAgICAgOCAKKyAgICAgICAgICAgcGFpcmVkLXRocmVhZHM6IDUKKyAgICAgICAgICAgaW50ZXJmYWNlczogCisgICAgICAgICAgIC0gICBuYW1lOiAgICAgICB4ZTAKKyAgICAgICAgICAgICAgIHZwY2k6ICAgICAgICIwMDAwOjAwOjEwLjAiCisgICAgICAgICAgICAgICBiYW5kd2lkdGg6ICAxMCBHYnBzCisgICAgICAgICAgICAgICBkZWRpY2F0ZWQ6ICAieWVzIgorICAgICAgICAgICAtICAgbmFtZTogICAgICAgeGUxCisgICAgICAgICAgICAgICB2cGNpOiAgICAgICAiMDAwMDowMDoxMS4wIgorICAgICAgICAgICAgICAgYmFuZHdpZHRoOiAgMTAgR2JwcworICAgICAgICAgICAgICAgZGVkaWNhdGVkOiAgInllcyIKZGlmZiAtLWdpdCBhL3Rlc3QvZmxhdm9ycy9uZXdfZmxhdm9yLnlhbWwgYi90ZXN0L2ZsYXZvcnMvbmV3X2ZsYXZvci55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjIzZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZsYXZvcnMvbmV3X2ZsYXZvci55YW1sCkBAIC0wLDAgKzEsNDUgQEAKKworIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworeworICAgICIke30iOlsKKyAgICAgICAgIiR7bmFtZX0gZmxhdm9yIG5hbWUiLAorICAgICAgICAiJHtkZXNjcmlwdGlvbn0gZmxhdm9yIGRlc2NyaXB0aW9uICgke25hbWV9KSIsCisgICAgICAgICIke3Byb2Nlc3Nvcl9yYW5raW5nfSBwcm9jZXNzbm9yIHJhbmtpbmcgKDEwMCkiLAorICAgICAgICAiJHttZW1vcnl9IG1lbW9yeSBpbiBHQiAoMikiLAorICAgICAgICAiJHt0aHJlYWRzfSB0aHJlYWRzIG5lZWRlZCAoMikiCisgICAgXSwKKworImZsYXZvciI6eworICAgICJuYW1lIjoiJHtuYW1lfSIsCisgICAgImRlc2NyaXB0aW9uIjoiJHtkZXNjcmlwdGlvbn0iLAorICAgICJleHRlbmRlZCI6eworICAgICAgICAicHJvY2Vzc29yX3JhbmtpbmciOiIke3Byb2Nlc3Nvcl9yYW5raW5nIGludH0iLCAKKyAgICAgICAgIm51bWFzIjpbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIm1lbW9yeSI6IiR7bWVtb3J5IGludH0iLCAKKyAgICAgICAgICAgICAgICAidGhyZWFkcyI6IiR7dGhyZWFkcyBpbnR9IgorICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfQorfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nZXRfcGFyYW1zLnNoIGIvdGVzdC9nZXRfcGFyYW1zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhMGY2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dldF9wYXJhbXMuc2gKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL2Jhc2gKKworIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworIworI2F1dGhvciBBbGZvbnNvIFRpZXJubworIworI3NjcmlwdCB0aGF0IG9idGFpbiB0aGUgcGFyYW1ldGVycyBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyNpdCBpcyBhIGJpdCB1bnNhZmUgYmVjYXVzZSBhIGNvbW1lbnQgaW4gdGhlIHlhbWwgY29uZmlndXJhdGlvbiBmaWxlCisjY2FuIHdyb25nIHRoaXMgc2NyaXB0ICAKKworI2dldCBwYXJhbXMgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUKKworWyAteiAiJDEiIF0gJiYgZWNobyAidXNhZ2U6ICQwIFtvcGVudmltX2NmZ19maWxlXSIgJiYgZXhpdAorCitPUEVOVklNX1BPUlQ9YGdyZXAgaHR0cF9wb3J0OiAkMWAKK09QRU5WSU1fUE9SVD0ke09QRU5WSU1fUE9SVCNodHRwX3BvcnQ6fQorT1BFTlZJTV9QT1JUPSR7T1BFTlZJTV9QT1JUJSUjKn0KK09QRU5WSU1fUE9SVD1gZXZhbCBlY2hvICR7T1BFTlZJTV9QT1JUfWAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlcworCitPUEVOVklNX0FETUlOX1BPUlQ9YGdyZXAgaHR0cF9hZG1pbl9wb3J0OiAkMWAKK09QRU5WSU1fQURNSU5fUE9SVD0ke09QRU5WSU1fQURNSU5fUE9SVCNodHRwX2FkbWluX3BvcnQ6fQorT1BFTlZJTV9BRE1JTl9QT1JUPSR7T1BFTlZJTV9BRE1JTl9QT1JUJSUjKn0KK09QRU5WSU1fQURNSU5fUE9SVD1gZXZhbCBlY2hvICR7T1BFTlZJTV9BRE1JTl9QT1JUfWAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlcworCitPUEVOVklNX0hPU1Q9YGdyZXAgaHR0cF9ob3N0OiAkMWAKK09QRU5WSU1fSE9TVD0ke09QRU5WSU1fSE9TVCNodHRwX2hvc3Q6fQorT1BFTlZJTV9IT1NUPSR7T1BFTlZJTV9IT1NUJSUjKn0KK09QRU5WSU1fSE9TVD1gZXZhbCBlY2hvICR7T1BFTlZJTV9IT1NUfWAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlcworCitPUEVOVklNX09GX0lQPWBncmVwIG9mX2NvbnRyb2xsZXJfaXA6ICQxYAorT1BFTlZJTV9PRl9JUD0ke09QRU5WSU1fT0ZfSVAjb2ZfY29udHJvbGxlcl9pcDp9CitPUEVOVklNX09GX0lQPSR7T1BFTlZJTV9PRl9JUCUlIyp9CitPUEVOVklNX09GX0lQPWBldmFsIGVjaG8gJHtPUEVOVklNX09GX0lQfWAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlcworCitPUEVOVklNX09GX1BPUlQ9YGdyZXAgb2ZfY29udHJvbGxlcl9wb3J0OiAkMWAKK09QRU5WSU1fT0ZfUE9SVD0ke09QRU5WSU1fT0ZfUE9SVCNvZl9jb250cm9sbGVyX3BvcnQ6fQorT1BFTlZJTV9PRl9QT1JUPSR7T1BFTlZJTV9PRl9QT1JUJSUjKn0KK09QRU5WSU1fT0ZfUE9SVD1gZXZhbCBlY2hvICR7T1BFTlZJTV9PRl9QT1JUfWAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlcworCitPUEVOVklNX09GX0RQSUQ9YGdyZXAgb2ZfY29udHJvbGxlcl9kcGlkOiAkMWAKK09QRU5WSU1fT0ZfRFBJRD0ke09QRU5WSU1fT0ZfRFBJRCNvZl9jb250cm9sbGVyX2RwaWQ6fQorT1BFTlZJTV9PRl9EUElEPSR7T1BFTlZJTV9PRl9EUElEJSUjKn0KK09QRU5WSU1fT0ZfRFBJRD1gZXZhbCBlY2hvICR7T1BFTlZJTV9PRl9EUElEfWAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlcworCmRpZmYgLS1naXQgYS90ZXN0L2hvc3RzL2hvc3QtZXhhbXBsZTAuanNvbiBiL3Rlc3QvaG9zdHMvaG9zdC1leGFtcGxlMC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGM1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hvc3RzL2hvc3QtZXhhbXBsZTAuanNvbgpAQCAtMCwwICsxLDQ2NSBAQAoreworICAgICJob3N0Ijp7CisgICAgICAgICJuYW1lIjogImZha2UtaG9zdC0wIiwKKyAgICAgICAgInVzZXIiOiAidXNlciIsIAorICAgICAgICAicGFzc3dvcmQiOiAicGFzc3dvcmQiLCAKKyAgICAgICAgImlwX25hbWUiOiAiZmFrZWhvc3QwIiAKKyAgICB9LAorImhvc3QtZGF0YSI6Cit7CisgICAgIm5hbWUiOiAiZmFrZS1ob3N0LTAiLAorICAgICJyYW5raW5nIjogMzAwLAorICAgICJkZXNjcmlwdGlvbiI6ICJmYWtlIGhvc3QgMCBmb3IgdGVzdCBtb2RlIiwKKyAgICAiaXBfbmFtZSI6ICJmYWtlaG9zdDAiLAorICAgICJmZWF0dXJlcyI6ICJscHMsZGlvYyxod3N2LGh0LDY0Yix0bGJwcyIsCisgICAgInVzZXIiOiAidXNlciIsCisgICAgInBhc3N3b3JkIjogInBhc3N3b3JkIiwKKyAgICAibnVtYXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb3JlcyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDEyLAorICAgICAgICAgICAgICAgICAgICAic3RhdHVzIjogIm5vdGVsaWdpYmxlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzNiwKKyAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6ICJub3RlbGlnaWJsZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTMKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAyLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAyLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzgKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAzLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTUKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAzLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA0LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTYKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA0LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDAKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA1LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA1LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA2LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTgKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA2LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA3LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA3LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDMKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA4LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjAKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA4LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA5LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA5LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDUKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDIyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0NgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDExLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjMKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQ3CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJudW1hX3NvY2tldCI6IDEsCisgICAgICAgICAgICAiaHVnZXBhZ2VzIjogMjgsCisgICAgICAgICAgICAibWVtb3J5IjogMzIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvcmVzIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6ICJub3RlbGlnaWJsZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjQsCisgICAgICAgICAgICAgICAgICAgICJzdGF0dXMiOiAibm90ZWxpZ2libGUiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjUKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAyLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDIsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyNgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDMsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDI3CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA0LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjgKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA1LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDUsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyOQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDYsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA2CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDMwCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA3LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA4LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogOAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDgsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzMgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDksCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA5CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDMzCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxMAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDExCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzNQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiaW50ZXJmYWNlcyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJldGg4IiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjAwLjAiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvMiIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhNjoxMjoyNzpiZDoyZDplZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjEwLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJiZTo4YTo0MDo1ODpjZjpkZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjEwLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjNjpiZjo3YTozMDoxMzo1NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjEwLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJiZTozMjo1MDplZjplYTo0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjEwLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhZTozNjo2MDpiYzo0MTo3OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjExLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI1MjoyMjozYTo5OTo2Nzo0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjExLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIwYTpiODowMDoyYzo4YTpiMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjExLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJlMjpmNjo3MDo4MzphMzplYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjExLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI5MDplMjpiYTowYzozNjo0YyIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogImV0aDE3IiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjAwLjEiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvMyIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI5MjowZToyNzowYzphZDplYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjEwLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJiZTo5OTo2NTplODo5ODphMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjEwLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI4YTozYjo1NDo0Mjo4ODpiMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjEwLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjNjo1ZDo4YTpjNTowNTpmNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjEwLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI5NjpiZDo2MTowMjo0ZjpkNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjExLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIyMjo1ZDo4NToyYzoxYjpmZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjExLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJlNjo3Zjo4YTo0ODpiYzoyNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjExLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIyZTo0YTplNjo2ODoxODpmYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA4OjExLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI5MDplMjpiYTowYzozNjo0ZCIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogImV0aDI2IiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjAwLjAiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvMCIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIwMjo3OToxNTowMjphZDpjYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIwNjo4MTplZjpkZTplYzo2YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJmMjo0ZTo5NjpmMzo4ZTo3MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJlMjo4Njo5MToyMzpjNTo3NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI1MjoxMjphMDo3NzpjYzo0NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjYToxNzo0YTpjNDpjYjpiZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJkZToxMzo0Yzo1ZDo3MDplOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIwYTo1ZjpkMjpkYjo3ZjplMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI5MDplMjpiYTowYjo2YjpiNCIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogImV0aDM1IiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjAwLjEiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvMSIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhMjowODo1NTpmZTpjNTpkYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI3YTpkZDpjNzo0NjoyYTo5MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI5MjphODoxZDo0ZTpjYzphOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIwMjoxYTpkNjo4NzpjNDpjYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJlYToxYjo4YjoyYTpkYTo5YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhYTpjMzpmZTplNTpmMjo5NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJlMjo2NjoxZjowMDpiMzo0NSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJkYTozYzpkODphMzpmNDplMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI5MDplMjpiYTowYjo2YjpiNSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm51bWFfc29ja2V0IjogMCwKKyAgICAgICAgICAgICJodWdlcGFnZXMiOiAyOCwKKyAgICAgICAgICAgICJtZW1vcnkiOiAzMgorICAgICAgICB9CisgICAgXQorfQorfQorCmRpZmYgLS1naXQgYS90ZXN0L2hvc3RzL2hvc3QtZXhhbXBsZTEuanNvbiBiL3Rlc3QvaG9zdHMvaG9zdC1leGFtcGxlMS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NmFhZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hvc3RzL2hvc3QtZXhhbXBsZTEuanNvbgpAQCAtMCwwICsxLDY5OCBAQAoreworImhvc3QiOnsKKyAgICAibmFtZSI6ICJmYWtlLWhvc3QtMSIsCisgICAgInVzZXIiOiAidXNlciIsCisgICAgInBhc3N3b3JkIjogInBhc3N3b3JkIiwKKyAgICAiaXBfbmFtZSI6ICJmYWtlaG9zdDEiCit9LAorImhvc3QtZGF0YSI6Cit7CisgICAgIm5hbWUiOiAiZmFrZS1ob3N0LTEiLAorICAgICJyYW5raW5nIjogMzAwLAorICAgICJkZXNjcmlwdGlvbiI6ICJmYWtlIGhvc3QgMSBmb3IgdGVzdCBtb2RlIiwKKyAgICAiaXBfbmFtZSI6ICJmYWtlaG9zdDEiLAorICAgICJmZWF0dXJlcyI6ICJscHMsZGlvYyxod3N2LGh0LDY0Yix0bGJwcyIsCisgICAgInVzZXIiOiAidXNlciIsCisgICAgInBhc3N3b3JkIjogInBhc3N3b3JkIiwKKyAgICAibnVtYXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb3JlcyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDEsCisgICAgICAgICAgICAgICAgICAgICJzdGF0dXMiOiAibm90ZWxpZ2libGUiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDI1LAorICAgICAgICAgICAgICAgICAgICAic3RhdHVzIjogIm5vdGVsaWdpYmxlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDI3CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDUKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAyLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAzLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDMsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzMQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDQsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA5CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDMzCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDExCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDM1CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDEzCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDM3CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDE1CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDM5CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDE3CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQxCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDE5CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQzCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyMQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDUKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDIzCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0NworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiaW50ZXJmYWNlcyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwMnAxIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQ0OjAwLjAiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvNCIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI0ZToyZTphNTphYjo3Zjo0YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQ0OjEwLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhNjo0MzpmNjo0ZjpiNjplYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQ0OjEwLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJiMjpmZToyOTo4MTo3MTowYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQ0OjEwLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhYTo5ZDoxMzo2Mjo4MDplNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQ0OjEwLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIzYTozMDo3ZjpjNjo2NzowNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQ0OjExLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjNjoyMDo0NTo4ZjozMDowOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQ0OjExLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI2NjozZDowOTpiYzpkNjozMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQ0OjExLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI0NjplNTowYzpmNjpjNDphZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQ0OjExLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhMDozNjo5ZjozNTplZDoxNCIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogInAycDIiLAorICAgICAgICAgICAgICAgICAgICAiTWJwcyI6IDEwMDAwLAorICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MDAuMSIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfcG9ydCI6ICJwb3J0MC81IiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9kcGlkIjogIjAwOjAxOjAyOjAzOjA0OjA1OjA2OjA3IiwKKyAgICAgICAgICAgICAgICAgICAgInNyaW92cyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImVhOmI2OjVkOjk4OmQ5Ojg2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjM2OjRjOjMxOjVhOjVmOjY2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjQyOmEwOjVkOmZhOjhkOjhjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImM2OjUwOjIzOmM1OjUzOmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjEyOjJlOjZjOjc5OmEzOmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImJlOmYwOjhlOjdiOjUwOjQ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjZlOjZlOjE1OjQ0OjFjOjFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjlhOmU4OjFlOmU2OmFmOjMxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAibWFjIjogImEwOjM2OjlmOjM1OmVkOjE2IgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAicDNwMiIsCisgICAgICAgICAgICAgICAgICAgICJNYnBzIjogMTAwMDAsCisgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzowMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9wb3J0IjogInBvcnQwLzciLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX2RwaWQiOiAiMDA6MDE6MDI6MDM6MDQ6MDU6MDY6MDciLAorICAgICAgICAgICAgICAgICAgICAic3Jpb3ZzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMmU6Yjc6ZGM6YWE6OWE6MzUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzoxMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAzCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNDI6NzE6Mzk6NTA6OTI6YTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzoxMC4zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMjI6YWM6YTA6NjQ6YTQ6MDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzoxMC41IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAxCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiN2U6ODE6ZTA6NTY6YzA6YWEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzoxMC43IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAyCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZGU6ODc6OGQ6ZWQ6ODE6MWEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzoxMS4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA0CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZmU6Mjk6ZTk6ZGE6NDU6ZGYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzoxMS4zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA1CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYjY6ZTc6Njc6NDY6MjI6ZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzoxMS41IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA2CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNWU6OWU6MTA6N2E6NjY6ZTkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzoxMS43IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA3CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTA6MzY6OWY6MzU6ZWQ6MGEiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwM3AxIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjAwLjAiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvNiIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI1ZToyZTowNTo2Nzo3YjowNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjEwLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJmYTphNDowMTpmMDo3ZTpkNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjEwLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIzMjphYTo3Yjo5YTplMzo2YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjEwLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJmYTo4ZDpiMzoyZjphNjo1OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjEwLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJmMjo5MjpmMzpmMDpiYTowNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjExLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjMjo4YToxYjo1NToxMzo1MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjExLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI1YTo1NTo4ZTpmNDphNTo0ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjExLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI4YToyMTphMTpiYjpkNDpiMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjExLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhMDozNjo5ZjozNTplZDowOCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm51bWFfc29ja2V0IjogMSwKKyAgICAgICAgICAgICJodWdlcGFnZXMiOiAyOCwKKyAgICAgICAgICAgICJtZW1vcnkiOiAzMgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29yZXMiOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAwLAorICAgICAgICAgICAgICAgICAgICAic3RhdHVzIjogIm5vdGVsaWdpYmxlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyNCwKKyAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6ICJub3RlbGlnaWJsZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyNgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDIsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDI4CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDYKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAzLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzAKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA0LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogOAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDQsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzMgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDUsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxMAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDUsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzNAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDYsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxMgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDYsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzNgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDcsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxNAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDcsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzOAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDgsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxNgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDgsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0MAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDksCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxOAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDksCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0MgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjAKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQ0CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyMgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDExLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImludGVyZmFjZXMiOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAicDVwMSIsCisgICAgICAgICAgICAgICAgICAgICJNYnBzIjogMTAwMDAsCisgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDowMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9wb3J0IjogInBvcnQwLzgiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX2RwaWQiOiAiMDA6MDE6MDI6MDM6MDQ6MDU6MDY6MDciLAorICAgICAgICAgICAgICAgICAgICAic3Jpb3ZzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNDY6Mjg6NDc6ODA6OWQ6ZmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA0CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNWE6NWQ6Y2I6NTI6OTM6NjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC4yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA1CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNDI6NDI6MmU6MmQ6NDQ6OWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC40IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA2CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNGE6ZWY6YzI6YTU6Yzg6YWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC42IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA3CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMGE6MGM6YjE6OGI6ZGE6YzYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAyCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNDY6ZTc6ODU6YWQ6MWY6M2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS4yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAzCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNWU6YTQ6OGY6OGY6YjA6NTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS40IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZDI6NzY6ZjI6MjE6ZmI6NDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS42IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAxCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTA6MzY6OWY6MzM6MDk6NmMiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwNXAyIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjAwLjEiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvOSIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJmMjpjODoxNTo1OTo5ZDo5ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjEwLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjYTozMDpiMjpjMjpkOTpkNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjEwLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIxYTowMzpkZTpmNzpmNTpkYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjEwLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjYTo2ZDplMDpjMzoxZTpmNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjEwLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhYTozNTphYjo3MDoyOTo1YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjExLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIwMjpiMzpjNDphNjoxMjpkZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjExLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI1Mjo0ZjoxMzo2NzpkNToxZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjExLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIzYTo3ZjpiMjo1ODo2MTo4MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjExLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhMDozNjo5ZjozMzowOTo2ZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogInA3cDEiLAorICAgICAgICAgICAgICAgICAgICAiTWJwcyI6IDEwMDAwLAorICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDY6MDAuMCIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfcG9ydCI6ICJwb3J0MC8xMCIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI2ZTo1MTplZTozYzo2NjpmYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIyNjowYzo3YTpkYjo5Yjo3ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI2NjpiMDo1OTpjZjo2YjpmYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJmNjo1MjphNTpmZjo5NzpiOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI0YTo1YzpiMjo2YToyNToxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI4NjowZjo4NTpjMjo0MjpiMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJiMjozZDoyNDoxZDozZTo0MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjYTozZjpmYzo3YjozMjozNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhMDozNjo5ZjozMzowYzpkNCIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogInA3cDIiLAorICAgICAgICAgICAgICAgICAgICAiTWJwcyI6IDEwMDAwLAorICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDY6MDAuMSIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfcG9ydCI6ICJwb3J0MC8xMSIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI3NjoyODphZTpiNTozMToyNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI1ZTpmYTpkMTpmNzplYjo0NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI1NjpkMzo2YTpiMDphZjoyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIzZTo3NTpmMzowMDphYTpiYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI1ZTpmZDpiMDplMjo1OTo0NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJlZTphNzoyZjphYjo3MzowZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJkNjplOTpmMTpjNjo0MDowMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIzNjpiMDphZjowZTo1Yjo2OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhMDozNjo5ZjozMzowYzpkNiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm51bWFfc29ja2V0IjogMCwKKyAgICAgICAgICAgICJodWdlcGFnZXMiOiAyOCwKKyAgICAgICAgICAgICJtZW1vcnkiOiAzMgorICAgICAgICB9CisgICAgXQorfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9ob3N0cy9ob3N0LWV4YW1wbGUyLmpzb24gYi90ZXN0L2hvc3RzL2hvc3QtZXhhbXBsZTIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRhOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ob3N0cy9ob3N0LWV4YW1wbGUyLmpzb24KQEAgLTAsMCArMSw2OTggQEAKK3sKKyAgICAiaG9zdCI6eworICAgICAgICAibmFtZSI6ICJmYWtlLWhvc3QtMiIsCisgICAgICAgICJ1c2VyIjogInVzZXIiLCAKKyAgICAgICAgInBhc3N3b3JkIjogInBhc3N3b3JkIiwgCisgICAgICAgICJpcF9uYW1lIjogImZha2Vob3N0MiIgCisgICAgfSwKKyJob3N0LWRhdGEiOgoreworICAgICJuYW1lIjogImZha2UtaG9zdC0yIiwKKyAgICAicmFua2luZyI6IDMwMCwKKyAgICAiZGVzY3JpcHRpb24iOiAiZmFrZSBob3N0IDIgZm9yIHRlc3QgbW9kZSIsCisgICAgImlwX25hbWUiOiAiZmFrZWhvc3QyIiwKKyAgICAiZmVhdHVyZXMiOiAibHBzLGRpb2MsaHdzdixodCw2NGIsdGxicHMiLAorICAgICJ1c2VyIjogInVzZXIiLAorICAgICJwYXNzd29yZCI6ICJwYXNzd29yZCIsCisgICAgIm51bWFzIjogWworICAgICAgICB7CisgICAgICAgICAgICAiY29yZXMiOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxLAorICAgICAgICAgICAgICAgICAgICAic3RhdHVzIjogIm5vdGVsaWdpYmxlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyNSwKKyAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6ICJub3RlbGlnaWJsZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyNworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDIsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA1CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDI5CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAzLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA0LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogOQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDQsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzMworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDUsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxMQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDUsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzNQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDYsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxMworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDYsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzNworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDcsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxNQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDcsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzOQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDgsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxNworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDgsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0MQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDksCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAxOQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDksCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0MworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQ1CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyMworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDExLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImludGVyZmFjZXMiOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAicDJwMSIsCisgICAgICAgICAgICAgICAgICAgICJNYnBzIjogMTAwMDAsCisgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDowMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9wb3J0IjogInBvcnQwLzEyIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9kcGlkIjogIjAwOjAxOjAyOjAzOjA0OjA1OjA2OjA3IiwKKyAgICAgICAgICAgICAgICAgICAgInNyaW92cyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImZlOjQ5OjUyOjU5OjJmOjBiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjE2OmRmOmVlOjY1OmQxOmE5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImU2OjEwOjNhOjA5OmNjOmViIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImY2OjhlOmVmOjkyOjcwOjlhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImZhOmE1OjBlOjIxOmJjOjg5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImZhOjcyOjVhOmIwOjA3OjQ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjNlOjhmOjVjOjFhOjVkOmUxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImYyOmUwOjM0OmUyOmUxOjJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAibWFjIjogImEwOjM2OjlmOjM1OmU5OmEwIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAicDJwMiIsCisgICAgICAgICAgICAgICAgICAgICJNYnBzIjogMTAwMDAsCisgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDowMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9wb3J0IjogInBvcnQwLzEzIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9kcGlkIjogIjAwOjAxOjAyOjAzOjA0OjA1OjA2OjA3IiwKKyAgICAgICAgICAgICAgICAgICAgInNyaW92cyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImJhOjc2OjI0OmUwOjc5Ojc1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImIyOjI2OjgxOjViOjE4OjdiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImRhOjQ2OmE5OmY0OmFiOjQyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjg2OmUwOmVjOjMzOmNjOjE4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImVlOmVlOjQ5OmRhOjIwOjc1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImJlOmZhOjE4OmRhOmYzOmJhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjk2OmZhOjhkOmVkOjUwOjAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjIyOjFiOmNiOjMzOmE3OjVhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAibWFjIjogImEwOjM2OjlmOjM1OmU5OmEyIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAicDNwMiIsCisgICAgICAgICAgICAgICAgICAgICJNYnBzIjogMTAwMDAsCisgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzowMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9wb3J0IjogInBvcnQwLzE1IiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9kcGlkIjogIjAwOjAxOjAyOjAzOjA0OjA1OjA2OjA3IiwKKyAgICAgICAgICAgICAgICAgICAgInNyaW92cyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImE2OjZlOjI4OjZjOjViOjA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImJlOjM1OjQyOjg2OjNkOmZkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjBhOjkyOjk5OjkyOjAyOmU0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImI2OmE2OjNhOmYxOjFlOjU3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImJlOjNmOjFhOmVmOjc2OmMwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjZhOmNjOmE2OmJmOjYxOmNkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImZlOmMxOjE1OmE5OmM1OjEyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjZhOmZmOjU5OmFhOjYzOjM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAibWFjIjogImEwOjM2OjlmOjM1OmVkOjQyIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAicDNwMSIsCisgICAgICAgICAgICAgICAgICAgICJNYnBzIjogMTAwMDAsCisgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0MzowMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9wb3J0IjogInBvcnQwLzE0IiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9kcGlkIjogIjAwOjAxOjAyOjAzOjA0OjA1OjA2OjA3IiwKKyAgICAgICAgICAgICAgICAgICAgInNyaW92cyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImM2OjE4OmNiOjZjOmM0OjA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImE2OjRlOjkwOjg5OjkwOmQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImZlOjlhOjgyOjkxOmE1OjNhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjIyOmEzOmVmOjI3OjUwOmZkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImM2OjU3Ojk4OjY5OjY3OmUyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjZhOmY5OjgxOmFlOjQwOjk0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjg2OjAwOjM3OjdmOjZlOjA1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImYyOmU2OmZjOjdkOjcxOjliIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAibWFjIjogImEwOjM2OjlmOjM1OmVkOjQwIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibnVtYV9zb2NrZXQiOiAxLAorICAgICAgICAgICAgImh1Z2VwYWdlcyI6IDYwLAorICAgICAgICAgICAgIm1lbW9yeSI6IDY0CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb3JlcyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJzdGF0dXMiOiAibm90ZWxpZ2libGUiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDI0LAorICAgICAgICAgICAgICAgICAgICAic3RhdHVzIjogIm5vdGVsaWdpYmxlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDI2CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAyLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjgKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAzLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDMsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzMAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDQsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA4CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDMyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDEwCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDM0CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDEyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDM2CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDE0CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDM4CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDE2CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQwCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDE4CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyMAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDIyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0NgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiaW50ZXJmYWNlcyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwNXAxIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjAwLjAiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvMTYiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX2RwaWQiOiAiMDA6MDE6MDI6MDM6MDQ6MDU6MDY6MDciLAorICAgICAgICAgICAgICAgICAgICAic3Jpb3ZzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMDI6ZWY6Yzk6Mzg6Yzc6MDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA0CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiOTI6MDQ6ZTk6ZmU6Yzc6ZjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC4yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA1CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTI6NDE6MzI6Nzg6MjU6NDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC40IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA2CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiOWU6NjU6YWI6ZTg6YTA6MmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC42IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA3CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMGE6Mzg6ODg6NGM6NzY6MWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAyCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNGU6OGY6OTY6ZTE6ZDI6OTkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS4yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAzCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNjI6YjM6MGE6MTU6MWI6Y2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS40IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZmE6Mjk6NmE6MDQ6YzM6ZmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS42IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAxCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTA6MzY6OWY6MzM6MTY6ZjQiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwNXAyIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjAwLjEiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvMTciLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX2RwaWQiOiAiMDA6MDE6MDI6MDM6MDQ6MDU6MDY6MDciLAorICAgICAgICAgICAgICAgICAgICAic3Jpb3ZzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMWE6MDc6N2Q6ZjU6YWI6YmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA0CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMTI6NjM6OWI6NzU6NWM6MDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC4zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA1CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYmU6Zjg6NTQ6ZGU6OGU6MzkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC41IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA2CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiODI6YmI6MTI6ODM6ODI6YjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMC43IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA3CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMDY6NWM6ZTM6NDA6YzM6ZTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAyCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMzI6NTQ6MTA6Nzc6MzY6ZDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS4zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAzCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMGU6MGY6M2Y6MjM6ZDY6MTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS41IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNDY6MTQ6ODQ6NTE6M2Q6ZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNDoxMS43IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAxCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTA6MzY6OWY6MzM6MTY6ZjYiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwN3AxIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjAwLjAiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvMTgiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX2RwaWQiOiAiMDA6MDE6MDI6MDM6MDQ6MDU6MDY6MDciLAorICAgICAgICAgICAgICAgICAgICAic3Jpb3ZzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZDY6OGE6YTc6Mjc6YmM6N2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA0CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiOWU6ZjQ6Njc6MjE6Mjg6MTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC4yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAzCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYjY6Zjg6Yjc6Yzg6YWU6MDciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC40IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA2CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMGU6ZTg6MzQ6N2E6M2I6YzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC42IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA1CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiODI6NWQ6MGY6N2E6MjA6OTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA3CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZjI6NmI6NmE6NGE6ZTM6OTMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS4yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAyCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYjI6ZDY6YWY6YjA6MTI6ZjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS40IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAxCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMjI6MGI6MDE6MTk6ZGQ6M2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS42IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTA6MzY6OWY6MzM6MGY6MWMiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwN3AyIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjAwLjEiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDAvMTkiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX2RwaWQiOiAiMDA6MDE6MDI6MDM6MDQ6MDU6MDY6MDciLAorICAgICAgICAgICAgICAgICAgICAic3Jpb3ZzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMGE6MmY6Nzc6OGY6NTM6ZGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA0CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTI6ZjU6NjM6MWQ6MWM6NGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC4zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAzCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiODY6ODA6NmM6ZDg6ZGE6ZTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC41IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA2CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNWE6OWQ6MWM6MTk6M2Y6MDciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC43IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA1CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZWE6YTk6ZmI6OTU6Mjk6MzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA3CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMGU6M2E6ZTk6NjU6NWI6ZDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS4zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAyCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiY2U6Y2Q6NTM6YzY6N2I6Y2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS41IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAxCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNTI6YjE6NGU6OTE6MzQ6OGMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS43IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTA6MzY6OWY6MzM6MGY6MWUiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJudW1hX3NvY2tldCI6IDAsCisgICAgICAgICAgICAiaHVnZXBhZ2VzIjogNjAsCisgICAgICAgICAgICAibWVtb3J5IjogNjQKKyAgICAgICAgfQorICAgIF0KK30KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaG9zdHMvaG9zdC1leGFtcGxlMy5qc29uIGIvdGVzdC9ob3N0cy9ob3N0LWV4YW1wbGUzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExNWU0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaG9zdHMvaG9zdC1leGFtcGxlMy5qc29uCkBAIC0wLDAgKzEsNjk4IEBACit7CisgICAgImhvc3QiOnsKKyAgICAgICAgIm5hbWUiOiAiZmFrZS1ob3N0LTMiLAorICAgICAgICAidXNlciI6ICJ1c2VyIiwgCisgICAgICAgICJwYXNzd29yZCI6ICJwYXNzd29yZCIsIAorICAgICAgICAiaXBfbmFtZSI6ICJmYWtlaG9zdDMiIAorICAgIH0sCisiaG9zdC1kYXRhIjoKK3sKKyAgICAibmFtZSI6ICJmYWtlLWhvc3QtMyIsCisgICAgInJhbmtpbmciOiAzMDAsCisgICAgImRlc2NyaXB0aW9uIjogImZha2UgaG9zdCAzIGZvciB0ZXN0IG1vZGUiLAorICAgICJpcF9uYW1lIjogImZha2Vob3N0MyIsCisgICAgImZlYXR1cmVzIjogImxwcyxkaW9jLGh3c3YsaHQsNjRiLHRsYnBzIiwKKyAgICAidXNlciI6ICJ1c2VyIiwKKyAgICAicGFzc3dvcmQiOiAicGFzc3dvcmQiLAorICAgICJudW1hcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImNvcmVzIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMSwKKyAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6ICJub3RlbGlnaWJsZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjUsCisgICAgICAgICAgICAgICAgICAgICJzdGF0dXMiOiAibm90ZWxpZ2libGUiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDMKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAyLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDIsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyOQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDMsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA3CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDMxCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA0LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzMKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA1LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA1LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzUKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA2LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTMKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA2LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA3LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTUKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA3LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMzkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA4LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTcKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA4LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA5LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMTkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiA5LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDMKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDIxCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0NQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDExLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjMKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQ3CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogInAycDEiLAorICAgICAgICAgICAgICAgICAgICAiTWJwcyI6IDEwMDAwLAorICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MDAuMCIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfcG9ydCI6ICJwb3J0MS8wIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9kcGlkIjogIjAwOjAxOjAyOjAzOjA0OjA1OjA2OjA3IiwKKyAgICAgICAgICAgICAgICAgICAgInNyaW92cyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImNlOjI0OjA2OjdkOjdhOjViIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImE2OjJkOjEwOjc1OmRjOjA2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjRhOjM5OmYxOmQxOmFhOjQ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImVlOmRmOjM0OmIzOmNmOjUwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTAuNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjQ2OjAyOjQ3OmQ4OmY1OjY2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImE2OjExOjc4Ojk3OmI0OmFiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjM2OmMwOjEzOmE0OjRjOjc3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImI2OjNiOmI1OjQzOjNhOjQ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDQ6MTEuNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAibWFjIjogImEwOjM2OjlmOjI1Ojk3OmY0IgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAicDJwMiIsCisgICAgICAgICAgICAgICAgICAgICJNYnBzIjogMTAwMDAsCisgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDowMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9wb3J0IjogInBvcnQxLzEiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX2RwaWQiOiAiMDA6MDE6MDI6MDM6MDQ6MDU6MDY6MDciLAorICAgICAgICAgICAgICAgICAgICAic3Jpb3ZzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZjY6Mzg6ZTk6NWU6Zjk6NDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDoxMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAyCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZjY6MWU6Yjk6ZDM6MTU6NjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDoxMC4zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAzCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMmU6MjI6N2Y6NDQ6ODY6ZTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDoxMC41IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNWE6M2Y6ZGI6NjY6ZDY6OTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDoxMC43IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA0CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYjI6MDU6Yjg6ZjM6YWU6MjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDoxMS4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAxCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZmE6ZmU6MjQ6ODI6MTI6YjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDoxMS4zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA1CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMzY6MmE6MGU6Y2I6Mjk6MDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDoxMS41IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA2CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNDY6NzE6YzA6OGE6OWM6NDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDo0NDoxMS43IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA3CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTA6MzY6OWY6MjU6OTc6ZjYiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwM3AyIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjAwLjEiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDEvMyIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI3MjpmZDo3YTphZjo5MTo1NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjEwLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJmYTpjNDpkNzplMTozYjowNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjEwLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjMjowMzoyODo0YTowYTo4ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjEwLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI2NjoxYjo3ODo2NTo2NzplMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjEwLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJiZTo0YjplOTo3NzpmZjphMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjExLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIwMjo5YTo5NDplMjo3OTpjMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjExLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJiMjo4MDo2MjpkZDowOTplYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjExLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJlYTo0MTozMDo4ZTphZjpiOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjQzOjExLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhMDozNjo5ZjoyNTo5NzpkZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogInAzcDEiLAorICAgICAgICAgICAgICAgICAgICAiTWJwcyI6IDEwMDAwLAorICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MDAuMCIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfcG9ydCI6ICJwb3J0MS8yIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9kcGlkIjogIjAwOjAxOjAyOjAzOjA0OjA1OjA2OjA3IiwKKyAgICAgICAgICAgICAgICAgICAgInNyaW92cyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjY2OjgwOmEwOjU1OjgzOjkzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImZlOmZkOjcyOmI4OmZlOmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjZhOjcwOjkyOjdmOjZiOjdiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjNhOjE0Ojc1OjVlOjYzOjE1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTAuNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjJlOmM5OjVkOjZlOjI3OjQ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjAyOmY3OmJiOjgyOjc4OjFmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjBlOjVlOmI2OmE4OjZjOjgwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjhlOmJmOjgxOmJjOmNiOjQ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6NDM6MTEuNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAibWFjIjogImEwOjM2OjlmOjI1Ojk3OmRjIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibnVtYV9zb2NrZXQiOiAxLAorICAgICAgICAgICAgImh1Z2VwYWdlcyI6IDI4LAorICAgICAgICAgICAgIm1lbW9yeSI6IDMyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb3JlcyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJzdGF0dXMiOiAibm90ZWxpZ2libGUiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDI0LAorICAgICAgICAgICAgICAgICAgICAic3RhdHVzIjogIm5vdGVsaWdpYmxlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDI2CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAyLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogMjgKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAzLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDMsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAzMAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDQsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA4CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDMyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDEwCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDM0CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDEyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNiwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDM2CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDE0CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogNywKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDM4CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDE2CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOCwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQwCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDE4CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogOSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDQyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTAsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiAyMAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6IDEwLAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjogNDQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvcmVfaWQiOiAxMSwKKyAgICAgICAgICAgICAgICAgICAgInRocmVhZF9pZCI6IDIyCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb3JlX2lkIjogMTEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfaWQiOiA0NgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiaW50ZXJmYWNlcyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwNXAxIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjAwLjAiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDEvNCIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhYTplZjoyYzoyMzphZTowNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjEwLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIyZTpkNTpiOTozZTpjNDo4YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjEwLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI0ZTpkNjo1NTowOToxNzoxZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjEwLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjZTo0MjpjYzo5Yzo1YTozMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjEwLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIxZTo3MTozNDo3Zjo1ZDo0NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjExLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIyNjo1YzplNDpkYjo4Yzo0OCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjExLjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI1ZTo0ODoyMzo1Njo2MzpjMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjExLjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI5YTphMjpmYTo5NzoxOTo4NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA0OjExLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhMDozNjo5ZjoyNzo0NjphMCIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogInA1cDIiLAorICAgICAgICAgICAgICAgICAgICAiTWJwcyI6IDEwMDAwLAorICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDQ6MDAuMSIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfcG9ydCI6ICJwb3J0MS81IiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9kcGlkIjogIjAwOjAxOjAyOjAzOjA0OjA1OjA2OjA3IiwKKyAgICAgICAgICAgICAgICAgICAgInNyaW92cyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjBhOjliOmI1OmQxOmU2OjM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDQ6MTAuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjVlOjg3OjRhOjIyOmU5OjU3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDQ6MTAuMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImVhOjk0OmQ1OmY2OmVlOmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDQ6MTAuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjVhOjNmOjE3OjZiOmJiOjhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDQ6MTAuNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwNworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjhlOmFmOjVjOmNjOmM4OjgyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDQ6MTEuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogIjNlOmEwOmRmOmYwOjJiOjA3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDQ6MTEuMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImFlOjdkOjAwOjliOjU0OjRkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDQ6MTEuNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjogImZhOmI1OjBkOmM2Ojc4Ojg3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjogIjAwMDA6MDQ6MTEuNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6IDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAibWFjIjogImEwOjM2OjlmOjI3OjQ2OmEyIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAicDdwMSIsCisgICAgICAgICAgICAgICAgICAgICJNYnBzIjogMTAwMDAsCisgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjowMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9wb3J0IjogInBvcnQxLzYiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX2RwaWQiOiAiMDA6MDE6MDI6MDM6MDQ6MDU6MDY6MDciLAorICAgICAgICAgICAgICAgICAgICAic3Jpb3ZzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMjI6NGE6MjE6Mzc6ODQ6ODAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA0CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYjI6OGY6MmM6MDQ6MDg6MDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC4yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAzCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiZmU6MmU6NzE6MWY6OTk6ZGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC40IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA2CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiMWE6MmM6N2M6OTg6Mzk6YjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMC42IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA1CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNmU6Mzk6MDg6YTk6N2U6YjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTA3CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNGE6MDA6ZjM6NWI6MTU6MjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS4yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAyCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYjI6YzM6NDg6ZGE6MjQ6NTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS40IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAxCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiNzI6ODU6Y2Q6MTg6ZWU6NWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY2kiOiAiMDAwMDowNjoxMS42IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX25hbWUiOiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGFuIjogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJtYWMiOiAiYTA6MzY6OWY6Mjc6NDU6ODAiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6ICJwN3AyIiwKKyAgICAgICAgICAgICAgICAgICAgIk1icHMiOiAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjAwLjEiLAorICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiAicG9ydDEvNyIsCisgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfZHBpZCI6ICIwMDowMTowMjowMzowNDowNTowNjowNyIsCisgICAgICAgICAgICAgICAgICAgICJzcmlvdnMiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIwYTo2MDoxYTo5ZDpiYTplMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI3MjpjYjowYTo5OToyZjo3ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJmMjoyYjo2YjpkODo5NTphYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJiMjozYTo0YTphODpjOTplOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjEwLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIwNjo4NTo3NTpiMTplODoxMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICIxMjo0MTo2OTo2MTo4OTozYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICI4NjowMzphODo1YTphZDo3MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJjYTo5Yzo1YzphZDplMjplMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6ICIwMDAwOjA2OjExLjciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZsYW4iOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIm1hYyI6ICJhMDozNjo5ZjoyNzo0NTo4MiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgIm51bWFfc29ja2V0IjogMCwKKyAgICAgICAgICAgICJodWdlcGFnZXMiOiAyOCwKKyAgICAgICAgICAgICJtZW1vcnkiOiAzMgorICAgICAgICB9CisgICAgXQorfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9ob3N0cy9uZXdfaG9zdC55YW1sIGIvdGVzdC9ob3N0cy9uZXdfaG9zdC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZmU2NjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hvc3RzL25ld19ob3N0LnlhbWwKQEAgLTAsMCArMSwzNiBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworeworICAgICIke30iOlsKKyAgICAgICAgIiR7bmFtZX0gaG9zdCBuYW1lIiwKKyAgICAgICAgIiR7dXNlcn0gaG9zdCB1c2VyIChuMikiLAorICAgICAgICAiJHtpcF9uYW1lfSBob3N0IGFjY2VzcyBpcCBvciBuYW1lICgke25hbWV9LmhpLmluZXQpIiwKKyAgICAgICAgIiR7ZGVzY3JpcHRpb259IGhvc3QgZGVzY3JpcHRpb24gKCR7bmFtZX0pIgorICAgIF0sCisKKyAgICAiaG9zdCI6eworICAgICAgICAibmFtZSI6ICIke25hbWV9IiwKKyAgICAgICAgInVzZXIiOiAiJHt1c2VyfSIsIAorICAgICAgICAiaXBfbmFtZSI6ICIke2lwX25hbWV9IiwgCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICIke2Rlc2NyaXB0aW9ufSIgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9pbWFnZXMvbmV3X2ltYWdlLnlhbWwgYi90ZXN0L2ltYWdlcy9uZXdfaW1hZ2UueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTk5ODg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbWFnZXMvbmV3X2ltYWdlLnlhbWwKQEAgLTAsMCArMSwzNCBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworCit7CisgICAgIiR7fSI6WworICAgICAgICAiJHtuYW1lfSBpbWFnZSBuYW1lIiwKKyAgICAgICAgIiR7cGF0aH0gaW1hZ2UgcGF0aCAoL21udC9wb3dlcnZhdWx0L3ZpcnR1YWxpemF0aW9uL3ZuZnMvb3MvVVMxNDA0dXNlci5xY293MikiLAorICAgICAgICAiJHtkZXNjcmlwdGlvbn0gaW1hZ2UgZGVzY3JpcHRpb24gKCR7bmFtZX0pIgorICAgIF0sCisiaW1hZ2UiOnsKKyAgICAibmFtZSI6IiR7bmFtZX0iLAorICAgICJkZXNjcmlwdGlvbiI6IiR7ZGVzY3JpcHRpb259IiwKKyAgICAicGF0aCI6IiR7cGF0aH0iIAorfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXR3b3Jrcy9uZXQtZXhhbXBsZTAueWFtbCBiL3Rlc3QvbmV0d29ya3MvbmV0LWV4YW1wbGUwLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhZTBjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0d29ya3MvbmV0LWV4YW1wbGUwLnlhbWwKQEAgLTAsMCArMSw2IEBACituZXR3b3JrOgorICAgIG5hbWU6ICAgICAgICAgICAgICAgZGVmYXVsdAorICAgIHR5cGU6ICAgICAgICAgICAgICAgYnJpZGdlX21hbgorICAgIHByb3ZpZGVyOnBoeXNpY2FsOiAgZGVmYXVsdAorICAgIHNoYXJlZDogICAgICAgICAgICAgdHJ1ZQorCmRpZmYgLS1naXQgYS90ZXN0L25ldHdvcmtzL25ldC1leGFtcGxlMS55YW1sIGIvdGVzdC9uZXR3b3Jrcy9uZXQtZXhhbXBsZTEueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM3OTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXR3b3Jrcy9uZXQtZXhhbXBsZTEueWFtbApAQCAtMCwwICsxLDYgQEAKK25ldHdvcms6CisgICAgbmFtZTogICAgICAgICAgICAgICBtYWN2dGFwOmVtMQorICAgIHR5cGU6ICAgICAgICAgICAgICAgYnJpZGdlX21hbgorICAgIHByb3ZpZGVyOnBoeXNpY2FsOiAgbWFjdnRhcDplbTEKKyAgICBzaGFyZWQ6ICAgICAgICAgICAgIHRydWUKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXR3b3Jrcy9uZXQtZXhhbXBsZTIueWFtbCBiL3Rlc3QvbmV0d29ya3MvbmV0LWV4YW1wbGUyLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxMzY3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0d29ya3MvbmV0LWV4YW1wbGUyLnlhbWwKQEAgLTAsMCArMSw2IEBACituZXR3b3JrOgorICAgIG5hbWU6ICAgICAgICAgICAgICAgc2hhcmVkX2JyaWRnZV9uZXQKKyAgICB0eXBlOiAgICAgICAgICAgICAgIGJyaWRnZV9kYXRhCisgICAgcHJvdmlkZXI6cGh5c2ljYWw6ICBicmlkZ2U6dmlyYnJNYW4xCisgICAgc2hhcmVkOiAgICAgICAgICAgICB0cnVlCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0d29ya3MvbmV0LWV4YW1wbGUzLnlhbWwgYi90ZXN0L25ldHdvcmtzL25ldC1leGFtcGxlMy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkM2I5NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldHdvcmtzL25ldC1leGFtcGxlMy55YW1sCkBAIC0wLDAgKzEsMTYgQEAKK25ldHdvcms6CisgICAgbmFtZTogICAgICAgICAgICAgICBkYXRhX25ldAorICAgIHR5cGU6ICAgICAgICAgICAgICAgZGF0YQorCisgICAgI2lmIHlvdSB3YW50IHRvIGNvbm5lY3QgdGhpcyBuZXR3b3JrIHRvIGEgY29uY3JldGUgc3dpdGNoIHBvcnQgZm9yIG91dHNpZGUgY29ubmVjdGl2aXR5CisgICAgI2luZGljYXRlIGl0IGF0IHByb3ZpZGVyX3BoeXNpY2FsIHdpdGggb3BlbmZsb3c6PHN3aXRjaF9wb3J0Pls6dmxhbl0KKyAgICAjPHN3aXRjaF9wb3J0PiBtdXN0IGJlIGEgdmFsaWQgb3BlbmZsb3cgcG9ydCAob25lIG9mIHRoZSBsaXN0ZWQgd2l0aCBvcGVudmltIG9wZW5mbG93LXBvcnQtbGlzdCkKKyAgICAjYWRkIFs6dmxhbl0gd2l0aG91dCBzcGFjZXMgaWYgdGhpcyBwb3J0IG11c3QgYmUgdmxhbiB0YWdnZWQuIElmIG1pc3NpbmcgaXQgaXMgbm90IHRhZ2dlZAorCisgICAgI3Byb3ZpZGVyOnZsYW4gIGNvbnRhaW5zIHRoZSB2bGFuIHVzZWQgYnkgdGhlIFNSSU9WIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIHRoaXMgbmV0d29yaworICAgICNpdCBhbHdheXMgY29udGFpbiBhIHZhbHVlIHJlZ2FyZGxlc3MgdXNlZCBvciBub3QuIElmIG1pc3Npbmcgb3BlbnZpbSB3aWxsIGFzc2lnbiBhIHZhbHVlCisgICAgCisgICAgcHJvdmlkZXI6cGh5c2ljYWw6ICBvcGVuZmxvdzpwb3J0MS84OnZsYW4KKyAgICBwcm92aWRlcjp2bGFuOiAgICAgIDMwMDEKKyAgICBzaGFyZWQ6ICAgICAgICAgICAgIHRydWUKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXR3b3Jrcy9uZXdfbmV0d29yay55YW1sIGIvdGVzdC9uZXR3b3Jrcy9uZXdfbmV0d29yay55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMWU2NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldHdvcmtzL25ld19uZXR3b3JrLnlhbWwKQEAgLTAsMCArMSwzMyBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworCit7CisgICAgIiR7fSI6WworICAgICAgICAiJHtuYW1lfSBwcm92aWRlIGEgbmV0d29yayBuYW1lIiwKKyAgICAgICAgIiR7dHlwZX0gcHJvdmlkZSBhIHR5cGU6IGJyaWRnZV9kYXRhLGJyaWRnZV9tYW4sZGF0YSxwdHAgKHB0cCkiCisgICAgXSwKKworICAgICJuZXR3b3JrIjp7CisgICAgICAgICAgICAibmFtZSI6ICIke25hbWV9IiwKKyAgICAgICAgICAgICJ0eXBlIjogIiR7dHlwZX0iCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9wb3J0cy9uZXdfcG9ydC55YW1sIGIvdGVzdC9wb3J0cy9uZXdfcG9ydC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDdhM2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BvcnRzL25ld19wb3J0LnlhbWwKQEAgLTAsMCArMSw0MSBAQAorIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworCit7CisgICAgIiR7fSI6WworICAgICAgICAiJHtuYW1lfSBwcm92aWRlIGEgcG9ydCBuYW1lIiwKKyAgICAgICAgIiR7bmV0X2lkfSBwcm92aWRlIHRoZSBuZXR3b3JrIHV1aWQgKG51bGwpOiIsCisgICAgICAgICIke3ZsYW59IHByb3ZpZGUgdGhlIHZsYW4gaWYgYW55IChudWxsKToiLAorICAgICAgICAiJHtwb3J0fSBwcm92aWRlIHRoZSBhdHRhY2hlZCBzd2l0Y2ggcG9ydCAoVGUwLzQ3KSIsCisgICAgICAgICIke21hY30gcHJvdmlkZSB0aGUgbWFjIG9mIGV4dGVybmFsIGRldmljZSBpZiBrbm93biAobnVsbCk6IgorICAgIF0sCisKKyAgICAicG9ydCI6eworICAgICAgICAibmFtZSI6ICIke25hbWV9IiwKKyAgICAgICAgIm5ldHdvcmtfaWQiOiAiJHtuZXRfaWQgbnVsbH0iLAorICAgICAgICAidHlwZSI6ICJleHRlcm5hbCIsCisgICAgICAgICJiaW5kaW5nOnZsYW4iOiAiJHt2bGFuIG51bGwtaW50fSIsCisgICAgICAgICJiaW5kaW5nOnN3aXRjaF9wb3J0IjogIiR7cG9ydH0iLAorICAgICAgICAibWFjX2FkZHJlc3MiOiAiJHttYWMgbnVsbH0iCisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0L3NlcnZlcnMvbmV3X3NlcnZlci55YW1sIGIvdGVzdC9zZXJ2ZXJzL25ld19zZXJ2ZXIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjMwZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zZXJ2ZXJzL25ld19zZXJ2ZXIueWFtbApAQCAtMCwwICsxLDQ5IEBACisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCit7CisgICAgIiR7fSI6WworICAgICAgICAiJHtuYW1lfSBwcm92aWRlIGEgbmFtZSAoVk0pIiwKKyAgICAgICAgIiR7ZGVzY3JpcHRpb259IHByb3ZpZGUgYSBkZXNjcmlwdGlvbiAoJHtuYW1lfSkiLAorICAgICAgICAiJHtpbWFnZV9pZH0gcHJvdmlkZSBpbWFnZV9pZCB1dWlkIiwKKyAgICAgICAgIiR7Zmxhdm9yX2lkfSBwcm92aWRlIGZsYXZvcl9pZCB1dWlkIiwKKyAgICAgICAgIiR7bmV0d29yazB9IHByb3ZpZGUgYSBicmlkZ2UgbmV0d29yayBpZDsgZW50ZXI9J2RlZmF1bHQnICgwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApIiwKKyAgICAgICAgIiR7bmV0d29yazF9IHByb3ZpZGUgYSBicmlkZ2UgbmV0d29yayBpZDsgZW50ZXI9J3ZpcmJyTWFuJyAoNjBmNTIyN2UtMTk1Zi0xMWU0LTgzNmQtNTI1NDAwMzA1OTRlKSIKKyAgICBdLAorInNlcnZlciI6eworICAgICJuZXR3b3JrcyI6WworICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6Im1nbXQwIiwKKyAgICAgICAgICAgICJ2cGNpIjogIjAwMDA6MDA6MGEuMCIsCisgICAgICAgICAgICAidXVpZCI6IiR7bmV0d29yazB9IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ImdlMCIsCisgICAgICAgICAgICAidnBjaSI6ICIwMDAwOjAwOjBiLjAiLAorICAgICAgICAgICAgInV1aWQiOiIke25ldHdvcmsxfSIKKyAgICAgICAgfQorICAgIF0sCisgICAgIm5hbWUiOiIke25hbWV9IiwgCisgICAgImRlc2NyaXB0aW9uIjoiJHtkZXNjcmlwdGlvbn0iLAorICAgICJpbWFnZVJlZiI6ICAiJHtpbWFnZV9pZH0iLCAKKyAgICAiZmxhdm9yUmVmIjogIiR7Zmxhdm9yX2lkfSIgCit9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3RlbmFudHMvbmV3X3RlbmFudC55YW1sIGIvdGVzdC90ZW5hbnRzL25ld190ZW5hbnQueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmFjMzZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZW5hbnRzL25ld190ZW5hbnQueWFtbApAQCAtMCwwICsxLDMyIEBACisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCit7CisgICAgIiR7fSI6WworICAgICAgICAiJHtuYW1lfSB0ZW5hbnQgbmFtZSIsCisgICAgICAgICIke2Rlc2NyaXB0aW9ufSB0ZW5hbnQgZGVzY3JpcHRpb24gKCR7bmFtZX0pIgorICAgIF0sCisKKyAgICAidGVuYW50Ijp7CisgICAgICAgICJuYW1lIjogIiR7bmFtZX0iLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiJHtkZXNjcmlwdGlvbn0iIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdF9vcGVuZmxvdy5zaCBiL3Rlc3QvdGVzdF9vcGVuZmxvdy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OGZkYzcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0X29wZW5mbG93LnNoCkBAIC0wLDAgKzEsMjE3IEBACisjIS9iaW4vYmFzaAorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisjCisjYXV0aG9yIEFsZm9uc28gVGllcm5vCisjCisjc2NyaXB0IHRvIHRlc3Qgb3BlbmZsb3cgY29ubmVjdG9yIHdpdGggdGhlIGNyZWF0aW9uIG9mIHJ1bGVzCisjCisKK2Z1bmN0aW9uIHVzYWdlKCl7CisgICAgZWNobyAtZSAidXNhZ2U6ICR7QkFTSF9TT1VSQ0VbMF19IFtPUFRJT05TXSBcbiAgdGVzdCBvcGVuZmxvdyBjb25uZWN0b3IgIgorICAgIGVjaG8gLWUgIiAgT1BUSU9OUzoiCisgICAgZWNobyAtZSAiICAgIC1mIC0tZm9yY2UgICAgICAgZG9lcyBub3QgcHJvbXB0IGZvciBjb25maXJtYXRpb24iCisgICAgZWNobyAtZSAiICAgIC12IC0tc2FtZS12bGFuICAgdXNlIHRoaXMgaWYgdGhlIHBhcmFtZXRlciAnb2ZfY29udHJvbGxlcl9uZXRzX3dpdGhfc2FtZV92bGFuJyIKKyAgICBlY2hvIC1lICIgICAgICAgICAgICAgICAgICAgICBpcyBub3QgZmFsc2UgYXQgb3BlbnZpbWQuY2ZnIHRvIGF2b2lkIHRlc3QgdW5yZWFsaXphYmxlIG9wZW5mbG93IG5ldHMiCisgICAgZWNobyAtZSAiICAgIC1kIC0tZGVidWcgICAgICAgc2hvdyBkZWJ1ZyBpbmZvcm1hdGlvbiBhdCBlYWNoIGNvbW1hbmQuIEl0IGlzIHF1aXRlIHZlcmJvc2UiCisgICAgZWNobyAtZSAiICAgIC1oIC0taGVscCAgICAgICAgc2hvd3MgdGhpcyBoZWxwIgorfQorCisKK2Z1bmN0aW9uIGRlbGV0ZV9hbmRfZXhpdCgpeworICBlY2hvCisgIFtbICRmb3JjZSAhPSB5IF1dICYmIHJlYWQgLWUgLXAgIiAgUHJlc3MgZW50ZXIgdG8gZGVsZXRlIHRoZSBkZXBsb3llZCB0aGluZ3MgIiBraworICBlY2hvCisgIGZvciBmIGluICRUT0RFTEVURQorICBkbworICAgIGlmIFtbICRmID09IHJlc3RvcmUgXV0KKyAgICB0aGVuCisgICAgICBwcmludGYgIiUtNTBzIiAicmVzdG9yaW5nIGJhY2sgb2xkIHJ1bGVzOiAiCisgICAgICByZXN1bHQ9YG9wZW5mbG93IGluc3RhbGwgLi90ZXN0X29wZW5mbG93X29sZF9ydWxlcy5iayAkZGVidWcgYAorICAgICAgaWYgW1sgJD8gIT0gMCBdXQorICAgICAgdGhlbiAKKyAgICAgICAgZWNobyAgIkZBSUwgY2Fubm90IGluc3RhbGwgb2xkIHJ1bGVzOiIKKyAgICAgICAgZWNobyAgIiRyZXN1bHQiCisgICAgICBlbHNlCisgICAgICAgIHJtIC4vdGVzdF9vcGVuZmxvd19vbGRfcnVsZXMuYmsKKyAgICAgICAgZWNobyBPSyAiLi90ZXN0X29wZW5mbG93X29sZF9ydWxlcy5iayBkZWxldGVkIgorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBwcmludGYgIiUtNTBzIiAicmVtb3ZpbmcgJGYgcnVsZTogIgorICAgICAgcmVzdWx0PWBvcGVuZmxvdyBkZWxldGUgICRmIC1mICRkZWJ1Z2AKKyAgICAgIFtbICQ/ICE9IDAgXV0gJiYgZWNobyAgIkZBSUwgY2Fubm90IGRlbGV0ZSIgJiYgIGVjaG8gICIkcmVzdWx0IiB8fCBlY2hvIE9LCisgICAgZmkKKyAgZG9uZQorICBleGl0ICQxCit9CisKK2ZvcmNlPW4KK3NhbWVfdmxhbj1uCitkZWJ1Zz0iIgorVE9ERUxFVEU9IiIKKyNkZXRlY3QgaWYgaXMgY2FsbGVkIHdpdGggYSBzb3VyY2UgdG8gdXNlIHRoZSAnZXhpdCcvJ3JldHVybicgY29tbWFuZCBmb3IgZXhpdGluZworW1sgJHtCQVNIX1NPVVJDRVswXX0gIT0gJDAgXV0gJiYgZWNobyAiRG8gbm90IGV4ZWN1dGUgdGhpcyBzY3JpcHQgYXMgU09VUkNFIiA+JjIgJiYgcmV0dXJuIDEKKworI2NoZWNrIGNvcnJlY3QgYXJndW1lbnRzCitmb3IgcGFyYW0gaW4gJCoKK2RvCisgICBpZiBbWyAkcGFyYW0gPT0gLWggXV0gfHwgW1sgJHBhcmFtID09IC0taGVscCBdXQorICAgdGhlbgorICAgICAgIHVzYWdlCisgICAgICAgZXhpdCAwCisgICBlbGlmIFtbICRwYXJhbSA9PSAtZCBdXSB8fCBbWyAkcGFyYW0gPT0gLS1kZWJ1ZyBdXQorICAgdGhlbgorICAgICAgIGRlYnVnPSItLWRlYnVnIgorICAgZWxpZiBbWyAkcGFyYW0gPT0gLXYgXV0gfHwgW1sgJHBhcmFtID09IC0tc2FtZS12bGFuIF1dCisgICB0aGVuCisgICAgICAgc2FtZV92bGFuPXkKKyAgIGVsaWYgW1sgJHBhcmFtID09IC1mIF1dIHx8IFtbICRwYXJhbSA9PSAtLWZvcmNlIF1dCisgICB0aGVuCisgICAgICAgZm9yY2U9eQorICAgZWxzZQorICAgICAgIGVjaG8gImludmFsaWQgYXJndW1lbnQgJyRwYXJhbSc/LiBTZWUgJDAgLS1oZWxwIiAmJiBleGl0IDEKKyAgIGZpCitkb25lCisKKyNkZXRlY3QgaWYgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQKK2ZhaWw9IiIKK1tbIC16ICRPRl9DT05UUk9MTEVSX1RZUEUgXV0gJiYgZWNobyAiT0ZfQ09OVFJPTExFUl9UWVBFIG5vdCBkZWZpbmVkIiA+JjIgJiYgZmFpbD0xCitbWyAteiAkT0ZfQ09OVFJPTExFUl9JUCBdXSAmJiAgIGVjaG8gIk9GX0NPTlRST0xMRVJfSVAgbm90IGRlZmluZWQiID4mMiAmJiBmYWlsPTEKK1tbIC16ICRPRl9DT05UUk9MTEVSX1BPUlQgXV0gJiYgZWNobyAiT0ZfQ09OVFJPTExFUl9QT1JUIG5vdCBkZWZpbmVkIiA+JjIgJiYgZmFpbD0xCitbWyAteiAkT0ZfQ09OVFJPTExFUl9EUElEIF1dICYmIGVjaG8gIk9GX0NPTlRST0xMRVJfRFBJRCBub3QgZGVmaW5lZCIgPiYyICYmIGZhaWw9MQorW1sgLW4gJGZhaWwgXV0gJiYgZXhpdCAxCisKKworZXhwb3J0IF9leGl0PWRlbGV0ZV9hbmRfZXhpdAoraWYgW1sgJGZvcmNlICE9IHkgXV0KK3RoZW4KKyAgZWNobyAiIFRoaXMgd2lsbCByZW1vdmUgdGVtcG9yYWxseSB0aGUgZXhpc3Rpbmcgb3BlbmZsb3cgcnVsZXMgYW5kIHJlc3RvcmVkIGJhY2sgYSB0aGUgZW5kIgorICByZWFkIC1lIC1wICJQcmVzcyBlbnRlciB0byBjb250aW51ZSwgQ1RSTCtDIHRvIGFib3J0ICIga2sKK2ZpCisKKworcHJpbnRmICIlLTUwcyIgIm9idGFpbiBwb3J0IGxpc3Q6ICIKK3Jlc3VsdD1gb3BlbmZsb3cgcG9ydC1saXN0ICRkZWJ1ZyB8IGdhd2sgJy9eIC97cHJpbnQgc3Vic3RyKCQxLDAsbGVuZ3RoKCQxKS0xKX0nYAorW1sgJD8gIT0gMCBdXSAmJiBlY2hvICAiRkFJTCIgJiYgZWNobyAiJHJlc3VsdCIgJiYgJF9leGl0IDEKK3BvcnRzPWBlY2hvICRyZXN1bHQgfCB3YyAtd2AKK1tbICRwb3J0cyAtbHQgNCBdXSAmJiBlY2hvICAiRkFJTCBub3QgZW5vdWdoIHBvcnRzIG1hbmFnZWQgYnkgdGhpcyBEUElELCBuZWVkZWQgYXQgbGVhc3QgNCIgJiYgJF9leGl0IDEKK2VjaG8gT0sgJHBvcnRzIHBvcnRzCitwb3J0MD1gZWNobyAkcmVzdWx0IHwgY3V0IC1kIiAiIC1mMWAKK3BvcnQxPWBlY2hvICRyZXN1bHQgfCBjdXQgLWQiICIgLWYyYAorcG9ydDI9YGVjaG8gJHJlc3VsdCB8IGN1dCAtZCIgIiAtZjNgCitwb3J0Mz1gZWNobyAkcmVzdWx0IHwgY3V0IC1kIiAiIC1mNGAKKworCitwcmludGYgIiUtNTBzIiAic2F2aW5nIHRoZSBjdXJyZW50IHJ1bGVzOiAiCitvcGVuZmxvdyBsaXN0ICRkZWJ1ZyA+IC4vdGVzdF9vcGVuZmxvd19vbGRfcnVsZXMuYmsKK1tbICQ/ICE9IDAgXV0gJiYgZWNobyAgIkZBSUwgY2Fubm90IG9idGFpbiBleGlzdGluZyBydWxlcyIgJiYgJF9leGl0IDEKK2VjaG8gT0sgIj4gLi90ZXN0X29wZW5mbG93X29sZF9ydWxlcy5iayIKKworcHJpbnRmICIlLTUwcyIgImNsZWFyaW5nIGFsbCBjdXJyZW50IHJ1bGVzOiAiCitvcGVuZmxvdyBjbGVhciAtZiAkZGVidWcgCitbWyAkPyAhPSAwIF1dICYmIGVjaG8gICJGQUlMIGNhbm5vdCBjbGVhciBleGlzdGluZyBydWxlcyIgJiYgJF9leGl0IDEKK3Jlc3VsdD1gb3BlbmZsb3cgbGlzdCB8IHdjIC1sYAorW1sgJHJlc3VsdCAhPSAxIF1dICYmIGVjaG8gICJGQUlMIHJ1bGVzIG5vdCBjb21wbGV0ZWx5IGNsZWFyZWQiICYmICRfZXhpdCAxCitlY2hvIE9LCitUT0RFTEVURT0icmVzdG9yZSIKKworcHJpbnRmICIlLTUwcyIgImNsZWFyaW5nIGFnYWluIGFsbCBydWxlczogIgorb3BlbmZsb3cgY2xlYXIgLWYgJGRlYnVnCitbWyAkPyAhPSAwIF1dICYmIGVjaG8gICJGQUlMIHdoZW4gdGhlcmUgYXJlIG5vdCBhbnkgcnVsZXMiICYmICRfZXhpdCAxCityZXN1bHQ9YG9wZW5mbG93IGxpc3QgfCB3YyAtbGAKK1tbICRyZXN1bHQgIT0gMSBdXSAmJiBlY2hvICAiRkFJTCBydWxlcyBub3QgY29tcGxldGVseSBjbGVhcmVkIiAmJiAkX2V4aXQgMQorZWNobyBPSworVE9ERUxFVEU9InJlc3RvcmUiCisKKworcHJpbnRmICIlLTUwcyIgIm5ldyBydWxlIHZsYW4sbWFjIC0+IG5vIHZsYW46ICIKK3J1bGVfbmFtZT1mcm9tVmxhbk1hY190b19Ob1ZsYW4xCitvcGVuZmxvdyBhZGQgJHJ1bGVfbmFtZSAtLXByaW9yaXR5IDEwMDAgLS1tYXRjaG1hYyAiYWE6YmI6Y2M6ZGQ6ZWU6ZmYiIC0tbWF0Y2h2bGFuIDUwMCAtLWlucG9ydCAkcG9ydDAgLS1zdHJpcHZsYW4gLS1vdXQgJHBvcnQxICRkZWJ1ZyAKK1tbICQ/ICE9IDAgXV0gJiYgZWNobyAgIkZBSUwgY2Fubm90IGluc2VydCBuZXcgcnVsZSIgJiYgJF9leGl0IDEKK2V4cGVjdGVkPSIkT0ZfQ09OVFJPTExFUl9EUElEIDEwMDAgJHJ1bGVfbmFtZSAkcG9ydDAgYWE6YmI6Y2M6ZGQ6ZWU6ZmYgNTAwIHZsYW49Tm9uZSxvdXQ9JHBvcnQxIgorcmVzdWx0PWBvcGVuZmxvdyBsaXN0IHwgZ3JlcCAkcnVsZV9uYW1lYAorW1sgJD8gIT0gMCBdXSAmJiBlY2hvICAiRkFJTCBydWxlIGJhZCBpbnNlcnRlZCIgICYmICRfZXhpdCAxCityZXN1bHQ9YGVjaG8gJHJlc3VsdGAgI3JlbW92ZSBibGFua3MKK1tbICIkcmVzdWx0IiAhPSAiJGV4cGVjdGVkIiBdXSAgJiYgZWNobyAiRkFJTCIgJiYgZWNobyAiICAgIGV4cGVjdGVkOiAkZXhwZWN0ZWRcbiAgICBvYnRhaW5lZDogJHJlc3VsdCIgJiYgJF9leGl0IDEKK2VjaG8gT0sgJHJ1bGVfbmFtZQorVE9ERUxFVEU9IiRydWxlX25hbWUgJFRPREVMRVRFIgorCitwcmludGYgIiUtNTBzIiAibmV3IHJ1bGUgbWFjIC0+IHZsYW46ICIKK3J1bGVfbmFtZT1mcm9tTWFjX3RvX1ZsYW4yCitvcGVuZmxvdyBhZGQgJHJ1bGVfbmFtZSAtLXByaW9yaXR5IDEwMDEgLS1tYXRjaG1hYyAiZmY6ZmY6ZmY6ZmY6ZmY6ZmYiIC0taW5wb3J0ICRwb3J0MSAtLXNldHZsYW4gNTAxIC0tb3V0ICRwb3J0MiAtLW91dCAkcG9ydDMgJGRlYnVnIAorW1sgJD8gIT0gMCBdXSAmJiBlY2hvICAiRkFJTCBjYW5ub3QgaW5zZXJ0IG5ldyBydWxlIiAmJiAkX2V4aXQgMQorZXhwZWN0ZWQ9IiRPRl9DT05UUk9MTEVSX0RQSUQgMTAwMSAkcnVsZV9uYW1lICRwb3J0MSBmZjpmZjpmZjpmZjpmZjpmZiBhbnkgdmxhbj01MDEsb3V0PSRwb3J0MixvdXQ9JHBvcnQzIgorcmVzdWx0PWBvcGVuZmxvdyBsaXN0IHwgZ3JlcCAkcnVsZV9uYW1lYAorW1sgJD8gIT0gMCBdXSAmJiBlY2hvICAiRkFJTCBydWxlIGJhZCBpbnNlcnRlZCIgICYmICRfZXhpdCAxCityZXN1bHQ9YGVjaG8gJHJlc3VsdGAgI3JlbW92ZSBibGFua3MKK1tbICIkcmVzdWx0IiAhPSAiJGV4cGVjdGVkIiBdXSAgJiYgZWNobyAiRkFJTCIgJiYgZWNobyAiICAgIGV4cGVjdGVkOiAkZXhwZWN0ZWRcbiAgICBvYnRhaW5lZDogJHJlc3VsdCIgICYmICRfZXhpdCAxCitlY2hvIE9LICAkcnVsZV9uYW1lCitUT0RFTEVURT0iJHJ1bGVfbmFtZSAkVE9ERUxFVEUiCisKK3ByaW50ZiAiJS01MHMiICJuZXcgcnVsZSBOb25lIC0+IE5vbmU6ICIKK3J1bGVfbmFtZT1mcm9tTm9uZV90b19Ob25lCitvcGVuZmxvdyBhZGQgJHJ1bGVfbmFtZSAtLXByaW9yaXR5IDEwMDIgLS1pbnBvcnQgJHBvcnQyIC0tb3V0ICRwb3J0MCAkZGVidWcgCitbWyAkPyAhPSAwIF1dICYmIGVjaG8gICJGQUlMIGNhbm5vdCBpbnNlcnQgbmV3IHJ1bGUiICYmICRfZXhpdCAxCitleHBlY3RlZD0iJE9GX0NPTlRST0xMRVJfRFBJRCAxMDAyICRydWxlX25hbWUgJHBvcnQyIGFueSBhbnkgb3V0PSRwb3J0MCIKK3Jlc3VsdD1gb3BlbmZsb3cgbGlzdCB8IGdyZXAgJHJ1bGVfbmFtZWAKK1tbICQ/ICE9IDAgXV0gJiYgZWNobyAgIkZBSUwgcnVsZSBiYWQgaW5zZXJ0ZWQiICYmICRfZXhpdCAxCityZXN1bHQ9YGVjaG8gJHJlc3VsdGAgI3JlbW92ZSBibGFua3MKK1tbICIkcmVzdWx0IiAhPSAiJGV4cGVjdGVkIiBdXSAgJiYgZWNobyAiRkFJTCIgJiYgZWNobyAiICAgIGV4cGVjdGVkOiAkZXhwZWN0ZWRcbiAgICBvYnRhaW5lZDogJHJlc3VsdCIgJiYgJF9leGl0IDEKK2VjaG8gT0sgJHJ1bGVfbmFtZQorVE9ERUxFVEU9IiRydWxlX25hbWUgJFRPREVMRVRFIgorCitwcmludGYgIiUtNTBzIiAibmV3IHJ1bGUgdmxhbiAtPiB2bGFuOiAiCitydWxlX25hbWU9ZnJvbVZsYW5fdG9fVmxhbjEKK29wZW5mbG93IGFkZCAkcnVsZV9uYW1lIC0tcHJpb3JpdHkgMTAwMyAtLW1hdGNodmxhbiA1MDQgLS1pbnBvcnQgJHBvcnQzIC0tc2V0dmxhbiA1MDUgLS1vdXQgJHBvcnQwICRkZWJ1ZyAKK1tbICQ/ICE9IDAgXV0gJiYgZWNobyAgIkZBSUwgY2Fubm90IGluc2VydCBuZXcgcnVsZSIgJiYgJF9leGl0IDEKK2V4cGVjdGVkPSIkT0ZfQ09OVFJPTExFUl9EUElEIDEwMDMgJHJ1bGVfbmFtZSAkcG9ydDMgYW55IDUwNCB2bGFuPTUwNSxvdXQ9JHBvcnQwIgorcmVzdWx0PWBvcGVuZmxvdyBsaXN0IHwgZ3JlcCAkcnVsZV9uYW1lYAorW1sgJD8gIT0gMCBdXSAmJiBlY2hvICAiRkFJTCBydWxlIGJhZCBpbnNlcnRlZCIgJiYgJF9leGl0IDEKK3Jlc3VsdD1gZWNobyAkcmVzdWx0YCAjcmVtb3ZlIGJsYW5rcworW1sgIiRyZXN1bHQiICE9ICIkZXhwZWN0ZWQiIF1dICAmJiBlY2hvICJGQUlMIiAmJiBlY2hvICIgICAgZXhwZWN0ZWQ6ICRleHBlY3RlZFxuICAgIG9idGFpbmVkOiAkcmVzdWx0IiAgJiYgJF9leGl0IDEKK2VjaG8gT0sgJHJ1bGVfbmFtZQorVE9ERUxFVEU9IiRydWxlX25hbWUgJFRPREVMRVRFIgorCisKK2lmIFtbICRzYW1lX3ZsYW4gPT0gbiBdXQordGhlbgorCisgIHByaW50ZiAiJS01MHMiICJuZXcgcnVsZSBWbGFuIC0+IFZsYW5fVmxhbjogIgorICBydWxlX25hbWU9ZnJvbVZsYW5fdG9fVmxhbjFWbGFuMQorICBvcGVuZmxvdyBhZGQgJHJ1bGVfbmFtZSAtLXByaW9yaXR5IDEwMDUgLS1pbnBvcnQgJHBvcnQzIC0tbWF0Y2h2bGFuIDUwNSAtLXNldHZsYW4gNTEwIC0tb3V0ICRwb3J0MCAtLXNldHZsYW4gNTExIC0tb3V0ICRwb3J0MSAtLXN0cmlwdmxhbiAtLW91dD0kcG9ydDIgJGRlYnVnIAorICBbWyAkPyAhPSAwIF1dICYmIGVjaG8gICJGQUlMIGNhbm5vdCBpbnNlcnQgbmV3IHJ1bGUiICYmICRfZXhpdCAxCisgIGV4cGVjdGVkPSIkT0ZfQ09OVFJPTExFUl9EUElEIDEwMDUgJHJ1bGVfbmFtZSAkcG9ydDMgYW55IDUwNSB2bGFuPTUxMCxvdXQ9JHBvcnQwLHZsYW49NTExLG91dD0kcG9ydDEsdmxhbj1Ob25lLG91dD0kcG9ydDIiCisgIHJlc3VsdD1gb3BlbmZsb3cgbGlzdCB8IGdyZXAgJHJ1bGVfbmFtZWAKKyAgW1sgJD8gIT0gMCBdXSAmJiBlY2hvICAiRkFJTCBydWxlIGJhZCBpbnNlcnRlZCIgJiYgJF9leGl0IDEKKyAgcmVzdWx0PWBlY2hvICRyZXN1bHRgICNyZW1vdmUgYmxhbmtzCisgIFtbICIkcmVzdWx0IiAhPSAiJGV4cGVjdGVkIiBdXSAgJiYgZWNobyAiRkFJTCIgJiYgZWNobyAiICAgIGV4cGVjdGVkOiAkZXhwZWN0ZWRcbiAgICBvYnRhaW5lZDogJHJlc3VsdCIgJiYgJF9leGl0IDEKKyAgZWNobyBPSyAkcnVsZV9uYW1lCisgIFRPREVMRVRFPSIkcnVsZV9uYW1lICRUT0RFTEVURSIKKworZmkKKworZWNobyAKK2VjaG8gRE9ORQorCiskX2V4aXQgMAorCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Rfb3BlbnZpbS5weSBiL3Rlc3QvdGVzdF9vcGVudmltLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjczZmNjMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3Rfb3BlbnZpbS5weQpAQCAtMCwwICsxLDcwOCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKycnJworVGhpcyBpcyBhIGNsaWVudCB0ZXN0ZXIgZm9yIG9wZW52aW0uCitJdCBpcyBhbG1vc3QgREVQUkVDQVRFRCBieSB0aGUgb3BlbnZpbSBjbGllbnQKKworVGhlIHJlYXNvbiBmb3Iga2VlcGluZyBpcyBiZWNhdXNlIGl0IGlzIHVzZWQgZm9yIHNvbWUgc2NyaXB0cworYW5kIGl0IGNvbnRhaW4gdGhlIC1yIG9wdGlvbiAoZGVsZXRlIHJlY3Vyc2l2ZSkgIAordGhhdCBpdCBpcyB2ZXJ5IHVzZWZ1bCBmb3IgZGVsZXRpbmcgY29udGVudCBvZiBkYXRhYmFzZS4KK0Fub3RoZXIgZGlmZmVyZW5jZSBmcm9tIG9wZW52aW0gaXMgdGhhdCBpdCBpcyBtb3JlIHZlcmJvc2UKK2FuZCBzbyBtb3JlIHN1aXRhYmxlIGZvciB0aGUgZGV2ZWxvcGVycworJycnCisKK19fYXV0aG9yX189IkFsZm9uc28gVGllcm5vIgorX19kYXRlX18gPSIkNS1vY3QtMjAxNCAxMTowOToyOSQiCisKK2ltcG9ydCByZXF1ZXN0cworaW1wb3J0IGpzb24KK2ltcG9ydCB5YW1sCitpbXBvcnQgc3lzCitpbXBvcnQgZ2V0b3B0Citmcm9tIGpzb25zY2hlbWEgaW1wb3J0IHZhbGlkYXRlIGFzIGpzX3YsIGV4Y2VwdGlvbnMgYXMganNfZQorCit2ZXJzaW9uPSIwLjAuMiIKK2dsb2JhbCBnbG9iYWxfY29uZmlnCisKKworZGVmIGdldF9lbGVtZW50cyh1cmwpOgorICAgIGhlYWRlcnNfcmVxID0geydjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9CisgICAgdHJ5OgorICAgICAgICB2aW1fcmVzcG9uc2UgPSByZXF1ZXN0cy5nZXQodXJsLCBoZWFkZXJzID0gaGVhZGVyc19yZXEpCisgICAgICAgICNwcmludCB2aW1fcmVzcG9uc2UKKyAgICAgICAgI3ByaW50IHZpbV9yZXNwb25zZS5zdGF0dXNfY29kZQorICAgICAgICBpZiB2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUgPT0gMjAwOgorICAgICAgICAjcHJpbnQgdmltX3Jlc3BvbnNlLmpzb24oKQorICAgICAgICAjcHJpbnQganNvbi5kdW1wcyh2aW1fcmVzcG9uc2UuanNvbigpLCBpbmRlbnQ9NCkKKyAgICAgICAgICAgIGNvbnRlbnQgPSB2aW1fcmVzcG9uc2UuanNvbigpCisgICAgICAgICAgICByZXR1cm4gMSwgY29udGVudAorICAgICAgICAgICAgI3ByaW50IGh0dHBfY29udGVudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dCA9ICIgRXJyb3IuIFZJTSByZXNwb25zZSAnJXMnOiBub3QgcG9zc2libGUgdG8gR0VUICVzIiAlICh2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHVybCkKKyAgICAgICAgICAgIHRleHQgKz0gIlxuICIgKyB2aW1fcmVzcG9uc2UudGV4dAorICAgICAgICAgICAgI3ByaW50IHRleHQKKyAgICAgICAgICAgIHJldHVybiAtdmltX3Jlc3BvbnNlLnN0YXR1c19jb2RlLHRleHQKKyAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uLCBlOgorICAgICAgICByZXR1cm4gLTEsICIgRXhjZXB0aW9uICIrIHN0cihlLm1lc3NhZ2UpCisKK2RlZiBkZWxldGVfZWxlbWVudHModXJsKToKKyAgICBoZWFkZXJzX3JlcSA9IHsnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfQorICAgIAorICAgIHRyeToKKyAgICAgICAgdmltX3Jlc3BvbnNlID0gcmVxdWVzdHMuZGVsZXRlKHVybCwgaGVhZGVycyA9IGhlYWRlcnNfcmVxKQorICAgICAgICAjcHJpbnQgdmltX3Jlc3BvbnNlCisgICAgICAgICNwcmludCB2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUKKyAgICAgICAgaWYgdmltX3Jlc3BvbnNlLnN0YXR1c19jb2RlID09IDIwMDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICNwcmludCB2aW1fcmVzcG9uc2UuanNvbigpCisgICAgICAgICAgICAjcHJpbnQganNvbi5kdW1wcyh2aW1fcmVzcG9uc2UuanNvbigpLCBpbmRlbnQ9NCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICNwcmludCB2aW1fcmVzcG9uc2UudGV4dAorICAgICAgICAgICAgdGV4dCA9ICIgRXJyb3IuIFZJTSByZXNwb25zZSAnJXMnOiBub3QgcG9zc2libGUgdG8gREVMRVRFICVzIiAlICh2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHVybCkKKyAgICAgICAgICAgIHRleHQgKz0gIlxuICIgKyB2aW1fcmVzcG9uc2UudGV4dAorICAgICAgICAgICAgI3ByaW50IHRleHQKKyAgICAgICAgICAgIHJldHVybiAtdmltX3Jlc3BvbnNlLnN0YXR1c19jb2RlLHRleHQKKyAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uLCBlOgorICAgICAgICByZXR1cm4gLTEsICIgRXhjZXB0aW9uICIrIHN0cihlLm1lc3NhZ2UpCisgICAgcmV0dXJuIDEsIE5vbmUKKworCitkZWYgbmV3X2VsZW1lbnRzKHVybCwgcGF5bG9hZCk6CisgICAgaGVhZGVyc19yZXEgPSB7J0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30KKyAgICAjcHJpbnQgc3RyKHBheWxvYWQpCisgICAgdHJ5OgorICAgICAgICB2aW1fcmVzcG9uc2UgPSByZXF1ZXN0cy5wb3N0KHVybCwgZGF0YT1qc29uLmR1bXBzKHBheWxvYWQpLCBoZWFkZXJzPWhlYWRlcnNfcmVxKQorICAgICAgICAjcHJpbnQgdmltX3Jlc3BvbnNlCisgICAgICAgICNwcmludCB2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUKKyAgICAgICAgaWYgdmltX3Jlc3BvbnNlLnN0YXR1c19jb2RlID09IDIwMDoKKyAgICAgICAgICAgICNwcmludCB2aW1fcmVzcG9uc2UuanNvbigpCisgICAgICAgICAgICAjcHJpbnQganNvbi5kdW1wcyh2aW1fcmVzcG9uc2UuanNvbigpLCBpbmRlbnQ9NCkKKyAgICAgICAgICAgIHJldHVybiAxLCB2aW1fcmVzcG9uc2UudGV4dAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI3ByaW50IHZpbV9yZXNwb25zZS50ZXh0CisgICAgICAgICAgICB0ZXh0ID0gIkVycm9yLiBWSU0gcmVzcG9uc2UgJyVzJzogbm90IHBvc3NpYmxlIHRvIEFERCAlcyIgJSAodmltX3Jlc3BvbnNlLnN0YXR1c19jb2RlLCB1cmwpCisgICAgICAgICAgICB0ZXh0ICs9ICJcbiIgKyB2aW1fcmVzcG9uc2UudGV4dAorICAgICAgICAgICAgI3ByaW50IHRleHQKKyAgICAgICAgICAgIHJldHVybiAtdmltX3Jlc3BvbnNlLnN0YXR1c19jb2RlLHRleHQKKyAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5SZXF1ZXN0RXhjZXB0aW9uLCBlOgorICAgICAgICByZXR1cm4gLTEsICIgRXhjZXB0aW9uICIrIHN0cihlLm1lc3NhZ2UpCisKKworZGVmIGdldF9kZXRhaWxzKHVybCwgd2hhdCwgYyk6CisgICAgaXRlbV9saXN0ID0gW10KKyAgICByZXR1cm5fZGljdCA9IHt3aGF0KydzJzogW119CisgICAgCisgICAgaXRlbSA9IGMuZ2V0KHdoYXQsTm9uZSkKKyAgICBpZiBpdGVtIGlzIE5vbmU6IGl0ZW0gPSBjLmdldCh3aGF0KydzJyxOb25lKQorICAgIGlmIGl0ZW0gaXMgTm9uZToKKyAgICAgICAgZXJyb3JfdGV4dD0gIiBJbnRlcm5hbCBlcnJvciwgbm90IGZvdW5kICciICsgd2hhdCArIltzXScgaW4gY29udGVudCIKKyAgICAgICAgcHJpbnQgJ2dldF9kZXRhaWxzKCknLCBlcnJvcl90ZXh0LCBjCisgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dCAKKyAgICBpZiB0eXBlKGl0ZW0pIGlzIGxpc3Q6IAorICAgICAgICBpdGVtX2xpc3QgPSBpdGVtCisgICAgZWxzZToKKyAgICAgICAgaXRlbV9saXN0LmFwcGVuZChpdGVtKQorICAgIGlmIGxlbihpdGVtX2xpc3QpPT0wOgorICAgICAgICBwcmludCB3aGF0LCAibm90IGZvdW5kIgorICAgICAgICByZXR1cm4gMQorICAgIGZvciBpdGVtIGluIGl0ZW1fbGlzdDogCisgICAgICAgIHV1aWQgPSBpdGVtLmdldCgnaWQnLE5vbmUpCisgICAgICAgIGlmIHV1aWQgaXMgTm9uZTogdXVpZCA9IGl0ZW0uZ2V0KCd1dWlkJyxOb25lKQorICAgICAgICBpZiB1dWlkIGlzIE5vbmU6CisgICAgICAgICAgICBlcnJvcl90ZXh0PSAiIEludGVybmFsIGVycm9yLCBub3QgZm91bmQgJ2lkL3V1aWQnIGluIGl0ZW0iCisgICAgICAgICAgICBwcmludCAnZ2V0X2RldGFpbHMoKScsIGVycm9yX3RleHQsIGl0ZW0KKyAgICAgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dCAKKyAgICAgICAgI3ByaW50ICIgZ2V0Iiwgd2hhdCwgdXVpZCwgIiAgICAgPj4+Pj4+Pj4gIiwKKyAgICAgICAgcixjID0gZ2V0X2VsZW1lbnRzKHVybCArICIvIiArIHV1aWQpCisgICAgICAgIGlmIHI8MDogICAgICAgICAgICAgIAorICAgICAgICAjICAgIHByaW50ICJmYWlsIgorICAgICAgICAgICAgcHJpbnQgIiBnZXQiLCB3aGF0LCB1dWlkLCAiZmFpbCIsIGMKKyAgICAgICAgICAgIHJldHVybiAtMSwgYworICAgICAgICAjZWxzZToKKyAgICAgICAgIyAgICBwcmludCAnb2snCisgICAgICAgIHJldHVybl9kaWN0W3doYXQrJ3MnXS5hcHBlbmQoY1t3aGF0XSkKKyAgICByZXR1cm4gMSwgcmV0dXJuX2RpY3QKKworCitkZWYgYWN0aW9uX2RldGFpbHModXJsLCB3aGF0LCBjLCBmb3JjZSwgcGF5bG9hZCk6CisgICAgaXRlbV9saXN0ID0gW10KKyAgICByZXR1cm5fZGljdCA9IHt3aGF0KydzJzogW119CisgICAgaGVhZGVyc19yZXEgPSB7J0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30KKyAgICBmYWlsPTAKKyAgICBvaz0wCisgICAgCisgICAgI0FsbG93cyBmb3IgcGF5bG9hZCBib3RoIGtleXBhaXJzIGluc2lkZSBhICdzZXJ2ZXInLCdwb3J0JyAuLi4gb3IgZGlyZWN0bHkuIEluIGxhdGVyIGNhc2UsIHB1dCBrZXlwYWlycyBpbnNpZGUgd2hhdAorICAgICAgICAKKyAgICBpdGVtID0gYy5nZXQod2hhdCxOb25lKQorICAgIGlmIGl0ZW0gaXMgTm9uZTogaXRlbSA9IGMuZ2V0KHdoYXQrJ3MnLE5vbmUpCisgICAgaWYgaXRlbSBpcyBOb25lOgorICAgICAgICBlcnJvcl90ZXh0PSAiIEludGVybmFsIGVycm9yLCBub3QgZm91bmQgJyIgKyB3aGF0ICsiW3NdJyBpbiBjb250ZW50IgorICAgICAgICBwcmludCAnZ2V0X2RldGFpbHMoKScsIGVycm9yX3RleHQsIGMKKyAgICAgICAgcmV0dXJuIC0xLCBlcnJvcl90ZXh0IAorICAgIGlmIHR5cGUoaXRlbSkgaXMgbGlzdDogCisgICAgICAgIGl0ZW1fbGlzdCA9IGl0ZW0KKyAgICBlbHNlOgorICAgICAgICBpdGVtX2xpc3QuYXBwZW5kKGl0ZW0pCisgICAgaWYgbGVuKGl0ZW1fbGlzdCk9PTA6CisgICAgICAgIHByaW50IHdoYXQsICJub3QgZm91bmQiCisgICAgICAgIHJldHVybiAxCisgICAgZm9yIGl0ZW0gaW4gaXRlbV9saXN0OiAKKyAgICAgICAgbmFtZSA9IGl0ZW0uZ2V0KCduYW1lJyxOb25lKQorICAgICAgICB1dWlkID0gaXRlbS5nZXQoJ2lkJyxOb25lKQorICAgICAgICBpZiB1dWlkIGlzIE5vbmU6IHV1aWQgPSBpdGVtLmdldCgndXVpZCcsTm9uZSkKKyAgICAgICAgaWYgdXVpZCBpcyBOb25lOgorICAgICAgICAgICAgZXJyb3JfdGV4dD0gIiBJbnRlcm5hbCBlcnJvciwgbm90IGZvdW5kICdpZC91dWlkJyBpbiBpdGVtIgorICAgICAgICAgICAgcHJpbnQgJ2dldF9kZXRhaWxzKCknLCBlcnJvcl90ZXh0LCBpdGVtCisgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX3RleHQgCisgICAgICAgIGlmIG5vdCBmb3JjZToKKyAgICAgICAgICAgIHIgPSByYXdfaW5wdXQoIkFjdGlvbiBvbiAgIiArIHdoYXQgKyAiICIgKyB1dWlkICsgIiAiICsgbmFtZSArICIgKHkvTik/ICIpCisgICAgICAgICAgICBpZiAgbGVuKHIpPjAgIGFuZCByWzBdLmxvd2VyKCk9PSJ5IjoKKyAgICAgICAgICAgICAgICBwcmludCAiIHB1dCIsIHdoYXQsIHV1aWQsICIgICAgID4+Pj4+Pj4+ICIsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgI3ByaW50IHN0cihwYXlsb2FkKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB2aW1fcmVzcG9uc2UgPSByZXF1ZXN0cy5wb3N0KHVybCArICIvIiArIHV1aWQgKyAiL2FjdGlvbiIsIGRhdGE9anNvbi5kdW1wcyhwYXlsb2FkKSwgaGVhZGVycz1oZWFkZXJzX3JlcSkKKyAgICAgICAgICAgIGlmIHZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSA9PSAyMDA6CisgICAgICAgICAgICAgICAgcHJpbnQgJ29rJworICAgICAgICAgICAgICAgIG9rICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm5fZGljdFt3aGF0KydzJ10uYXBwZW5kKHZpbV9yZXNwb25zZS5qc29uKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuX2RpY3Rbd2hhdCsncyddWy0xXVsndXVpZCddID0gdXVpZAorICAgICAgICAgICAgICAgIHJldHVybl9kaWN0W3doYXQrJ3MnXVstMV1bJ25hbWUnXSA9IG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmFpbCArPSAxCisgICAgICAgICAgICAgICAgcHJpbnQgImZhaWwiCisgICAgICAgICAgICAgICAgI3ByaW50IHZpbV9yZXNwb25zZS50ZXh0CisgICAgICAgICAgICAgICAgI3RleHQgPSAiRXJyb3IuIFZJTSByZXNwb25zZSAnJXMnOiBub3QgcG9zc2libGUgdG8gUFVUICVzIiAlICh2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHVybCkKKyAgICAgICAgICAgICAgICAjdGV4dCArPSAiXG4iICsgdmltX3Jlc3BvbnNlLnRleHQKKyAgICAgICAgICAgICAgICAjcHJpbnQgdGV4dAorICAgICAgICAgICAgICAgIGVycm9yX2RpY3QgPSB2aW1fcmVzcG9uc2UuanNvbigpCisgICAgICAgICAgICAgICAgZXJyb3JfZGljdFsnZXJyb3InXVsndXVpZCddPXV1aWQKKyAgICAgICAgICAgICAgICBlcnJvcl9kaWN0WydlcnJvciddWyduYW1lJ109bmFtZQorICAgICAgICAgICAgICAgIHJldHVybl9kaWN0W3doYXQrJ3MnXS5hcHBlbmQoZXJyb3JfZGljdCkKKyAgICAgICAgZXhjZXB0IHJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVxdWVzdEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHJldHVybiAtMSwgIiBFeGNlcHRpb24gIisgc3RyKGUubWVzc2FnZSkKKyAgICBpZiBvaz4wIGFuZCBmYWlsPjA6IHJldHVybiAwLCByZXR1cm5fZGljdAorICAgIGVsaWYgZmFpbD09MCA6ICAgICAgcmV0dXJuIDEsIHJldHVybl9kaWN0CisgICAgZWxzZTogICAgICAgICAgICAgICByZXR1cm4gLTEsIHJldHVybl9kaWN0CisKKworCitkZWYgZWRpdF9kZXRhaWxzKHVybCwgd2hhdCwgYywgZm9yY2UsIHBheWxvYWQpOgorICAgIGl0ZW1fbGlzdCA9IFtdCisgICAgcmV0dXJuX2RpY3QgPSB7d2hhdCsncyc6IFtdfQorICAgIGhlYWRlcnNfcmVxID0geydBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9CisgICAgZmFpbD0wCisgICAgb2s9MAorICAgIAorICAgICNBbGxvd3MgZm9yIHBheWxvYWQgYm90aCBrZXlwYWlycyBpbnNpZGUgYSAnc2VydmVyJywncG9ydCcgLi4uIG9yIGRpcmVjdGx5LiBJbiBsYXRlciBjYXNlLCBwdXQga2V5cGFpcnMgaW5zaWRlIHdoYXQKKyAgICBpZiB3aGF0IG5vdCBpbiBwYXlsb2FkOgorICAgICAgICBwYXlsb2FkID0ge3doYXQ6cGF5bG9hZH0KKyAgICAgICAgCisgICAgaXRlbSA9IGMuZ2V0KHdoYXQsTm9uZSkKKyAgICBpZiBpdGVtIGlzIE5vbmU6IGl0ZW0gPSBjLmdldCh3aGF0KydzJyxOb25lKQorICAgIGlmIGl0ZW0gaXMgTm9uZToKKyAgICAgICAgZXJyb3JfdGV4dD0gIiBJbnRlcm5hbCBlcnJvciwgbm90IGZvdW5kICciICsgd2hhdCArIltzXScgaW4gY29udGVudCIKKyAgICAgICAgcHJpbnQgJ2dldF9kZXRhaWxzKCknLCBlcnJvcl90ZXh0LCBjCisgICAgICAgIHJldHVybiAtMSwgZXJyb3JfdGV4dCAKKyAgICBpZiB0eXBlKGl0ZW0pIGlzIGxpc3Q6IAorICAgICAgICBpdGVtX2xpc3QgPSBpdGVtCisgICAgZWxzZToKKyAgICAgICAgaXRlbV9saXN0LmFwcGVuZChpdGVtKQorICAgIGlmIGxlbihpdGVtX2xpc3QpPT0wOgorICAgICAgICBwcmludCB3aGF0LCAibm90IGZvdW5kIgorICAgICAgICByZXR1cm4gMQorICAgIGZvciBpdGVtIGluIGl0ZW1fbGlzdDogCisgICAgICAgIG5hbWUgPSBpdGVtLmdldCgnbmFtZScsTm9uZSkKKyAgICAgICAgdXVpZCA9IGl0ZW0uZ2V0KCdpZCcsTm9uZSkKKyAgICAgICAgaWYgdXVpZCBpcyBOb25lOiB1dWlkID0gaXRlbS5nZXQoJ3V1aWQnLE5vbmUpCisgICAgICAgIGlmIHV1aWQgaXMgTm9uZToKKyAgICAgICAgICAgIGVycm9yX3RleHQ9ICIgSW50ZXJuYWwgZXJyb3IsIG5vdCBmb3VuZCAnaWQvdXVpZCcgaW4gaXRlbSIKKyAgICAgICAgICAgIHByaW50ICdnZXRfZGV0YWlscygpJywgZXJyb3JfdGV4dCwgaXRlbQorICAgICAgICAgICAgcmV0dXJuIC0xLCBlcnJvcl90ZXh0IAorICAgICAgICBpZiBub3QgZm9yY2U6CisgICAgICAgICAgICByID0gcmF3X2lucHV0KCJFZGl0ICIgKyB3aGF0ICsgIiAiICsgdXVpZCArICIgIiArIG5hbWUgKyAiICh5L04pPyAiKQorICAgICAgICAgICAgaWYgIGxlbihyKT4wICBhbmQgclswXS5sb3dlcigpPT0ieSI6CisgICAgICAgICAgICAgICAgcHJpbnQgIiBwdXQiLCB3aGF0LCB1dWlkLCAiICAgICA+Pj4+Pj4+PiAiLAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICNwcmludCBzdHIocGF5bG9hZCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmltX3Jlc3BvbnNlID0gcmVxdWVzdHMucHV0KHVybCArICIvIiArIHV1aWQsIGRhdGE9anNvbi5kdW1wcyhwYXlsb2FkKSwgaGVhZGVycz1oZWFkZXJzX3JlcSkKKyAgICAgICAgICAgIGlmIHZpbV9yZXNwb25zZS5zdGF0dXNfY29kZSA9PSAyMDA6CisgICAgICAgICAgICAgICAgcHJpbnQgJ29rJworICAgICAgICAgICAgICAgIG9rICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm5fZGljdFt3aGF0KydzJ10uYXBwZW5kKCB2aW1fcmVzcG9uc2UuanNvbigpW3doYXRdICkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmFpbCArPSAxCisgICAgICAgICAgICAgICAgcHJpbnQgImZhaWwiCisgICAgICAgICAgICAgICAgI3ByaW50IHZpbV9yZXNwb25zZS50ZXh0CisgICAgICAgICAgICAgICAgI3RleHQgPSAiRXJyb3IuIFZJTSByZXNwb25zZSAnJXMnOiBub3QgcG9zc2libGUgdG8gUFVUICVzIiAlICh2aW1fcmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHVybCkKKyAgICAgICAgICAgICAgICAjdGV4dCArPSAiXG4iICsgdmltX3Jlc3BvbnNlLnRleHQKKyAgICAgICAgICAgICAgICAjcHJpbnQgdGV4dAorICAgICAgICAgICAgICAgIGVycm9yX2RpY3QgPSB2aW1fcmVzcG9uc2UuanNvbigpCisgICAgICAgICAgICAgICAgZXJyb3JfZGljdFsnZXJyb3InXVsndXVpZCddPXV1aWQKKyAgICAgICAgICAgICAgICBlcnJvcl9kaWN0WydlcnJvciddWyduYW1lJ109bmFtZQorICAgICAgICAgICAgICAgIHJldHVybl9kaWN0W3doYXQrJ3MnXS5hcHBlbmQoZXJyb3JfZGljdCkKKyAgICAgICAgZXhjZXB0IHJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVxdWVzdEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHJldHVybiAtMSwgIiBFeGNlcHRpb24gIisgc3RyKGUubWVzc2FnZSkKKyAgICBpZiBvaz4wIGFuZCBmYWlsPjA6IHJldHVybiAwLCByZXR1cm5fZGljdAorICAgIGVsaWYgZmFpbD09MCA6ICAgICAgcmV0dXJuIDEsIHJldHVybl9kaWN0CisgICAgZWxzZTogICAgICAgICAgICAgICByZXR1cm4gLTEsIHJldHVybl9kaWN0CisKK2RlZiBnZXRfZGVsX3JlY3Vyc2l2ZSh1cmwsIHdoYXQsIHVybF9zdWZmaXgsIGZvcmNlPUZhbHNlLCByZWN1cnNpdmU9RmFsc2UpOgorICAgICNwcmludAorICAgICNwcmludCAiIGdldCIsIHdoYXQsIGEsICIgICAgID4+Pj4+Pj4+ICIsCisgICAgcixjID0gZ2V0X2VsZW1lbnRzKHVybCArIHdoYXQgKyAncycgKyB1cmxfc3VmZml4KQorICAgIGlmIHI8MDoKKyAgICAgICAgcHJpbnQgYywgIndoZW4gZ2V0dGluZyIsIHdoYXQsIHVybF9zdWZmaXgKKyAgICAgICAgcmV0dXJuIC0xIAorICAgICMgICAgcHJpbnQgIm9rIgorCisgICAgbGlzdF90b2RlbGV0ZSA9IGMuZ2V0KHdoYXQsIE5vbmUpCisgICAgaWYgbGlzdF90b2RlbGV0ZSBpcyBOb25lOiBsaXN0X3RvZGVsZXRlID0gYy5nZXQod2hhdCsncycsIE5vbmUpCisgICAgaWYgbGlzdF90b2RlbGV0ZSBpcyBOb25lOgorICAgICAgICBwcmludCAiIEludGVybmFsIGVycm9yLCBub3QgZm91bmQgJyIgKyB3aGF0ICsiW3NdJyBpbiIsIGMKKyAgICAgICAgcmV0dXJuIC0zLCAgIiBJbnRlcm5hbCBlcnJvciwgbm90IGZvdW5kIGEgdmFsaWQgZGljdGlvbmFyeSIKKyAgICBpZiB0eXBlKGxpc3RfdG9kZWxldGUpID09IGRpY3Q6CisgICAgICAgIGxpc3RfdG9kZWxldGUgPSAobGlzdF90b2RlbGV0ZSwgKQorICAgIAorICAgIGlmIGxlbihsaXN0X3RvZGVsZXRlKT09MDoKKyAgICAgICAgcHJpbnQgd2hhdCwgdXJsX3N1ZmZpeCwgIm5vdCBmb3VuZCIKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmb3IgYyBpbiBsaXN0X3RvZGVsZXRlOgorICAgICAgICB1dWlkPWMuZ2V0KCdpZCcsIE5vbmUpCisgICAgICAgIGlmIHV1aWQgaXMgTm9uZToKKyAgICAgICAgICAgIHV1aWQ9Yy5nZXQoJ3V1aWQnLCBOb25lKQorICAgICAgICBpZiB1dWlkIGlzIE5vbmU6CisgICAgICAgICAgICBwcmludCAiSWQgbm90IGZvdW5kIgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbmFtZSA9IGMuZ2V0KCJuYW1lIiwiIikKKyAgICAgICAgaWYgcmVjdXJzaXZlOgorICAgICAgICAgICAgaWYgd2hhdD09J3RlbmFudCcgOgorICAgICAgICAgICAgICAgIGdldF9kZWxfcmVjdXJzaXZlKHVybCArIHV1aWQgKyAiLyIsICdzZXJ2ZXInLCAiIiwgZm9yY2UsIHJlY3Vyc2l2ZSkKKyAgICAgICAgICAgICAgICBnZXRfZGVsX3JlY3Vyc2l2ZSh1cmwgKyB1dWlkICsgIi8iLCAnZmxhdm9yJywgIiIsIGZvcmNlLCByZWN1cnNpdmUpCisgICAgICAgICAgICAgICAgZ2V0X2RlbF9yZWN1cnNpdmUodXJsICsgdXVpZCArICIvIiwgJ2ltYWdlJywgIiIsIGZvcmNlLCByZWN1cnNpdmUpCisgICAgICAgICAgICAgICAgZ2V0X2RlbF9yZWN1cnNpdmUodXJsLCAnbmV0d29yaycsICI/dGVuYW50X2lkPSIrdXVpZCwgZm9yY2UsIHJlY3Vyc2l2ZSkKKyAgICAgICAgICAgIGVsaWYgd2hhdD09J2ZsYXZvcnMnIDoKKyAgICAgICAgICAgICAgICAjZ2V0X2RlbF9yZWN1cnNpdmUodXJsLCAnc2VydmVycycsICI/Zmxhdm9yUmVmPSIrdXVpZCwgZm9yY2UsIHJlY3Vyc2l2ZSkKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIHdoYXQ9PSdpbWFnZScgOgorICAgICAgICAgICAgICAgIGdldF9kZWxfcmVjdXJzaXZlKHVybCwgJ3NlcnZlcicsICI/aW1hZ2VSZWY9Iit1dWlkLCBmb3JjZSwgcmVjdXJzaXZlKQorICAgICAgICAgICAgZWxpZiB3aGF0PT0naG9zdHMnIDoKKyAgICAgICAgICAgICAgICBnZXRfZGVsX3JlY3Vyc2l2ZSh1cmwsICdzZXJ2ZXInLCAiP2hvc3RJZD0iK3V1aWQsIGZvcmNlLCByZWN1cnNpdmUpCisgICAgICAgICAgICAgICAgCisgICAgICAgIGlmIG5vdCBmb3JjZToKKyAgICAgICAgICAgIHIgPSByYXdfaW5wdXQoIkRlbGV0ZSAiICsgd2hhdCArICIgIiArIHV1aWQgKyAiICIgKyBuYW1lICsgIiAoeS9OKT8gIikKKyAgICAgICAgICAgIGlmICBsZW4ocik+MCAgYW5kIHJbMF0ubG93ZXIoKT09InkiOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcixjID0gZGVsZXRlX2VsZW1lbnRzKHVybCArIHdoYXQgKyAicy8iICsgdXVpZCkKKyAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgI3ByaW50ICJFcnJvciBkZWxldGluZyIsIHZpbVVSSSwgLXIKKyAgICAgICAgICAgIHByaW50IGMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50IHdoYXQsIHV1aWQsIG5hbWUsICJkZWxldGVkIgorICAgIHJldHVybiAxCisKK2RlZiBjaGVja192YWxpZF91dWlkKHV1aWQpOgorICAgIGlkX3NjaGVtYSA9IHsidHlwZSIgOiAic3RyaW5nIiwgInBhdHRlcm4iOiAiXlthLWZBLUYwLTldezh9KC1bYS1mQS1GMC05XXs0fSl7M30tW2EtZkEtRjAtOV17MTJ9JCJ9CisgICAgdHJ5OgorICAgICAgICBqc192KHV1aWQsIGlkX3NjaGVtYSkKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBleGNlcHQganNfZS5WYWxpZGF0aW9uRXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorCitkZWYgY2hhbmdlX3N0cmluZyh0ZXh0LCB2YXJfbGlzdCk6CisgICAgZW5kPTAKKyAgICB0eXBlXz1Ob25lCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgaW5pID0gdGV4dC5maW5kKCIkeyIsIGVuZCkKKyAgICAgICAgaWYgaW5pPDA6IHJldHVybiB0ZXh0CisgICAgICAgIGVuZCA9IHRleHQuZmluZCgifSIsIGluaSkgCisgICAgICAgIGlmIGVuZDwwOiByZXR1cm4gdGV4dAorICAgICAgICBlbmQrPTEKKyAgICAgICAgCisgICAgICAgIHZhciA9IHRleHRbaW5pOmVuZF0KKyAgICAgICAgaWYgJyAnIGluIHZhcjoKKyAgICAgICAgICAgIGtrPXZhci5zcGxpdCgiICIpCisgICAgICAgICAgICB2YXI9a2tbMF0rIn0iCisgICAgICAgICAgICB0eXBlXz1ra1stMV1bOi0xXQorICAgICAgICB2YXIgPSB2YXJfbGlzdC5nZXQodmFyLCBOb25lKQorICAgICAgICBpZiB2YXI9PU5vbmU6IHJldHVybiB0ZXh0CisgICAgICAgIAorICAgICAgICB0ZXh0ID0gIHRleHRbOmluaV0gKyB2YXIgKyB0ZXh0W2VuZDpdCisgICAgICAgIGlmIHR5cGVfICE9IE5vbmU6CisgICAgICAgICAgICBpZiAnbnVsbCcgaW4gdHlwZV8gYW5kIHRleHQ9PSJudWxsIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgaWYgJ2ludCcgaW4gdHlwZV8gOiAjYW5kIHRleHQuaXNudW1lcmljKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludCh0ZXh0KQorICAgIHJldHVybiB0ZXh0CisKK2RlZiBjaGFnZV92YXJfcmVjdXJzaXZlbHkoZGF0YSwgdmFyX2xpc3QpOgorICAgICcnJ0NoZWNrIHJlY3Vyc2l2ZWx5IHRoZSBjb25lbnQgb2YgZGF0YSwgYW5kIGxvb2sgZm9yICIqJHsqfSoiIHZhcmlhYmxlcyBhbmQgY2hhbmdlcyAgCisgICAgSXQgYXNzdW1lcyB0aGF0IHRoaXMgdmFyaWFibGVzIGFyZSBub3QgaW4gdGhlIGtleSBvZiBkaWN0aW9uYXJ5LAorICAgIEF0dHJpYnV0ZXM6CisgICAgICAgICdkYXRhJzogZGljdGlvbmFyeSwgb3IgbGlzdC4gTm9uZSBvciBlbXB0eSBpcyBjb25zaWRldGVkIHZhbGlkCisgICAgICAgICd2YXJfbGlzdCc6IGRpY3Rpb25hcnkgKG5hbWU6Y2hhbmdlKSBwYWlycworICAgIFJldHVybjoKKyAgICAgICAgTm9uZSwgZGF0YSBpcyBtb2RpZmllZAorICAgICcnJworICAgICAgICAKKyAgICBpZiB0eXBlKGRhdGEpIGlzIGRpY3Q6CisgICAgICAgIGZvciBrIGluIGRhdGEua2V5cygpOgorICAgICAgICAgICAgaWYgdHlwZShkYXRhW2tdKSBpcyBkaWN0IG9yIHR5cGUoZGF0YVtrXSkgaXMgdHVwbGUgb3IgdHlwZShkYXRhW2tdKSBpcyBsaXN0OgorICAgICAgICAgICAgICAgIGNoYWdlX3Zhcl9yZWN1cnNpdmVseShkYXRhW2tdLCB2YXJfbGlzdCkKKyAgICAgICAgICAgIGVsaWYgdHlwZShkYXRhW2tdKSBpcyBzdHI6CisgICAgICAgICAgICAgICAgZGF0YVtrXSA9IGNoYW5nZV9zdHJpbmcoZGF0YVtrXSwgdmFyX2xpc3QpCisgICAgaWYgdHlwZShkYXRhKSBpcyBsaXN0OgorICAgICAgICBmb3IgayBpbiByYW5nZSgwLGxlbihkYXRhKSk6CisgICAgICAgICAgICBpZiB0eXBlKGRhdGFba10pIGlzIGRpY3Qgb3IgdHlwZShkYXRhW2tdKSBpcyBsaXN0OgorICAgICAgICAgICAgICAgIGNoYWdlX3Zhcl9yZWN1cnNpdmVseShkYXRhW2tdLCB2YXJfbGlzdCkKKyAgICAgICAgICAgIGVsaWYgdHlwZShkYXRhW2tdKSBpcyBzdHI6CisgICAgICAgICAgICAgICAgZGF0YVtrXSA9IGNoYW5nZV9zdHJpbmcoZGF0YVtrXSwgdmFyX2xpc3QpCisKK2RlZiBjaGFuZ2VfdmFyKGRhdGEpOgorICAgIGlmIHR5cGUoZGF0YSkgaXMgbm90IGRpY3Q6CisgICAgICAgIHJldHVybiAtMSwgIkZvcm1hdCBlcnJvciwgbm90IGEgb2JqZWN0IChkaWN0aW9uYXJ5KSIKKyAgICBpZiAiJHt9IiBub3QgaW4gZGF0YToKKyAgICAgICAgcmV0dXJuIDAsIGRhdGEKKworICAgIHZhcl9saXN0PXt9CisgICAgZm9yIHZhciBpbiBkYXRhWyIke30iXToKKyAgICAgICAgciA9IHZhci5maW5kKCJ9IiwpICsgMQorICAgICAgICBpZiByPD0yIG9yIHZhcls6Ml0gIT0gJyR7JzoKKyAgICAgICAgICAgIHJldHVybiAtMSwgIkZvcm1hdCBlcnJvciBhdCAnJHt9JzoiICsgdmFyCisgICAgICAgICNjaGFuZ2UgdmFyaWFibGVzIGluc2lkZSBkZXNjcmlwdGlvbiB0ZXh0CisgICAgICAgIGlmICIkeyIgaW4gdmFyW3I6XToKKyAgICAgICAgICAgIHZhciA9IHZhcls6cl0gKyBjaGFuZ2Vfc3RyaW5nKHZhcltyOl0sIHZhcl9saXN0KQorICAgICAgICBkX3N0YXJ0ID0gdmFyLnJmaW5kKCIoIiwpICsgMQorICAgICAgICBkX2VuZCAgID0gdmFyLnJmaW5kKCIpIiwpIAorICAgICAgICBpZiBkX3N0YXJ0PjAgYW5kIGRfZW5kPj1kX3N0YXJ0OgorICAgICAgICAgICAgZGVmYXVsdCA9IHZhcltkX3N0YXJ0OmRfZW5kXQorICAgICAgICBlbHNlOiBkZWZhdWx0PU5vbmUKKyAgICAgICAgdiA9IHJhd19pbnB1dCh2YXJbcjpdICsgIj8gIikKKyAgICAgICAgaWYgdj09IiI6CisgICAgICAgICAgICBpZiBkZWZhdWx0ICE9IE5vbmU6CisgICAgICAgICAgICAgICAgdiA9IGRlZmF1bHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdiA9IHJhd19pbnB1dCgiICBlbXB0eSBzdHJpbmc/IHRyeSBhZ2FpbjogIikKKyAgICAgICAgdmFyX2xpc3RbIHZhcls6cl0gXSA9IHN0cih2KSAKKyAgICAKKyAgICBkZWwgZGF0YVsiJHt9Il0KKyAgICBjaGFnZV92YXJfcmVjdXJzaXZlbHkoZGF0YSwgdmFyX2xpc3QpCisgICAgcmV0dXJuIDAsIGRhdGEKKworZGVmIHBhcnNlX3lhbWxfanNvbih0ZXh0KToKKyAgICB0cnk6CisgICAgICAgIGRhdGEgPSB5YW1sLmxvYWQodGV4dCkKKyAgICAgICAgcmV0dXJuIDAsIGRhdGEKKyAgICBleGNlcHQgeWFtbC5ZQU1MRXJyb3IsIGV4YzoKKyAgICAgICAgZXJyb3JfcG9zID0gIiIKKyAgICAgICAgaWYgaGFzYXR0cihleGMsICdwcm9ibGVtX21hcmsnKToKKyAgICAgICAgICAgIG1hcmsgPSBleGMucHJvYmxlbV9tYXJrCisgICAgICAgICAgICBlcnJvcl9wb3MgPSAiIGF0IHBvc2l0aW9uOiAoJXM6JXMpIiAlIChtYXJrLmxpbmUrMSwgbWFyay5jb2x1bW4rMSkKKyAgICAgICAgcmV0dXJuIC0xLCAiIEVycm9yIHlhbWwvanNvbiBmb3JtYXQgZXJyb3IgYXQgIiArIGVycm9yX3BvcworCitkZWYgbG9hZF9maWxlKGZpbGVfLCBwYXJzZT1GYWxzZSk6CisgICAgdHJ5OgorICAgICAgICBmID0gb3BlbihmaWxlXywgJ3InKQorICAgICAgICByZWFkX2RhdGEgPSBmLnJlYWQoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgaWYgbm90IHBhcnNlOgorICAgICAgICAgICAgcmV0dXJuIDAsIHJlYWRfZGF0YQorICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICByZXR1cm4gLTEsICIgRXJyb3Igb3BlbmluZyBmaWxlICciICsgZmlsZV8gKyAiJzogIiArIGUuYXJnc1sxXQorICAgIAorICAgIHRyeToKKyAgICAgICAgZGF0YSA9IHlhbWwubG9hZChyZWFkX2RhdGEpCisgICAgICAgIHJldHVybiBjaGFuZ2VfdmFyKGRhdGEpCisgICAgZXhjZXB0IHlhbWwuWUFNTEVycm9yLCBleGM6CisgICAgICAgIGVycm9yX3BvcyA9ICIiCisgICAgICAgIGlmIGhhc2F0dHIoZXhjLCAncHJvYmxlbV9tYXJrJyk6CisgICAgICAgICAgICBtYXJrID0gZXhjLnByb2JsZW1fbWFyaworICAgICAgICAgICAgZXJyb3JfcG9zID0gIiBhdCBwb3NpdGlvbjogKCVzOiVzKSIgJSAobWFyay5saW5lKzEsIG1hcmsuY29sdW1uKzEpCisgICAgICAgIHJldHVybiAtMiwgIiBFcnJvciB5YW1sL2pzb24gZm9ybWF0IGVycm9yIGF0ICciKyBmaWxlXyArIiciK2Vycm9yX3BvcworCitkZWYgbG9hZF9jb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb25fZmlsZSk6CisgICAgZGVmYXVsdF90b2tlbnMgPXsnaHR0cF9wb3J0Jzo4MDgwLCAnaHR0cF9ob3N0JzonbG9jYWxob3N0JywgJ3Rlc3RfbW9kZSc6RmFsc2UsICdvZl9jb250cm9sbGVyX25ldHNfd2l0aF9zYW1lX3ZsYW4nOlRydWV9CisgICAgCisgICAgciwgY29uZmlnID0gbG9hZF9maWxlKGNvbmZpZ3VyYXRpb25fZmlsZSwgcGFyc2U9VHJ1ZSkKKyAgICBpZiByIDwgMDoKKyAgICAgICAgcmV0dXJuIEZhbHNlLCBjb25maWcKKworICAgICNDaGVjayBkZWZhdWx0IHZhbHVlcyB0b2tlbnMKKyAgICBmb3Igayx2IGluIGRlZmF1bHRfdG9rZW5zLml0ZW1zKCk6CisgICAgICAgIGlmIGsgbm90IGluIGNvbmZpZzogY29uZmlnW2tdPXYKKyAgICAKKyAgICByZXR1cm4gKFRydWUsIGNvbmZpZykKKworaXRlbXNfbGlzdCA9ICgnc2VydmVyJywnaG9zdCcsJ3RlbmFudCcsJ2ltYWdlJywnZmxhdm9yJywnbmV0d29yaycsJ3BvcnQnKQorYWN0aW9uX2xpc3QgPSAoJ2xpc3QnLCdnZXQnLCduZXcnLCdkZWwnLCdlZGl0JywnYWN0aW9uJykKKworCitkZWYgdXNhZ2UoY29tcGxldGU9RmFsc2UpOgorICAgIGdsb2JhbCBpdGVtc19saXN0CisgICAgZ2xvYmFsIGFjdGlvbl9saXN0CisgICAgcHJpbnQgIlVzYWdlOiAiLCBzeXMuYXJndlswXSwgIltvcHRpb25zXSIsICIgWyIgKyAiLCIuam9pbihhY3Rpb25fbGlzdCkgKyJdICIsICI8aXRlbT4gICBbPG90aGVyPl0gIgorICAgIHByaW50ICIgICBQZXJmb3JtIGFuIHRlc3QgYWN0aW9uIG92ZXIgb3BlbnZpbSIKKyAgICBwcmludCAiICAgICAgIisiLCIuam9pbihhY3Rpb25fbGlzdCkrIjogTGlzdCAoYnkgZGVmYXVsdCksIEdFVCBkZXRhaXMsIENyZWF0ZXMsIERlbGV0ZXMsIEVkaXQiCisgICAgcHJpbnQgIiAgICAgIDxpdGVtPjogY2FuIGJlIG9uZSBvZiAiICsgIiwiLmpvaW4oaXRlbXNfbGlzdCkKKyAgICBwcmludCAiICAgICAgPG90aGVyPjogbGlzdCBvZiB1dWlkfG5hbWUgZm9yICdnZXR8ZGVsJzsgbGlzdCBvZiBqc29uL3lhbWwgZmlsZXMgZm9yICduZXcnIG9yICdlZGl0JyIKKyAgICBpZiBub3QgY29tcGxldGU6CisgICAgICAgIHByaW50ICIgICBUeXBlIC1oIG9yIC0taGVscCBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIG9wdGlvbnMiCisgICAgICAgIHJldHVybgorICAgIHByaW50ICIgICBPcHRpb25zOiIKKyAgICBwcmludCAiICAgICAgLXZ8LS12ZXJzaW9uOiBwcmludHMgY3VycmVudCB2ZXJzaW9uIgorICAgIHByaW50ICIgICAgICAtY3wtLWNvbmZpZyBbY29uZmlndXJhdGlvbl9maWxlXTogbG9hZHMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAoZGVmYXVsdDogb3BlbnZpbWQuY2ZnKSIKKyAgICBwcmludCAiICAgICAgLWh8LS1oZWxwOiBzaG93cyB0aGlzIGhlbHAiCisgICAgcHJpbnQgIiAgICAgIC11fC0tdXJsIFtVUkxdOiB1cmwgdG8gdXNlIGluc3RlYWQgb2YgdGhlIG9uZSBsb2FkZWQgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUiCisgICAgcHJpbnQgIiAgICAgIC10fC0tdGVuYW50IFt0ZW5hbnQgdXVpZF06IHRlbmFudCB0byBiZSB1c2VkIGZvciBzb21lIGNvbWFuZHMuIElGIG1pc2luZyBpdCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBvYnRhaW5lZCBpbiBjb25maWd1cmF0aW9uIGZpbGUiCisgICAgcHJpbnQgIiAgICAgIC1GfC0tZmlsdGVyIFtBPUJbJkM9RC4uLl06IFVSTCBxdWVyeSBzdHJpbmcgdXNlZCBmb3IgJ2dldCcgb3IgJ2RlbCcgY29tbWFuZHMiCisgICAgcHJpbnQgIiAgICAgIC1mfC0tZm9yY2UgOiBEbyBub3QgYXNrIGZvciBjb25maXJtYXRpb24gd2hlbiBkZWxldGluZy4gQWxzbyByZW1vdmUgZGVwZW5kZW50IG9iamVjdHMuIgorICAgIHByaW50ICIgICAgICAtcnwtLXJlY3Vyc2l2ZSA6IERlbGV0ZSBhbHNvIGRlcGVuZGVuY3kgZWxlbWVudHMsIChmcm9tIHRlbmFudHM6IGltYWdlcywgZmxhdm9ycyxzZXJ2ZXI7IGZyb20gaG9zdHM6IGluc3RhbmNlczsgLi4uIgorICAgIHByaW50ICIgICBFeGFtcGxlczoiCisgICAgcHJpbnQgIiAgICAgIixzeXMuYXJndlswXSwiIHRlbmFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2xpc3QgdGVuYW50cyAiCisgICAgcHJpbnQgIiAgICAgIixzeXMuYXJndlswXSwiIC1GJ2RldmljZV9vd25lcj1leHRlcm5hbCcgZ2V0IHBvcnQgICAgI2dldCBkZXRhaWxzIG9mIGFsbCBleHRlcm5hbCBwb3J0cyIKKyAgICBwcmludCAiICAgICAiLHN5cy5hcmd2WzBdLCIgZGVsIHNlcnZlciBzZXMgcGFuICAgICAgICAgICAgICAgICAgICAjZGVsZXRlIHNlcnZlciBuYW1lcyAnc2VzJyBhbmQgJ3BhbicuIERvIG5vdCBhc2sgZm9yIGNvbmZpcm1hdGlvbiIKKyAgICBwcmludCAiICAgICAiLHN5cy5hcmd2WzBdLCIgLXIgLWYgZGVsIGhvc3QgICAgICAgICAgICAgICAgICAgICAgICAjZGVsZXRlIGFsbCBob3N0IGFuZCBhbGwgdGhlIGRlcGVuZGVuY2llcyAiCisgICAgcHJpbnQgIiAgICAgIixzeXMuYXJndlswXSwiIG5ldyBob3N0IC4vSG9zdC9uZnYxMDAuanNvbiAgICAgICAgICAgI2FkZCBhIGhvc3Qgd2hpY2ggaW5mb3JtYXRpb24gaXMgaW4gdGhpcyBmaWxlIgorICAgIHByaW50ICIgICAgICIsc3lzLmFyZ3ZbMF0sIiBlZGl0IG5ldHdvcmsgZjM0OGZhZjgtNTllZi0xMWU0LWI0YzctNTI1NDAwMzA1OTRlICAne1wibmV0d29ya1wiOntcImFkbWluX3N0YXRlX3VwXCI6ZmFsc2V9fSciCisgICAgcHJpbnQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NoYW5nZSB0aGUgYWRtaW4gc3RhdHVzIG9mIHRoaXMgbmV0d29yayIKKyAgICByZXR1cm4KKworCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICBnbG9iYWwgdmltVVJJCisgICAgZ2xvYmFsIHZpbVVSSV9hZG1pbgorICAgIAorICAgIGdsb2JhbCB3aGF0CisgICAgZ2xvYmFsIHF1ZXJ5X3N0cmluZworI2luaXQgdmFyaWFibGVzICAgIAorICAgIGFjdGlvbj0ibGlzdCIKKyAgICB3aGF0PU5vbmUKKyAgICB1cmw9Tm9uZQorICAgIHF1ZXJ5X3N0cmluZyA9ICIiCisgICAgZm9yY2UgPSBGYWxzZQorICAgIHJlY3Vyc2l2ZSA9IEZhbHNlCisgICAgdGVuYW50ID0gTm9uZQorICAgIGFkZGl0aW9uYWwgPSBbXQorICAgICNsb29rIGZvciBwYXJlbnQgZGlyCisgICAgY29uZmlnX2ZpbGUgPSAnLi4vb3BlbnZpbWQuY2ZnJworICAgIHBvcyA9IHN5cy5hcmd2WzBdLnJmaW5kKCIvIikKKyAgICBpZiBwb3M8MDoKKyAgICAgICAgYmFzZV9kaXI9Ii4vIgorICAgIGVsc2U6CisgICAgICAgIGJhc2VfZGlyID0gc3lzLmFyZ3ZbMF0gWzpwb3MrMV0KKyAgICBpZiBwb3M+PTA6CisgICAgICAgIGNvbmZpZ19maWxlID0gYmFzZV9kaXIgKyBjb25maWdfZmlsZQorCisjZ2V0IHBhcmFtcyAgICAKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImh2cmZjOnU6dDpGOiIsIAorICAgICAgICAgICAgWyJjb25maWciLCAiaGVscCIsICJ2ZXJzaW9uIiwgImZvcmNlIiwgImZpbHRlciIsInRlbmFudCIsInVybCIsInJlY3Vyc2l2ZSJdKQorICAgIGV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3IsIGVycjoKKyAgICAgICAgcHJpbnQgIiBFcnJvcjoiLCBlcnIgIyB3aWxsIHByaW50IHNvbWV0aGluZyBsaWtlICJvcHRpb24gLWEgbm90IHJlY29nbml6ZWQiCisgICAgICAgIHVzYWdlKCkKKyAgICAgICAgc3lzLmV4aXQoLTIpCisKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvIGluICgiLXYiLCAiLS12ZXJzaW9uIik6CisgICAgICAgICAgICBwcmludCAidGVzdF9vcGVudmltIHZlcnNpb24iLCB2ZXJzaW9uLCAiT2N0IDIwMTQiCisgICAgICAgICAgICBwcmludCAiKGMpIENvcHlyaWdodCBUZWxlZm9uaWNhIgorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgZWxpZiBvIGluICgiLWgiLCAiLS1oZWxwIik6CisgICAgICAgICAgICB1c2FnZShUcnVlKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgZWxpZiBvIGluICgiLWMiLCAiLS1jb25maWciKTogIGNvbmZpZ19maWxlID0gYQorICAgICAgICBlbGlmIG8gaW4gKCItZiIsICItLWZvcmNlIik6ICAgZm9yY2UgPSBUcnVlCisgICAgICAgIGVsaWYgbyBpbiAoIi1yIiwgIi0tcmVjdXJzaXZlIik6ICAgcmVjdXJzaXZlID0gVHJ1ZQorICAgICAgICBlbGlmIG8gaW4gKCItRiIsICItLWZpbHRlciIpOiAgcXVlcnlfc3RyaW5nID0gIj8iK2EKKyAgICAgICAgZWxpZiBvIGluICgiLXUiLCAiLS11cmwiKTogICAgIHVybCA9IGEKKyAgICAgICAgZWxpZiBvIGluICgiLXQiLCAiLS10ZW5hbnQiKTogIHRlbmFudCA9IGEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIlVuaGFuZGxlZCBvcHRpb24iCisKKyAgICBmb3IgYSBpbiBhcmdzOgorICAgICAgICBpZiBsZW4oYSkgPT0gMDoKKyAgICAgICAgICAgIHByaW50ICIgV2FybmluZyEhISBGb3VuZCBhbiBlbXB0eSBwYXJhbWV0ZXI/IgorICAgICAgICBlbGlmIGFbMF09PSItIjoKKyAgICAgICAgICAgIHByaW50ICIgRXJyb3IhISEgUHV0IG9wdGlvbnMgcGFyYW1ldGVyIGF0IHRoZSBiZWdpbm5pbmciCisgICAgICAgICAgICBzeXMuZXhpdCgtMikKKyAgICAgICAgZWxpZiB3aGF0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYWRkaXRpb25hbC5hcHBlbmQoYSkKKyAgICAgICAgZWxpZiBhIGluIGl0ZW1zX2xpc3Q6CisgICAgICAgICAgICB3aGF0PWEKKyAgICAgICAgZWxpZiBhWzotMV0gaW4gaXRlbXNfbGlzdCBhbmQgYVstMV09PSdzJzoKKyAgICAgICAgICAgIHdoYXQ9YVs6LTFdCisgICAgICAgIGVsaWYgYSBpbiBhY3Rpb25fbGlzdDoKKyAgICAgICAgICAgIGFjdGlvbj1hCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiIE1pc3NpbmcgPGl0ZW0+IiwgIiwiLmpvaW4oaXRlbXNfbGlzdCkKKyAgICAgICAgICAgIHN5cy5leGl0KC0yKQorICAgIGlmIHdoYXQgaXMgTm9uZToKKyAgICAgICAgdXNhZ2UoKQorICAgICAgICBzeXMuZXhpdCgtMSkKKyAgICAjTG9hZCBjb25maWd1cmF0aW9uIGZpbGUKKyAgICByLCBjb25maWdfZGljID0gbG9hZF9jb25maWd1cmF0aW9uKGNvbmZpZ19maWxlKQorICAgICNwcmludCBjb25maWdfZGljCisgICAgaWYgbm90IHI6CisgICAgICAgIHByaW50IGNvbmZpZ19kaWMKKyAgICAgICAgY29uZmlnX2RpYz17fQorICAgICAgICAjZXhpdCgtMSkKKyAgICAgICAgCisgICAgI292ZXJyaWRlIHBhcmFtZXRlcnMgb2J0YWluZWQgYnkgY29tbWFuZCBsaW5lCisgICAgdHJ5OgorICAgICAgICBpZiB1cmwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB2aW1VUkkgPSB2aW1VUklfYWRtaW4gPSB1cmwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZpbVVSSSA9ICJodHRwOi8vIiArIGNvbmZpZ19kaWNbJ2h0dHBfaG9zdCddICsiOiIrIHN0cihjb25maWdfZGljWydodHRwX3BvcnQnXSkgKyAiL29wZW52aW0vIgorICAgICAgICAgICAgaWYgJ2h0dHBfYWRtaW5fcG9ydCcgaW4gY29uZmlnX2RpYzoKKyAgICAgICAgICAgICAgICB2aW1VUklfYWRtaW4gPSAiaHR0cDovLyIgKyBjb25maWdfZGljWydodHRwX2hvc3QnXSArIjoiKyBzdHIoY29uZmlnX2RpY1snaHR0cF9hZG1pbl9wb3J0J10pICsgIi9vcGVudmltLyIKKyAgICBleGNlcHQ6ICNrZXkgZXJyb3IgCisgICAgICAgIHByaW50ICIgRXJyb3I6IGNhbiBub3QgZ2V0IFVSTDsgbmVpdGhlciBvcHRpb24gLS11LC11cmwsIG5vciByZWFkaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSIKKyAgICAgICAgZXhpdCgtMSkKKyAgICBpZiB0ZW5hbnQgaXMgTm9uZToKKyAgICAgICAgdGVuYW50ID0gY29uZmlnX2RpYy5nZXQoJ3RlbmFudF9pZCcsIE5vbmUpCisgICAgCisjY2hlY2sgZW5vdWdoIHBhcmFtZXRlcnMKKyAgICBVUkk9dmltVVJJCisgICAgaWYgKHdoYXQgaW4gKCdob3N0JywncG9ydCcpIGFuZCBhY3Rpb24gaW4gKCdkZWwnLCduZXcnKSkgb3IgKHdoYXQ9PSdob3N0JyBhbmQgYWN0aW9uPT0nZWRpdCcgKToKKyAgICAgICAgaWYgdmltVVJJX2FkbWluIGlzIE5vbmU6CisgICAgICAgICAgICBwcmludCAiIEVycm9yOiBDYW4gbm90IGdldCBhZG1pbiBVUkw7IG5laXRoZXIgb3B0aW9uIC10LC0tdGVuYW50LCBub3IgcmVhZGluZyBjb25maWd1cmF0aW9uIGZpbGUiCisgICAgICAgICAgICBleGl0KC0xKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgVVJJPXZpbVVSSV9hZG1pbgorICAgIGlmIFVSSVstMV0gIT0gIi8iOiBVUkkrPSIvIgorICAgIGlmIHdoYXQgaW4gKCdzZXJ2ZXInLCdpbWFnZScsJ2ZsYXZvcicpOgorICAgICAgICBpZiB0ZW5hbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50ICIgRXJyb3I6IENhbiBub3QgZ2V0IHRlbmFudDsgbmVpdGhlciBvcHRpb24gLXQsLS10ZW5hbnQsIG5vciByZWFkaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSIKKyAgICAgICAgICAgIGV4aXQoLTEpCisgICAgICAgIFVSSSArPSB0ZW5hbnQgKyAiLyIKKyAgICAKKyAgICAKKyAgICBleGl0X2NvZGU9MAorICAgIHRyeToKKyNsb2FkIGZpbGUgZm9yIG5ldy9lZGl0CisgICAgICAgIHBheWxvYWRfbGlzdD1bXQorICAgICAgICBpZiBhY3Rpb249PSduZXcnIG9yIGFjdGlvbj09J2VkaXQnIG9yIGFjdGlvbj09J2FjdGlvbic6CisgICAgICAgICAgICBpZiBsZW4oYWRkaXRpb25hbCk9PTA6CisgICAgICAgICAgICAgICAgaWYgYWN0aW9uPT0nbmV3JyA6IAorICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsLmFwcGVuZChiYXNlX2Rpcit3aGF0KyJzL25ld18iK3doYXQrIi55YW1sIikKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICIgTmV3IHdoYXQ/IE1pc3NpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIGNvbXBsZXRlIGFjdGlvbiIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiIFdoYXQgbXVzdCBiZSBlZGl0ZWQ/IE1pc3NpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIGNvbXBsZXRlIGFjdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgtMSkKKyAgICAgICAgICAgIGlmIGFjdGlvbj09J2VkaXQnb3IgYWN0aW9uPT0nYWN0aW9uJzoKKyAgICAgICAgICAgICAgICAjb2J0YWluIG9ubHkgbGFzdCBlbGVtZW50CisgICAgICAgICAgICAgICAgYWRkaXRpb25hbF90ZW1wID0gYWRkaXRpb25hbFs6LTFdCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbCA9IGFkZGl0aW9uYWxbLTE6XQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIGEgaW4gYWRkaXRpb25hbDoKKyAgICAgICAgICAgICAgICByLHBheWxvYWQgPSBsb2FkX2ZpbGUoYSwgcGFyc2U9VHJ1ZSkKKyAgICAgICAgICAgICAgICBpZiByPDA6CisgICAgICAgICAgICAgICAgICAgIGlmIHI9PS0xIGFuZCAieyIgaW4gYSBvciAiOiIgaW4gYToKKyAgICAgICAgICAgICAgICAgICAgICAgICN0cnkgdG8gcGFyc2UgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHIscGF5bG9hZCA9IHBhcnNlX3lhbWxfanNvbihhKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcjwwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0ICgtMSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKC0xKQorICAgICAgICAgICAgICAgIHBheWxvYWRfbGlzdC5hcHBlbmQocGF5bG9hZCkKKyAgICAgICAgICAgIGlmIGFjdGlvbj09J2VkaXQnb3IgYWN0aW9uPT0nYWN0aW9uJzoKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsID0gYWRkaXRpb25hbF90ZW1wCisKKyAgICAgICAgICAgICAgICAKKyNwZXJmb3JtIGFjdGlvbnMgTkVXCisgICAgICAgIGlmIGFjdGlvbj09J25ldyc6CisgICAgICAgICAgICBmb3IgcGF5bG9hZCBpbiBwYXlsb2FkX2xpc3Q6CisgICAgICAgICAgICAgICAgcHJpbnQgIlxuIG5ldyIsIHdoYXQsIGEsICIgICAgID4+Pj4+Pj4+ICIsCisgICAgICAgICAgICAgICAgcixjID0gbmV3X2VsZW1lbnRzKFVSSSt3aGF0KydzJywgcGF5bG9hZCkKKyAgICAgICAgICAgICAgICBpZiByPjA6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJvayIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiZmFpbCIKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlID0gLTEKKyAgICAgICAgICAgICAgICBwcmludCBjCisgICAgICAgICAgICAgICAgI3RyeSB0byBkZWNvZGUKKyAgICAgICAgICAgIGV4aXQoZXhpdF9jb2RlKQorICAgICAgICAgICAgCisgICAgI3BlcmZvcm0gYWN0aW9ucyBHRVQgTElTVCBFRElUIERFTAorICAgICAgICBpZiBsZW4oYWRkaXRpb25hbCk9PTA6CisgICAgICAgICAgICBhZGRpdGlvbmFsPVsiIl0KKyAgICAgICAgZm9yIGEgaW4gYWRkaXRpb25hbDoKKyAgICAgICAgICAgIGZpbHRlcl9xcyA9IHF1ZXJ5X3N0cmluZyAKKyAgICAgICAgICAgIGlmIGEgIT0gIiIgOgorICAgICAgICAgICAgICAgIGlmIGNoZWNrX3ZhbGlkX3V1aWQoYSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihmaWx0ZXJfcXMpID4gMDogIGZpbHRlcl9xcyArPSAiJiIgKyAiaWQ9IiArIHN0cihhKQorICAgICAgICAgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICBmaWx0ZXJfcXMgKz0gIj8iICsgImlkPSIgKyBzdHIoYSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZmlsdGVyX3FzKSA+IDA6ICBmaWx0ZXJfcXMgKz0gIiYiICsgIm5hbWU9IiArIHN0cihhKQorICAgICAgICAgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICBmaWx0ZXJfcXMgKz0gIj8iICsgIm5hbWU9IiArIHN0cihhKQorCisgICAgICAgICAgICBpZiBhY3Rpb249PSdsaXN0JyBvciBhY3Rpb249PSdnZXQnIG9yIGFjdGlvbj09J2VkaXQnb3IgYWN0aW9uPT0nYWN0aW9uJzoKKyAgICAgICAgICAgICAgICB1cmwgPSBVUkkgKyB3aGF0KydzJworICAgICAgICAgICAgICAgIHByaW50IHVybCArIGZpbHRlcl9xcworICAgICAgICAgICAgICAgICNwcmludCAiIGdldCIsIHdoYXQsIGEsICIgICAgID4+Pj4+Pj4+ICIsCisgICAgICAgICAgICAgICAgcixjID0gZ2V0X2VsZW1lbnRzKHVybCArIGZpbHRlcl9xcykKKyAgICAgICAgICAgICAgICBpZiByPDA6ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJmYWlsIgorICAgICAgICAgICAgICAgICAgICBleGl0X2NvZGUgPSAtMQorICAgICAgICAgICAgICAgICAgICBwcmludCBjCisgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICNwcmludCAib2siCisgICAgICAgICAgICAgICAgICAgIGlmIGFjdGlvbj09J2xpc3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQganNvbi5kdW1wcyhjLCBpbmRlbnQ9NCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiBhY3Rpb249PSdnZXQnOgorICAgICAgICAgICAgICAgICAgICAgICAgcjEsYzEgPSBnZXRfZGV0YWlscyh1cmwsIHdoYXQsIGMpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgYWN0aW9uPT0nYWN0aW9uJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxLGMxID0gYWN0aW9uX2RldGFpbHModXJsLCB3aGF0LCBjLCBmb3JjZSwgcGF5bG9hZF9saXN0WzBdKQorICAgICAgICAgICAgICAgICAgICBlbHNlOiAjIGFjdGlvbj09J2VkaXQnOgorICAgICAgICAgICAgICAgICAgICAgICAgcjEsYzEgPSBlZGl0X2RldGFpbHModXJsLCB3aGF0LCBjLCBmb3JjZSwgcGF5bG9hZF9saXN0WzBdKQorICAgICAgICAgICAgICAgICAgICBpZiByMTwwOiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBleGl0X2NvZGUgPSAtMQorICAgICAgICAgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHI+MDogcHJpbnQgIm9rIgorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogcHJpbnQgIm9rIHdpdGggc29tZSBmYWlscyIKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQganNvbi5kdW1wcyhjMSwgaW5kZW50PTQpCisKKyAgICAgICAgICAgIGVsaWYgYWN0aW9uPT0nZGVsJzoKKyAgICAgICAgICAgICAgICByID0gZ2V0X2RlbF9yZWN1cnNpdmUoVVJJLCB3aGF0LCBmaWx0ZXJfcXMsIGZvcmNlLCByZWN1cnNpdmUpCisgICAgICAgICAgICAgICAgaWYgcjwwOiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGV4aXRfY29kZSA9IC0xCisgICAgICAgIGV4aXQoZXhpdF9jb2RlKQorICAgICAgICAgICAgCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICBwcmludCAiIENhbmNlbGVkIgorICAgIAorCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3RfdmltLnNoIGIvdGVzdC90ZXN0X3ZpbS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ODQ0MWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0X3ZpbS5zaApAQCAtMCwwICsxLDU1OCBAQAorIyEvYmluL2Jhc2gKKworIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworIworI2F1dGhvciBBbGZvbnNvIFRpZXJubworIworI3NjcmlwdCB0byB0ZXN0IG9wZW52aW0gd2l0aCB0aGUgY3JlYXRpb24gb2YgZmxhdm9ycyBhbmQgaW50ZXJmYWNlcywgb3BlbmZsb3cgcnVsZXMKKyN1c2luZyBpbWFnZXMgYWxyZWFkeSBpbnNlcnRlZAorIworCitmdW5jdGlvbiB1c2FnZSgpeworICAgIGVjaG8gLWUgInVzYWdlOiAke0JBU0hfU09VUkNFWzBdfSBbT1BUSU9OU10gXG4gIHRlc3Qgb3BlbnZpbSAiCisgICAgZWNobyAtZSAiICBPUFRJT05TOiIKKyAgICBlY2hvIC1lICIgICAgLWYgLS1mb3JjZSAgICAgICBkb2VzIG5vdCBwcm9tcHQgZm9yIGNvbmZpcm1hdGlvbiIKKyAgICBlY2hvIC1lICIgICAgLXYgLS1zYW1lLXZsYW4gICB1c2UgdGhpcyBpZiB0aGUgcGFyYW1ldGVyICdvZl9jb250cm9sbGVyX25ldHNfd2l0aF9zYW1lX3ZsYW4nIgorICAgIGVjaG8gLWUgIiAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBmYWxzZSBhdCBvcGVudmltZC5jZmcgdG8gYXZvaWQgdGVzdCB1bnJlYWxpemFibGUgb3BlbmZsb3cgbmV0cyIKKyAgICBlY2hvIC1lICIgICAgLWggLS1oZWxwICAgICAgICBzaG93cyB0aGlzIGhlbHAiCisgICAgZWNobyAtZSAiICAgIC1jIC0tY3JlYXRlICAgICAgY3JlYXRlIG1hbmFnZW1lbnQgbmV0d29yayBhbmQgdHdvIGltYWdlcyAodmFsaWQgZm9yIHRlc3QgbW9kZSkiCisgICAgZWNobworICAgIGVjaG8gICAgIlRoaXMgc2NyaXB0IHRlc3Qgb3BlbnZpbSwgY3JlYXRpbmcgZmxhdm9ycywgaW1hZ2VzLCB2bXMsIGRlLWF0dGFjaGluZyBkYXRhcGxhbmUgcG9ydCIKKyAgICBlY2hvICAgICJmcm9tIG9uZSBuZXR3b3JrIHRvIG90aGVyIGFuZCB0ZXN0aW5nIG9wZW5mbG93IGdlbmVyYXRlZCBydWxlcy4iCisgICAgZWNobyAgICAiQnkgZGVmYXVsdCAodW5sZXNzIC1jIG9wdGlvbikgdXNlcyBhbmQgYWxyZWFkeSBjcmVhdGVkIG1hbmFnZW1lbnQgbmV0d29yayBhbmQgdHdvIHZhbGlkIGltYWdlcy4iCisgICAgZWNobyAgICAiSWYgLWMgb3B0aW9uIGlzIHNldCwgaXQgY3JlYXRlcyB0aGUgbmV0d29yayBhbmQgaW1hZ2VzIHdpdGggZmFrZSBjb250ZW50IChvbmx5IHVzZWZ1bGwgZm9yIgorICAgIGVjaG8gICAgIm9wZW52aW0gaW4gJ3Rlc3QnIG1vZGUpIFRoaXMgaXMgc3BlY2NpZmllZCBpbiB0aGlzIHNoZWxsIHZhcmlhYmxlczoiCisgICAgZWNobyAgICAiICAgICBWSU1fVEVTVF9ORVRXT1JLX0lOVEVSTkVUIG5hbWUgb2YgdGhlIG1hbWFnZW1lbnQgbmV0d29yayB0byB1c2UiCisgICAgZWNobyAgICAiICAgICBWSU1fVEVTVF9JTUFHRV9QQVRIICAgICAgIHBhdGggb2YgYSB2bSBpbWFnZSB0byB1c2UsIHRoZSBpbWFnZSBpcyBjcmVhdGVkIGlmIG5vdCBleGlzdCIKKyAgICBlY2hvICAgICIgICAgIFZJTV9URVNUX0lNQUdFX1BBVEhfRVhUUkEgcGF0aCBvZiBhbm90aGVyIHZtIGltYWdlIHRvIHVzZSwgdGhlIGltYWdlIGlzIGNyZWF0ZWQgaWYgbm90IGV4aXN0IgorfQorCisjZGV0ZWN0IGlmIGlzIGNhbGxlZCB3aXRoIGEgc291cmNlIHRvIHVzZSB0aGUgJ2V4aXQnLydyZXR1cm4nIGNvbW1hbmQgZm9yIGV4aXRpbmcKK1tbICR7QkFTSF9TT1VSQ0VbMF19ICE9ICQwIF1dICYmIGVjaG8gIkRvIG5vdCBleGVjdXRlIHRoaXMgc2NyaXB0IGFzIFNPVVJDRSIgPiYyICYmIHJldHVybiAxCisKKyNjaGVjayBjb3JyZWN0IGFyZ3VtZW50cworZm9yY2U9bgorc2FtZV92bGFuPW4KK2NyZWF0ZT1uCitmb3IgcGFyYW0gaW4gJCoKK2RvCisgICBpZiBbWyAkcGFyYW0gPT0gLWggXV0gfHwgW1sgJHBhcmFtID09IC0taGVscCBdXQorICAgdGhlbgorICAgICAgIHVzYWdlCisgICAgICAgZXhpdCAwCisgICBlbGlmIFtbICRwYXJhbSA9PSAtdiBdXSB8fCBbWyAkcGFyYW0gPT0gLS1zYW1lLXZsYW4gXV0KKyAgIHRoZW4KKyAgICAgICBzYW1lX3ZsYW49eQorICAgZWxpZiBbWyAkcGFyYW0gPT0gLWYgXV0gfHwgW1sgJHBhcmFtID09IC0tZm9yY2UgXV0KKyAgIHRoZW4KKyAgICAgICBmb3JjZT15CisgICBlbGlmIFtbICRwYXJhbSA9PSAtYyBdXSB8fCBbWyAkcGFyYW0gPT0gLS1jcmVhdGUgXV0KKyAgIHRoZW4KKyAgICAgICBjcmVhdGU9eQorICAgZWxzZQorICAgICAgIGVjaG8gImludmFsaWQgYXJndW1lbnQgJyRwYXJhbSc/IiAmJiAgdXNhZ2UgPiYyICYmIGV4aXQgMQorICAgZmkKK2RvbmUKKworI2RldGVjdCBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldAorZmFpbD0iIgorW1sgJGNyZWF0ZSA9PSBuIF1dICYmIFtbIC16ICRWSU1fVEVTVF9ORVRXT1JLX0lOVEVSTkVUIF1dICYmIGVjaG8gIlZJTV9URVNUX05FVFdPUktfSU5URVJORVQgbm90IGRlZmluZWQiID4mMiAmJiBmYWlsPTEKK1tbICRjcmVhdGUgPT0gbiBdXSAmJiBbWyAteiAkVklNX1RFU1RfSU1BR0VfUEFUSCBdXSAmJiBlY2hvICJWSU1fVEVTVF9JTUFHRV9QQVRIIG5vdCBkZWZpbmVkIiA+JjIgJiYgZmFpbD0xCitbWyAkY3JlYXRlID09IG4gXV0gJiYgW1sgLXogJFZJTV9URVNUX0lNQUdFX1BBVEhfRVhUUkEgXV0gJiYgZWNobyAiVklNX1RFU1RfSU1BR0VfUEFUSF9FWFRSQSBub3QgZGVmaW5lZCIgPiYyICYmIGZhaWw9MQorW1sgLW4gJGZhaWwgXV0gJiYgZXhpdCAxCisKK1tbICRjcmVhdGUgPT0geSBdXSAmJiBbWyAteiAkVklNX1RFU1RfSU1BR0VfUEFUSCBdXSAmJiAgICAgICBWSU1fVEVTVF9JTUFHRV9QQVRIPSIvdGVzdC9wYXRoL29mL2ltYWdlMSIKK1tbICRjcmVhdGUgPT0geSBdXSAmJiBbWyAteiAkVklNX1RFU1RfSU1BR0VfUEFUSF9FWFRSQSBdXSAmJiBWSU1fVEVTVF9JTUFHRV9QQVRIX0VYVFJBPSIvdGVzdC9wYXRoMi9vZi9pbWFnZTIiCitUT0RFTEVURT0iIgorZXhwb3J0IF9leGl0PWRlbGV0ZV9hbmRfZXhpdAorCitmdW5jdGlvbiBkZWxldGVfYW5kX2V4aXQoKXsKKyAgZWNobworICBbWyAkZm9yY2UgIT0geSBdXSAmJiByZWFkIC1lIC1wICIgIFByZXNzIGVudGVyIHRvIGRlbGV0ZSB0aGUgZGVwbG95ZWQgdGhpbmdzICIga2sKKyAgZWNobworICBmb3IgZiBpbiAkVE9ERUxFVEUKKyAgZG8KKyAgICAgIG9wZW52aW0gJHtmJSU6Kn0tZGVsZXRlICAke2YjIyo6fSAtZgorICBkb25lCisgIGV4aXQgJDEKK30KKworCitmdW5jdGlvbiBpc192YWxpZF91dWlkKCl7CisgICAgZWNobyAiJDEiIHwgZ3JlcCAtcSAtRSAnXlswLTlhLWZdezh9LShbMC05YS1mXXs0fS0pezN9WzAtOWEtZl17MTJ9JCcgJiYgcmV0dXJuIDAKKyAgICByZXR1cm4gMQorfQorCitmdW5jdGlvbiBwcm9jZXNzX2NtZCgpeworICAjIHRlc3QgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvcyBjb21tYW5kLCBpZiBmYWlscyBleGVjdXRlIHRoZSAkX2V4aXQgY29tbWFuZAorICAjIHBhcmFtczoKKyAgIyAgIHV1aWQgPHZhcmlhYmxlPiA8cmVzdWx0Li4uPiAgOiB0ZXN0IHRoYXQgdGhlIGZpcnN0IHdvcmQgb2YgPHJlc3VsdD4gaXMgYSB2YWxpZCB1dWlkLCBzdG9yZWQgaXQgYXQgPHZhcmlhYmxlPi4gUHJpbnQgdXVpZAorICAjICAgZmFpbCA8cmVhc29uPiAgIDxyZXN1bHQuLi4+ICA6IHRlc3QgdGhhdCB0aGUgcHJldmlvdXMgY29tbWFuZCBoYXMgZmFpbGVkLiBJZiBub3QgcHJpbnQgdGhlIDxyZWFzb24+IHdoeSBpdCBuZWVkcyB0byBmYWlsCisgICMgICBvayAgIDxyZXN1bHQuLi4+ICAgICAgICAgICAgIDogdGVzdCB0aGF0IHRoZSBwcmV2aW9zIGNvbW1hbmQgaGFzIG5vdCBmYWlsZWQuIFByaW50IE9LCisgIGNtZF9yZXN1bHQ9JD8KKyAgaWYgW1sgJDEgPT0gdXVpZCBdXQorICB0aGVuCisgICAgW1sgJGNtZF9yZXN1bHQgPT0gMCBdXSB8fCAhIHNoaWZ0IDIgfHwgISBlY2hvICJGQUlMOiAkKiIgPiYyIHx8ICRfZXhpdCAxCisgICAgaXNfdmFsaWRfdXVpZCAkMyB8fCAhIHNoaWZ0IDIgfHwgISBlY2hvICJGQUlMOiAkKiIgPiYyIHx8ICRfZXhpdCAxCisgICAgZXZhbCAkMj0kMworICAgIGVjaG8gJDMKKyAgZWxpZiBbWyAkMSA9PSBmYWlsIF1dCisgIHRoZW4KKyAgICBbWyAkY21kX3Jlc3VsdCAhPSAiMCIgXV0gfHwgISBlY2hvICJOT1QgRkFJTDogICQyIiA+JjIgfHwgJF9leGl0IDEKKyAgICBlY2hvICJmYWlsIE9LIiAKKyAgZWxpZiAgW1sgJDEgPT0gb2sgXV0KKyAgdGhlbgorICAgIFtbICRjbWRfcmVzdWx0ID09IDAgXV0gfHwgISBzaGlmdCAxIHx8ICEgZWNobyAiRkFJTDogJCoiID4mMiB8fCAkX2V4aXQgMQorICAgIGVjaG8gT0sKKyAgZmkKKworfQorCitmdW5jdGlvbiB0ZXN0X29mX3J1bGVzKCl7CisgICN0ZXN0IHRoZSBudW1iZXIgb2YgcnVsZXMgb2YgYSBuZXR3b3JrLCB3YWl0IHVudGlsIDEwIHNlY29uZHMKKyAgdGltZW91dF89MTAKKyAgd2hpbGUgdHJ1ZSAKKyAgZG8gI2l0IGNhbiB0YWtlIHNvbWUgc2Vjb25kcyB0byBnZXQgaXQgcmVhZHkKKyAgICByZXN1bHQ9YG9wZW52aW0gb3BlbmZsb3ctbmV0LWxpc3QgJDFgCisgICAgbmJfcnVsZXM9YGVjaG8gJHJlc3VsdCB8IGdyZXAgYWN0aW9ucyAtbyB8IHdjIC1sYAorICAgIFtbICRuYl9ydWxlcyA9PSAkMiBdXSAmJiBlY2hvICJPSyIgJiYgYnJlYWsKKyAgICBbWyAkdGltZW91dF8gPT0gMCBdXSAmJiBlY2hvICJGQUlMICRyZXN1bHQiID4mMiAmJiAkX2V4aXQgMSAgCisgICAgc2xlZXAgMQorICAgIHRpbWVvdXRfPSQoKHRpbWVvdXRfIC0gMSkpCisgIGRvbmUKK30KKworZWNobyAiIFRlc3QgVklNIHdpdGggMyBWTSBkZXBsb3ltZW50cy4gSXQgZGVsZXRlIHRoZSBjcmVhdGVkIGl0ZW1zIGF0IHRoZSBlbmQiCitlY2hvICIgIgorW1sgJGZvcmNlICE9IHkgXV0gJiYgcmVhZCAtZSAtcCAiUHJlc3MgZW50ZXIgdG8gY29udGludWUsIENUUkwrQyB0byBhYm9ydCAiIGtrCisKKworcHJpbnRmICIlLTUwcyIgIjEgICBnZXQgJHtWSU1fVEVTVF9JTUFHRV9QQVRIIyMqL30gaW1hZ2U6ICIKK2ltYWdlMT1gb3BlbnZpbSBpbWFnZS1saXN0IC1GInBhdGg9JHtWSU1fVEVTVF9JTUFHRV9QQVRIfSIgfCBnYXdrICd7cHJpbnQgJDF9J2AKK2lmIGlzX3ZhbGlkX3V1aWQgJGltYWdlMSAKK3RoZW4KKyAgICBlY2hvICRpbWFnZTEKK2Vsc2UKKyAgICAjY3JlYXRlIHRoZSBpbWFnZQorICAgIGVjaG8gbm90IGZvdW5kCisgICAgcHJpbnRmICIlLTUwcyIgIiBiICBjcmVhdGUgJHtWSU1fVEVTVF9JTUFHRV9QQVRIIyMqL30gaW1hZ2U6ICIKKyAgICByZXN1bHQ9YG9wZW52aW0gaW1hZ2UtY3JlYXRlIC0tbmFtZT10ZXN0LWltYWdlMSAtLXBhdGg9JHtWSU1fVEVTVF9JTUFHRV9QQVRIfSAtLWRlc2NyaXB0aW9uPWZvci10ZXN0YAorICAgIHByb2Nlc3NfY21kIHV1aWQgaW1hZ2UxICRyZXN1bHQKKyAgICBUT0RFTEVURT0iaW1hZ2U6JGltYWdlMSAkVE9ERUxFVEUiCitmaQorICAgIAorcHJpbnRmICIlLTUwcyIgIjIgICBnZXQgJHtWSU1fVEVTVF9JTUFHRV9QQVRIX0VYVFJBIyMqL30gaW1hZ2U6ICIKK2ltYWdlMj1gb3BlbnZpbSBpbWFnZS1saXN0IC1GInBhdGg9JHtWSU1fVEVTVF9JTUFHRV9QQVRIX0VYVFJBfSIgfCBnYXdrICd7cHJpbnQgJDF9J2AKK2lmIGlzX3ZhbGlkX3V1aWQgJGltYWdlMiAKK3RoZW4KKyAgICBlY2hvICRpbWFnZTIKK2Vsc2UKKyAgICAjY3JlYXRlIHRoZSBpbWFnZQorICAgIGVjaG8gbm90IGZvdW5kCisgICAgcHJpbnRmICIlLTUwcyIgIiBiICBjcmVhdGUgJHtWSU1fVEVTVF9JTUFHRV9QQVRIX0VYVFJBIyMqL30gaW1hZ2U6ICIKKyAgICByZXN1bHQ9YG9wZW52aW0gaW1hZ2UtY3JlYXRlIC0tbmFtZT10ZXN0LWltYWdlMSAtLXBhdGg9JHtWSU1fVEVTVF9JTUFHRV9QQVRIX0VYVFJBfSAtLWRlc2NyaXB0aW9uPWZvci10ZXN0YAorICAgIHByb2Nlc3NfY21kIHV1aWQgaW1hZ2UyICRyZXN1bHQKKyAgICBUT0RFTEVURT0iaW1hZ2U6JGltYWdlMiAkVE9ERUxFVEUiCitmaQorICAgIAoraWYgW1sgJGNyZWF0ZSA9PSB5IF1dCit0aGVuCisgICAgcHJpbnRmICIlLTUwcyIgIjMgICBjcmVhdGUgbWFuYWdlbWVudCBuZXR3b3JrOiAiCisgICAgcmVzdWx0PWBvcGVudmltIG5ldC1jcmVhdGUgIm5hbWU6IHRlc3RfbWdtdF9uZXQKK3R5cGU6IGJyaWRnZV9tYW4iYAorICAgIHByb2Nlc3NfY21kIHV1aWQgbmV0d29ya19ldGgwICRyZXN1bHQKKyAgICBUT0RFTEVURT0ibmV0OiRuZXR3b3JrX2V0aDAgJFRPREVMRVRFIgorZWxzZQorICAgIHByaW50ZiAiJS01MHMiICIzICAgZ2V0ICR7VklNX1RFU1RfTkVUV09SS19JTlRFUk5FVH0gbmV0d29yazogIgorICAgIHJlc3VsdD1gb3BlbnZpbSBuZXQtbGlzdCAtRiJuYW1lPSRWSU1fVEVTVF9ORVRXT1JLX0lOVEVSTkVUImAKKyAgICBwcm9jZXNzX2NtZCB1dWlkIG5ldHdvcmtfZXRoMCAkcmVzdWx0CitmaQorCitwcmludGYgIiUtNTBzIiAiNCAgIGluc2VydCBmbGF2b3IxOiAiCityZXN1bHQ9YG9wZW52aW0gZmxhdm9yLWNyZWF0ZSAnCistLS0KK2ZsYXZvcjoKKyAgbmFtZTogZmxhdm9yMQorICBkZXNjcmlwdGlvbjogZmxhdm9yIHRvIHRlc3Qgb3BlbnZpbQorICBleHRlbmRlZDogCisgICAgcHJvY2Vzc29yX3Jhbmtpbmc6IDIwNQorICAgIG51bWFzOgorICAgIC0gIG1lbW9yeTogOAorICAgICAgIHBhaXJlZC10aHJlYWRzOiA1CisgICAgICAgaW50ZXJmYWNlczoKKyAgICAgICAtIG5hbWU6IHhlMAorICAgICAgICAgZGVkaWNhdGVkOiAieWVzIgorICAgICAgICAgYmFuZHdpZHRoOiAiMTAgR2JwcyIKKyAgICAgICAgIHZwY2k6ICIwMDAwOjAwOjEwLjAiCisgICAgICAgICAjbWFjX2FkZHJlc3M6ICIxMDoxMDoxMDoxMDoxMDoxMiIKKyAgICAgICAtIG5hbWU6IHhlMQorICAgICAgICAgZGVkaWNhdGVkOiAibm8iCisgICAgICAgICBiYW5kd2lkdGg6ICIxMCBHYnBzIgorICAgICAgICAgdnBjaTogIjAwMDA6MDA6MTEuMCIKKyAgICAgICAgIG1hY19hZGRyZXNzOiAiMTA6MTA6MTA6MTA6MTA6MTMiCisnYAorcHJvY2Vzc19jbWQgdXVpZCBmbGF2b3IxICRyZXN1bHQgCitUT0RFTEVURT0iZmxhdm9yOiRmbGF2b3IxICRUT0RFTEVURSIKKworcHJpbnRmICIlLTUwcyIgIjUgICBpbnNlcnQgbmV0X3B0cDogIgorcmVzdWx0PWBvcGVudmltIG5ldC1jcmVhdGUgJworLS0tCituZXR3b3JrOgorICBuYW1lOiB0ZXN0X25ldF9wdHAKKyAgdHlwZTogcHRwCisnYAorcHJvY2Vzc19jbWQgdXVpZCBuZXRfcHRwICAkcmVzdWx0CitUT0RFTEVURT0ibmV0OiRuZXRfcHRwICRUT0RFTEVURSIKKworcHJpbnRmICIlLTUwcyIgIiBiICBpbnNlcnQgbmV0X2RhdGE6ICIKK3Jlc3VsdD1gb3BlbnZpbSBuZXQtY3JlYXRlICcKKy0tLQorbmV0d29yazoKKyAgbmFtZTogdGVzdF9uZXRfZGF0YQorICB0eXBlOiBkYXRhCisnYAorcHJvY2Vzc19jbWQgdXVpZCBuZXRfZGF0YSAkcmVzdWx0CitUT0RFTEVURT0ibmV0OiRuZXRfZGF0YSAkVE9ERUxFVEUiCisKK3ByaW50ZiAiJS01MHMiICI2ICAgaW5zZXJ0IG5ldF9iaW5kIG5ldHdvcmsgYm91bmQgdG8gbmV0X2RhdGE6ICIKK3Jlc3VsdD1gb3BlbnZpbSBuZXQtY3JlYXRlICduYW1lOiB0ZXN0X25ldF9iaW5kZWQKK3R5cGU6IGRhdGEKK2JpbmRfbmV0OiB0ZXN0X25ldF9kYXRhJ2AKK3Byb2Nlc3NfY21kIHV1aWQgbmV0X2JpbmQgJHJlc3VsdAorVE9ERUxFVEU9Im5ldDokbmV0X2JpbmQgJFRPREVMRVRFIgorCitwcmludGYgIiUtNTBzIiAiNyAgIGluc2VydCBicmlkZ2UgbmV0d29yayBuZXQyOiAiCityZXN1bHQ9YG9wZW52aW0gbmV0LWNyZWF0ZSAnCistLS0KK25ldHdvcms6CisgIG5hbWU6IHRlc3RfYnJpZGdlX25ldDIKKyAgdHlwZTogYnJpZGdlX2RhdGEnYAorcHJvY2Vzc19jbWQgdXVpZCBuZXR3b3JrMiAkcmVzdWx0CitUT0RFTEVURT0ibmV0OiRuZXR3b3JrMiAkVE9ERUxFVEUiCisKK3ByaW50ZiAiJS01MHMiICI4ICAgYWRkIFZNMSBkYXRhcGxhbmUgbm90IGNvbm5lY3RlZDogIgorcmVzdWx0PWBvcGVudmltIHZtLWNyZWF0ZSAiCistLS0KK3NlcnZlcjoKKyAgbmFtZTogdGVzdF9WTTEKKyAgZGVzY3JpdGlvbjogVVMgb3Igc2VydmVyIHdpdGggMSBTUklPViAxIFBBU1NUSFJPVUdICisgIGltYWdlUmVmOiAnJGltYWdlMScKKyAgZmxhdm9yUmVmOiAnJGZsYXZvcjEnCisgIG5ldHdvcmtzOgorICAtIG5hbWU6IG1nbXQwCisgICAgdnBjaTogJzAwMDA6MDA6MGEuMCcKKyAgICB1dWlkOiAke25ldHdvcmtfZXRoMH0KKyAgICBtYWNfYWRkcmVzczogJzEwOjEwOjEwOjEwOjEwOjEwJworICAtIG5hbWU6IGV0aDAKKyAgICB2cGNpOiAnMDAwMDowMDowYi4wJworICAgIHV1aWQ6ICckbmV0d29yazInCisgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDoxMDoxMScKKyJgCitwcm9jZXNzX2NtZCB1dWlkICBzZXJ2ZXIxICRyZXN1bHQKK1RPREVMRVRFPSJ2bTokc2VydmVyMSAkVE9ERUxFVEUiCisKK3ByaW50ZiAiJS01MHMiICI5ICAgYWRkIFZNMiBvdmVyc3Vic2NyaWJlIGZsYXZvcjogIgorcmVzdWx0PWBvcGVudmltIHZtLWNyZWF0ZSAiCistLS0KK3NlcnZlcjoKKyAgbmFtZTogdGVzdF9WTTIKKyAgZGVzY3JpdGlvbjogVVMgb3Igc2VydmVyIHdpdGggZGlyZWN0IG5ldHdvcmsgYXR0YWNoCisgIGltYWdlUmVmOiAnJGltYWdlMScKKyAgZmxhdm9yUmVmOiAnJGZsYXZvcjEnCisgIG5ldHdvcmtzOgorICAtIG5hbWU6IG1nbXQwCisgICAgdnBjaTogJzAwMDA6MDA6MGEuMCcKKyAgICB1dWlkOiAke25ldHdvcmtfZXRoMH0KKyAgICBtYWNfYWRkcmVzczogJzEwOjEwOjEwOjEwOjExOjEwJworICAtIG5hbWU6IGV0aDAKKyAgICB2cGNpOiAnMDAwMDowMDowYi4wJworICAgIHV1aWQ6ICckbmV0d29yazInCisgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDoxMToxMScKKyAgZXh0ZW5kZWQ6CisgICAgcHJvY2Vzc29yX3Jhbmtpbmc6IDIwNQorICAgIG51bWFzOgorICAgIC0gIG1lbW9yeTogOAorICAgICAgIHRocmVhZHM6IDEwCisgICAgICAgaW50ZXJmYWNlczoKKyAgICAgICAtIG5hbWU6IHhlMAorICAgICAgICAgZGVkaWNhdGVkOiAneWVzOnNyaW92JworICAgICAgICAgYmFuZHdpZHRoOiAnMTAgR2JwcycKKyAgICAgICAgIHZwY2k6ICcwMDAwOjAwOjExLjAnCisgICAgICAgICBtYWNfYWRkcmVzczogJzEwOjEwOjEwOjEwOjExOjEyJworICAgICAgICAgdXVpZDogJyRuZXRfcHRwJworICAgIGRldmljZXM6CisgICAgLSB0eXBlOiBkaXNrCisgICAgICBpbWFnZVJlZjogJyRpbWFnZTInCisiYAorcHJvY2Vzc19jbWQgdXVpZCAgc2VydmVyMiAkcmVzdWx0CitUT0RFTEVURT0idm06JHNlcnZlcjIgJFRPREVMRVRFIgorCitwcmludGYgIiUtNTBzIiAiMTAgIHRlc3QgVk0gd2l0aCByZXBlYXRlZCB2cGNpOiAiCityZXN1bHQ9YG9wZW52aW0gdm0tY3JlYXRlICIKKy0tLQorc2VydmVyOgorICBuYW1lOiB0ZXN0X1ZNZmFpbAorICBkZXNjcml0aW9uOiByZXBlYXRlZCBtYWMgYWRkcmVzcworICBpbWFnZVJlZjogJyRpbWFnZTEnCisgIGZsYXZvclJlZjogJyRmbGF2b3IxJworICBuZXR3b3JrczoKKyAgLSBuYW1lOiBtZ210MAorICAgIHZwY2k6ICcwMDAwOjAwOjEwLjAnCisgICAgdXVpZDogJHtuZXR3b3JrX2V0aDB9CisiYAorcHJvY2Vzc19jbWQgZmFpbCAiRHVwbGljYXRlIHZwY2kgMDAwMDowMDoxMC4wIiAkcmVzdWx0CisKK3ByaW50ZiAiJS01MHMiICIgYiAgdGVzdCBWTSB3aXRoIHJlcGVhdGVkIG1hYyBhZGRyZXNzOiAiCityZXN1bHQ9YG9wZW52aW0gdm0tY3JlYXRlICIKKy0tLQorc2VydmVyOgorICBuYW1lOiB0ZXN0X1ZNZmFpbAorICBkZXNjcml0aW9uOiByZXBlYXRlZCBtYWMgYWRkcmVzcworICBpbWFnZVJlZjogJyRpbWFnZTEnCisgIGZsYXZvclJlZjogJyRmbGF2b3IxJworICBuZXR3b3JrczoKKyAgLSBuYW1lOiBtZ210MAorICAgIHZwY2k6ICcwMDAwOjAwOjBhLjAnCisgICAgdXVpZDogJHtuZXR3b3JrX2V0aDB9CisgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDoxMDoxMCcKKyJgCitwcm9jZXNzX2NtZCBmYWlsICJEdXBsaWNhdGUgbWFjIDEwOjEwOjEwOjEwOjEwOjEwIiAkcmVzdWx0CisKKworcHJpbnRmICIlLTUwcyIgIiBjICB0ZXN0IFZNIHdpdGggd3JvbmcgaWZhY2UgbmFtZSBhdCBuZXR3b3JrczogIgorcmVzdWx0PWBvcGVudmltIHZtLWNyZWF0ZSAiCistLS0KK3NlcnZlcjoKKyAgbmFtZTogdGVzdF9WTWZhaWwKKyAgZGVzY3JpdGlvbjogcmVwZWF0ZWQgbWFjIGFkZHJlc3MKKyAgaW1hZ2VSZWY6ICckaW1hZ2UxJworICBmbGF2b3JSZWY6ICckZmxhdm9yMScKKyAgbmV0d29ya3M6CisgIC0gbmFtZTogbWlzc2luZworICAgIHR5cGU6IFBGCisgICAgdXVpZDogJyRuZXRfcHRwJworImAKK3Byb2Nlc3NfY21kIGZhaWwgIndyb25nIGlmYWNlIG5hbWUgYXQgbmV0d29ya3MiICRyZXN1bHQKKworCitwcmludGYgIiUtNTBzIiAiIGQgIHRlc3QgVk0gd2l0aCB3cm9uZyBpZmFjZSB0eXBlIGF0IG5ldHdvcmtzOiAiCityZXN1bHQ9YG9wZW52aW0gdm0tY3JlYXRlICIKKy0tLQorc2VydmVyOgorICBuYW1lOiB0ZXN0X1ZNZmFpbAorICBkZXNjcml0aW9uOiByZXBlYXRlZCBtYWMgYWRkcmVzcworICBpbWFnZVJlZjogJyRpbWFnZTEnCisgIGZsYXZvclJlZjogJyRmbGF2b3IxJworICBuZXR3b3JrczoKKyAgLSBuYW1lOiB4ZTAKKyAgICB0eXBlOiBWRgorICAgIHV1aWQ6ICckbmV0X3B0cCcKKyJgCitwcm9jZXNzX2NtZCBmYWlsICJ3cm9uZyBpZmFjZSB0eXBlIGF0IG5ldHdvcmtzIiAkcmVzdWx0CisKKworcHJpbnRmICIlLTUwcyIgIjExICBhZGQgVk0zIGRhdGFwbGFuZSBjb25uZWN0ZWQ6ICIKK3Jlc3VsdD1gb3BlbnZpbSB2bS1jcmVhdGUgIgorLS0tCitzZXJ2ZXI6CisgIG5hbWU6IHRlc3RfVk0zCisgIGRlc2NyaXRpb246IFVTIG9yIHNlcnZlciB3aXRoIDIgZGF0YXBsYW5lIGNvbm5lY3RlZAorICBpbWFnZVJlZjogJyRpbWFnZTEnCisgIGZsYXZvclJlZjogJyRmbGF2b3IxJworICBuZXR3b3JrczoKKyAgLSBuYW1lOiBtZ210MAorICAgIHZwY2k6ICcwMDAwOjAwOjBhLjAnCisgICAgdXVpZDogJHtuZXR3b3JrX2V0aDB9CisgICAgbWFjX2FkZHJlc3M6ICcxMDoxMDoxMDoxMDoxMjoxMCcKKyAgLSBuYW1lOiBldGgwCisgICAgdnBjaTogJzAwMDA6MDA6MGIuMCcKKyAgICB1dWlkOiAnJG5ldHdvcmsyJworICAgIHR5cGU6IHZpcnR1YWwKKyAgICBtYWNfYWRkcmVzczogJzEwOjEwOjEwOjEwOjEyOjExJworICAtIG5hbWU6IHhlMAorICAgIHR5cGU6IFBGCisgICAgdXVpZDogJyRuZXRfZGF0YScKKyAgLSBuYW1lOiB4ZTEKKyAgICB0eXBlOiBWRgorICAgIHV1aWQ6ICckbmV0X3B0cCcKKyAgICBtYWNfYWRkcmVzczogJzEwOjEwOjEwOjEwOjEyOjEzJworImAKK3Byb2Nlc3NfY21kIHV1aWQgc2VydmVyMyAkcmVzdWx0CitUT0RFTEVURT0idm06JHNlcnZlcjMgJFRPREVMRVRFIgorCitwcmludGYgIiUtNTBzIiAiMTIgIGNoZWNrIDIgb3BlbmZsb3cgcnVsZXMgZm9yIG5ldF9wdHA6ICIKK3Rlc3Rfb2ZfcnVsZXMgJG5ldF9wdHAgMgorCitwcmludGYgIiUtNTBzIiAiMTMgIGNoZWNrIG5ldC1kb3duICBuZXRfcHRwOiAiCityZXN1bHQ9YG9wZW52aW0gbmV0LWRvd24gLWYgJHtuZXRfcHRwfWAKK3Byb2Nlc3NfY21kIG9rICRyZXN1bHQKKworcHJpbnRmICIlLTUwcyIgIiBiICBjaGVjayAwIG9wZW5mbG93IHJ1bGVzIGZvciBuZXRfcHRwOiAiCit0ZXN0X29mX3J1bGVzICRuZXRfcHRwIDAKKworcHJpbnRmICIlLTUwcyIgIiBjICBjaGVjayBuZXQtdXAgIG5ldF9wdHA6ICIKK3Jlc3VsdD1gb3BlbnZpbSBuZXQtdXAgLWYgJHtuZXRfcHRwfWAKK3Byb2Nlc3NfY21kIG9rICRyZXN1bHQKKworcHJpbnRmICIlLTUwcyIgIiBkICBjaGVjayAyIG9wZW5mbG93IHJ1bGVzIGZvciBuZXRfcHRwOiAiCit0ZXN0X29mX3J1bGVzICRuZXRfcHRwIDIKKworcHJpbnRmICIlLTUwcyIgIjE0ICBjaGVjayAwIG9wZW5mbG93IHJ1bGVzIGZvciBuZXRfZGF0YTogIgordGVzdF9vZl9ydWxlcyAkbmV0X2RhdGEgMAorCitbWyAkZm9yY2UgIT0geSBdXSAmJiByZWFkIC1lIC1wICIgIFRlc3QgY29udHJvbCBwbGFuZSwgYW5kIHNlcnZlcjI6eGUwIHRvIHNlcnZlcjM6eGUxIGNvbm5lY3Rpdml0eS4gUHJlc3MgZW50ZXIgdG8gY29udGludWUgIiBraworCitwcmludGYgIiUtNTBzIiAiMTUgIGdldCB4ZTAgaWZhY2UgdXVpZCBmcm9tIHNlcnZlcjE6ICIKK3Jlc3VsdD1gb3BlbnZpbSBwb3J0LWxpc3QgLUYiZGV2aWNlX2lkPSR7c2VydmVyMX0mbmFtZT14ZTAiYAorcHJvY2Vzc19jbWQgdXVpZCBzZXJ2ZXIxX3hlMCAkcmVzdWx0CisKK3ByaW50ZiAiJS01MHMiICIgYiAgZ2V0IHhlMSBpZmFjZSB1dWlkIGZyb20gc2VydmVyMTogIgorcmVzdWx0PWBvcGVudmltIHBvcnQtbGlzdCAtRiJkZXZpY2VfaWQ9JHtzZXJ2ZXIxfSZuYW1lPXhlMSJgCitwcm9jZXNzX2NtZCB1dWlkIHNlcnZlcjFfeGUxICRyZXN1bHQKKworcHJpbnRmICIlLTUwcyIgIiBjICBnZXQgeGUwIGlmYWNlIHV1aWQgZnJvbSBzZXJ2ZXIzOiAiCityZXN1bHQ9YG9wZW52aW0gcG9ydC1saXN0IC1GImRldmljZV9pZD0ke3NlcnZlcjN9Jm5hbWU9eGUwImAKK3Byb2Nlc3NfY21kIHV1aWQgc2VydmVyM194ZTAgJHJlc3VsdAorCitwcmludGYgIiUtNTBzIiAiIGQgIGdldCB4ZTEgaWZhY2UgdXVpZCBmcm9tIHNlcnZlcjM6ICIKK3Jlc3VsdD1gb3BlbnZpbSBwb3J0LWxpc3QgLUYiZGV2aWNlX2lkPSR7c2VydmVyM30mbmFtZT14ZTEiYAorcHJvY2Vzc19jbWQgdXVpZCBzZXJ2ZXIzX3hlMSAkcmVzdWx0CisKK3ByaW50ZiAiJS01MHMiICIgZSAgZ2V0IHhlMCBpZmFjZSB1dWlkIGZyb20gc2VydmVyMzogIgorcmVzdWx0PWBvcGVudmltIHBvcnQtbGlzdCAtRiJkZXZpY2VfaWQ9JHtzZXJ2ZXIyfSZuYW1lPXhlMCJgCitwcm9jZXNzX2NtZCB1dWlkIHNlcnZlcjJfeGUwICRyZXN1bHQKKworcHJpbnRmICIlLTUwcyIgIjE2ICB0ZXN0IHB0cCAzY29ubmV4IHNlcnZlcjE6eGUwIC0+IG5ldF9wdHA6ICIKK3Jlc3VsdD1gb3BlbnZpbSBwb3J0LWVkaXQgJHNlcnZlcjFfeGUwICJuZXR3b3JrX2lkOiAkbmV0X3B0cCIgLWZgCitwcm9jZXNzX2NtZCBmYWlsICJDYW4gbm90IGNvbm5lY3QgMyBpbnRlcmZhY2VzIHRvIHB0cCBuZXR3b3JrIgorCitwcmludGYgIiUtNTBzIiAiMTcgIGF0dGFjaCBzZXJ2ZXIxOnhlMCB0byBuZXRfZGF0YTogIgorcmVzdWx0PWBvcGVudmltIHBvcnQtZWRpdCAkc2VydmVyMV94ZTAgIm5ldHdvcmtfaWQ6ICRuZXRfZGF0YSIgLWZgCitwcm9jZXNzX2NtZCBvayAkcmVzdWx0CisKK3ByaW50ZiAiJS01MHMiICIxOCAgY2hlY2sgMiBvcGVuZmxvdyBydWxlcyBmb3IgbmV0X2RhdGE6ICIKK3Rlc3Rfb2ZfcnVsZXMgJG5ldF9kYXRhIDIKKworW1sgJGZvcmNlICE9IHkgXV0gJiYgcmVhZCAtZSAtcCAiICBUZXN0IHNlcnZlcjE6eGUwIHRvIHNlcnZlcjM6eGUwIGNvbm5lY3Rpdml0eS4gUHJlc3MgZW50ZXIgdG8gY29udGludWUgIiBraworCitpZiBbWyAkc2FtZV92bGFuID09IG4gXV0KK3RoZW4KKworICBwcmludGYgIiUtNTBzIiAiMTkgIGF0dGFjaCBzZXJ2ZXIxOnhlMSB0byBuZXQtZGF0YTogIgorICByZXN1bHQ9YG9wZW52aW0gcG9ydC1lZGl0ICRzZXJ2ZXIxX3hlMSAibmV0d29ya19pZDogJG5ldF9kYXRhIiAtZmAKKyAgcHJvY2Vzc19jbWQgb2sgJHJlc3VsdAorCisgIHByaW50ZiAiJS01MHMiICIgYiAgY2hlY2sgOSBvcGVuZmxvdyBydWxlcyBmb3IgbmV0X2RhdGE6ICIKKyAgdGVzdF9vZl9ydWxlcyAkbmV0X2RhdGEgOQorCisgIFtbICRmb3JjZSAhPSB5IF1dICYmIHJlYWQgLWUgLXAgIiAgVGVzdCBzZXJ2ZXIxOnhlMCxzZXJ2ZXIxOnhlMSxzZXJ2ZXIzOnhlMCBjb25uZWN0aXZpdHkuIFByZXNzIGVudGVyIHRvIGNvbnRpbnVlICIga2sKKworICBwcmludGYgIiUtNTBzIiAiIGMgIHJlLWF0dGFjaCBzZXJ2ZXIzOnhlMSB0byBuZXQtZGF0YTogIgorICByZXN1bHQ9YG9wZW52aW0gcG9ydC1lZGl0ICRzZXJ2ZXIzX3hlMSAibmV0d29ya19pZDogJG5ldF9kYXRhIiAtZmAKKyAgcHJvY2Vzc19jbWQgb2sgJHJlc3VsdAorCisgIHByaW50ZiAiJS01MHMiICIgZCAgY2hlY2sgMTYgb3BlbmZsb3cgcnVsZXMgZm9yIG5ldF9kYXRhOiAiCisgIHRlc3Rfb2ZfcnVsZXMgJG5ldF9kYXRhIDE2CisKKyAgcHJpbnRmICIlLTUwcyIgIiBlICBjaGVjayAwIG9wZW5mbG93IHJ1bGVzIGZvciBuZXRfcHRwOiAiCisgIHRlc3Rfb2ZfcnVsZXMgJG5ldF9wdHAgMAorCisgIFtbICRmb3JjZSAhPSB5IF1dICYmIHJlYWQgLWUgLXAgIiAgVGVzdCBzZXJ2ZXIxOnhlMCxzZXJ2ZXIxOnhlMSxzZXJ2ZXIzOnhlMCxzZXJ2ZXIzOnhlMSBjb25uZWN0aXZpdHkuIFByZXNzIGVudGVyIHRvIGNvbnRpbnVlICIga2sKKworICBwcmludGYgIiUtNTBzIiAiIGYgIGRldGFjaCBzZXJ2ZXIxOnhlMSBmcm9tIG5ldC1kYXRhOiAiCisgIHJlc3VsdD1gb3BlbnZpbSBwb3J0LWVkaXQgJHNlcnZlcjFfeGUxICJuZXR3b3JrX2lkOiBudWxsIiAtZiBgCisgIHByb2Nlc3NfY21kIG9rICRyZXN1bHQKKworICBwcmludGYgIiUtNTBzIiAiIGcgIGRldGFjaCBzZXJ2ZXIzOnhlMSB0byBuZXQtZGF0YTogIgorICByZXN1bHQ9YG9wZW52aW0gcG9ydC1lZGl0ICRzZXJ2ZXIzX3hlMSAibmV0d29ya19pZDogbnVsbCIgLWZgCisgIHByb2Nlc3NfY21kIG9rICRyZXN1bHQKKworICBwcmludGYgIiUtNTBzIiAiIGggIGNoZWNrIDIgb3BlbmZsb3cgcnVsZXMgZm9yIG5ldF9kYXRhOiAiCisgIHRlc3Rfb2ZfcnVsZXMgJG5ldF9kYXRhIDIKKworZWxzZQorICBlY2hvICIxOSAgc2tpcHBpbmcgdW5yZWFsaXphYmxlIHRlc3QgYmVjYXVzZSAtLXNhbWVfdmxhbiBvcHRpb24gIgorZmkKKworcHJpbnRmICIlLTUwcyIgIjIwICBjaGVjayAyIG9wZW5mbG93IHJ1bGVzIGZvciBuZXRfZGF0YTogIgordGVzdF9vZl9ydWxlcyAkbmV0X2RhdGEgMgorCitwcmludGYgIiUtNTBzIiAiIGEgIGF0dGFjaCBzZXJ2ZXIyOnhlMCB0byBuZXRfYmluZDogIgorcmVzdWx0PWBvcGVudmltIHBvcnQtZWRpdCAkc2VydmVyMl94ZTAgIm5ldHdvcmtfaWQ6ICRuZXRfYmluZCIgLWZgCitwcm9jZXNzX2NtZCBvayAkcmVzdWx0CisKK3ByaW50ZiAiJS01MHMiICIgYiAgY2hlY2sgNiBvcGVuZmxvdyBydWxlcyBmb3IgbmV0X2RhdGE6ICIKKyAgICN0eXBlICAgICAgc3JjX25ldAkgICBzcmNfcG9ydCAgICA9PiBkc3RfcG9ydCAgICAgICBkc3RfbmV0CisgICAjdW5pY2FzdCAgIG5ldF9kYXRhICAgICBzZXJ2ZXIxOnhlMCA9PiBzZXJ2ZXIzOnhlMCAgICBuZXRfZGF0YQorICAgI3VuaWNhc3QgICBuZXRfZGF0YSAgICAgc2VydmVyMzp4ZTAgPT4gc2VydmVyMTp4ZTAgICAgbmV0X2RhdGEKKyAgICN1bmljYXN0ICAgbmV0X2RhdGEgICAgIHNlcnZlcjE6eGUwID0+IHNlcnZlcjI6eGUwICAgIG5ldF9iaW5kCisgICAjdW5pY2FzdCAgIG5ldF9kYXRhICAgICBzZXJ2ZXIzOnhlMCA9PiBzZXJ2ZXIyOnhlMCAgICBuZXRfYmluZAorICAgI2Jyb2FkY2FzdCBuZXRfZGF0YSAgICAgc2VydmVyMTp4ZTAgPT4gc2VydmVyMzp4ZTAsc2VydmVyMjp4ZTAgICAgbmV0X2RhdGEsbmV0X2JpbmQKKyAgICNicm9hZGNhc3QgbmV0X2RhdGEgICAgIHNlcnZlcjM6eGUwID0+IHNlcnZlcjE6eGUwLHNlcnZlcjI6eGUwICAgIG5ldF9kYXRhLG5ldF9iaW5kCit0ZXN0X29mX3J1bGVzICRuZXRfZGF0YSA2CisKKworcHJpbnRmICIlLTUwcyIgIiBjICBjaGVjayAzIG9wZW5mbG93IHJ1bGVzIGZvciBuZXRfYmluZDogIgorICAgI3R5cGUgICAgICBzcmNfbmV0CSAgIHNyY19wb3J0ICAgID0+IGRzdF9wb3J0ICAgICAgIGRzdF9uZXQKKyAgICN1bmljYXN0ICAgbmV0X2JpbmQgICAgIHNlcnZlcjI6eGUwID0+IHNlcnZlcjE6eGUwICAgIG5ldF9kYXRhCisgICAjdW5pY2FzdCAgIG5ldF9iaW5kICAgICBzZXJ2ZXIyOnhlMCA9PiBzZXJ2ZXIzOnhlMCAgICBuZXRfZGF0YQorICAgI2Jyb2FkY2FzdCBuZXRfYmluZCAgICAgc2VydmVyMjp4ZTAgPT4gc2VydmVyMTp4ZTAsc2VydmVyMzp4ZTAgICAgbmV0X2RhdGEsbmV0X2RhdGEKK3Rlc3Rfb2ZfcnVsZXMgJG5ldF9iaW5kIDMKKworcHJpbnRmICIlLTUwcyIgIiBkICBhdHRhY2ggc2VydmVyMTp4ZTEgdG8gbmV0X2JpbmQ6ICIKK3Jlc3VsdD1gb3BlbnZpbSBwb3J0LWVkaXQgJHNlcnZlcjFfeGUxICJuZXR3b3JrX2lkOiAkbmV0X2JpbmQiIC1mYAorcHJvY2Vzc19jbWQgb2sgJHJlc3VsdAorCitwcmludGYgIiUtNTBzIiAiIGUgIGNoZWNrIDggb3BlbmZsb3cgcnVsZXMgZm9yIG5ldF9kYXRhOiAiCisgICAjdHlwZSAgICAgIHNyY19uZXQgICAgICBzcmNfcG9ydCAgICA9PiBkc3RfcG9ydCAgICAgICBkc3RfbmV0CisgICAjdW5pY2FzdCAgIG5ldF9kYXRhICAgICBzZXJ2ZXIxOnhlMCA9PiBzZXJ2ZXIzOnhlMCAgICBuZXRfZGF0YQorICAgI3VuaWNhc3QgICBuZXRfZGF0YSAgICAgc2VydmVyMzp4ZTAgPT4gc2VydmVyMTp4ZTAgICAgbmV0X2RhdGEKKyAgICN1bmljYXN0ICAgbmV0X2RhdGEgICAgIHNlcnZlcjE6eGUwID0+IHNlcnZlcjI6eGUwICAgIG5ldF9iaW5kCisgICAjdW5pY2FzdCAgIG5ldF9kYXRhICAgICBzZXJ2ZXIxOnhlMCA9PiBzZXJ2ZXIxOnhlMSAgICBuZXRfYmluZAorICAgI3VuaWNhc3QgICBuZXRfZGF0YSAgICAgc2VydmVyMzp4ZTAgPT4gc2VydmVyMjp4ZTAgICAgbmV0X2JpbmQKKyAgICN1bmljYXN0ICAgbmV0X2RhdGEgICAgIHNlcnZlcjM6eGUwID0+IHNlcnZlcjE6eGUxICAgIG5ldF9iaW5kCisgICAjYnJvYWRjYXN0IG5ldF9kYXRhICAgICBzZXJ2ZXIxOnhlMCA9PiBzZXJ2ZXIzOnhlMCxzZXJ2ZXIyOnhlMCxzZXJ2ZXIxOnhlMSAgICBuZXRfZGF0YSxuZXRfYmluZCxuZXRfYmluZAorICAgI2Jyb2FkY2FzdCBuZXRfZGF0YSAgICAgc2VydmVyMzp4ZTAgPT4gc2VydmVyMTp4ZTAsc2VydmVyMjp4ZTAsc2VydmVyMTp4ZTEgICAgbmV0X2RhdGEsbmV0X2JpbmQsbmV0X2JpbmQKK3Rlc3Rfb2ZfcnVsZXMgJG5ldF9kYXRhIDgKKworCitwcmludGYgIiUtNTBzIiAiIGYgIGNoZWNrIDggb3BlbmZsb3cgcnVsZXMgZm9yIG5ldF9iaW5kOiAiCit0ZXN0X29mX3J1bGVzICRuZXRfYmluZCA4CisKK3ByaW50ZiAiJS01MHMiICIgZCAgcHV0IG5ldF9kYXRhIGRvd246ICIKK3Jlc3VsdD1gb3BlbnZpbSBuZXQtZG93biAkbmV0X2RhdGEgLWZgCitwcm9jZXNzX2NtZCBvayAkcmVzdWx0CisKK3ByaW50ZiAiJS01MHMiICIgZSAgY2hlY2sgMCBvcGVuZmxvdyBydWxlcyBmb3IgbmV0X2RhdGE6ICIKK3Rlc3Rfb2ZfcnVsZXMgJG5ldF9kYXRhIDAKKworcHJpbnRmICIlLTUwcyIgIiBlICBjaGVjayAyIG9wZW5mbG93IHJ1bGVzIGZvciBuZXRfYmluZDogIgordGVzdF9vZl9ydWxlcyAkbmV0X2JpbmQgMgorCisKKworZWNobyAKK2VjaG8gRE9ORQorCiskX2V4aXQgMAorCmRpZmYgLS1naXQgYS91dGlscy9SQURjbGFzcy5weSBiL3V0aWxzL1JBRGNsYXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYmRiYWYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9SQURjbGFzcy5weQpAQCAtMCwwICsxLDE2MTkgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitpbXBvcnQgY29kZQorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisnJycKK0ltcGxlbWVudCB0aGUgbG9naWMgZm9yIG9idGFpbmluZyBjb21wdXRlIG5vZGVzIGluZm9ybWF0aW9uIAorUmVzb3VyY2UgQXZhaWxhYmlsaXR5IERlc2NyaXB0b3IgCisnJycKK19fYXV0aG9yX189IlBhYmxvIE1vbnRlcyIKKworI1RPRE86IHJlbW92ZSB3YXJuaW5ncywgcmVtb3ZlIHVudXNlZCB0aGluZ3MgCisKK2Zyb20gZGVmaW5pdGlvbnNDbGFzcyBpbXBvcnQgZGVmaW5pdGlvbnNDbGFzcworZnJvbSBhdXhpbGlhcnlfZnVuY3Rpb25zIGltcG9ydCBnZXRfc3NoX2Nvbm5lY3Rpb24KK2ltcG9ydCBsaWJ2aXJ0Citmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKK2ltcG9ydCBwYXJhbWlrbyAKK2ltcG9ydCByZQoraW1wb3J0IHlhbWwKKworCitkZWYgZ2V0Q3JlZGVudGlhbHMoY3JlZHMsIGRhdGEpOgorICAgICIiIlVzZWQgYXMgYSBiYWNrdXAgZm9yIGxpYnZpcnQub3BlbkF1dGggaW4gb3JkZXIgdG8gcHJvdmlkZSBwYXNzd29yZCB0aGF0IGNhbWUgd2l0aCBkYXRhLAorICAgIG5vdCB1c2VkIGJ5IHRoZSBtb21lbnQKKyAgICAiIiIKKyAgICBwcmludCAiUkFEY2xhc3M6Z2V0Q3JlZGVudGlhbHMiLCBjcmVkcywgZGF0YQorICAgIGZvciBjcmVkIGluIGNyZWRzOgorICAgICAgICBwcmludCBjcmVkWzFdICsgIjogIiwKKyAgICAgICAgaWYgY3JlZFswXSA9PSBsaWJ2aXJ0LlZJUl9DUkVEX0FVVEhOQU1FOgorICAgICAgICAgICAgY3JlZFs0XSA9IGRhdGEKKyAgICAgICAgZWxpZiBjcmVkWzBdID09IGxpYnZpcnQuVklSX0NSRURfUEFTU1BIUkFTRToKKyAgICAgICAgICAgIGNyZWRbNF0gPSBkYXRhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICByZXR1cm4gMAorCitjbGFzcyBSQURjbGFzcygpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5uYW1lID0gTm9uZQorICAgICAgICBzZWxmLm1hY2hpbmUgPSBOb25lCisgICAgICAgIHNlbGYudXNlciA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXNzd29yZCA9IE5vbmUKKyAgICAgICAgc2VsZi5ub2RlcyA9IGRpY3QoKSAgICAgICAgICAgICAgICAgI0RpY3Rpb25hcnkgb2Ygbm9kZXMuIEtleXMgYXJlIHRoZSBub2RlIGlkLCB2YWx1ZXMgYXJlIE5vZGUoKSBlbGVtZW50cworICAgICAgICBzZWxmLm5yX3Byb2Nlc3NvcnMgPSBOb25lICAgICAgICAgICAjSW50ZWdlci4gTnVtYmVyIG9mIHByb2Nlc3NvcnMgaW4gdGhlIHN5c3RlbSAKKyAgICAgICAgc2VsZi5wcm9jZXNzb3JfZmFtaWx5ID0gTm9uZSAgICAgICAgI0lmIGFsbCBub2RlcyBoYXZlIHRoZSBzYW1lIHZhbHVlIGVxdWFsIHRoZW0sIG90aGVyd2lzZSBrZWVwIGFzIE5vbmUKKyAgICAgICAgc2VsZi5wcm9jZXNzb3JfbWFudWZhY3R1cmVyID0gTm9uZSAgI0lmIGFsbCBub2RlcyBoYXZlIHRoZSBzYW1lIHZhbHVlIGVxdWFsIHRoZW0sIG90aGVyd2lzZSBrZWVwIGFzIE5vbmUKKyAgICAgICAgc2VsZi5wcm9jZXNzb3JfdmVyc2lvbiA9IE5vbmUgICAgICAgI0lmIGFsbCBub2RlcyBoYXZlIHRoZSBzYW1lIHZhbHVlIGVxdWFsIHRoZW0sIG90aGVyd2lzZSBrZWVwIGFzIE5vbmUKKyAgICAgICAgc2VsZi5wcm9jZXNzb3JfZmVhdHVyZXMgPSBOb25lICAgICAgI0lmIGFsbCBub2RlcyBoYXZlIHRoZSBzYW1lIHZhbHVlIGVxdWFsIHRoZW0sIG90aGVyd2lzZSBrZWVwIGFzIE5vbmUKKyAgICAgICAgc2VsZi5tZW1vcnlfdHlwZSA9IE5vbmUgICAgICAgICAgICAgI0lmIGFsbCBub2RlcyBoYXZlIHRoZSBzYW1lIHZhbHVlIGVxdWFsIHRoZW0sIG90aGVyd2lzZSBrZWVwIGFzIE5vbmUKKyAgICAgICAgc2VsZi5tZW1vcnlfZnJlcSA9IE5vbmUgICAgICAgICAgICAgI0lmIGFsbCBub2RlcyBoYXZlIHRoZSBzYW1lIHZhbHVlIGVxdWFsIHRoZW0sIG90aGVyd2lzZSBrZWVwIGFzIE5vbmUKKyAgICAgICAgc2VsZi5tZW1vcnlfbnJfY2hhbm5lbHMgPSBOb25lICAgICAgI0lmIGFsbCBub2RlcyBoYXZlIHRoZSBzYW1lIHZhbHVlIGVxdWFsIHRoZW0sIG90aGVyd2lzZSBrZWVwIGFzIE5vbmUKKyAgICAgICAgc2VsZi5tZW1vcnlfc2l6ZSA9IE5vbmUgICAgICAgICAgICAgI0ludGVnZXIuIFN1bSBvZiB0aGUgbWVtb3J5IGluIGFsbCBub2RlcworICAgICAgICBzZWxmLm1lbW9yeV9odWdlcGFnZV9zeiA9IE5vbmUKKyAgICAgICAgc2VsZi5oeXBlcnZpc29yID0gSHlwZXJ2aXNvcigpICAgICAgI0h5cGVydmlzb3IgaW5mb3JtYXRpb24KKyAgICAgICAgc2VsZi5vcyA9IE9wU3lzKCkgICAgICAgICAgICAgICAgICAgI09wZXJhdGluZyBzeXN0ZW0gaW5mb3JtYXRpb24KKyAgICAgICAgc2VsZi5wb3J0c19saXN0ID0gbGlzdCgpICAgICAgICAgICAgI0xpc3QgY29udGFpbmluZyBhbGwgbmV0d29yayBwb3J0cyBpbiB0aGUgbm9kZS4gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGhhdmluZyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzIHRoZSBzYW1lIHBvcnQgaW4gdGhlIHN5c3RlbQorICAgIAorICAgIAorICAgIGRlZiBvYnRhaW5fUkFEKHNlbGYsIHVzZXIsIHBhc3N3b3JkLCBtYWNoaW5lKToKKyAgICAgICAgIiIiVGhpcyBmdW5jdGlvbiBvYnRhaW5zIHRoZSBSQUQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVtb3RlIHNlcnZlci4KKyAgICAgICAgSXQgdXNlcyBib3RoIGEgc3NoIGFuZCBhIGxpYnZpcnQgY29ubmVjdGlvbi4gCisgICAgICAgIEl0IGlzIGRlc2lyYWJsZSBpbiBmdXR1cmUgdmVyc2lvbnMgZ2V0IHJpZCBvZiB0aGUgc3NoIGNvbm5lY3Rpb24sIGJ1dCBjdXJyZW50bHkgCisgICAgICAgIGxpYnZpcnQgZG9lcyBub3QgcHJvdmlkZSBhbGwgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbi4gCisgICAgICAgIFJldHVybnMgKFRydWUsIFdhcm5pbmcpIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgKEZhbHNlLCA8ZXJyb3I+KSBpbiBjYXNlIG9mIGVycm9yIiIiCisgICAgICAgIHdhcm5pbmdfdGV4dD0iIgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjR2V0IHZpcnNoIGFuZCBzc2ggY29ubmVjdGlvbgorICAgICAgICAgICAgKHJldHVybl9zdGF0dXMsIGNvZGUpID0gZ2V0X3NzaF9jb25uZWN0aW9uKG1hY2hpbmUsIHVzZXIsIHBhc3N3b3JkKQorICAgICAgICAgICAgaWYgbm90IHJldHVybl9zdGF0dXM6CisgICAgICAgICAgICAgICAgcHJpbnQgJ1JBRGNsYXNzLm9idGFpbl9SQUQoKSBlcnJvcjonLCBjb2RlCisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXR1cm5fc3RhdHVzLCBjb2RlKQorICAgICAgICAgICAgc3NoX2Nvbm4gPSBjb2RlCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbl9JUCA9IG1hY2hpbmUKKyAgICAgICAgICAgICNwcmludCAibGlidmlydCBvcGVuIHByZSIKKyAgICAgICAgICAgIHZpcnNoX2Nvbm49bGlidmlydC5vcGVuKCJxZW11K3NzaDovLyIrdXNlcisnQCcrbWFjaGluZSsiL3N5c3RlbSIpCisgICAgICAgICAgICAjdmlyc2hfY29ubj1saWJ2aXJ0Lm9wZW5BdXRoKCJxZW11K3NzaDovLyIrdXNlcisnQCcrbWFjaGluZSsiL3N5c3RlbSIsIAorICAgICAgICAgICAgIyAgICAgICAgW1tsaWJ2aXJ0LlZJUl9DUkVEX0FVVEhOQU1FLCBsaWJ2aXJ0LlZJUl9DUkVEX1BBU1NQSFJBU0UsIGxpYnZpcnQuVklSX0NSRURfVVNFUk5BTUVdLCBnZXRDcmVkZW50aWFscywgcGFzc3dvcmRdLAorICAgICAgICAgICAgIyAgICAgICAgMCkKKyAgICAgICAgICAgICNwcmludCAibGlidmlydCBvcGVuIGFmdGVyIgorICAgICAgICAgICAgCisgICAgIyAgICAgICAgICNTZXQgY29ubmVjdGlvbiBpbmZvbWF0aW9uCisgICAgIyAgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IHNlbGYuc2V0X2Nvbm5lY3Rpb25faW5mbyhtYWNoaW5lLCB1c2VyLCBwYXNzd29yZCkKKyAgICAjICAgICAgICAgaWYgbm90IHJldHVybl9zdGF0dXM6CisgICAgIyAgICAgICAgICAgICByZXR1cm4gKHJldHVybl9zdGF0dXMsICdFcnJvciBpbiAnK21hY2hpbmUrJzogJytjb2RlKQorICAgICAgICAgICAgCisgICAgICAgICAgICAjU2V0IHNlcnZlciBuYW1lCisgICAgICAgICAgICBtYWNoaW5lX25hbWUgPSBnZXRfaG9zdG5hbWUodmlyc2hfY29ubikKKyAgICAgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IHNlbGYuc2V0X25hbWUobWFjaGluZV9uYW1lKQorICAgICAgICAgICAgaWYgbm90IHJldHVybl9zdGF0dXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXR1cm5fc3RhdHVzLCAnRXJyb3IgYXQgc2VsZi5zZXRfbmFtZSBpbiAnK21hY2hpbmUrJzogJytjb2RlKQorICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9IGNvZGUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgI0dldCB0aGUgc2VydmVyIHByb2Nlc3NvcnMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHByb2Nlc3NvcnMgPSBkaWN0KCkKKyAgICAgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IGdldF9wcm9jZXNzb3JfaW5mb3JtYXRpb24oc3NoX2Nvbm4sIHZpcnNoX2Nvbm4sIHByb2Nlc3NvcnMpCisgICAgICAgICAgICBpZiBub3QgcmV0dXJuX3N0YXR1czoKKyAgICAgICAgICAgICAgICByZXR1cm4gKHJldHVybl9zdGF0dXMsICdFcnJvciBhdCBnZXRfcHJvY2Vzc29yX2luZm9ybWF0aW9uIGluICcrbWFjaGluZSsnOiAnK2NvZGUpCisgICAgICAgICAgICB3YXJuaW5nX3RleHQgKz0gY29kZQorICAgICAgICAgICAgCisgICAgICAgICAgICAjR2V0IHRoZSBzZXJ2ZXIgbWVtb3J5IGluZm9ybWF0aW9uCisgICAgICAgICAgICBtZW1vcnlfbm9kZXMgPSBkaWN0KCkKKyAgICAgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IGdldF9tZW1vcnlfaW5mb3JtYXRpb24oc3NoX2Nvbm4sIHZpcnNoX2Nvbm4sIG1lbW9yeV9ub2RlcykKKyAgICAgICAgICAgIGlmIG5vdCByZXR1cm5fc3RhdHVzOgorICAgICAgICAgICAgICAgIHJldHVybiAocmV0dXJuX3N0YXR1cywgJ0Vycm9yIGF0IGdldF9tZW1vcnlfaW5mb3JtYXRpb24gaW4gJyttYWNoaW5lKyc6ICcrY29kZSkKKyAgICAgICAgICAgIHdhcm5pbmdfdGV4dCArPSBjb2RlCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNHZXQgbmljcyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgbmljX3RvcG9sb2d5ID0gZGljdCgpCisgICAgIyAgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IGdldF9uaWNfaW5mb3JtYXRpb25fb2xkKHNzaF9jb25uLCBuaWNfdG9wb2xvZ3kpCisgICAgICAgICAgICAocmV0dXJuX3N0YXR1cywgY29kZSkgPSBnZXRfbmljX2luZm9ybWF0aW9uKHNzaF9jb25uLCB2aXJzaF9jb25uLCBuaWNfdG9wb2xvZ3kpCisgICAgICAgICAgICBpZiBub3QgcmV0dXJuX3N0YXR1czoKKyAgICAgICAgICAgICAgICByZXR1cm4gKHJldHVybl9zdGF0dXMsICdFcnJvciBhdCBnZXRfbmljX2luZm9ybWF0aW9uIGluICcrbWFjaGluZSsnOiAnK2NvZGUpCisgICAgICAgICAgICB3YXJuaW5nX3RleHQgKz0gY29kZQorICAgICAgICAgICAgCisgICAgICAgICAgICAjUGFjayBlYWNoIHByb2Nlc3NvciwgbWVtb3J5IG5vZGUgIGFuZCBuaWNzIGluIGEgbm9kZSBlbGVtZW50CisgICAgICAgICAgICAjYW5kIGFkZCB0aGUgbm9kZSB0byB0aGUgUkFEIGVsZW1lbnQKKyAgICAgICAgICAgIGZvciBzb2NrZXRfaWQsIHByb2Nlc3NvciBpbiBwcm9jZXNzb3JzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIG5vZGUgPSBOb2RlKCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc29ja2V0X2lkIGluIG5pY190b3BvbG9neToKKyAgICAgICAgICAgICAgICAgICAgbmljX3RvcG9sb2d5W3NvY2tldF9pZF0gPSBsaXN0KCkKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgKHJldHVybl9zdGF0dXMsIGNvZGUpID0gbm9kZS5zZXQocHJvY2Vzc29yLCBtZW1vcnlfbm9kZXNbc29ja2V0X2lkXSwgbmljX3RvcG9sb2d5W3NvY2tldF9pZF0pCisgICAgIyAgICAgICAgICAgICBlbHNlOgorICAgICMgICAgICAgICAgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IG5vZGUuc2V0KHByb2Nlc3NvciwgbWVtb3J5X25vZGVzW3NvY2tldF9pZF0pCisgICAgICAgICAgICAgICAgaWYgbm90IHJldHVybl9zdGF0dXM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0dXJuX3N0YXR1cywgJ0Vycm9yIGF0IG5vZGUuc2V0IGluICcrbWFjaGluZSsnOiAnK2NvZGUpCisgICAgICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9IGNvZGUKKyAgICAgICAgICAgICAgICAocmV0dXJuX3N0YXR1cywgY29kZSkgPSBzZWxmLmluc2VydF9ub2RlKG5vZGUpCisgICAgICAgICAgICAgICAgaWYgbm90IHJldHVybl9zdGF0dXM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0dXJuX3N0YXR1cywgJ0Vycm9yIGF0IHNlbGYuaW5zZXJ0X25vZGUgaW4gJyttYWNoaW5lKyc6ICcrY29kZSkKKyAgICAgICAgICAgICAgICBpZiBjb2RlIG5vdCBpbiB3YXJuaW5nX3RleHQ6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdfdGV4dCArPSBjb2RlCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNGaWxsIG9zIGRhdGEKKyAgICAgICAgICAgIG9zID0gT3BTeXMoKQorICAgICAgICAgICAgKHJldHVybl9zdGF0dXMsIGNvZGUpID0gZ2V0X29zX2luZm9ybWF0aW9uKHNzaF9jb25uLCBvcykKKyAgICAgICAgICAgIGlmIG5vdCByZXR1cm5fc3RhdHVzOgorICAgICAgICAgICAgICAgIHJldHVybiAocmV0dXJuX3N0YXR1cywgJ0Vycm9yIGF0IGdldF9vc19pbmZvcm1hdGlvbiBpbiAnK21hY2hpbmUrJzogJytjb2RlKQorICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9IGNvZGUKKyAgICAgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IHNlbGYuc2V0X29zKG9zKQorICAgICAgICAgICAgaWYgbm90IHJldHVybl9zdGF0dXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXR1cm5fc3RhdHVzLCAnRXJyb3IgYXQgc2VsZi5zZXRfb3MgaW4gJyttYWNoaW5lKyc6ICcrY29kZSkKKyAgICAgICAgICAgIHdhcm5pbmdfdGV4dCArPSBjb2RlCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNGaWxsIGh5cGVydmlzb3IgZGF0YQorICAgICAgICAgICAgaHlwZXJ2aXNvciA9IEh5cGVydmlzb3IoKQorICAgICAgICAgICAgKHJldHVybl9zdGF0dXMsIGNvZGUpID0gZ2V0X2h5cGVydmlzb3JfaW5mb3JtYXRpb24odmlyc2hfY29ubiwgaHlwZXJ2aXNvcikKKyAgICAgICAgICAgIGlmIG5vdCByZXR1cm5fc3RhdHVzOgorICAgICAgICAgICAgICAgIHJldHVybiAocmV0dXJuX3N0YXR1cywgJ0Vycm9yIGF0IGdldF9oeXBlcnZpc29yX2luZm9ybWF0aW9uIGluICcrbWFjaGluZSsnOiAnK2NvZGUpCisgICAgICAgICAgICB3YXJuaW5nX3RleHQgKz0gY29kZQorICAgICAgICAgICAgKHJldHVybl9zdGF0dXMsIGNvZGUpID0gc2VsZi5zZXRfaHlwZXJ2aXNvcihoeXBlcnZpc29yKQorICAgICAgICAgICAgaWYgbm90IHJldHVybl9zdGF0dXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXR1cm5fc3RhdHVzLCAnRXJyb3IgYXQgc2VsZi5zZXRfaHlwZXJ2aXNvciBpbiAnK21hY2hpbmUrJzogJytjb2RlKQorICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9IGNvZGUKKyAgICAgICAgICAgIHNzaF9jb25uLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiAoVHJ1ZSwgd2FybmluZ190ZXh0KQorICAgICAgICBleGNlcHQgbGlidmlydC5saWJ2aXJ0RXJyb3IsIGU6CisgICAgICAgICAgICB0ZXh0ID0gZS5nZXRfZXJyb3JfbWVzc2FnZSgpCisgICAgICAgICAgICBwcmludCAnUkFEY2xhc3Mub2J0YWluX1JBRCgpIGV4Y2VwdGlvbjonLCB0ZXh0CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCB0ZXh0KQorICAgICAgICBleGNlcHQgcGFyYW1pa28uc3NoX2V4Y2VwdGlvbi5TU0hFeGNlcHRpb24sIGU6CisgICAgICAgICAgICB0ZXh0ID0gZS5hcmdzWzBdCisgICAgICAgICAgICBwcmludCAgIm9idGFpbl9SQUQgc3NoIEV4Y2VwdGlvbjoiLCB0ZXh0CisgICAgICAgICAgICByZXR1cm4gRmFsc2UsIHRleHQKKworICAgIGRlZiBzZXRfbmFtZShzZWxmLG5hbWUpOgorICAgICAgICAiIiJTZXRzIHRoZSBtYWNoaW5lIG5hbWUuIAorICAgICAgICBSZXR1cm5zIChUcnVlLFdhcm5pbmcpIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgKCdGYWxzZScsPGVycm9yIGRlc2NyaXB0aW9uPikgaW4gY2FzZSBvZiBlcnJvciIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lLHN0cik6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIHZhcmlhYmxlIFwnbmFtZVwnIG11c3QgYmUgdGV4dCcpCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgcmV0dXJuIChUcnVlLCAiIikKKyAgICAKKyAgICBkZWYgc2V0X2Nvbm5lY3Rpb25faW5mbyhzZWxmLCBtYWNoaW5lLCB1c2VyLCBwYXNzd29yZCk6CisgICAgICAgICIiIlNldHMgdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24uIAorICAgICAgICBSZXR1cm5zIChUcnVlLFdhcm5pbmcpIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgKCdGYWxzZScsPGVycm9yIGRlc2NyaXB0aW9uPikgaW4gY2FzZSBvZiBlcnJvciIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShtYWNoaW5lLHN0cik6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIHZhcmlhYmxlIFwnbWFjaGluZVwnIG11c3QgYmUgdGV4dCcpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHVzZXIsc3RyKToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgdmFyaWFibGUgXCd1c2VyXCcgbXVzdCBiZSB0ZXh0JykKKyMgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYXNzd29yZCxzdHIpOgorIyAgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIHZhcmlhYmxlIFwncGFzc3dvcmRcJyBtdXN0IGJlIHRleHQnKQorICAgICAgICAoc2VsZi5tYWNoaW5lLCBzZWxmLnVzZXIsIHNlbGYucGFzc3dvcmQpID0gKG1hY2hpbmUsIHVzZXIsIHBhc3N3b3JkKQorICAgICAgICByZXR1cm4gKFRydWUsICIiKQorICAgICAgICAKKyAgICBkZWYgaW5zZXJ0X25vZGUoc2VsZixub2RlKToKKyAgICAgICAgIiIiSW5zZXJ0cyBhIG5ldyBub2RlIGFuZCB1cGRhdGVzIGNsYXNzIHZhcmlhYmxlcy4gCisgICAgICAgIFJldHVybnMgKFRydWUsV2FybmluZykgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCAoJ0ZhbHNlJyw8ZXJyb3IgZGVzY3JpcHRpb24+KSBpbiBjYXNlIG9mIGVycm9yIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUsTm9kZSk6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIHZhcmlhYmxlIFwnbm9kZVwnIG11c3QgYmUgYSBOb2RlIGVsZW1lbnQnKQorICAgICAgICAKKyAgICAgICAgaWYgbm9kZS5pZF8gaW4gc2VsZi5ub2RlczoKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgbm9kZSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIG5vZGVzIGxpc3QuJykKKyAgICAgICAgCisgICAgICAgICNDaGVjayBpZiBuZXR3b3JrIHBvcnRzIGhhdmUgbm90IGJlZW4gaW5zZXJ0ZWQgcHJldmlvdXNseSBhcyBwYXJ0IG9mIGFub3RoZXIgbm9kZQorICAgICAgICBmb3IgcG9ydF9rZXkgaW4gbm9kZS5wb3J0c19saXN0OgorICAgICAgICAgICAgaWYgcG9ydF9rZXkgaW4gc2VsZi5wb3J0c19saXN0OgorICAgICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdOZXR3b3JrIHBvcnQgJytwb3J0X2tleSsnIGRlZmluZWQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHN5c3RlbScpCisgICAgICAgICAgICBzZWxmLnBvcnRzX2xpc3QuYXBwZW5kKHBvcnRfa2V5KQorICAgICAgICAKKyAgICAgICAgI0luc2VydCB0aGUgbmV3IG5vZGUKKyAgICAgICAgc2VsZi5ub2Rlc1tub2RlLmlkX10gPSBub2RlCisgICAgICAgIAorICAgICAgICAjdXBkYXRlIHZhcmlhYmxlcworICAgICAgICBzZWxmLnVwZGF0ZV92YXJpYWJsZXMoKQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChUcnVlLCAiIikKKyAgICAKKyAgICBkZWYgdXBkYXRlX3ZhcmlhYmxlcyhzZWxmKToKKyAgICAgICAgIiIiVXBkYXRlcyBjbGFzcyB2YXJpYWJsZXMuIAorICAgICAgICBSZXR1cm5zIChUcnVlLFdhcm5pbmcpIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgKCdGYWxzZScsPGVycm9yIGRlc2NyaXB0aW9uPikgaW4gY2FzZSBvZiBlcnJvciIiIgorICAgICAgICB3YXJuaW5nX3RleHQ9IiIKKyAgICAgICAgI1RoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhbmQgbm9kZXMgaXMgdGhlIHNhbWUKKyAgICAgICAgc2VsZi5ucl9wcm9jZXNzb3JzID0gbGVuKHNlbGYubm9kZXMpCisgICAgICAgIAorICAgICAgICAjSWYgYWxsIHByb2Nlc3NvcnMgYXJlIHRoZSBzYW1lIGdldCB0aGUgdmFsdWVzLiBPdGhlcndpc2Uga2VlcCB0aGVtIGFzIG5vbmUKKyAgICAgICAgcHJldl9wcm9jZXNzb3JfZmFtaWx5ID0gcHJldl9wcm9jZXNzb3JfbWFudWZhY3R1cmVyID0gcHJldl9wcm9jZXNzb3JfdmVyc2lvbiA9IHByZXZfcHJvY2Vzc29yX2ZlYXR1cmVzID0gTm9uZQorICAgICAgICBkaWZmZXJlbnRfcHJvY2Vzc29yX2ZhbWlseSA9IGRpZmZlcmVudF9wcm9jZXNzb3JfbWFudWZhY3R1cmVyID0gZGlmZmVyZW50X3Byb2Nlc3Nvcl92ZXJzaW9uID0gZGlmZmVyZW50X3Byb2Nlc3Nvcl9mZWF0dXJlcyA9IEZhbHNlCisgICAgICAgIGZvciBub2RlIGluIHNlbGYubm9kZXMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgKHNlbGYucHJvY2Vzc29yX2ZhbWlseSwgc2VsZi5wcm9jZXNzb3JfbWFudWZhY3R1cmVyLCBzZWxmLnByb2Nlc3Nvcl92ZXJzaW9uLCBzZWxmLnByb2Nlc3Nvcl9mZWF0dXJlcykgPSBub2RlLmdldF9wcm9jZXNzb3JfaW5mbygpCisgICAgICAgICAgICBpZiBwcmV2X3Byb2Nlc3Nvcl9mYW1pbHkgIT0gTm9uZSBhbmQgc2VsZi5wcm9jZXNzb3JfZmFtaWx5ICE9IHByZXZfcHJvY2Vzc29yX2ZhbWlseToKKyAgICAgICAgICAgICAgICBkaWZmZXJlbnRfcHJvY2Vzc29yX2ZhbWlseSA9IFRydWUKKyAgICAgICAgICAgIGlmIHByZXZfcHJvY2Vzc29yX21hbnVmYWN0dXJlciAhPSBOb25lIGFuZCBzZWxmLnByb2Nlc3Nvcl9tYW51ZmFjdHVyZXIgIT0gcHJldl9wcm9jZXNzb3JfbWFudWZhY3R1cmVyOgorICAgICAgICAgICAgICAgIGRpZmZlcmVudF9wcm9jZXNzb3JfbWFudWZhY3R1cmVyID0gVHJ1ZQorICAgICAgICAgICAgaWYgcHJldl9wcm9jZXNzb3JfdmVyc2lvbiAhPSBOb25lIGFuZCBzZWxmLnByb2Nlc3Nvcl92ZXJzaW9uICE9IHByZXZfcHJvY2Vzc29yX3ZlcnNpb246CisgICAgICAgICAgICAgICAgZGlmZmVyZW50X3Byb2Nlc3Nvcl92ZXJzaW9uID0gVHJ1ZQorICAgICAgICAgICAgaWYgcHJldl9wcm9jZXNzb3JfZmVhdHVyZXMgIT0gTm9uZSBhbmQgc2VsZi5wcm9jZXNzb3JfZmVhdHVyZXMgIT0gcHJldl9wcm9jZXNzb3JfZmVhdHVyZXM6CisgICAgICAgICAgICAgICAgZGlmZmVyZW50X3Byb2Nlc3Nvcl9mZWF0dXJlcyA9IFRydWUKKyAgICAgICAgICAgIChwcmV2X3Byb2Nlc3Nvcl9mYW1pbHksIHByZXZfcHJvY2Vzc29yX21hbnVmYWN0dXJlciwgcHJldl9wcm9jZXNzb3JfdmVyc2lvbiwgcHJldl9wcm9jZXNzb3JfZmVhdHVyZXMpID0gKHNlbGYucHJvY2Vzc29yX2ZhbWlseSwgc2VsZi5wcm9jZXNzb3JfbWFudWZhY3R1cmVyLCBzZWxmLnByb2Nlc3Nvcl92ZXJzaW9uLCBzZWxmLnByb2Nlc3Nvcl9mZWF0dXJlcykKKworICAgICAgICBpZiBkaWZmZXJlbnRfcHJvY2Vzc29yX2ZhbWlseToKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yX2ZhbWlseSA9IE5vbmUKKyAgICAgICAgaWYgZGlmZmVyZW50X3Byb2Nlc3Nvcl9mZWF0dXJlczoKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yX2ZlYXR1cmVzID0gTm9uZQorICAgICAgICBpZiBkaWZmZXJlbnRfcHJvY2Vzc29yX21hbnVmYWN0dXJlcjoKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yX21hbnVmYWN0dXJlciA9IE5vbmUKKyAgICAgICAgaWYgZGlmZmVyZW50X3Byb2Nlc3Nvcl92ZXJzaW9uOgorICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3JfdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgICAgIAorICAgICAgICAjSWYgYWxsIG1lbW9yeSBub2RlcyBhcmUgdGhlIHNhbWUgZ2V0IHRoZSB2YWx1ZXMuIE90aGVyd2lzZSBrZWVwIHRoZW0gYXMgbm9uZQorICAgICAgICAjU3VtIHRoZSB0b3RhbCBtZW1vcnkKKyAgICAgICAgc2VsZi5tZW1vcnlfc2l6ZSA9IDAKKyAgICAgICAgZGlmZmVyZW50X21lbW9yeV9mcmVxID0gZGlmZmVyZW50X21lbW9yeV9ucl9jaGFubmVscyA9IGRpZmZlcmVudF9tZW1vcnlfdHlwZSA9IGRpZmZlcmVudF9tZW1vcnlfaHVnZXBhZ2Vfc3ogPSBGYWxzZQorICAgICAgICBwcmV2X21lbW9yeV9mcmVxID0gcHJldl9tZW1vcnlfbnJfY2hhbm5lbHMgPSBwcmV2X21lbW9yeV90eXBlID0gcHJldl9tZW1vcnlfaHVnZXBhZ2Vfc3ogPSBOb25lCisgICAgICAgIGZvciBub2RlIGluIHNlbGYubm9kZXMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgKHNlbGYubWVtb3J5X2ZyZXEsIHNlbGYubWVtb3J5X25yX2NoYW5uZWxzLCBzZWxmLm1lbW9yeV90eXBlLCBtZW1vcnlfc2l6ZSwgc2VsZi5tZW1vcnlfaHVnZXBhZ2Vfc3opID0gbm9kZS5nZXRfbWVtb3J5X2luZm8oKQorICAgICAgICAgICAgc2VsZi5tZW1vcnlfc2l6ZSArPSBtZW1vcnlfc2l6ZSAKKyAgICAgICAgICAgIGlmIHByZXZfbWVtb3J5X2ZyZXEgIT0gTm9uZSBhbmQgc2VsZi5tZW1vcnlfZnJlcSAhPSBwcmV2X21lbW9yeV9mcmVxOgorICAgICAgICAgICAgICAgIGRpZmZlcmVudF9tZW1vcnlfZnJlcSA9IFRydWUKKyAgICAgICAgICAgIGlmIHByZXZfbWVtb3J5X25yX2NoYW5uZWxzICE9IE5vbmUgYW5kIHNlbGYubWVtb3J5X25yX2NoYW5uZWxzICE9IHByZXZfbWVtb3J5X25yX2NoYW5uZWxzOgorICAgICAgICAgICAgICAgIGRpZmZlcmVudF9tZW1vcnlfbnJfY2hhbm5lbHMgPSBUcnVlCisgICAgICAgICAgICBpZiBwcmV2X21lbW9yeV90eXBlICE9IE5vbmUgYW5kIHNlbGYubWVtb3J5X3R5cGUgIT0gcHJldl9tZW1vcnlfdHlwZToKKyAgICAgICAgICAgICAgICBkaWZmZXJlbnRfbWVtb3J5X3R5cGUgPSBUcnVlCisgICAgICAgICAgICBpZiBwcmV2X21lbW9yeV9odWdlcGFnZV9zeiAhPSBOb25lIGFuZCBzZWxmLm1lbW9yeV9odWdlcGFnZV9zeiAhPSBwcmV2X21lbW9yeV9odWdlcGFnZV9zejoKKyAgICAgICAgICAgICAgICBkaWZmZXJlbnRfbWVtb3J5X2h1Z2VwYWdlX3N6ID0gVHJ1ZQorICAgICAgICAgICAgKHByZXZfbWVtb3J5X2ZyZXEsIHByZXZfbWVtb3J5X25yX2NoYW5uZWxzLCBwcmV2X21lbW9yeV90eXBlLCBwcmV2X21lbW9yeV9odWdlcGFnZV9zeikgPSAoc2VsZi5tZW1vcnlfZnJlcSwgc2VsZi5tZW1vcnlfbnJfY2hhbm5lbHMsIHNlbGYubWVtb3J5X3R5cGUsIHNlbGYubWVtb3J5X2h1Z2VwYWdlX3N6KQorICAgICAgICAgICAgCisgICAgICAgIGlmIGRpZmZlcmVudF9tZW1vcnlfZnJlcToKKyAgICAgICAgICAgIHNlbGYubWVtb3J5X2ZyZXEgPSBOb25lCisgICAgICAgIGlmIGRpZmZlcmVudF9tZW1vcnlfbnJfY2hhbm5lbHM6CisgICAgICAgICAgICBzZWxmLm1lbW9yeV9ucl9jaGFubmVscyA9IE5vbmUKKyAgICAgICAgaWYgZGlmZmVyZW50X21lbW9yeV90eXBlOgorICAgICAgICAgICAgc2VsZi5tZW1vcnlfdHlwZSA9IE5vbmUKKyAgICAgICAgaWYgZGlmZmVyZW50X21lbW9yeV9odWdlcGFnZV9zejoKKyAgICAgICAgICAgIHdhcm5pbmdfdGV4dCArPSAnRGV0ZWN0ZWQgZGlmZmVyZW50IGh1Z2VwYWdlcyBzaXplIGluIGRpZmZlcmVudCBzb2NrZXRzXG4nCisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIChUcnVlLCB3YXJuaW5nX3RleHQpCisgICAgICAgIAorICAgIGRlZiBzZXRfaHlwZXJ2aXNvcihzZWxmLGh5cGVydmlzb3IpOgorICAgICAgICAiIiJTZXRzIHRoZSBoeXBlcnZpc29yLiAKKyAgICAgICAgUmV0dXJucyAoVHJ1ZSxXYXJuaW5nKSBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kICgnRmFsc2UnLDxlcnJvciBkZXNjcmlwdGlvbj4pIGluIGNhc2Ugb2YgZXJyb3IiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaHlwZXJ2aXNvcixIeXBlcnZpc29yKToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgdmFyaWFibGUgXCdoeXBlcnZpc29yXCcgbXVzdCBiZSBvZiBjbGFzcyBIeXBlcnZpc29yJykKKyAgICAgICAgCisgICAgICAgIHNlbGYuaHlwZXJ2aXNvci5hc3NpZ24oaHlwZXJ2aXNvcikgCisgICAgICAgIHJldHVybiAoVHJ1ZSwgIiIpCisgICAgCisgICAgZGVmIHNldF9vcyhzZWxmLG9zKToKKyAgICAgICAgIiIiU2V0cyB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gCisgICAgICAgIFJldHVybnMgKFRydWUsV2FybmluZykgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCAoJ0ZhbHNlJyw8ZXJyb3IgZGVzY3JpcHRpb24+KSBpbiBjYXNlIG9mIGVycm9yIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9zLE9wU3lzKToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgdmFyaWFibGUgXCdvc1wnIG11c3QgYmUgb2YgY2xhc3MgT3BTeXMnKQorICAgICAgICAKKyAgICAgICAgc2VsZi5vcy5hc3NpZ24ob3MpCisgICAgICAgIHJldHVybiAoVHJ1ZSwgIiIpCisgICAgCisgICAgZGVmIHRvX3RleHQoc2VsZik6CisgICAgICAgIHRleHQ9ICduYW1lOiAnK3N0cihzZWxmLm5hbWUpKydcbicKKyAgICAgICAgdGV4dCs9ICdwcm9jZXNzb3I6XG4nCisgICAgICAgIHRleHQrPSAnICAgIG5yX3Byb2Nlc3NvcnM6ICcrc3RyKHNlbGYubnJfcHJvY2Vzc29ycykrJ1xuJyAKKyAgICAgICAgdGV4dCs9ICcgICAgZmFtaWx5OiAnK3N0cihzZWxmLnByb2Nlc3Nvcl9mYW1pbHkpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgbWFudWZhY3R1cmVyOiAnK3N0cihzZWxmLnByb2Nlc3Nvcl9tYW51ZmFjdHVyZXIpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgdmVyc2lvbjogJytzdHIoc2VsZi5wcm9jZXNzb3JfdmVyc2lvbikrJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICBmZWF0dXJlczogJytzdHIoc2VsZi5wcm9jZXNzb3JfZmVhdHVyZXMpKydcbicKKyAgICAgICAgdGV4dCs9ICdtZW1vcnk6XG4nCisgICAgICAgIHRleHQrPSAnICAgIHR5cGU6ICcrc3RyKHNlbGYubWVtb3J5X3R5cGUpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgZnJlcTogJytzdHIoc2VsZi5tZW1vcnlfZnJlcSkrJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICBucl9jaGFubmVsczogJytzdHIoc2VsZi5tZW1vcnlfbnJfY2hhbm5lbHMpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgc2l6ZTogJytzdHIoc2VsZi5tZW1vcnlfc2l6ZSkrJ1xuJworICAgICAgICB0ZXh0Kz0gJ2h5cGVydmlzb3I6XG4nCisgICAgICAgIHRleHQrPSBzZWxmLmh5cGVydmlzb3IudG9fdGV4dCgpCisgICAgICAgIHRleHQrPSAnb3M6XG4nCisgICAgICAgIHRleHQrPSBzZWxmLm9zLnRvX3RleHQoKQorICAgICAgICB0ZXh0Kz0gJ3Jlc291cmNlIHRvcG9sb2d5OlxuJworICAgICAgICB0ZXh0Kz0gJyAgICBucl9ub2RlczogJysgc3RyKGxlbihzZWxmLm5vZGVzKSkrJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICBub2RlczpcbicKKyAgICAgICAgZm9yIG5vZGVfaywgbm9kZV92IGluIHNlbGYubm9kZXMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICB0ZXh0Kz0gJyAgICAgICAgbm9kZScrc3RyKG5vZGVfaykrJzpcbicKKyAgICAgICAgICAgIHRleHQrPSBub2RlX3YudG9fdGV4dCgpCisgICAgICAgIHJldHVybiB0ZXh0CisgICAgCisgICAgZGVmIHRvX3lhbWwoc2VsZik6CisgICAgICAgIHJldHVybiB5YW1sLmxvYWQoc2VsZi50b190ZXh0KCkpCisgICAgCitjbGFzcyBOb2RlKCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmlkXyA9IE5vbmUgICAgICAgICAgICAgICAgICAgICAgI0ludGVnZXIuIE5vZGUgaWQuIFVuaXF1ZSBpbiB0aGUgc3lzdGVtCisgICAgICAgIHNlbGYucHJvY2Vzc29yID0gUHJvY2Vzc29yTm9kZSgpICAgICNJbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvY2Vzc29yIGluIHRoZSBub2RlCisgICAgICAgIHNlbGYubWVtb3J5ID0gTWVtb3J5Tm9kZSgpICAgICAgICAgICNJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVtb3J5IGluIHRoZSBub2RlCisgICAgICAgIHNlbGYubmljX2xpc3QgPSBsaXN0KCkgICAgICAgICAgICAgICNMaXN0IG9mIE5pYygpIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5pY3MgYXNzb2NpYXRlZCB0byB0aGUgbm9kZQorICAgICAgICBzZWxmLnBvcnRzX2xpc3QgPSBsaXN0KCkgICAgICAgICAgICAjTGlzdCBjb250YWluaW5nIGFsbCBuZXR3b3JrIHBvcnRzIGluIHRoZSBub2RlLiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIGRlZmluZWQgbXVsdGlwbGUgdGltZXMgdGhlIHNhbWUgcG9ydCBpbiB0aGUgc3lzdGVtCisgICAgICAgIAorICAgIGRlZiBnZXRfcHJvY2Vzc29yX2luZm8oc2VsZik6CisgICAgICAgICIiIkdldHMgdGhlIHByb2Nlc3NvciBpbmZvcm1hdGlvbi4gUmV0dXJucyAocHJvY2Vzc29yX2ZhbWlseSwgcHJvY2Vzc29yX21hbnVmYWN0dXJlciwgcHJvY2Vzc29yX3ZlcnNpb24sIHByb2Nlc3Nvcl9mZWF0dXJlcykiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc29yLmdldF9pbmZvKCkKKyAgICAgICAgCisgICAgZGVmIGdldF9tZW1vcnlfaW5mbyhzZWxmKToKKyAgICAgICAgIiIiR2V0cyB0aGUgbWVtb3J5IGluZm9ybWF0aW9uLiBSZXR1cm5zIChtZW1vcnlfZnJlcSwgbWVtb3J5X25yX2NoYW5uZWxzLCBtZW1vcnlfdHlwZSwgbWVtb3J5X3NpemUpIiIiCisgICAgICAgIHJldHVybiBzZWxmLm1lbW9yeS5nZXRfaW5mbygpCisgICAgCisjICAgICBkZWYgc2V0KHNlbGYsICphcmdzKToKKyMgICAgICAgICAiIiJTZXRzIHRoZSBub2RlIGluZm9ybWF0aW9uLiBSZXR1cm5zIChUcnVlLFdhcm5pbmcpIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgKCdGYWxzZScsPGVycm9yIGRlc2NyaXB0aW9uPikgaW4gY2FzZSBvZiBlcnJvciIiIgorIyAgICAgICAgIGlmIGxlbihhcmdzKT09MjoKKyMgICAgICAgICAgICAgcHJvY2Vzc29yID0gYXJnc1swXQorIyAgICAgICAgICAgICBtZW1vcnkgPSBhcmdzWzFdCisjICAgICAgICAgICAgIG5pY3MgPSBGYWxzZQorIyAgICAgICAgIGVsaWYgbGVuKGFyZ3MpPT0zOgorIyAgICAgICAgICAgICBwcm9jZXNzb3IgPSBhcmdzWzBdCisjICAgICAgICAgICAgIG1lbW9yeSA9IGFyZ3NbMV0KKyMgICAgICAgICAgICAgbmljX2xpc3QgPSBhcmdzWzJdCisjICAgICAgICAgICAgIG5pY3MgPSBUcnVlCisjICAgICAgICAgZWxzZToKKyMgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1dyb25nIG51bWJlciBvZiBlbGVtZW50cyBjYWxsaW5nIE5vZGUoKS5zZXQoKScpCisKKyAgICBkZWYgc2V0KHNlbGYsIHByb2Nlc3NvciwgbWVtb3J5LCBuaWNfbGlzdCk6CisgICAgICAgIChzdGF0dXMsIHJldHVybl9jb2RlKSA9IHNlbGYucHJvY2Vzc29yLmFzc2lnbihwcm9jZXNzb3IpCisgICAgICAgIGlmIG5vdCBzdGF0dXM6CisgICAgICAgICAgICByZXR1cm4gKHN0YXR1cywgcmV0dXJuX2NvZGUpCisgICAgICAgIAorICAgICAgICBzZWxmLmlkXyA9IHByb2Nlc3Nvci5pZF8KKyAgICAgICAgCisgICAgICAgIChzdGF0dXMsIHJldHVybl9jb2RlKSA9IHNlbGYubWVtb3J5LmFzc2lnbihtZW1vcnkpCisgICAgICAgIGlmIG5vdCBzdGF0dXM6CisgICAgICAgICAgICByZXR1cm4gKHN0YXR1cywgcmV0dXJuX2NvZGUpCisgICAgICAgIAorIyAgICAgICAgIGlmIG5pY3M6CisgICAgICAgIGZvciBuaWMgaW4gbmljX2xpc3Q6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuaWMsTmljKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIG5pY3MgbXVzdCBiZSBvZiB0eXBlIE5pYycpCisgICAgICAgICAgICBzZWxmLm5pY19saXN0LmFwcGVuZChuaWMpCisgICAgICAgICAgICBmb3IgcG9ydF9rZXkgaW4gbmljLnBvcnRzLml0ZXJrZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgcG9ydF9rZXkgaW4gc2VsZi5wb3J0c19saXN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnTmV0d29yayBwb3J0ICcrcG9ydF9rZXkrJ2RlZmluZWQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgbm9kZScpCisgICAgICAgICAgICAgICAgc2VsZi5wb3J0c19saXN0LmFwcGVuZChwb3J0X2tleSkKKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gKFRydWUsIiIpCisgICAKKyAgICBkZWYgYXNzaWduKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJTZXRzIHRoZSBub2RlIGluZm9ybWF0aW9uLiAKKyAgICAgICAgUmV0dXJucyAoVHJ1ZSxXYXJuaW5nKSBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kICgnRmFsc2UnLDxlcnJvciBkZXNjcmlwdGlvbj4pIGluIGNhc2Ugb2YgZXJyb3IiIiIKKyAgICAgICAgd2FybmluZ190ZXh0PSIiCisgICAgICAgIHByb2Nlc3NvciA9IG5vZGUucHJvY2Vzc29yCisgICAgICAgIG1lbW9yeSA9IG5vZGUubWVtb3J5CisgICAgICAgIG5pY19saXN0ID0gbm9kZS5uaWNfbGlzdAorICAgICAgICAoc3RhdHVzLCByZXR1cm5fY29kZSkgPSBzZWxmLnByb2Nlc3Nvci5hc3NpZ24ocHJvY2Vzc29yKQorICAgICAgICBpZiBub3Qgc3RhdHVzOgorICAgICAgICAgICAgcmV0dXJuIChzdGF0dXMsIHJldHVybl9jb2RlKQorICAgICAgICAKKyAgICAgICAgc2VsZi5pZF8gPSBwcm9jZXNzb3IuaWRfCisgICAgICAgIAorICAgICAgICAoc3RhdHVzLCByZXR1cm5fY29kZSkgPSBzZWxmLm1lbW9yeS5hc3NpZ24obWVtb3J5KQorICAgICAgICBpZiBub3Qgc3RhdHVzOgorICAgICAgICAgICAgcmV0dXJuIChzdGF0dXMsIHJldHVybl9jb2RlKQorICAgICAgICB3YXJuaW5nX3RleHQgKz0gY29kZQorICAgICAgICAKKyAgICAgICAgZm9yIG5pYyBpbiBuaWNfbGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5pYyxOaWMpOgorICAgICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgbmljcyBtdXN0IGJlIG9mIHR5cGUgTmljJykKKyAgICAgICAgICAgIHNlbGYubmljX2xpc3QuYXBwZW5kKG5pYykKKyAgICAgICAgICAgIGZvciBwb3J0X2tleSBpbiBuaWMucG9ydHMuaXRlcmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBwb3J0X2tleSBpbiBzZWxmLnBvcnRzX2xpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdOZXR3b3JrIHBvcnQgJytwb3J0X2tleSsnZGVmaW5lZCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBub2RlJykKKyAgICAgICAgICAgICAgICBzZWxmLnBvcnRzX2xpc3QuYXBwZW5kKHBvcnRfa2V5KQorICAgICAgICAgICAgCisgICAgICAgIHJldHVybiAoVHJ1ZSx3YXJuaW5nX3RleHQpCisgICAKKyAgICBkZWYgdG9fdGV4dChzZWxmKToKKyAgICAgICAgdGV4dD0gJyAgICAgICAgICAgIGlkOiAnK3N0cihzZWxmLmlkXykrJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgIGNwdTpcbicKKyAgICAgICAgdGV4dCArPSBzZWxmLnByb2Nlc3Nvci50b190ZXh0KCkKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICBtZW1vcnk6XG4nCisgICAgICAgIHRleHQgKz0gc2VsZi5tZW1vcnkudG9fdGV4dCgpCisgICAgICAgIGlmIGxlbihzZWxmLm5pY19saXN0KSA+IDA6CisgICAgICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgIG5pY3M6XG4nCisgICAgICAgICAgICBuaWNfaW5kZXggPSAwCisgICAgICAgICAgICBmb3IgbmljIGluIHNlbGYubmljX2xpc3Q6CisgICAgICAgICAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgbmljICcrc3RyKG5pY19pbmRleCkrJzpcbicKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IG5pYy50b190ZXh0KCkKKyAgICAgICAgICAgICAgICBuaWNfaW5kZXggKz0gMQorICAgICAgICByZXR1cm4gdGV4dAorICAgIAorY2xhc3MgUHJvY2Vzc29yTm9kZSgpOgorICAgICNEZWZpbml0aW9uIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgcHJvY2Vzc29yIHZhcmlhYmxlcworICAgIHBvc3NpYmxlX2ZlYXR1cmVzID0gZGVmaW5pdGlvbnNDbGFzcy5wcm9jZXNzb3JfcG9zc2libGVfZmVhdHVyZXMKKyAgICBwb3NzaWJsZV9tYW51ZmFjdHVyZXJzID0gZGVmaW5pdGlvbnNDbGFzcy5wcm9jZXNzb3JfcG9zc2libGVfbWFudWZhY3R1cmVycworICAgIHBvc3NpYmxlX2ZhbWlsaWVzID0gZGVmaW5pdGlvbnNDbGFzcy5wcm9jZXNzb3JfcG9zc2libGVfZmFtaWxpZXMKKyAgICBwb3NzaWJsZV92ZXJzaW9ucyA9IGRlZmluaXRpb25zQ2xhc3MucHJvY2Vzc29yX3Bvc3NpYmxlX3ZlcnNpb25zCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmlkXyA9IE5vbmUgICAgICAgICAgICAgICNJbnRlZ2VyLiBOdW1lcmljIGlkZW50aWZpZXIgb2YgdGhlIHNvY2tldAorICAgICAgICBzZWxmLmZhbWlseSA9IE5vbmUgICAgICAgICAgI1RleHQuIEZhbWlseSBuYW1lIG9mIHRoZSBwcm9jZXNzb3IKKyAgICAgICAgc2VsZi5tYW51ZmFjdHVyZXIgPSBOb25lICAgICNUZXh0LiBNYW51ZmFjdHVyZXIgb2YgdGhlIHByb2Nlc3NvcgorICAgICAgICBzZWxmLnZlcnNpb24gPSBOb25lICAgICAgICAgI1RleHQuIE1vZGVsIHZlcnNpb24gb2YgdGhlIHByb2Nlc3NvcgorICAgICAgICBzZWxmLmZlYXR1cmVzID0gbGlzdCgpICAgICAgI2xpc3QuIExpc3Qgb2YgZmVhdHVyZXMgb2ZmZXJlZCBieSB0aGUgcHJvY2Vzc29yCisgICAgICAgIHNlbGYuY29yZXMgPSBsaXN0KCkgICAgICAgICAjbGlzdC4gTGlzdCBvZiBjb3JlcyBpbiB0aGUgcHJvY2Vzc29yLiBJbiBjYXNlIG9mIGh5cGVydGhyZWFkaW5nIHRoZSBjb3VwbGVkIGNvcmVzIGFyZSBleHByZXNzZWQgYXMgW2EsYl0KKyAgICAgICAgc2VsZi5lbGlnaWJsZV9jb3JlcyA9IGxpc3QoKSNsaXN0LiBMaXN0IG9mIGNvcmVzIHRoYXQgY2FuIGJlIHVzZWQKKyAgICAgICAgI3NlbGYuZGVjaWNhdGVkX2NvcmVzCisgICAgICAgICNzZWxmLnNoYXJlZF9jb3JlcyAtPiB0aGlzIHNob3VsZCBhbHNvIGNvbnRhaW4gaW5mb3JtYXRpb24gdG8ga25vdyBpZiBjb3JlcyBhcmUgYmVpbmcgdXNlZAorICAgICAgICAKKyAgICBkZWYgYXNzaWduKHNlbGYsIHByb2Nlc3Nvcik6CisgICAgICAgICIiIlNldHMgdGhlIHByb2Nlc3NvciBpbmZvcm1hdGlvbi4gCisgICAgICAgIFJldHVybnMgKFRydWUsV2FybmluZykgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCAoJ0ZhbHNlJyw8ZXJyb3IgZGVzY3JpcHRpb24+KSBpbiBjYXNlIG9mIGVycm9yIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb2Nlc3NvcixQcm9jZXNzb3JOb2RlKToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgdmFyaWFibGUgXCdwcm9jZXNzb3JcJyBtdXN0IGJlIG9mIGNsYXNzIFByb2Nlc3Nvck5vZGUnKQorICAgICAgICAKKyAgICAgICAgc2VsZi5pZF8gPSBwcm9jZXNzb3IuaWRfCisgICAgICAgIHNlbGYuZmFtaWx5ID0gcHJvY2Vzc29yLmZhbWlseQorICAgICAgICBzZWxmLm1hbnVmYWN0dXJlciA9IHByb2Nlc3Nvci5tYW51ZmFjdHVyZXIKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gcHJvY2Vzc29yLnZlcnNpb24KKyAgICAgICAgc2VsZi5mZWF0dXJlcyA9IHByb2Nlc3Nvci5mZWF0dXJlcworICAgICAgICBzZWxmLmNvcmVzID0gcHJvY2Vzc29yLmNvcmVzCisgICAgICAgIHNlbGYuZWxpZ2libGVfY29yZXMgPSBwcm9jZXNzb3IuZWxpZ2libGVfY29yZXMKKyAgICAgICAgCisgICAgICAgIHJldHVybiAoVHJ1ZSwgIiIpCisgICAgCisgICAgZGVmIHNldChzZWxmLCBpZF8sIGZhbWlseSwgbWFudWZhY3R1cmVyLCB2ZXJzaW9uLCBmZWF0dXJlcywgY29yZXMpOgorICAgICAgICAiIiJTZXRzIHRoZSBwcm9jZXNzb3IgaW5mb3JtYXRpb24uIAorICAgICAgICBSZXR1cm5zIChUcnVlLFdhcm5pbmcpIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgKCdGYWxzZScsPGVycm9yIGRlc2NyaXB0aW9uPikgaW4gY2FzZSBvZiBlcnJvciIiIgorICAgICAgICB3YXJuaW5nX3RleHQgPSAiIgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGlkXyxpbnQpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSBwcm9jZXNzb3IgaWRfIG11c3QgYmUgb2YgdHlwZSBpbnQnKSAgCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZhbWlseSxzdHIpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSBwcm9jZXNzb3IgZmFtaWx5IG11c3QgYmUgb2YgdHlwZSBzdHInKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShtYW51ZmFjdHVyZXIsc3RyKToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgcHJvY2Vzc29yIG1hbnVmYWN0dXJlciBtdXN0IGJlIG9mIHR5cGUgc3RyJykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbixzdHIpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSBwcm9jZXNzb3IgdmVyc2lvbiBtdXN0IGJlIG9mIHR5cGUgc3RyJykgICAgICAgIAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmZWF0dXJlcyxsaXN0KToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgcHJvY2Vzc29yIGZlYXR1cmVzIG11c3QgYmUgb2YgdHlwZSBsaXN0JykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29yZXMsbGlzdCk6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIHByb2Nlc3NvciBjb3JlcyBtdXN0IGJlIG9mIHR5cGUgbGlzdCcpCisgCisgICAgICAgIChzZWxmLmlkXywgc2VsZi5mYW1pbHksIHNlbGYubWFudWZhY3R1cmVyLCBzZWxmLnZlcnNpb24pID0gKGlkXywgZmFtaWx5LCBtYW51ZmFjdHVyZXIsIHZlcnNpb24pCisgCisgICAgICAgIGlmIG5vdCBtYW51ZmFjdHVyZXIgaW4gc2VsZi5wb3NzaWJsZV9tYW51ZmFjdHVyZXJzOgorICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9ICJwcm9jZXNzb3IgbWFudWZhY3R1cmVyICclcycgbm90IGFtb25nOiAlc1xuIiAlKG1hbnVmYWN0dXJlciwgc3RyKHNlbGYucG9zc2libGVfbWFudWZhY3R1cmVycykpICAgICAKKyAgICAgICAgaWYgbm90IGZhbWlseSBpbiBzZWxmLnBvc3NpYmxlX2ZhbWlsaWVzOgorICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9ICJmYW1pbHkgJyVzJyBub3QgYW1vbmc6ICVzXG4iICUgKGZhbWlseSwgc3RyKHNlbGYucG9zc2libGVfZmFtaWxpZXMpKQorIyAgICAgICAgaWYgbm90IHZlcnNpb24gaW4gc2VsZi5wb3NzaWJsZV92ZXJzaW9uczoKKyMgICAgICAgICAgICB3YXJuaW5nX3RleHQgKz0gJ1RoZSB2ZXJzaW9uICVzIGlzIG5vdCBvbmUgb2YgdGhlc2U6ICVzXG4nICUgKHZlcnNpb24sIHN0cihzZWxmLnBvc3NpYmxlX3ZlcnNpb25zKSkKKyAgICAgICAgCisgICAgICAgIGZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgorICAgICAgICAgICAgaWYgbm90IGZlYXR1cmUgaW4gc2VsZi5wb3NzaWJsZV9mZWF0dXJlczoKKyAgICAgICAgICAgICAgICB3YXJuaW5nX3RleHQgKz0gInByb2Nlc3NvciBmZWF0dXJlICclcycgbm90IGFtb25nOiAlc1xuIiAlIChmZWF0dXJlLCBzdHIoc2VsZi5wb3NzaWJsZV92ZXJzaW9ucykpCisgICAgICAgICAgICBzZWxmLmZlYXR1cmVzLmFwcGVuZChmZWF0dXJlKQorICAgICAgICAKKyAgICAgICAgZm9yIGl0ZXJhdG9yIGluIHNvcnRlZChjb3Jlcyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVyYXRvcixsaXN0KSBvciBub3QgYWxsKGlzaW5zdGFuY2UoeCwgaW50KSBmb3IgeCBpbiBpdGVyYXRvcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSBjb3JlcyBsaXN0IG11c3QgYmUgaW4gdGhlIGZvcm0gb2YgW1thLGJdLFtjLGRdLC4uLl0gd2hlcmUgYSxiLGMsZCBhcmUgb2YgdHlwZSBpbnQnKQorICAgICAgICAgICAgc2VsZi5jb3Jlcy5hcHBlbmQoaXRlcmF0b3IpCisgICAgICAgIAorICAgICAgICBzZWxmLnNldF9lbGlnaWJsZV9jb3JlcygpCisgICAgICAgIAorICAgICAgICByZXR1cm4gKFRydWUsd2FybmluZ190ZXh0KQorICAgICAgICAgICAKKyAgICBkZWYgc2V0X2VsaWdpYmxlX2NvcmVzKHNlbGYpOgorICAgICAgICAiIiJTZXQgdGhlIGRlZmF1bHQgZWxpZ2libGUgY29yZXMsIHRoaXMgaXMgYWxsIGNvcmVzIG5vbiB1c2VkIGJ5IHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0iIiIKKyAgICAgICAgbm90X2ZpcnN0ID0gRmFsc2UKKyAgICAgICAgZm9yIGl0ZXJhdG9yIGluIHNlbGYuY29yZXM6CisgICAgICAgICAgICBpZiBub3RfZmlyc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5lbGlnaWJsZV9jb3Jlcy5hcHBlbmQoaXRlcmF0b3IpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vdF9maXJzdCA9IFRydWUgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybgorICAgIAorICAgIGRlZiBnZXRfaW5mbyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBwcm9jZXNzb3IgcGFyYW1ldGVycyAoc2VsZi5mYW1pbHksIHNlbGYubWFudWZhY3R1cmVyLCBzZWxmLnZlcnNpb24sIHNlbGYuZmVhdHVyZXMpIiIiCisgICAgICAgIHJldHVybiAoc2VsZi5mYW1pbHksIHNlbGYubWFudWZhY3R1cmVyLCBzZWxmLnZlcnNpb24sIHNlbGYuZmVhdHVyZXMpCisgICAgCisgICAgZGVmIHRvX3RleHQoc2VsZik6CisgICAgICAgIHRleHQ9ICcgICAgICAgICAgICAgICAgaWQ6ICcrc3RyKHNlbGYuaWRfKSsnXG4nCisgICAgICAgIHRleHQrPSAnICAgICAgICAgICAgICAgIGZhbWlseTogJytzZWxmLmZhbWlseSsnXG4nCisgICAgICAgIHRleHQrPSAnICAgICAgICAgICAgICAgIG1hbnVmYWN0dXJlcjogJytzZWxmLm1hbnVmYWN0dXJlcisnXG4nCisgICAgICAgIHRleHQrPSAnICAgICAgICAgICAgICAgIHZlcnNpb246ICcrc2VsZi52ZXJzaW9uKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgZmVhdHVyZXM6ICcrc3RyKHNlbGYuZmVhdHVyZXMpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgY29yZXM6ICcrc3RyKHNlbGYuY29yZXMpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgZWxpZ2libGVfY29yZXM6ICcrc3RyKHNlbGYuZWxpZ2libGVfY29yZXMpKydcbicKKyAgICAgICAgcmV0dXJuIHRleHQKKyAgICAKK2NsYXNzIE1lbW9yeU5vZGUoKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubW9kdWxlcyA9IGxpc3QoKSAgICAgICAgICAgICAgICNMaXN0IG9mIE1lbW9yeU1vZHVsZSgpLiBMaXN0IG9mIGFsbCBtb2R1bGVzIGluc3RhbGxlZCBpbiB0aGUgbm9kZQorICAgICAgICBzZWxmLm5yX2NoYW5uZWxzID0gTm9uZSAgICAgICAgICAgICAjSW50ZWdlci4gTnVtYmVyIG9mIG1vZHVsZXMgaW5zdGFsbGVkIGluIHRoZSBub2RlCisgICAgICAgIHNlbGYubm9kZV9zaXplID0gTm9uZSAgICAgICAgICAgICAgICNJbnRlZ2VyLiBUb3RhbCBzaXplIGluIEtpQiBvZiBtZW1vcnkgaW5zdGFsbGVkIGluIHRoZSBub2RlCisgICAgICAgIHNlbGYuZWxpZ2libGVfbWVtb3J5ID0gTm9uZSAgICAgICAgICNJbnRlZ2VyLiBTaXplIGluIEtpQiBvZiBlbGlnaWJsZSBtZW1vcnkgaW4gdGhlIG5vZGUgICAgIAorICAgICAgICBzZWxmLmh1Z2VwYWdlX3N6ID0gTm9uZSAgICAgICAgICAgICAjSW50ZWdlci4gU2l6ZSBpbiBLaUIgb2YgaHVnZXBhZ2VzCisgICAgICAgIHNlbGYuaHVnZXBhZ2VfbnIgPSBOb25lICAgICAgICAgICAgICNJbnRlZ2VyLiBOdW1iZXIgb2YgaHVnZXBhZ2VzIGFsbG9jYXRlZCBpbiB0aGUgbW9kdWxlCisgICAgICAgIHNlbGYuZWxpZ2libGVfaHVnZXBhZ2VfbnIgPSBOb25lICAgICNJbnRlZ2VyLiBOdW1iZXIgb2YgZWxpZ2libGUgaHVnZXBhZ2VzIGluIHRoZSBub2RlCisgICAgICAgIHNlbGYudHlwZV8gPSBOb25lICAgICAgICAgICAgICAgICAgICAjVGV4dC4gVHlwZSBvZiBtZW1vcnkgbW9kdWxlcy4gSWYgbW9kdWxlcyBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGtlZXAgaXQgYXMgTm9uZQorICAgICAgICBzZWxmLmZyZXEgPSBOb25lICAgICAgICAgICAgICAgICAgICAjSW50ZWdlci4gRnJlcXVlbmN5IG9mIHRoZSBtb2R1bGVzIGluIE1Iei4gSWYgbW9kdWxlcyBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGtlZXAgaXQgYXMgTm9uZQorICAgICAgICBzZWxmLm1vZHVsZV9zaXplID0gTm9uZSAgICAgICAgICAgICAjSW50ZWdlci4gU2l6ZSBvZiB0aGUgbW9kdWxlcyBpbiBLaUIuIElmIG1vZHVsZXMgaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBrZWVwIGl0IGFzIE5vbmUKKyAgICAgICAgc2VsZi5mb3JtX2ZhY3RvciA9IE5vbmUgICAgICAgICAgICAgI1RleHQuIEZvcm0gZmFjdG9yIG9mIHRoZSBtb2R1bGVzLiBJZiBtb2R1bGVzIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUga2VlcCBpdCBhcyBOb25lCisgICAgICAgCisgICAgZGVmIGFzc2lnbihzZWxmLCBtZW1vcnlfbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLnNldChtZW1vcnlfbm9kZS5tb2R1bGVzLCBtZW1vcnlfbm9kZS5odWdlcGFnZV9zeiwgbWVtb3J5X25vZGUuaHVnZXBhZ2VfbnIpCisgICAgICAgICAKKyAgICBkZWYgc2V0KHNlbGYsIG1vZHVsZXMsIGh1Z2VwYWdlX3N6LCBodWdlcGFnZV9ucik6CisgICAgICAgICIiIlNldCB0aGUgbWVtb3J5IG5vZGUgaW5mb3JtYXRpb24uIGh1Z2VwYWdlX3N6IG11c3QgYmUgZXhwcmVzc2VkIGluIEtpQi4gCisgICAgICAgIFJldHVybnMgKFRydWUsV2FybmluZykgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCAoJ0ZhbHNlJyw8ZXJyb3IgZGVzY3JpcHRpb24+KSBpbiBjYXNlIG9mIGVycm9yIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG1vZHVsZXMsIGxpc3QpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSBtb2R1bGVzIG11c3QgYmUgYSBsaXN0IG9mIGVsZW1lbnRzIG9mIGNsYXNzIE1lbW9yeU1vZHVsZScpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGh1Z2VwYWdlX3N6LGludCk6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIGh1Z2VwYWdlX3N6IHZhcmlhYmxlIG11c3QgYmUgYW4gaW50IGV4cHJlc3NpbmcgdGhlIHNpemUgaW4gS2lCJykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaHVnZXBhZ2VfbnIsaW50KToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgaHVnZXBhZ2VfbnIgdmFyaWFibGUgbXVzdCBiZSBvZiB0eXBlIGludCcpCisgICAgICAgIAorICAgICAgICAoc2VsZi5odWdlcGFnZV9zeiwgc2VsZi5odWdlcGFnZV9ucikgPSAoaHVnZXBhZ2Vfc3osIGh1Z2VwYWdlX25yKQorICAgICAgICBzZWxmLm5vZGVfc2l6ZSA9IHNlbGYubnJfY2hhbm5lbHMgPSAwCisgICAgICAgIAorICAgICAgICBkaWZmZXJlbnRfdHlwZSA9IGRpZmZlcmVudF9mcmVxID0gZGlmZmVyZW50X21vZHVsZV9zaXplID0gZGlmZmVyZW50X2Zvcm1fZmFjdG9yID0gRmFsc2UKKyAgICAgICAgcHJldl90eXBlID0gcHJldl9mcmVxID0gcHJldl9tb2R1bGVfc2l6ZSA9IHByZXZfZm9ybV9mYWN0b3IgPSBOb25lCisgICAgICAgIGZvciBpdGVyYXRvciBpbiBtb2R1bGVzOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlcmF0b3IsTWVtb3J5TW9kdWxlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIG1vZHVsZXMgbXVzdCBiZSBhIGxpc3Qgb2YgZWxlbWVudHMgb2YgY2xhc3MgTWVtb3J5TW9kdWxlJykKKyAgICAgICAgICAgIHNlbGYubW9kdWxlcy5hcHBlbmQoaXRlcmF0b3IpCisgICAgICAgICAgICAoc2VsZi50eXBlXywgc2VsZi5mcmVxLCBzZWxmLm1vZHVsZV9zaXplLCBzZWxmLmZvcm1fZmFjdG9yKSA9IChpdGVyYXRvci50eXBlXywgaXRlcmF0b3IuZnJlcSwgaXRlcmF0b3Iuc2l6ZSwgaXRlcmF0b3IuZm9ybV9mYWN0b3IpCisgICAgICAgICAgICBzZWxmLm5vZGVfc2l6ZSArPSBzZWxmLm1vZHVsZV9zaXplCisgICAgICAgICAgICBzZWxmLm5yX2NoYW5uZWxzICs9IDEKKyAgICAgICAgICAgIGlmIHByZXZfdHlwZSAhPSBOb25lIGFuZCBwcmV2X3R5cGUgIT0gc2VsZi50eXBlXzoKKyAgICAgICAgICAgICAgICBkaWZmZXJlbnRfdHlwZSA9IFRydWUKKyAgICAgICAgICAgIGlmIHByZXZfZnJlcSAhPSBOb25lIGFuZCBwcmV2X2ZyZXEgIT0gc2VsZi5mcmVxOgorICAgICAgICAgICAgICAgIGRpZmZlcmVudF9mcmVxID0gVHJ1ZQorICAgICAgICAgICAgaWYgcHJldl9tb2R1bGVfc2l6ZSAhPSBOb25lIGFuZCBwcmV2X21vZHVsZV9zaXplICE9IHNlbGYubW9kdWxlX3NpemU6CisgICAgICAgICAgICAgICAgZGlmZmVyZW50X21vZHVsZV9zaXplID0gVHJ1ZQorICAgICAgICAgICAgaWYgcHJldl9mb3JtX2ZhY3RvciAhPSBOb25lIGFuZCBwcmV2X2Zvcm1fZmFjdG9yICE9IHNlbGYuZm9ybV9mYWN0b3I6CisgICAgICAgICAgICAgICAgZGlmZmVyZW50X2Zvcm1fZmFjdG9yID0gVHJ1ZQorICAgICAgICAgICAgKHByZXZfdHlwZSwgcHJldl9mcmVxLCBwcmV2X21vZHVsZV9zaXplLCBwcmV2X2Zvcm1fZmFjdG9yKSA9IChzZWxmLnR5cGVfLCBzZWxmLmZyZXEsIHNlbGYubW9kdWxlX3NpemUsIHNlbGYuZm9ybV9mYWN0b3IpCisgICAgICAgIAorICAgICAgICBpZiBkaWZmZXJlbnRfdHlwZToKKyAgICAgICAgICAgIHNlbGYudHlwZV8gPSBOb25lCisgICAgICAgIGlmIGRpZmZlcmVudF9mcmVxOgorICAgICAgICAgICAgc2VsZi5mcmVxID0gTm9uZQorICAgICAgICBpZiBkaWZmZXJlbnRfbW9kdWxlX3NpemU6CisgICAgICAgICAgICBzZWxmLm1vZHVsZV9zaXplID0gTm9uZQorICAgICAgICBpZiBkaWZmZXJlbnRfZm9ybV9mYWN0b3I6CisgICAgICAgICAgICBzZWxmLmZvcm1fZmFjdG9yID0gTm9uZQorICAgICAgICAKKyAgICAgICAgKHJldHVybl92YWx1ZSwgZXJyb3JfY29kZSkgPSBzZWxmLnNldF9lbGlnaWJsZV9tZW1vcnkoKQorICAgICAgICBpZiBub3QgcmV0dXJuX3ZhbHVlOgorICAgICAgICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUsIGVycm9yX2NvZGUpCisgICAgICAgIAorICAgICAgICByZXR1cm4gKFRydWUsICIiKQorICAgIAorICAgIGRlZiBzZXRfZWxpZ2libGVfbWVtb3J5KHNlbGYpOgorICAgICAgICAiIiJTZXRzIHRoZSBkZWZhdWx0IGVsaWdpYmxlX21lbW9yeSBhbmQgZWxpZ2libGVfaHVnZXBhZ2VfbnIuIFRoaXMgaXMgYWxsIG1lbW9yeSBidXQgMkdpQiBhbmQgYWxsIGh1Z2VwYWdlcyIiIgorICAgICAgICBzZWxmLmVsaWdpYmxlX21lbW9yeSA9IHNlbGYubm9kZV9zaXplIC0gMioxMDI0KjEwMjQKKyAgICAgICAgaWYgc2VsZi5lbGlnaWJsZV9tZW1vcnkgPCAwOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgIlRoZXJlIGlzIGxlc3MgdGhhbiAyR2lCIG9mIG1lbW9yeSBpbiB0aGUgbW9kdWxlIikKKyAgICAgICAgCisgICAgICAgIHNlbGYuZWxpZ2libGVfaHVnZXBhZ2VfbnIgPSBzZWxmLmh1Z2VwYWdlX25yIAorICAgICAgICByZXR1cm4gKFRydWUsIiIpCisgICAgCisgICAgZGVmIGdldF9pbmZvKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbWVtb3J5IGluZm9ybWF0aW9uIChzZWxmLmZyZXEsIHNlbGYubnJfY2hhbm5lbHMsIHNlbGYudHlwZV8sIHNlbGYubm9kZV9zaXplKSIiIgorICAgICAgICByZXR1cm4gKHNlbGYuZnJlcSwgc2VsZi5ucl9jaGFubmVscywgc2VsZi50eXBlXywgc2VsZi5ub2RlX3NpemUsIHNlbGYuaHVnZXBhZ2Vfc3opCisgICAgICAgIAorICAgIGRlZiB0b190ZXh0KHNlbGYpOgorICAgICAgICB0ZXh0PSAnICAgICAgICAgICAgICAgIG5vZGVfc2l6ZTogJytzdHIoc2VsZi5ub2RlX3NpemUpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgbnJfY2hhbm5lbHM6ICcrc3RyKHNlbGYubnJfY2hhbm5lbHMpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgZWxpZ2libGVfbWVtb3J5OiAnK3N0cihzZWxmLmVsaWdpYmxlX21lbW9yeSkrJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgICAgICBodWdlcGFnZV9zejogJytzdHIoc2VsZi5odWdlcGFnZV9zeikrJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgICAgICBodWdlcGFnZV9ucjogJytzdHIoc2VsZi5odWdlcGFnZV9ucikrJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgICAgICBlbGlnaWJsZV9odWdlcGFnZV9ucjogJytzdHIoc2VsZi5lbGlnaWJsZV9odWdlcGFnZV9ucikrJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgICAgICB0eXBlOiAnK3NlbGYudHlwZV8rJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgICAgICBmcmVxOiAnK3N0cihzZWxmLmZyZXEpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgbW9kdWxlX3NpemU6ICcrc3RyKHNlbGYubW9kdWxlX3NpemUpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgZm9ybV9mYWN0b3I6ICcrc2VsZi5mb3JtX2ZhY3RvcisnXG4nCisgICAgICAgIHRleHQrPSAnICAgICAgICAgICAgICAgIG1vZHVsZXMgZGV0YWlsczpcbicKKyAgICAgICAgZm9yIG1vZHVsZSBpbiBzZWxmLm1vZHVsZXM6CisgICAgICAgICAgICB0ZXh0ICs9IG1vZHVsZS50b190ZXh0KCkKKyAgICAgICAgcmV0dXJuIHRleHQKKyAgICAgICAgCitjbGFzcyBNZW1vcnlNb2R1bGUoKToKKyAgICAjRGVmaW5pdGlvbiBvZiB0aGUgcG9zc2libGUgdmFsdWVzIG9mIG1vZHVsZSB2YXJpYWJsZXMKKyAgICBwb3NzaWJsZV90eXBlcyA9IGRlZmluaXRpb25zQ2xhc3MubWVtb3J5X3Bvc3NpYmxlX3R5cGVzCisgICAgcG9zc2libGVfZm9ybV9mYWN0b3JzID0gZGVmaW5pdGlvbnNDbGFzcy5tZW1vcnlfcG9zc2libGVfZm9ybV9mYWN0b3JzCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvY2F0b3IgPSBOb25lICAgICAjVGV4dC4gTmFtZSBvZiB0aGUgbWVtb3J5IG1vZHVsZQorICAgICAgICBzZWxmLnR5cGVfID0gTm9uZSAgICAgICAgI1RleHQuIFR5cGUgb2YgbWVtb3J5IG1vZHVsZQorICAgICAgICBzZWxmLmZyZXEgPSBOb25lICAgICAgICAjSW50ZWdlci4gRnJlcXVlbmN5IG9mIHRoZSBtb2R1bGUgaW4gTUh6CisgICAgICAgIHNlbGYuc2l6ZSA9IE5vbmUgICAgICAgICNJbnRlZ2VyLiBTaXplIG9mIHRoZSBtb2R1bGUgaW4gS2lCCisgICAgICAgIHNlbGYuZm9ybV9mYWN0b3IgPSBOb25lICNUZXh0LiBGb3JtIGZhY3RvciBvZiB0aGUgbW9kdWxlCisgICAgICAgIAorICAgIGRlZiBzZXQoc2VsZiwgbG9jYXRvciwgdHlwZV8sIGZyZXEsIHNpemUsIGZvcm1fZmFjdG9yKToKKyAgICAgICAgIiIiU2V0cyB0aGUgbWVtb3J5IG1vZHVsZSBpbmZvcm1hdGlvbi4gCisgICAgICAgIEZyZXF1ZW5jeSBtdXN0IGJlIGV4cHJlc3NlZCBpbiBNSHogYW5kIHNpemUgaW4gS2lCLgorICAgICAgICBSZXR1cm5zIChUcnVlLFdhcm5pbmcpIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgKCdGYWxzZScsPGVycm9yIGRlc2NyaXB0aW9uPikgaW4gY2FzZSBvZiBlcnJvciIiIgorICAgICAgICB3YXJuaW5nX3RleHQ9IiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobG9jYXRvciwgc3RyKToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICJUaGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgbG9jYXRvciBtdXN0IGJlIHN0ciIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHR5cGVfLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgIlRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSB0eXBlXyBtdXN0IGJlIHN0ciIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZvcm1fZmFjdG9yLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgIlRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBmb3JtX2ZhY3RvciBtdXN0IGJlIHN0ciIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZyZXEsIGludCk6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAiVGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGZyZXEgbXVzdCBiZSBpbnQiKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzaXplLCBpbnQpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgIlRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBzaXplIG11c3QgYmUgaW50IikKKyAgICAgICAgCisgICAgICAgIGlmIG5vdCBmb3JtX2ZhY3RvciBpbiBzZWxmLnBvc3NpYmxlX2Zvcm1fZmFjdG9yczoKKyAgICAgICAgICAgIHdhcm5pbmdfdGV4dCArPSAibWVtb3J5IGZvcm1fZmFjdG9yICclcycgbm90IGFtb25nOiAlc1xuIiAlKGZvcm1fZmFjdG9yLCBzdHIoc2VsZi5wb3NzaWJsZV9mb3JtX2ZhY3RvcnMpKQorICAgICAgICBpZiBub3QgdHlwZV8gaW4gc2VsZi5wb3NzaWJsZV90eXBlczoKKyAgICAgICAgICAgIHdhcm5pbmdfdGV4dCArPSAibWVtb3J5IHR5cGUgJyVzJyBub3QgYW1vbmc6ICVzXG4iICUodHlwZV8sIHN0cihzZWxmLnBvc3NpYmxlX3R5cGVzKSkKKyAgICAgICAgCisgICAgICAgIChzZWxmLmxvY2F0b3IsIHNlbGYudHlwZV8sIHNlbGYuZnJlcSwgc2VsZi5zaXplLCBzZWxmLmZvcm1fZmFjdG9yKSA9IChsb2NhdG9yLCB0eXBlXywgZnJlcSwgc2l6ZSwgZm9ybV9mYWN0b3IpCisgICAgICAgIHJldHVybiAoVHJ1ZSwgd2FybmluZ190ZXh0KSAgIAorICAgIAorICAgIGRlZiB0b190ZXh0KHNlbGYpOgorICAgICAgICB0ZXh0PSAnICAgICAgICAgICAgICAgICAgICAnK3NlbGYubG9jYXRvcisnOlxuJworICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICcrc2VsZi50eXBlXysnXG4nCisgICAgICAgIHRleHQrPSAnICAgICAgICAgICAgICAgICAgICAgICAgZnJlcTogJytzdHIoc2VsZi5mcmVxKSsnXG4nCisgICAgICAgIHRleHQrPSAnICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJytzdHIoc2VsZi5zaXplKSsnXG4nCisgICAgICAgIHRleHQrPSAnICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSBmYWN0b3I6ICcrc2VsZi5mb3JtX2ZhY3RvcisnXG4nCisgICAgICAgIHJldHVybiB0ZXh0CisgICAgICAgICAKK2NsYXNzIE5pYygpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5tb2RlbCA9IE5vbmUgICAgICAgI1RleHQuIE1vZGVsIG9mIHRoZSBuaWMKKyAgICAgICAgc2VsZi5wb3J0cyA9IGRpY3QoKSAgICAgI0RpY3Rpb25hcnkgb2YgcG9ydHMuIEtleXMgYXJlIHRoZSBwb3J0IG5hbWUsIHZhbHVlIGFyZSBQb3J0KCkgZWxlbWVudHMKKyAgICAKKyAgICBkZWYgc2V0X21vZGVsKHNlbGYsIG1vZGVsKToKKyAgICAgICAgIiIiU2V0cyB0aGUgbW9kZWwgb2YgdGhlIG5pYy4gUmV0dXJucyAoVHJ1ZSxXYXJuaW5nKSBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kICgnRmFsc2UnLDxlcnJvciBkZXNjcmlwdGlvbj4pIGluIGNhc2Ugb2YgZXJyb3IiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobW9kZWwsc3RyKToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgXCdtb2RlbFwnIG11c3QgYmUgb2YgdHlwZSBzdHInKQorICAgICAgICAgICAKKyAgICAgICAgc2VsZi5tb2RlbCA9IG1vZGVsCisgICAgICAgIHJldHVybiAoVHJ1ZSwgIiIpCisgICAKKyAgICBkZWYgYWRkX3BvcnQoc2VsZiwgcG9ydCk6CisgICAgICAgICIiIkFkZHMgYSBwb3J0IHRvIHRoZSBuaWMuIFJldHVybnMgKFRydWUsV2FybmluZykgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCAoJ0ZhbHNlJyw8ZXJyb3IgZGVzY3JpcHRpb24+KSBpbiBjYXNlIG9mIGVycm9yIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBvcnQsUG9ydCk6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIFwncG9ydFwnIG11c3QgYmUgb2YgY2xhc3MgUG9ydCcpCisgICAgICAgCisjICAgICAgICBwb3J0X2lkID0gc3RyKHBvcnQucGNpX2RldmljZV9pZFswXSkrJzonK3N0cihwb3J0LnBjaV9kZXZpY2VfaWRbMV0pKyc6JytzdHIocG9ydC5wY2lfZGV2aWNlX2lkWzJdKSsnLicrc3RyKHBvcnQucGNpX2RldmljZV9pZFszXSkKKyNDSEFOR0VECisjICAgICAgICBwb3J0X2lkID0gcG9ydC5uYW1lCisgICAgICAgIHBvcnRfaWQgPSBwb3J0LnBjaV9kZXZpY2VfaWQKKyNDSEFOR0VEIEVORCAKKyAgICAgICAgaWYgcG9ydF9pZCBpbiBzZWxmLnBvcnRzOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSBcJ3BvcnRcJyAnK3BvcnQucGNpX2RldmljZV9pZCsnIGlzIGR1cGxpY2F0ZWQgaW4gdGhlIG5pYycpCisjICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgXCdwb3J0XCcgaXMgZHVwbGljYXRlZCBpbiB0aGUgbmljJykKKyAgICAgICAKKyAgICAgICAgc2VsZi5wb3J0c1twb3J0X2lkXSA9IHBvcnQKKyAgICAgICAgcmV0dXJuIChUcnVlLCAiIikKKyAgIAorICAgIGRlZiB0b190ZXh0KHNlbGYpOgorICAgICAgICB0ZXh0PSAnICAgICAgICAgICAgICAgICAgICBtb2RlbDogJysgc3RyKHNlbGYubW9kZWwpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgICAgIHBvcnRzOiAnKydcbicKKyAgICAgICAgZm9yIGtleSxwb3J0IGluIHNlbGYucG9ydHMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgICAgICAgICAgICAgICInK2tleSsnIjonKydcbicKKyAgICAgICAgICAgIHRleHQgKz0gcG9ydC50b190ZXh0KCkKKyAgICAgICAgcmV0dXJuIHRleHQKKyAgICAgICAgICAgICAgIAorY2xhc3MgUG9ydCgpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5uYW1lID0gTm9uZSAgICAgICAgICAgICNUZXh0LiBQb3J0IG5hbWUKKyAgICAgICAgc2VsZi52aXJ0dWFsID0gTm9uZSAgICAgICAgICNCb29sZWFuLiBTdGF0ZXMgaWYgdGhlIHBvcnQgaXMgYSB2aXJ0dWFsIGZ1bmN0aW9uCisgICAgICAgIHNlbGYuZW5hYmxlZCA9IE5vbmUgICAgICAgICAjQm9vbGVhbi4gU3RhdGVzIGlmIHRoZSBwb3J0IGlzIGVuYWJsZWQKKyAgICAgICAgc2VsZi5lbGlnaWJsZSA9IE5vbmUgICAgICAgICNCb29sZWFuLiBTdGF0ZXMgaWYgdGhlIHBvcnQgaXMgZWxpZ2libGUKKyAgICAgICAgc2VsZi5zcGVlZCA9IE5vbmUgICAgICAgICAgICNJbnRlZ2VyLiBJbmRpY2F0ZXMgdGhlIHNwZWVkIGluIE1icHMKKyAgICAgICAgc2VsZi5hdmFpbGFibGVfYncgPSBOb25lICAgICNJbnRlZ2VyLiBCVyBpbiBNYnBzIHRoYXQgaXMgYXZhaWxhYmxlLgorICAgICAgICBzZWxmLm1hYyA9IE5vbmUgICAgICAgICAgICAgI2xpc3QuIEluZGljYXRlcyB0aGUgbWFjIGFkZHJlc3Mgb2YgdGhlIHBvcnQgYXMgYSBsaXN0IGluIGZvcm1hdCBbJ1hYJywnWFgnLCdYWCcsJ1hYJywnWFgnLCdYWCddCisgICAgICAgIHNlbGYucGNpX2RldmljZV9pZF9zcGxpdCA9IE5vbmUgICAjbGlzdC4gSW5kaWNhdGVzIHRoZSBwY2kgYWRkcmVzcyAgb2YgdGhlIHBvcnQgYXMgYSBsaXN0IGluIGZvcm1hdCBbJ1hYWFgnLCdYWCcsJ1hYJywnWCddCisgICAgICAgIHNlbGYucGNpX2RldmljZV9pZCA9IE5vbmUKKyAgICAgICAgc2VsZi5QRl9wY2lfZGV2aWNlX2lkID0gTm9uZQorICAgICAgICAKKyMgICAgIGRlZiBzZXQoc2VsZiwgbmFtZSwgdmlydHVhbCwgZW5hYmxlZCwgc3BlZWQsIG1hYywgcGNpX2RldmljZV9pZCwgcGNpX2RldmljZV9pZF9zcGxpdCk6CisjICAgICAgICAgIiIiU2V0cyB0aGUgcG9ydCBpbmZvcm1hdGlvbi4gVGhlIHZhcmlhYmxlIHNwZWVkIGluZGljYXRlcyB0aGUgc3BlZWQgaW4gTWJwcy4gUmV0dXJucyAoVHJ1ZSxXYXJuaW5nKSBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kICgnRmFsc2UnLDxlcnJvciBkZXNjcmlwdGlvbj4pIGluIGNhc2Ugb2YgZXJyb3IiIiIKKyMgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lLHN0cik6CisjICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgdmFyaWFibGUgXCduYW1lXCcgbXVzdCBiZSBvZiB0eXBlIHN0cicpCisjICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmlydHVhbCxib29sKToKKyMgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSB2YXJpYWJsZSBcJ3ZpcnR1YWxcJyBtdXN0IGJlIG9mIHR5cGUgYm9vbCcpCisjICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZW5hYmxlZCxib29sKToKKyMgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSB2YXJpYWJsZSBcJ2VuYWJsZWRcJyBtdXN0IGJlIG9mIHR5cGUgYm9vbCcpCisjICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZW5hYmxlZCxib29sKToKKyMgICAgICAgICAgICAgcmV0dXJuIChzcGVlZCwgJ1RoZSB2YXJpYWJsZSBcJ3NwZWVkXCcgbXVzdCBiZSBvZiB0eXBlIGludCcpCisjICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobWFjLCBsaXN0KSBhbmQgbm90IGlzaW5zdGFuY2UobWFjLE5vbmVUeXBlKToKKyMgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSB2YXJpYWJsZSBcJ2VuYWJsZWRcJyBtdXN0IGJlIG9mIHR5cGUgbGlzdCBpbmRpY2F0aW5nIHRoZSBtYWMgYWRkcmVzcyBpbiBmb3JtYXQgW1wnWFhYWFwnLFwnWFhcJyxcJ1hYXCcsXCdYXCddIG9yIE5vbmVUeXBlJykKKyMgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwY2lfZGV2aWNlX2lkX3NwbGl0LCBsaXN0KSBvciBsZW4ocGNpX2RldmljZV9pZF9zcGxpdCkgIT0gNDogCisjICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgdmFyaWFibGUgXCdwY2lfZGV2aWNlX2lkX3NwbGl0XCcgbXVzdCBiZSBvZiB0eXBlIGxpc3QsIGluZGljYXRpbmcgdGhlIHBjaSBhZGRyZXNzIGluIGZvcm1hdCBbXCdYWFwnLFwnWFhcJyxcJ1hYXCcsXCdYWFwnLFwnWFhcJyxcJ1hYXCddJykKKyMgICAgICAgICAKKyMgICAgICAgICBleHBlY3RlZF9sZW4gPSBbNCwyLDIsMV0KKyMgICAgICAgICBpbmRleCA9IDAKKyMgICAgICAgICBmb3IgaXRlcmF0b3IgaW4gcGNpX2RldmljZV9pZF9zcGxpdDoKKyMgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlcmF0b3Isc3RyKSBvciBub3QgaXRlcmF0b3IuaXNkaWdpdCgpIG9yIGxlbihpdGVyYXRvcikgIT0gZXhwZWN0ZWRfbGVuW2luZGV4XToKKyMgICAgICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgdmFyaWFibGUgXCdwY2lfZGV2aWNlX2lkX3NwbGl0XCcgbXVzdCBiZSBvZiB0eXBlIGxpc3QsIGluZGljYXRpbmcgdGhlIHBjaSBhZGRyZXNzIGluIGZvcm1hdCBbXCdYWFwnLFwnWFhcJyxcJ1hYXCcsXCdYWFwnLFwnWFhcJyxcJ1hYXCddJykKKyMgICAgICAgICAgICAgaW5kZXggKz0gMQorIyAgICAgICAgICAgICAKKyMgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShtYWMsTm9uZVR5cGUpOgorIyAgICAgICAgICAgICBmb3IgaXRlcmF0b3IgaW4gbWFjOgorIyAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlcmF0b3Isc3RyKSBvciBub3QgaXRlcmF0b3IuaXNhbG51bSgpIG9yIGxlbihpdGVyYXRvcikgIT0gMjoKKyMgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVGhlIHZhcmlhYmxlIFwnZW5hYmxlZFwnIG11c3QgYmUgb2YgdHlwZSBsaXN0IGluZGljYXRpbmcgdGhlIG1hYyBhZGRyZXNzIGluIGZvcm1hdCBbXCdYWFhYXCcsXCdYWFwnLFwnWFhcJyxcJ1hcJ10gb3IgTm9uZVR5cGUnKQorIyAgICAgICAgIAorIyAgICAgICAgICNCeSBkZWZhdWx0IG9ubHkgdmlydHVhbCBwb3J0cyBhcmUgZWxpZ2libGUKKyMgIyAgICAgICAgIChzZWxmLm5hbWUsIHNlbGYudmlydHVhbCwgc2VsZi5lbmFibGVkLCBzZWxmLmVsaWdpYmxlLCBzZWxmLmF2YWlsYWJsZV9idywgc2VsZi5zcGVlZCwgc2VsZi5tYWMsIHNlbGYucGNpX2RldmljZV9pZCwgc2VsZi5wY2lfZGV2aWNlX2lkX3NwbGl0KSA9IChuYW1lLCB2aXJ0dWFsLCBlbmFibGVkLCB2aXJ0dWFsLCBzcGVlZCwgc3BlZWQsIG1hYywgcGNpX2RldmljZV9pZCwgcGNpX2RldmljZV9pZF9zcGxpdCkKKyMgICAgICAgICAoc2VsZi5uYW1lLCBzZWxmLnZpcnR1YWwsIHNlbGYuZW5hYmxlZCwgc2VsZi5lbGlnaWJsZSwgc2VsZi5hdmFpbGFibGVfYncsIHNlbGYubWFjLCBzZWxmLnBjaV9kZXZpY2VfaWQsIHNlbGYucGNpX2RldmljZV9pZF9zcGxpdCkgPSAobmFtZSwgdmlydHVhbCwgZW5hYmxlZCwgdmlydHVhbCwgc3BlZWQsIG1hYywgcGNpX2RldmljZV9pZCwgcGNpX2RldmljZV9pZF9zcGxpdCkKKworICAgIGRlZiB0b190ZXh0KHNlbGYpOgorICAgICAgICB0ZXh0PSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaTogIicrIHN0cihzZWxmLnBjaV9kZXZpY2VfaWQpKyciXG4nCisgICAgICAgIHRleHQrPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWw6ICcrIHN0cihzZWxmLnZpcnR1YWwpKydcbicKKyAgICAgICAgaWYgc2VsZi52aXJ0dWFsOgorICAgICAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZfcGNpX2lkOiAiJytzZWxmLlBGX3BjaV9kZXZpY2VfaWQrJyJcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZ2libGU6ICcrIHN0cihzZWxmLmVsaWdpYmxlKSsnXG4nCisgICAgICAgIHRleHQrPSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6ICcrc3RyKHNlbGYuZW5hYmxlZCkrJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZDogJysgc3RyKHNlbGYuc3BlZWQpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGJ3OiAnKyBzdHIoc2VsZi5hdmFpbGFibGVfYncpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjOiAnKyBzdHIoc2VsZi5tYWMpKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX25hbWU6ICcrIHN0cihzZWxmLm5hbWUpKydcbicKKyAgICAgICAgcmV0dXJuIHRleHQKKyAgICAKK2NsYXNzIEh5cGVydmlzb3IoKToKKyAgICAjRGVmaW5pdGlvbiBvZiB0aGUgcG9zc2libGUgdmFsdWVzIG9mIGh5cGVydmlzb3IgdmFyaWFibGVzCisgICAgcG9zc2libGVfdHlwZXMgPSBkZWZpbml0aW9uc0NsYXNzLmh5cGVydmlzb3JfcG9zc2libGVfdHlwZXMKKyAgICBwb3NzaWJsZV9kb21haW5fdHlwZXMgPSBkZWZpbml0aW9uc0NsYXNzLmh5cGVydmlzb3JfcG9zc2libGVfZG9tYWluX3R5cGVzCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudHlwZV8gPSBOb25lICAgICAgICAgICAgI1RleHQuIEh5cGVydmlzb3IgdHlwZV8KKyAgICAgICAgc2VsZi52ZXJzaW9uID0gTm9uZSAgICAgICAgICNpbnQuIEh5cGVydmlzb3IgdmVyc2lvbgorICAgICAgICBzZWxmLmxpYl92ZXJzaW9uID0gTm9uZSAgICAgI2ludC4gTGlidmlydCB2ZXJzaW9uIHVzZWQgdG8gY29tcGlsZSBoeXBlcnZpc29yCisgICAgICAgIHNlbGYuZG9tYWlucyA9IGxpc3QoKSAgICAgICAjbGlzdC4gTGlzdCBvZiBhbGwgdGhlIGF2YWlsYWJsZSBkb21haW5zCisgICAgICAgIAorICAgIGRlZiBzZXQoc2VsZiwgaHlwZXJ2aXNvciwgdmVyc2lvbiwgbGliX3ZlcnNpb24sIGRvbWFpbnMpOgorICAgICAgICB3YXJuaW5nX3RleHQ9IiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaHlwZXJ2aXNvcixzdHIpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSB2YXJpYWJsZSB0eXBlXyBtdXN0IGJlIG9mIHR5cGUgc3RyJykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbixpbnQpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSB2YXJpYWJsZSB2ZXJzaW9uIG11c3QgYmUgb2YgdHlwZSBpbnQnKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShsaWJfdmVyc2lvbixpbnQpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSBsaWJyYXJ5IHZlcnNpb24gbXVzdCBiZSBvZiB0eXBlIGludCcpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRvbWFpbnMsbGlzdCk6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnRG9tYWlucyBtdXN0IGJlIGEgbGlzdCBvZiB0aGUgcG9zc2libGUgZG9tYWlucyBhcyBzdHInKQorICAgICAgICAKKyAgICAgICAgaWYgbm90IGh5cGVydmlzb3IgaW4gc2VsZi5wb3NzaWJsZV90eXBlczoKKyAgICAgICAgICAgIHdhcm5pbmdfdGV4dCArPSAiSHlwZXJwaXZvciAnJXMnIG5vdCBhbW9uZzogJXNcbiIgJSAoaHlwZXJ2aXNvciwgc3RyKHNlbGYucG9zc2libGVfdHlwZXMpKQorICAgICAgICAKKyAgICAgICAgdmFsaWRfZG9tYWluX2ZvdW5kID0gRmFsc2UKKyAgICAgICAgZm9yIGRvbWFpbiBpbiBkb21haW5zOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZG9tYWluLHN0cik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ0RvbWFpbnMgbXVzdCBiZSBhIGxpc3Qgb2YgdGhlIHBvc3NpYmxlIGRvbWFpbnMgYXMgc3RyJykKKyAgICAgICAgICAgIGlmIGRvbWFpbiBpbiBzZWxmLnBvc3NpYmxlX2RvbWFpbl90eXBlczoKKyAgICAgICAgICAgICAgICB2YWxpZF9kb21haW5fZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5kb21haW5zLmFwcGVuZChkb21haW4pCisgICAgICAgICAgICAgICAgCisgICAgICAgIGlmIG5vdCB2YWxpZF9kb21haW5fZm91bmQ6CisgICAgICAgICAgICB3YXJuaW5nX3RleHQgKz0gJ05vIHZhbGlkIGRvbWFpbiBmb3VuZCBhbW9uZzogJXNcbicgJSBzdHIoc2VsZi5wb3NzaWJsZV9kb21haW5fdHlwZXMpCisgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIChzZWxmLnZlcnNpb24sIHNlbGYubGliX3ZlcnNpb24sIHNlbGYudHlwZV8pID0gKHZlcnNpb24sIGxpYl92ZXJzaW9uLCBoeXBlcnZpc29yKQorICAgICAgICByZXR1cm4gKFRydWUsIHdhcm5pbmdfdGV4dCkKKyAgICAgCisgICAgZGVmIGFzc2lnbihzZWxmLCBoeXBlcnZpc29yKToKKyAgICAgICAgKHNlbGYudmVyc2lvbiwgc2VsZi5saWJfdmVyc2lvbiwgc2VsZi50eXBlXykgPSAoaHlwZXJ2aXNvci52ZXJzaW9uLCBoeXBlcnZpc29yLmxpYl92ZXJzaW9uLCBoeXBlcnZpc29yLnR5cGVfKQorICAgICAgICBmb3IgZG9tYWluIGluIGh5cGVydmlzb3IuZG9tYWluczoKKyAgICAgICAgICAgIHNlbGYuZG9tYWlucy5hcHBlbmQoZG9tYWluKQorICAgICAgICByZXR1cm4KKyAgICAgICAgICAgCisgICAgZGVmIHRvX3RleHQoc2VsZik6CisgICAgICAgIHRleHQ9ICcgICAgdHlwZTogJytzZWxmLnR5cGVfKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgdmVyc2lvbjogJytzdHIoc2VsZi52ZXJzaW9uKSsnXG4nCisgICAgICAgIHRleHQrPSAnICAgIGxpYnZpcnQgdmVyc2lvbjogJysgc3RyKHNlbGYubGliX3ZlcnNpb24pKydcbicKKyAgICAgICAgdGV4dCs9ICcgICAgZG9tYWluczogJytzdHIoc2VsZi5kb21haW5zKSsnXG4nCisgICAgICAgIHJldHVybiB0ZXh0CisgICAgICAgIAorY2xhc3MgT3BTeXMoKToKKyAgICAjRGVmaW5pdGlvbiBvZiB0aGUgcG9zc2libGUgdmFsdWVzIG9mIG9zIHZhcmlhYmxlcworICAgIHBvc3NpYmxlX2lkID0gZGVmaW5pdGlvbnNDbGFzcy5vc19wb3NzaWJsZV9pZAorICAgIHBvc3NpYmxlX3R5cGVzID0gZGVmaW5pdGlvbnNDbGFzcy5vc19wb3NzaWJsZV90eXBlcworICAgIHBvc3NpYmxlX2FyY2hpdGVjdHVyZXMgPSBkZWZpbml0aW9uc0NsYXNzLm9zX3Bvc3NpYmxlX2FyY2hpdGVjdHVyZXMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5pZF8gPSBOb25lICAgICAgICAgICAgICAgICAgICNUZXh0LiBJZGVudGlmaWVyIG9mIHRoZSBPUy4gRm9ybWVkIGJ5IDxEaXN0aWJ1dG9yIElEPi08UmVsZWFzZT4tPENvZGVuYW1lPi4gSW4gbGludXggdGhpcyBjYW4gYmUgb2J0YWluZWQgdXNpbmcgbHNiX3JlbGVhc2UgLWEKKyAgICAgICAgc2VsZi50eXBlXyA9IE5vbmUgICAgICAgICAgICAgICAgICNUZXh0LiBUeXBlIG9mIG9wZXJhdGluZyBzeXN0ZW0KKyAgICAgICAgc2VsZi5iaXRfYXJjaGl0ZWN0dXJlID0gTm9uZSAgICAgI0ludGVnZXIuIEFyY2hpdGVjdHVyZQorICAgICAgICAKKyAgICBkZWYgc2V0KHNlbGYsIGlkXywgdHlwZV8sIGJpdF9hcmNoaXRlY3R1cmUpOgorICAgICAgICB3YXJuaW5nX3RleHQ9IiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodHlwZV8sc3RyKToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgdmFyaWFibGUgdHlwZV8gbXVzdCBiZSBvZiB0eXBlIHN0cicpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGlkXyxzdHIpOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1RoZSB2YXJpYWJsZSBpZF8gbXVzdCBiZSBvZiB0eXBlIHN0cicpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJpdF9hcmNoaXRlY3R1cmUsc3RyKToKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdUaGUgdmFyaWFibGUgYml0X2FyY2hpdGVjdHVyZSBtdXN0IGJlIG9mIHR5cGUgc3RyJykKKyAgICAgICAgCisgICAgICAgIGlmIG5vdCB0eXBlXyBpbiBzZWxmLnBvc3NpYmxlX3R5cGVzOgorICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9ICJvcyB0eXBlICclcycgbm90IGFtb25nOiAlc1xuIiAlKHR5cGVfLCBzdHIoc2VsZi5wb3NzaWJsZV90eXBlcykpCisgICAgICAgIGlmIG5vdCBpZF8gaW4gc2VsZi5wb3NzaWJsZV9pZDoKKyAgICAgICAgICAgIHdhcm5pbmdfdGV4dCArPSAib3MgcmVsZWFzZSAnJXMnIG5vdCBhbW9uZzogJXNcbiIgJShpZF8sIHN0cihzZWxmLnBvc3NpYmxlX2lkKSkKKyAgICAgICAgaWYgbm90IGJpdF9hcmNoaXRlY3R1cmUgaW4gc2VsZi5wb3NzaWJsZV9hcmNoaXRlY3R1cmVzOgorICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9ICJvcyBiaXRfYXJjaGl0ZWN0dXJlICclcycgbm90IGFtb25nOiAlc1xuIiAlIChiaXRfYXJjaGl0ZWN0dXJlLCBzdHIoc2VsZi5wb3NzaWJsZV9hcmNoaXRlY3R1cmVzKSkKKyAgICAgICAgCisgICAgICAgIChzZWxmLmlkXywgc2VsZi50eXBlXywgc2VsZi5iaXRfYXJjaGl0ZWN0dXJlKSA9IChpZF8sIHR5cGVfLCBiaXRfYXJjaGl0ZWN0dXJlKQorICAgICAgICByZXR1cm4gKFRydWUsIHdhcm5pbmdfdGV4dCkKKyAgICAKKyAgICBkZWYgYXNzaWduKHNlbGYsb3MpOgorICAgICAgICAoc2VsZi5pZF8sIHNlbGYudHlwZV8sIHNlbGYuYml0X2FyY2hpdGVjdHVyZSkgPSAob3MuaWRfLCBvcy50eXBlXywgb3MuYml0X2FyY2hpdGVjdHVyZSkKKyAgICAgICAgcmV0dXJuCisgICAgCisgICAgZGVmIHRvX3RleHQoc2VsZik6CisgICAgICAgIHRleHQ9ICcgICAgaWQ6ICcrc2VsZi5pZF8rJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICB0eXBlOiAnK3NlbGYudHlwZV8rJ1xuJworICAgICAgICB0ZXh0Kz0gJyAgICBiaXRfYXJjaGl0ZWN0dXJlOiAnK3NlbGYuYml0X2FyY2hpdGVjdHVyZSsnXG4nCisgICAgICAgIHJldHVybiB0ZXh0CisgICAgIAorZGVmIGdldF9ob3N0bmFtZSh2aXJzaF9jb25uKToKKyAgICByZXR1cm4gdmlyc2hfY29ubi5nZXRIb3N0bmFtZSgpLnJzdHJpcCgnXG4nKQorCitkZWYgZ2V0X2h1Z2VwYWdlX3NpemUoc3NoX2Nvbm4pOgorICAgIGNvbW1hbmQgPSAnc3VkbyBodWdlYWRtIC0tcGFnZS1zaXplcycKKyMgIGNvbW1hbmQgPSAnaHVnZWFkbSAtLXBhZ2Utc2l6ZXMtYWxsJworICAgIChfLCBzdGRvdXQsIHN0ZGVycikgPSBzc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICBlcnJvciA9IHN0ZGVyci5yZWFkKCkKKyAgICBpZiBsZW4oZXJyb3IpPjA6CisgICAgICAgIHJhaXNlIHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uKGNvbW1hbmQgKycgOiAnKyBlcnJvcikKKyAgICBtZW09c3Rkb3V0LnJlYWQoKQorICAgIGlmIG1lbT09IiI6CisgICAgICAgIHJldHVybiAwCisgICAgcmV0dXJuIGludChtZW0pCisKK2RlZiBnZXRfaHVnZXBhZ2VfbnIoc3NoX2Nvbm4saHVnZXBhZ2Vfc3osIG5vZGVfaWQpOgorICAgIGNvbW1hbmQgPSAnY2F0IC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlJytzdHIobm9kZV9pZCkrJy9odWdlcGFnZXMvaHVnZXBhZ2VzLScrc3RyKGh1Z2VwYWdlX3N6LzEwMjQpKydrQi9ucl9odWdlcGFnZXMnCisgICAgKF8sIHN0ZG91dCwgXykgPSBzc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICAjcHJpbnQgY29tbWFuZCwgCisgICAgI3RleHQgPSBzdGRvdXQucmVhZCgpCisgICAgI3ByaW50ICInIit0ZXh0KyInIgorICAgICNyZXR1cm4gaW50KHRleHQpCisgICAgCisgICAgdHJ5OgorICAgICAgICB2YWx1ZT1pbnQoc3Rkb3V0LnJlYWQoKSkKKyAgICBleGNlcHQ6IAorICAgICAgICB2YWx1ZT0wCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBnZXRfbWVtb3J5X2luZm9ybWF0aW9uKHNzaF9jb25uLCB2aXJzaF9jb25uLCBtZW1vcnlfbm9kZXMpOgorICAgIHdhcm5pbmdfdGV4dD0iIgorICAgIHRyZWU9RWxlbWVudFRyZWUuZnJvbXN0cmluZyh2aXJzaF9jb25uLmdldFN5c2luZm8oMCkpCisgICAgbWVtb3J5X2RpY3QgPSBkaWN0KCkKKyAgICBub2RlX2lkID0gMCAjVE9ETyByZXZpc2UuIEFkZGVkIGZvciBhbGxvd2luZyBWTSBhcyBjb21wdXRlIGhvc3RzIAorICAgIGZvciB0YXJnZXQgaW4gdHJlZS5maW5kYWxsKCJtZW1vcnlfZGV2aWNlIik6CisgICAgICAgIGxvY2F0b3JfZiA9IHNpemVfZiA9IGZyZXFfZiA9IHR5cGVfZiA9IGZvcm1mYWN0b3JfZiA9IEZhbHNlCisgICAgICAgIGxvY2F0b3JfZiA9IFRydWUgI1RPRE8gcmV2aXNlLiBBZGRlZCBmb3IgYWxsb3dpbmcgVk0gYXMgY29tcHV0ZSBob3N0cworICAgICAgICBtb2R1bGVfZm9ybV9mYWN0b3IgPSAiIgorICAgICAgICBmb3IgZW50cnkgaW4gdGFyZ2V0LmZpbmRhbGwoImVudHJ5Iik6CisgICAgICAgICAgICBpZiBlbnRyeS5nZXQoIm5hbWUiKSA9PSAnc2l6ZSc6CisgICAgICAgICAgICAgICAgc2l6ZV9mID0gVHJ1ZQorICAgICAgICAgICAgICAgIHNpemVfc3BsaXQgPSBlbnRyeS50ZXh0LnNwbGl0KCcgJykKKyAgICAgICAgICAgICAgICBpZiBzaXplX3NwbGl0WzFdID09ICdNQic6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9zaXplID0gaW50KHNpemVfc3BsaXRbMF0pICogMTAyNCAqIDEwMjQKKyAgICAgICAgICAgICAgICBlbGlmIHNpemVfc3BsaXRbMV0gPT0gJ0dCJzoKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlX3NpemUgPSBpbnQoc2l6ZV9zcGxpdFswXSkgKiAxMDI0ICogMTAyNCAqIDEwMjQKKyAgICAgICAgICAgICAgICBlbGlmIHNpemVfc3BsaXRbMV0gPT0gJ0tCJzoKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlX3NpemUgPSBpbnQoc2l6ZV9zcGxpdFswXSkgKiAxMDI0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlX3NpemUgPSBpbnQoc2l6ZV9zcGxpdFswXSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGVsaWYgZW50cnkuZ2V0KCJuYW1lIikgPT0gJ3NwZWVkJzoKKyAgICAgICAgICAgICAgICBmcmVxX2YgPSBUcnVlCisgICAgICAgICAgICAgICAgZnJlcV9zcGxpdCA9IGVudHJ5LnRleHQuc3BsaXQoJyAnKQorICAgICAgICAgICAgICAgIGlmIGZyZXFfc3BsaXRbMV0gPT0gJ01Ieic6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9mcmVxID0gaW50KGZyZXFfc3BsaXRbMF0pICogMTAyNCAqIDEwMjQKKyAgICAgICAgICAgICAgICBlbGlmIGZyZXFfc3BsaXRbMV0gPT0gJ0dIeic6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9mcmVxID0gaW50KGZyZXFfc3BsaXRbMF0pICogMTAyNCAqIDEwMjQgKiAxMDI0CisgICAgICAgICAgICAgICAgZWxpZiBmcmVxX3NwbGl0WzFdID09ICdLSHonOgorICAgICAgICAgICAgICAgICAgICBtb2R1bGVfZnJlcSA9IGludChmcmVxX3NwbGl0WzBdKSAqIDEwMjQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZWxpZiBlbnRyeS5nZXQoIm5hbWUiKSA9PSAndHlwZSc6CisgICAgICAgICAgICAgICAgdHlwZV9mID0gVHJ1ZQorICAgICAgICAgICAgICAgIG1vZHVsZV90eXBlID0gZW50cnkudGV4dAorICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZWxpZiBlbnRyeS5nZXQoIm5hbWUiKSA9PSAnZm9ybV9mYWN0b3InOgorICAgICAgICAgICAgICAgIGZvcm1mYWN0b3JfZiA9IFRydWUKKyAgICAgICAgICAgICAgICBtb2R1bGVfZm9ybV9mYWN0b3IgPSBlbnRyeS50ZXh0ICAKKyAgICAgICAgICAgICNUT0RPIHJldmlzZS4gQ29tbWVudGVkIGZvciBhbGxvd2luZyBWTSBhcyBjb21wdXRlIGhvc3RzCisgICAgICAgICAgICAjIGVsaWYgZW50cnkuZ2V0KCJuYW1lIikgPT0gJ2xvY2F0b3InIGFuZCBub3QgbG9jYXRvcl9mOgorICAgICAgICAgICAgIyAgICAgIyBvdGhlciBjYXNlLCBpdCBpcyBvYnRhaW5lZCBieSBiYW5rX2xvY2F0b3IgdGhhdCB3ZSBnaXZlIHByaW9yaXR5IHRvCisgICAgICAgICAgICAjICAgICBsb2NhdG9yID0gZW50cnkudGV4dAorICAgICAgICAgICAgIyAgICAgcG9zID0gbG9jYXRvci5maW5kKG1vZHVsZV9mb3JtX2ZhY3RvcikKKyAgICAgICAgICAgICMgICAgIGlmIG1vZHVsZV9mb3JtX2ZhY3RvciA9PSBsb2NhdG9yWzA6bGVuKG1vZHVsZV9mb3JtX2ZhY3RvcikgXToKKyAgICAgICAgICAgICMgICAgICAgICBwb3MgPSBsZW4obW9kdWxlX2Zvcm1fZmFjdG9yKSArMSAKKyAgICAgICAgICAgICMgICAgIGVsc2U6CisgICAgICAgICAgICAjICAgICAgICAgcG9zID0gMAorICAgICAgICAgICAgIyAgICAgaWYgbG9jYXRvcltwb3NdIGluICJBQkNERUZHSCI6ICAKKyAgICAgICAgICAgICMgICAgICAgICBsb2NhdG9yX2YgPSBUcnVlCisgICAgICAgICAgICAjICAgICAgICAgbm9kZV9pZCA9IG9yZChsb2NhdG9yW3Bvc10pLW9yZCgnQScpCisgICAgICAgICAgICAjICAgICAgICAgI3ByaW50IGVudHJ5LnRleHQsIG5vZGVfaWQKKyAgICAgICAgICAgICMgCisgICAgICAgICAgICAjIGVsaWYgZW50cnkuZ2V0KCJuYW1lIikgPT0gJ2JhbmtfbG9jYXRvcic6CisgICAgICAgICAgICAjICAgICBsb2NhdG9yID0gZW50cnkudGV4dAorICAgICAgICAgICAgIyAgICAgcG9zID0gbG9jYXRvci5maW5kKCJOT0RFICIpCisgICAgICAgICAgICAjICAgICBpZiBwb3MgPj0gMCBhbmQgbGVuKGxvY2F0b3IpPnBvcys1OgorICAgICAgICAgICAgIyAgICAgICAgIGlmIGxvY2F0b3JbcG9zKzVdIGluICgiMDEyMzQ1NjciKTogI2xlbigiTk9ERSAiKSBpcyA1CisgICAgICAgICAgICAjICAgICAgICAgICAgIG5vZGVfaWQgPSBpbnQobG9jYXRvcltwb3MrNV0pCisgICAgICAgICAgICAjICAgICAgICAgICAgIGxvY2F0b3JfZiA9IFRydWUKKyAgICAgICAgICAgICMgIAorCisgICAgICAgICNXaGVuIGFsbCBtb2R1bGUgZmllbGRzIGhhdmUgYmVlbiBmb3VuZCBhZGQgYSBuZXcgbW9kdWxlIHRvIHRoZSBsaXN0IAorICAgICAgICBpZiBsb2NhdG9yX2YgYW5kIHNpemVfZiBhbmQgZnJlcV9mIGFuZCB0eXBlX2YgYW5kIGZvcm1mYWN0b3JfZjoKKyAgICAgICAgICAgICNJZiB0aGUgbWVtb3J5IG5vZGUgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkIGNyZWF0ZSBpdAorICAgICAgICAgICAgaWYgbm9kZV9pZCBub3QgaW4gbWVtb3J5X2RpY3Q6CisgICAgICAgICAgICAgICAgbWVtb3J5X2RpY3Rbbm9kZV9pZF0gPSBbXQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgI0FkZCBhIG5ldyBtb2R1bGUgdG8gdGhlIG1lbW9yeSBub2RlCisgICAgICAgICAgICBtb2R1bGUgPSBNZW1vcnlNb2R1bGUoKQorICAgICAgICAgICAgI1RPRE8gcmV2aXNlLiBDaGFuZ2VkIGZvciBhbGxvd2luZyBWTSBhcyBjb21wdXRlIGhvc3RzCisgICAgICAgICAgICAocmV0dXJuX3N0YXR1cywgY29kZSkgPSBtb2R1bGUuc2V0KCdOT0RFICVkJyAlIG5vZGVfaWQsIG1vZHVsZV90eXBlLCBtb2R1bGVfZnJlcSwgbW9kdWxlX3NpemUsIG1vZHVsZV9mb3JtX2ZhY3RvcikKKyAgICAgICAgICAgICMocmV0dXJuX3N0YXR1cywgY29kZSkgPSBtb2R1bGUuc2V0KGxvY2F0b3IsIG1vZHVsZV90eXBlLCBtb2R1bGVfZnJlcSwgbW9kdWxlX3NpemUsIG1vZHVsZV9mb3JtX2ZhY3RvcikKKyAgICAgICAgICAgIGlmIG5vdCByZXR1cm5fc3RhdHVzOgorICAgICAgICAgICAgICAgIHJldHVybiAocmV0dXJuX3N0YXR1cywgY29kZSkKKyAgICAgICAgICAgIG1lbW9yeV9kaWN0W25vZGVfaWRdLmFwcGVuZChtb2R1bGUpCisgICAgICAgICAgICBpZiBjb2RlIG5vdCBpbiB3YXJuaW5nX3RleHQ6CisgICAgICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9IGNvZGUKKyAgICAgICAgICAgIG5vZGVfaWQgKz0gMSAjVE9ETyByZXZpc2UuIEFkZGVkIGZvciBhbGxvd2luZyBWTSBhcyBjb21wdXRlIGhvc3RzCisgICAgCisgICAgI0ZpbGwgbWVtb3J5IG5vZGVzCisgICAgI0h1Z2VwYWdlIHNpemUgaXMgY29uc3RhbnQgZm9yIGFsbCBub2RlcworICAgIGh1Z2VwYWdlX3N6ID0gZ2V0X2h1Z2VwYWdlX3NpemUoc3NoX2Nvbm4pCisgICAgZm9yIG5vZGVfaWQsIG1vZHVsZXMgaW4gbWVtb3J5X2RpY3QuaXRlcml0ZW1zKCk6CisgICAgICAgIG1lbW9yeV9ub2RlID0gTWVtb3J5Tm9kZSgpCisgICAgICAgIG1lbW9yeV9ub2RlLnNldChtb2R1bGVzLCBodWdlcGFnZV9zeiwgZ2V0X2h1Z2VwYWdlX25yKHNzaF9jb25uLGh1Z2VwYWdlX3N6LCBub2RlX2lkKSkKKyAgICAgICAgbWVtb3J5X25vZGVzW25vZGVfaWRdID0gbWVtb3J5X25vZGUKKyAgICAgICAgCisgICAgcmV0dXJuIChUcnVlLCB3YXJuaW5nX3RleHQpCisKK2RlZiBnZXRfY3B1X3RvcG9sb2d5X2h0KHNzaF9jb25uLCB0b3BvbG9neSk6CisgICAgY29tbWFuZCA9ICdjYXQgL3Byb2MvY3B1aW5mbycKKyAgICAoXywgc3Rkb3V0LCBzdGRlcnIpID0gc3NoX2Nvbm4uZXhlY19jb21tYW5kKGNvbW1hbmQpCisgICAgZXJyb3IgPSBzdGRlcnIucmVhZCgpCisgICAgaWYgbGVuKGVycm9yKT4wOgorICAgICAgICByYWlzZSBwYXJhbWlrby5zc2hfZXhjZXB0aW9uLlNTSEV4Y2VwdGlvbihjb21tYW5kICsnIDogJysgZXJyb3IpCisgICAgc29ja2V0cyA9IFtdCisgICAgY29yZXMgPSBbXQorICAgIGNvcmVfbWFwID0ge30KKyAgICBjb3JlX2RldGFpbHMgPSBbXQorICAgIGNvcmVfbGluZXMgPSB7fQorICAgIGZvciBsaW5lIGluIHN0ZG91dC5yZWFkbGluZXMoKToKKyAgICAgICAgaWYgbGVuKGxpbmUuc3RyaXAoKSkgIT0gMDoKKyAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gbGluZS5zcGxpdCgiOiIsIDEpCisgICAgICAgICAgICBjb3JlX2xpbmVzW25hbWUuc3RyaXAoKV0gPSB2YWx1ZS5zdHJpcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb3JlX2RldGFpbHMuYXBwZW5kKGNvcmVfbGluZXMpCisgICAgICAgICAgICBjb3JlX2xpbmVzID0ge30KKyAgICAKKyAgICBmb3IgY29yZSBpbiBjb3JlX2RldGFpbHM6CisgICAgICAgIGZvciBmaWVsZCBpbiBbInByb2Nlc3NvciIsICJjb3JlIGlkIiwgInBoeXNpY2FsIGlkIl06CisgICAgICAgICAgICBpZiBmaWVsZCBub3QgaW4gY29yZToKKyAgICAgICAgICAgICAgICByZXR1cm4oRmFsc2UsJ0Vycm9yIGdldHRpbmcgJytmaWVsZCsnIHZhbHVlIGZyb20gL3Byb2MvY3B1aW5mbycpCisgICAgICAgICAgICBjb3JlW2ZpZWxkXSA9IGludChjb3JlW2ZpZWxkXSkKKyAgICAKKyAgICAgICAgaWYgY29yZVsiY29yZSBpZCJdIG5vdCBpbiBjb3JlczoKKyAgICAgICAgICAgIGNvcmVzLmFwcGVuZChjb3JlWyJjb3JlIGlkIl0pCisgICAgICAgIGlmIGNvcmVbInBoeXNpY2FsIGlkIl0gbm90IGluIHNvY2tldHM6CisgICAgICAgICAgICBzb2NrZXRzLmFwcGVuZChjb3JlWyJwaHlzaWNhbCBpZCJdKQorICAgICAgICBrZXkgPSAoY29yZVsicGh5c2ljYWwgaWQiXSwgY29yZVsiY29yZSBpZCJdKQorICAgICAgICBpZiBrZXkgbm90IGluIGNvcmVfbWFwOgorICAgICAgICAgICAgY29yZV9tYXBba2V5XSA9IFtdCisgICAgICAgIGNvcmVfbWFwW2tleV0uYXBwZW5kKGNvcmVbInByb2Nlc3NvciJdKQorICAgICAgCisgICAgZm9yIHMgaW4gc29ja2V0czoKKyAgICAgICAgaHlwZXJ0aHJlYWRlZF9jb3JlcyA9IGxpc3QoKQorICAgICAgICBmb3IgYyBpbiBjb3JlczoKKyAgICAgICAgICAgIGh5cGVydGhyZWFkZWRfY29yZXMuYXBwZW5kKGNvcmVfbWFwWyhzLGMpXSkKKyAgICAgICAgdG9wb2xvZ3lbc10gPSBoeXBlcnRocmVhZGVkX2NvcmVzCisgICAgICAKKyAgICByZXR1cm4gKFRydWUsICIiKQorCitkZWYgZ2V0X3Byb2Nlc3Nvcl9pbmZvcm1hdGlvbihzc2hfY29ubiwgdmlzaF9jb25uLCBwcm9jZXNzb3JzKToKKyAgICB3YXJuaW5nX3RleHQ9IiIKKyAgICAjUHJvY2Vzc29yIGZlYXR1cmVzIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHByb2Nlc3NvcnMKKyAgICAjVE9ETyAoYXQgbGVhc3QgdXNpbmcgdmlyc2ggY2FwYWJpbGl0aWVzKW5yX251bWFfbm9kZXMKKyAgICBjYXBhYmlsaXRpZXMgPSBsaXN0KCkKKyAgICB0cmVlPUVsZW1lbnRUcmVlLmZyb21zdHJpbmcodmlzaF9jb25uLmdldENhcGFiaWxpdGllcygpKQorICAgIGZvciB0YXJnZXQgaW4gdHJlZS5maW5kYWxsKCJob3N0L2NwdS9mZWF0dXJlIik6CisgICAgICAgIGlmIHRhcmdldC5nZXQoIm5hbWUiKSA9PSAncGRwZTFnYic6CisgICAgICAgICAgICBjYXBhYmlsaXRpZXMuYXBwZW5kKCdscHMnKQorICAgICAgICBlbGlmIHRhcmdldC5nZXQoIm5hbWUiKSA9PSAnZGNhJzoKKyAgICAgICAgICAgIGNhcGFiaWxpdGllcy5hcHBlbmQoJ2Rpb2MnKSAgCisgICAgICAgIGVsaWYgdGFyZ2V0LmdldCgibmFtZSIpID09ICd2bXgnIG9yIHRhcmdldC5nZXQoIm5hbWUiKSA9PSAnc3ZtJzoKKyAgICAgICAgICAgIGNhcGFiaWxpdGllcy5hcHBlbmQoJ2h3c3YnKQorICAgICAgICBlbGlmIHRhcmdldC5nZXQoIm5hbWUiKSA9PSAnaHQnOgorICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmFwcGVuZCgnaHQnKQorICAgICAgICAKKyAgICB0YXJnZXQgPSB0cmVlLmZpbmQoImhvc3QvY3B1L2FyY2giKQorICAgIGlmIHRhcmdldC50ZXh0ID09ICd4ODZfNjQnIG9yIHRhcmdldC50ZXh0ID09ICdhbWQ2NCc6CisgICAgICAgIGNhcGFiaWxpdGllcy5hcHBlbmQoJzY0YicpCisgICAgICAKKyAgICBjb21tYW5kID0gJ2NhdCAvcHJvYy9jcHVpbmZvIHwgZ3JlcCBmbGFncycKKyAgICAoXywgc3Rkb3V0LCBzdGRlcnIpID0gc3NoX2Nvbm4uZXhlY19jb21tYW5kKGNvbW1hbmQpCisgICAgZXJyb3IgPSBzdGRlcnIucmVhZCgpCisgICAgaWYgbGVuKGVycm9yKT4wOgorICAgICAgICByYWlzZSBwYXJhbWlrby5zc2hfZXhjZXB0aW9uLlNTSEV4Y2VwdGlvbihjb21tYW5kICsnIDogJysgZXJyb3IpCisgICAgbGluZSA9IHN0ZG91dC5yZWFkbGluZSgpCisgICAgaWYgJ2VwdCcgaW4gbGluZSBvciAnbnB0JyBpbiBsaW5lOgorICAgICAgICBjYXBhYmlsaXRpZXMuYXBwZW5kKCd0bGJwcycpCisgICAgCisgICAgI0ZpbmQgb3V0IGlmIElPTU1VIGlzIGVuYWJsZWQKKyAgICBjb21tYW5kID0gJ2RtZXNnIHxncmVwIC1lIEludGVsLUlPTU1VJworICAgIChfLCBzdGRvdXQsIHN0ZGVycikgPSBzc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICBlcnJvciA9IHN0ZGVyci5yZWFkKCkKKyAgICBpZiBsZW4oZXJyb3IpPjA6CisgICAgICAgIHJhaXNlIHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uKGNvbW1hbmQgKycgOiAnKyBlcnJvcikKKyAgICBpZiAnZW5hYmxlZCcgaW4gc3Rkb3V0LnJlYWQoKToKKyAgICAgICAgY2FwYWJpbGl0aWVzLmFwcGVuZCgnaW9tbXUnKQorICAgICAgCisgICAgI0VxdWl2YWxlbnQgZm9yIEFNRAorICAgIGNvbW1hbmQgPSAnZG1lc2cgfGdyZXAgLWUgQU1ELVZpJworICAgIChfLCBzdGRvdXQsIHN0ZGVycikgPSBzc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICBlcnJvciA9IHN0ZGVyci5yZWFkKCkKKyAgICBpZiBsZW4oZXJyb3IpPjA6CisgICAgICAgIHJhaXNlIHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uKGNvbW1hbmQgKycgOiAnKyBlcnJvcikKKyAgICBpZiBsZW4oc3Rkb3V0LnJlYWQoKSkgPiAwOgorICAgICAgICBjYXBhYmlsaXRpZXMuYXBwZW5kKCdpb21tdScpCisgICAgCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdG9wb2xvZ3kgPSBkaWN0KCkKKyAgICAjSW4gY2FzZSBoeXBlcnRocmVhZGluZyBpcyBhY3RpdmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGRldGVybWluZSBjcHUgdG9wb2xvZ3kgdXNpbmcgL3Byb2MvY3B1aW5mbworICAgIGlmICdodCcgaW4gY2FwYWJpbGl0aWVzOgorICAgICAgICAocmV0dXJuX3N0YXR1cywgY29kZSkgPSBnZXRfY3B1X3RvcG9sb2d5X2h0KHNzaF9jb25uLCB0b3BvbG9neSkKKyAgICAgICAgaWYgbm90IHJldHVybl9zdGF0dXM6CisgICAgICAgICAgICByZXR1cm4gKHJldHVybl9zdGF0dXMsIGNvZGUpCisgICAgICAgIHdhcm5pbmdfdGV4dCArPSBjb2RlCisKKyAgICAjT3RoZXJ3aXNlIGl0IGlzIHBvc3NpYmxlIHRvIGRvIGl0IHVzaW5nIHZpcnNoIGNhcGFiaWxpdGllcworICAgIGVsc2U6CisgICAgICAgIGZvciB0YXJnZXQgaW4gdHJlZS5maW5kYWxsKCJob3N0L3RvcG9sb2d5L2NlbGxzL2NlbGwiKToKKyAgICAgICAgICAgIHNvY2tldF9pZCA9IGludCh0YXJnZXQuZ2V0KCJpZCIpKQorICAgICAgICAgICAgdG9wb2xvZ3lbc29ja2V0X2lkXSA9IGxpc3QoKQorICAgICAgICAgICAgZm9yIGNwdSBpbiB0YXJnZXQuZmluZGFsbCgiY3B1cy9jcHUiKToKKyAgICAgICAgICAgICAgICB0b3BvbG9neVtzb2NrZXRfaWRdLmFwcGVuZChpbnQoY3B1LmdldCgiaWQiKSkpCisgICAgCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgCisgICAgI0NyZWF0ZSBhIGRpY3Rpb25hcnkgd2l0aCB0aGUgaW5mb3JtYXRpb24gb2YgYWxsIHByb2Nlc3NvcnMKKyAgICAjcF9mYW0gPSBwX21hbiA9IHBfdmVyID0gTm9uZQorICAgIHRyZWU9RWxlbWVudFRyZWUuZnJvbXN0cmluZyh2aXNoX2Nvbm4uZ2V0U3lzaW5mbygwKSkKKyAgICAjcHJpbnQgdmlzaF9jb25uLmdldFN5c2luZm8oMCkKKyAgICAjcmV0dXJuIChGYWxzZSwgJ2ZvcmNlcyBlcnJvciBmb3IgZGVidWdpbmcnKQorICAgIG5vdF9wb3B1bGF0ZWQ9RmFsc2UKKyAgICBzb2NrZXRfaWQgPSAtMSAgICAgI2luIGNhc2Ugd2UgY2FuIG5vdCBkZXRlcm1pbmUgdGhlIHNvY2tldF9pZCB3ZSBhc3N1bWUgaW5jcmVtZW50YWwgb3JkZXIsIHN0YXJ0aW5nIGJ5IDAKKyAgICBmb3IgdGFyZ2V0IGluIHRyZWUuZmluZGFsbCgicHJvY2Vzc29yIik6CisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBzb2NrZXRfaWQgKz0gMQorICAgICAgICAjR2V0IHByb2Nlc3NvciBpZCwgZmFtaWx5LCBtYW51ZmFjdHVyZXIgYW5kIHZlcnNpb24KKyAgICAgICAgZm9yIGVudHJ5IGluIHRhcmdldC5maW5kYWxsKCJlbnRyeSIpOgorICAgICAgICAgICAgaWYgZW50cnkuZ2V0KCJuYW1lIikgPT0gInN0YXR1cyI6CisgICAgICAgICAgICAgICAgaWYgZW50cnkudGV4dFswOjExXSA9PSAiVW5wb3B1bGF0ZWQiOgorICAgICAgICAgICAgICAgICAgICBub3RfcG9wdWxhdGVkPVRydWUKKyAgICAgICAgICAgIGVsaWYgZW50cnkuZ2V0KCJuYW1lIikgPT0gJ3NvY2tldF9kZXN0aW5hdGlvbic6CisgICAgICAgICAgICAgICAgc29ja2V0X3RleHQgPSBlbnRyeS50ZXh0CisgICAgICAgICAgICAgICAgaWYgc29ja2V0X3RleHQuc3RhcnRzd2l0aCgnQ1BVJyk6CisgICAgICAgICAgICAgICAgICAgIHNvY2tldF90ZXh0ID0gc29ja2V0X3RleHQuc3RyaXAoJ0NQVScpCisgICAgICAgICAgICAgICAgICAgIHNvY2tldF90ZXh0ID0gc29ja2V0X3RleHQuc3RyaXAoKSAjcmVtb3ZlcyB0cmFpbGluZyBzcGFjZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgc29ja2V0X3RleHQuaXNkaWdpdCgpIGFuZCBpbnQoc29ja2V0X3RleHQpPDkgYW5kIGludChzb2NrZXRfdGV4dCk+MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9pZCA9IGludChzb2NrZXRfdGV4dCkgLSAxCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZWxpZiBlbnRyeS5nZXQoIm5hbWUiKSA9PSAnZmFtaWx5JzoKKyAgICAgICAgICAgICAgICBmYW1pbHkgPSBlbnRyeS50ZXh0CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgZWxpZiBlbnRyeS5nZXQoIm5hbWUiKSA9PSAnbWFudWZhY3R1cmVyJzoKKyAgICAgICAgICAgICAgICBtYW51ZmFjdHVyZXIgPSBlbnRyeS50ZXh0CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgZWxpZiBlbnRyeS5nZXQoIm5hbWUiKSA9PSAndmVyc2lvbic6CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGVudHJ5LnRleHQuc3RyaXAoKQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgaWYgY291bnQgIT0gMzoKKyAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdFcnJvci4gTm90IGFsbCBleHBlY3RlZCBmaWVsZHMgY291bGQgYmUgZm91bmQgaW4gcHJvY2Vzc29yJykKKyAgICAgICAgCisgICAgICAgICNDcmVhdGUgYW5kIGZpbGwgcHJvY2Vzc29yIHN0cnVjdHVyZQorICAgICAgICBpZiBub3RfcG9wdWxhdGVkOgorICAgICAgICAgICAgY29udGludWUgICNhdm9pZCBpbmNvbnNpc3RlbmNlIG9mIHNvbWUgbWFjaGluZXMgd2hlcmUgbW9yZSBzb2NrZXQgZGV0ZWN0ZWQgdGhhbiAKKyAgICAgICAgcHJvY2Vzc29yID0gUHJvY2Vzc29yTm9kZSgpCisgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IHByb2Nlc3Nvci5zZXQoc29ja2V0X2lkLCBmYW1pbHksIG1hbnVmYWN0dXJlciwgdmVyc2lvbiwgY2FwYWJpbGl0aWVzLCB0b3BvbG9neVtzb2NrZXRfaWRdKQorICAgICAgICBpZiBub3QgcmV0dXJuX3N0YXR1czoKKyAgICAgICAgICAgIHJldHVybiAocmV0dXJuX3N0YXR1cywgY29kZSkKKyAgICAgICAgaWYgY29kZSBub3QgaW4gd2FybmluZ190ZXh0OgorICAgICAgICAgICAgd2FybmluZ190ZXh0ICs9IGNvZGUKKworICAgICAgICAjQWRkIHByb2Nlc3NvciB0byB0aGUgcHJvY2Vzc29ycyBkaWN0aW9uYXJ5CisgICAgICAgIHByb2Nlc3NvcnNbc29ja2V0X2lkXSA9IHByb2Nlc3NvcgorICAgIAorICAgIHJldHVybiAoVHJ1ZSwgd2FybmluZ190ZXh0KQorCitkZWYgZ2V0X25pY19pbmZvcm1hdGlvbihzc2hfY29ubiwgdmlyc2hfY29ubiwgbmljX3RvcG9sb2d5KTogICAKKyAgICB3YXJuaW5nX3RleHQ9IiIKKyAgICAjR2V0IGxpc3Qgb2YgbmV0IGRldmljZXMKKyAgICBuZXRfZGV2aWNlcyA9IHZpcnNoX2Nvbm4ubGlzdERldmljZXMoJ25ldCcsMCkKKyAgICBwcmludCB2aXJzaF9jb25uLmxpc3REZXZpY2VzKCduZXQnLDApCisgICAgZm9yIGRldmljZSBpbiBuZXRfZGV2aWNlczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgI0dldCB0aGUgWE1MIGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZToKKyAgICAgICAgICAgIG5ldF9YTUwgPSBFbGVtZW50VHJlZS5mcm9tc3RyaW5nKHZpcnNoX2Nvbm4ubm9kZURldmljZUxvb2t1cEJ5TmFtZShkZXZpY2UpLlhNTERlc2MoMCkpCisgICAgICAgICAgICAjcHJpbnQgIm5ldF9YTUw6IiAsIG5ldF9YTUwKKyAgICAgICAgICAgICNvYnRhaW4gdGhlIHBhcmVudAorICAgICAgICAgICAgcGFyZW50ID0gbmV0X1hNTC5maW5kKCdwYXJlbnQnKQorICAgICAgICAgICAgaWYgcGFyZW50ID09IE5vbmU6CisgICAgICAgICAgICAgICAgcHJpbnQgJ05vIHBhcmVudCB3YXMgZm91bmQgaW4gWE1MIGZvciBkZXZpY2UgJytkZXZpY2UKKyAgICAgICAgICAgICAgICAjRXJyb3IuIGNvbnRpbnVlPy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgcGFyZW50LnRleHQgPT0gJ2NvbXB1dGVyJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IHBhcmVudC50ZXh0LnN0YXJ0c3dpdGgoJ3BjaV8nKToKKyAgICAgICAgICAgICAgICBwcmludCBkZXZpY2UgKyAnIHBhcmVudCBpcyBuZWl0aGVyIGNvbXB1dGVyIG5vciBwY2knCisgICAgICAgICAgICAgICAgI0Vycm9yLiBjb250aW51ZT8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGludGVyZmFjZSA9IG5ldF9YTUwuZmluZCgnY2FwYWJpbGl0eS9pbnRlcmZhY2UnKS50ZXh0CisgICAgICAgICAgICBtYWMgPSBuZXRfWE1MLmZpbmQoJ2NhcGFiaWxpdHkvYWRkcmVzcycpLnRleHQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgI0dldCB0aGUgcGNpIFhNTAorICAgICAgICAgICAgcGNpX1hNTCA9IEVsZW1lbnRUcmVlLmZyb21zdHJpbmcodmlyc2hfY29ubi5ub2RlRGV2aWNlTG9va3VwQnlOYW1lKHBhcmVudC50ZXh0KS5YTUxEZXNjKDApKQorICAgICAgICAgICAgI3ByaW50IHBjaV9YTUwKKyAgICAgICAgICAgICNHZXQgcGNpCisgICAgICAgICAgICBuYW1lID0gcGNpX1hNTC5maW5kKCduYW1lJykudGV4dC5zcGxpdCgnXycpCisgICAgICAgICAgICBwY2kgPSBuYW1lWzFdKyc6JytuYW1lWzJdKyc6JytuYW1lWzNdKycuJytuYW1lWzRdCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNJZiBzbG90ID09IDAgaXQgaXMgYSBQRiwgb3RoZXJ3aXNlIGl0IGlzIGEgVkYKKyAgICAgICAgICAgIGNhcGFiaWxpdHkgPSBwY2lfWE1MLmZpbmQoJ2NhcGFiaWxpdHknKQorICAgICAgICAgICAgaWYgY2FwYWJpbGl0eS5nZXQoJ3R5cGUnKSAhPSAncGNpJzoKKyAgICAgICAgICAgICAgICBwcmludCBkZXZpY2UgKyAnQ2FwYWJpbGl0eSBpcyBub3Qgb2YgdHlwZSBwY2kgaW4gJytwYXJlbnQudGV4dAorICAgICAgICAgICAgICAgICNFcnJvci4gY29udGludWU/LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzbG90ID0gY2FwYWJpbGl0eS5maW5kKCdzbG90JykudGV4dAorICAgICAgICAgICAgYnVzID0gY2FwYWJpbGl0eS5maW5kKCdidXMnKS50ZXh0CisgICAgICAgICAgICBub2RlX2lkID0gTm9uZQorICAgICAgICAgICAgbnVtYV8gPSBjYXBhYmlsaXR5LmZpbmQoJ251bWEnKQorICAgICAgICAgICAgaWYgbnVtYV8gIT0gTm9uZToKKyAgICAgICAgICAgICAgICBub2RlX2lkID0gbnVtYV8uZ2V0KCdub2RlJyk7CisgICAgICAgICAgICAgICAgaWYgbm9kZV9pZCAhPSBOb25lOiBub2RlX2lkID1pbnQobm9kZV9pZCkKKyAgICAgICAgICAgIGlmIHNsb3QgPT0gTm9uZSBvciBidXMgPT0gTm9uZToKKyAgICAgICAgICAgICAgICBwcmludCBkZXZpY2UgKyAnQnVzIGFuZCBzbG90IG5vdCBkZXRlY3RlZCBpbiAnK3BhcmVudC50ZXh0CisgICAgICAgICAgICAgICAgI0Vycm9yLiBjb250aW51ZT8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHNsb3QgIT0gJzAnOgorICAgICMgICAgICAgICAgICAgcHJpbnQgRWxlbWVudFRyZWUudG9zdHJpbmcocGNpX1hNTCkKKyAgICAgICAgICAgICAgICB2aXJ0dWFsID0gVHJ1ZQorICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlfcGYgPSBjYXBhYmlsaXR5LmZpbmQoJ2NhcGFiaWxpdHknKQorICAgICAgICAgICAgICAgIGlmIGNhcGFiaWxpdHlfcGYuZ2V0KCd0eXBlJykgIT0gJ3BoeXNfZnVuY3Rpb24nOgorICAgICAgICAgICAgICAgICAgICBwcmludCAncGh5c2ljYWxfZnVuY3Rpb24gbm90IGZvdW5kIGluIFZGICcrcGFyZW50LnRleHQKKyAgICAgICAgICAgICAgICAgICAgI0Vycm9yLiBjb250aW51ZT8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgUEZfcGNpID0gY2FwYWJpbGl0eV9wZi5maW5kKCdhZGRyZXNzJykuYXR0cmliCisgICAgICAgICAgICAgICAgUEZfcGNpX3RleHQgPSBQRl9wY2lbJ2RvbWFpbiddLnNwbGl0KCd4JylbMV0rJzonK1BGX3BjaVsnYnVzJ10uc3BsaXQoJ3gnKVsxXSsnOicrUEZfcGNpWydzbG90J10uc3BsaXQoJ3gnKVsxXSsnLicrUEZfcGNpWydmdW5jdGlvbiddLnNwbGl0KCd4JylbMV0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmlydHVhbCA9IEZhbHNlCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNPYnRhaW4gbm9kZSBmb3IgdGhlIHBvcnQKKyAgICAgICAgICAgIGlmIG5vZGVfaWQgPT0gTm9uZToKKyAgICAgICAgICAgICAgICBub2RlX2lkID0gaW50KGJ1cyk+PjYKKyAgICAgICAgICAgICNwcmludCAibm9kZV9pZDoiLCBub2RlX2lkCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNPbmx5IGZvciBub24gdmlydHVhbCBpbnRlcmZhY2VzOiBPYnRhaW4gc3BlZWQgYW5kIGlmIGxpbmsgaXMgZGV0ZWN0ZWQgKHRoaXMgbXVzdCBiZSBkb25lIHVzaW5nIGV0aHRvb2wpCisgICAgICAgICAgICBpZiBub3QgdmlydHVhbDoKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gJ3N1ZG8gZXRodG9vbCAnK2ludGVyZmFjZSsnIHwgZ3JlcCAtZSBTcGVlZCAtZSAiTGluayBkZXRlY3RlZCInCisgICAgICAgICAgICAgICAgKF8sIHN0ZG91dCwgc3RkZXJyKSA9IHNzaF9jb25uLmV4ZWNfY29tbWFuZChjb21tYW5kKQorICAgICAgICAgICAgICAgIGVycm9yID0gc3RkZXJyLnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIGxlbihlcnJvcikgPjA6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdFcnJvciBydW5uaW5nICcrY29tbWFuZCsnXG4nK2Vycm9yCisgICAgICAgICAgICAgICAgICAgICNFcnJvci4gY29udGludWU/LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHN0ZG91dC5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKS5yc3RyaXAoJ1xuJykuc3BsaXQoJzogJykKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZVswXSA9PSAnU3BlZWQnOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVsxXS5lbmRzd2l0aCgnTWIvcycpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkID0gaW50KGxpbmVbMV0uc3BsaXQoJ00nKVswXSkqaW50KDFlNikKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbGluZVsxXS5lbmRzd2l0aCgnR2IvcycpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkID0gaW50KGxpbmVbMV0uc3BsaXQoJ0cnKVswXSkqaW50KDFlOSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbGluZVsxXS5lbmRzd2l0aCgnS2IvcycpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkID0gaW50KGxpbmVbMV0uc3BsaXQoJ0snKVswXSkqaW50KDFlMykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RoZSBpbnRlcmZhY2UgaXMgbGlzdGVkIGJ1dCB3b24ndCBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWQgPSAwCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAnTGluayBkZXRlY3RlZCc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lWzFdID09ICd5ZXMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1VubmV4cGVjdGVkIG91dHB1dCBvZiBjb21tYW5kICcrY29tbWFuZCsnOicKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICNFcnJvci4gY29udGludWU/LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIG5vdCBub2RlX2lkIGluIG5pY190b3BvbG9neToKKyAgICAgICAgICAgICAgICBuaWNfdG9wb2xvZ3lbbm9kZV9pZF0gPSBsaXN0KCkKKyAgICAgICAgICAgICAgICAjV2l0aCB0aGlzIGltcGxlbWVudGF0aW9uIHdlIG1ha2UgdGhlIFJBRCB3aXRoIG9ubHkgb25lIG5pYyBwZXIgbm9kZSBhbmQgdGhpcyBuaWMgaGFzIGFsbCBwb3J0cywgVE9ETzogY2hhbmdlIHRoaXMgYnkgaW5jbHVkaW5nIHBhcmVudCBpbmZvcm1hdGlvbiBvZiBQRgorICAgICAgICAgICAgICAgIG5pY190b3BvbG9neVtub2RlX2lkXS5hcHBlbmQoTmljKCkpCisgICAgICAgICAgICAgCisgICAgICAgICAgICAjTG9hZCB0aGUgYXBwcm9wcmlhdGUgbmljICAgIAorICAgICAgICAgICAgbmljID0gbmljX3RvcG9sb2d5W25vZGVfaWRdWzBdCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNDcmVhdGUgYSBuZXcgcG9ydCBhbmQgZmlsbCBpdAorICAgICAgICAgICAgcG9ydCA9IFBvcnQoKQorICAgICAgICAgICAgcG9ydC5uYW1lID0gaW50ZXJmYWNlCisgICAgICAgICAgICBwb3J0LnZpcnR1YWwgPSB2aXJ0dWFsCisgICAgICAgICAgICBwb3J0LnNwZWVkID0gc3BlZWQKKyAgICAgICAgICAgIGlmIHZpcnR1YWw6CisgICAgICAgICAgICAgICAgcG9ydC5hdmFpbGFibGVfYncgPSAwCisgICAgICAgICAgICAgICAgcG9ydC5QRl9wY2lfZGV2aWNlX2lkID0gUEZfcGNpX3RleHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcG9ydC5hdmFpbGFibGVfYncgPSBzcGVlZAorICAgICAgICAgICAgICAgIGlmIHNwZWVkID09IDA6CisgICAgICAgICAgICAgICAgICAgIHBvcnQuZW5hYmxlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcG9ydC5lbmFibGVkID0gZW5hYmxlZAorCisgICAgICAgICAgICBwb3J0LmVsaWdpYmxlID0gdmlydHVhbCAgI09ubHkgdmlydHVhbCBwb3J0cyBhcmUgZWxpZ2libGUKKyAgICAgICAgICAgIHBvcnQubWFjID0gbWFjCisgICAgICAgICAgICBwb3J0LnBjaV9kZXZpY2VfaWQgPSBwY2kKKyAgICAgICAgICAgIHBvcnQucGNpX2RldmljZV9pZF9zcGxpdCA9IG5hbWVbMTpdCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNTYXZlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgICAgICAgICAgICBuaWMuYWRkX3BvcnQocG9ydCkgICAgICAgICAKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbixlOgorICAgICAgICAgICAgcHJpbnQgJ0Vycm9yOiAnK3N0cihlKQorCisgICAgI3NldCBpbiB2aXR1YWwgcG9ydHMgaWYgdGhleSBhcmUgZW5hYmxlZAorICAgIGZvciBuaWMgaW4gbmljX3RvcG9sb2d5Lml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgZm9yIHBvcnQgaW4gbmljWzBdLnBvcnRzLml0ZXJ2YWx1ZXMoKToKKyMgICAgICAgICAgICAgcHJpbnQgcG9ydC5wY2lfZGV2aWNlX2lkCisgICAgICAgICAgICBpZiBwb3J0LnZpcnR1YWw6CisgICAgICAgICAgICAgICAgZW5hYmxlZCA9IG5pY1swXS5wb3J0cy5nZXQocG9ydC5QRl9wY2lfZGV2aWNlX2lkKQorICAgICAgICAgICAgICAgIGlmIGVuYWJsZWQgPT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEZhbHNlLCAnVGhlIFBGICcrcG9ydC5QRl9wY2lfZGV2aWNlX2lkKycgKFZGICcrcG9ydC5wY2lfZGV2aWNlX2lkKycpIGlzIG5vdCBwcmVzZW50IGluIHBvcnRzIGRpY3QnKQorICAgICAgICAgICAgICAgICNPbmx5IGlmIHRoZSBQRiBpcyBlbmFibGVkIHRoZSBWRiBjYW4gYmUgZW5hYmxlZAorICAgICAgICAgICAgICAgIGlmIG5pY1swXS5wb3J0c1twb3J0LlBGX3BjaV9kZXZpY2VfaWRdLmVuYWJsZWQ6CisgICAgICAgICAgICAgICAgICAgIHBvcnQuZW5hYmxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwb3J0LmVuYWJsZWQgPSBGYWxzZQorICAgICAgICAgICAgCisgICAgcmV0dXJuIChUcnVlLCB3YXJuaW5nX3RleHQpICAgICAKKworZGVmIGdldF9uaWNfaW5mb3JtYXRpb25fb2xkKHNzaF9jb25uLCBuaWNfdG9wb2xvZ3kpOgorICAgIGNvbW1hbmQgPSAnbHN0b3BvLW5vLWdyYXBoaWNzIC0tb2YgeG1sJworICAgIChfLCBzdGRvdXQsIHN0ZGVycikgPSBzc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICBlcnJvciA9IHN0ZGVyci5yZWFkKCkKKyAgICBpZiBsZW4oZXJyb3IpPjA6CisgICAgICAgIHJhaXNlIHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uKGNvbW1hbmQgKycgOiAnKyBlcnJvcikKKyAgICB0cmVlPUVsZW1lbnRUcmVlLmZyb21zdHJpbmcoc3Rkb3V0LnJlYWQoKSkKKyAgICBmb3IgdGFyZ2V0IGluIHRyZWUuZmluZGFsbCgib2JqZWN0L29iamVjdCIpOgorICAgICAgICAjRmluZCBudW1hIG5vZGVzCisgICAgICAgIGlmIHRhcmdldC5nZXQoInR5cGUiKSAhPSAiTlVNQU5vZGUiOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbm9kZV9pZCA9IGludCh0YXJnZXQuZ2V0KCJvc19pbmRleCIpKQorICAgICAgICBuaWNfdG9wb2xvZ3lbbm9kZV9pZF0gPSBsaXN0KCkKKyAgICAgICAgCisgICAgICAgICNmaW5kIG5pY3MgaW4gbnVtYSBub2RlCisgICAgICAgIGZvciBlbnRyeSBpbiB0YXJnZXQuZmluZGFsbCgib2JqZWN0L29iamVjdCIpOgorICAgICAgICAgICAgaWYgZW50cnkuZ2V0KCJ0eXBlIikgIT0gJ0JyaWRnZSc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG5pY19uYW1lID0gZW50cnkuZ2V0KCJuYW1lIikKKyAgICAgICAgICAgIG1vZGVsID0gTm9uZQorICAgICAgICAgICAgbmljID0gTmljKCkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgI2ZpbmQgcG9ydHMgaW4gbmljCisgICAgICAgICAgICBmb3IgcGNpZGV2IGluIGVudHJ5LmZpbmRhbGwoIm9iamVjdCIpOgorICAgICAgICAgICAgICAgIGlmIHBjaWRldi5nZXQoInR5cGUiKSAhPSAnUENJRGV2JzoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbmFibGVkID0gc3BlZWQgPSBtYWMgPSBwY2lfYnVzaWQgPSBOb25lCisgICAgICAgICAgICAgICAgcG9ydCA9IFBvcnQoKQorICAgICAgICAgICAgICAgIG1vZGVsID0gcGNpZGV2LmdldCgibmFtZSIpCisgICAgICAgICAgICAgICAgdmlydHVhbCA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgJ1ZpcnR1YWwnIGluIG1vZGVsOgorICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsID0gVHJ1ZQorICAgICAgICAgICAgICAgIHBjaV9idXNpZCA9IHBjaWRldi5nZXQoInBjaV9idXNpZCIpCisgICAgICAgICAgICAgICAgZm9yIG9zZGV2IGluIHBjaWRldi5maW5kYWxsKCJvYmplY3QiKToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG9zZGV2LmdldCgibmFtZSIpCisgICAgICAgICAgICAgICAgICAgIGZvciBpbmZvIGluIG9zZGV2LmZpbmRhbGwoImluZm8iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluZm8uZ2V0KCJuYW1lIikgIT0gJ0FkZHJlc3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBtYWMgPSBpbmZvLmdldCgidmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgI2dldCB0aGUgcG9ydCBzcGVlZCBhbmQgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ3N1ZG8gZXRodG9vbCAnK25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIChfLCBzdGRvdXQsIHN0ZGVycikgPSBzc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gc3RkZXJyLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGVycm9yKT4wOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdFcnJvciBvYnRhaW5pbmcgJytuYW1lKycgaW5mb3JtYXRpb246ICcrZXJyb3IpCisgICAgICAgICAgICAgICAgICAgICAgICBldGh0b29sID0gc3Rkb3V0LnJlYWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJzEwMDAwYmFzZVQvRnVsbCcgaW4gZXRodG9vbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZCA9IDEwZTkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgJzEwMDBiYXNlVC9GdWxsJyBpbiBldGh0b29sOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkID0gMWU5CisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmICcxMDBiYXNlVC9GdWxsJyBpbiBldGh0b29sOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkID0gMTAwZTYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgJzEwYmFzZVQvRnVsbCcgaW4gZXRodG9vbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZCA9IDEwZTYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ1NwZWVkIG5vdCBkZXRlY3RlZCBpbiAnK25hbWUpCisKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGlmICdMaW5rIGRldGVjdGVkOiB5ZXMnIGluIGV0aHRvb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgc3BlZWQgIT0gTm9uZSBhbmQgbWFjICE9IE5vbmUgYW5kIHBjaV9idXNpZCAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgbWFjID0gbWFjLnNwbGl0KCc6JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9idXNpZF9zcGxpdCA9IHJlLnNwbGl0KCc6fFwuJywgcGNpX2J1c2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgI0ZpbGwgdGhlIHBvcnQgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuc2V0KG5hbWUsIHZpcnR1YWwsIGVuYWJsZWQsIHNwZWVkLCBtYWMsIHBjaV9idXNpZCwgcGNpX2J1c2lkX3NwbGl0KQorICAgICAgICAgICAgICAgICAgICAgICAgbmljLmFkZF9wb3J0KHBvcnQpCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgbGVuKG5pYy5wb3J0cykgPiAwOiAgCisgICAgICAgICAgICAgICAgI0ZpbGwgdGhlIG5pYyBtb2RlbAorICAgICAgICAgICAgICAgIGlmIG1vZGVsICE9IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG5pYy5zZXRfbW9kZWwobW9kZWwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbmljLnNldF9tb2RlbChuaWNfbmFtZSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjQWRkIGl0IHRvIHRoZSB0b3BvbG9neQorICAgICAgICAgICAgICAgIG5pY190b3BvbG9neVtub2RlX2lkXS5hcHBlbmQobmljKQorICAgICAgICAgICAgICAgIAorICAgIHJldHVybiAoVHJ1ZSwgIiIpCisKK2RlZiBnZXRfb3NfaW5mb3JtYXRpb24oc3NoX2Nvbm4sIG9zKToKKyAgICB3YXJuaW5nX3RleHQ9IiIKKyMgICAgY29tbWFuZCA9ICdsc2JfcmVsZWFzZSAtYScKKyMgICAgKHN0ZGluLCBzdGRvdXQsIHN0ZGVycikgPSBzc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyMgICAgY29udCA9IDAKKyMgICAgZm9yIGxpbmUgaW4gc3Rkb3V0LnJlYWRsaW5lcygpOgorIyAgICAgICAgbGluZV9zcGxpdCA9IHJlLnNwbGl0KCdcdHwgKicsIGxpbmUucnN0cmlwKCdcbicpKQorIyAgICAgICAgaWYgbGluZV9zcGxpdFswXSA9PSAnRGlzdHJpYnV0b3InIGFuZCBsaW5lX3NwbGl0WzFdID09ICdJRDonOgorIyAgICAgICAgICAgIGRpc3RyaWJ1dG9yID0gbGluZV9zcGxpdFsyXQorIyAgICAgICAgICAgIGNvbnQgKz0gMQorIyAgICAgICAgZWxpZiBsaW5lX3NwbGl0WzBdID09ICdSZWxlYXNlOic6CisjICAgICAgICAgICAgcmVsZWFzZSA9IGxpbmVfc3BsaXRbMV0KKyMgICAgICAgICAgICBjb250ICs9IDEKKyMgICAgICAgIGVsaWYgbGluZV9zcGxpdFswXSA9PSAnQ29kZW5hbWU6JzoKKyMgICAgICAgICAgICBjb2RlbmFtZSA9IGxpbmVfc3BsaXRbMV0KKyMgICAgICAgICAgICBjb250ICs9IDEKKyMgICAgaWYgY29udCAhPSAzOgorIyAgICAgICAgcmV0dXJuIChGYWxzZSwgJ0l0IHdhcyBub3QgcG9zc2libGUgdG8gb2J0YWluIHRoZSBPUyBpZCcpCisjICAgIGlkXyA9IGRpc3RyaWJ1dG9yKyctJytyZWxlYXNlKyctJytjb2RlbmFtZQorCisKKyAgICBjb21tYW5kID0gJ2NhdCAvZXRjL3JlZGhhdC1yZWxlYXNlJworICAgIChfLCBzdGRvdXQsIF8pID0gc3NoX2Nvbm4uZXhlY19jb21tYW5kKGNvbW1hbmQpCisgICAgaWRfdGV4dD0gc3Rkb3V0LnJlYWQoKQorICAgIGlmIGxlbihpZF90ZXh0KT09MDoKKyAgICAgICAgI3RyeSB3aXRoIFVidW50dQorICAgICAgICBjb21tYW5kID0gJ2xzYl9yZWxlYXNlIC1kIC1zJworICAgICAgICAoXywgc3Rkb3V0LCBfKSA9IHNzaF9jb25uLmV4ZWNfY29tbWFuZChjb21tYW5kKQorICAgICAgICBpZF90ZXh0PSBzdGRvdXQucmVhZCgpCisgICAgaWYgbGVuKGlkX3RleHQpPT0wOgorICAgICAgICByYWlzZSBwYXJhbWlrby5zc2hfZXhjZXB0aW9uLlNTSEV4Y2VwdGlvbigiQ2FuIG5vdCBkZXRlcm1pbnRlIHJlbGVhc2UgbmVpdGhlciB3aXRoICdsc2JfcmVsZWFzZScgbm9yIHdpdGggJ2NhdCAvZXRjL3JlZGhhdC1yZWxlYXNlJyIpCisgICAgaWRfID0gaWRfdGV4dC5yc3RyaXAoJ1xuJykKKyAgIAorICAgIGNvbW1hbmQgPSAndW5hbWUgLW8nCisgICAgKF8sIHN0ZG91dCwgc3RkZXJyKSA9IHNzaF9jb25uLmV4ZWNfY29tbWFuZChjb21tYW5kKQorICAgIGVycm9yID0gc3RkZXJyLnJlYWQoKQorICAgIGlmIGxlbihlcnJvcik+MDoKKyAgICAgICAgcmFpc2UgcGFyYW1pa28uc3NoX2V4Y2VwdGlvbi5TU0hFeGNlcHRpb24oY29tbWFuZCArJyA6ICcrIGVycm9yKQorICAgIHR5cGVfID0gc3Rkb3V0LnJlYWQoKS5yc3RyaXAoJ1xuJykKKyAgICAKKyAgICBjb21tYW5kID0gJ3VuYW1lIC1pJworICAgIChfLCBzdGRvdXQsIHN0ZGVycikgPSBzc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICBlcnJvciA9IHN0ZGVyci5yZWFkKCkKKyAgICBpZiBsZW4oZXJyb3IpPjA6CisgICAgICAgIHJhaXNlIHBhcmFtaWtvLnNzaF9leGNlcHRpb24uU1NIRXhjZXB0aW9uKGNvbW1hbmQgKycgOiAnKyBlcnJvcikKKyAgICBiaXRfYXJjaGl0ZWN0dXJlID0gc3Rkb3V0LnJlYWQoKS5yc3RyaXAoJ1xuJykKKyAgICAKKyAgICAocmV0dXJuX3N0YXR1cywgY29kZSkgPSBvcy5zZXQoaWRfLCB0eXBlXywgYml0X2FyY2hpdGVjdHVyZSkKKyAgICBpZiBub3QgcmV0dXJuX3N0YXR1czoKKyAgICAgICAgcmV0dXJuIChyZXR1cm5fc3RhdHVzLCBjb2RlKQorICAgIHdhcm5pbmdfdGV4dCArPSBjb2RlCisgICAgcmV0dXJuIChUcnVlLCB3YXJuaW5nX3RleHQpIAorCitkZWYgZ2V0X2h5cGVydmlzb3JfaW5mb3JtYXRpb24odmlyc2hfY29ubiwgaHlwZXJ2aXNvcik6CisgICAgdHlwZV8gPSB2aXJzaF9jb25uLmdldFR5cGUoKS5yc3RyaXAoJ1xuJykKKyAgICB2ZXJzaW9uID0gdmlyc2hfY29ubi5nZXRWZXJzaW9uKCkKKyAgICBsaWJfdmVyc2lvbiA9IHZpcnNoX2Nvbm4uZ2V0TGliVmVyc2lvbigpCisgICAgCisgICAgZG9tYWlucyA9IGxpc3QoKQorICAgIHRyZWU9RWxlbWVudFRyZWUuZnJvbXN0cmluZyh2aXJzaF9jb25uLmdldENhcGFiaWxpdGllcygpKQorICAgIGZvciB0YXJnZXQgaW4gdHJlZS5maW5kYWxsKCJndWVzdCIpOgorICAgICAgICBvc190eXBlID0gdGFyZ2V0LmZpbmQoIm9zX3R5cGUiKS50ZXh0CisgICAgICAgICNXZSBvbmx5IGFsbG93IGZ1bGwgdmlydHVhbGl6YXRpb24KKyAgICAgICAgaWYgb3NfdHlwZSAhPSAnaHZtJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHdvcmRzaXplID0gaW50KHRhcmdldC5maW5kKCdhcmNoL3dvcmRzaXplJykudGV4dCkKKyAgICAgICAgaWYgd29yZHNpemUgPT0gNjQ6CisgICAgICAgICAgICBmb3IgZG9tYWluIGluIHRhcmdldC5maW5kYWxsKCJhcmNoL2RvbWFpbiIpOgorICAgICAgICAgICAgICAgIGRvbWFpbnMuYXBwZW5kKGRvbWFpbi5nZXQoInR5cGUiKSkKKyAgICAgICAgICAgIAorICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IGh5cGVydmlzb3Iuc2V0KHR5cGVfLCB2ZXJzaW9uLCBsaWJfdmVyc2lvbiwgZG9tYWlucykKKyAgICBpZiBub3QgcmV0dXJuX3N0YXR1czoKKyAgICAgICAgcmV0dXJuIChyZXR1cm5fc3RhdHVzLCBjb2RlKQorICAgIHJldHVybiAoVHJ1ZSwgY29kZSkgICAgICAKKyAgICAgCitjbGFzcyBSQURhdmFpbGFibGVSZXNvdXJjZXNDbGFzcyhSQURjbGFzcyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlc291cmNlcyk6CisgICAgICAgICIiIkNvcHkgcmVzb3VyY2VzIGZyb20gdGhlIFJBRGNsYXNzIChzZXJ2ZXIgcmVzb3VyY2VzIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IHJlc291cmNlcyB1c2VkIGJ5IFZNcyIiIgorICAgICAgICAjTmV3CisgICAgICAgIHNlbGYucmVzZXJ2ZWQgPSBkaWN0KCkgICAgICAgICAgI0RpY3Rpb25hcnkgb2YgcmVzZXJ2ZWQgcmVzb3VyY2VzIGZvciBhIHNlcnZlci4gS2V5IGFyZSBWTkZDIG5hbWVzIGFuZCB2YWx1ZXMgUkFEcmVzZXJ2ZWRSZXNvdXJjZXMKKyAgICAgICAgc2VsZi5jb3Jlc19jb25zdW1wdGlvbiA9IE5vbmUgICAjRGljdGlvbmFyeSBvZiBjcHUgY29uc3VtcHRpb24uIEtleSBpcyB0aGUgY3B1IGFuZCB0aGUgdmFsdWUgaXMKKyAgICAgICAgCisgICAgICAgIHNlbGYubWFjaGluZSA9IHJlc291cmNlcy5tYWNoaW5lCisgICAgICAgIHNlbGYudXNlciA9IHJlc291cmNlcy51c2VyCisgICAgICAgIHNlbGYucGFzc3dvcmQgPSByZXNvdXJjZXMucGFzc3dvcmQKKyAgICAgICAgc2VsZi5uYW1lID0gcmVzb3VyY2VzLm5hbWUKKyAgICAgICAgc2VsZi5ucl9wcm9jZXNzb3JzID0gcmVzb3VyY2VzLm5yX3Byb2Nlc3NvcnMgCisgICAgICAgIHNlbGYucHJvY2Vzc29yX2ZhbWlseSA9IHJlc291cmNlcy5wcm9jZXNzb3JfZmFtaWx5CisgICAgICAgIHNlbGYucHJvY2Vzc29yX21hbnVmYWN0dXJlciA9IHJlc291cmNlcy5wcm9jZXNzb3JfbWFudWZhY3R1cmVyCisgICAgICAgIHNlbGYucHJvY2Vzc29yX3ZlcnNpb24gPSByZXNvdXJjZXMucHJvY2Vzc29yX3ZlcnNpb24KKyAgICAgICAgc2VsZi5wcm9jZXNzb3JfZmVhdHVyZXMgPSByZXNvdXJjZXMucHJvY2Vzc29yX2ZlYXR1cmVzCisgICAgICAgIHNlbGYubWVtb3J5X3R5cGUgPSByZXNvdXJjZXMubWVtb3J5X3R5cGUKKyAgICAgICAgc2VsZi5tZW1vcnlfZnJlcSA9IHJlc291cmNlcy5tZW1vcnlfZnJlcQorICAgICAgICBzZWxmLm1lbW9yeV9ucl9jaGFubmVscyA9IHJlc291cmNlcy5tZW1vcnlfbnJfY2hhbm5lbHMKKyAgICAgICAgc2VsZi5tZW1vcnlfc2l6ZSA9IHJlc291cmNlcy5tZW1vcnlfc2l6ZQorICAgICAgICBzZWxmLm1lbW9yeV9odWdlcGFnZV9zeiA9IHJlc291cmNlcy5tZW1vcnlfaHVnZXBhZ2Vfc3oKKyAgICAgICAgc2VsZi5oeXBlcnZpc29yID0gSHlwZXJ2aXNvcigpCisgICAgICAgIHNlbGYuaHlwZXJ2aXNvci5hc3NpZ24ocmVzb3VyY2VzLmh5cGVydmlzb3IpCisgICAgICAgIHNlbGYub3MgPSBPcFN5cygpCisgICAgICAgIHNlbGYub3MuYXNzaWduKHJlc291cmNlcy5vcykKKyAgICAgICAgc2VsZi5ub2RlcyA9IGRpY3QoKQorICAgICAgICBmb3Igbm9kZV9rLCBub2RlX3YgaW4gcmVzb3VyY2VzLm5vZGVzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5ub2Rlc1tub2RlX2tdID0gTm9kZSgpCisgICAgICAgICAgICBzZWxmLm5vZGVzW25vZGVfa10uYXNzaWduKG5vZGVfdikKKyAgICAgICAgcmV0dXJuCisgICAgCisgICAgZGVmIF9nZXRfY29yZXNfY29uc3VtcHRpb25fd2FybmluZ3Moc2VsZik6CisgICAgICAgICIiIlJldHVybnMgbGlzdCBvZiB3YXJuaW5nIHN0cmluZ3MgaW4gY2FzZSB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkLiAKKyAgICAgICAgSW4gY2FzZSBubyB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IiIiCisgICAgICAgIHdhcm5pbmdzID0gbGlzdCgpCisgICAgICAgICNHZXQgdGhlIGNvcmVzIGNvbnN1bXB0aW9uCisgICAgICAgIChyZXR1cm5fc3RhdHVzLCBjb2RlKSA9IGdldF9zc2hfY29ubmVjdGlvbihzZWxmLm1hY2hpbmUsIHNlbGYudXNlciwgc2VsZi5wYXNzd29yZCkKKyAgICAgICAgaWYgbm90IHJldHVybl9zdGF0dXM6CisgICAgICAgICAgICByZXR1cm4gKHJldHVybl9zdGF0dXMsIGNvZGUpCisgICAgICAgIHNzaF9jb25uID0gY29kZQorICAgICAgICBjb21tYW5kID0gJ21wc3RhdCAtUCBBTEwgMSAxIHwgZ3JlcCBBdmVyYWdlIHwgZWdyZXAgLXYgQ1BVXHxhbGwnCisgICAgICAgIChfLCBzdGRvdXQsIHN0ZGVycikgPSBzc2hfY29ubi5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICAgICAgZXJyb3IgPSBzdGRlcnIucmVhZCgpCisgICAgICAgIGlmIGxlbihlcnJvcikgPiAwOgorICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgZXJyb3IpCisgICAgCisgICAgICAgIHNlbGYuY29yZXNfY29uc3VtcHRpb24gPSBkaWN0KCkKKyAgICAgICAgZm9yIGxpbmUgaW4gc3Rkb3V0LnJlYWRsaW5lcygpOgorICAgICAgICAgICAgY3B1X3VzYWdlX3NwbGl0ID0gcmUuc3BsaXQoJ1x0fCAqJywgbGluZS5yc3RyaXAoJ1xuJykpCisgICAgICAgICAgICB1c2FnZSA9IDEwMCAqKDEgLSBmbG9hdChjcHVfdXNhZ2Vfc3BsaXRbMTBdKSkKKyAgICAgICAgICAgIGlmIHVzYWdlID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmNvcmVzX2NvbnN1bXB0aW9uW2ludChjcHVfdXNhZ2Vfc3BsaXRbMV0pXSA9IHVzYWdlIAorICAgICAgICBzc2hfY29ubi5jbG9zZSgpICAgCisgICAgICAgICNDaGVjayBpZiBhbnkgY29yZSBtYXJrZWQgYXMgYXZhaWxhYmxlIGluIHRoZSBub2RlcyBoYXMgY3B1X3VzYWdlID4gMAorICAgICAgICBmb3IgXywgbm9kZV92IGluIHNlbGYubm9kZXMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBjb3JlcyA9IG5vZGVfdi5wcm9jZXNzb3IuZWxpZ2libGVfY29yZXMKKyAgICAgICAgICAgIGZvciBjcHUgaW4gY29yZXM6CisgICAgICAgICAgICAgICAgaWYgbGVuKGNwdSkgPiAxOgorICAgICAgICAgICAgICAgICAgICBmb3IgY29yZSBpbiBjcHU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb3JlIGluIHNlbGYuY29yZXNfY29uc3VtcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuYXBwZW5kKCdXYXJuaW5nOiBDb3JlICcrc3RyKGNvcmUpKycgaXMgc3VwcG9zZWQgdG8gYmUgaWRsZSBidXQgaXQgaXMgY29uc3VtaW5nICcrc3RyKHNlbGYuY29yZXNfY29uc3VtcHRpb25bY29yZV0pKyclJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBjcHUgaW4gc2VsZi5jb3Jlc19jb25zdW1wdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFwcGVuZCgnV2FybmluZzogQ29yZSAnK3N0cihjb3JlKSsnIGlzIHN1cHBvc2VkIHRvIGJlIGlkbGUgYnV0IGl0IGlzIGNvbnN1bWluZyAnK3N0cihzZWxmLmNvcmVzX2NvbnN1bXB0aW9uW2NwdV0pKyclJykKKyAgICAgICAgCisgICAgICAgIHJldHVybiB3YXJuaW5ncworICAgIAorICAgIGRlZiByZXNlcnZlZF90b190ZXh0KHNlbGYpOgorICAgICAgICB0ZXh0ID0gc3RyKCkKKyAgICAgICAgZm9yIFZORkNfbmFtZSwgVk5GQ19yZXNlcnZlZCBpbiBzZWxmLnJlc2VydmVkLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgdGV4dCArPSAnICAgIFZORkM6ICcrc3RyKFZORkNfbmFtZSkrJ1xuJworICAgICAgICAgICAgdGV4dCArPSBWTkZDX3Jlc2VydmVkLnRvX3RleHQoKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRleHQKKyAgICAKKyAgICBkZWYgb2J0YWluX3VzYWdlKHNlbGYpOgorICAgICAgICByZXNwID0gZGljdCgpCisgICAgICAgICNJdGVyYXRlIHRocm91Z2ggbm9kZXMgdG8gZ2V0IGNvcmVzLCBlbGlnaWJsZSBjb3JlcywgbWVtb3J5IGFuZCBwaHlzaWNhbCBwb3J0cyAoc2F2ZSBwb3J0cyB1c2FnZSBmb3IgbmV4dCBzZWN0aW9uKQorICAgICAgICBub2RlcyA9IGRpY3QoKQorICAgICAgICBwb3J0c191c2FnZSA9IGRpY3QoKQorICAgICAgICBodWdlcGFnZV9zaXplID0gZGljdCgpCisgICAgICAgIGZvciBub2RlX2ssIG5vZGVfdiBpbiBzZWxmLm5vZGVzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgbm9kZSA9IGRpY3QoKQorICAgICAgICAgICAgcG9ydHNfdXNhZ2Vbbm9kZV9rXSA9IGRpY3QoKQorICAgICAgICAgICAgZWxpZ2libGVfY29yZXMgPSBsaXN0KCkKKyAgICAgICAgICAgIGZvciBwYWlyIGluIG5vZGVfdi5wcm9jZXNzb3IuZWxpZ2libGVfY29yZXM6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYWlyLCBsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gcGFpcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWdpYmxlX2NvcmVzLmFwcGVuZChlbGVtZW50KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVsaWdpYmxlX2NvcmVzLmFwcGVuZChwYWlyKQorICAgICAgICAgICAgbm9kZVsnY3B1cyddID0geydjb3Jlcyc6bm9kZV92LnByb2Nlc3Nvci5jb3JlcywnZWxpZ2libGVfY29yZXMnOmVsaWdpYmxlX2NvcmVzfQorICAgICAgICAgICAgbm9kZVsnbWVtb3J5J10gPSB7J3NpemUnOnN0cihub2RlX3YubWVtb3J5Lm5vZGVfc2l6ZS8oMTAyNCoxMDI0KjEwMjQpKSsnR0InLCdlbGlnaWJsZSc6c3RyKG5vZGVfdi5tZW1vcnkuZWxpZ2libGVfbWVtb3J5LygxMDI0KjEwMjQqMTAyNCkpKydHQid9CisgICAgICAgICAgICBodWdlcGFnZV9zaXplW25vZGVfa10gPSBub2RlX3YubWVtb3J5Lmh1Z2VwYWdlX3N6CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcnRzID0gZGljdCgpCisgICAgICAgICAgICBmb3IgbmljIGluIG5vZGVfdi5uaWNfbGlzdDoKKyAgICAgICAgICAgICAgICBmb3IgcG9ydCBpbiBuaWMucG9ydHMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICBpZiBwb3J0LmVuYWJsZWQgYW5kIG5vdCBwb3J0LnZpcnR1YWw6IAorICAgICAgICAgICAgICAgICAgICAgICAgcG9ydHNbcG9ydC5uYW1lXSA9IHsnc3BlZWQnOnN0cihwb3J0LnNwZWVkLzEwMDAwMDAwMDApKydHJ30KKyMgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyoqKioqKioqKioqKioqKiAnLHBvcnQubmFtZSwnc3BlZWQnLHBvcnQuc3BlZWQgCisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0c191c2FnZVtub2RlX2tdW3BvcnQubmFtZV0gPSAxMDAgLSBpbnQoMTAwKmZsb2F0KHBvcnQuYXZhaWxhYmxlX2J3KS9mbG9hdChwb3J0LnNwZWVkKSkKKyAgICAgICAgICAgIG5vZGVbJ3BvcnRzJ10gPSBwb3J0cworICAgICAgICAgICAgbm9kZXNbbm9kZV9rXSA9IG5vZGUKKyAgICAgICAgcmVzcFsnUkFEJ10gPSBub2RlcworICAgICAgICAKKyAgICAgICAgI0l0ZXJhdGUgdGhyb3VnaCByZXNlcnZlZCBzZWN0aW9uIHRvIGdldCB1c2VkIGNvcmVzLCB1c2VkIG1lbW9yeSBhbmQgcG9ydCB1c2FnZQorICAgICAgICBjb3JlcyA9IGRpY3QoKQorICAgICAgICBtZW1vcnkgPSBkaWN0KCkKKyAgICAgICAgI3Jlc2VydmVkX2NvcmVzID0gbGlzdAorICAgICAgICBmb3Igbm9kZV9rIGluIHNlbGYubm9kZXMuaXRlcmtleXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBub2RlX2sgaW4gY29yZXM6CisgICAgICAgICAgICAgICAgY29yZXNbbm9kZV9rXSA9IGxpc3QoKQorICAgICAgICAgICAgICAgIG1lbW9yeVtub2RlX2tdID0gMAorICAgICAgICAgICAgZm9yIF8sIHJlc2VydmVkIGluIHNlbGYucmVzZXJ2ZWQuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgbm9kZV9rIGluIHJlc2VydmVkLm5vZGVfcmVzZXJ2ZWRfcmVzb3VyY2VzOgorICAgICAgICAgICAgICAgICAgICBub2RlX3YgPSByZXNlcnZlZC5ub2RlX3Jlc2VydmVkX3Jlc291cmNlc1tub2RlX2tdCisgICAgICAgICAgICAgICAgICAgIGNvcmVzW25vZGVfa10uZXh0ZW5kKG5vZGVfdi5yZXNlcnZlZF9jb3JlcykKKyAgICAgICAgICAgICAgICAgICAgbWVtb3J5W25vZGVfa10gKz0gbm9kZV92LnJlc2VydmVkX2h1Z2VwYWdlX25yICogaHVnZXBhZ2Vfc2l6ZVtub2RlX2tdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIG9jY3VwYXRpb24gPSBkaWN0KCkgICAgICAgCisgICAgICAgIGZvciBub2RlX2sgaW4gc2VsZi5ub2Rlcy5pdGVya2V5cygpOgorICAgICAgICAgICAgcG9ydHMgPSBkaWN0KCkKKyAgICAgICAgICAgIGZvciBuYW1lLCB1c2FnZSBpbiBwb3J0c191c2FnZVtub2RlX2tdLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHBvcnRzW25hbWVdID0geydvY2N1cGllZCc6c3RyKHVzYWdlKSsnJSd9CisjICAgICAgICAgICAgIHByaW50ICcqKioqKioqKioqKioqKioqY29yZXMnLGNvcmVzCisjICAgICAgICAgICAgIHByaW50ICcqKioqKioqKioqKioqKioqbWVtb3J5JyxtZW1vcnkKKyAgICAgICAgICAgIG9jY3VwYXRpb25bbm9kZV9rXSA9IHsnY29yZXMnOmNvcmVzW25vZGVfa10sJ21lbW9yeSc6c3RyKG1lbW9yeVtub2RlX2tdLygxMDI0KjEwMjQqMTAyNCkpKydHQicsJ3BvcnRzJzpwb3J0c30KKyAgICAgICAgcmVzcFsnb2NjdXBhdGlvbiddID0gb2NjdXBhdGlvbgorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3AgICAgICAgICAgICAKKyAgICAKK2NsYXNzIFJBRHJlc2VydmVkUmVzb3VyY2VzKCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm5vZGVfcmVzZXJ2ZWRfcmVzb3VyY2VzID0gZGljdCgpICAgICAgI2RpY3QuIGtleXMgYXJlIHRoZSBSQUQgbm9kZXMgaWQsIHZhbHVlcyBhcmUgTm9kZVJlc2VydmVkUmVzb3VyY2VzCisgICAgICAgIHNlbGYubWdtdF9pbnRlcmZhY2VfcGNpID0gTm9uZSAgICAgICAgICAgICAjcGNpIGluIHRoZSBWTkYgZm9yIHRoZSBtYW5hZ2VtZW50IGludGVyZmFjZQorICAgICAgICBzZWxmLmltYWdlID0gTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgI1BhdGggaW4gcmVtb3RlIG1hY2hpbmUgb2YgdGhlIFZORkMgaW1hZ2UKKyAgICAKKyAgICBkZWYgdXBkYXRlKHNlbGYscmVzZXJ2ZWQpOgorICAgICAgICBzZWxmLmltYWdlID0gcmVzZXJ2ZWQuaW1hZ2UKKyAgICAgICAgc2VsZi5tZ210X2ludGVyZmFjZV9wY2kgPSByZXNlcnZlZC5tZ210X2ludGVyZmFjZV9wY2kKKyAgICAgICAgZm9yIGssdiBpbiByZXNlcnZlZC5ub2RlX3Jlc2VydmVkX3Jlc291cmNlcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGsgaW4gc2VsZi5ub2RlX3Jlc2VydmVkX3Jlc291cmNlcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ0R1cGxpY2F0ZWQgbm9kZSBlbnRyeSAnK3N0cihrKSsnIGluIHJlc2VydmVkIHJlc291cmNlcycpCisgICAgICAgICAgICBzZWxmLm5vZGVfcmVzZXJ2ZWRfcmVzb3VyY2VzW2tdPXYKKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gKFRydWUsICIiKQorICAgIAorICAgIGRlZiB0b190ZXh0KHNlbGYpOgorICAgICAgICB0ZXh0ID0gJyAgICAgICAgaW1hZ2U6ICcrc3RyKHNlbGYuaW1hZ2UpKydcbicKKyAgICAgICAgZm9yIG5vZGVfaWQsIG5vZGVfcmVzZXJ2ZWQgaW4gc2VsZi5ub2RlX3Jlc2VydmVkX3Jlc291cmNlcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHRleHQgKz0gJyAgICAgICAgTm9kZSBJRDogJytzdHIobm9kZV9pZCkrJ1xuJworICAgICAgICAgICAgdGV4dCArPSBub2RlX3Jlc2VydmVkLnRvX3RleHQoKQorICAgICAgICByZXR1cm4gdGV4dAorCitjbGFzcyBOb2RlUmVzZXJ2ZWRSZXNvdXJjZXMoKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgIyAgICAgcmVzZXJ2ZWRfc2hhcmVkX2NvcmVzID0gTm9uZSAgICAgICNsaXN0LiBMaXN0IG9mIGFsbCBjb3JlcyB0aGF0IHRoZSBWTkZDIG5lZWRzIGluIHNoYXJlZCBtb2RlICAjVE9ETyBOb3QgdXNlZAorICAgICMgICAgIHJlc2VydmVkX21lbW9yeSA9IE5vbmUgICAgICAgICAgICAjSW50ZWdlci4gQW1vdW50IG9mIEtpQiBuZWVkZWQgYnkgdGhlIFZORkMgI1RPRE8uIE5vdCB1c2VkIHNpbmNlIGh1Z2VwYWdlcyBhcmUgdXNlZAorICAgICAgICBzZWxmLnJlc2VydmVkX2NvcmVzID0gbGlzdCgpICAgICAgICAgICAgICNsaXN0LiBMaXN0IG9mIGFsbCBjb3JlcyB0aGF0IHRoZSBWTkZDIHVzZXMKKyAgICAgICAgc2VsZi5yZXNlcnZlZF9odWdlcGFnZV9uciA9IDAgICAgICAgICAgICAjSW50ZWdlci4gTnVtYmVyIG9mIGh1Z2VwYWdlcyBuZWVkZWQgYnkgdGhlIFZORkMgCisgICAgICAgIHNlbGYucmVzZXJ2ZWRfcG9ydHMgPSBkaWN0KCkgICAgICAgICAgICAgI2RpY3QuIFRoZSBrZXkgaXMgdGhlIHBoeXNpY2FsIHBvcnQgcGNpIGFuZCB0aGUgdmFsdWUgdGhlIFZORkMgcG9ydCBkZXNjcmlwdGlvbgorICAgICAgICBzZWxmLnZsYW5fdGFncyA9IGRpY3QoKQorICAgICAgICBzZWxmLmNwdV9waW5uaW5nID0gTm9uZQorICAgIAorICAgIGRlZiB0b190ZXh0KHNlbGYpOgorICAgICAgICB0ZXh0ID0gJyAgICAgICAgICAgIGNvcmVzOiAnK3N0cihzZWxmLnJlc2VydmVkX2NvcmVzKSsnXG4nCisgICAgICAgIHRleHQgKz0gJyAgICAgICAgICAgIGNwdV9waW5uaW5nOiAnK3N0cihzZWxmLmNwdV9waW5uaW5nKSsnXG4nCisgICAgICAgIHRleHQgKz0gJyAgICAgICAgICAgIGh1Z2VwYWdlc19ucjogJytzdHIoc2VsZi5yZXNlcnZlZF9odWdlcGFnZV9ucikrJ1xuJworICAgICAgICBmb3IgcG9ydF9wY2ksIHBvcnRfZGVzY3JpcHRpb24gaW4gc2VsZi5yZXNlcnZlZF9wb3J0cy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHRleHQgKz0gJyAgICAgICAgICAgIHBvcnQ6ICcrc3RyKHBvcnRfcGNpKSsnXG4nCisgICAgICAgICAgICB0ZXh0ICs9IHBvcnRfZGVzY3JpcHRpb24udG9fdGV4dCgpCisgICAgICAgIHJldHVybiB0ZXh0CisgICAgCisjICAgICBkZWYgdXBkYXRlKHNlbGYscmVzZXJ2ZWQpOgorIyAgICAgICAgIHNlbGYucmVzZXJ2ZWRfY29yZXMgPSBsaXN0KHJlc2VydmVkLnJlc2VydmVkX2NvcmVzKQorIyAgICAgICAgIHNlbGYucmVzZXJ2ZWRfaHVnZXBhZ2VfbnIgPSByZXNlcnZlZC5yZXNlcnZlZF9odWdlcGFnZV9ucgorIyAgICAgICAgIHNlbGYucmVzZXJ2ZWRfcG9ydHMgPSBkaWN0KHJlc2VydmVkLnJlc2VydmVkX3BvcnRzKQorIyAgICAgICAgIHNlbGYuY3B1X3Bpbm5pbmcgPSBsaXN0KHJlc2VydmVkLmNwdV9waW5uaW5nKQorICAgIAorICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL3V0aWxzL2F1eGlsaWFyeV9mdW5jdGlvbnMucHkgYi91dGlscy9hdXhpbGlhcnlfZnVuY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTdmY2IKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9hdXhpbGlhcnlfZnVuY3Rpb25zLnB5CkBAIC0wLDAgKzEsMjI3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZsOzbmljYSBJbnZlc3RpZ2FjacOzbiB5IERlc2Fycm9sbG8sIFMuQS5VLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBvcGVubWFubworIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgorIyBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorIyBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRm9yIHRob3NlIHVzYWdlcyBub3QgY292ZXJlZCBieSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIHBsZWFzZQorIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCisjIworCisnJycKK0NvbW1vbiB1c3VmdWwgZnVuY3Rpb25zIAorJycnCisKK19fYXV0aG9yX189IkFsZm9uc28gVGllcm5vLCBQYWJsbyBNb250ZXMiCitfX2RhdGVfXyA9IiQxMC1qdWwtMjAxNCAxMjowNzoxNSQiCisKKworaW1wb3J0IHlhbWwKK2ltcG9ydCBwYXJhbWlrbyAKK2Zyb20gZGVmaW5pdGlvbnNDbGFzcyBpbXBvcnQgZGVmaW5pdGlvbnNDbGFzcworZnJvbSBkZWZpbml0aW9uc0NsYXNzIGltcG9ydCBVbml0cworaW1wb3J0IHJhbmRvbQorZnJvbSBqc29uc2NoZW1hIGltcG9ydCB2YWxpZGF0ZSBhcyBqc192LCBleGNlcHRpb25zIGFzIGpzX2UKKworZGVmIGNoZWNrX2FuZF9jb252ZXJ0X3VuaXRzKHZhbHVlLCB2YWx1ZV90eXBlKToKKyAgICAiIiJUT0RPOiBVcGRhdGUgZGVzY3JpcHRpb24KKyAgICBUaGlzIG1ldGhvZCByZWNlaXZlcyBhIHRleHQgd2l0aCAyIGZpZWxkcyB1c2luZyBhIGJsYW5rIGFzIHNlcGFyYXRvciBhbmQgYSBsaXN0IG9mIHZhbGlkIHVuaXRzLiBUaGUgZmlyc3QgZmllbGQgbXVzdCByZXByZXNlbnQgYSBudW1iZXIKKyAgICBhbmQgdGhlIHNlY29uZCBvbmUgdW5pdHMuIAorICAgIEluIGNhc2UgdGhlIHNlY29uZCBmaWVsZCBpcyBub3Qgb25lIG9mIHZhbGlkX3VuaXRzIChGYWxzZSwgPGVycm9yIGRlc2NyaXB0aW9uPikgaXMgcmV0dXJuZWQuCisgICAgSW4gY2FzZSB0aGUgc2Vjb25kIGZpZWxkIGlzIGEgdmFsaWQgdW5pdCB0aGUgZmlyc3QgbnVtYmVyIGlzIGNvbnZlcnRlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKKyAgICBHYnBzLCBNYnBzLCBrYnBzIC0+IE1icHMKKyAgICBHQixNQixLQixCLEdpQixNaUIsS2lCIC0+IEIKKyAgICBHSHosTUh6LEtIeixIeiAtPiBIegorICAgIElmIGNvbnZlcnNpb24gaXMgZG9uZSBzdWNjZXNzZnVsbHkgKFRydWUsIDxjb252ZXJ0ZWQgdmFsdWU+KSBpcyByZXR1cm5lZCIiIgorICAgIHRyeToKKyAgICAgICAgaWYgdmFsdWVfdHlwZSA9PSBVbml0cy5ub191bml0czoKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLGludCkgYW5kIG5vdCBpc2luc3RhbmNlKHZhbHVlLGZsb2F0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnV2hlbiBubyB1bml0cyBhcmUgdXNlZCBvbmx5IGFuIGludGVnZXIgb3IgZmxvYXQgbXVzdCBiZSB1c2VkJykKKyAgICAgICAgZWxpZiB2YWx1ZV90eXBlID09IFVuaXRzLm5hbWU6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSxzdHIpOgorICAgICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdGb3IgbmFtZXMgc3RyIG11c3QgYmUgdXNlZCcpCisgICAgICAgIGVsaWYgdmFsdWVfdHlwZSA9PSBVbml0cy5ib29sZWFuOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsYm9vbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ0EgYm9vbGVhbiBvciBZZXMvTm8gbXV0IGJlIHVzZWQnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3BsaXR0ZWQgID0gdmFsdWUuc3BsaXQoJyAnKQorICAgICAgICAgICAgaWYgbGVuKHNwbGl0dGVkKSAhPSAyOgorICAgICAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICdFeHBlY3RlZCBmb3JtYXQ6IDx2YWx1ZT4gPHVuaXRzPicpCisgICAgICAgICAgICAodmFsdWUsIHVuaXRzKSA9IHNwbGl0dGVkIAorICAgICAgICAgICAgaWYgJywnIGluIHZhbHVlIG9yICcuJyBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVXNlIGludGVnZXJzIHRvIHJlcHJlc2VudCBudW1lcmljIHZhbHVlcycpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZSkKKyAgICAgICAgICAgIAorIyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlX3R5cGUsIFVuaXRzKToKKyMgICAgICAgICAgICAgICAgcmV0dXJuIChGYWxzZSwgJ05vdCB2YWxpZCB2YWx1ZV90eXBlJykKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFsaWRfdW5pdHMgPSBkZWZpbml0aW9uc0NsYXNzLnVuaXRzW3ZhbHVlX3R5cGVdCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNDb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gdXBwZXIgaW4gb3JkZXIgdG8gbWFrZSBjb21wYXJhdGlvbnMgZWFzaWVyCisgICAgICAgICAgICB1bml0cyA9IHVuaXRzLnVwcGVyKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih2YWxpZF91bml0cykpOgorICAgICAgICAgICAgICAgIHZhbGlkX3VuaXRzW2ldID0gdmFsaWRfdW5pdHNbaV0udXBwZXIoKQorICAgICAgICAgICAgCisgICAgICAgICAgICAjQ2hlY2sgdGhlIHVzZWQgdW5pdHMgYXJlIHZhbGlkIG9uZXMKKyAgICAgICAgICAgIGlmIHVuaXRzIG5vdCBpbiB2YWxpZF91bml0czoKKyAgICAgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCAnVmFsaWQgdW5pdHMgYXJlOiAnKycsICcuam9pbih2YWxpZF91bml0cykpCisKKyAgICAgICAgICAgIGlmIHVuaXRzLnN0YXJ0c3dpdGgoJ0dJJyk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqMTAyNCoxMDI0KjEwMjQKKyAgICAgICAgICAgIGVsaWYgdW5pdHMuc3RhcnRzd2l0aCgnTUknKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICoxMDI0KjEwMjQKKyAgICAgICAgICAgIGVsaWYgdW5pdHMuc3RhcnRzd2l0aCgnS0knKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICoxMDI0CisgICAgICAgICAgICBlbGlmIHVuaXRzLnN0YXJ0c3dpdGgoJ0cnKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICoxMDAwMDAwMDAwCisgICAgICAgICAgICBlbGlmIHVuaXRzLnN0YXJ0c3dpdGgoJ00nKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICoxMDAwMDAwCisgICAgICAgICAgICBlbGlmIHVuaXRzLnN0YXJ0c3dpdGgoJ0snKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICoxMDAwCisgICAgZXhjZXB0IEV4Y2VwdGlvbixlOgorICAgICAgICByZXR1cm4gKEZhbHNlLCAnVW5leHBlY3RlZCBlcnJvciBpbiBhdXhpbGlhcnlfZnVuY3Rpb25zLnB5IC0gY2hlY2tfYW5kX2NvbnZlcnRfdW5pdHM6XG4nK3N0cihlKSkKKworICAgIHJldHVybiAoVHJ1ZSwgdmFsdWUpCisgICAgICAgIAorZGVmIGdldF9zc2hfY29ubmVjdGlvbihtYWNoaW5lLCB1c2VyPU5vbmUsIHBhc3N3b3JkPU5vbmUpOgorICAgICIiIlN0YWJsaXNoZXMgYW4gc3NoIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBzZXJ2ZXIuIFJldHVybnMgKFRydWUsIHBhcmFtaWtvX3NzaCkgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIChGYWxzZSwgPGVycm9yIG1lc3NhZ2U+KSBpbiBjYXNlIG9mIGVycm9yIiIiCisgICAgdHJ5OgorICAgICAgICBzID0gcGFyYW1pa28uU1NIQ2xpZW50KCkKKyAgICAgICAgcy5zZXRfbWlzc2luZ19ob3N0X2tleV9wb2xpY3kocGFyYW1pa28uQXV0b0FkZFBvbGljeSgpKQorICAgICAgICBzLmxvYWRfc3lzdGVtX2hvc3Rfa2V5cygpCisgICAgICAgIHMuY29ubmVjdChtYWNoaW5lLCAyMiwgdXNlciwgcGFzc3dvcmQsIHRpbWVvdXQ9MTApCisgICAgZXhjZXB0IEV4Y2VwdGlvbixlOgorICAgICAgICByZXR1cm4gKEZhbHNlLCAnSXQgd2FzIG5vdCBwb3NzaWJsZSB0byBjb25uZWN0IHRvICcrbWFjaGluZStzdHIoZSkpCisgICAgICAgIAorICAgIHJldHVybiAoVHJ1ZSwgcykKKworZGVmIHJ1bl9pbl9yZW1vdGVfc2VydmVyKHMsY29tbWFuZCk6CisgICAgIiIiUnVucyBpbiB0aGUgcmVtb3RlIHNlcnZlciB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuIFJldHVybnMgKFRydWUsIHN0ZG91dCkgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIChGYWxzZSwgPGVycm9yIG1lc3NhZ2U+KSBpbiBjYXNlIG9mIGVycm9yIiIiCisgICAgdHJ5OgorICAgICAgICAoXywgc3Rkb3V0LCBzdGRlcnIpID0gcy5leGVjX2NvbW1hbmQoY29tbWFuZCkKKyAgICAgICAgZXJyb3JfbXNnID0gc3RkZXJyLnJlYWQoKQorICAgICAgICBpZiBsZW4oZXJyb3JfbXNnKSA+IDA6CisgICAgICAgICAgICByZXR1cm4gKEZhbHNlLCBlcnJvcl9tc2cpCisgICAgZXhjZXB0IEV4Y2VwdGlvbixlOgorICAgICAgICByZXR1cm4gKEZhbHNlLCBzdHIoZSkpCisgICAgCisgICAgcmV0dXJuIChUcnVlLCBzdGRvdXQpCisKK2RlZiByZWFkX2ZpbGUoZmlsZV8pOgorICAgICIiIlJlYWRzIGEgZmlsZSBzcGVjaWZpZWQgYnkgJ2ZpbGUnIGFuZCByZXR1cm5zIChUcnVlLDxpdHMgY29udGVudCBhcyBhIHN0cmluZz4pIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciAoRmFsc2UsIDxlcnJvciBtZXNzYWdlPikgaW4gY2FzZSBvZiBmYWlsdXJlIiIiCisgICAgdHJ5OgorICAgICAgICBmID0gb3BlbihmaWxlXywgJ3InKQorICAgICAgICByZWFkX2RhdGEgPSBmLnJlYWQoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgIHJldHVybiAoRmFsc2UsIHN0cihlKSkKKyAgICAgIAorICAgIHJldHVybiAoVHJ1ZSwgcmVhZF9kYXRhKQorCitkZWYgY2hlY2tfY29udGFpbnMoZWxlbWVudCwga2V5d29yZHMpOgorICAgICIiIkF1eGlsaWFyeSBmdW5jdGlvbiB1c2VkIHRvIGNoZWNrIGlmIGEgeWFtbCBzdHJ1Y3R1cmUgY29udGFpbnMgb3Igbm90CisgICAgYW4gc3BlY2lmaWMgZmllbGQuIFJldHVybnMgYSBib29sIiIiCisgICAgZm9yIGtleSBpbiBrZXl3b3JkczoKKyAgICAgICAgaWYgbm90IGtleSBpbiBlbGVtZW50OgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlICAgICAgCisgICAgcmV0dXJuIFRydWUKKworZGVmIGNoZWNrX2NvbnRhaW5zXyhlbGVtZW50LCBrZXl3b3Jkcyk6CisgICAgIiIiQXV4aWxpYXJ5IGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgaWYgYSB5YW1sIHN0cnVjdHVyZSBjb250YWlucyBvciBub3QKKyAgICBhbiBzcGVjaWZpYyBmaWVsZC4gUmV0dXJucyBhIGJvb2wsbWlzc2luZ192YXJpYWJsZXMiIiIKKyAgICBmb3Iga2V5IGluIGtleXdvcmRzOgorICAgICAgICBpZiBub3Qga2V5IGluIGVsZW1lbnQ6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UsIGtleSAgICAgIAorICAgIHJldHVybiBUcnVlLCBOb25lCisKK2RlZiB3cml0ZV9maWxlKGZpbGVfLCBjb250ZW50KToKKyAgICAiIiJHZW5lcmF0ZXMgYSBmaWxlIHNwZWNpZmllZCBieSAnZmlsZScgYW5kIGZpbGxzIGl0IHVzaW5nICdjb250ZW50JyIiIgorICAgIGYgPSBvcGVuKGZpbGVfLCAndycpCisgICAgZi53cml0ZShjb250ZW50KQorICAgIGYuY2xvc2UoKQorCitkZWYgbmljZV9wcmludCh5YW1sX2VsZW1lbnQpOgorICAgICIiIlByaW50IGEgeWFtbCBzdHJ1Y3R1cmUuIFVzZWQgbWFpbmx5IGZvciBkZWJ1Z2dpbmciIiIKKyAgICBwcmludCh5YW1sLmR1bXAoeWFtbF9lbGVtZW50LCBkZWZhdWx0X2Zsb3dfc3R5bGU9RmFsc2UpKQorICAgIAorZGVmIG5ld19yYW5kb21fbWFjKCk6CisgICAgbWFjID0gKDB4RTIsIHJhbmRvbS5yYW5kaW50KDB4MDAsIDB4ZmYpLCByYW5kb20ucmFuZGludCgweDAwLCAweGZmKSwgcmFuZG9tLnJhbmRpbnQoMHgwMCwgMHhmZiksIHJhbmRvbS5yYW5kaW50KDB4MDAsIDB4ZmYpLCByYW5kb20ucmFuZGludCgweDAwLCAweGZmKSApCisgICAgcmV0dXJuICc6Jy5qb2luKG1hcChsYW1iZGEgeDogIiUwMlgiICUgeCwgbWFjKSkgCisKK2RlZiBwYXJzZV9kaWN0KHZhciwgdGVtcGxhdGUpOgorICAgIGlmIHR5cGUodmFyKSBpcyBub3QgZGljdDogcmV0dXJuIC0xLCAnbm90IGEgZGljdGlvbmFyeScKKyAgICBmb3IgXyx0diBpbiB0ZW1wbGF0ZS5pdGVtcygpOgorICAgICAgICBpZiB0eXBlKHR2KSBpcyBsaXN0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgCitkZWYgZGVsZXRlX251bGxzKHZhcik6CisgICAgaWYgdHlwZSh2YXIpIGlzIGRpY3Q6CisgICAgICAgIGZvciBrIGluIHZhci5rZXlzKCk6CisgICAgICAgICAgICBpZiB2YXJba10gaXMgTm9uZTogZGVsIHZhcltrXQorICAgICAgICAgICAgZWxpZiB0eXBlKHZhcltrXSkgaXMgZGljdCBvciB0eXBlKHZhcltrXSkgaXMgbGlzdCBvciB0eXBlKHZhcltrXSkgaXMgdHVwbGU6IAorICAgICAgICAgICAgICAgIGlmIGRlbGV0ZV9udWxscyh2YXJba10pOiBkZWwgdmFyW2tdCisgICAgICAgIGlmIGxlbih2YXIpID09IDA6IHJldHVybiBUcnVlCisgICAgZWxpZiB0eXBlKHZhcikgaXMgbGlzdCBvciB0eXBlKHZhcikgaXMgdHVwbGU6CisgICAgICAgIGZvciBrIGluIHZhcjoKKyAgICAgICAgICAgIGlmIHR5cGUoaykgaXMgZGljdDogZGVsZXRlX251bGxzKGspCisgICAgICAgIGlmIGxlbih2YXIpID09IDA6IHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBnZXRfbmV4dF8ycG93KHZhcik6CisgICAgaWYgdmFyPT0wOiByZXR1cm4gMAorICAgIHY9MQorICAgIHdoaWxlIHY8dmFyOiB2PXYqMgorICAgIHJldHVybiB2ICAgICAgICAKKworZGVmIGNoZWNrX3ZhbGlkX3V1aWQodXVpZCk6CisgICAgaWRfc2NoZW1hID0geyJ0eXBlIiA6ICJzdHJpbmciLCAicGF0dGVybiI6ICJeW2EtZkEtRjAtOV17OH0oLVthLWZBLUYwLTldezR9KXszfS1bYS1mQS1GMC05XXsxMn0kIn0KKyAgICB0cnk6CisgICAgICAgIGpzX3YodXVpZCwgaWRfc2NoZW1hKQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCBqc19lLlZhbGlkYXRpb25FcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBEZWxldGVOb25lKHZhcik6CisgICAgJycnUmVtb3ZlcyByZWN1cnNpdmVseSBlbXB0eSBkaWN0aW9uYXJpZXMgb3IgbGlzdHMKKyAgICByZXR1cm4gVHJ1ZSBpZiB2YXIgaXMgYW4gZW1wdHkgZGljdCBvciBsaXN0ICcnJworICAgIGlmIHR5cGUodmFyKSBpcyBkaWN0OgorICAgICAgICBmb3IgayBpbiB2YXIua2V5cygpOgorICAgICAgICAgICAgaWYgdmFyW2tdIGlzIE5vbmU6IGRlbCB2YXJba10KKyAgICAgICAgICAgIGVsaWYgdHlwZSh2YXJba10pIGlzIGRpY3Qgb3IgdHlwZSh2YXJba10pIGlzIGxpc3Qgb3IgdHlwZSh2YXJba10pIGlzIHR1cGxlOiAKKyAgICAgICAgICAgICAgICBpZiBEZWxldGVOb25lKHZhcltrXSk6IGRlbCB2YXJba10KKyAgICAgICAgaWYgbGVuKHZhcikgPT0gMDogcmV0dXJuIFRydWUKKyAgICBlbGlmIHR5cGUodmFyKSBpcyBsaXN0IG9yIHR5cGUodmFyKSBpcyB0dXBsZToKKyAgICAgICAgZm9yIGsgaW4gdmFyOgorICAgICAgICAgICAgaWYgdHlwZShrKSBpcyBkaWN0OiBEZWxldGVOb25lKGspCisgICAgICAgIGlmIGxlbih2YXIpID09IDA6IHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisgICAgCitkZWYgZ2VuX3JhbmRvbV9tYWMoKToKKyAgICAnJydnZW5lcmF0ZXMgYSByYW5kb20gbWFjIGFkZHJlc3MuIEF2b2lkIG11bHRpY2FzdCwgYnJvYWRjYXN0LCBldGMKKyAgICAnJycKKyAgICBtYWMgPSAoCisgICAgICAgICM1Miw1NCwwMCwKKyAgICAgICAgIzIgKyA0KnJhbmRvbS5yYW5kaW50KDB4MDAsIDB4M2YpLCAjNCBtdWx0aXBsZSwgdW5pY2FzdCBsb2NhbCBtYWMgYWRkcmVzcworICAgICAgICAweDUyLAorICAgICAgICByYW5kb20ucmFuZGludCgweDAwLCAweGZmKSwKKyAgICAgICAgcmFuZG9tLnJhbmRpbnQoMHgwMCwgMHhmZiksCisgICAgICAgIHJhbmRvbS5yYW5kaW50KDB4MDAsIDB4ZmYpLAorICAgICAgICByYW5kb20ucmFuZGludCgweDAwLCAweGZmKSwKKyAgICAgICAgcmFuZG9tLnJhbmRpbnQoMHgwMCwgMHhmZikgCisgICAgKQorICAgIHJldHVybiAnOicuam9pbihtYXAobGFtYmRhIHg6ICIlMDJ4IiAlIHgsIG1hYykpCisKZGlmZiAtLWdpdCBhL3V0aWxzL2RlZmluaXRpb25zQ2xhc3MucHkgYi91dGlscy9kZWZpbml0aW9uc0NsYXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjgwZDkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9kZWZpbml0aW9uc0NsYXNzLnB5CkBAIC0wLDAgKzEsNzUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKycnJworRGVmaW5pdGlvbnMgb2YgY2xhc3NlcyBmb3IgdGhlIEhvc3Qgb3BlcmF0aW5nIHNlcnZlciwgLi4uICAKKycnJworCitfX2F1dGhvcl9fPSJQYWJsbyBNb250ZXMiCisKKworY2xhc3MgVW5pdHMoKToKKyAgICBtZW1vcnlfMTAwMCA9IDEKKyAgICBtZW1vcnlfMTAyNCA9IDIKKyAgICBtZW1vcnlfZnVsbCA9IDMKKyAgICBidyA9IDQKKyAgICBmcmVxID0gNQorICAgIG5vX3VuaXRzID0gNgorICAgIG5hbWUgPSA3CisgICAgYm9vbGVhbiA9IDgKKyAgICAKK2NsYXNzIGRlZmluaXRpb25zQ2xhc3MoKToKKyAgICB1c2VyID0gJ24yJworICAgIHBhc3N3b3JkID0gJ24yJworICAgIGV4dHJpY3RfaHVnZXBhZ2VzX2FsbG9jYXRpb24gPSBUcnVlCisgICAgcHJvY2Vzc29yX3Bvc3NpYmxlX2ZlYXR1cmVzID0gWyc2NGInLCdpb21tdScsJ2xwcycsJ3RsYnBzJywnaHdzdicsJ2Rpb2MnLCdodCddCisgICAgcHJvY2Vzc29yX3Bvc3NpYmxlX21hbnVmYWN0dXJlcnMgPSBbJ0ludGVsJywnQU1EJ10KKyAgICBwcm9jZXNzb3JfcG9zc2libGVfZmFtaWxpZXMgPSBbJ1hlb24nXQorICAgIHByb2Nlc3Nvcl9wb3NzaWJsZV92ZXJzaW9ucyA9IFsnSW50ZWwoUikgWGVvbihSKSBDUFUgRTUtNDYyMCAwIEAgMi4yMEdIeicsICdJbnRlbChSKSBYZW9uKFIpIENQVSBFNS0yNjgwIDAgQCAyLjcwR0h6JywnSW50ZWwoUikgWGVvbihSKSBDUFUgRTUtMjY5NyB2MiBAIDIuNzBHSHonXQorICAgIG1lbW9yeV9wb3NzaWJsZV90eXBlcyA9IFsnRERSMicsJ0REUjMnXQorICAgIG1lbW9yeV9wb3NzaWJsZV9mb3JtX2ZhY3RvcnMgPSBbJ0RJTU0nXQorICAgIGh5cGVydmlzb3JfcG9zc2libGVfdHlwZXMgPSBbJ1FFTVUnXQorICAgIGh5cGVydmlzb3JfcG9zc2libGVfZG9tYWluX3R5cGVzID0gWydrdm0nXSAjWydxZW11JywgJ2t2bSddCisgICAgb3NfcG9zc2libGVfaWQgPSBbJ1JlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCBTZXJ2ZXIgcmVsZWFzZSA2LjQgKFNhbnRpYWdvKScsCisgICAgICAgICAgICAgICAgICAgICAgJ1JlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCBTZXJ2ZXIgcmVsZWFzZSA2LjUgKFNhbnRpYWdvKScsCisgICAgICAgICAgICAgICAgICAgICAgJ1JlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCBTZXJ2ZXIgcmVsZWFzZSA2LjYgKFNhbnRpYWdvKScsCisgICAgICAgICAgICAgICAgICAgICAgJ0NlbnRPUyByZWxlYXNlIDYuNSAoRmluYWwpJywKKyAgICAgICAgICAgICAgICAgICAgICAnQ2VudE9TIHJlbGVhc2UgNi42IChGaW5hbCknLAorICAgICAgICAgICAgICAgICAgICAgICdSZWQgSGF0IEVudGVycHJpc2UgTGludXggU2VydmVyIHJlbGVhc2UgNy4wIChNYWlwbyknLAorICAgICAgICAgICAgICAgICAgICAgICdSZWQgSGF0IEVudGVycHJpc2UgTGludXggU2VydmVyIHJlbGVhc2UgNy4xIChNYWlwbyknLAorICAgICAgICAgICAgICAgICAgICBdCisgICAgb3NfcG9zc2libGVfdHlwZXMgPSBbJ0dOVS9MaW51eCddCisgICAgb3NfcG9zc2libGVfYXJjaGl0ZWN0dXJlcyA9IFsneDg2XzY0J10KKyAgICBoeXBlcnZpc29yX3Bvc3NpYmxlX2NvbXBvc2VkX3ZlcnNpb25zID0gWydRRU1VLWt2bSddCisgICAgdW5pdHMgPSBkaWN0KCkgCisgICAgdW5pdHNbVW5pdHMuYnddID0gWydHYnBzJywgJ01icHMnLCAna2JwcycsICdicHMnXQorICAgIHVuaXRzW1VuaXRzLmZyZXFdID0gWydHSHonLCAnTUh6JywgJ0tIeicsICdIeiddCisgICAgdW5pdHNbVW5pdHMubWVtb3J5XzEwMDBdID0gWydHQicsICdNQicsICdLQicsICdCJ10KKyAgICB1bml0c1tVbml0cy5tZW1vcnlfMTAyNF0gPSBbJ0dpQicsICdNaUInLCAnS2lCJywgJ0InXQorICAgIHVuaXRzW1VuaXRzLm1lbW9yeV9mdWxsXSA9IFsnR0InLCAnTUInLCAnS0InLCAnR2lCJywgJ01pQicsICdLaUInLCAnQiddCisgICAgdmFsaWRfaHVnZXBhZ2Vfc3ogPSBbMTA3Mzc0MTgyNCwgMjA5NzE1Ml0gI0luIGJ5dGVzCisgICAgdmFsaWRfVk5GQ19pZmFjZV90eXBlcyA9IFsnbWdtdCcsJ2RhdGEnXQorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuCisgICAgICAgIApkaWZmIC0tZ2l0IGEvdmltX2RiLnB5IGIvdmltX2RiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjJmNDUKLS0tIC9kZXYvbnVsbAorKysgYi92aW1fZGIucHkKQEAgLTAsMCArMSwxNjQ2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogdXRmLTggLSotCisKKyMjCisjIENvcHlyaWdodCAyMDE1IFRlbGVmw7NuaWNhIEludmVzdGlnYWNpw7NuIHkgRGVzYXJyb2xsbywgUy5BLlUuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wZW5tYW5vCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CisjIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisjIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBGb3IgdGhvc2UgdXNhZ2VzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgcGxlYXNlCisjIGNvbnRhY3Qgd2l0aDogbmZ2bGFic0B0aWQuZXMKKyMjCisKKycnJworVGhpcyBtb2R1bGUgaW50ZXJhY3Qgd2l0aCB0aGUgb3BlbnZpbSBkYXRhYmFzZSwKK0l0IGltcGxlbWVudHMgZ2VuZXJhbCB0YWJsZSBtYW5hZ2VtZW50CithbmQgY29tcGxleCB3cml0aW5ncyAndHJhbnNhY3Rpb25hbCcgc3VyZXMsIAordGhhdCBpcywgb3IgYWxsIGlzIGNoYW5nZWQgb3Igbm90aGluZworJycnCisKK19fYXV0aG9yX189IkFsZm9uc28gVGllcm5vIgorX19kYXRlX18gPSIkMTAtanVsLTIwMTQgMTI6MDc6MTUkIgorCitpbXBvcnQgTXlTUUxkYiBhcyBtZGIKK2ltcG9ydCB1dWlkIGFzIG15VXVpZAorZnJvbSB1dGlscyBpbXBvcnQgYXV4aWxpYXJ5X2Z1bmN0aW9ucyBhcyBhZgoraW1wb3J0IGpzb24KK2ltcG9ydCBsb2dnaW5nCisKK0hUVFBfQmFkX1JlcXVlc3QgPSA0MDAKK0hUVFBfVW5hdXRob3JpemVkID0gNDAxIAorSFRUUF9Ob3RfRm91bmQgPSA0MDQgCitIVFRQX01ldGhvZF9Ob3RfQWxsb3dlZCA9IDQwNSAKK0hUVFBfUmVxdWVzdF9UaW1lb3V0ID0gNDA4CitIVFRQX0NvbmZsaWN0ID0gNDA5CitIVFRQX1NlcnZpY2VfVW5hdmFpbGFibGUgPSA1MDMgCitIVFRQX0ludGVybmFsX1NlcnZlcl9FcnJvciA9IDUwMCAKKworCitjbGFzcyB2aW1fZGIoKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmxhbl9yYW5nZSwgZGVidWc9IkVSUk9SIik6CisgICAgICAgICcnJ3ZsYW5fcmFuZ2UgbXVzdCBiZSBhIHR1cGxlICh2bGFuX2luaSwgdmxhbl9lbmQpIHdpdGggYXZhaWxhYmxlIHZsYW4gdmFsdWVzIGZvciBuZXR3b3JrcworICAgICAgICBldmVyeSBkYXRhcGxhbmUgbmV0d29yayBjb250YWluIGEgdW5pcXVlIHZhbHVlLCByZWdhcmRsZXNzIG9mIGl0IGlzIHVzZWQgb3Igbm90IAorICAgICAgICAnJycgCisgICAgICAgICNpbml0aWFsaXphdGlvbgorICAgICAgICBzZWxmLm5ldF92bGFuX3JhbmdlID0gdmxhbl9yYW5nZQorICAgICAgICBzZWxmLm5ldF92bGFuX3VzZWRsaXN0ID0gTm9uZQorICAgICAgICBzZWxmLm5ldF92bGFuX2xhc3R1c2VkID0gc2VsZi5uZXRfdmxhbl9yYW5nZVswXSAtMQorICAgICAgICBzZWxmLmRlYnVnPWRlYnVnCisgICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ3ZpbS5kYicpCisgICAgICAgIHNlbGYubG9nZ2VyLnNldExldmVsKCBnZXRhdHRyKGxvZ2dpbmcsIGRlYnVnKSApCisKKworICAgIGRlZiBjb25uZWN0KHNlbGYsIGhvc3Q9Tm9uZSwgdXNlcj1Ob25lLCBwYXNzd2Q9Tm9uZSwgZGF0YWJhc2U9Tm9uZSk6CisgICAgICAgICcnJ0Nvbm5lY3QgdG8gdGhlIGNvbmNyZXRlIGRhdGEgYmFzZS4gCisgICAgICAgIFRoZSBmaXJzdCB0aW1lIGEgdmFsaWQgaG9zdCwgdXNlciwgcGFzc3dkIGFuZCBkYXRhYmFzZSBtdXN0IGJlIHByb3ZpZGVkLAorICAgICAgICBGb2xsb3dpbmcgY2FsbHMgY2FuIHNraXAgdGhpcyBwYXJhbWV0ZXJzCisgICAgICAgICcnJworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBob3N0ICAgICBpcyBub3QgTm9uZTogc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICAgICAgaWYgdXNlciAgICAgaXMgbm90IE5vbmU6IHNlbGYudXNlciA9IHVzZXIKKyAgICAgICAgICAgIGlmIHBhc3N3ZCAgIGlzIG5vdCBOb25lOiBzZWxmLnBhc3N3ZCA9IHBhc3N3ZAorICAgICAgICAgICAgaWYgZGF0YWJhc2UgaXMgbm90IE5vbmU6IHNlbGYuZGF0YWJhc2UgPSBkYXRhYmFzZQorCisgICAgICAgICAgICBzZWxmLmNvbiA9IG1kYi5jb25uZWN0KHNlbGYuaG9zdCwgc2VsZi51c2VyLCBzZWxmLnBhc3N3ZCwgc2VsZi5kYXRhYmFzZSkKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJjb25uZWN0ZWQgdG8gREIgJXMgYXQgJXNAJXMiLCBzZWxmLmRhdGFiYXNlLHNlbGYudXNlciwgc2VsZi5ob3N0KQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZXhjZXB0IG1kYi5FcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoIkNhbm5vdCBjb25uZWN0IHRvIERCICVzIGF0ICVzQCVzIEVycm9yICVkOiAlcyIsIHNlbGYuZGF0YWJhc2UsIHNlbGYudXNlciwgc2VsZi5ob3N0LCBlLmFyZ3NbMF0sIGUuYXJnc1sxXSkKKyAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgZGVmIGdldF9kYl92ZXJzaW9uKHNlbGYpOgorICAgICAgICAnJycgT2J0YWluIHRoZSBkYXRhYmFzZSBzY2hlbWEgdmVyc2lvbi4KKyAgICAgICAgUmV0dXJuOiAobmVnYXRpdmUsIHRleHQpIGlmIGVycm9yIG9yIHZlcnNpb24gMC4wIHdoZXJlIHNjaGVtYV92ZXJzaW9uIHRhYmxlIGlzIG1pc3NpbmcKKyAgICAgICAgICAgICAgICAodmVyc2lvbl9pbnQsIHZlcnNpb25fdGV4dCkgaWYgb2sKKyAgICAgICAgJycnCisgICAgICAgIGNtZCA9ICJTRUxFQ1QgdmVyc2lvbl9pbnQsdmVyc2lvbixvcGVudmltX3ZlciBGUk9NIHNjaGVtYV92ZXJzaW9uIgorICAgICAgICBmb3IgcmV0cnlfIGluIHJhbmdlKDAsMik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmNvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICByb3dzID0gc2VsZi5jdXIuZmV0Y2hhbGwoKQorICAgICAgICAgICAgICAgICAgICBoaWdoZXN0X3ZlcnNpb25faW50PTAKKyAgICAgICAgICAgICAgICAgICAgaGlnaGVzdF92ZXJzaW9uPSIiCisgICAgICAgICAgICAgICAgICAgICNwcmludCByb3dzCisgICAgICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcm93czogI2xvb2sgZm9yIHRoZSBsYXRlc3QgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcm93WzBdPmhpZ2hlc3RfdmVyc2lvbl9pbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdF92ZXJzaW9uX2ludCwgaGlnaGVzdF92ZXJzaW9uID0gcm93WzA6Ml0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhpZ2hlc3RfdmVyc2lvbl9pbnQsIGhpZ2hlc3RfdmVyc2lvbgorICAgICAgICAgICAgZXhjZXB0IChtZGIuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJnZXRfZGJfdmVyc2lvbiBEQiBFeGNlcHRpb24gJWQ6ICVzLiBDb21tYW5kICVzIixlLmFyZ3NbMF0sIGUuYXJnc1sxXSwgY21kKQorICAgICAgICAgICAgICAgIHIsYyA9IHNlbGYuZm9ybWF0X2Vycm9yKGUpCisgICAgICAgICAgICAgICAgaWYgciE9LUhUVFBfUmVxdWVzdF9UaW1lb3V0IG9yIHJldHJ5Xz09MTogcmV0dXJuIHIsYyAgICAKKyAgICAgICAgICAgICAgICAKKyAgICBkZWYgZGlzY29ubmVjdChzZWxmKToKKyAgICAgICAgJycnZGlzY29ubmVjdCBmcm9tIHRoZSBkYXRhIGJhc2UnJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorICAgICAgICAgICAgZGVsIHNlbGYuY29uCisgICAgICAgIGV4Y2VwdCBtZGIuRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCJ3aGlsZSBkaXNjb25uZWN0aW5nIGZyb20gREI6IEVycm9yICVkOiAlcyIsZS5hcmdzWzBdLCBlLmFyZ3NbMV0pCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGU6ICNzZWxmLmNvbiBub3QgZGVmaW5lZAorICAgICAgICAgICAgaWYgZVswXVstNTpdID09ICInY29uJyI6IHJldHVybiAtMSwgIkRhdGFiYXNlIGludGVybmFsIGVycm9yLCBubyBjb25uZWN0aW9uLiIKKyAgICAgICAgICAgIGVsc2U6IHJhaXNlCisgICAgCisgICAgZGVmIGZvcm1hdF9lcnJvcihzZWxmLCBlLCBmdW5jLCBjbWQsIGNvbW1hbmQ9Tm9uZSwgZXh0cmE9Tm9uZSk6CisgICAgICAgICcnJ0NyZWF0ZXMgYSB0ZXh0IGVycm9yIGJhc2Ugb24gdGhlIHByb2R1Y2VkIGV4Y2VwdGlvbgorICAgICAgICAgICAgUGFyYW1zOgorICAgICAgICAgICAgICAgIGU6IG1kYiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICBmdW5jOiBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IG1ha2VzIHRoZSBjYWxsLCBmb3IgbG9nZ2luZyBwdXJwb3NlcworICAgICAgICAgICAgICAgIGNtZDogZGF0YWJhc2UgY29tbWFuZCB0aGF0IHByb2R1Y2UgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIGNvbW1hbmQ6IGlmIHRoZSBpbnRlbnRpb24gaXMgdXBkYXRlIG9yIGRlbGV0ZQorICAgICAgICAgICAgICAgIGV4dHJhOiBleHRyYSBpbmZvcm1hdGlvbiB0byBhZGQgdG8gc29tZSBjb21tYW5kcworICAgICAgICAgICAgUmV0dXJuCisgICAgICAgICAgICAgICAgSFRUUCBlcnJvciBpbiBuZWdhdGl2ZSwgZm9ybWF0dGVkIGVycm9yIHRleHQKKyAgICAgICAgJycnIAorICAgICAgICAgICAgICAgIAorICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcigiJXMgREIgRXhjZXB0aW9uICVzLiBDb21tYW5kICVzIixmdW5jLCBzdHIoZSksIGNtZCkKKyAgICAgICAgaWYgdHlwZShlWzBdKSBpcyBzdHI6CisgICAgICAgICAgICBpZiBlWzBdWy01Ol0gPT0gIidjb24nIjogcmV0dXJuIC1IVFRQX0ludGVybmFsX1NlcnZlcl9FcnJvciwgIkRCIEV4Y2VwdGlvbiwgbm8gY29ubmVjdGlvbi4iCisgICAgICAgICAgICBlbHNlOiByYWlzZQorICAgICAgICBpZiBlLmFyZ3NbMF09PTIwMDYgb3IgZS5hcmdzWzBdPT0yMDEzIDogI015U1FMIHNlcnZlciBoYXMgZ29uZSBhd2F5ICgoKG9yKSkpICAgIEV4Y2VwdGlvbiAyMDEzOiBMb3N0IGNvbm5lY3Rpb24gdG8gTXlTUUwgc2VydmVyIGR1cmluZyBxdWVyeQorICAgICAgICAgICAgI3JlY29ubmVjdAorICAgICAgICAgICAgc2VsZi5jb25uZWN0KCkKKyAgICAgICAgICAgIHJldHVybiAtSFRUUF9SZXF1ZXN0X1RpbWVvdXQsIkRhdGFiYXNlIHJlY29ubmVjdGlvbi4gVHJ5IEFnYWluIgorICAgICAgICBmaz1lLmFyZ3NbMV0uZmluZCgiZm9yZWlnbiBrZXkgY29uc3RyYWludCBmYWlscyIpCisgICAgICAgIGlmIGZrPj0wOgorICAgICAgICAgICAgaWYgY29tbWFuZD09InVwZGF0ZSI6IHJldHVybiAtSFRUUF9CYWRfUmVxdWVzdCwgInRlbmFudF9pZCAlcyBub3QgZm91bmQuIiAlIGV4dHJhCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQ9PSJkZWxldGUiOiAgcmV0dXJuIC1IVFRQX0JhZF9SZXF1ZXN0LCAiUmVzb3VyY2UgaXMgbm90IGZyZWUuIFRoZXJlIGFyZSAlcyB0aGF0IHByZXZlbnQgaXRzIGRlbGV0aW9uLiIgJSBleHRyYQorICAgICAgICBkZSA9IGUuYXJnc1sxXS5maW5kKCJEdXBsaWNhdGUgZW50cnkiKQorICAgICAgICBmayA9IGUuYXJnc1sxXS5maW5kKCJmb3Iga2V5IikKKyAgICAgICAgdWsgPSBlLmFyZ3NbMV0uZmluZCgiVW5rbm93biBjb2x1bW4iKQorICAgICAgICB3YyA9IGUuYXJnc1sxXS5maW5kKCJpbiAnd2hlcmUgY2xhdXNlJyIpCisgICAgICAgIGZsID0gZS5hcmdzWzFdLmZpbmQoImluICdmaWVsZCBsaXN0JyIpCisgICAgICAgICNwcmludCBkZSwgZmssIHVrLCB3YyxmbAorICAgICAgICBpZiBkZT49MDoKKyAgICAgICAgICAgIGlmIGZrPj0wOiAjZXJyb3IgMTA2MgorICAgICAgICAgICAgICAgIHJldHVybiAtSFRUUF9Db25mbGljdCwgIlZhbHVlICVzIGFscmVhZHkgaW4gdXNlIGZvciAlcyIgJSAoZS5hcmdzWzFdW2RlKzE1OmZrXSwgZS5hcmdzWzFdW2ZrKzc6XSkKKyAgICAgICAgaWYgdWs+PTA6CisgICAgICAgICAgICBpZiB3Yz49MDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUhUVFBfQmFkX1JlcXVlc3QsICJGaWVsZCAlcyBjYW4gbm90IGJlIHVzZWQgZm9yIGZpbHRlcmluZyIgJSBlLmFyZ3NbMV1bdWsrMTQ6d2NdCisgICAgICAgICAgICBpZiBmbD49MDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUhUVFBfQmFkX1JlcXVlc3QsICJGaWVsZCAlcyBkb2VzIG5vdCBleGlzdCIgJSBlLmFyZ3NbMV1bdWsrMTQ6d2NdCisgICAgICAgIHJldHVybiAtSFRUUF9JbnRlcm5hbF9TZXJ2ZXJfRXJyb3IsICJEYXRhYmFzZSBpbnRlcm5hbCBFcnJvciAlZDogJXMiICUgKGUuYXJnc1swXSwgZS5hcmdzWzFdKQorCisgICAgZGVmIF9fZGF0YTJkYl9mb3JtYXQoc2VsZiwgZGF0YSk6CisgICAgICAgICcnJ2NvbnZlcnQgZGF0YSB0byBkYXRhYmFzZSBmb3JtYXQuIElmIGRhdGEgaXMgTm9uZSBpdCByZXR1cm4gdGhlICdOdWxsJyB0ZXh0LAorICAgICAgICBvdGhlcndpc2UgaXQgcmV0dXJuIHRoZSB0ZXh0IHN1cnJvdW5kZWQgYnkgcXVvdGVzIGVuc3VyaW5nIGludGVybmFsIHF1b3RlcyBhcmUgZXNjYXBlZCcnJworICAgICAgICBpZiBkYXRhPT1Ob25lOgorICAgICAgICAgICAgcmV0dXJuICdOdWxsJworICAgICAgICBvdXQ9c3RyKGRhdGEpCisgICAgICAgIGlmICInIiBub3QgaW4gb3V0OgorICAgICAgICAgICAgcmV0dXJuICInIiArIG91dCArICInIgorICAgICAgICBlbGlmICciJyBub3QgaW4gb3V0OgorICAgICAgICAgICAgcmV0dXJuICciJyArIG91dCArICciJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGpzb24uZHVtcHMob3V0KQorICAgIAorICAgIGRlZiBfX2dldF91c2VkX25ldF92bGFuKHNlbGYpOgorICAgICAgICAjZ2V0IHVzZWQgZnJvbSBkYXRhYmFzZSBpZiBuZWVkZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kID0gIlNFTEVDVCB2bGFuIEZST00gbmV0cyBXSEVSRSB2bGFuPj0nJXMnIGFuZCAodHlwZT0ncHRwJyBvciB0eXBlPSdkYXRhJykgT1JERVIgQlkgdmxhbiBMSU1JVCAyNSIgJSBzZWxmLm5ldF92bGFuX2xhc3R1c2VkCisgICAgICAgICAgICB3aXRoIHNlbGYuY29uOgorICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgdmxhbl90dXBsZSA9IHNlbGYuY3VyLmZldGNoYWxsKCkKKyAgICAgICAgICAgICAgICAjY29udmVydCBhIHR1cGxlIG9mIHR1cGxlcyBpbiBhIGxpc3Qgb2YgbnVtYmVycworICAgICAgICAgICAgICAgIHNlbGYubmV0X3ZsYW5fdXNlZGxpc3QgPSBbXQorICAgICAgICAgICAgICAgIGZvciBrIGluIHZsYW5fdHVwbGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubmV0X3ZsYW5fdXNlZGxpc3QuYXBwZW5kKGtbMF0pCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBleGNlcHQgKG1kYi5FcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXRfZXJyb3IoZSwgImdldF9mcmVlX25ldF92bGFuIiwgY21kKQorICAgIAorICAgIGRlZiBnZXRfZnJlZV9uZXRfdmxhbihzZWxmKToKKyAgICAgICAgJycnb2J0YWluIGEgdmxhbiBub3QgdXNlZCBpbiBhbnkgbmV0JycnCisgICAgICAgIAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoIm5ldF92bGFuX2xhc3R1c2VkOiVkICBuZXRfdmxhbl9yYW5nZTolZC0lZCAgbmV0X3ZsYW5fdXNlZGxpc3Q6JXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldF92bGFuX2xhc3R1c2VkLCBzZWxmLm5ldF92bGFuX3JhbmdlWzBdLCBzZWxmLm5ldF92bGFuX3JhbmdlWzFdLCBzdHIoc2VsZi5uZXRfdmxhbl91c2VkbGlzdCkpCisgICAgICAgICAgICBzZWxmLm5ldF92bGFuX2xhc3R1c2VkICs9IDEKKyAgICAgICAgICAgIGlmIHNlbGYubmV0X3ZsYW5fbGFzdHVzZWQgPT0gIHNlbGYubmV0X3ZsYW5fcmFuZ2VbMV06CisgICAgICAgICAgICAgICAgI3N0YXJ0IGZyb20gdGhlIGJlZ2luaW5nCisgICAgICAgICAgICAgICAgc2VsZi5uZXRfdmxhbl9sYXN0dXNlZCA9ICBzZWxmLm5ldF92bGFuX3JhbmdlWzBdCisgICAgICAgICAgICAgICAgc2VsZi5uZXRfdmxhbl91c2VkbGlzdCA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYubmV0X3ZsYW5fdXNlZGxpc3QgaXMgTm9uZSBcCisgICAgICAgICAgICBvciAobGVuKHNlbGYubmV0X3ZsYW5fdXNlZGxpc3QpPjAgYW5kIHNlbGYubmV0X3ZsYW5fbGFzdHVzZWQgPj0gc2VsZi5uZXRfdmxhbl91c2VkbGlzdFstMV0gYW5kIGxlbihzZWxmLm5ldF92bGFuX3VzZWRsaXN0KT09MjUpOgorICAgICAgICAgICAgICAgIHIgPSBzZWxmLl9fZ2V0X3VzZWRfbmV0X3ZsYW4oKQorICAgICAgICAgICAgICAgIGlmIHI8MDogcmV0dXJuIHIKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygibmV3IG5ldF92bGFuX3VzZWRsaXN0ICVzIiwgc3RyKHNlbGYubmV0X3ZsYW5fdXNlZGxpc3QpKQorICAgICAgICAgICAgaWYgc2VsZi5uZXRfdmxhbl9sYXN0dXNlZCBpbiBzZWxmLm5ldF92bGFuX3VzZWRsaXN0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm5ldF92bGFuX2xhc3R1c2VkCisgICAgICAgICAgICAgICAgCisgICAgZGVmIGdldF90YWJsZShzZWxmLCAqKnNxbF9kaWN0KToKKyAgICAgICAgJycnIE9idGFpbiByb3dzIGZyb20gYSB0YWJsZS4KKyAgICAgICAgQXRyaWJ1cmUgc3FsX2RpcjogZGljdGlvbmFyeSB3aXRoIHRoZSBmb2xsb3dpbmcga2V5OiB2YWx1ZQorICAgICAgICAgICAgJ1NFTEVDVCc6IFtsaXN0IG9mIGZpZWxkcyB0byByZXRyaWV2ZV0gKGJ5IGRlZmF1bHQgYWxsKQorICAgICAgICAgICAgJ0ZST00nOiBzdHJpbmcgb2YgdGFibGUgbmFtZSAoTWFuZGF0b3J5KQorICAgICAgICAgICAgJ1dIRVJFJzogZGljdCBvZiBrZXk6dmFsdWVzLCB0cmFuc2xhdGVkIHRvIGtleT12YWx1ZSBBTkQgLi4uIChPcHRpb25hbCkKKyAgICAgICAgICAgICdXSEVSRV9OT1QnOiBkaWN0IG9mIGtleTp2YWx1ZXMsIHRyYW5zbGF0ZWQgdG8ga2V5IT12YWx1ZSBBTkQgLi4uIChPcHRpb25hbCkKKyAgICAgICAgICAgICdXSEVSRV9PUic6IGRpY3Qgb2Yga2V5OnZhbHVlcywgdHJhbnNsYXRlZCB0byBrZXk9dmFsdWUgT1IgLi4uIChPcHRpb25hbCkKKyAgICAgICAgICAgICdMSU1JVCc6IGxpbWl0IG9mIG51bWJlciBvZiByb3dzIChPcHRpb25hbCkKKyAgICAgICAgUmV0dXJuOiBhIGxpc3Qgd2l0aCBkaWN0aW9uYXJ5cyBhdCBlYWNoIHJvdworICAgICAgICAnJycKKyAgICAgICAgI3ByaW50IHNxbF9kaWN0CisgICAgICAgIHNlbGVjdF89ICJTRUxFQ1QgIiArICgiKiIgaWYgJ1NFTEVDVCcgbm90IGluIHNxbF9kaWN0IGVsc2UgIiwiLmpvaW4obWFwKHN0cixzcWxfZGljdFsnU0VMRUNUJ10pKSApCisgICAgICAgICNwcmludCAnc2VsZWN0XycsIHNlbGVjdF8KKyAgICAgICAgZnJvbV8gID0gIkZST00gIiArIHN0cihzcWxfZGljdFsnRlJPTSddKQorICAgICAgICAjcHJpbnQgJ2Zyb21fJywgZnJvbV8KKyAgICAgICAgCisgICAgICAgIHdoZXJlX2FuZCA9IE5vbmUKKyAgICAgICAgd2hlcmVfb3IgPSBOb25lCisgICAgICAgIGlmICdXSEVSRScgaW4gc3FsX2RpY3QgYW5kIGxlbihzcWxfZGljdFsnV0hFUkUnXSkgPiAwOgorICAgICAgICAgICAgdz1zcWxfZGljdFsnV0hFUkUnXQorICAgICAgICAgICAgd2hlcmVfYW5kID0gIiBBTkQgIi5qb2luKG1hcCggbGFtYmRhIHg6IHN0cih4KSArICgiIGlzIE51bGwiIGlmIHdbeF0gaXMgTm9uZSBlbHNlICI9JyIrc3RyKHdbeF0pKyInIiksICB3LmtleXMoKSkgKSAKKyAgICAgICAgaWYgJ1dIRVJFX05PVCcgaW4gc3FsX2RpY3QgYW5kIGxlbihzcWxfZGljdFsnV0hFUkVfTk9UJ10pID4gMDoKKyAgICAgICAgICAgIHc9c3FsX2RpY3RbJ1dIRVJFX05PVCddCisgICAgICAgICAgICB3aGVyZV9hbmRfbm90ID0gIiBBTkQgIi5qb2luKG1hcCggbGFtYmRhIHg6IHN0cih4KSArICgiIGlzIG5vdCBOdWxsIiBpZiB3W3hdIGlzIE5vbmUgZWxzZSAiIT0nIitzdHIod1t4XSkrIiciKSwgIHcua2V5cygpKSApIAorICAgICAgICAgICAgaWYgd2hlcmVfYW5kOgorICAgICAgICAgICAgICAgIHdoZXJlX2FuZCArPSAiIEFORCAiICsgd2hlcmVfYW5kX25vdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3aGVyZV9hbmQgPSB3aGVyZV9hbmRfbm90CisgICAgICAgIGlmICdXSEVSRV9PUicgaW4gc3FsX2RpY3QgYW5kIGxlbihzcWxfZGljdFsnV0hFUkVfT1InXSkgPiAwOgorICAgICAgICAgICAgdz1zcWxfZGljdFsnV0hFUkVfT1InXQorICAgICAgICAgICAgd2hlcmVfb3IgPSAgIiBPUiAiLmpvaW4obWFwKCBsYW1iZGEgeDogc3RyKHgpICsgKCIgaXMgTnVsbCIgaWYgd1t4XSBpcyBOb25lIGVsc2UgIj0nIitzdHIod1t4XSkrIiciKSwgIHcua2V5cygpKSApCisgICAgICAgICAgICAgCisgICAgICAgIGlmIHdoZXJlX2FuZCE9Tm9uZSBhbmQgd2hlcmVfb3IhPU5vbmU6CisgICAgICAgICAgICB3aGVyZV8gPSAiV0hFUkUgKCIgKyB3aGVyZV9hbmQgKyAiKSBPUiAiICsgd2hlcmVfb3IKKyAgICAgICAgZWxpZiB3aGVyZV9hbmQhPU5vbmUgYW5kIHdoZXJlX29yPT1Ob25lOgorICAgICAgICAgICAgd2hlcmVfID0gIldIRVJFICIgKyB3aGVyZV9hbmQKKyAgICAgICAgZWxpZiB3aGVyZV9hbmQ9PU5vbmUgYW5kIHdoZXJlX29yIT1Ob25lOgorICAgICAgICAgICAgd2hlcmVfID0gIldIRVJFICIgKyB3aGVyZV9vcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2hlcmVfID0gIiIKKyAgICAgICAgI3ByaW50ICd3aGVyZV8nLCB3aGVyZV8KKyAgICAgICAgbGltaXRfID0gIkxJTUlUICIgKyBzdHIoc3FsX2RpY3RbJ0xJTUlUJ10pIGlmICdMSU1JVCcgaW4gc3FsX2RpY3QgZWxzZSAiIgorICAgICAgICAjcHJpbnQgJ2xpbWl0XycsIGxpbWl0XworICAgICAgICBjbWQgPSAgIiAiLmpvaW4oIChzZWxlY3RfLCBmcm9tXywgd2hlcmVfLCBsaW1pdF8pICkKKyAgICAgICAgZm9yIHJldHJ5XyBpbiByYW5nZSgwLDIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKG1kYi5jdXJzb3JzLkRpY3RDdXJzb3IpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBzZWxmLmN1ci5mZXRjaGFsbCgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmN1ci5yb3djb3VudCwgcm93cworICAgICAgICAgICAgZXhjZXB0IChtZGIuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIHIsYyA9IHNlbGYuZm9ybWF0X2Vycm9yKGUsICJnZXRfdGFibGUiLCBjbWQpCisgICAgICAgICAgICAgICAgaWYgciE9LUhUVFBfUmVxdWVzdF9UaW1lb3V0IG9yIHJldHJ5Xz09MTogcmV0dXJuIHIsYworICAgICAgICAKKyAgICBkZWYgbmV3X3RlbmFudChzZWxmLCB0ZW5hbnRfZGljdCk6CisgICAgICAgICcnJyBBZGQgb25lIHJvdyBpbnRvIGEgdGFibGUuCisgICAgICAgIEF0dHJpYnVyZSAKKyAgICAgICAgICAgIHRlbmFudF9kaWN0OiBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleTogdmFsdWUgdG8gaW5zZXJ0CisgICAgICAgIEl0IGNoZWNrcyBwcmVzZW5jZSBvZiB1dWlkIGFuZCBhZGQgb25lIGF1dG9tYXRpY2FsbHkgb3RoZXJ3aXNlCisgICAgICAgIFJldHVybjogKHJlc3VsdCwgdXVpZCkgd2hlcmUgcmVzdWx0IGNhbiBiZSAwIGlmIGVycm9yLCBvciAxIGlmIG9rCisgICAgICAgICcnJworICAgICAgICBmb3IgcmV0cnlfIGluIHJhbmdlKDAsMik6CisgICAgICAgICAgICBjbWQ9IiIKKyAgICAgICAgICAgIGluc2VydGVkPS0xCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgI2NyZWF0ZSB1dWlkIGlmIG5vdCBwcm92aWRlZAorICAgICAgICAgICAgICAgIGlmICd1dWlkJyBub3QgaW4gdGVuYW50X2RpY3Q6CisgICAgICAgICAgICAgICAgICAgIHV1aWQgPSB0ZW5hbnRfZGljdFsndXVpZCddID0gc3RyKG15VXVpZC51dWlkMSgpKSAjIGNyZWF0ZV91dWlkCisgICAgICAgICAgICAgICAgZWxzZTogCisgICAgICAgICAgICAgICAgICAgIHV1aWQgPSBzdHIodGVuYW50X2RpY3RbJ3V1aWQnXSkKKyAgICAgICAgICAgICAgICAjb2J0YWluIHRlbmFudF9pZCBmb3IgbG9ncworICAgICAgICAgICAgICAgIHRlbmFudF9pZCA9IHV1aWQKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuY29uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgICAgICAgICAgICAgICNpbnNlcnRpbmcgbmV3IHV1aWQKKyAgICAgICAgICAgICAgICAgICAgY21kID0gIklOU0VSVCBJTlRPIHV1aWRzICh1dWlkLCB1c2VkX2F0KSBWQUxVRVMgKCclcycsJ3RlbmFudHMnKSIgJSB1dWlkCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgICNpbnNlcnQgdGVuYW50CisgICAgICAgICAgICAgICAgICAgIGNtZD0gIklOU0VSVCBJTlRPIHRlbmFudHMgKCIgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAiLCIuam9pbihtYXAoc3RyLCB0ZW5hbnRfZGljdC5rZXlzKCkgKSkgICArICIpIFZBTFVFUygiICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIiwiLmpvaW4obWFwKGxhbWJkYSB4OiAiTnVsbCIgaWYgeCBpcyBOb25lIGVsc2UgIiciK3N0cih4KSsiJyIsdGVuYW50X2RpY3QudmFsdWVzKCkgKSkgKyAiKSIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgPSBzZWxmLmN1ci5yb3djb3VudAorICAgICAgICAgICAgICAgICAgICAjI2luc2VydGluZyBuZXcgbG9nCisgICAgICAgICAgICAgICAgICAgICNkZWwgdGVuYW50X2RpY3RbJ3V1aWQnXSAjIG5vdCBpbnRlcmVzdGVkIGZvciB0aGUgbG9nCisgICAgICAgICAgICAgICAgICAgICNjbWQgPSAiSU5TRVJUIElOVE8gbG9ncyAocmVsYXRlZCxsZXZlbCx0ZW5hbnRfaWQsdXVpZCxkZXNjcmlwdGlvbikgVkFMVUVTICgndGVuYW50cycsJ2RlYnVnJywnJXMnLCclcycsXCJuZXcgdGVuYW50ICVzXCIpIiAlICh1dWlkLCB0ZW5hbnRfaWQsIHN0cih0ZW5hbnRfZGljdCkpCisgICAgICAgICAgICAgICAgICAgICNzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICNzZWxmLmN1ci5leGVjdXRlKGNtZCkgIAorICAgICAgICAgICAgICAgICAgICAjY29tbWl0IHRyYW5zYWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBpZiBpbnNlcnRlZCA9PSAwOiByZXR1cm4gMCwgdXVpZAorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICAgICAgI2FkZGluZyBwdWJsaWMgZmxhdm9ycworICAgICAgICAgICAgICAgICAgICBjbWQgPSAiSU5TRVJUIElOVE8gdGVuYW50c19mbGF2b3JzKGZsYXZvcl9pZCx0ZW5hbnRfaWQpIFNFTEVDVCB1dWlkIGFzIGZsYXZvcl9pZCwnIisgdGVuYW50X2lkICsgIicgRlJPTSBmbGF2b3JzIFdIRVJFIHB1YmxpYyA9ICd5ZXMnIgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKSAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoImF0dGFjaGVkIHB1YmxpYyBmbGF2b3JzOiAlcyIsIHN0cihzZWxmLmN1ci5yb3djb3VudCkpCisgICAgICAgICAgICAgICAgICAgICNyb3dzID0gc2VsZi5jdXIuZmV0Y2hhbGwoKQorICAgICAgICAgICAgICAgICAgICAjZm9yIHJvdyBpbiByb3dzOgorICAgICAgICAgICAgICAgICAgICAjICAgIGNtZCA9ICJJTlNFUlQgSU5UTyB0ZW5hbnRzX2ZsYXZvcnMoZmxhdm9yX2lkLHRlbmFudF9pZCkgVkFMVUVTKCclcycsJyVzJykiICUgKHJvd1swXSwgdGVuYW50X2lkKQorICAgICAgICAgICAgICAgICAgICAjICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kICkKKyAgICAgICAgICAgICAgICAgICAgI2FkZGluZyBwdWJsaWMgaW1hZ2VzCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJJTlNFUlQgSU5UTyB0ZW5hbnRzX2ltYWdlcyhpbWFnZV9pZCx0ZW5hbnRfaWQpIFNFTEVDVCB1dWlkIGFzIGltYWdlX2lkLCciKyB0ZW5hbnRfaWQgKyAiJyBGUk9NIGltYWdlcyBXSEVSRSBwdWJsaWMgPSAneWVzJyIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkgCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJhdHRhY2hlZCBwdWJsaWMgaW1hZ2VzOiAlcyIsIHN0cihzZWxmLmN1ci5yb3djb3VudCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxLCB1dWlkCisgICAgICAgICAgICBleGNlcHQgKG1kYi5FcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgaW5zZXJ0ZWQ9PTE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcoIm5ld190ZW5hbnQgREIgRXhjZXB0aW9uICVkOiAlcy4gQ29tbWFuZCAlcyIsZS5hcmdzWzBdLCBlLmFyZ3NbMV0sIGNtZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEsIHV1aWQKKyAgICAgICAgICAgICAgICBlbHNlOiAKKyAgICAgICAgICAgICAgICAgICAgcixjID0gc2VsZi5mb3JtYXRfZXJyb3IoZSwgIm5ld190ZW5hbnQiLCBjbWQpCisgICAgICAgICAgICAgICAgICAgIGlmIHIhPS1IVFRQX1JlcXVlc3RfVGltZW91dCBvciByZXRyeV89PTE6IHJldHVybiByLGMKKworICAgIGRlZiBuZXdfcm93KHNlbGYsIHRhYmxlLCBJTlNFUlQsIGFkZF91dWlkPUZhbHNlLCBsb2c9RmFsc2UpOgorICAgICAgICAnJycgQWRkIG9uZSByb3cgaW50byBhIHRhYmxlLgorICAgICAgICBBdHJpYnVyZSAKKyAgICAgICAgICAgIElOU0VSVDogZGljdGlvbmFyeSB3aXRoIHRoZSBrZXk6IHZhbHVlIHRvIGluc2VydAorICAgICAgICAgICAgdGFibGU6IHRhYmxlIHdoZXJlIHRvIGluc2VydAorICAgICAgICAgICAgYWRkX3V1aWQ6IGlmIFRydWUsIGl0IHdpbGwgY3JhdGVkIGFuIHV1aWQga2V5IGVudHJ5IGF0IElOU0VSVCBpZiBub3QgcHJvdmlkZWQKKyAgICAgICAgSXQgY2hlY2tzIHByZXNlbmNlIG9mIHV1aWQgYW5kIGFkZCBvbmUgYXV0b21hdGljYWxseSBvdGhlcndpc2UKKyAgICAgICAgUmV0dXJuOiAocmVzdWx0LCB1dWlkKSB3aGVyZSByZXN1bHQgY2FuIGJlIDAgaWYgZXJyb3IsIG9yIDEgaWYgb2sKKyAgICAgICAgJycnCisgICAgICAgIGZvciByZXRyeV8gaW4gcmFuZ2UoMCwyKToKKyAgICAgICAgICAgIGNtZD0iIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGFkZF91dWlkOgorICAgICAgICAgICAgICAgICAgICAjY3JlYXRlIHV1aWQgaWYgbm90IHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgIGlmICd1dWlkJyBub3QgaW4gSU5TRVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCA9IElOU0VSVFsndXVpZCddID0gc3RyKG15VXVpZC51dWlkMSgpKSAjIGNyZWF0ZV91dWlkCisgICAgICAgICAgICAgICAgICAgIGVsc2U6IAorICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCA9IHN0cihJTlNFUlRbJ3V1aWQnXSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB1dWlkPU5vbmUKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuY29uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgICAgICAgICAgICAgIGlmIGFkZF91dWlkOgorICAgICAgICAgICAgICAgICAgICAgICAgI2luc2VydGluZyBuZXcgdXVpZAorICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gIklOU0VSVCBJTlRPIHV1aWRzICh1dWlkLCB1c2VkX2F0KSBWQUxVRVMgKCclcycsJyVzJykiICUgKHV1aWQsIHRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgICNpbnNlcnRpb24KKyAgICAgICAgICAgICAgICAgICAgY21kPSAiSU5TRVJUIElOVE8gIiArIHRhYmxlICsiICgiICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIiwiLmpvaW4obWFwKHN0ciwgSU5TRVJULmtleXMoKSApKSAgICsgIikgVkFMVUVTKCIgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAiLCIuam9pbihtYXAobGFtYmRhIHg6ICdOdWxsJyBpZiB4IGlzIE5vbmUgZWxzZSAiJyIrc3RyKHgpKyInIiwgSU5TRVJULnZhbHVlcygpICkpICsgIikiCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgIG5iX3Jvd3MgPSBzZWxmLmN1ci5yb3djb3VudAorICAgICAgICAgICAgICAgICAgICAjaW5zZXJ0aW5nIG5ldyBsb2cKKyAgICAgICAgICAgICAgICAgICAgI2lmIG5iX3Jvd3MgPiAwIGFuZCBsb2c6ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAjICAgIGlmIGFkZF91dWlkOiBkZWwgSU5TRVJUWyd1dWlkJ10KKyAgICAgICAgICAgICAgICAgICAgIyAgICAjb2J0YWluIHRlbmFudF9pZCBmb3IgbG9ncworICAgICAgICAgICAgICAgICAgICAjICAgIGlmICd0ZW5hbnRfaWQnIGluIElOU0VSVDogCisgICAgICAgICAgICAgICAgICAgICMgICAgICAgIHRlbmFudF9pZCA9IElOU0VSVFsndGVuYW50X2lkJ10KKyAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgZGVsIElOU0VSVFsndGVuYW50X2lkJ10KKyAgICAgICAgICAgICAgICAgICAgIyAgICBlbGlmIHRhYmxlID09ICd0ZW5hbnRzJzogICAgCisgICAgICAgICAgICAgICAgICAgICMgICAgICAgIHRlbmFudF9pZCA9IHV1aWQKKyAgICAgICAgICAgICAgICAgICAgIyAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICMgICAgICAgIHRlbmFudF9pZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgIyAgICBpZiB1dWlkIGlzIE5vbmU6IHV1aWRfayA9IHV1aWRfdiA9ICIiCisgICAgICAgICAgICAgICAgICAgICMgICAgZWxzZTogdXVpZF9rPSIsdXVpZCI7IHV1aWRfdj0iLCciICsgc3RyKHV1aWQpICsgIiciCisgICAgICAgICAgICAgICAgICAgICMgICAgaWYgdGVuYW50X2lkIGlzIE5vbmU6IHRlbmFudF9rID0gdGVuYW50X3YgPSAiIgorICAgICAgICAgICAgICAgICAgICAjICAgIGVsc2U6IHRlbmFudF9rPSIsdGVuYW50X2lkIjsgdGVuYW50X3Y9IiwnIiArIHN0cih0ZW5hbnRfaWQpICsgIiciCisgICAgICAgICAgICAgICAgICAgICMgICAgY21kID0gIklOU0VSVCBJTlRPIGxvZ3MgKHJlbGF0ZWQsbGV2ZWwlcyVzLGRlc2NyaXB0aW9uKSBWQUxVRVMgKCclcycsJ2RlYnVnJyVzJXMsXCJuZXcgJXMgJXNcIikiIFwKKyAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgJSAodXVpZF9rLCB0ZW5hbnRfaywgdGFibGUsIHV1aWRfdiwgdGVuYW50X3YsIHRhYmxlWzotMV0sIHN0cihJTlNFUlQpKQorICAgICAgICAgICAgICAgICAgICAjICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgIyAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmJfcm93cywgdXVpZAorCisgICAgICAgICAgICBleGNlcHQgKG1kYi5FcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAgICAgcixjID0gc2VsZi5mb3JtYXRfZXJyb3IoZSwgIm5ld19yb3ciLCBjbWQpCisgICAgICAgICAgICAgICAgaWYgciE9LUhUVFBfUmVxdWVzdF9UaW1lb3V0IG9yIHJldHJ5Xz09MTogcmV0dXJuIHIsYworICAgIAorICAgIGRlZiBfX3JlbW92ZV9xdW90ZXMoc2VsZiwgZGF0YSk6CisgICAgICAgICcnJ3JlbW92ZSBzaW5nbGUgcXVvdGVzICcgb2YgYW55IHN0cmluZyBjb250ZW50IG9mIGRhdGEgZGljdGlvbmFyeScnJworICAgICAgICBmb3Igayx2IGluIGRhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUodikgPT0gc3RyOgorICAgICAgICAgICAgICAgIGlmICInIiBpbiB2OiAKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtrXSA9IGRhdGFba10ucmVwbGFjZSgiJyIsIl8iKQorICAgIAorICAgIGRlZiBfdXBkYXRlX3Jvd3NfaW50ZXJuYWwoc2VsZiwgdGFibGUsIFVQREFURSwgV0hFUkU9e30pOgorICAgICAgICBjbWQ9ICJVUERBVEUgIiArIHRhYmxlICsiIFNFVCAiICsgXAorICAgICAgICAgICAgIiwiLmpvaW4obWFwKGxhbWJkYSB4OiBzdHIoeCkrJz0nKyBzZWxmLl9fZGF0YTJkYl9mb3JtYXQoVVBEQVRFW3hdKSwgICBVUERBVEUua2V5cygpICkpOworICAgICAgICBpZiBXSEVSRToKKyAgICAgICAgICAgIGNtZCArPSAiIFdIRVJFICIgKyAiIGFuZCAiLmpvaW4obWFwKGxhbWJkYSB4OiBzdHIoeCkrICgnIGlzIE51bGwnIGlmIFdIRVJFW3hdIGlzIE5vbmUgZWxzZSI9JyIrc3RyKFdIRVJFW3hdKSsiJyIgKSwgIFdIRVJFLmtleXMoKSApKQorICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKSAKKyAgICAgICAgbmJfcm93cyA9IHNlbGYuY3VyLnJvd2NvdW50CisgICAgICAgIHJldHVybiBuYl9yb3dzLCBOb25lCisKKyAgICBkZWYgdXBkYXRlX3Jvd3Moc2VsZiwgdGFibGUsIFVQREFURSwgV0hFUkU9e30sIGxvZz1GYWxzZSk6CisgICAgICAgICcnJyBVcGRhdGUgb25lIG9yIHNldmVyYWwgcm93cyBpbnRvIGEgdGFibGUuCisgICAgICAgIEF0cmlidXRlcworICAgICAgICAgICAgVVBEQVRFOiBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleS1uZXdfdmFsdWUgcGFpcnMgdG8gY2hhbmdlCisgICAgICAgICAgICB0YWJsZTogdGFibGUgdG8gYmUgbW9kaWZpZWQKKyAgICAgICAgICAgIFdIRVJFOiBkaWN0aW9uYXJ5IHRvIGZpbHRlciB0YXJnZXQgcm93cywga2V5LXZhbHVlCisgICAgICAgICAgICBsb2c6ICAgaWYgdHJ1ZSwgYSBsb2cgZW50cnkgaXMgYWRkZWQgYXQgbG9ncyB0YWJsZQorICAgICAgICBSZXR1cm46IChyZXN1bHQsIE5vbmUpIHdoZXJlIHJlc3VsdCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB1cGRhdGVkIGZpbGVzCisgICAgICAgICcnJworICAgICAgICBmb3IgcmV0cnlfIGluIHJhbmdlKDAsMik6CisgICAgICAgICAgICBjbWQ9IiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjZ2V0dHRpbmcgdXVpZCAKKyAgICAgICAgICAgICAgICB1dWlkID0gV0hFUkUuZ2V0KCd1dWlkJykKKworICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICAgICAgY21kPSAiVVBEQVRFICIgKyB0YWJsZSArIiBTRVQgIiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIi5qb2luKG1hcChsYW1iZGEgeDogc3RyKHgpKyc9Jysgc2VsZi5fX2RhdGEyZGJfZm9ybWF0KFVQREFURVt4XSksICAgVVBEQVRFLmtleXMoKSApKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgV0hFUkU6CisgICAgICAgICAgICAgICAgICAgICAgICBjbWQgKz0gIiBXSEVSRSAiICsgIiBhbmQgIi5qb2luKG1hcChsYW1iZGEgeDogc3RyKHgpKyAoJyBpcyBOdWxsJyBpZiBXSEVSRVt4XSBpcyBOb25lIGVsc2UiPSciK3N0cihXSEVSRVt4XSkrIiciICksICBXSEVSRS5rZXlzKCkgKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkgCisgICAgICAgICAgICAgICAgICAgIG5iX3Jvd3MgPSBzZWxmLmN1ci5yb3djb3VudAorICAgICAgICAgICAgICAgICAgICAjaWYgbmJfcm93cyA+IDAgYW5kIGxvZzogICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICMgICAgI2luc2VydGluZyBuZXcgbG9nCisgICAgICAgICAgICAgICAgICAgICMgICAgaWYgdXVpZCBpcyBOb25lOiB1dWlkX2sgPSB1dWlkX3YgPSAiIgorICAgICAgICAgICAgICAgICAgICAjICAgIGVsc2U6IHV1aWRfaz0iLHV1aWQiOyB1dWlkX3Y9IiwnIiArIHN0cih1dWlkKSArICInIgorICAgICAgICAgICAgICAgICAgICAjICAgIGNtZCA9ICJJTlNFUlQgSU5UTyBsb2dzIChyZWxhdGVkLGxldmVsJXMsZGVzY3JpcHRpb24pIFZBTFVFUyAoJyVzJywnZGVidWcnJXMsXCJ1cGRhdGluZyAlZCBlbnRyeSAlc1wiKSIgXAorICAgICAgICAgICAgICAgICAgICAjICAgICAgICAlICh1dWlkX2ssIHRhYmxlLCB1dWlkX3YsIG5iX3Jvd3MsIChzdHIoVVBEQVRFKSkucmVwbGFjZSgnIicsJy0nKSAgKQorICAgICAgICAgICAgICAgICAgICAjICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgIyAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmJfcm93cywgdXVpZAorICAgICAgICAgICAgZXhjZXB0IChtZGIuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIHIsYyA9IHNlbGYuZm9ybWF0X2Vycm9yKGUsICJ1cGRhdGVfcm93cyIsIGNtZCkKKyAgICAgICAgICAgICAgICBpZiByIT0tSFRUUF9SZXF1ZXN0X1RpbWVvdXQgb3IgcmV0cnlfPT0xOiByZXR1cm4gcixjCisgICAgICAgICAgICAKKyAgICBkZWYgZ2V0X2hvc3Qoc2VsZiwgaG9zdF9pZCk6CisgICAgICAgIGlmIGFmLmNoZWNrX3ZhbGlkX3V1aWQoaG9zdF9pZCk6CisgICAgICAgICAgICB3aGVyZV9maWx0ZXI9InV1aWQ9JyIgKyBob3N0X2lkICsgIiciCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aGVyZV9maWx0ZXI9Im5hbWU9JyIgKyBob3N0X2lkICsgIiciCisgICAgICAgIGZvciByZXRyeV8gaW4gcmFuZ2UoMCwyKToKKyAgICAgICAgICAgIGNtZD0iIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKG1kYi5jdXJzb3JzLkRpY3RDdXJzb3IpCisgICAgICAgICAgICAgICAgICAgICNnZXQgSE9TVAorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiU0VMRUNUIHV1aWQsIHVzZXIsIG5hbWUsIGlwX25hbWUsIGRlc2NyaXB0aW9uLCByYW5raW5nLCBhZG1pbl9zdGF0ZV91cCwgREFURV9GT1JNQVQoY3JlYXRlZF9hdCwnJVktJW0tJWRUJUg6JWk6JXMnKSBhcyBjcmVhdGVkX2F0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZST00gaG9zdHMgV0hFUkUgIiArIHdoZXJlX2ZpbHRlcgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpIAorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jdXIucm93Y291bnQgPT0gMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAsICJob3N0ICciICsgc3RyKGhvc3RfaWQpICsiJ25vdCBmb3VuZC4iCisgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5jdXIucm93Y291bnQgPiAxIDogCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCwgImhvc3QgJyIgKyBzdHIoaG9zdF9pZCkgKyInIG1hdGNoZXMgbW9yZSB0aGFuIG9uZSByZXN1bHQuIgorICAgICAgICAgICAgICAgICAgICBob3N0ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICAgICAgICAgICAgICBob3N0X2lkID0gaG9zdFsndXVpZCddCisgICAgICAgICAgICAgICAgICAgICNnZXQgbnVtYQorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiU0VMRUNUIGlkLCBudW1hX3NvY2tldCwgaHVnZXBhZ2VzLCBtZW1vcnksIGFkbWluX3N0YXRlX3VwIEZST00gbnVtYXMgV0hFUkUgaG9zdF9pZCA9ICciICsgc3RyKGhvc3RfaWQpICsgIiciCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgIGhvc3RbJ251bWFzJ10gPSBzZWxmLmN1ci5mZXRjaGFsbCgpCisgICAgICAgICAgICAgICAgICAgIGZvciBudW1hIGluIGhvc3RbJ251bWFzJ106CisgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgIlNFTEVDVCBjb3JlX2lkLCBpbnN0YW5jZV9pZCwgc3RhdHVzLCB0aHJlYWRfaWQsIHZfdGhyZWFkX2lkIEZST00gcmVzb3VyY2VzX2NvcmUgIFdIRVJFIG51bWFfaWQgPSAnIiArIHN0cihudW1hWydpZCddKSArICInIgorICAgICAgICAgICAgICAgICAgICAgICAgI2dldCBjb3JlcworICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gIlNFTEVDVCBjb3JlX2lkLCBpbnN0YW5jZV9pZCwgc3RhdHVzLCB0aHJlYWRfaWQsIHZfdGhyZWFkX2lkIEZST00gcmVzb3VyY2VzX2NvcmUgIFdIRVJFIG51bWFfaWQgPSAnIiArIHN0cihudW1hWydpZCddKSArICInIgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICBudW1hWydjb3JlcyddID0gc2VsZi5jdXIuZmV0Y2hhbGwoKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvcmUgaW4gbnVtYVsnY29yZXMnXTogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29yZVsnaW5zdGFuY2VfaWQnXSA9PSBOb25lOiBkZWwgY29yZVsnaW5zdGFuY2VfaWQnXSwgY29yZVsndl90aHJlYWRfaWQnXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvcmVbJ3N0YXR1cyddID09ICdvayc6IGRlbCBjb3JlWydzdGF0dXMnXQorICAgICAgICAgICAgICAgICAgICAgICAgI2dldCB1c2VkIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gIlNFTEVDVCBzdW0oY29uc3VtZWQpIGFzIGh1Z2VwYWdlc19jb25zdW1lZCBGUk9NIHJlc291cmNlc19tZW0gIFdIRVJFIG51bWFfaWQgPSAnIiArIHN0cihudW1hWydpZCddKSArICInIEdST1VQIEJZIG51bWFfaWQiCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkXz0gaW50KHVzZWRbJ2h1Z2VwYWdlc19jb25zdW1lZCddKSBpZiB1c2VkICE9IE5vbmUgZWxzZSAwCisgICAgICAgICAgICAgICAgICAgICAgICBudW1hWydodWdlcGFnZXNfY29uc3VtZWQnXSA9IHVzZWRfCisgICAgICAgICAgICAgICAgICAgICAgICAjZ2V0IHBvcnRzCisgICAgICAgICAgICAgICAgICAgICAgICAjY21kID0gIkNBTEwgR2V0UG9ydHNGcm9tTnVtYSglcyknIiAlIHN0cihudW1hWydpZCddKQorICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGYuY3VyLmNhbGxwcm9jKCdHZXRQb3J0c0Zyb21OdW1hJywgKG51bWFbJ2lkJ10sKSApCisgICAgICAgICAgICAgICAgICAgICAgICAjZXZlcnkgdGltZSBhIFByb2NlZHVyZSBpcyBsYXVuY2hlZCB5b3UgbmVlZCB0byBjbG9zZSBhbmQgb3BlbiB0aGUgY3Vyc29yIAorICAgICAgICAgICAgICAgICAgICAgICAgI3VuZGVyIEVycm9yIDIwMTQ6IENvbW1hbmRzIG91dCBvZiBzeW5jOyB5b3UgY2FuJ3QgcnVuIHRoaXMgY29tbWFuZCBub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICNzZWxmLmN1ci5jbG9zZSgpICAgCisgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IobWRiLmN1cnNvcnMuRGljdEN1cnNvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZD0iU0VMRUNUIE1icHMsIHBjaSwgc3RhdHVzLCBNYnBzX3VzZWQsIGluc3RhbmNlX2lkLCBpZihpZD1yb290X2lkLCdQRicsJ1ZGJykgYXMgdHlwZV8sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hfcG9ydCwgc3dpdGNoX2RwaWQsIG1hYywgc291cmNlX25hbWVcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gcmVzb3VyY2VzX3BvcnQgV0hFUkUgbnVtYV9pZD0lZCBPUkRFUiBCWSByb290X2lkLCB0eXBlXyBERVNDIiAlICAobnVtYVsnaWQnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VzID0gc2VsZi5jdXIuZmV0Y2hhbGwoKQorICAgICAgICAgICAgICAgICAgICAgICAgI1RoZSBTUUwgcXVlcnkgd2lsbCBlbnN1cmUgdG8gaGF2ZSBTUklPViBpbnRlcmZhY2VzIGZyb20gYSBwb3J0IGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICBzcmlvdnM9W10KKyAgICAgICAgICAgICAgICAgICAgICAgIE1wYnNfY29uc3VtZWQgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBudW1hWydpbnRlcmZhY2VzJ10gPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGlmYWNlIGluIGlmYWNlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaWZhY2VbImluc3RhbmNlX2lkIl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBpZmFjZVsiaW5zdGFuY2VfaWQiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlmYWNlWydzdGF0dXMnXSA9PSAnb2snOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgaWZhY2VbJ3N0YXR1cyddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXBic19jb25zdW1lZCArPSBpbnQoaWZhY2VbIk1icHNfdXNlZCJdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBpZmFjZVsiTWJwc191c2VkIl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpZmFjZVsidHlwZV8iXT09J1BGJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlmYWNlWyJzd2l0Y2hfZHBpZCJdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGlmYWNlWyJzd2l0Y2hfZHBpZCJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpZmFjZVsic3dpdGNoX3BvcnQiXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBpZmFjZVsic3dpdGNoX3BvcnQiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzcmlvdnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZVsic3Jpb3ZzIl0gPSBzcmlvdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgTXBic19jb25zdW1lZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlWyJNcGJzX2NvbnN1bWVkIl0gPSBNcGJzX2NvbnN1bWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBpZmFjZVsidHlwZV8iXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1hWydpbnRlcmZhY2VzJ10uYXBwZW5kKGlmYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmlvdnM9W10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXBic19jb25zdW1lZCA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOiAjVkYsIFNSSU9WCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBpZmFjZVsic3dpdGNoX3BvcnQiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgaWZhY2VbInN3aXRjaF9kcGlkIl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGlmYWNlWyJ0eXBlXyJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBpZmFjZVsiTWJwcyJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyaW92cy5hcHBlbmQoaWZhY2UpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICNkZWxldGUgaW50ZXJuYWwgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBudW1hWydpZCddCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxLCBob3N0CisgICAgICAgICAgICBleGNlcHQgKG1kYi5FcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAgICAgcixjID0gc2VsZi5mb3JtYXRfZXJyb3IoZSwgImdldF9ob3N0IiwgY21kKQorICAgICAgICAgICAgICAgIGlmIHIhPS1IVFRQX1JlcXVlc3RfVGltZW91dCBvciByZXRyeV89PTE6IHJldHVybiByLGMKKyAgICAgICAgCisgICAgZGVmIG5ld191dWlkKHNlbGYpOgorICAgICAgICBtYXhfcmV0cmllcz0xMAorICAgICAgICB3aGlsZSBtYXhfcmV0cmllcz4wOgorICAgICAgICAgICAgdXVpZCA9ICBzdHIoIG15VXVpZC51dWlkMSgpICkKKyAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfdXVpZCh1dWlkKVswXSA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiB1dWlkCisgICAgICAgICAgICBtYXhfcmV0cmllcy09MQorICAgICAgICByZXR1cm4gdXVpZAorCisgICAgZGVmIGNoZWNrX3V1aWQoc2VsZiwgdXVpZCk6CisgICAgICAgICcnJ2NoZWNrIGluIHRoZSBkYXRhYmFzZSBpZiB0aGlzIHV1aWQgaXMgYWxyZWFkeSBwcmVzZW50JycnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZCA9ICJTRUxFQ1QgKiBGUk9NIHV1aWRzIHdoZXJlIHV1aWQ9JyIgKyBzdHIodXVpZCkgKyAiJyIKKyAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IobWRiLmN1cnNvcnMuRGljdEN1cnNvcikKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgcm93cyA9IHNlbGYuY3VyLmZldGNoYWxsKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jdXIucm93Y291bnQsIHJvd3MKKyAgICAgICAgZXhjZXB0IChtZGIuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZm9ybWF0X2Vycm9yKGUsICJjaGVja191dWlkIiwgY21kKQorICAgICAgICAgICAgCisgICAgZGVmIF9fZ2V0X25leHRfaWRzKHNlbGYpOgorICAgICAgICAnJydnZXQgbmV4dCBhdXRvIGluY3JlbWVudCBpbmRleCBvZiBhbGwgdGFibGUgaW4gdGhlIGRhdGFiYXNlJycnCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoIlNFTEVDVCB0YWJsZV9uYW1lLEFVVE9fSU5DUkVNRU5UIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSBBVVRPX0lOQ1JFTUVOVCBJUyBOT1QgTlVMTCBBTkQgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSIpIAorICAgICAgICByb3dzID0gc2VsZi5jdXIuZmV0Y2hhbGwoKQorICAgICAgICByZXR1cm4gc2VsZi5jdXIucm93Y291bnQsIGRpY3Qocm93cykKKyAgICAKKyAgICBkZWYgZWRpdF9ob3N0KHNlbGYsIGhvc3RfaWQsIGhvc3RfZGljdCk6CisgICAgICAgICNnZXQgbmV4dCBwb3J0IGluZGV4CisgICAgICAgIGZvciByZXRyeV8gaW4gcmFuZ2UoMCwyKToKKyAgICAgICAgICAgIGNtZD0iIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKworICAgICAgICAgICAgICAgICAgICAjdXBkYXRlIHRhYmxlIGhvc3QKKyAgICAgICAgICAgICAgICAgICAgbnVtYV9saXN0ID0gaG9zdF9kaWN0LnBvcCgnbnVtYXMnLCAoKSApICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgaG9zdF9kaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX3Jvd3NfaW50ZXJuYWwoImhvc3RzIiwgaG9zdF9kaWN0LCB7InV1aWQiOiBob3N0X2lkfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB3aGVyZSA9IHsiaG9zdF9pZCI6IGhvc3RfaWR9IAorICAgICAgICAgICAgICAgICAgICBmb3IgbnVtYV9kaWN0IGluIG51bWFfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlWyJudW1hX3NvY2tldCJdID0gc3RyKG51bWFfZGljdC5wb3AoJ251bWFfc29ja2V0JykpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfbGlzdCA9IG51bWFfZGljdC5wb3AoJ2ludGVyZmFjZXMnLCAoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1hX2RpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX3Jvd3NfaW50ZXJuYWwoIm51bWFzIiwgbnVtYV9kaWN0LCB3aGVyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnRlcmZhY2UgaW4gaW50ZXJmYWNlX2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX25hbWUgPSBzdHIoaW50ZXJmYWNlLnBvcCgic291cmNlX25hbWUiKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW50ZXJmYWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnZXQgaW50ZXJmYWNlIGlkIGZyb20gcmVzb3VyY2VzX3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kPSAiU0VMRUNUIHJwLmlkIGFzIGlkIEZST00gcmVzb3VyY2VzX3BvcnQgYXMgcnAgam9pbiBudW1hcyBhcyBuIG9uIG4uaWQ9cnAubnVtYV9pZCBqb2luIGhvc3RzIGFzIGggb24gaC51dWlkPW4uaG9zdF9pZCAiICtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgaG9zdF9pZD0nJXMnIGFuZCBycC5zb3VyY2VfbmFtZT0nJXMnIiAlKGhvc3RfaWQsIHNvdXJjZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY3VyLnJvd2NvdW50PD0wOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1IVFRQX0JhZF9SZXF1ZXN0LCAiSW50ZXJmYWNlIHNvdXJjZV9uYW1lPSclcycgZnJvbSBudW1hX3NvY2tldD0nJXMnIG5vdCBmb3VuZCIgJSAoc291cmNlX25hbWUsIHN0cih3aGVyZVsibnVtYV9zb2NrZXQiXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9pZCA9IHJvd1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGVfcm93c19pbnRlcm5hbCgicmVzb3VyY2VzX3BvcnQiLCBpbnRlcmZhY2UsIHsicm9vdF9pZCI6IGludGVyZmFjZV9pZH0pCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2hvc3QoaG9zdF9pZCkKKyAgICAgICAgICAgIGV4Y2VwdCAobWRiLkVycm9yLCBBdHRyaWJ1dGVFcnJvcikgYXMgZToKKyAgICAgICAgICAgICAgICByLGMgPSBzZWxmLmZvcm1hdF9lcnJvcihlLCAiZWRpdF9ob3N0IiwgY21kKQorICAgICAgICAgICAgICAgIGlmIHIhPS1IVFRQX1JlcXVlc3RfVGltZW91dCBvciByZXRyeV89PTE6IHJldHVybiByLGMKKworICAgIGRlZiBuZXdfaG9zdChzZWxmLCBob3N0X2RpY3QpOgorICAgICAgICAjZ2V0IG5leHQgcG9ydCBpbmRleAorICAgICAgICBmb3IgcmV0cnlfIGluIHJhbmdlKDAsMik6CisgICAgICAgICAgICBjbWQ9IiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuY29uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBuZXh0X2lkcyA9IHNlbGYuX19nZXRfbmV4dF9pZHMoKQorICAgICAgICAgICAgICAgICAgICAjcHJpbnQgIm5leHRfaWRzOiAiICsgc3RyKG5leHRfaWRzKQorICAgICAgICAgICAgICAgICAgICBpZiByZXN1bHQgPD0gMDogcmV0dXJuIHJlc3VsdCwgIkludGVybmFsIERhdGFCYXNlIGVycm9yIGdldHRpbmcgbmV4dCBpZCBvZiB0YWJsZXMiCisKKyAgICAgICAgICAgICAgICAgICAgI2NyZWF0ZSB1dWlkIGlmIG5vdCBwcm92aWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAndXVpZCcgbm90IGluIGhvc3RfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQgPSBob3N0X2RpY3RbJ3V1aWQnXSA9IHN0cihteVV1aWQudXVpZDEoKSkgIyBjcmVhdGVfdXVpZAorICAgICAgICAgICAgICAgICAgICBlbHNlOiAjY2hlY2sgdXVpZCBpcyB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCA9IHN0cihob3N0X2RpY3RbJ3V1aWQnXSkKKyAgICAgICAgICAgICAgICAgICAgIyAgICByZXN1bHQsIGRhdGEgPSBzZWxmLmNoZWNrX3V1aWQodXVpZCkKKyAgICAgICAgICAgICAgICAgICAgIyAgICBpZiAocmVzdWx0ID09IDEpOgorICAgICAgICAgICAgICAgICAgICAjICAgICAgICByZXR1cm4gLTEsICJVVUlEICclcycgYWxyZWFkeSBpbiB1c2UiICUgdXVpZAorCisgICAgICAgICAgICAgICAgICAgICNpbnNlcnRpbmcgbmV3IHV1aWQKKyAgICAgICAgICAgICAgICAgICAgY21kID0gIklOU0VSVCBJTlRPIHV1aWRzICh1dWlkLCB1c2VkX2F0KSBWQUxVRVMgKCclcycsJ2hvc3RzJykiICUgdXVpZAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorCisgICAgICAgICAgICAgICAgICAgICNpbnNlcnQgaW4gdGFibGUgaG9zdAorICAgICAgICAgICAgICAgICAgICBudW1hX2xpc3QgPSBob3N0X2RpY3QucG9wKCdudW1hcycsIFtdKQorICAgICAgICAgICAgICAgICAgICAjZ2V0IG5vbmh1cGFnZXMgYW5kIG5vbmlzb2xhdGVkIGNwdXMKKyAgICAgICAgICAgICAgICAgICAgaG9zdF9kaWN0WydSQU0nXT0wCisgICAgICAgICAgICAgICAgICAgIGhvc3RfZGljdFsnY3B1cyddPTAKKyAgICAgICAgICAgICAgICAgICAgZm9yIG51bWEgaW4gbnVtYV9saXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgbWVtX251bWEgPSBudW1hLmdldCgnbWVtb3J5JywgMCkgLSBudW1hLmdldCgnaHVnZXBhZ2VzJywwKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWVtX251bWE+MDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0X2RpY3RbJ1JBTSddICs9IG1lbV9udW1hIAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvcmUgaW4gbnVtYS5nZXQoImNvcmVzIiwgW10pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICJzdGF0dXMiIGluIGNvcmUgYW5kIGNvcmVbInN0YXR1cyJdPT0ibm90ZWxpZ2libGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0X2RpY3RbJ2NwdXMnXSs9MQorICAgICAgICAgICAgICAgICAgICBob3N0X2RpY3RbJ1JBTSddKj0xMDI0ICMgZnJvbSBHQiB0byBNQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAga2V5cyAgICA9ICIsIi5qb2luKGhvc3RfZGljdC5rZXlzKCkpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlcyAgPSAiLCIuam9pbiggbWFwKGxhbWJkYSB4OiAiTnVsbCIgaWYgeCBpcyBOb25lIGVsc2UgIiciK3N0cih4KSsiJyIsIGhvc3RfZGljdC52YWx1ZXMoKSApICkKKyAgICAgICAgICAgICAgICAgICAgY21kID0gIklOU0VSVCBJTlRPIGhvc3RzICgiICsga2V5cyArICIpIFZBTFVFUyAoIiArIHZhbHVlcyArICIpIgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAjaWYgcmVzdWx0ICE9IDE6IHJldHVybiAtMSwgIkRhdGFiYXNlIEVycm9yIHdoaWxlIGluc2VydGluZyBhdCBob3N0cyB0YWJsZSIKKworICAgICAgICAgICAgICAgICAgICAjaW5zZXJ0IG51bWFzCisgICAgICAgICAgICAgICAgICAgIG5iX251bWFzID0gbmJfY29yZXMgPSBuYl9pZmFjZXMgPSAwCisgICAgICAgICAgICAgICAgICAgIGZvciBudW1hX2RpY3QgaW4gbnVtYV9saXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgbmJfbnVtYXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2xpc3QgPSBudW1hX2RpY3QucG9wKCdpbnRlcmZhY2VzJywgW10pCisgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2xpc3QgPSBudW1hX2RpY3QucG9wKCdjb3JlcycsIFtdKQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9kaWN0WydpZCddID0gbmV4dF9pZHNbJ251bWFzJ107ICAgbmV4dF9pZHNbJ251bWFzJ10gKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9kaWN0Wydob3N0X2lkJ10gPSB1dWlkCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICAgID0gIiwiLmpvaW4obnVtYV9kaWN0LmtleXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyAgPSAiLCIuam9pbiggbWFwKGxhbWJkYSB4OiAiTnVsbCIgaWYgeCBpcyBOb25lIGVsc2UgIiciK3N0cih4KSsiJyIsIG51bWFfZGljdC52YWx1ZXMoKSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJJTlNFUlQgSU5UTyBudW1hcyAoIiArIGtleXMgKyAiKSBWQUxVRVMgKCIgKyB2YWx1ZXMgKyAiKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorCisgICAgICAgICAgICAgICAgICAgICAgICAjaW5zZXJ0IGNvcmVzCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29yZV9kaWN0IGluIGNvcmVfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9jb3JlcyArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9kaWN0WydudW1hX2lkJ10gPSBudW1hX2RpY3RbJ2lkJ10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICAgID0gIiwiLmpvaW4oY29yZV9kaWN0LmtleXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgID0gIiwiLmpvaW4oIG1hcChsYW1iZGEgeDogIk51bGwiIGlmIHggaXMgTm9uZSBlbHNlICInIitzdHIoeCkrIiciLCBjb3JlX2RpY3QudmFsdWVzKCkgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gIklOU0VSVCBJTlRPIHJlc291cmNlc19jb3JlICgiICsga2V5cyArICIpIFZBTFVFUyAoIiArIHZhbHVlcyArICIpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKworICAgICAgICAgICAgICAgICAgICAgICAgI2luc2VydCBwb3J0cworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBvcnRfZGljdCBpbiBpbnRlcmZhY2VfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9pZmFjZXMgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyaW92X2xpc3QgPSBwb3J0X2RpY3QucG9wKCdzcmlvdnMnLCBbXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X2RpY3RbJ251bWFfaWQnXSA9IG51bWFfZGljdFsnaWQnXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfZGljdFsnaWQnXSA9IHBvcnRfZGljdFsncm9vdF9pZCddID0gbmV4dF9pZHNbJ3Jlc291cmNlc19wb3J0J10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2lkc1sncmVzb3VyY2VzX3BvcnQnXSArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoX3BvcnQgPSBwb3J0X2RpY3QuZ2V0KCdzd2l0Y2hfcG9ydCcsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoX2RwaWQgPSBwb3J0X2RpY3QuZ2V0KCdzd2l0Y2hfZHBpZCcsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAgICA9ICIsIi5qb2luKHBvcnRfZGljdC5rZXlzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICA9ICIsIi5qb2luKCBtYXAobGFtYmRhIHg6ICAiTnVsbCIgaWYgeCBpcyBOb25lIGVsc2UgIiciK3N0cih4KSsiJyIsIHBvcnRfZGljdC52YWx1ZXMoKSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAiSU5TRVJUIElOVE8gcmVzb3VyY2VzX3BvcnQgKCIgKyBrZXlzICsgIikgVkFMVUVTICgiICsgdmFsdWVzICsgIikiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2luc2VydCBzcmlvdnMgaW50byBwb3J0IHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNyaW92X2RpY3QgaW4gc3Jpb3ZfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Jpb3ZfZGljdFsnc3dpdGNoX3BvcnQnXSA9IHN3aXRjaF9wb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyaW92X2RpY3RbJ3N3aXRjaF9kcGlkJ10gPSBzd2l0Y2hfZHBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmlvdl9kaWN0WydudW1hX2lkJ10gPSBwb3J0X2RpY3RbJ251bWFfaWQnXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmlvdl9kaWN0WydNYnBzJ10gPSBwb3J0X2RpY3RbJ01icHMnXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmlvdl9kaWN0Wydyb290X2lkJ10gPSBwb3J0X2RpY3RbJ2lkJ10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Jpb3ZfZGljdFsnaWQnXSA9IG5leHRfaWRzWydyZXNvdXJjZXNfcG9ydCddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICJ2bGFuIiBpbiBzcmlvdl9kaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHNyaW92X2RpY3RbInZsYW4iXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2lkc1sncmVzb3VyY2VzX3BvcnQnXSArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgICAgPSAiLCIuam9pbihzcmlvdl9kaWN0LmtleXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICA9ICIsIi5qb2luKCBtYXAobGFtYmRhIHg6ICAiTnVsbCIgaWYgeCBpcyBOb25lIGVsc2UgIiciK3N0cih4KSsiJyIsIHNyaW92X2RpY3QudmFsdWVzKCkgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJJTlNFUlQgSU5UTyByZXNvdXJjZXNfcG9ydCAoIiArIGtleXMgKyAiKSBWQUxVRVMgKCIgKyB2YWx1ZXMgKyAiKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKworICAgICAgICAgICAgICAgICAgICAjaW5zZXJ0aW5nIG5ldyBsb2cKKyAgICAgICAgICAgICAgICAgICAgI2NtZCA9ICJJTlNFUlQgSU5UTyBsb2dzIChyZWxhdGVkLGxldmVsLHV1aWQsZGVzY3JpcHRpb24pIFZBTFVFUyAoJ2hvc3RzJywnZGVidWcnLCclcycsJ25ldyBob3N0OiAlZCBudW1hcywgJWQgdGhlYWRzLCAlZCBpZmFjZXMnKSIgJSAodXVpZCwgbmJfbnVtYXMsIG5iX2NvcmVzLCBuYl9pZmFjZXMpCisgICAgICAgICAgICAgICAgICAgICNzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICNyZXN1bHQgPSBzZWxmLmN1ci5leGVjdXRlKGNtZCkgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgICNpbnNldGVkIG9rCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmNvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygiY2FsbHByb2MoJ1VwZGF0ZVN3aXRjaFBvcnQnLCAoKSApIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuY2FsbHByb2MoJ1VwZGF0ZVN3aXRjaFBvcnQnLCAoKSApCisKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygiZ2V0dGluZyBob3N0ICclcyciLHN0cihob3N0X2RpY3RbJ3V1aWQnXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2hvc3QoaG9zdF9kaWN0Wyd1dWlkJ10pCisgICAgICAgICAgICBleGNlcHQgKG1kYi5FcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAgICAgcixjID0gc2VsZi5mb3JtYXRfZXJyb3IoZSwgIm5ld19ob3N0IiwgY21kKQorICAgICAgICAgICAgICAgIGlmIHIhPS1IVFRQX1JlcXVlc3RfVGltZW91dCBvciByZXRyeV89PTE6IHJldHVybiByLGMKKworICAgIGRlZiBuZXdfZmxhdm9yKHNlbGYsIGZsYXZvcl9kaWN0LCB0ZW5hbnRfaWQgKToKKyAgICAgICAgJycnQWRkIG5ldyBmbGF2b3IgaW50byB0aGUgZGF0YWJhc2UuIENyZWF0ZSB1dWlkIGlmIG5vdCBwcm92aWRlZAorICAgICAgICBBdHJpYnV0ZXMKKyAgICAgICAgICAgIGZsYXZvcl9kaWN0OiBmbGF2b3IgZGljdGlvbmFyeSB3aXRoIHRoZSBrZXk6IHZhbHVlIHRvIGluc2VydC4gTXVzdCBiZSB2YWxpZCBmbGF2b3JzIGNvbHVtbnMKKyAgICAgICAgICAgIHRlbmFudF9pZDogaWYgbm90ICdhbnknLCBpdCBtYXRjaGVzIHRoaXMgZmxhdm9yL3RlbmFudCBpbnNlcnRpbmcgYXQgdGVuYW50c19mbGF2b3JzIHRhYmxlCisgICAgICAgIFJldHVybjogKHJlc3VsdCwgZGF0YSkgd2hlcmUgcmVzdWx0IGNhbiBiZQorICAgICAgICAgICAgbmVnYXRpdmU6IGVycm9yIGF0IGluc2VydGluZy4gZGF0YSBjb250YWluIHRleHQKKyAgICAgICAgICAgIDEsIGluc2VydGVkLCBkYXRhIGNvbnRhaW4gaW5zZXJ0ZWQgdXVpZCBmbGF2b3IKKyAgICAgICAgJycnCisgICAgICAgIGZvciByZXRyeV8gaW4gcmFuZ2UoMCwyKToKKyAgICAgICAgICAgIGNtZD0iIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKworICAgICAgICAgICAgICAgICAgICAjY3JlYXRlIHV1aWQgaWYgbm90IHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgIGlmICd1dWlkJyBub3QgaW4gZmxhdm9yX2RpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICB1dWlkID0gZmxhdm9yX2RpY3RbJ3V1aWQnXSA9IHN0cihteVV1aWQudXVpZDEoKSkgIyBjcmVhdGVfdXVpZAorICAgICAgICAgICAgICAgICAgICBlbHNlOiAjY2hlY2sgdXVpZCBpcyB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCA9IHN0cihmbGF2b3JfZGljdFsndXVpZCddKQorICAgICAgICAgICAgICAgICAgICAjICAgIHJlc3VsdCwgZGF0YSA9IHNlbGYuY2hlY2tfdXVpZCh1dWlkKQorICAgICAgICAgICAgICAgICAgICAjICAgIGlmIChyZXN1bHQgPT0gMSk6CisgICAgICAgICAgICAgICAgICAgICMgICAgICAgIHJldHVybiAtMSwgIlVVSUQgJyVzJyBhbHJlYWR5IGluIHVzZSIgJSB1dWlkCisKKyAgICAgICAgICAgICAgICAgICAgI2luc2VydGluZyBuZXcgdXVpZAorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiSU5TRVJUIElOVE8gdXVpZHMgKHV1aWQsIHVzZWRfYXQpIFZBTFVFUyAoJyVzJywnZmxhdm9ycycpIiAlIHV1aWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKworICAgICAgICAgICAgICAgICAgICAjaW5zZXJ0IGluIHRhYmxlIGZsYXZvcgorICAgICAgICAgICAgICAgICAgICBrZXlzICAgID0gIiwiLmpvaW4oZmxhdm9yX2RpY3Qua2V5cygpKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgID0gIiwiLmpvaW4oIG1hcChsYW1iZGEgeDogICJOdWxsIiBpZiB4IGlzIE5vbmUgZWxzZSAiJyIrc3RyKHgpKyInIiwgZmxhdm9yX2RpY3QudmFsdWVzKCkgKSApCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJJTlNFUlQgSU5UTyBmbGF2b3JzICgiICsga2V5cyArICIpIFZBTFVFUyAoIiArIHZhbHVlcyArICIpIgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAjaWYgcmVzdWx0ICE9IDE6IHJldHVybiAtMSwgIkRhdGFiYXNlIEVycm9yIHdoaWxlIGluc2VydGluZyBhdCBmbGF2b3JzIHRhYmxlIgorCisgICAgICAgICAgICAgICAgICAgICNpbnNlcnQgdGVuYW50c19mbGF2b3JzCisgICAgICAgICAgICAgICAgICAgIGlmIHRlbmFudF9pZCAhPSAnYW55JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJJTlNFUlQgSU5UTyB0ZW5hbnRzX2ZsYXZvcnMgKHRlbmFudF9pZCxmbGF2b3JfaWQpIFZBTFVFUyAoJyVzJywnJXMnKSIgJSAodGVuYW50X2lkLCB1dWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisKKyAgICAgICAgICAgICAgICAgICAgI2luc2VydGluZyBuZXcgbG9nCisgICAgICAgICAgICAgICAgICAgICNkZWwgZmxhdm9yX2RpY3RbJ3V1aWQnXQorICAgICAgICAgICAgICAgICAgICAjaWYgJ2V4dGVuZGVkJyBpbiBmbGF2b3JfZGljdDogZGVsIGZsYXZvcl9kaWN0WydleHRlbmRlZCddICNyZW1vdmUgdHdvIG1hbnkgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgI2NtZCA9ICJJTlNFUlQgSU5UTyBsb2dzIChyZWxhdGVkLGxldmVsLHV1aWQsIHRlbmFudF9pZCwgZGVzY3JpcHRpb24pIFZBTFVFUyAoJ2ZsYXZvcnMnLCdkZWJ1ZycsJyVzJywnJXMnLFwibmV3IGZsYXZvcjogJXNcIikiIFwKKyAgICAgICAgICAgICAgICAgICAgIyAgICAlICh1dWlkLCB0ZW5hbnRfaWQsIHN0cihmbGF2b3JfZGljdCkpCisgICAgICAgICAgICAgICAgICAgICNzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICNzZWxmLmN1ci5leGVjdXRlKGNtZCkgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgICNpbnNldGVkIG9rCisgICAgICAgICAgICAgICAgcmV0dXJuIDEsIHV1aWQKKyAgICAgICAgICAgIGV4Y2VwdCAobWRiLkVycm9yLCBBdHRyaWJ1dGVFcnJvcikgYXMgZToKKyAgICAgICAgICAgICAgICByLGMgPSBzZWxmLmZvcm1hdF9lcnJvcihlLCAibmV3X2ZsYXZvciIsIGNtZCwgInVwZGF0ZSIsIHRlbmFudF9pZCkKKyAgICAgICAgICAgICAgICBpZiByIT0tSFRUUF9SZXF1ZXN0X1RpbWVvdXQgb3IgcmV0cnlfPT0xOiByZXR1cm4gcixjCisgICAgICAgIAorICAgIGRlZiBuZXdfaW1hZ2Uoc2VsZiwgaW1hZ2VfZGljdCwgdGVuYW50X2lkKToKKyAgICAgICAgJycnQWRkIG5ldyBpbWFnZSBpbnRvIHRoZSBkYXRhYmFzZS4gQ3JlYXRlIHV1aWQgaWYgbm90IHByb3ZpZGVkCisgICAgICAgIEF0cmlidXRlcworICAgICAgICAgICAgaW1hZ2VfZGljdDogaW1hZ2UgZGljdGlvbmFyeSB3aXRoIHRoZSBrZXk6IHZhbHVlIHRvIGluc2VydC4gTXVzdCBiZSB2YWxpZCBpbWFnZXMgY29sdW1ucworICAgICAgICAgICAgdGVuYW50X2lkOiBpZiBub3QgJ2FueScsIGl0IG1hdGNoZXMgdGhpcyBpbWFnZS90ZW5hbnQgaW5zZXJ0aW5nIGF0IHRlbmFudHNfaW1hZ2VzIHRhYmxlCisgICAgICAgIFJldHVybjogKHJlc3VsdCwgZGF0YSkgd2hlcmUgcmVzdWx0IGNhbiBiZQorICAgICAgICAgICAgbmVnYXRpdmU6IGVycm9yIGF0IGluc2VydGluZy4gZGF0YSBjb250YWluIHRleHQKKyAgICAgICAgICAgIDEsIGluc2VydGVkLCBkYXRhIGNvbnRhaW4gaW5zZXJ0ZWQgdXVpZCBpbWFnZQorICAgICAgICAnJycKKyAgICAgICAgZm9yIHJldHJ5XyBpbiByYW5nZSgwLDIpOgorICAgICAgICAgICAgY21kPSIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmNvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorCisgICAgICAgICAgICAgICAgICAgICNjcmVhdGUgdXVpZCBpZiBub3QgcHJvdmlkZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgJ3V1aWQnIG5vdCBpbiBpbWFnZV9kaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCA9IGltYWdlX2RpY3RbJ3V1aWQnXSA9IHN0cihteVV1aWQudXVpZDEoKSkgIyBjcmVhdGVfdXVpZAorICAgICAgICAgICAgICAgICAgICBlbHNlOiAjY2hlY2sgdXVpZCBpcyB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCA9IHN0cihpbWFnZV9kaWN0Wyd1dWlkJ10pCisgICAgICAgICAgICAgICAgICAgICMgICAgcmVzdWx0LCBkYXRhID0gc2VsZi5jaGVja191dWlkKHV1aWQpCisgICAgICAgICAgICAgICAgICAgICMgICAgaWYgKHJlc3VsdCA9PSAxKToKKyAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgcmV0dXJuIC0xLCAiVVVJRCAnJXMnIGFscmVhZHkgaW4gdXNlIiAlIHV1aWQKKworICAgICAgICAgICAgICAgICAgICAjaW5zZXJ0aW5nIG5ldyB1dWlkCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJJTlNFUlQgSU5UTyB1dWlkcyAodXVpZCwgdXNlZF9hdCkgVkFMVUVTICgnJXMnLCdpbWFnZXMnKSIgJSB1dWlkCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisKKyAgICAgICAgICAgICAgICAgICAgI2luc2VydCBpbiB0YWJsZSBpbWFnZQorICAgICAgICAgICAgICAgICAgICBrZXlzICAgID0gIiwiLmpvaW4oaW1hZ2VfZGljdC5rZXlzKCkpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlcyAgPSAiLCIuam9pbiggbWFwKGxhbWJkYSB4OiAgIk51bGwiIGlmIHggaXMgTm9uZSBlbHNlICInIitzdHIoeCkrIiciLCBpbWFnZV9kaWN0LnZhbHVlcygpICkgKQorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiSU5TRVJUIElOVE8gaW1hZ2VzICgiICsga2V5cyArICIpIFZBTFVFUyAoIiArIHZhbHVlcyArICIpIgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAjaWYgcmVzdWx0ICE9IDE6IHJldHVybiAtMSwgIkRhdGFiYXNlIEVycm9yIHdoaWxlIGluc2VydGluZyBhdCBpbWFnZXMgdGFibGUiCisKKyAgICAgICAgICAgICAgICAgICAgI2luc2VydCB0ZW5hbnRzX2ltYWdlcworICAgICAgICAgICAgICAgICAgICBpZiB0ZW5hbnRfaWQgIT0gJ2FueSc6CisgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAiSU5TRVJUIElOVE8gdGVuYW50c19pbWFnZXMgKHRlbmFudF9pZCxpbWFnZV9pZCkgVkFMVUVTICgnJXMnLCclcycpIiAlICh0ZW5hbnRfaWQsIHV1aWQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKworICAgICAgICAgICAgICAgICAgICAjI2luc2VydGluZyBuZXcgbG9nCisgICAgICAgICAgICAgICAgICAgICNjbWQgPSAiSU5TRVJUIElOVE8gbG9ncyAocmVsYXRlZCxsZXZlbCx1dWlkLCB0ZW5hbnRfaWQsIGRlc2NyaXB0aW9uKSBWQUxVRVMgKCdpbWFnZXMnLCdkZWJ1ZycsJyVzJywnJXMnLFwibmV3IGltYWdlOiAlcyBwYXRoOiAlc1wiKSIgJSAodXVpZCwgdGVuYW50X2lkLCBpbWFnZV9kaWN0WyduYW1lJ10sIGltYWdlX2RpY3RbJ3BhdGgnXSkKKyAgICAgICAgICAgICAgICAgICAgI3NlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgI3NlbGYuY3VyLmV4ZWN1dGUoY21kKSAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgI2luc2V0ZWQgb2sKKyAgICAgICAgICAgICAgICByZXR1cm4gMSwgdXVpZAorICAgICAgICAgICAgZXhjZXB0IChtZGIuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIHIsYyA9IHNlbGYuZm9ybWF0X2Vycm9yKGUsICJuZXdfaW1hZ2UiLCBjbWQsICJ1cGRhdGUiLCB0ZW5hbnRfaWQpCisgICAgICAgICAgICAgICAgaWYgciE9LUhUVFBfUmVxdWVzdF9UaW1lb3V0IG9yIHJldHJ5Xz09MTogcmV0dXJuIHIsYworICAgICAgICAKKyAgICBkZWYgZGVsZXRlX2ltYWdlX2ZsYXZvcihzZWxmLCBpdGVtX3R5cGUsIGl0ZW1faWQsIHRlbmFudF9pZCk6CisgICAgICAgICcnJ2RlbGV0ZXMgYW4gaW1hZ2Ugb3IgZmxhdm9yIGZyb20gZGF0YWJhc2UKKyAgICAgICAgaXRlbV90eXBlIG11c3QgYmUgYSAnaW1hZ2UnIG9yICdmbGF2b3InCisgICAgICAgIGl0ZW1faWQgaXMgdGhlIHV1aWQKKyAgICAgICAgdGVuYW50X2lkIGlzIHRoZSBhc29jaWF0ZWQgdGVuYW50LCBjYW4gYmUgJ2FueScgd2l0aCBtZWFucyBhbGwKKyAgICAgICAgSWYgdGVuYW5faWQgaXMgbm90IGFueSwgaXQgZGVsZXRlcyBmcm9tIHRlbmFudHNfaW1hZ2VzL2ZsYXZvcnMsCisgICAgICAgIHdoaWNoIG1lYW5zIHRoaXMgaW1hZ2UvZmxhdm9yIGlzIHVzZWQgYnkgdGhpcyB0ZW5hbnQsIGFuZCBpZiBzdWNjZXNzLCAKKyAgICAgICAgaXQgdHJpZXMgdG8gZGVsZXRlIGZyb20gaW1hZ2VzL2ZsYXZvcnMgaW4gY2FzZSB0aGlzIGlzIG5vdCBwdWJsaWMsIAorICAgICAgICB0aGF0IG9ubHkgd2lsbCBzdWNjZXNzIGlmIGltYWdlIGlzIHByaXZhdGUgYW5kIG5vdCB1c2VkIGJ5IG90aGVyIHRlbmFudHMKKyAgICAgICAgSWYgdGVuYW50X2lkIGlzIGFueSwgaXQgdHJpZXMgdG8gZGVsZXRlIGZyb20gYm90aCB0YWJsZXMgYXQgdGhlIHNhbWUgdHJhbnNhY3Rpb24KKyAgICAgICAgc28gdGhhdCBpbWFnZS9mbGF2b3IgaXMgY29tcGxldGVseSBkZWxldGVkIGZyb20gYWxsIHRlbmFudHMgb3Igbm90aGluZworICAgICAgICAnJycKKyAgICAgICAgZm9yIHJldHJ5XyBpbiByYW5nZSgwLDIpOgorICAgICAgICAgICAgZGVsZXRlZCA9IC0xCisgICAgICAgICAgICBkZWxldGVkX2l0ZW0gPSAtMQorICAgICAgICAgICAgcmVzdWx0ID0gKC1IVFRQX0ludGVybmFsX1NlcnZlcl9FcnJvciwgImludGVybmFsIGVycm9yIikKKyAgICAgICAgICAgIGNtZD0iIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICAgICAgY21kID0gIkRFTEVURSBGUk9NIHRlbmFudHNfJXNzIFdIRVJFICVzX2lkID0gJyVzJyIgJSAoaXRlbV90eXBlLCBpdGVtX3R5cGUsIGl0ZW1faWQpCisgICAgICAgICAgICAgICAgICAgIGlmIHRlbmFudF9pZCAhPSAnYW55JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCArPSAiIEFORCB0ZW5hbnRfaWQgPSAnJXMnIiAlIHRlbmFudF9pZAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICBkZWxldGVkID0gc2VsZi5jdXIucm93Y291bnQKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVuYW50X2lkID09ICdhbnknOiAjZGVsZXRlIGZyb20gaW1hZ2VzL2ZsYXZvcnMgaW4gdGhlIFNBTUUgdHJhbnNhY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJERUxFVEUgRlJPTSAlc3MgV0hFUkUgdXVpZCA9ICclcyciICUgKGl0ZW1fdHlwZSwgaXRlbV9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZCA9IHNlbGYuY3VyLnJvd2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWxldGVkPj0xOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWxldGUgdXVpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJERUxFVEUgRlJPTSB1dWlkcyBXSEVSRSB1dWlkID0gJyVzJyIgJSBpdGVtX2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjaW5zZXJ0aW5nIG5ldyBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY21kID0gIklOU0VSVCBJTlRPIGxvZ3MgKHJlbGF0ZWQsbGV2ZWwsdXVpZCx0ZW5hbnRfaWQsZGVzY3JpcHRpb24pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgIFZBTFVFUyAoJyVzcycsJ2RlYnVnJywnJXMnLCclcycsJ2RlbGV0ZSAlcyBjb21wbGV0ZWx5JykiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgKGl0ZW1fdHlwZSwgaXRlbV9pZCwgdGVuYW50X2lkLCBpdGVtX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZWQsICIlcyAnJXMnIGNvbXBsZXRlbHkgZGVsZXRlZCIgJSAoaXRlbV90eXBlLCBpdGVtX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAsICIlcyAnJXMnIG5vdCBmb3VuZCIgJSAoaXRlbV90eXBlLCBpdGVtX2lkKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVsZXRlZCA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgIyNpbnNlcnRpbmcgbmV3IGxvZworICAgICAgICAgICAgICAgICAgICAgICAgI2NtZCA9ICJJTlNFUlQgSU5UTyBsb2dzIChyZWxhdGVkLGxldmVsLHV1aWQsdGVuYW50X2lkLGRlc2NyaXB0aW9uKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICBWQUxVRVMgKCclc3MnLCdkZWJ1ZycsJyVzJywnJXMnLCdkZWxldGUgJXMgcmVmZXJlbmNlIGZvciB0aGlzIHRlbmFudCcpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgIChpdGVtX3R5cGUsIGl0ZW1faWQsIHRlbmFudF9pZCwgaXRlbV90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICNzZWxmLmN1ci5leGVjdXRlKGNtZCkKKworICAgICAgICAgICAgICAgICAgICAgICAgI2NvbW1pdCB0cmFuc2FjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICAgICAgICAgICNpZiB0ZW5hbnQhPWFueSAgZGVsZXRlIGZyb20gaW1hZ2VzL2ZsYXZvcnMgaW4gT1RIRVIgdHJhbnNhY3Rpb24uIElmIGZhaWxzIGlzIGJlY2F1c2UgZGVwZW5kZW5jaWVzIHNvIHRoYXQgbm90IHJldHVybiBlcnJvcgorICAgICAgICAgICAgICAgIGlmIGRlbGV0ZWQ9PTE6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICNkZWxldGUgaW1hZ2UvZmxhdm9yIGlmIG5vdCBwdWJsaWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJERUxFVEUgRlJPTSAlc3MgV0hFUkUgdXVpZCA9ICclcycgQU5EIHB1YmxpYyA9ICdubyciICUgKGl0ZW1fdHlwZSwgaXRlbV9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZF9pdGVtID0gc2VsZi5jdXIucm93Y291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlbGV0ZWRfaXRlbSA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWxldGUgdXVpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJERUxFVEUgRlJPTSB1dWlkcyBXSEVSRSB1dWlkID0gJyVzJyIgJSBpdGVtX2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjaW5zZXJ0aW5nIG5ldyBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY21kID0gIklOU0VSVCBJTlRPIGxvZ3MgKHJlbGF0ZWQsbGV2ZWwsdXVpZCx0ZW5hbnRfaWQsZGVzY3JpcHRpb24pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgIFZBTFVFUyAoJyVzcycsJ2RlYnVnJywnJXMnLCclcycsJ2RlbGV0ZSAlcyBjb21wbGV0ZWx5JykiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgKGl0ZW1fdHlwZSwgaXRlbV9pZCwgdGVuYW50X2lkLCBpdGVtX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICBleGNlcHQgKG1kYi5FcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAgICAgI3ByaW50ICJkZWxldGVfJXMgREIgRXhjZXB0aW9uICVkOiAlcyIgJSAoaXRlbV90eXBlLCBlLmFyZ3NbMF0sIGUuYXJnc1sxXSkKKyAgICAgICAgICAgICAgICBpZiBkZWxldGVkIDwwOiAKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mb3JtYXRfZXJyb3IoZSwgImRlbGV0ZV8iK2l0ZW1fdHlwZSwgY21kLCAiZGVsZXRlIiwgInNlcnZlcnMiKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBkZWxldGVkPT0xOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSwgIiVzICclcycgZnJvbSB0ZW5hbnQgJyVzJyAlc2RlbGV0ZWQiICUgXAorICAgICAgICAgICAgICAgICAgICAoaXRlbV90eXBlLCBpdGVtX2lkLCB0ZW5hbnRfaWQsICJjb21wbGV0ZWx5ICIgaWYgZGVsZXRlZF9pdGVtPT0xIGVsc2UgIiIpCisgICAgICAgICAgICAgICAgZWxpZiBkZWxldGVkPT0wOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCwgIiVzICclcycgZnJvbSB0ZW5hbnQgJyVzJyBub3QgZm91bmQiICUgKGl0ZW1fdHlwZSwgaXRlbV9pZCwgdGVuYW50X2lkKQorICAgICAgICAgICAgICAgIGVsc2U6IAorICAgICAgICAgICAgICAgICAgICBpZiByZXN1bHRbMF0hPS1IVFRQX1JlcXVlc3RfVGltZW91dCBvciByZXRyeV89PTE6IHJldHVybiByZXN1bHQgIAorICAgICAgICAgICAgCisgICAgZGVmIGRlbGV0ZV9yb3coc2VsZiwgdGFibGUsIHV1aWQpOgorICAgICAgICBmb3IgcmV0cnlfIGluIHJhbmdlKDAsMik6CisgICAgICAgICAgICBjbWQ9IiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuY29uOgorICAgICAgICAgICAgICAgICAgICAjZGVsZXRlIGhvc3QKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiREVMRVRFIEZST00gJXMgV0hFUkUgdXVpZCA9ICclcyciICUgKHRhYmxlLCB1dWlkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICBkZWxldGVkID0gc2VsZi5jdXIucm93Y291bnQKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVsZXRlZCA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgI2RlbGV0ZSB1dWlkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0YWJsZSA9PSAndGVuYW50cyc6IHRlbmFudF9zdHI9dXVpZAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogdGVuYW50X3N0cj0nTnVsbCcKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJERUxFVEUgRlJPTSB1dWlkcyBXSEVSRSB1dWlkID0gJyVzJyIgJSB1dWlkCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICMjaW5zZXJ0aW5nIG5ldyBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICNjbWQgPSAiSU5TRVJUIElOVE8gbG9ncyAocmVsYXRlZCxsZXZlbCx1dWlkLHRlbmFudF9pZCxkZXNjcmlwdGlvbikgVkFMVUVTICgnJXMnLCdkZWJ1ZycsJyVzJywnJXMnLCdkZWxldGUgJXMnKSIgJSAodGFibGUsIHV1aWQsIHRlbmFudF9zdHIsIHRhYmxlWzotMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGYuY3VyLmV4ZWN1dGUoY21kKSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZWQsIHRhYmxlWzotMV0gKyAiICclcycgJXMiICUodXVpZCwgImRlbGV0ZWQiIGlmIGRlbGV0ZWQ9PTEgZWxzZSAibm90IGZvdW5kIikKKyAgICAgICAgICAgIGV4Y2VwdCAobWRiLkVycm9yLCBBdHRyaWJ1dGVFcnJvcikgYXMgZToKKyAgICAgICAgICAgICAgICByLGMgPSBzZWxmLmZvcm1hdF9lcnJvcihlLCAiZGVsZXRlX3JvdyIsIGNtZCwgImRlbGV0ZSIsICdpbnN0YW5jZXMnIGlmIHRhYmxlPT0naG9zdHMnIG9yIHRhYmxlPT0ndGVuYW50cycgZWxzZSAnZGVwZW5kZW5jaWVzJykKKyAgICAgICAgICAgICAgICBpZiByIT0tSFRUUF9SZXF1ZXN0X1RpbWVvdXQgb3IgcmV0cnlfPT0xOiByZXR1cm4gcixjCisKKyAgICBkZWYgZGVsZXRlX3Jvd19ieV9rZXkoc2VsZiwgdGFibGUsIGtleSwgdmFsdWUpOgorICAgICAgICBmb3IgcmV0cnlfIGluIHJhbmdlKDAsMik6CisgICAgICAgICAgICBjbWQ9IiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuY29uOgorICAgICAgICAgICAgICAgICAgICAjZGVsZXRlIGhvc3QKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiREVMRVRFIEZST00gJXMiICUgKHRhYmxlKQorICAgICAgICAgICAgICAgICAgICBpZiBrZXkhPU5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSE9Tm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgKz0gIiBXSEVSRSAlcyA9ICclcyciICUgKGtleSwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCArPSAiIFdIRVJFICVzIGlzIG51bGwiICUgKGtleSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZTogI2RlbGV0ZSBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlZCA9IHNlbGYuY3VyLnJvd2NvdW50CisgICAgICAgICAgICAgICAgICAgIGlmIGRlbGV0ZWQgPCAxOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCAnTm90IGZvdW5kJworICAgICAgICAgICAgICAgICAgICAgICAgI2RlbGV0ZSB1dWlkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwLCBkZWxldGVkCisgICAgICAgICAgICBleGNlcHQgKG1kYi5FcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAgICAgcixjID0gc2VsZi5mb3JtYXRfZXJyb3IoZSwgImRlbGV0ZV9yb3dfYnlfa2V5IiwgY21kLCAiZGVsZXRlIiwgJ2luc3RhbmNlcycgaWYgdGFibGU9PSdob3N0cycgb3IgdGFibGU9PSd0ZW5hbnRzJyBlbHNlICdkZXBlbmRlbmNpZXMnKQorICAgICAgICAgICAgICAgIGlmIHIhPS1IVFRQX1JlcXVlc3RfVGltZW91dCBvciByZXRyeV89PTE6IHJldHVybiByLGMKKyAgICAgICAgICAgICAgICAKKyAgICBkZWYgZGVsZXRlX3Jvd19ieV9kaWN0KHNlbGYsICoqc3FsX2RpY3QpOgorICAgICAgICAnJycgRGVsZXRlcyByb3dzIGZyb20gYSB0YWJsZS4KKyAgICAgICAgQXR0cmlidXRlIHNxbF9kaXI6IGRpY3Rpb25hcnkgd2l0aCB0aGUgZm9sbG93aW5nIGtleTogdmFsdWUKKyAgICAgICAgICAgICdGUk9NJzogc3RyaW5nIG9mIHRhYmxlIG5hbWUgKE1hbmRhdG9yeSkKKyAgICAgICAgICAgICdXSEVSRSc6IGRpY3Qgb2Yga2V5OnZhbHVlcywgdHJhbnNsYXRlZCB0byBrZXk9dmFsdWUgQU5EIC4uLiAoT3B0aW9uYWwpCisgICAgICAgICAgICAnV0hFUkVfTk9UJzogZGljdCBvZiBrZXk6dmFsdWVzLCB0cmFuc2xhdGVkIHRvIGtleTw+dmFsdWUgQU5EIC4uLiAoT3B0aW9uYWwpCisgICAgICAgICAgICAnV0hFUkVfTk9UTlVMTCc6IChsaXN0IG9yIHR1cGxlIG9mIGl0ZW1zIHRoYXQgbXVzdCBub3QgYmUgbnVsbCBpbiBhIHdoZXJlIC4uLiAoT3B0aW9uYWwpCisgICAgICAgICAgICAnTElNSVQnOiBsaW1pdCBvZiBudW1iZXIgb2Ygcm93cyAoT3B0aW9uYWwpCisgICAgICAgIFJldHVybjogdGhlIChudW1iZXIgb2YgaXRlbXMgZGVsZXRlZCwgZGVzY3JpcHRpdmUgdGVzdCkgaWYgb2s7IChuZWdhdGl2ZSwgZGVzY3JpcHRpdmUgdGV4dCkgaWYgZXJyb3IKKyAgICAgICAgJycnCisgICAgICAgICNwcmludCBzcWxfZGljdAorICAgICAgICBmcm9tXyAgPSAiRlJPTSAiICsgc3RyKHNxbF9kaWN0WydGUk9NJ10pCisgICAgICAgICNwcmludCAnZnJvbV8nLCBmcm9tXworICAgICAgICBpZiAnV0hFUkUnIGluIHNxbF9kaWN0IGFuZCBsZW4oc3FsX2RpY3RbJ1dIRVJFJ10pID4gMDoKKyAgICAgICAgICAgIHc9c3FsX2RpY3RbJ1dIRVJFJ10KKyAgICAgICAgICAgIHdoZXJlXyA9ICJXSEVSRSAiICsgIiBBTkQgIi5qb2luKG1hcCggbGFtYmRhIHg6IHN0cih4KSArICgiIGlzIE51bGwiIGlmIHdbeF0gaXMgTm9uZSBlbHNlICI9JyIrc3RyKHdbeF0pKyInIiksICB3LmtleXMoKSkgKSAKKyAgICAgICAgZWxzZTogd2hlcmVfID0gIiIKKyAgICAgICAgaWYgJ1dIRVJFX05PVCcgaW4gc3FsX2RpY3QgYW5kIGxlbihzcWxfZGljdFsnV0hFUkVfTk9UJ10pID4gMDogCisgICAgICAgICAgICB3PXNxbF9kaWN0WydXSEVSRV9OT1QnXQorICAgICAgICAgICAgd2hlcmVfMiA9ICIgQU5EICIuam9pbihtYXAoIGxhbWJkYSB4OiBzdHIoeCkgKyAoIiBpcyBub3QgTnVsbCIgaWYgd1t4XSBpcyBOb25lIGVsc2UgIjw+JyIrc3RyKHdbeF0pKyInIiksICB3LmtleXMoKSkgKQorICAgICAgICAgICAgaWYgbGVuKHdoZXJlXyk9PTA6ICAgd2hlcmVfID0gIldIRVJFICIgKyB3aGVyZV8yCisgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICB3aGVyZV8gPSB3aGVyZV8gKyAiIEFORCAiICsgd2hlcmVfMgorICAgICAgICBpZiAnV0hFUkVfTk9UTlVMTCcgaW4gc3FsX2RpY3QgYW5kIGxlbihzcWxfZGljdFsnV0hFUkVfTk9UTlVMTCddKSA+IDA6IAorICAgICAgICAgICAgdz1zcWxfZGljdFsnV0hFUkVfTk9UTlVMTCddCisgICAgICAgICAgICB3aGVyZV8yID0gIiBBTkQgIi5qb2luKG1hcCggbGFtYmRhIHg6IHN0cih4KSArICIgaXMgbm90IE51bGwiLCAgdykgKQorICAgICAgICAgICAgaWYgbGVuKHdoZXJlXyk9PTA6ICAgd2hlcmVfID0gIldIRVJFICIgKyB3aGVyZV8yCisgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICB3aGVyZV8gPSB3aGVyZV8gKyAiIEFORCAiICsgd2hlcmVfMgorICAgICAgICAjcHJpbnQgJ3doZXJlXycsIHdoZXJlXworICAgICAgICBsaW1pdF8gPSAiTElNSVQgIiArIHN0cihzcWxfZGljdFsnTElNSVQnXSkgaWYgJ0xJTUlUJyBpbiBzcWxfZGljdCBlbHNlICIiCisgICAgICAgICNwcmludCAnbGltaXRfJywgbGltaXRfCisgICAgICAgIGNtZCA9ICAiICIuam9pbiggKCJERUxFVEUiLCBmcm9tXywgd2hlcmVfLCBsaW1pdF8pICkKKyAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICBmb3IgcmV0cnlfIGluIHJhbmdlKDAsMik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmNvbjoKKyAgICAgICAgICAgICAgICAgICAgI2RlbGV0ZSBob3N0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWQgPSBzZWxmLmN1ci5yb3djb3VudAorICAgICAgICAgICAgICAgIHJldHVybiBkZWxldGVkLCAiJWQgZGVsZXRlZCBmcm9tICVzIiAlIChkZWxldGVkLCBzcWxfZGljdFsnRlJPTSddWzotMV0gKQorICAgICAgICAgICAgZXhjZXB0IChtZGIuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIHIsYyA9ICBzZWxmLmZvcm1hdF9lcnJvcihlLCAiZGVsZXRlX3Jvd19ieV9kaWN0IiwgY21kLCAiZGVsZXRlIiwgJ2RlcGVuZGVuY2llcycpCisgICAgICAgICAgICAgICAgaWYgciE9LUhUVFBfUmVxdWVzdF9UaW1lb3V0IG9yIHJldHJ5Xz09MTogcmV0dXJuIHIsYworCisgICAgCisgICAgZGVmIGdldF9pbnN0YW5jZShzZWxmLCBpbnN0YW5jZV9pZCk6CisgICAgICAgIGZvciByZXRyeV8gaW4gcmFuZ2UoMCwyKToKKyAgICAgICAgICAgIGNtZD0iIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKG1kYi5jdXJzb3JzLkRpY3RDdXJzb3IpCisgICAgICAgICAgICAgICAgICAgICNnZXQgSU5TVEFOQ0UKKyAgICAgICAgICAgICAgICAgICAgY21kID0gIlNFTEVDVCB1dWlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgcHJvZ3Jlc3MsIGhvc3RfaWQsIGZsYXZvcl9pZCwgaW1hZ2VfaWQsIHN0YXR1cywgbGFzdF9lcnJvciwgdGVuYW50X2lkLCByYW0sIHZjcHVzLCBjcmVhdGVkX2F0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZST00gaW5zdGFuY2VzIFdIRVJFIHV1aWQgPSAnIiArICBzdHIoaW5zdGFuY2VfaWQpICsiJyIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jdXIucm93Y291bnQgPT0gMCA6IHJldHVybiAwLCAiaW5zdGFuY2UgJyIgKyBzdHIoaW5zdGFuY2VfaWQpICsiJ25vdCBmb3VuZC4iCisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICAgICAgICAgICAgICAjZ2V0IG5ldHdvcmtzCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJTRUxFQ1QgdXVpZCBhcyBpZmFjZV9pZCwgbmV0X2lkLCBtYWMgYXMgbWFjX2FkZHJlc3MsIGlwX2FkZHJlc3MsIG5hbWUsIE1icHMgYXMgYmFuZHdpZHRoLCB2cGNpLCBtb2RlbCBcCisgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIHBvcnRzIFdIRVJFIHR5cGUgPSAnaW5zdGFuY2U6YnJpZGdlJyBBTkQgaW5zdGFuY2VfaWQgPSAnIiArIGluc3RhbmNlX2lkICsgIiciCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY3VyLnJvd2NvdW50ID4gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVsnbmV0d29ya3MnXSA9IHNlbGYuY3VyLmZldGNoYWxsKCkKKworICAgICAgICAgICAgICAgICAgICAjZ2V0IGV4dGVuZGVkCisgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkID0ge30KKyAgICAgICAgICAgICAgICAgICAgI2dldCBkZXZpY2VzCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJTRUxFQ1QgdHlwZSwgdnBjaSwgaW1hZ2VfaWQsIHhtbCxkZXYgRlJPTSBpbnN0YW5jZV9kZXZpY2VzIFdIRVJFIGluc3RhbmNlX2lkID0gJyVzJyAiICUgIHN0cihpbnN0YW5jZV9pZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jdXIucm93Y291bnQgPiAwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkWydkZXZpY2VzJ10gPSBzZWxmLmN1ci5mZXRjaGFsbCgpCisgICAgICAgICAgICAgICAgICAgICNnZXQgbnVtYXMKKyAgICAgICAgICAgICAgICAgICAgbnVtYXMgPSBbXQorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiU0VMRUNUIGlkLCBudW1hX3NvY2tldCBhcyBzb3VyY2UgRlJPTSBudW1hcyBXSEVSRSBob3N0X2lkID0gJyIgKyBzdHIoaW5zdGFuY2VbJ2hvc3RfaWQnXSkgKyAiJyIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgaG9zdF9udW1hcyA9IHNlbGYuY3VyLmZldGNoYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICdob3N0X251bWFzJywgaG9zdF9udW1hcworICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBob3N0X251bWFzOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9pZCA9IHN0cihrWydpZCddKQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9kaWN0ID17fQorICAgICAgICAgICAgICAgICAgICAgICAgI2dldCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJTRUxFQ1QgY29uc3VtZWQgRlJPTSByZXNvdXJjZXNfbWVtIFdIRVJFIGluc3RhbmNlX2lkID0gJyVzJyBBTkQgbnVtYV9pZCA9ICclcyciICUgKCBpbnN0YW5jZV9pZCwgbnVtYV9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jdXIucm93Y291bnQgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbV9kaWN0ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWFfZGljdFsnbWVtb3J5J10gPSBtZW1fZGljdFsnY29uc3VtZWQnXQorICAgICAgICAgICAgICAgICAgICAgICAgI2dldCBmdWxsIGNvcmVzCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJTRUxFQ1QgY29yZV9pZCwgcGFpcmVkLCBNSU4odl90aHJlYWRfaWQpIGFzIHYxLCBNQVgodl90aHJlYWRfaWQpIGFzIHYyLCBDT1VOVChpbnN0YW5jZV9pZCkgYXMgbmIsIE1JTih0aHJlYWRfaWQpIGFzIHQxLCBNQVgodGhyZWFkX2lkKSBhcyB0MiBGUk9NIHJlc291cmNlc19jb3JlIFdIRVJFIGluc3RhbmNlX2lkID0gJyVzJyBBTkQgbnVtYV9pZCA9ICclcycgR1JPVVAgQlkgY29yZV9pZCxwYWlyZWQiICUgKCBzdHIoaW5zdGFuY2VfaWQpLCBudW1hX2lkKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2xpc3QgPSBbXTsgICAgIGNvcmVfc291cmNlID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJlZF9saXN0ID0gW107ICAgcGFpcmVkX3NvdXJjZSA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfbGlzdCA9IFtdOyAgIHRocmVhZF9zb3VyY2UgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY3Vyc29yMi5yb3djb3VudCA+IDA6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVzID0gY3Vyc29yMi5mZXRjaGFsbCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvcmUgaW4gY29yZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvcmVbNF0gPT0gMjogI251bWJlciBvZiB1c2VkIHRocmVhZHMgZnJvbSBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb3JlWzNdID09IGNvcmVbMl06ICAjb25seSBvbmUgdGhyZWFkIGFzaWduZWQgdG8gVk0sIHNvIGNvbXBsZXRlbHkgY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfbGlzdC5hcHBlbmQoY29yZVsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX3NvdXJjZS5hcHBlbmQoY29yZVs1XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgY29yZVsxXSA9PSAnWSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcmVkX2xpc3QuYXBwZW5kKGNvcmVbMjo0XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyZWRfc291cmNlLmFwcGVuZChjb3JlWzU6N10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9saXN0LmV4dGVuZChjb3JlWzI6NF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX3NvdXJjZS5leHRlbmQoY29yZVs1OjddKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfbGlzdC5hcHBlbmQoY29yZVsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9zb3VyY2UuYXBwZW5kKGNvcmVbNV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNvcmVfbGlzdCkgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1hX2RpY3RbJ2NvcmVzJ10gPSBsZW4oY29yZV9saXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1hX2RpY3RbJ2NvcmVzLWlkJ10gPSBjb3JlX2xpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9kaWN0Wydjb3Jlcy1zb3VyY2UnXSA9IGNvcmVfc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHBhaXJlZF9saXN0KSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWFfZGljdFsncGFpcmVkLXRocmVhZHMnXSA9IGxlbihwYWlyZWRfbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9kaWN0WydwYWlyZWQtdGhyZWFkcy1pZCddID0gcGFpcmVkX2xpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9kaWN0WydwYWlyZWQtdGhyZWFkcy1zb3VyY2UnXSA9IHBhaXJlZF9zb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4odGhyZWFkX2xpc3QpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9kaWN0Wyd0aHJlYWRzJ10gPSBsZW4odGhyZWFkX2xpc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWFfZGljdFsndGhyZWFkcy1pZCddID0gdGhyZWFkX2xpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9kaWN0Wyd0aHJlYWRzLXNvdXJjZSddID0gdGhyZWFkX3NvdXJjZQorCisgICAgICAgICAgICAgICAgICAgICAgICAjZ2V0IGRlZGljYXRlZCBwb3J0cyBhbmQgU1JJT1YKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJTRUxFQ1QgcG9ydF9pZCBhcyBpZmFjZV9pZCwgcC52bGFuIGFzIHZsYW4sIHAubWFjIGFzIG1hY19hZGRyZXNzLCBuZXRfaWQsIGlmKG1vZGVsPSdQRicsJ3llcycsaWYobW9kZWw9J1ZGJywnbm8nLCd5ZXM6c3Jpb3YnKSkgYXMgZGVkaWNhdGVkLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBycC5NYnBzIGFzIGJhbmR3aWR0aCwgbmFtZSwgdnBjaSwgcGNpIGFzIHNvdXJjZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSByZXNvdXJjZXNfcG9ydCBhcyBycCBqb2luIHBvcnRzIGFzIHAgb24gcG9ydF9pZD11dWlkICBXSEVSRSBwLmluc3RhbmNlX2lkID0gJyVzJyBBTkQgbnVtYV9pZCA9ICclcycgYW5kIHAudHlwZT0naW5zdGFuY2U6ZGF0YSciICUgKGluc3RhbmNlX2lkLCBudW1hX2lkKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jdXIucm93Y291bnQgPiAwOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1hX2RpY3RbJ2ludGVyZmFjZXMnXSA9IHNlbGYuY3VyLmZldGNoYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgJ2ludGVyZmFjZXMnLCBudW1hX2RpY3QKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG51bWFfZGljdCkgPiAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV9kaWN0Wydzb3VyY2UnXSA9IGtbJ3NvdXJjZSddICNudW1hIHNvY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWFzLmFwcGVuZChudW1hX2RpY3QpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG51bWFzKSA+IDAgOiAgZXh0ZW5kZWRbJ251bWFzJ10gPSBudW1hcworICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZXh0ZW5kZWQpID4gMCA6ICBpbnN0YW5jZVsnZXh0ZW5kZWQnXSA9IGV4dGVuZGVkCisgICAgICAgICAgICAgICAgICAgIGFmLkRlbGV0ZU5vbmUoaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxLCBpbnN0YW5jZQorICAgICAgICAgICAgZXhjZXB0IChtZGIuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIHIsYyA9IHNlbGYuZm9ybWF0X2Vycm9yKGUsICJnZXRfaW5zdGFuY2UiLCBjbWQpCisgICAgICAgICAgICAgICAgaWYgciE9LUhUVFBfUmVxdWVzdF9UaW1lb3V0IG9yIHJldHJ5Xz09MTogcmV0dXJuIHIsYworICAgICAgICAKKyAgICBkZWYgZ2V0X251bWFzKHNlbGYsIHJlcXVpcmVtZW50cywgcHJlZmVyZWRfaG9zdF9pZD1Ob25lLCBvbmx5X29mX3BvcnRzPVRydWUpOgorICAgICAgICAnJydPYnRhaW4gYSB2YWxpZCBOVU1BL0hPU1QgZm9yIGRlcGxveW1lbnQgYSBWTQorICAgICAgICByZXF1aXJlbWVudHM6IGNvbnRhaW4gcmVxdWlyZW1lbnQgcmVnYXJkaW5nOgorICAgICAgICAgICAgcmVxdWlyZW1lbnRzWydyYW0nXTogTm9uIGh1Z2UgcGFnZSBtZW1vcnkgaW4gTUI7IDAgdG8gc2tpcCAKKyAgICAgICAgICAgIHJlcXVpcmVtZW50c1sndmNwdXMnXTogTm9uIGlzb2xhdGVkIGNwdXM7IDAgdG8gc2tpcCAKKyAgICAgICAgICAgIHJlcXVpcmVtZW50c1snbnVtYSddOiBSZXF1aXJlbWV0cyB0byBiZSBmaXhlZCBpbiBPTkUgTnVtYSBub2RlCisgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRzWydudW1hJ11bJ21lbW9yeSddOiBIdWdlIHBhZ2UgbWVtb3J5IGluIEdCIGF0IDsgMCBmb3IgYW55IAorICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50c1snbnVtYSddWydwcm9jX3JlcV90eXBlJ106IFR5cGUgb2YgcHJvY2Vzc29yLCBjb3JlcyBvciB0aHJlYWRzIAorICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50c1snbnVtYSddWydwcm9jX3JlcV9uYiddOiBOdW1iZXIgb2YgaXNvbGF0ZWQgY3B1cyAgCisgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRzWydudW1hJ11bJ3BvcnRfbGlzdCddOiBQaHlzaWNhbCBOSUMgcG9ydHMgbGlzdCA7IFtdIGZvciBhbnkgCisgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRzWydudW1hJ11bJ3NyaW92X2xpc3QnXTogVmlydHVhbCBmdW5jdGlvbiBOSUMgcG9ydHMgbGlzdCA7IFtdIGZvciBhbnkKKyAgICAgICAgcHJlZmVyZWRfaG9zdF9pZDogaWYgbm90IE5vbmUgcmV0dXJuIHRoaXMgaG9zdCBpZiBpdCBtYXRjaCAKKyAgICAgICAgb25seV9vZl9wb3J0czogaWYgVHJ1ZSBvbmx5IHRob3NlIHBvcnRzIGNvbmVjdGVkIHRvIHRoZSBvcGVuZmxvdyAob2YpIGFyZSB2YWxpZCwKKyAgICAgICAgICAgIHRoYXQgaXMsIHdpdGggc3dpdGNoX3BvcnQgaW5mb3JtYXRpb24gZmlsbGVkOyBpZiBGYWxzZSwgYWxsIE5JQyBwb3J0cyBhcmUgdmFsaWQuIAorICAgICAgICBSZXR1cm4gYSB2YWxpZCBudW1hIGFuZCBob3N0CisgICAgICAgICcnJworICAgICAgICAgCisgICAgICAgIGZvciByZXRyeV8gaW4gcmFuZ2UoMCwyKToKKyAgICAgICAgICAgIGNtZD0iIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246ICAgICAgICAgICAgICAKKyMgICAgICAgICAgICAgICAgICAgICAjRmluZCBudW1hcyBvZiBwcmVmZXJlZCBob3N0CisjICAgICAgICAgICAgICAgICAgICAgcHJlZmVyZWRfbnVtYXMgPSAoKQorIyAgICAgICAgICAgICAgICAgICAgIGlmIHByZWZlcmVkX2hvc3RfaWQgIT0gTm9uZToKKyMgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorIyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJTRUxFQ1QgaWQgRlJPTSBudW1hcyBXSEVSRSBob3N0X2lkPSclcyciICsgcHJlZmVyZWRfaG9zdF9pZCkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVyZWRfbnVtYXMgPSBzZWxmLmN1ci5mZXRjaGFsbCgpCisjICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAjRmluZCB2YWxpZCBob3N0IGZvciB0aGUgcmFtIGFuZCB2Y3B1cworICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcihtZGIuY3Vyc29ycy5EaWN0Q3Vyc29yKQorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiQ0FMTCBHZXRIb3N0QnlNZW1DcHUoJXMsICVzKSIgJSAoc3RyKHJlcXVpcmVtZW50c1sncmFtJ10pLCBzdHIocmVxdWlyZW1lbnRzWyd2Y3B1cyddKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKSAgIAorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5jYWxscHJvYygnR2V0SG9zdEJ5TWVtQ3B1JywgKHN0cihyZXF1aXJlbWVudHNbJ3JhbSddKSwgc3RyKHJlcXVpcmVtZW50c1sndmNwdXMnXSkpICkKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRfaG9zdHMgPSBzZWxmLmN1ci5mZXRjaGFsbCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkgICAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICAgICAgICAgICAgICBtYXRjaF9mb3VuZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbih2YWxpZF9ob3N0cyk8PTA6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0ID0gJ05vIHJvb20gYXQgZGF0YSBjZW50ZXIuIENhbiBub3QgZmluZCBhIGhvc3Qgd2l0aCAlcyBNQiBtZW1vcnkgYW5kICVzIGNwdXMgYXZhaWxhYmxlJyAlIChzdHIocmVxdWlyZW1lbnRzWydyYW0nXSksIHN0cihyZXF1aXJlbWVudHNbJ3ZjcHVzJ10pKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICNzZWxmLmxvZ2dlci5kZWJ1ZyhlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCBlcnJvcl90ZXh0CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAjZWxpZiByZXFfbnVtYSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAjRmluZCB2YWxpZCBudW1hIG5vZGVzIGZvciBtZW1vcnkgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKG1kYi5jdXJzb3JzLkRpY3RDdXJzb3IpCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJDQUxMIEdldE51bWFCeU1lbW9yeSglcykiICUgc3RyKHJlcXVpcmVtZW50c1snbnVtYSddWydtZW1vcnknXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKSAgIAorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5jYWxscHJvYygnR2V0TnVtYUJ5TWVtb3J5JywgKHJlcXVpcmVtZW50c1snbnVtYSddWydtZW1vcnknXSwpICkKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRfZm9yX21lbW9yeSA9IHNlbGYuY3VyLmZldGNoYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuY2xvc2UoKSAgIAorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbih2YWxpZF9mb3JfbWVtb3J5KTw9MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RleHQgPSAnTm8gcm9vbSBhdCBkYXRhIGNlbnRlci4gQ2FuIG5vdCBmaW5kIGEgaG9zdCB3aXRoICVzIEdCIEh1Z2VwYWdlcyBtZW1vcnkgYXZhaWxhYmxlJyAlIHN0cihyZXF1aXJlbWVudHNbJ251bWEnXVsnbWVtb3J5J10pIAorICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGYubG9nZ2VyLmRlYnVnKGVycm9yX3RleHQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEsIGVycm9yX3RleHQKKworICAgICAgICAgICAgICAgICAgICAjRmluZCB2YWxpZCBudW1hIG5vZGVzIGZvciBwcm9jZXNzb3IgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKG1kYi5jdXJzb3JzLkRpY3RDdXJzb3IpCisgICAgICAgICAgICAgICAgICAgIGlmIHJlcXVpcmVtZW50c1snbnVtYSddWydwcm9jX3JlcV90eXBlJ10gPT0gJ3RocmVhZHMnOgorICAgICAgICAgICAgICAgICAgICAgICAgY3B1X3JlcXVpcmVtZW50X3RleHQ9J2NwdS10aHJlYWRzJworICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gIkNBTEwgR2V0TnVtYUJ5VGhyZWFkKCVzKSIgJSBzdHIocmVxdWlyZW1lbnRzWydudW1hJ11bJ3Byb2NfcmVxX25iJ10pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuY2FsbHByb2MoJ0dldE51bWFCeVRocmVhZCcsIChyZXF1aXJlbWVudHNbJ251bWEnXVsncHJvY19yZXFfbmInXSwpICkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9yZXF1aXJlbWVudF90ZXh0PSdjcHUtY29yZXMnCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAiQ0FMTCBHZXROdW1hQnlDb3JlKCVzKSIgJSBzdHIocmVxdWlyZW1lbnRzWydudW1hJ11bJ3Byb2NfcmVxX25iJ10pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuY2FsbHByb2MoJ0dldE51bWFCeUNvcmUnLCAocmVxdWlyZW1lbnRzWydudW1hJ11bJ3Byb2NfcmVxX25iJ10sKSApCisgICAgICAgICAgICAgICAgICAgIHZhbGlkX2Zvcl9wcm9jZXNzb3IgPSBzZWxmLmN1ci5mZXRjaGFsbCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkgICAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4odmFsaWRfZm9yX3Byb2Nlc3Nvcik8PTA6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0ID0gJ05vIHJvb20gYXQgZGF0YSBjZW50ZXIuIENhbiBub3QgZmluZCBhIGhvc3Qgd2l0aCAlcyAlcyBhdmFpbGFibGUnICUgKHN0cihyZXF1aXJlbWVudHNbJ251bWEnXVsncHJvY19yZXFfbmInXSksY3B1X3JlcXVpcmVtZW50X3RleHQpICAKKyAgICAgICAgICAgICAgICAgICAgICAgICNzZWxmLmxvZ2dlci5kZWJ1ZyhlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCBlcnJvcl90ZXh0CisKKyAgICAgICAgICAgICAgICAgICAgI0ZpbmQgdGhlIG51bWEgbm9kZXMgdGhhdCBjb21wbHkgZm9yIG1lbW9yeSBhbmQgcHJvY2Vzc29yIHJlcXVpcmVtZW50cworICAgICAgICAgICAgICAgICAgICAjc29ydGluZyBmcm9tIGxlc3MgdG8gbW9yZSBtZW1vcnkgY2FwYWNpdHkKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRfbnVtYXMgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3IgbV9udW1hIGluIHZhbGlkX2Zvcl9tZW1vcnk6CisgICAgICAgICAgICAgICAgICAgICAgICBudW1hX3ZhbGlkX2Zvcl9wcm9jZXNzb3IgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBfbnVtYSBpbiB2YWxpZF9mb3JfcHJvY2Vzc29yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1fbnVtYVsnbnVtYV9pZCddID09IHBfbnVtYVsnbnVtYV9pZCddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1hX3ZhbGlkX2Zvcl9wcm9jZXNzb3IgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBudW1hX3ZhbGlkX2Zvcl9ob3N0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcmVkX251bWEgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBfaG9zdCBpbiB2YWxpZF9ob3N0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtX251bWFbJ2hvc3RfaWQnXSA9PSBwX2hvc3RbJ3V1aWQnXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYV92YWxpZF9mb3JfaG9zdCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcF9ob3N0Wyd1dWlkJ10gPT0gcHJlZmVyZWRfaG9zdF9pZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcmVkX251bWEgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1hX3ZhbGlkX2Zvcl9ob3N0IGFuZCBudW1hX3ZhbGlkX2Zvcl9wcm9jZXNzb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJlZmVyZWRfbnVtYToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfbnVtYXMuaW5zZXJ0KDAsIG1fbnVtYVsnbnVtYV9pZCddKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX251bWFzLmFwcGVuZChtX251bWFbJ251bWFfaWQnXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHZhbGlkX251bWFzKTw9MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RleHQgPSAnTm8gcm9vbSBhdCBkYXRhIGNlbnRlci4gQ2FuIG5vdCBmaW5kIGEgaG9zdCB3aXRoICVzIE1CIGh1Z2VwYWdlcyBtZW1vcnkgYW5kICVzICVzIGF2YWlsYWJsZSBpbiB0aGUgc2FtZSBudW1hJyAlXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1aXJlbWVudHNbJ251bWEnXVsnbWVtb3J5J10sIHN0cihyZXF1aXJlbWVudHNbJ251bWEnXVsncHJvY19yZXFfbmInXSksY3B1X3JlcXVpcmVtZW50X3RleHQpICAKKyAgICAgICAgICAgICAgICAgICAgICAgICNzZWxmLmxvZ2dlci5kZWJ1ZyhlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCBlcnJvcl90ZXh0CisgICAgICAgICAgICAgICAgICAgIAorICAgICMgICAgICAgICAgICAgICAgIHByaW50ICdWYWxpZCBudW1hcyBsaXN0OiAnK3N0cih2YWxpZF9udW1hcykKKworICAgICAgICAgICAgICAgICAgICAjRmluZCB2YWxpZCBudW1hIG5vZGVzIGZvciBpbnRlcmZhY2VzIHJlcXVpcmVtZW50cworICAgICAgICAgICAgICAgICAgICAjRm9yIGVhY2ggdmFsaWQgbnVtYSB3ZSB3aWxsIG9idGFpbiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwb3J0cyBhbmQgY2hlY2sgaWYgdGhlc2UgYXJlIHZhbGlkICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBtYXRjaF9mb3VuZCA9IEZhbHNlICAgIAorICAgICAgICAgICAgICAgICAgICBmb3IgbnVtYV9pZCBpbiB2YWxpZF9udW1hczoKKyAgICAjICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ0NoZWNraW5nICcrc3RyKG51bWFfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9mb3VuZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcihtZGIuY3Vyc29ycy5EaWN0Q3Vyc29yKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb25seV9vZl9wb3J0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9IkNBTEwgR2V0QXZhaWxhYmxlUG9ydHMoJXMpIiAlIHN0cihudW1hX2lkKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuY2FsbHByb2MoJ0dldEF2YWlsYWJsZVBvcnRzJywgKG51bWFfaWQsKSApCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZD0iQ0FMTCBHZXRBbGxBdmFpbGFibGVQb3J0cyglcykiICUgc3RyKG51bWFfaWQpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5jYWxscHJvYygnR2V0QWxsQXZhaWxhYmxlUG9ydHMnLCAobnVtYV9pZCwpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9wb3J0cyA9IHNlbGYuY3VyLmZldGNoYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgI1NldC9yZXNldCByZXNlcnZhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwb3J0IGluIGF2YWlsYWJsZV9wb3J0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0WydNYnBzX3Jlc2VydmVkJ10gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFsnU1JJT1ZfcmVzZXJ2ZWQnXSA9IDAKKworICAgICAgICAgICAgICAgICAgICAgICAgI1RyeSB0byBhbGxvY2F0ZSBwaHlzaWNhbCBwb3J0cworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxfcG9ydHNfZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaWZhY2UgaW4gcmVxdWlyZW1lbnRzWydudW1hJ11bJ3BvcnRfbGlzdCddOgorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1x0XHRjaGVja2luZyBpZmFjZTogJytzdHIoaWZhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEZvdW5kID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcG9ydCBpbiBhdmFpbGFibGVfcG9ydHM6CisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1x0XHRcdGZvciBwb3J0OiAnK3N0cihwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjSWYgdGhlIHBvcnQgaXMgbm90IGVtcHR5IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcnRbJ01icHNfZnJlZSddICE9IHBvcnRbJ01icHMnXSBvciBwb3J0WydNYnBzX3Jlc2VydmVkJ10gIT0gMDoKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1x0XHRcdFx0IE5vdCBlbXB0eSBwb3J0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNJZiB0aGUgcG9ydCBzcGVlZCBpcyBub3QgZW5vdWdoIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcnRbJ01icHMnXSA8IGlmYWNlWydiYW5kd2lkdGgnXToKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1x0XHRcdFx0IE5vdCBlbm91Z2ggc3BlZWQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjT3RoZXJ3aXNlIHRoaXMgaXMgYSB2YWxpZCBwb3J0ICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFsnTWJwc19yZXNlcnZlZCddID0gcG9ydFsnTWJwcyddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRbJ1NSSU9WX3Jlc2VydmVkJ10gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlWydwb3J0X2lkJ10gPSBwb3J0Wydwb3J0X2lkJ10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VbJ3ZsYW4nXSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VbJ21hYyddID0gcG9ydFsnbWFjJ10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VbJ3N3aXRjaF9wb3J0J10gPSBwb3J0Wydzd2l0Y2hfcG9ydCddCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1x0XHRcdFx0IERlZGljYXRlZCBwb3J0IGZvdW5kICcrc3RyKHBvcnRbJ3BvcnRfaWQnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiBhbGwgcG9ydHMgaGF2ZSBiZWVuIGNoZWNrZWQgYW5kIG5vIG1hdGNoIGhhcyBiZWVuIGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RoaXMgaXMgbm90IGEgdmFsaWQgbnVtYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwb3J0Rm91bmQ6CisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1x0XHRcdFx0XHRBbGwgcG9ydHMgaGF2ZSBiZWVuIGNoZWNrZWQgYW5kIG5vIG1hdGNoIGhhcyBiZWVuIGZvdW5kIGZvciBudW1hICcrc3RyKG51bWFfaWQpKydcblxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbF9wb3J0c19mb3VuZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICAgICAgICAgICNpZiB0aGVyZSBpcyBubyBtYXRjaCBjb250aW51ZSBjaGVja2luZyB0aGUgZm9sbG93aW5nIG51bWEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwaHlzaWNhbF9wb3J0c19mb3VuZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgICAgICAjVHJ5IHRvIGFsbG9jYXRlIFNSLUlPVnMKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyaW92X3BvcnRzX2ZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGlmYWNlIGluIHJlcXVpcmVtZW50c1snbnVtYSddWydzcmlvdl9saXN0J106CisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnXHRcdGNoZWNraW5nIGlmYWNlOiAnK3N0cihpZmFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Rm91bmQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwb3J0IGluIGF2YWlsYWJsZV9wb3J0czoKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnXHRcdFx0Zm9yIHBvcnQ6ICcrc3RyKHBvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNJZiB0aGVyZSBhcmUgbm90IGF2YWlsYWJsZSBTUi1JT1ZzIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcnRbJ2F2YWlsYWJsZVNSSU9WJ10gLSBwb3J0WydTUklPVl9yZXNlcnZlZCddIDw9IDA6CisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICdcdFx0XHRcdCBOb3QgZW5vdWdoIFNSLUlPVicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjSWYgdGhlIHBvcnQgZnJlZSBzcGVlZCBpcyBub3QgZW5vdWdoIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcnRbJ01icHNfZnJlZSddIC0gcG9ydFsnTWJwc19yZXNlcnZlZCddIDwgaWZhY2VbJ2JhbmR3aWR0aCddOgorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnXHRcdFx0XHQgTm90IGVub3VnaCBzcGVlZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNPdGhlcndpc2UgdGhpcyBpcyBhIHZhbGlkIHBvcnQgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0WydNYnBzX3Jlc2VydmVkJ10gKz0gaWZhY2VbJ2JhbmR3aWR0aCddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRbJ1NSSU9WX3Jlc2VydmVkJ10gKz0gMQorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICdcdFx0XHRcdCBTUi1JT1YgZm91bmQgJytzdHIocG9ydFsncG9ydF9pZCddKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZVsncG9ydF9pZCddID0gcG9ydFsncG9ydF9pZCddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlWyd2bGFuJ10gPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlWydtYWMnXSA9IHBvcnRbJ21hYyddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlWydzd2l0Y2hfcG9ydCddID0gcG9ydFsnc3dpdGNoX3BvcnQnXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Rm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIGFsbCBwb3J0cyBoYXZlIGJlZW4gY2hlY2tlZCBhbmQgbm8gbWF0Y2ggaGFzIGJlZW4gZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGhpcyBpcyBub3QgYSB2YWxpZCBudW1hCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHBvcnRGb3VuZDoKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnXHRcdFx0XHRcdEFsbCBwb3J0cyBoYXZlIGJlZW4gY2hlY2tlZCBhbmQgbm8gbWF0Y2ggaGFzIGJlZW4gZm91bmQgZm9yIG51bWEgJytzdHIobnVtYV9pZCkrJ1xuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyaW92X3BvcnRzX2ZvdW5kID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgICAgICAgICAgI2lmIHRoZXJlIGlzIG5vIG1hdGNoIGNvbnRpbnVlIGNoZWNraW5nIHRoZSBmb2xsb3dpbmcgbnVtYQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNyaW92X3BvcnRzX2ZvdW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3Jpb3ZfcG9ydHNfZm91bmQgYW5kIHBoeXNpY2FsX3BvcnRzX2ZvdW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2ZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoX2ZvdW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGV4dCA9ICdObyByb29tIGF0IGRhdGEgY2VudGVyLiBDYW4gbm90IGZpbmQgYSBob3N0IHdpdGggdGhlIHJlcXVpcmVkIGh1Z2VwYWdlcywgdmNwdXMgYW5kIGludGVyZmFjZXMnICAKKyAgICAgICAgICAgICAgICAgICAgICAgICNzZWxmLmxvZ2dlci5kZWJ1ZyhlcnJvcl90ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xLCBlcnJvcl90ZXh0CisKKyAgICAgICAgICAgICAgICAgICAgI3NlbGYubG9nZ2VyLmRlYnVnKCdGdWxsIG1hdGNoIGZvdW5kIGluIG51bWEgJXMnLCBzdHIobnVtYV9pZCkpCisKKyAgICAgICAgICAgICAgICBmb3IgbnVtYSBpbiB2YWxpZF9mb3JfcHJvY2Vzc29yOgorICAgICAgICAgICAgICAgICAgICBpZiBudW1hX2lkPT1udW1hWydudW1hX2lkJ106CisgICAgICAgICAgICAgICAgICAgICAgICBob3N0X2lkPW51bWFbJ2hvc3RfaWQnXQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICByZXR1cm4gMCwgeydudW1hX2lkJzpudW1hX2lkLCAnaG9zdF9pZCc6IGhvc3RfaWQsIH0KKyAgICAgICAgICAgIGV4Y2VwdCAobWRiLkVycm9yLCBBdHRyaWJ1dGVFcnJvcikgYXMgZToKKyAgICAgICAgICAgICAgICByLGMgPSBzZWxmLmZvcm1hdF9lcnJvcihlLCAiZ2V0X251bWFzIiwgY21kKQorICAgICAgICAgICAgICAgIGlmIHIhPS1IVFRQX1JlcXVlc3RfVGltZW91dCBvciByZXRyeV89PTE6IHJldHVybiByLGMKKworICAgIGRlZiBuZXdfaW5zdGFuY2Uoc2VsZiwgaW5zdGFuY2VfZGljdCwgbmV0cywgcG9ydHNfdG9fZnJlZSk6CisgICAgICAgIGZvciByZXRyeV8gaW4gcmFuZ2UoMCwyKToKKyAgICAgICAgICAgIGNtZD0iIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKworICAgICAgICAgICAgICAgICAgICAjY3JlYXRlIHV1aWQgaWYgbm90IHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgIGlmICd1dWlkJyBub3QgaW4gaW5zdGFuY2VfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQgPSBpbnN0YW5jZV9kaWN0Wyd1dWlkJ10gPSBzdHIobXlVdWlkLnV1aWQxKCkpICMgY3JlYXRlX3V1aWQKKyAgICAgICAgICAgICAgICAgICAgZWxzZTogI2NoZWNrIHV1aWQgaXMgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQgPSBzdHIoaW5zdGFuY2VfZGljdFsndXVpZCddKQorCisKKyAgICAgICAgICAgICAgICAgICAgI2luc2VydGluZyBuZXcgdXVpZAorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiSU5TRVJUIElOVE8gdXVpZHMgKHV1aWQsIHJvb3RfdXVpZCwgdXNlZF9hdCkgVkFMVUVTICgnJXMnLCclcycsICdpbnN0YW5jZXMnKSIgJSAodXVpZCwgdXVpZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKworICAgICAgICAgICAgICAgICAgICAjaW5zZXJ0IGluIHRhYmxlIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkID0gaW5zdGFuY2VfZGljdC5wb3AoJ2V4dGVuZGVkJywgTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIGJyaWRnZWRpZmFjZXMgPSBpbnN0YW5jZV9kaWN0LnBvcCgnYnJpZGdlZC1pZmFjZXMnLCAoKSApOworCisgICAgICAgICAgICAgICAgICAgIGtleXMgICAgPSAiLCIuam9pbihpbnN0YW5jZV9kaWN0LmtleXMoKSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzICA9ICIsIi5qb2luKCBtYXAobGFtYmRhIHg6ICJOdWxsIiBpZiB4IGlzIE5vbmUgZWxzZSAiJyIrc3RyKHgpKyInIiwgaW5zdGFuY2VfZGljdC52YWx1ZXMoKSApICkKKyAgICAgICAgICAgICAgICAgICAgY21kID0gIklOU0VSVCBJTlRPIGluc3RhbmNlcyAoIiArIGtleXMgKyAiKSBWQUxVRVMgKCIgKyB2YWx1ZXMgKyAiKSIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgI2lmIHJlc3VsdCAhPSAxOiByZXR1cm4gLTEsICJEYXRhYmFzZSBFcnJvciB3aGlsZSBpbnNlcnRpbmcgYXQgaW5zdGFuY2VzIHRhYmxlIgorCisgICAgICAgICAgICAgICAgICAgICNpbnNlcnQgcmVzb3VyY2VzCisgICAgICAgICAgICAgICAgICAgIG5iX2JyaWRnZV9pZmFjZXMgPSBuYl9jb3JlcyA9IG5iX2lmYWNlcyA9IG5iX251bWFzID0gMAorICAgICAgICAgICAgICAgICAgICAjaW5zZXJ0IGJyaWRnZWRfaWZhY2VzCisgICAgICAgICAgICAgICAgICAgIGZvciBpZmFjZSBpbiBicmlkZ2VkaWZhY2VzOgorICAgICAgICAgICAgICAgICAgICAgICAgI2dlbmVyYXRlIGFuZCBpbnNlcnQgYSBpZmFjZSB1dWlkCisgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZVsndXVpZCddID0gc3RyKG15VXVpZC51dWlkMSgpKSAjIGNyZWF0ZV91dWlkCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAiSU5TRVJUIElOVE8gdXVpZHMgKHV1aWQsIHJvb3RfdXVpZCwgdXNlZF9hdCkgVkFMVUVTICgnJXMnLCclcycsICdwb3J0cycpIiAlIChpZmFjZVsndXVpZCddLCB1dWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAjaW5zZXJ0IGlmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZVsnaW5zdGFuY2VfaWQnXSA9IHV1aWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlWyd0eXBlJ10gPSAnaW5zdGFuY2U6YnJpZGdlJworICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ25hbWUnIG5vdCBpbiBpZmFjZTogaWZhY2VbJ25hbWUnXT0iYnIiK3N0cihuYl9icmlkZ2VfaWZhY2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VbJ01icHMnXT1pZmFjZS5wb3AoJ2JhbmR3aWR0aCcsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAnbWFjX2FkZHJlc3MnIG5vdCBpbiBpZmFjZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZVsnbWFjJ10gPSBhZi5nZW5fcmFuZG9tX21hYygpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlWydtYWMnXSA9IGlmYWNlWydtYWNfYWRkcmVzcyddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGlmYWNlWydtYWNfYWRkcmVzcyddCisgICAgICAgICAgICAgICAgICAgICAgICAjaWZhY2VbJ21hYyddPWlmYWNlLnBvcCgnbWFjX2FkZHJlc3MnLCBOb25lKSAgI2ZvciBsZWF2aW5nIG1hYyBnZW5lcmF0aW9uIHRvIGxpYnZpcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgICAgPSAiLCIuam9pbihpZmFjZS5rZXlzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgID0gIiwiLmpvaW4oIG1hcChsYW1iZGEgeDogIk51bGwiIGlmIHggaXMgTm9uZSBlbHNlICInIitzdHIoeCkrIiciLCBpZmFjZS52YWx1ZXMoKSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJJTlNFUlQgSU5UTyBwb3J0cyAoIiArIGtleXMgKyAiKSBWQUxVRVMgKCIgKyB2YWx1ZXMgKyAiKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgbmJfYnJpZGdlX2lmYWNlcyArPSAxCisKKyAgICAgICAgICAgICAgICAgICAgaWYgZXh0ZW5kZWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAnbnVtYXMnIG5vdCBpbiBleHRlbmRlZCBvciBleHRlbmRlZFsnbnVtYXMnXSBpcyBOb25lOiBleHRlbmRlZFsnbnVtYXMnXSA9ICgpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbnVtYSBpbiBleHRlbmRlZFsnbnVtYXMnXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9udW1hcyArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvcmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ2NvcmVzJyBub3QgaW4gbnVtYSBvciBudW1hWydjb3JlcyddIGlzIE5vbmU6IG51bWFbJ2NvcmVzJ10gPSAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjb3JlIGluIG51bWFbJ2NvcmVzJ106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2NvcmVzICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gIlVQREFURSByZXNvdXJjZXNfY29yZSBTRVQgaW5zdGFuY2VfaWQ9JyVzJyVzJXMgV0hFUkUgaWQ9JyVzJyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodXVpZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIsdl90aHJlYWRfaWQ9JyIgKyBzdHIoY29yZVsndnRocmVhZCddKSArICInIikgaWYgJ3Z0aHJlYWQnIGluIGNvcmUgZWxzZSAnJywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIscGFpcmVkPSciICAgICAgKyBjb3JlWydwYWlyZWQnXSAgKyAiJyIpIGlmICdwYWlyZWQnIGluIGNvcmUgZWxzZSAnJywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZVsnaWQnXSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVyZmFjZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAnaW50ZXJmYWNlcycgbm90IGluIG51bWEgb3IgbnVtYVsnaW50ZXJmYWNlcyddIGlzIE5vbmU6IG51bWFbJ2ludGVyZmFjZXMnXSA9ICgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGlmYWNlIGluIG51bWFbJ2ludGVyZmFjZXMnXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2dlbmVyYXRlIGFuZCBpbnNlcnQgYW4gdXVpZDsgaWZhY2VbaWRdPWlmYWNlX3V1aWQ7IGlmYWNlW3V1aWRdPSBuZXRfaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VbJ2lkJ10gPSBzdHIobXlVdWlkLnV1aWQxKCkpICMgY3JlYXRlX3V1aWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gIklOU0VSVCBJTlRPIHV1aWRzICh1dWlkLCByb290X3V1aWQsIHVzZWRfYXQpIFZBTFVFUyAoJyVzJywnJXMnLCAncG9ydHMnKSIgJSAoaWZhY2VbJ2lkJ10sIHV1aWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2lmYWNlcyArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1icHNfPSgiJyIrc3RyKGlmYWNlWydNYnBzX3VzZWQnXSkrIiciKSBpZiAnTWJwc191c2VkJyBpbiBpZmFjZSBhbmQgaWZhY2VbJ01icHNfdXNlZCddIGlzIG5vdCBOb25lIGVsc2UgIk1icHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlmYWNlWyJkZWRpY2F0ZWQiXT09InllcyI6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VfbW9kZWw9IlBGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGlmYWNlWyJkZWRpY2F0ZWQiXT09InllczpzcmlvdiI6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VfbW9kZWw9IlZGbm90U2hhcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGlmYWNlWyJkZWRpY2F0ZWQiXT09Im5vIjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZV9tb2RlbD0iVkYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbHNlIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOU0VSVD0oaWZhY2VbJ21hY19hZGRyZXNzJ10sIGlmYWNlWydzd2l0Y2hfcG9ydCddLCBpZmFjZS5nZXQoJ3ZsYW4nLE5vbmUpLCAnaW5zdGFuY2U6ZGF0YScsIGlmYWNlWydNYnBzX3VzZWQnXSwgaWZhY2VbJ2lkJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCwgaW5zdGFuY2VfZGljdFsndGVuYW50X2lkJ10sIGlmYWNlLmdldCgnbmFtZScsTm9uZSksIGlmYWNlLmdldCgndnBjaScsTm9uZSksIGlmYWNlLmdldCgndXVpZCcsTm9uZSksIGlmYWNlX21vZGVsICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gIklOU0VSVCBJTlRPIHBvcnRzIChtYWMsc3dpdGNoX3BvcnQsdmxhbix0eXBlLE1icHMsdXVpZCxpbnN0YW5jZV9pZCx0ZW5hbnRfaWQsbmFtZSx2cGNpLG5ldF9pZCwgbW9kZWwpICIgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFZBTFVFUyAoIiArICIsIi5qb2luKG1hcChsYW1iZGEgeDogJ051bGwnIGlmIHggaXMgTm9uZSBlbHNlICInIitzdHIoeCkrIiciLCBJTlNFUlQgKSkgKyAiKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ3V1aWQnIGluIGlmYWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0cy5hcHBlbmQoaWZhY2VbJ3V1aWQnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGlzY292ZXIgaWYgdGhpcyBwb3J0IGlzIG5vdCB1c2VkIGJ5IGFueW9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAiU0VMRUNUIHNvdXJjZV9uYW1lLCBtYWMgRlJPTSAoIFNFTEVDVCByb290X2lkLCBjb3VudChpbnN0YW5jZV9pZCkgYXMgdXNlZCBGUk9NIHJlc291cmNlc19wb3J0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgV0hFUkUgcm9vdF9pZD0oU0VMRUNUIHJvb3RfaWQgZnJvbSByZXNvdXJjZXNfcG9ydCBXSEVSRSBpZD0nJXMnKSJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgR1JPVVAgQlkgcm9vdF9pZCApIEFTIEEgSk9JTiByZXNvdXJjZXNfcG9ydCBhcyBCIE9OIEEucm9vdF9pZD1CLmlkIEFORCBBLnVzZWQ9MCIgJSBpZmFjZVsncG9ydF9pZCddIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0c190b19mcmVlICs9IHNlbGYuY3VyLmZldGNoYWxsKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAiVVBEQVRFIHJlc291cmNlc19wb3J0IFNFVCBpbnN0YW5jZV9pZD0nJXMnLCBwb3J0X2lkPSclcycsTWJwc191c2VkPSVzIFdIRVJFIGlkPSclcyciIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHV1aWQsIGlmYWNlWydpZCddLCBtYnBzXywgaWZhY2VbJ3BvcnRfaWQnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIE1icHNfdXNlZCBub3Qgc3VwbHksIHNldCB0aGUgc2FtZSB2YWx1ZSBvZiAnTXBicycsIHRoYXQgaXMgdGhlIHRvdGFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI21lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICdtZW1vcnknIGluIG51bWEgYW5kIG51bWFbJ21lbW9yeSddIGlzIG5vdCBOb25lIGFuZCBudW1hWydtZW1vcnknXT4wOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAiSU5TRVJUIElOVE8gcmVzb3VyY2VzX21lbSAobnVtYV9pZCwgaW5zdGFuY2VfaWQsIGNvbnN1bWVkKSBWQUxVRVMgKCclcycsJyVzJywnJXMnKSIgJSAobnVtYVsnbnVtYV9pZCddLCB1dWlkLCBudW1hWydtZW1vcnknXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICdkZXZpY2VzJyBub3QgaW4gZXh0ZW5kZWQgb3IgZXh0ZW5kZWRbJ2RldmljZXMnXSBpcyBOb25lOiBleHRlbmRlZFsnZGV2aWNlcyddID0gKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkZXZpY2UgaW4gZXh0ZW5kZWRbJ2RldmljZXMnXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAndnBjaScgaW4gZGV2aWNlOiAgICB2cGNpID0gIiciICsgZGV2aWNlWyd2cGNpJ10gKyAiJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICB2cGNpID0gJ051bGwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ2ltYWdlX2lkJyBpbiBkZXZpY2U6IGltYWdlX2lkID0gIiciICsgZGV2aWNlWydpbWFnZV9pZCddICsgIiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgIGltYWdlX2lkID0gJ051bGwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ3htbCcgaW4gZGV2aWNlOiB4bWwgPSAiJyIgKyBkZXZpY2VbJ3htbCddICsgIiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgIHhtbCA9ICdOdWxsJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICdkZXYnIGluIGRldmljZTogZGV2ID0gIiciICsgZGV2aWNlWydkZXYnXSArICInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICBkZXYgPSAnTnVsbCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAiSU5TRVJUIElOVE8gaW5zdGFuY2VfZGV2aWNlcyAodHlwZSwgaW5zdGFuY2VfaWQsIGltYWdlX2lkLCB2cGNpLCB4bWwsIGRldikgVkFMVUVTICgnJXMnLCclcycsICVzLCAlcywgJXMsICVzKSIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2VbJ3R5cGUnXSwgdXVpZCwgaW1hZ2VfaWQsIHZwY2ksIHhtbCwgZGV2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgIyNpbnNlcnRpbmcgbmV3IGxvZworICAgICAgICAgICAgICAgICAgICAjY21kID0gIklOU0VSVCBJTlRPIGxvZ3MgKHJlbGF0ZWQsbGV2ZWwsdXVpZCxkZXNjcmlwdGlvbikgVkFMVUVTICgnaW5zdGFuY2VzJywnZGVidWcnLCclcycsJ25ldyBpbnN0YW5jZTogJWQgbnVtYXMsICVkIHRoZWFkcywgJWQgaWZhY2VzICVkIGJyaWRnZV9pZmFjZXMnKSIgJSAodXVpZCwgbmJfbnVtYXMsIG5iX2NvcmVzLCBuYl9pZmFjZXMsIG5iX2JyaWRnZV9pZmFjZXMpCisgICAgICAgICAgICAgICAgICAgICNzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICNzZWxmLmN1ci5leGVjdXRlKGNtZCkgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgICNpbnNldGVkIG9rCisgICAgICAgICAgICAgICAgcmV0dXJuIDEsIHV1aWQgCisgICAgICAgICAgICBleGNlcHQgKG1kYi5FcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAgICAgcixjID0gc2VsZi5mb3JtYXRfZXJyb3IoZSwgIm5ld19pbnN0YW5jZSIsIGNtZCkKKyAgICAgICAgICAgICAgICBpZiByIT0tSFRUUF9SZXF1ZXN0X1RpbWVvdXQgb3IgcmV0cnlfPT0xOiByZXR1cm4gcixjCisKKyAgICBkZWYgZGVsZXRlX2luc3RhbmNlKHNlbGYsIGluc3RhbmNlX2lkLCB0ZW5hbnRfaWQsIG5ldF9saXN0LCBwb3J0c190b19mcmVlLCBsb2djYXVzZT0icmVxdWVzdGVkIGJ5IGh0dHAiKToKKyAgICAgICAgZm9yIHJldHJ5XyBpbiByYW5nZSgwLDIpOgorICAgICAgICAgICAgY21kPSIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmNvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICAgICAgICAgICAgICAjZ2V0IElOU1RBTkNFCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJTRUxFQ1QgdXVpZCBGUk9NIGluc3RhbmNlcyBXSEVSRSB1dWlkPSclcycgQU5EIHRlbmFudF9pZD0nJXMnIiAlIChpbnN0YW5jZV9pZCwgdGVuYW50X2lkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmN1ci5yb3djb3VudCA9PSAwIDogcmV0dXJuIDAsICJpbnN0YW5jZSAlcyBub3QgZm91bmQgaW4gdGVuYW50ICVzIiAlIChpbnN0YW5jZV9pZCwgdGVuYW50X2lkKQorCisgICAgICAgICAgICAgICAgICAgICNkZWxldGUgYnJpZGdlZCBpZmFjZXMsIGluc3RhY2VfZGV2aWNlcywgcmVzb3VyY2VzX21lbTsgZG9uZSBieSBkYXRhYmFzZTogaXQgaXMgYXV0b21hdGljIGJ5IERhdGFiYXNlOyBGT1JFSUdOIEtFWSBERUxFVEUgQ0FTQ0FERQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgI2dldCBuZXRzIGFmZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgY21kID0gIlNFTEVDVCBESVNUSU5DVCBuZXRfaWQgZnJvbSBwb3J0cyBXSEVSRSBpbnN0YW5jZV9pZCA9ICclcycgQU5EIG5ldF9pZCBpcyBub3QgTnVsbCBBTkQgdHlwZT0naW5zdGFuY2U6ZGF0YSciICUgaW5zdGFuY2VfaWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgbmV0X2xpc3RfXyA9IHNlbGYuY3VyLmZldGNoYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIG5ldCBpbiBuZXRfbGlzdF9fOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV0X2xpc3QuYXBwZW5kKG5ldFswXSkKKworICAgICAgICAgICAgICAgICAgICAjZ2V0IGRhdGFwbGFuZSBpbnRlcmZhY2VzIHJlbGVhc2VzIGJ5IHRoaXMgVk07IGJvdGggUEYgYW5kIFZGIHdpdGggbm8gb3RoZXIgVkYgCisgICAgICAgICAgICAgICAgICAgIGNtZD0iU0VMRUNUIHNvdXJjZV9uYW1lLCBtYWMgRlJPTSAoU0VMRUNUIHJvb3RfaWQsIGNvdW50KGluc3RhbmNlX2lkKSBhcyB1c2VkIEZST00gcmVzb3VyY2VzX3BvcnQgV0hFUkUgaW5zdGFuY2VfaWQ9JyVzJyBHUk9VUCBCWSByb290X2lkICkgQVMgQSIgJSBpbnN0YW5jZV9pZCBcCisgICAgICAgICAgICAgICAgICAgICAgICArICAiIEpPSU4gKFNFTEVDVCByb290X2lkLCBjb3VudChpbnN0YW5jZV9pZCkgYXMgdXNlZCBGUk9NIHJlc291cmNlc19wb3J0IEdST1VQIEJZIHJvb3RfaWQpIEFTIEIgT04gQS5yb290X2lkPUIucm9vdF9pZCBBTkQgQS51c2VkPUIudXNlZCJcCisgICAgICAgICAgICAgICAgICAgICAgICArICAiIEpPSU4gcmVzb3VyY2VzX3BvcnQgYXMgQyBPTiBBLnJvb3RfaWQ9Qy5pZCIgCisjICAgICAgICAgICAgICAgICAgICBjbWQgPSAiU0VMRUNUIERJU1RJTkNUIHJvb3RfaWQgRlJPTSByZXNvdXJjZXNfcG9ydCBXSEVSRSBpbnN0YW5jZV9pZCA9ICclcyciICUgaW5zdGFuY2VfaWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgcG9ydHNfdG9fZnJlZSArPSBzZWxmLmN1ci5mZXRjaGFsbCgpCisKKyAgICAgICAgICAgICAgICAgICAgI3VwZGF0ZSByZXNvdXJjZXMgcG9ydAorICAgICAgICAgICAgICAgICAgICBjbWQgPSAiVVBEQVRFIHJlc291cmNlc19wb3J0IFNFVCBpbnN0YW5jZV9pZD1OdWxsLCBwb3J0X2lkPU51bGwsIE1icHNfdXNlZD0nMCcgV0hFUkUgaW5zdGFuY2VfaWQgPSAnJXMnIiAlIGluc3RhbmNlX2lkCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgIAorIyAgICAgICAgICAgICAgICAgICAgICNmaWx0ZXIgZGF0YXBsYW5lIHBvcnRzIHVzZWQgYnkgdGhpcyBWTSB0aGF0IG5vdyBhcmUgZnJlZQorIyAgICAgICAgICAgICAgICAgICAgIGZvciBwb3J0IGluIHBvcnRzX2xpc3RfXzoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gIlNFTEVDVCBtYWMsIGNvdW50KGluc3RhbmNlX2lkKSBGUk9NIHJlc291cmNlc19wb3J0IFdIRVJFIHJvb3RfaWQgPSAnJXMnIiAlIHBvcnRbMF0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorIyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX2xpc3RfXyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFjX2xpc3RfXyBhbmQgbWFjX2xpc3RfX1sxXT09MDoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRzX3RvX2ZyZWUuYXBwZW5kKG1hY19saXN0X19bMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICAjdXBkYXRlIHJlc291cmNlcyBjb3JlCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJVUERBVEUgcmVzb3VyY2VzX2NvcmUgU0VUIGluc3RhbmNlX2lkPU51bGwsIHZfdGhyZWFkX2lkPU51bGwsIHBhaXJlZD0nTicgV0hFUkUgaW5zdGFuY2VfaWQgPSAnJXMnIiAlIGluc3RhbmNlX2lkCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisKKyAgICAgICAgICAgICAgICAgICAgI2RlbGV0ZSBhbGwgcmVsYXRlZCB1dWlkcworICAgICAgICAgICAgICAgICAgICBjbWQgPSAiREVMRVRFIEZST00gdXVpZHMgV0hFUkUgcm9vdF91dWlkPSclcyciICUgaW5zdGFuY2VfaWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKGNtZCkKKworICAgICAgICAgICAgICAgICAgICAjI2luc2VydCBsb2cKKyAgICAgICAgICAgICAgICAgICAgI2NtZCA9ICJJTlNFUlQgSU5UTyBsb2dzIChyZWxhdGVkLGxldmVsLHV1aWQsZGVzY3JpcHRpb24pIFZBTFVFUyAoJ2luc3RhbmNlcycsJ2RlYnVnJywnJXMnLCdkZWxldGUgaW5zdGFuY2UgJXMnKSIgJSAoaW5zdGFuY2VfaWQsIGxvZ2NhdXNlKQorICAgICAgICAgICAgICAgICAgICAjc2VsZi5sb2dnZXIuZGVidWcoY21kKQorICAgICAgICAgICAgICAgICAgICAjc2VsZi5jdXIuZXhlY3V0ZShjbWQpICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICAjZGVsZXRlIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJERUxFVEUgRlJPTSBpbnN0YW5jZXMgV0hFUkUgdXVpZD0nJXMnIEFORCB0ZW5hbnRfaWQ9JyVzJyIgJSAoaW5zdGFuY2VfaWQsIHRlbmFudF9pZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxLCAiaW5zdGFuY2UgJXMgZnJvbSB0ZW5hbnQgJXMgREVMRVRFRCIgJSAoaW5zdGFuY2VfaWQsIHRlbmFudF9pZCkKKworICAgICAgICAgICAgZXhjZXB0IChtZGIuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIHIsYyA9IHNlbGYuZm9ybWF0X2Vycm9yKGUsICJkZWxldGVfaW5zdGFuY2UiLCBjbWQpCisgICAgICAgICAgICAgICAgaWYgciE9LUhUVFBfUmVxdWVzdF9UaW1lb3V0IG9yIHJldHJ5Xz09MTogcmV0dXJuIHIsYworCisgICAgZGVmIGdldF9wb3J0cyhzZWxmLCBXSEVSRSk6CisgICAgICAgICcnJyBPYnRhaW4gcG9ydHMgdXNpbmcgdGhlIFdIRVJFIGZpbHRlcmluZy4KKyAgICAgICAgQXR0cmlidXRlczoKKyAgICAgICAgICAgICd3aGVyZV8nOiBkaWN0IG9mIGtleTp2YWx1ZXMsIHRyYW5zbGF0ZWQgdG8ga2V5PXZhbHVlIEFORCAuLi4gKE9wdGlvbmFsKQorICAgICAgICBSZXR1cm46IGEgbGlzdCB3aXRoIGRpY3Rpb25hcnlzIGF0IGVhY2ggcm93CisgICAgICAgICcnJworICAgICAgICBmb3IgcmV0cnlfIGluIHJhbmdlKDAsMik6CisgICAgICAgICAgICBjbWQ9IiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuY29uOgorCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKG1kYi5jdXJzb3JzLkRpY3RDdXJzb3IpCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdF8gPSAiU0VMRUNUIHV1aWQsJ0FDVElWRScgYXMgc3RhdHVzLGFkbWluX3N0YXRlX3VwLG5hbWUsbmV0X2lkLFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbmFudF9pZCx0eXBlLG1hYyx2bGFuLHN3aXRjaF9wb3J0LGluc3RhbmNlX2lkLE1icHMgRlJPTSBwb3J0cyAiCisKKyAgICAgICAgICAgICAgICAgICAgaWYgV0hFUkUgaXMgTm9uZSBvciBsZW4oV0hFUkUpID09IDA6ICB3aGVyZV8gPSAiIgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVfID0gIldIRVJFICIgKyAiIEFORCAiLmpvaW4obWFwKCBsYW1iZGEgeDogc3RyKHgpICsgKCIgaXMgTnVsbCIgaWYgV0hFUkVbeF0gaXMgTm9uZSBlbHNlICI9JyIrc3RyKFdIRVJFW3hdKSsiJyIpLCAgV0hFUkUua2V5cygpKSApIAorICAgICAgICAgICAgICAgICAgICBsaW1pdF8gPSAiTElNSVQgMTAwIgorICAgICAgICAgICAgICAgICAgICBjbWQgPSAgIiAiLmpvaW4oIChzZWxlY3RfLCB3aGVyZV8sIGxpbWl0XykgKQorICAgICMgICAgICAgICAgICAgICAgcHJpbnQgIlNFTEVDVCBtdWx0aXBsZSBkZSBpbnN0YW5jZV9pZmFjZXMsIGlmYWNlX3V1aWQsIGV4dGVybmFsX3BvcnRzIiAjcHJpbnQgY21kCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgICAgIHBvcnRzID0gc2VsZi5jdXIuZmV0Y2hhbGwoKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmN1ci5yb3djb3VudD4wOiAgYWYuRGVsZXRlTm9uZShwb3J0cykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3VyLnJvd2NvdW50LCBwb3J0cworICAgICMgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3RhYmxlKEZST009ZnJvbV8sIFNFTEVDVD1zZWxlY3RfLFdIRVJFPXdoZXJlXyxMSU1JVD0xMDApCisgICAgICAgICAgICBleGNlcHQgKG1kYi5FcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICAgICAgICAgICAgcixjID0gc2VsZi5mb3JtYXRfZXJyb3IoZSwgImdldF9wb3J0cyIsIGNtZCkKKyAgICAgICAgICAgICAgICBpZiByIT0tSFRUUF9SZXF1ZXN0X1RpbWVvdXQgb3IgcmV0cnlfPT0xOiByZXR1cm4gcixjCisgICAgICAgIAorICAgIGRlZiBjaGVja190YXJnZXRfbmV0KHNlbGYsIG5ldF9pZCwgdGVuYW50X2lkLCBwb3J0X3R5cGUpOgorICAgICAgICAnJydjaGVjayBpZiB2YWxpZCBhdHRhY2hlbWVudCBvZiBhIHBvcnQgaW50byBhIHRhcmdldCBuZXQKKyAgICAgICAgQXR0cmlidXRlczoKKyAgICAgICAgICAgIG5ldF9pZDogdGFyZ2V0IG5ldCB1dWlkCisgICAgICAgICAgICB0ZW5hbnRfaWQ6IGNsaWVudCB3aGVyZSB0ZW5hbnQgYmVsb25ncy4gTm90IHVzZWQgaW4gdGhpcyB2ZXJzaW9uCisgICAgICAgICAgICBwb3J0X3R5cGU6IHN0cmluZyB3aXRoIHRoZSBvcHRpb24gJ2luc3RhbmNlOmJyaWRnZScsICdpbnN0YW5jZTpkYXRhJywgJ2V4dGVybmFsJworICAgICAgICBSZXR1cm46IAorICAgICAgICAgICAgKDAsbmV0X2RpY3QpIGlmIG9rLCAgIHdoZXJlIG5ldF9kaWN0IGNvbnRhaW4gJ3V1aWQnLCd0eXBlJywndmxhbicsIC4uLgorICAgICAgICAgICAgKG5lZ2F0aXZlLHN0cmluZy1lcnJvcikgaWYgZXJyb3IKKyAgICAgICAgJycnCisgICAgICAgIGZvciByZXRyeV8gaW4gcmFuZ2UoMCwyKToKKyAgICAgICAgICAgIGNtZD0iIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKG1kYi5jdXJzb3JzLkRpY3RDdXJzb3IpCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICJTRUxFQ1QgKiBGUk9NIG5ldHMgV0hFUkUgdXVpZD0nJXMnIiAlIG5ldF9pZAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZyhjbWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmN1ci5yb3djb3VudCA9PSAwIDogcmV0dXJuIC0xLCAibmV0d29ya19pZCAlcyBkb2VzIG5vdCBtYXRjaCBhbnkgbmV0IiAlIG5ldF9pZAorICAgICAgICAgICAgICAgICAgICBuZXQgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGV4Y2VwdCAobWRiLkVycm9yLCBBdHRyaWJ1dGVFcnJvcikgYXMgZToKKyAgICAgICAgICAgICAgICByLGMgPSBzZWxmLmZvcm1hdF9lcnJvcihlLCAiY2hlY2tfdGFyZ2V0X25ldCIsIGNtZCkKKyAgICAgICAgICAgICAgICBpZiByIT0tSFRUUF9SZXF1ZXN0X1RpbWVvdXQgb3IgcmV0cnlfPT0xOiByZXR1cm4gcixjCisgICAgICAgICNjaGVjayBwZXJtaXNzaW9ucworICAgICAgICBpZiB0ZW5hbnRfaWQgaXMgbm90IE5vbmUgYW5kIHRlbmFudF9pZCBpcyBub3QgImFkbWluIjoKKyAgICAgICAgICAgIGlmIG5ldFsndGVuYW50X2lkJ109PXRlbmFudF9pZCBhbmQgbmV0WydzaGFyZWQnXT09J2ZhbHNlJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEsICJuZWVkZWQgYWRtaW4gcHJpdmlsZWdlcyB0byBhdHRhY2ggdG8gdGhlIG5ldCAlcyIgJSBuZXRfaWQKKyAgICAgICAgI2NoZWNrIHR5cGVzCisgICAgICAgIGlmIChuZXRbJ3R5cGUnXSBpbiAoJ3AycCcsJ2RhdGEnKSBhbmQgJ3BvcnRfdHlwZScgPT0gJ2luc3RhbmNlOmJyaWRnZScpIG9yIFwKKyAgICAgICAgICAgIChuZXRbJ3R5cGUnXSBpbiAoJ2JyaWRnZV9kYXRhJywnYnJpZGdlX21hbicpIGFuZCAncG9ydF90eXBlJyAhPSAnaW5zdGFuY2U6YnJpZGdlJykgOgorICAgICAgICAgICAgcmV0dXJuIC0xLCAiY2FuIG5vdCBhdHRhY2ggYSBwb3J0IG9mIHR5cGUgJXMgaW50byBhIG5ldCBvZiB0eXBlICVzIiAlIChwb3J0X3R5cGUsIG5ldFsndHlwZSddKQorICAgICAgICBpZiBuZXRbJ3R5cGUnXSA9PSAncHRwJzoKKyAgICAgICAgICAgICNsb29rIGhvdyBtYW55IAorICAgICAgICAgICAgbmJfcG9ydHMsIGRhdGEgPSBzZWxmLmdldF9wb3J0cyggeyduZXRfaWQnOm5ldF9pZH0gKQorICAgICAgICAgICAgaWYgbmJfcG9ydHM8MDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEsIGRhdGEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbmV0Wydwcm92aWRlciddOgorICAgICAgICAgICAgICAgICAgICBuYl9wb3J0cyArPTEKKyAgICAgICAgICAgICAgICBpZiBuYl9wb3J0cyA+PTI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSwgIm5ldCBvZiB0eXBlIHAycCBhbHJlYWR5IGNvbnRhaW4gdHdvIHBvcnRzIGF0dGFjaGVkLiBObyByb29tIGZvciBhbm90aGVyIgorICAgICAgICAgICAgCisgICAgICAgIHJldHVybiAwLCBuZXQKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBwcmludCAiSGVsbG8gV29ybGQiCmRpZmYgLS1naXQgYS92aW1fc2NoZW1hLnB5IGIvdmltX3NjaGVtYS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGFlY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvdmltX3NjaGVtYS5weQpAQCAtMCwwICsxLDcxMiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKworIyMKKyMgQ29weXJpZ2h0IDIwMTUgVGVsZWbDs25pY2EgSW52ZXN0aWdhY2nDs24geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworJycnIERlZmluaXRpb24gb2YgZGljdGlvbmFyaWVzIHNjaGVtYXMgdXNlZCBieSB2YWxpZGF0aW5nIGlucHV0CisgICAgVGhlc2UgZGljdGlvbmFyaWVzIGFyZSB2YWxpZGF0ZWQgdXNpbmcganNvbnNjaGVtYSBsaWJyYXJ5CisnJycKK19fYXV0aG9yX189IkFsZm9uc28gVGllcm5vIgorX19kYXRlX18gPSIkMTAtanVsLTIwMTQgMTI6MDc6MTUkIgorCisjCisjIFNDSEVNQVMgdG8gdmFsaWRhdGUgaW5wdXQgZGF0YQorIworCitwYXRoX3NjaGVtYT17InR5cGUiOiJzdHJpbmciLCAicGF0dGVybiI6Il4oXC4pezAsMn0oL1teL1wiJzp7fVwoXCldKykrJCJ9CitodHRwX3NjaGVtYT17InR5cGUiOiJzdHJpbmciLCAicGF0dGVybiI6Il5odHRwcz86Ly9bXidcIj1dKyQifQorcG9ydF9zY2hlbWE9eyJ0eXBlIjoiaW50ZWdlciIsIm1pbmltdW0iOjEsIm1heGltdW4iOjY1NTM0fQoraXBfc2NoZW1hPXsidHlwZSI6InN0cmluZyIsInBhdHRlcm4iOiJeKFswLTldezEsM30uKXszfVswLTldezEsM30kIn0KK2NpZHJfc2NoZW1hPXsidHlwZSI6InN0cmluZyIsInBhdHRlcm4iOiJeKFswLTldezEsM30uKXszfVswLTldezEsM30vWzAtOV17MSwyfSQifQorbmFtZV9zY2hlbWE9eyJ0eXBlIiA6ICJzdHJpbmciLCAibWluTGVuZ3RoIjoxLCAibWF4TGVuZ3RoIjoyNTUsICJwYXR0ZXJuIiA6ICJeW14sOygpJ1wiXSskIn0KK25hbWVzaG9ydF9zY2hlbWE9eyJ0eXBlIiA6ICJzdHJpbmciLCAibWluTGVuZ3RoIjoxLCAibWF4TGVuZ3RoIjo2NCwgInBhdHRlcm4iIDogIl5bXiw7KCknXCJdKyQifQorbmFtZXRpbnlfc2NoZW1hPXsidHlwZSIgOiAic3RyaW5nIiwgIm1pbkxlbmd0aCI6MSwgIm1heExlbmd0aCI6MTIsICJwYXR0ZXJuIiA6ICJeW14sOygpJ1wiXSskIn0KK3htbF90ZXh0X3NjaGVtYT17InR5cGUiIDogInN0cmluZyIsICJtaW5MZW5ndGgiOjEsICJtYXhMZW5ndGgiOjEwMDAsICJwYXR0ZXJuIiA6ICJeW14nXSskIn0KK2Rlc2NyaXB0aW9uX3NjaGVtYT17InR5cGUiIDogWyJzdHJpbmciLCJudWxsIl0sICJtYXhMZW5ndGgiOjI1NSwgInBhdHRlcm4iIDogIl5bXidcIl0rJCJ9CitpZF9zY2hlbWFfZmFrZSA9IHsidHlwZSIgOiAic3RyaW5nIiwgIm1pbkxlbmd0aCI6MiwgIm1heExlbmd0aCI6MzYgfSAgIyJwYXR0ZXJuIjogIl5bYS1mQS1GMC05XXs4fS1bYS1mQS1GMC05XXs0fS1bYS1mQS1GMC05XXs0fS1bYS1mQS1GMC05XXs0fS1bYS1mQS1GMC05XXsxMn0kIgoraWRfc2NoZW1hID0geyJ0eXBlIiA6ICJzdHJpbmciLCAicGF0dGVybiI6ICJeW2EtZkEtRjAtOV17OH0oLVthLWZBLUYwLTldezR9KXszfS1bYS1mQS1GMC05XXsxMn0kIn0KK3BjaV9zY2hlbWE9eyJ0eXBlIjoic3RyaW5nIiwgInBhdHRlcm4iOiJeWzAtOWEtZkEtRl17NH0oOlswLTlhLWZBLUZdezJ9KXsyfVwuWzAtOWEtZkEtRl0kIn0KK2JhbmR3aWR0aF9zY2hlbWE9eyJ0eXBlIjoic3RyaW5nIiwgInBhdHRlcm4iIDogIl5bMC05XSsgKihbTUddYnBzKT8kIn0KK2ludGVnZXIwX3NjaGVtYT17InR5cGUiOiJpbnRlZ2VyIiwibWluaW11bSI6MH0KK2ludGVnZXIxX3NjaGVtYT17InR5cGUiOiJpbnRlZ2VyIiwibWluaW11bSI6MX0KK3ZsYW5fc2NoZW1hPXsidHlwZSI6ImludGVnZXIiLCJtaW5pbXVtIjoxLCJtYXhpbXVuIjo0MDk1fQordmxhbjEwMDBfc2NoZW1hPXsidHlwZSI6ImludGVnZXIiLCJtaW5pbXVtIjoxMDAwLCJtYXhpbXVuIjo0MDk1fQorbWFjX3NjaGVtYT17InR5cGUiOiJzdHJpbmciLCAicGF0dGVybiI6Il5bMC05YS1mQS1GXVswMjQ2OGFjZUFDRV0oOlswLTlhLWZBLUZdezJ9KXs1fSQifSAgI211c3QgYmUgdW5pY2FzdCBMU0IgYml0IG9mIE1TQiBieXRlID09MCAKK25ldF9iaW5kX3NjaGVtYT17Im9uZU9mIjpbeyJ0eXBlIjoibnVsbCJ9LHsidHlwZSI6InN0cmluZyIsICJwYXR0ZXJuIjoiXihkZWZhdWx0fCgoYnJpZGdlfG1hY3Z0YXApOlswLTlhLXpBLVpcLlwtXXsxLDUwfSl8b3BlbmZsb3c6Wy8wLTlhLXpBLVpcLlwtXXsxLDUwfSg6dmxhbik/KSQifV19Cit5ZXNfbm9fc2NoZW1hPXsidHlwZSI6InN0cmluZyIsICJlbnVtIjpbInllcyIsICJubyJdfQorbG9nX2xldmVsX3NjaGVtYT17InR5cGUiOiJzdHJpbmciLCAiZW51bSI6WyJERUJVRyIsICJJTkZPIiwgIldBUk5JTkciLCJFUlJPUiIsIkNSSVRJQ0FMIl19CisKK2NvbmZpZ19zY2hlbWEgPSB7CisgICAgInRpdGxlIjoibWFpbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHNjaGVtYSIsCisgICAgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKKyAgICAidHlwZSI6Im9iamVjdCIsCisgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgImh0dHBfcG9ydCI6IHBvcnRfc2NoZW1hLAorICAgICAgICAiaHR0cF9hZG1pbl9wb3J0IjogcG9ydF9zY2hlbWEsCisgICAgICAgICJodHRwX2hvc3QiOiBuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAiaHR0cF91cmxfcHJlZml4IjogcGF0aF9zY2hlbWEsICMgaXQgZG9lcyBub3Qgd29yayB5ZXQ7IGl0J3Mgc3VwcG9zZWQgdG8gYmUgdGhlIGJhc2UgcGF0aCB0byBiZSB1c2VkIGJ5IGJvdHRsZSwgYnV0IGl0IG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZAorICAgICAgICAiZGJfaG9zdCI6IG5hbWVzaG9ydF9zY2hlbWEsCisgICAgICAgICJkYl91c2VyIjogbmFtZXNob3J0X3NjaGVtYSwKKyAgICAgICAgImRiX3Bhc3N3ZCI6IHsidHlwZSI6InN0cmluZyJ9LAorICAgICAgICAiZGJfbmFtZSI6IG5hbWVzaG9ydF9zY2hlbWEsCisgICAgICAgICJvZl9jb250cm9sbGVyX2lwIjogaXBfc2NoZW1hLAorICAgICAgICAib2ZfY29udHJvbGxlcl9wb3J0IjogcG9ydF9zY2hlbWEsCisgICAgICAgICJvZl9jb250cm9sbGVyX2RwaWQiOiBuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAib2ZfY29udHJvbGxlcl9uZXRzX3dpdGhfc2FtZV92bGFuIjogeyJ0eXBlIiA6ICJib29sZWFuIn0sCisgICAgICAgICJvZl9jb250cm9sbGVyIjogbmFtZXNob3J0X3NjaGVtYSwgI3sidHlwZSI6InN0cmluZyIsICJlbnVtIjpbImZsb29kbGlnaHQiLCAib3BlbmRheWxpZ2h0Il19LAorICAgICAgICAib2ZfY29udHJvbGxlcl9tb2R1bGUiOiB7InR5cGUiOiJzdHJpbmcifSwKKyAgICAgICAgIyJvZl91c2VyIjogbmFtZXNob3J0X3NjaGVtYSwKKyAgICAgICAgIyJvZl9wYXNzd29yZCI6IG5hbWVzaG9ydF9zY2hlbWEsCisgICAgICAgICJ0ZXN0X21vZGUiOiB7InR5cGUiOiAiYm9vbGVhbiJ9LCAjbGVhdmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICAgICAgIm1vZGUiOiB7InR5cGUiOiJzdHJpbmciLCAiZW51bSI6WyJub3JtYWwiLCAiaG9zdCBvbmx5IiwgIk9GIG9ubHkiLCAiZGV2ZWxvcG1lbnQiLCAidGVzdCJdIH0sCisgICAgICAgICJkZXZlbG9wbWVudF9icmlkZ2UiOiB7InR5cGUiOiJzdHJpbmcifSwKKyAgICAgICAgInRlbmFudF9pZCI6IHsidHlwZSIgOiAic3RyaW5nIn0sCisgICAgICAgICJpbWFnZV9wYXRoIjogcGF0aF9zY2hlbWEsCisgICAgICAgICJuZXR3b3JrX3ZsYW5fcmFuZ2Vfc3RhcnQiOiB2bGFuX3NjaGVtYSwKKyAgICAgICAgIm5ldHdvcmtfdmxhbl9yYW5nZV9lbmQiOiB2bGFuX3NjaGVtYSwKKyAgICAgICAgImJyaWRnZV9pZmFjZXMiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICIuIiA6IHsKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLCAKKyAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogaW50ZWdlcjBfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOjIsCisgICAgICAgICAgICAgICAgICAgICJtYXhJdGVtcyI6MiwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJtaW5Qcm9wZXJ0aWVzIjogMgorICAgICAgICB9LAorICAgICAgICAiZGhjcF9zZXJ2ZXIiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAgICAgImhvc3QiIDogbmFtZV9zY2hlbWEsCisgICAgICAgICAgICAgICAgInBvcnQiIDogcG9ydF9zY2hlbWEsCisgICAgICAgICAgICAgICAgInByb3ZpZGVyIiA6IHsidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsiaXNjLWRoY3Atc2VydmVyIl19LAorICAgICAgICAgICAgICAgICJ1c2VyIiA6IG5hbWVzaG9ydF9zY2hlbWEsCisgICAgICAgICAgICAgICAgInBhc3N3b3JkIiA6IHsidHlwZSI6ICJzdHJpbmcifSwKKyAgICAgICAgICAgICAgICAia2V5IiA6IHsidHlwZSI6ICJzdHJpbmcifSwKKyAgICAgICAgICAgICAgICAiYnJpZGdlX2lmYWNlcyIgOnsKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLCAKKyAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogbmFtZXNob3J0X3NjaGVtYSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJuZXRzIiA6eworICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsIAorICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiBuYW1lX3NjaGVtYSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlZCI6IFsnaG9zdCcsICdwcm92aWRlcicsICd1c2VyJ10KKyAgICAgICAgfSwKKyAgICAgICAgImxvZ19sZXZlbCI6IGxvZ19sZXZlbF9zY2hlbWEsCisgICAgICAgICJsb2dfbGV2ZWxfZGIiOiBsb2dfbGV2ZWxfc2NoZW1hLAorICAgICAgICAibG9nX2xldmVsX29mIjogbG9nX2xldmVsX3NjaGVtYSwKKyAgICB9LAorICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKKyAgICAgICAgIm9mXyoiIDogeyJ0eXBlIjogWyJzdHJpbmciLCAiaW50ZWdlciIsICJib29sZWFuIl19CisgICAgfSwKKyAgICAicmVxdWlyZWQiOiBbJ2RiX2hvc3QnLCAnZGJfdXNlcicsICdkYl9wYXNzd2QnLCAnZGJfbmFtZScsCisgICAgICAgICAgICAnb2ZfY29udHJvbGxlcl9pcCcsICdvZl9jb250cm9sbGVyX3BvcnQnLCAnb2ZfY29udHJvbGxlcl9kcGlkJywgJ2JyaWRnZV9pZmFjZXMnLCAnb2ZfY29udHJvbGxlciddLAorICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlCit9CisKKworCittZXRhZGF0YV9zY2hlbWE9eworICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAicHJvcGVydGllcyI6eworICAgICAgICAiYXJjaGl0ZWN0dXJlIjogeyJ0eXBlIjoic3RyaW5nIn0sCisgICAgICAgICJ1c2VfaW5jcmVtZW50YWwiOiB5ZXNfbm9fc2NoZW1hLAorICAgICAgICAidnBjaSI6IHBjaV9zY2hlbWEsCisgICAgICAgICJvc19kaXN0cm8iOiB7InR5cGUiOiJzdHJpbmcifSwKKyAgICAgICAgIm9zX3R5cGUiOiB7InR5cGUiOiJzdHJpbmcifSwKKyAgICAgICAgIm9zX3ZlcnNpb24iOiB7InR5cGUiOiJzdHJpbmcifSwKKyAgICAgICAgImJ1cyI6IHsidHlwZSI6InN0cmluZyJ9LAorICAgICAgICAidG9wb2xvZ3kiOiB7InR5cGUiOiJzdHJpbmciLCAiZW51bSI6IFsib25lU29ja2V0Il19CisgICAgfQorfQorCisKKwordGVuYW50X25ld19zY2hlbWEgPSB7CisgICAgInRpdGxlIjoidGVuYW50IGNyZWF0aW9uIGluZm9ybWF0aW9uIHNjaGVtYSIsCisgICAgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKKyAgICAidHlwZSI6Im9iamVjdCIsCisgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgInRlbmFudCI6eworICAgICAgICAgICAgInR5cGUiOiJvYmplY3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgICAgICAgICAiaWQiOmlkX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAibmFtZSI6IG5hbWVzaG9ydF9zY2hlbWEsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjpkZXNjcmlwdGlvbl9zY2hlbWEsCisgICAgICAgICAgICAgICAgImVuYWJsZWQiOnsidHlwZSIgOiAiYm9vbGVhbiJ9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVkIjogWyJuYW1lIl0KKyAgICAgICAgfQorICAgIH0sCisgICAgInJlcXVpcmVkIjogWyJ0ZW5hbnQiXSwKKyAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZQorfQordGVuYW50X2VkaXRfc2NoZW1hID0geworICAgICJ0aXRsZSI6InRlbmFudCBlZGl0aW9uIGluZm9ybWF0aW9uIHNjaGVtYSIsCisgICAgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKKyAgICAidHlwZSI6Im9iamVjdCIsCisgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgInRlbmFudCI6eworICAgICAgICAgICAgInR5cGUiOiJvYmplY3QiLAorICAgICAgICAgICAgIm1pblByb3BlcnRpZXMiOjEsCisgICAgICAgICAgICAicHJvcGVydGllcyI6eworICAgICAgICAgICAgICAgICJuYW1lIjpuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ZGVzY3JpcHRpb25fc2NoZW1hLAorICAgICAgICAgICAgICAgICJlbmFibGVkIjp7InR5cGUiIDogImJvb2xlYW4ifQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlLAorICAgICAgICB9CisgICAgfSwKKyAgICAicmVxdWlyZWQiOiBbInRlbmFudCJdLAorICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlCit9CitpbnRlcmZhY2VzX3NjaGVtYT17CisgICAgInR5cGUiOiJhcnJheSIsCisgICAgIm1pbkl0ZW1zIjowLAorICAgICJpdGVtcyI6eworICAgICAgICAidHlwZSI6Im9iamVjdCIsCisgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAibmFtZSI6bmFtZV9zY2hlbWEsCisgICAgICAgICAgICAiZGVkaWNhdGVkIjp7InR5cGUiOiJzdHJpbmciLCJlbnVtIjpbInllcyIsIm5vIiwieWVzOnNyaW92Il19LAorICAgICAgICAgICAgImJhbmR3aWR0aCI6YmFuZHdpZHRoX3NjaGVtYSwKKyAgICAgICAgICAgICJ2cGNpIjpwY2lfc2NoZW1hLAorICAgICAgICAgICAgInV1aWQiOmlkX3NjaGVtYSwKKyAgICAgICAgICAgICJtYWNfYWRkcmVzcyI6bWFjX3NjaGVtYQorICAgICAgICB9LAorICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKKyAgICAgICAgInJlcXVpcmVkIjogWyJkZWRpY2F0ZWQiLCAiYmFuZHdpZHRoIl0KKyAgICB9Cit9CisKK2V4dGVuZGVkX3NjaGVtYT17CisgICAgInR5cGUiOiJvYmplY3QiLCAKKyAgICAicHJvcGVydGllcyI6eyAgICAgICAgICAgICAgICAgIAorICAgICAgICAicHJvY2Vzc29yX3JhbmtpbmciOmludGVnZXIwX3NjaGVtYSwKKyAgICAgICAgImRldmljZXMiOnsKKyAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwgCisgICAgICAgICAgICAiaXRlbXMiOnsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjp7InR5cGUiOiJzdHJpbmciLCAiZW51bSI6WyJ1c2IiLCJkaXNrIiwiY2Ryb20iLCJ4bWwiXX0sCisgICAgICAgICAgICAgICAgICAgICJ2cGNpIjpwY2lfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAiaW1hZ2VSZWYiOmlkX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgInhtbCI6eG1sX3RleHRfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAiZGV2IjpuYW1lc2hvcnRfc2NoZW1hCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKKyAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiXQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibnVtYXMiOnsKKyAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICJpdGVtcyI6eworICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSI6aW50ZWdlcjFfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAiY29yZXMiOmludGVnZXIxX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgInBhaXJlZC10aHJlYWRzIjppbnRlZ2VyMV9zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzIjppbnRlZ2VyMV9zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICJjb3Jlcy1pZCI6eyJ0eXBlIjoiYXJyYXkiLCJpdGVtcyI6aW50ZWdlcjBfc2NoZW1hfSwKKyAgICAgICAgICAgICAgICAgICAgInBhaXJlZC10aHJlYWRzLWlkIjp7InR5cGUiOiJhcnJheSIsIml0ZW1zIjp7InR5cGUiOiJhcnJheSIsIm1pbkl0ZW1zIjoyLCJtYXhJdGVtcyI6MiwiaXRlbXMiOmludGVnZXIwX3NjaGVtYX19LAorICAgICAgICAgICAgICAgICAgICAidGhyZWFkcy1pZCI6eyJ0eXBlIjoiYXJyYXkiLCJpdGVtcyI6aW50ZWdlcjBfc2NoZW1hfSwKKyAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZXMiOmludGVyZmFjZXNfc2NoZW1hCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKKyAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IDEsCisgICAgICAgICAgICAgICAgIyJyZXF1aXJlZCI6IFsibWVtb3J5Il0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgIyJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlLAorICAgICMicmVxdWlyZWQiOiBbInByb2Nlc3Nvcl9yYW5raW5nIl0KK30KKworaG9zdF9kYXRhX3NjaGVtYT17CisgICAgInRpdGxlIjoiaG9zdHMgbWFudWFsIGluc2VydGlvbiBpbmZvcm1hdGlvbiBzY2hlbWEiLAorICAgICJ0eXBlIjoib2JqZWN0IiwgCisgICAgInByb3BlcnRpZXMiOnsgICAgICAgICAgICAgICAgICAKKyAgICAgICAgImlwX25hbWUiOm5hbWVzaG9ydF9zY2hlbWEsCisgICAgICAgICJuYW1lIjogbmFtZV9zY2hlbWEsCisgICAgICAgICJkZXNjcmlwdGlvbiI6ZGVzY3JpcHRpb25fc2NoZW1hLAorICAgICAgICAidXNlciI6bmFtZXNob3J0X3NjaGVtYSwKKyAgICAgICAgInBhc3N3b3JkIjpuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAiZmVhdHVyZXMiOmRlc2NyaXB0aW9uX3NjaGVtYSwKKyAgICAgICAgInJhbmtpbmciOmludGVnZXIwX3NjaGVtYSwKKyAgICAgICAgImRldmljZXMiOnsKKyAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwgCisgICAgICAgICAgICAiaXRlbXMiOnsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjp7InR5cGUiOiJzdHJpbmciLCAiZW51bSI6WyJ1c2IiLCJkaXNrIl19LAorICAgICAgICAgICAgICAgICAgICAidnBjaSI6cGNpX3NjaGVtYQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UsCisgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIl0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm51bWFzIjp7CisgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAibWluSXRlbXMiOjEsCisgICAgICAgICAgICAiaXRlbXMiOnsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAgICAgICAgICJhZG1pbl9zdGF0ZV91cCI6eyJ0eXBlIjoiYm9vbGVhbiJ9LAorICAgICAgICAgICAgICAgICAgICAiaHVnZXBhZ2VzIjppbnRlZ2VyMV9zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICJjb3JlcyI6eworICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjoyLAorICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29yZV9pZCI6aW50ZWdlcjBfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkX2lkIjppbnRlZ2VyMF9zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXMiOiB7InR5cGUiOiJzdHJpbmciLCAiZW51bSI6WyJub3RlbGlnaWJsZSJdfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJjb3JlX2lkIiwidGhyZWFkX2lkIl0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZXMiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaW5JdGVtcyI6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZV9uYW1lIjpuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjptYWNfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWJwcyI6aW50ZWdlcjBfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNpIjpwY2lfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Jpb3ZzIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6eyJvbmVPZiI6W2ludGVnZXIwX3NjaGVtYSwgbmFtZXNob3J0X3NjaGVtYV19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIjptYWNfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxhbiI6aW50ZWdlcjBfc2NoZW1hLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjaSI6cGNpX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsic291cmNlX25hbWUiLCJtYWMiLCJwY2kiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiBuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoX2RwaWQiOiBuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJzb3VyY2VfbmFtZSIsIm1hYyIsIk1icHMiLCJwY2kiXQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAibnVtYV9zb2NrZXQiOmludGVnZXIwX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSI6aW50ZWdlcjFfc2NoZW1hCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKKyAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbImh1Z2VwYWdlcyIsImNvcmVzIiwibnVtYV9zb2NrZXQiXQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKKyAgICAicmVxdWlyZWQiOiBbInJhbmtpbmciLCAibnVtYXMiLCJpcF9uYW1lIiwidXNlciJdCit9CisKK2hvc3RfZWRpdF9zY2hlbWE9eworICAgICJ0aXRsZSI6Imhvc3RzIGNyZWF0aW9uIGluZm9ybWF0aW9uIHNjaGVtYSIsCisgICAgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKKyAgICAidHlwZSI6Im9iamVjdCIsCisgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgImhvc3QiOnsKKyAgICAgICAgICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAgICAgImlwX25hbWUiOm5hbWVzaG9ydF9zY2hlbWEsCisgICAgICAgICAgICAgICAgIm5hbWUiOiBuYW1lX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOmRlc2NyaXB0aW9uX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAidXNlciI6bmFtZXNob3J0X3NjaGVtYSwKKyAgICAgICAgICAgICAgICAicGFzc3dvcmQiOm5hbWVzaG9ydF9zY2hlbWEsCisgICAgICAgICAgICAgICAgImFkbWluX3N0YXRlX3VwIjp7InR5cGUiOiJib29sZWFuIn0sCisgICAgICAgICAgICAgICAgIm51bWFzIjp7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoiYXJyYXkiLCAKKyAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtYV9zb2NrZXQiOiBpbnRlZ2VyMF9zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkbWluX3N0YXRlX3VwIjp7InR5cGUiOiJib29sZWFuIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZXMiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiJhcnJheSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VfbmFtZSI6IG5hbWVzaG9ydF9zY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN3aXRjaF9kcGlkIjogbmFtZXNob3J0X3NjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoX3BvcnQiOiBuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsic291cmNlX25hbWUiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0sIAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJudW1hX3NvY2tldCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UsCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIm1pblByb3BlcnRpZXMiOiAxLAorICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UKKyAgICAgICAgfSwKKyAgICB9LAorICAgICJyZXF1aXJlZCI6IFsiaG9zdCJdLAorICAgICJtaW5Qcm9wZXJ0aWVzIjogMSwKKyAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZQorfQorCitob3N0X25ld19zY2hlbWEgPSB7CisgICAgInRpdGxlIjoiaG9zdHMgY3JlYXRpb24gaW5mb3JtYXRpb24gc2NoZW1hIiwKKyAgICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAicHJvcGVydGllcyI6eworICAgICAgICAiaG9zdCI6eworICAgICAgICAgICAgInR5cGUiOiJvYmplY3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgICAgICAgICAiaWQiOmlkX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiaXBfbmFtZSI6bmFtZXNob3J0X3NjaGVtYSwKKyAgICAgICAgICAgICAgICAibmFtZSI6IG5hbWVfc2NoZW1hLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ZGVzY3JpcHRpb25fc2NoZW1hLAorICAgICAgICAgICAgICAgICJ1c2VyIjpuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJwYXNzd29yZCI6bmFtZXNob3J0X3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiYWRtaW5fc3RhdGVfdXAiOnsidHlwZSI6ImJvb2xlYW4ifSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm5hbWUiLCJpcF9uYW1lIiwidXNlciJdCisgICAgICAgIH0sCisgICAgICAgICJob3N0LWRhdGEiOmhvc3RfZGF0YV9zY2hlbWEKKyAgICB9LAorICAgICJyZXF1aXJlZCI6IFsiaG9zdCJdLAorICAgICJtaW5Qcm9wZXJ0aWVzIjogMSwKKyAgICAibWF4UHJvcGVydGllcyI6IDIsCisgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UKK30KKworCitmbGF2b3JfbmV3X3NjaGVtYSA9IHsKKyAgICAidGl0bGUiOiJmbGF2b3IgY3JlYXRpb24gaW5mb3JtYXRpb24gc2NoZW1hIiwKKyAgICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAicHJvcGVydGllcyI6eworICAgICAgICAiZmxhdm9yIjp7CisgICAgICAgICAgICAidHlwZSI6Im9iamVjdCIsCisgICAgICAgICAgICAicHJvcGVydGllcyI6eworICAgICAgICAgICAgICAgICJpZCI6aWRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJuYW1lIjpuYW1lX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOmRlc2NyaXB0aW9uX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAicmFtIjppbnRlZ2VyMF9zY2hlbWEsCisgICAgICAgICAgICAgICAgInZjcHVzIjppbnRlZ2VyMF9zY2hlbWEsCisgICAgICAgICAgICAgICAgImV4dGVuZGVkIjogZXh0ZW5kZWRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJwdWJsaWMiOiB5ZXNfbm9fc2NoZW1hCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVkIjogWyJuYW1lIl0KKyAgICAgICAgfQorICAgIH0sCisgICAgInJlcXVpcmVkIjogWyJmbGF2b3IiXSwKKyAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZQorfQorZmxhdm9yX3VwZGF0ZV9zY2hlbWEgPSB7CisgICAgInRpdGxlIjoiZmxhdm9yIHVwZGF0ZSBpbmZvcm1hdGlvbiBzY2hlbWEiLAorICAgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCisgICAgInR5cGUiOiJvYmplY3QiLAorICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICJmbGF2b3IiOnsKKyAgICAgICAgICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAgICAgIm5hbWUiOm5hbWVfc2NoZW1hLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ZGVzY3JpcHRpb25fc2NoZW1hLAorICAgICAgICAgICAgICAgICJyYW0iOmludGVnZXIwX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAidmNwdXMiOmludGVnZXIwX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiZXh0ZW5kZWQiOiBleHRlbmRlZF9zY2hlbWEsCisgICAgICAgICAgICAgICAgInB1YmxpYyI6IHllc19ub19zY2hlbWEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IDEsCisgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZQorICAgICAgICB9CisgICAgfSwKKyAgICAicmVxdWlyZWQiOiBbImZsYXZvciJdLAorICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlCit9CisKK2ltYWdlX25ld19zY2hlbWEgPSB7CisgICAgInRpdGxlIjoiaW1hZ2UgY3JlYXRpb24gaW5mb3JtYXRpb24gc2NoZW1hIiwKKyAgICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAicHJvcGVydGllcyI6eworICAgICAgICAiaW1hZ2UiOnsKKyAgICAgICAgICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAgICAgImlkIjppZF9zY2hlbWEsCisgICAgICAgICAgICAgICAgInBhdGgiOiB7Im9uZU9mIjogW3BhdGhfc2NoZW1hLCBodHRwX3NjaGVtYV19LAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ZGVzY3JpcHRpb25fc2NoZW1hLAorICAgICAgICAgICAgICAgICJuYW1lIjpuYW1lX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAibWV0YWRhdGEiOm1ldGFkYXRhX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAicHVibGljIjogeWVzX25vX3NjaGVtYQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlZCI6IFsibmFtZSIsInBhdGgiXQorICAgICAgICB9CisgICAgfSwKKyAgICAicmVxdWlyZWQiOiBbImltYWdlIl0sCisgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UKK30KKworaW1hZ2VfdXBkYXRlX3NjaGVtYSA9IHsKKyAgICAidGl0bGUiOiJpbWFnZSB1cGRhdGUgaW5mb3JtYXRpb24gc2NoZW1hIiwKKyAgICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAicHJvcGVydGllcyI6eworICAgICAgICAiaW1hZ2UiOnsKKyAgICAgICAgICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAgICAgInBhdGgiOnsib25lT2YiOiBbcGF0aF9zY2hlbWEsIGh0dHBfc2NoZW1hXX0sCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjpkZXNjcmlwdGlvbl9zY2hlbWEsCisgICAgICAgICAgICAgICAgIm5hbWUiOm5hbWVfc2NoZW1hLAorICAgICAgICAgICAgICAgICJtZXRhZGF0YSI6bWV0YWRhdGFfc2NoZW1hLAorICAgICAgICAgICAgICAgICJwdWJsaWMiOiB5ZXNfbm9fc2NoZW1hCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIm1pblByb3BlcnRpZXMiOiAxLAorICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UKKyAgICAgICAgfQorICAgIH0sCisgICAgInJlcXVpcmVkIjogWyJpbWFnZSJdLAorICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlCit9CisKK25ldHdvcmtzX3NjaGVtYT17CisgICAgInR5cGUiOiJhcnJheSIsCisgICAgIml0ZW1zIjp7CisgICAgICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgICAgICJuYW1lIjpuYW1lX3NjaGVtYSwKKyAgICAgICAgICAgICJiYW5kd2lkdGgiOmJhbmR3aWR0aF9zY2hlbWEsCisgICAgICAgICAgICAidnBjaSI6cGNpX3NjaGVtYSwKKyAgICAgICAgICAgICJ1dWlkIjppZF9zY2hlbWEsCisgICAgICAgICAgICAibWFjX2FkZHJlc3MiOiBtYWNfc2NoZW1hLAorICAgICAgICAgICAgIm1vZGVsIjogeyJ0eXBlIjoic3RyaW5nIiwgImVudW0iOlsidmlydGlvIiwiZTEwMDAiLCJuZTJrX3BjaSIsInBjbmV0IiwicnRsODEzOSJdfSwKKyAgICAgICAgICAgICJ0eXBlIjogeyJ0eXBlIjoic3RyaW5nIiwgImVudW0iOlsidmlydHVhbCIsIlBGIiwiVkYiLCJWRm5vdFNoYXJlZCJdfQorICAgICAgICB9LAorICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKKyAgICAgICAgInJlcXVpcmVkIjogWyJ1dWlkIl0KKyAgICB9Cit9CisKK3NlcnZlcl9uZXdfc2NoZW1hID0geworICAgICJ0aXRsZSI6InNlcnZlciBjcmVhdGlvbiBpbmZvcm1hdGlvbiBzY2hlbWEiLAorICAgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCisgICAgInR5cGUiOiJvYmplY3QiLAorICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICJzZXJ2ZXIiOnsKKyAgICAgICAgICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgICAgICAgImlkIjppZF9zY2hlbWEsCisgICAgICAgICAgICAgICAgIm5hbWUiOm5hbWVfc2NoZW1hLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ZGVzY3JpcHRpb25fc2NoZW1hLAorICAgICAgICAgICAgICAgICJzdGFydCI6eyJ0eXBlIjoic3RyaW5nIiwgImVudW0iOlsieWVzIiwibm8iLCJwYXVzZWQiXX0sCisgICAgICAgICAgICAgICAgImhvc3RJZCI6aWRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJmbGF2b3JSZWYiOmlkX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiaW1hZ2VSZWYiOmlkX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiZXh0ZW5kZWQiOiBleHRlbmRlZF9zY2hlbWEsCisgICAgICAgICAgICAgICAgIm5ldHdvcmtzIjpuZXR3b3Jrc19zY2hlbWEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm5hbWUiLCJmbGF2b3JSZWYiLCJpbWFnZVJlZiJdCisgICAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXJlZCI6IFsic2VydmVyIl0sCisgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UKK30KKworc2VydmVyX2FjdGlvbl9zY2hlbWEgPSB7CisgICAgInRpdGxlIjoic2VydmVyIGFjdGlvbiBpbmZvcm1hdGlvbiBzY2hlbWEiLAorICAgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCisgICAgInR5cGUiOiJvYmplY3QiLAorICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICJzdGFydCI6eyJvbmVPZiI6W3sidHlwZSI6ICJudWxsIn0sIHsidHlwZSI6InN0cmluZyIsICJlbnVtIjpbInJlYnVpbGQiLCJudWxsIl0gfV19LAorICAgICAgICAicGF1c2UiOnsidHlwZSI6ICJudWxsIn0sCisgICAgICAgICJyZXN1bWUiOnsidHlwZSI6ICJudWxsIn0sCisgICAgICAgICJzaHV0b2ZmIjp7InR5cGUiOiAibnVsbCJ9LAorICAgICAgICAic2h1dGRvd24iOnsidHlwZSI6ICJudWxsIn0sCisgICAgICAgICJmb3JjZU9mZiI6eyJ0eXBlIjogIm51bGwifSwKKyAgICAgICAgInRlcm1pbmF0ZSI6eyJ0eXBlIjogIm51bGwifSwKKyAgICAgICAgImNyZWF0ZUltYWdlIjp7CisgICAgICAgICAgICAidHlwZSI6Im9iamVjdCIsCisgICAgICAgICAgICAicHJvcGVydGllcyI6eyAKKyAgICAgICAgICAgICAgICAicGF0aCI6cGF0aF9zY2hlbWEsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjpkZXNjcmlwdGlvbl9zY2hlbWEsCisgICAgICAgICAgICAgICAgIm5hbWUiOm5hbWVfc2NoZW1hLAorICAgICAgICAgICAgICAgICJtZXRhZGF0YSI6bWV0YWRhdGFfc2NoZW1hLAorICAgICAgICAgICAgICAgICJpbWFnZVJlZiI6IGlkX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiZGlzayI6IHsib25lT2YiOlt7InR5cGUiOiAibnVsbCJ9LCB7InR5cGUiOiJzdHJpbmcifV0gfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm5hbWUiXQorICAgICAgICB9LAorICAgICAgICAicmVidWlsZCI6eyJ0eXBlIjogWyJvYmplY3QiLCJudWxsIl19LAorICAgICAgICAicmVib290Ijp7CisgICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0IiwibnVsbCJdLAorIyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworIyAgICAgICAgICAgICAgICAidHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwgImVudW0iOlsiU09GVCJdIH0KKyMgICAgICAgICAgICB9LCAKKyMgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IDEsCisjICAgICAgICAgICAgIm1heFByb3BlcnRpZXMiOiAxLAorIyAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlCisgICAgICAgIH0KKyAgICB9LAorICAgICJtaW5Qcm9wZXJ0aWVzIjogMSwKKyAgICAibWF4UHJvcGVydGllcyI6IDEsCisgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UKK30KKworbmV0d29ya19uZXdfc2NoZW1hID0geworICAgICJ0aXRsZSI6Im5ldHdvcmsgY3JlYXRpb24gaW5mb3JtYXRpb24gc2NoZW1hIiwKKyAgICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAicHJvcGVydGllcyI6eworICAgICAgICAibmV0d29yayI6eworICAgICAgICAgICAgInR5cGUiOiJvYmplY3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgICAgICAgICAiaWQiOmlkX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAibmFtZSI6bmFtZV9zY2hlbWEsCisgICAgICAgICAgICAgICAgInR5cGUiOnsidHlwZSI6InN0cmluZyIsICJlbnVtIjpbImJyaWRnZV9tYW4iLCJicmlkZ2VfZGF0YSIsImRhdGEiLCAicHRwIl19LAorICAgICAgICAgICAgICAgICJzaGFyZWQiOnsidHlwZSI6ImJvb2xlYW4ifSwKKyAgICAgICAgICAgICAgICAidGVuYW50X2lkIjppZF9zY2hlbWEsCisgICAgICAgICAgICAgICAgImFkbWluX3N0YXRlX3VwIjp7InR5cGUiOiJib29sZWFuIn0sCisgICAgICAgICAgICAgICAgInByb3ZpZGVyOnZsYW4iOnZsYW5fc2NoZW1hLAorICAgICAgICAgICAgICAgICJwcm92aWRlcjpwaHlzaWNhbCI6bmV0X2JpbmRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJjaWRyIjpjaWRyX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiZW5hYmxlX2RoY3AiOiB7InR5cGUiOiJib29sZWFuIn0sCisgICAgICAgICAgICAgICAgImRoY3BfZmlyc3RfaXAiOiBpcF9zY2hlbWEsCisgICAgICAgICAgICAgICAgImRoY3BfbGFzdF9pcCI6IGlwX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiYmluZF9uZXQiOm5hbWVfc2NoZW1hLCAjY2FuIGJlIG5hbWUsIG9yIHV1aWQKKyAgICAgICAgICAgICAgICAiYmluZF90eXBlIjp7Im9uZU9mIjpbeyJ0eXBlIjoibnVsbCJ9LHsidHlwZSI6InN0cmluZyIsICJwYXR0ZXJuIjoiXnZsYW46WzAtOV17MSw0fSQifV19CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVkIjogWyJuYW1lIl0KKyAgICAgICAgfQorICAgIH0sCisgICAgInJlcXVpcmVkIjogWyJuZXR3b3JrIl0sCisgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UKK30KK25ldHdvcmtfdXBkYXRlX3NjaGVtYSA9IHsKKyAgICAidGl0bGUiOiJuZXR3b3JrIHVwZGF0ZSBpbmZvcm1hdGlvbiBzY2hlbWEiLAorICAgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCisgICAgInR5cGUiOiJvYmplY3QiLAorICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICJuZXR3b3JrIjp7CisgICAgICAgICAgICAidHlwZSI6Im9iamVjdCIsCisgICAgICAgICAgICAicHJvcGVydGllcyI6eworICAgICAgICAgICAgICAgICJuYW1lIjpuYW1lX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAidHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwgImVudW0iOlsiYnJpZGdlX21hbiIsImJyaWRnZV9kYXRhIiwiZGF0YSIsICJwdHAiXX0sCisgICAgICAgICAgICAgICAgInNoYXJlZCI6eyJ0eXBlIjoiYm9vbGVhbiJ9LAorICAgICAgICAgICAgICAgICJ0ZW5hbnRfaWQiOmlkX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiYWRtaW5fc3RhdGVfdXAiOnsidHlwZSI6ImJvb2xlYW4ifSwKKyAgICAgICAgICAgICAgICAicHJvdmlkZXI6dmxhbiI6dmxhbl9zY2hlbWEsIAorICAgICAgICAgICAgICAgICJwcm92aWRlcjpwaHlzaWNhbCI6bmV0X2JpbmRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJjaWRyIjpjaWRyX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiZW5hYmxlX2RoY3AiOiB7InR5cGUiOiJib29sZWFuIn0sCisgICAgICAgICAgICAgICAgImRoY3BfZmlyc3RfaXAiOiBpcF9zY2hlbWEsCisgICAgICAgICAgICAgICAgImRoY3BfbGFzdF9pcCI6IGlwX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAiYmluZF9uZXQiOm5hbWVfc2NoZW1hLCAjY2FuIGJlIG5hbWUsIG9yIHV1aWQKKyAgICAgICAgICAgICAgICAiYmluZF90eXBlIjp7Im9uZU9mIjpbeyJ0eXBlIjoibnVsbCJ9LHsidHlwZSI6InN0cmluZyIsICJwYXR0ZXJuIjoiXnZsYW46WzAtOV17MSw0fSQifV19CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIm1pblByb3BlcnRpZXMiOiAxLAorICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UKKyAgICAgICAgfQorICAgIH0sCisgICAgInJlcXVpcmVkIjogWyJuZXR3b3JrIl0sCisgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UKK30KKworCitwb3J0X25ld19zY2hlbWEgPSB7CisgICAgInRpdGxlIjoicG9ydCBjcmVhdGlvbiBpbmZvcm1hdGlvbiBzY2hlbWEiLAorICAgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCisgICAgInR5cGUiOiJvYmplY3QiLAorICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICJwb3J0Ijp7CisgICAgICAgICAgICAidHlwZSI6Im9iamVjdCIsCisgICAgICAgICAgICAicHJvcGVydGllcyI6eworICAgICAgICAgICAgICAgICJpZCI6aWRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJuYW1lIjpuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJuZXR3b3JrX2lkIjp7Im9uZU9mIjpbeyJ0eXBlIjogIm51bGwifSwgaWRfc2NoZW1hIF19LAorICAgICAgICAgICAgICAgICJ0ZW5hbnRfaWQiOmlkX3NjaGVtYSwKKyAgICAgICAgICAgICAgICAibWFjX2FkZHJlc3MiOiB7Im9uZU9mIjpbeyJ0eXBlIjogIm51bGwifSwgbWFjX3NjaGVtYV0gfSwKKyAgICAgICAgICAgICAgICAiYWRtaW5fc3RhdGVfdXAiOnsidHlwZSI6ImJvb2xlYW4ifSwKKyAgICAgICAgICAgICAgICAiYmFuZHdpZHRoIjpiYW5kd2lkdGhfc2NoZW1hLAorICAgICAgICAgICAgICAgICJiaW5kaW5nOnN3aXRjaF9wb3J0IjpuYW1lc2hvcnRfc2NoZW1hLAorICAgICAgICAgICAgICAgICJiaW5kaW5nOnZsYW4iOiB7Im9uZU9mIjpbeyJ0eXBlIjogIm51bGwifSwgdmxhbl9zY2hlbWEgXX0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm5hbWUiXQorICAgICAgICB9CisgICAgfSwKKyAgICAicmVxdWlyZWQiOiBbInBvcnQiXSwKKyAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZQorfQorCitwb3J0X3VwZGF0ZV9zY2hlbWEgPSB7CisgICAgInRpdGxlIjoicG9ydCB1cGRhdGUgaW5mb3JtYXRpb24gc2NoZW1hIiwKKyAgICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAicHJvcGVydGllcyI6eworICAgICAgICAicG9ydCI6eworICAgICAgICAgICAgInR5cGUiOiJvYmplY3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgICAgICAgICAibmFtZSI6bmFtZXNob3J0X3NjaGVtYSwKKyAgICAgICAgICAgICAgICAibmV0d29ya19pZCI6eyJhbnlPZiI6W3sidHlwZSI6Im51bGwifSwgaWRfc2NoZW1hIF0gfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJtaW5Qcm9wZXJ0aWVzIjogMSwKKyAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlCisgICAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXJlZCI6IFsicG9ydCJdLAorICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IEZhbHNlCit9CisKK2xvY2FsaW5mb19zY2hlbWEgPSB7CisgICAgInRpdGxlIjoibG9jYWxpbmZvIGluZm9ybWF0aW9uIHNjaGVtYSIsCisgICAgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKKyAgICAidHlwZSI6Im9iamVjdCIsCisgICAgInByb3BlcnRpZXMiOnsKKyAgICAgICAgImZpbGVzIjp7ICJ0eXBlIjogIm9iamVjdCJ9LAorICAgICAgICAiaW5jX2ZpbGVzIjp7ICJ0eXBlIjogIm9iamVjdCJ9LAorICAgICAgICAic2VydmVyX2ZpbGVzIjp7ICJ0eXBlIjogIm9iamVjdCJ9CisgICAgfSwKKyAgICAicmVxdWlyZWQiOiBbImZpbGVzIl0KK30KKworaG9zdGluZm9fc2NoZW1hID0geworICAgICJ0aXRsZSI6Imhvc3QgaW5mb3JtYXRpb24gc2NoZW1hIiwKKyAgICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAicHJvcGVydGllcyI6eworICAgICAgICAiaWZhY2VfbmFtZXMiOnsKKyAgICAgICAgICAgICJ0eXBlIjoib2JqZWN0IiwKKyAgICAgICAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6eworICAgICAgICAgICAgICAgICIuIjp7ICJ0eXBlIjogInN0cmluZyJ9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIm1pblByb3BlcnRpZXMiOiAxCisgICAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXJlZCI6IFsiaWZhY2VfbmFtZXMiXQorfQo=