# Library ----
library(dplyr)
library(iMRMC)
library(mvtnorm)
library(NestMRMC)
library(doParallel)
library(ggplot2)
library(gridExtra)
Figure 3 in the paper–histogram of number of positive and negative
ROIs in
balance and unbalance design
LS0tDQp0aXRsZTogIkZpZ3VyZXMgZm9yIE5lc3RlZCBEYXRhIFBhcGVyIg0Kb3V0cHV0Og0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQpgYGB7cix3YXJuaW5nPUZBTFNFfQ0KIyBMaWJyYXJ5IC0tLS0NCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoaU1STUMpDQpsaWJyYXJ5KG12dG5vcm0pDQpsaWJyYXJ5KE5lc3RNUk1DKQ0KbGlicmFyeShkb1BhcmFsbGVsKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpgYGANCg0KDQojIyBGaWd1cmUgMyBpbiB0aGUgcGFwZXItLWhpc3RvZ3JhbSBvZiBudW1iZXIgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMgaW4gDQojIyBiYWxhbmNlIGFuZCB1bmJhbGFuY2UgZGVzaWduDQoNCmBgYHtyLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCg0KIyMgQmFsYW5jZSBkZXNpZ24gDQpzaW0uY29uZmlnID0gc2ltdV9jb25maWcoZml4X2Rlc2lnbiA9IFQsc3RyZWFtID0gMSkNCmRhdGEgPSBkYXRhX01STUMoc2ltLmNvbmZpZykkZGF0YV9maW5hbA0KbnVtUk9JX2JhbGFuY2UgPSBBVUNfcGVyX3JlYWRlcl9uZXN0KGRhdGEpJG51bVJPSQ0KDQojIyBVbmJhbGFuY2UgZGVzaWduDQpzaW0uY29uZmlnID0gc2ltdV9jb25maWcoY29ycmVsYXRpb25fdCA9IDAuOCwgZml4X2Rlc2lnbiA9IFQsc3RyZWFtID0gMSkNCmRhdGEgPSBkYXRhX01STUMoc2ltLmNvbmZpZykkZGF0YV9maW5hbA0KbnVtUk9JX3VuYmFsYW5jZSA9IEFVQ19wZXJfcmVhZGVyX25lc3QoZGF0YSkkbnVtUk9JDQoNCm51bVJPSV9jb21iID0gY2JpbmQobnVtUk9JX2JhbGFuY2UsbnVtUk9JX3VuYmFsYW5jZSkNCg0KbnVtUk9JX2RmX25ldyA9IGRhdGEuZnJhbWUobnVtX1JPSSA9IGMobnVtUk9JX2NvbWJbMSxdLG51bVJPSV9jb21iWzIsXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0cnV0aCA9IGFzLmZhY3RvcihyZXAoYygicG9zIiwibmVnIiksZWFjaCA9IDIwMCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gcmVwKHJlcChjKCJiYWxhbmNlIiwidW5iYWxhbmNlIiksZWFjaCA9IDEwMCksMikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAlPiUgYXMuZmFjdG9yKCkpDQoNCiMjIGhpc3RvZ3JhbQ0KZ2dwbG90KG51bVJPSV9kZl9uZXcsIGFlcyh4ID0gbnVtX1JPSSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaW50ZXJhY3Rpb24oZGVzaWduLHRydXRoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGludGVyYWN0aW9uKGRlc2lnbix0cnV0aCkpKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX2hpc3RvZ3JhbShhbHBoYSA9IDAuNSxiaW5zID0gMzAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIpDQoNCmBgYA0KDQojIyBGaWd1cmUgNA0KDQojIyMgRGF0YSBkZXNjcmlwdGlvbiBmb3IgRmlndXJlIDQNCg0KKiBUaGUgcmVzdWx0cyBpbiB0aGVzZSBmaWxlcyBhc3N1bWUgdGhhdCB0aGUgdHJ1dGggbGFiZWxzIG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBST0lzIGFyZSBmaXhlZCBhY3Jvc3MgdGhlIDEwLDAwMCBzaW11bGF0aW9ucywgaGVuY2UgZml4ZWQgaXMgaW4gdGhlIG5hbWUgb2YgdGhlIGZpbGUuICANCg0KIA0KDQoqIEluIGEgYmFsYW5jZWQgZGVzaWduIGVhY2ggcGF0aWVudCBoYXMgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBudW1iZXIgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMuIEluIGFuIHVuYmFsYW5jZWQgZGVzaWduIGVhY2ggcGF0aWVudCB0ZW5kcyB0byBoYXZlIHVuZXF1YWwgbnVtYmVyIG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBST0lzLiBOb3RlIHRoYXQgZm9yIGJvdGggZGVzaWducyB0aGUgb3ZlcmFsbCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgUk9JcyBudW1iZXIgc2hvdWxkIGJlIGFib3V0IHRoZSBzYW1lLCBzaW5jZSB0aGUgb3ZlcmFsbCBwcm9iYWJpbGl0aWVzIHRvIGJlIHBvc2l0aXZlIFJPSSBhbmQgbmVnYXRpdmUgUk9JIGFyZSAwLjUgYW5kIDAuNS4NCg0KDQoqICpzaW1fcmVzdWx0X2JsYW5jZV9maXhlZF9jb3YwNTA2MjAyMS5jc3YqIENvbnRhaW5zIHRoZSBzdW1tYXJpemVkIHN0YXRpc3RpY3MgZnJvbSAxMCwwMDAgc2ltdWxhdGlvbnMgcmVzdWx0cyBpbiA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50LiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSBiYWxhbmNlZCBkZXNpZ24gYW5kIGZpeGVkIHRydXRoIGxhYmVscy4gVGhlIDc1IGNvbmZpZ3VyYXRpb25zIGFyZSBhbGwgdGhlIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiAzIEFVQyB2YWx1ZXMgKDAuNywgMC44LCAwLjkpLCA1IGNvdmFyaWFuY2UgdmFsdWVzICgwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45KSBhbmQgNSAkXHJobyQgdmFsdWVzICgwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45KS4gVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ndHMgaW4gdGhlIDc1IGNvbmZpZ3VyYXRpb25zIGlzIGF2YWlsYWJsZSBpbiB0aGUgKipUYWJsZSAxKiouDQoNCg0KKiAqc2ltX3Jlc3VsdF91bmJsYW5jZV9maXhlZF9jb3YwNTA2MjAyMS5jc3YqIENvbnRhaW5zIHRoZSBzdW1tYXJpemVkIHN0YXRpc3RpY3MgZnJvbSAxMCwwMDAgc2ltdWxhdGlvbnMgZm9yIDc1IGNvbmZpZ3VyYXRpb25zIGZvciAxMDAgcGF0aWVudHMgYW5kIDEwIFJPSXMgcGVyIHBhdGllbnQuIEFsbCBzaW11bGF0aW9ucyB1c2UgdGhlIHVuYmFsYW5jZWQgZGVzaWduIGFuZCBmaXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ncyBpbiB0aGUgNzUgY29uZmlndXJhdGlvbnMgaXMgYXZhaWxhYmxlIGluIHRoZSAqKlRhYmxlIDEqKi4NCg0KDQoqIFRoZXJlIGFyZSAxNiBjb2x1bW5zIGluIHRoZSBib3RoIGZpbGVzLiBUaGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIGVhY2ggY29sdW1uIGlzIGdpdmVuIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLiANCg0KICANCg0KDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KIyMgQ29uZmlncw0KQVVDID0gYygwLjcsMC44LDAuOSkNCkNPViA9IGMoMC4xLDAuMjUsMC41LDAuNzUsMC45KQ0KUkhPID0gYygwLjEsMC4yNSwwLjUsMC43NSwwLjkpDQojIyBsb2FkIGRhdGEgYW5kIG5hbWUgdGhlIGNvbHVtbnMNCnNpbV9yZXN1bHRfYmxhbmNlID0gcmVhZC5jc3YoIk5lc3RNUk1DX3NpbXVsYXRpb25fcmVzdWx0cy9zaW1fcmVzdWx0X2JsYW5jZV9maXhlZF9jb3YwNTA2MjAyMS5jc3YiLGhlYWRlciA9IFQpWywtMV0NCnNpbV9yZXN1bHRfdW5ibGFuY2UgPSByZWFkLmNzdigiTmVzdE1STUNfc2ltdWxhdGlvbl9yZXN1bHRzL3NpbV9yZXN1bHRfdW5ibGFuY2VfZml4ZWRfY292MDUwNjIwMjEuY3N2IixoZWFkZXIgPSBUKVssLTFdDQoNCnNpbV9yZXN1bHRfYmxhbmNlJFJITyA9IHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKQ0Kc2ltX3Jlc3VsdF9ibGFuY2UkQ09WID0gcmVwKENPViwxNSkNCg0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRSSE8gPSByZXAocmVwKFJITyxlYWNoID0gNSksMykNCnNpbV9yZXN1bHRfdW5ibGFuY2UkQ09WID0gcmVwKENPViwxNSkNCg0KDQoNCiMjIENvbnZlcnQgcGFyYW1ldGVyIHRvIGZhY3RvciBmb3IgYmV0dGVyIHZpc3VsaXphdGlvbg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUkhPID0gYXMuZmFjdG9yKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSkNCnNpbV9yZXN1bHRfYmxhbmNlJENPViA9IGFzLmZhY3RvcihyZXAoQ09WLDE1KSkNCnNpbV9yZXN1bHRfYmxhbmNlJFRSVUVfQVVDID0gYXMuZmFjdG9yKHJlcChBVUMsIGVhY2ggPSAyNSkpDQoNCnNpbV9yZXN1bHRfdW5ibGFuY2UkUkhPID0gYXMuZmFjdG9yKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSkNCnNpbV9yZXN1bHRfdW5ibGFuY2UkQ09WID0gYXMuZmFjdG9yKHJlcChDT1YsMTUpKQ0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRUUlVFX0FVQyA9IGFzLmZhY3RvcihyZXAoQVVDLCBlYWNoID0gMjUpKQ0KDQpjb25maWdzXzc1ID0gc2ltX3Jlc3VsdF9ibGFuY2VbLDE2OjE4XQ0KDQpyb3cubmFtZXMoY29uZmlnc183NSkgPSBwYXN0ZTAoJ0NvbmZpZyAnLCAxOjc1KQ0KIyMgcGxvdCBNQyB0cnV0aCB2cyB0aGVvcmV0aWNhbCB0cnV0aCAtLS0tDQoNCiMjIFZBUg0KcDFfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF9ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjcpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFBVUNfVkFSKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoZ3JvdXAgPSAgVFJVRV9BVUMsIGNvbG9yID0gQ09WLCBzaGFwZSA9IFJITyksIHNpemUgPSAxKSArDQpnZ3RpdGxlKCJCYWxhbmNlIEFVQyA9IDAuNyIpICsgeWxpbSgwLDAuMDAxNykgKyB4bGltKDAsMC4wMDE3KSArIA0KICB4bGFiKCJUaGVvcmV0aWNhbCBBVUMgVmFyaWFuY2UiKSArIHlsYWIoIk1DIEFVQyBWYXJpYW5jZSIpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikrDQogIHRoZW1lX2J3KCkrIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArIA0KICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSksDQogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpKSANCg0KDQpwMl9NQ3ZzVGhlbyA9IGdncGxvdChzaW1fcmVzdWx0X2JsYW5jZSAlPiUgZmlsdGVyKFRSVUVfQVVDID09IDAuOCksDQogICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMUFVQ19WQVIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhncm91cCA9ICBUUlVFX0FVQywgY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSwgc2l6ZSA9IDEpICsNCmdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC44IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIlRoZW9yZXRpY2FsIEFVQyBWYXJpYW5jZSIpICsgeWxhYigiTUMgQVVDIFZhcmlhbmNlIikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSsNCiAgdGhlbWVfYncoKSsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwgDQogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpKSANCg0KDQpwM19NQ3ZzVGhlbyA9IGdncGxvdChzaW1fcmVzdWx0X2JsYW5jZSAlPiUgZmlsdGVyKFRSVUVfQVVDID09IDAuOSksDQogICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMUFVQ19WQVIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhncm91cCA9ICBUUlVFX0FVQywgY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSwgc2l6ZSA9IDEpICsNCmdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC45IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIlRoZW9yZXRpY2FsIEFVQyBWYXJpYW5jZSIpICsgeWxhYigiTUMgQVVDIFZhcmlhbmNlIikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSsNCiAgdGhlbWVfYncoKSsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwNCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KDQoNCnA0X01DdnNUaGVvID0gZ2dwbG90KHNpbV9yZXN1bHRfdW5ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjcpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFBVUNfVkFSKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoZ3JvdXAgPSAgVFJVRV9BVUMsIGNvbG9yID0gQ09WLCBzaGFwZSA9IFJITyksIHNpemUgPSAxKSArDQogIGdndGl0bGUoIlVuYmFsYW5jZSBBVUMgPSAwLjciKSArIHlsaW0oMCwwLjAwMTcpICsgeGxpbSgwLDAuMDAxNykgKyANCiAgeGxhYigiVGhlb3JldGljYWwgQVVDIFZhcmlhbmNlIikgKyB5bGFiKCJNQyBBVUMgVmFyaWFuY2UiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KcDVfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF91bmJsYW5jZSAlPiUgZmlsdGVyKFRSVUVfQVVDID09IDAuOCksDQogICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMUFVQ19WQVIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhncm91cCA9ICBUUlVFX0FVQywgY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSwgc2l6ZSA9IDEpICsNCiAgZ2d0aXRsZSgiVW5iYWxhbmNlIEFVQyA9IDAuOCIpICsgIA0KICB5bGltKDAsMC4wMDE3KSArIA0KICB4bGltKDAsMC4wMDE3KSArIA0KICB4bGFiKCJUaGVvcmV0aWNhbCBBVUMgVmFyaWFuY2UiKSArIA0KICB5bGFiKCJNQyBBVUMgVmFyaWFuY2UiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwNCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KDQoNCnA2X01DdnNUaGVvID0gZ2dwbG90KHNpbV9yZXN1bHRfdW5ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjkpLA0KICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMUFVQ19WQVIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhncm91cCA9ICBUUlVFX0FVQywgY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSwgc2l6ZSA9IDEpICsNCiAgZ2d0aXRsZSgiVW5iYWxhbmNlIEFVQyA9IDAuOSIpICsgDQogIHlsaW0oMCwwLjAwMTcpICsgDQogIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIlRoZW9yZXRpY2FsIEFVQyBWYXJpYW5jZSIpICsgDQogIHlsYWIoIk1DIEFVQyBWYXJpYW5jZSIpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICB0aGVtZV9idygpICsgDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArIA0KICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSksDQogIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpncmlkLmFycmFuZ2UocDFfTUN2c1RoZW8sIHAyX01DdnNUaGVvLCBwM19NQ3ZzVGhlbywNCiAgICAgICAgICAgICBwNF9NQ3ZzVGhlbywgcDVfTUN2c1RoZW8sIHA2X01DdnNUaGVvLG5yb3cgPSAyLG5jb2wgPSAzKQ0KDQpgYGANCg0KDQoNCiMjIEZpZ3VyZSA1DQoNCiMjIyBEYXRhIGRlc2NyaXB0aW9uIGZvciBGaWd1cmUgNQ0KDQoqIFRoZSByZXN1bHRzIGluIHRoZXNlIGZpbGVzIGFzc3VtZSB0aGF0IHRoZSB0cnV0aCBsYWJlbHMgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMgYXJlIHJhbmRvbWx5IGFzc2lnbmVkIGFjcm9zcyB0aGUgMTAsMDAwIHNpbXVsYXRpb25zLCBoZW5jZSB1bmZpeGVkIGlzIGluIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgICANCg0KDQoqIEluIGEgYmFsYW5jZWQgZGVzaWduIGVhY2ggcGF0aWVudCBoYXMgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBudW1iZXIgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMuIEluIGFuIHVuYmFsYW5jZWQgZGVzaWduIGVhY2ggcGF0aWVudCB0ZW5kcyB0byBoYXZlIHVuZXF1YWwgbnVtYmVyIG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBST0lzLiBOb3RlIHRoYXQgZm9yIGJvdGggZGVzaWducyB0aGUgb3ZlcmFsbCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgUk9JcyBudW1iZXIgc2hvdWxkIGJlIGFib3V0IHRoZSBzYW1lLCBzaW5jZSB0aGUgb3ZlcmFsbCBwcm9iYWJpbGl0aWVzIHRvIGJlIHBvc2l0aXZlIFJPSSBhbmQgbmVnYXRpdmUgUk9JIGFyZSAwLjUgYW5kIDAuNS4NCg0KDQoqICpzaW1fcmVzdWx0X2JsYW5jZV91bmZpeGVkX2NvdjAwNTE4MjAyMS5jc3YqIENvbnRhaW5zIHRoZSBzdW1tYXJpemVkIHN0YXRpc3RpY3MgZnJvbSAxMCwwMDAgc2ltdWxhdGlvbnMgcmVzdWx0cyBpbiA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50LiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSBiYWxhbmNlZCBkZXNpZ24gYW5kIHVuZml4ZWQgdHJ1dGggbGFiZWxzLiBUaGUgNzUgY29uZmlndXJhdGlvbnMgYXJlIGFsbCB0aGUgcG9zc2libGUgY29tYmluYXRpb25zIG9mIDMgQVVDIHZhbHVlcyAoMC43LCAwLjgsIDAuOSksIDUgY292YXJpYW5jZSB2YWx1ZXMgKDAuMSwgMC4yNSwgMC41LCAwLjc1LCAwLjkpIGFuZCA1ICRccmhvJCB2YWx1ZXMgKDAuMSwgMC4yNSwgMC41LCAwLjc1LCAwLjkpLiBUaGUgZGV0YWlscyBvZiBwYXJhbWV0ZXJzIHNldHRpbmd0cyBpbiB0aGUgNzUgY29uZmlndXJhdGlvbnMgaXMgYXZhaWxhYmxlIGluIHRoZSAqKlRhYmxlIDEqKi4NCg0KDQoqICpzaW1fcmVzdWx0X3VuYmxhbmNlX3VuZml4ZWRfY292MDUxODIwMjEuY3N2KiBDb250YWlucyB0aGUgc3VtbWFyaXplZCBzdGF0aXN0aWNzIGZyb20gMTAsMDAwIHNpbXVsYXRpb25zIGZvciA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50LiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSB1bmJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ncyBpbiB0aGUgNzUgY29uZmlndXJhdGlvbnMgaXMgYXZhaWxhYmxlIGluIHRoZSAqKlRhYmxlIDEqKi4NCg0KDQoqIFRoZXJlIGFyZSAxNiBjb2x1bW5zIGluIHRoZSBib3RoIGZpbGVzLiBUaGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgaW4gdGhlIGVuZC4NCiANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjIExvYWQgZGF0YQ0Kc2ltX3Jlc3VsdF9ibGFuY2UgPSByZWFkLmNzdigiTmVzdE1STUNfc2ltdWxhdGlvbl9yZXN1bHRzL3NpbV9yZXN1bHRfYmxhbmNlX3VuZml4ZWRfY292MDA1MTgyMDIxLmNzdiIsaGVhZGVyID0gVClbLC0xXQ0Kc2ltX3Jlc3VsdF91bmJsYW5jZSA9IHJlYWQuY3N2KCJOZXN0TVJNQ19zaW11bGF0aW9uX3Jlc3VsdHMvc2ltX3Jlc3VsdF91bmJsYW5jZV91bmZpeGVkX2NvdjA1MTgyMDIxLmNzdiIsaGVhZGVyID0gVClbLC0xXQ0KDQpzaW1fcmVzdWx0X2JsYW5jZSRSSE8gPSByZXAocmVwKFJITyxlYWNoID0gNSksMykNCnNpbV9yZXN1bHRfYmxhbmNlJENPViA9IHJlcChDT1YsMTUpDQoNCnNpbV9yZXN1bHRfdW5ibGFuY2UkUkhPID0gcmVwKHJlcChSSE8sZWFjaCA9IDUpLDMpDQpzaW1fcmVzdWx0X3VuYmxhbmNlJENPViA9IHJlcChDT1YsMTUpDQoNCiMjIENvbnZlcnQgcGFyYW1ldGVyIHRvIGZhY3RvciBmb3IgYmV0dGVyIHZpc3VsaXphdGlvbg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUkhPID0gYXMuZmFjdG9yKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSkNCnNpbV9yZXN1bHRfYmxhbmNlJENPViA9IGFzLmZhY3RvcihyZXAoQ09WLDE1KSkNCnNpbV9yZXN1bHRfYmxhbmNlJFRSVUVfQVVDID0gYXMuZmFjdG9yKHJlcChBVUMsIGVhY2ggPSAyNSkpDQpzaW1fcmVzdWx0X2JsYW5jZSRUUlVFX0FVQyA9IHJlcChBVUMsIGVhY2ggPSAyNSkNCnNpbV9yZXN1bHRfdW5ibGFuY2UkUkhPID0gYXMuZmFjdG9yKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSkNCnNpbV9yZXN1bHRfdW5ibGFuY2UkQ09WID0gYXMuZmFjdG9yKHJlcChDT1YsMTUpKQ0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRUUlVFX0FVQyA9IGFzLmZhY3RvcihyZXAoQVVDLCBlYWNoID0gMjUpKQ0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRUUlVFX0FVQyA9IHJlcChBVUMsIGVhY2ggPSAyNSkNCiMjIFZBUg0KcDFfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF9ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjcpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFWQVJfTUVBTikpICsgDQogIGdlb21fcG9pbnQoYWVzKCBjb2xvciA9IENPViwgc2hhcGUgPSBSSE8pLHNpemUgPSAxKSArDQogIGdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC43IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIk1DIHRydXRoIG9mIEFVQyBWQVIiKSArIHlsYWIoIk1DIE1FQU4gb2YgQVVDIFZBUiBFc3RpbWF0ZXMiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KcDJfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF9ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjgpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFWQVJfTUVBTikpICsgDQogIGdlb21fcG9pbnQoYWVzKCBjb2xvciA9IENPViwgc2hhcGUgPSBSSE8pLHNpemUgPSAxKSArDQogIGdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC44IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIk1DIHRydXRoIG9mIEFVQyBWQVIiKSArIHlsYWIoIk1DIE1FQU4gb2YgQVVDIFZBUiBFc3RpbWF0ZXMiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KcDNfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF9ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjkpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFWQVJfTUVBTikpICsgDQogIGdlb21fcG9pbnQoYWVzKCBjb2xvciA9IENPViwgc2hhcGUgPSBSSE8pLHNpemUgPSAxKSArDQogIGdndGl0bGUoIkJhbGFuY2UgQVVDID0gMC45IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgDQogIHhsYWIoIk1DIHRydXRoIG9mIEFVQyBWQVIiKSArIHlsYWIoIk1DIE1FQU4gb2YgQVVDIFZBUiBFc3RpbWF0ZXMiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KDQpwNF9NQ3ZzVGhlbyA9IGdncGxvdChzaW1fcmVzdWx0X3VuYmxhbmNlICU+JSBmaWx0ZXIoVFJVRV9BVUMgPT0gMC43KSwNCiAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gVFJVRV9WQVJfTUVBTiwgeSA9IFIxVkFSX01FQU4pKSArIA0KICBnZW9tX3BvaW50KGFlcyggY29sb3IgPSBDT1YsIHNoYXBlID0gUkhPKSxzaXplID0gMSkgKw0KICBnZ3RpdGxlKCJVbmJhbGFuY2UgQVVDID0gMC43IikgKyB5bGltKDAsMC4wMDE3KSArIHhsaW0oMCwwLjAwMTcpICsgIA0KICB4bGFiKCJNQyB0cnV0aCBvZiBBVUMgVkFSIikgKyB5bGFiKCJNQyBNRUFOIG9mIEFVQyBWQVIgRXN0aW1hdGVzIikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSsNCiAgdGhlbWVfYncoKSsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwNCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KDQoNCnA1X01DdnNUaGVvID0gZ2dwbG90KHNpbV9yZXN1bHRfdW5ibGFuY2UgJT4lIGZpbHRlcihUUlVFX0FVQyA9PSAwLjgpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUUlVFX1ZBUl9NRUFOLCB5ID0gUjFWQVJfTUVBTikpICsgDQogIGdlb21fcG9pbnQoYWVzKCBjb2xvciA9IENPViwgc2hhcGUgPSBSSE8pLHNpemUgPSAxKSArDQogIGdndGl0bGUoIlVuYmFsYW5jZSBBVUMgPSAwLjgiKSArIHlsaW0oMCwwLjAwMTcpICsgeGxpbSgwLDAuMDAxNykgKyAgDQogIHhsYWIoIk1DIHRydXRoIG9mIEFVQyBWQVIiKSArIHlsYWIoIk1DIE1FQU4gb2YgQVVDIFZBUiBFc3RpbWF0ZXMiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSxsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpKw0KICB0aGVtZV9idygpKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9MSkpLA0KICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSkgDQoNCg0KcDZfTUN2c1RoZW8gPSBnZ3Bsb3Qoc2ltX3Jlc3VsdF91bmJsYW5jZSAlPiUgZmlsdGVyKFRSVUVfQVVDID09IDAuOSksDQogICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRSVUVfVkFSX01FQU4sIHkgPSBSMVZBUl9NRUFOKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoIGNvbG9yID0gQ09WLCBzaGFwZSA9IFJITyksc2l6ZSA9IDEpICsNCiAgZ2d0aXRsZSgiVW5iYWxhbmNlIEFVQyA9IDAuOSIpICsgeWxpbSgwLDAuMDAxNykgKyB4bGltKDAsMC4wMDE3KSArIA0KICB4bGFiKCJNQyB0cnV0aCBvZiBBVUMgVkFSIikgKyB5bGFiKCJNQyBNRUFOIG9mIEFVQyBWQVIgRXN0aW1hdGVzIikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSsNCiAgdGhlbWVfYncoKSsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTEpKSwNCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xKSkpIA0KDQoNCg0KZ3JpZC5hcnJhbmdlKHAxX01DdnNUaGVvLCBwMl9NQ3ZzVGhlbywgcDNfTUN2c1RoZW8sDQogICAgICAgICAgICAgcDRfTUN2c1RoZW8sIHA1X01DdnNUaGVvLCBwNl9NQ3ZzVGhlbyxucm93ID0gMixuY29sID0gMykNCg0KDQpgYGANCg0KDQojIEZpZ3VyZSA2DQoNCg0KIyMjIERhdGEgZGVzY3JpcHRpb24gZm9yIEZpZ3VyZSA2DQoNCiogVGhlIHJlc3VsdHMgaW4gdGhlc2UgZmlsZXMgYXNzdW1lIHRoYXQgdGhlIHRydXRoIGxhYmVscyBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgUk9JcyBhcmUgcmFuZG9tbHkgYXNzaWduZWQgYWNyb3NzIHRoZSAxMCwwMDAgc2ltdWxhdGlvbnMsIGhlbmNlIHVuZml4ZWQgaXMgaW4gdGhlIG5hbWUgb2YgdGhlIGZpbGUuICAgIA0KDQoNCiogSW4gYSBiYWxhbmNlZCBkZXNpZ24gZWFjaCBwYXRpZW50IGhhcyBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIG51bWJlciBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgUk9Jcy4gSW4gYW4gdW5iYWxhbmNlZCBkZXNpZ24gZWFjaCBwYXRpZW50IHRlbmRzIHRvIGhhdmUgdW5lcXVhbCBudW1iZXIgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIFJPSXMuIE5vdGUgdGhhdCBmb3IgYm90aCBkZXNpZ25zIHRoZSBvdmVyYWxsIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBST0lzIG51bWJlciBzaG91bGQgYmUgYWJvdXQgdGhlIHNhbWUsIHNpbmNlIHRoZSBvdmVyYWxsIHByb2JhYmlsaXRpZXMgdG8gYmUgcG9zaXRpdmUgUk9JIGFuZCBuZWdhdGl2ZSBST0kgYXJlIDAuNSBhbmQgMC41Lg0KDQoqICpzaW1fcmVzdWx0X2JsYW5jZV91bmZpeGVkX2NvdjEwMDQyMDIxLmNzdiogQ29udGFpbnMgdGhlIHN1bW1hcml6ZWQgc3RhdGlzdGljcyBmcm9tIDEwLDAwMCBzaW11bGF0aW9ucyByZXN1bHRzIGluIDc1IGNvbmZpZ3VyYXRpb25zIGZvciAxMDAgcGF0aWVudHMgYW5kIDEwIFJPSXMgcGVyIHBhdGllbnQuIEFsbCBzaW11bGF0aW9ucyB1c2UgdGhlIGJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuIFRoZSA3NSBjb25maWd1cmF0aW9ucyBhcmUgYWxsIHRoZSBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgMyBBVUMgdmFsdWVzICgwLjcsIDAuOCwgMC45KSwgNSBjb3ZhcmlhbmNlIHZhbHVlcyAoMC4xLCAwLjI1LCAwLjUsIDAuNzUsIDAuOSkgYW5kIDUgJFxyaG8kIHZhbHVlcyAoMC4xLCAwLjI1LCAwLjUsIDAuNzUsIDAuOSkuIFRoZSBkZXRhaWxzIG9mIHBhcmFtZXRlcnMgc2V0dGluZ3RzIGluIHRoZSA3NSBjb25maWd1cmF0aW9ucyBpcyBhdmFpbGFibGUgaW4gdGhlICoqVGFibGUgMSoqLg0KDQoqICpzaW1fcmVzdWx0X3VuYmxhbmNlX3VuZml4ZWRfY292MTAwNDIwMjEuY3N2KiBDb250YWlucyB0aGUgc3VtbWFyaXplZCBzdGF0aXN0aWNzIGZyb20gMTAsMDAwIHNpbXVsYXRpb25zIGZvciA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50LiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSB1bmJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ndHMgaW4gdGhlIDc1IGNvbmZpZ3VyYXRpb25zIGlzIGF2YWlsYWJsZSBpbiB0aGUgKipUYWJsZSAxKiouDQoNCiogKnNpbV9OYW5jeV9ibGFuY2VfdW5maXhlZF9jb3YxMDA0MjAyMS5jc3YqIENvbnRhaW5zIHRoZSBzdW1tYXJpemVkIHN0YXRpc3RpY3MgZnJvbSAxMCwwMDAgc2ltdWxhdGlvbnMgZm9yIDc1IGNvbmZpZ3VyYXRpb25zIGZvciAxMDAgcGF0aWVudHMgYW5kIDEwIFJPSXMgcGVyIHBhdGllbnQgYmFzZWQgb24gTmFuY3kncyBtZXRob2QuIEFsbCBzaW11bGF0aW9ucyB1c2UgdGhlIGJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ndHMgaW4gdGhlIDc1IGNvbmZpZ3VyYXRpb25zIGlzIGF2YWlsYWJsZSBpbiB0aGUgKipUYWJsZSAxKiouICANCg0KKiAqc2ltX05hbmN5X3VuYmxhbmNlX3VuZml4ZWRfY292MTAwNDIwMjEuY3N2KiBDb250YWlucyB0aGUgc3VtbWFyaXplZCBzdGF0aXN0aWNzIGZyb20gMTAsMDAwIHNpbXVsYXRpb25zIGZvciA3NSBjb25maWd1cmF0aW9ucyBmb3IgMTAwIHBhdGllbnRzIGFuZCAxMCBST0lzIHBlciBwYXRpZW50IGJhc2VkIG9uIE5hbmN5J3MgbWV0aG9kLiBBbGwgc2ltdWxhdGlvbnMgdXNlIHRoZSB1bmJhbGFuY2VkIGRlc2lnbiBhbmQgdW5maXhlZCB0cnV0aCBsYWJlbHMuVGhlIGRldGFpbHMgb2YgcGFyYW1ldGVycyBzZXR0aW5ndHMgaW4gdGhlIDc1IGNvbmZpZ3VyYXRpb25zIGlzIGF2YWlsYWJsZSBpbiB0aGUgKipUYWJsZSAxKiouIA0KDQoqIFRoZXJlIGFyZSAxNiBjb2x1bW5zIGluIHRoZSBhYm92ZSBmaWxlcy4gVGhlIGRldGFpbGVkIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGluIHRoZSBlbmQuDQoNCiAgDQoNCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIyBsb2FkIGRhdGEgLS0tLQ0KDQpzaW1fcmVzdWx0X2JsYW5jZSA9IHJlYWQuY3N2KCJOZXN0TVJNQ19zaW11bGF0aW9uX3Jlc3VsdHMvc2ltX3Jlc3VsdF9ibGFuY2VfdW5maXhlZF9jb3YxMDA0MjAyMS5jc3YiLGhlYWRlciA9IFQpWywtMV0NCnNpbV9yZXN1bHRfdW5ibGFuY2UgPSByZWFkLmNzdigiTmVzdE1STUNfc2ltdWxhdGlvbl9yZXN1bHRzL3NpbV9yZXN1bHRfdW5ibGFuY2VfdW5maXhlZF9jb3YxMDA0MjAyMS5jc3YiLGhlYWRlciA9IFQpWywtMV0NCg0Kc2ltX25hbmN5X2JsYW5jZSA9IHJlYWQuY3N2KCJOZXN0TVJNQ19zaW11bGF0aW9uX3Jlc3VsdHMvc2ltX05hbmN5X2JsYW5jZV91bmZpeGVkX2NvdjEwMDQyMDIxLmNzdiIsaGVhZGVyID0gVClbLC0xXQ0Kc2ltX25hbmN5X3VuYmxhbmNlID0gcmVhZC5jc3YoIk5lc3RNUk1DX3NpbXVsYXRpb25fcmVzdWx0cy9zaW1fTmFuY3lfdW5ibGFuY2VfdW5maXhlZF9jb3YxMDA0MjAyMS5jc3YiLGhlYWRlciA9IFQpWywtMV0NCg0KQVVDID0gYygwLjcsMC44LDAuOSklPiUgYXMuZmFjdG9yKCkNCkNPViA9IGMoMC4xLDAuMjUsMC41LDAuNzUsMC45KSU+JSBhcy5mYWN0b3IoKQ0KUkhPID0gYXMuZmFjdG9yKGMoMC4xLDAuMjUsMC41LDAuNzUsMC45KSkNCg0KDQojIyBjYWxjdWxhdGUgdGhlIGJpYXMgLS0tLSANCg0KIyMgQVVDIEJpYXMNCnNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX0JJQVMgPSAoc2ltX3Jlc3VsdF9ibGFuY2UkVFJVRV9BVUMgLSBzaW1fcmVzdWx0X2JsYW5jZSRSMUFVQ19NRUFOKS9zaW1fcmVzdWx0X2JsYW5jZSRUUlVFX0FVQw0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19CSUFTID0gKHNpbV9yZXN1bHRfdW5ibGFuY2UkVFJVRV9BVUMgLSBzaW1fcmVzdWx0X3VuYmxhbmNlJFIxQVVDX01FQU4pL3NpbV9yZXN1bHRfdW5ibGFuY2UkVFJVRV9BVUMNCnNpbV9uYW5jeV9ibGFuY2UkUjFBVUNfQklBUyA9IChzaW1fbmFuY3lfYmxhbmNlJFRSVUVfQVVDIC0gc2ltX25hbmN5X2JsYW5jZSRSMUFVQ19NRUFOKS9zaW1fbmFuY3lfYmxhbmNlJFRSVUVfQVVDDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfQklBUyA9IChzaW1fbmFuY3lfdW5ibGFuY2UkVFJVRV9BVUMgLSBzaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfTUVBTikvc2ltX25hbmN5X3VuYmxhbmNlJFRSVUVfQVVDDQoNCiMjIFZBUiBCaWFzDQpzaW1fcmVzdWx0X2JsYW5jZSRSMVZBUl9CSUFTID0gKHNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX1ZBUiAtIHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX01FQU4pL3NpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX1ZBUg0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRSMVZBUl9CSUFTID0gKHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFBVUNfVkFSIC0gc2ltX3Jlc3VsdF91bmJsYW5jZSRSMVZBUl9NRUFOKS9zaW1fcmVzdWx0X3VuYmxhbmNlJFIxQVVDX1ZBUg0Kc2ltX25hbmN5X2JsYW5jZSRSMVZBUl9CSUFTID0gKHNpbV9uYW5jeV9ibGFuY2UkUjFBVUNfVkFSIC0gc2ltX25hbmN5X2JsYW5jZSRSMVZBUl9NRUFOKS9zaW1fbmFuY3lfYmxhbmNlJFIxQVVDX1ZBUg0Kc2ltX25hbmN5X3VuYmxhbmNlJFIxVkFSX0JJQVMgPSAoc2ltX25hbmN5X3VuYmxhbmNlJFIxQVVDX1ZBUiAtIHNpbV9uYW5jeV91bmJsYW5jZSRSMVZBUl9NRUFOKS9zaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfVkFSDQoNCg0KDQpzaW1fcmVzdWx0X2JsYW5jZSRSMVZBUl9CSUFTID0gKHNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX1ZBUiAtIHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX01FQU4pDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxVkFSX0JJQVMgPSAoc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19WQVIgLSBzaW1fcmVzdWx0X3VuYmxhbmNlJFIxVkFSX01FQU4pDQpzaW1fbmFuY3lfYmxhbmNlJFIxVkFSX0JJQVMgPSAoc2ltX25hbmN5X2JsYW5jZSRSMUFVQ19WQVIgLSBzaW1fbmFuY3lfYmxhbmNlJFIxVkFSX01FQU4pDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFWQVJfQklBUyA9IChzaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfVkFSIC0gc2ltX25hbmN5X3VuYmxhbmNlJFIxVkFSX01FQU4pDQojIyBDT1YgQmlhcw0KDQoNCnNpbV9yZXN1bHRfYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX01DIC0gc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9NRUFOKS9zaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX01DDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUMgLSBzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUVBTikvc2ltX3Jlc3VsdF91bmJsYW5jZSRSMVIyQ09WX01DDQpzaW1fbmFuY3lfYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fbmFuY3lfYmxhbmNlJFIxUjJDT1ZfTUMgLSBzaW1fbmFuY3lfYmxhbmNlJFIxUjJDT1ZfTUVBTikvc2ltX25hbmN5X2JsYW5jZSRSMVIyQ09WX01DDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFSMkNPVl9CSUFTID0gKHNpbV9uYW5jeV91bmJsYW5jZSRSMVIyQ09WX01DIC0gc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfTUVBTikvc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfTUMNCg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9CSUFTID0gKHNpbV9yZXN1bHRfYmxhbmNlJFIxUjJDT1ZfTUMgLSBzaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX01FQU4pDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUMgLSBzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUVBTikNCnNpbV9uYW5jeV9ibGFuY2UkUjFSMkNPVl9CSUFTID0gKHNpbV9uYW5jeV9ibGFuY2UkUjFSMkNPVl9NQyAtIHNpbV9uYW5jeV9ibGFuY2UkUjFSMkNPVl9NRUFOKQ0Kc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfQklBUyA9IChzaW1fbmFuY3lfdW5ibGFuY2UkUjFSMkNPVl9NQyAtIHNpbV9uYW5jeV91bmJsYW5jZSRSMVIyQ09WX01FQU4pDQoNCiMjIEJpYXMgcGxvdCAtLS0tIA0KDQojIyBBVUMgYmlhcw0KQVVDX2JpYXNfY29tYmluZSA9IGRhdGEuZnJhbWUobWV0aG9kID0gcmVwKGMoIkNDQVVDIiwiTmFuY3kiKSxlYWNoID0gMTUwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IHJlcChyZXAoYygiYmFsYW5jZSIsInVuYmFsYW5jZSIpLGVhY2ggPSA3NSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMgPSBjKHNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX0JJQVMsc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19CSUFTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fbmFuY3lfYmxhbmNlJFIxQVVDX0JJQVMsc2ltX25hbmN5X3VuYmxhbmNlJFIxQVVDX0JJQVMpKQ0KDQoNCnAxID0gZ2dwbG90KEFVQ19iaWFzX2NvbWJpbmUsIGFlcyh4PTE6MzAwLHkgPSBiaWFzKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IG1ldGhvZCwgc2hhcGUgPSBkZXNpZ24pKSsNCmdndGl0bGUoIkFVQyBSZWxhdGl2ZSBCaWFzIikgKyBsYWJzKHggPSAiY29uZmlndXJhdGlvbnMiLCB5ID0gIkFVQyBSZWxhdGl2ZSBCaWFzIikgKyANCmdlb21fdmxpbmUoeGludGVyY2VwdCA9IHNlcSg3NSwyMjUsYnkgPSA3NSksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPTAuNSkgKw0KdGhlbWVfYncoKSArICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgDQoNCiMjIFZBUiBiaWFzDQoNClZBUl9iaWFzX2NvbWJpbmUgPSBkYXRhLmZyYW1lKG1ldGhvZCA9IHJlcChjKCJDQ0FVQyIsIk5hbmN5IiksZWFjaCA9IDE1MCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gcmVwKHJlcChjKCJiYWxhbmNlIiwidW5iYWxhbmNlIiksZWFjaCA9IDc1KSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVQyA9IHJlcChBVUMsZWFjaCA9IDI1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJITyA9IHJlcChyZXAocmVwKFJITyxlYWNoID0gNSksMyksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSByZXAocmVwKENPViwxNSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWFzID0gYyhzaW1fcmVzdWx0X2JsYW5jZSRSMVZBUl9CSUFTLHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFWQVJfQklBUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9uYW5jeV9ibGFuY2UkUjFWQVJfQklBUyxzaW1fbmFuY3lfdW5ibGFuY2UkUjFWQVJfQklBUykpDQoNCg0KcDIgPSBnZ3Bsb3QoVkFSX2JpYXNfY29tYmluZSU+JWZpbHRlcihtZXRob2QgPT0gIkNDQVVDIiksIGFlcyh4PTE6MTUwLHkgPSBiaWFzKSkgKyANCmdlb21fcG9pbnQoYWVzKGNvbG9yID0gQVVDLCxzaGFwZSA9IFJITykpKyBsYWJzKHggPSAiY29uZmlndXJhdGlvbnMiLCB5ID0gIlZBUiBSZWxhdGl2ZSBCaWFzIikgKyANCmdlb21fdmxpbmUoeGludGVyY2VwdCA9IHNlcSg3NSwxNDksYnkgPSA3NSksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPTAuNSkgKw0KdGhlbWVfYncoKSArICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgDQojIyBDT1YgYmlhcw0KDQpDT1ZfYmlhc19jb21iaW5lID0gZGF0YS5mcmFtZShtZXRob2QgPSByZXAoYygiQ0NBVUMiLCJOYW5jeSIpLGVhY2ggPSAxNTApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IHJlcChyZXAoYygiYmFsYW5jZSIsInVuYmFsYW5jZSIpLGVhY2ggPSA3NSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVUMgPSByZXAoQVVDLGVhY2ggPSAyNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSE8gPSByZXAocmVwKHJlcChSSE8sZWFjaCA9IDUpLDMpLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ID0gcmVwKHJlcChDT1YsMTUpLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlhcyA9IGMoc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9CSUFTLHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFSMkNPVl9CSUFTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltX25hbmN5X2JsYW5jZSRSMVIyQ09WX0JJQVMsc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfQklBUykpDQoNCg0KcDMgPSBnZ3Bsb3QoQ09WX2JpYXNfY29tYmluZSU+JWZpbHRlcihtZXRob2QgPT0gIkNDQVVDIiksIGFlcyh4PTE6MTUwLHkgPSBiaWFzKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IEFVQyxzaGFwZSA9IFJITykpKw0KICBsYWJzKHggPSAiY29uZmlndXJhdGlvbnMiLCB5ID0gIkNPViBSZWxhdGl2ZSBCaWFzIikgICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHNlcSg3NSwxNDksYnkgPSA3NSksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPTAuNSkgKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSANCg0KDQojZ3JpZC5hcnJhbmdlKHAxLHAyLHAzLG5yb3cgPTEpDQoNCiMjIGNhbGN1bGF0ZSBDViAtLS0tDQoNCiMjIEFVQyBDVg0KDQoNCnNpbV9yZXN1bHRfYmxhbmNlJFIxQVVDX0NWID0gc3FydChzaW1fcmVzdWx0X2JsYW5jZSRSMUFVQ19WQVIpL3NpbV9yZXN1bHRfYmxhbmNlJFRSVUVfQVVDDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxQVVDX0NWID0gc3FydChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxQVVDX1ZBUikvc2ltX3Jlc3VsdF91bmJsYW5jZSRUUlVFX0FVQw0Kc2ltX25hbmN5X2JsYW5jZSRSMUFVQ19DViA9IHNxcnQoc2ltX25hbmN5X2JsYW5jZSRSMUFVQ19WQVIpL3NpbV9uYW5jeV9ibGFuY2UkVFJVRV9BVUMNCnNpbV9uYW5jeV91bmJsYW5jZSRSMUFVQ19DViA9IHNxcnQoc2ltX25hbmN5X3VuYmxhbmNlJFIxQVVDX1ZBUikvc2ltX25hbmN5X3VuYmxhbmNlJFRSVUVfQVVDDQoNCiMjIFZBUiBDVg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX1ZBUikvc2ltX3Jlc3VsdF9ibGFuY2UkUjFBVUNfVkFSDQpzaW1fcmVzdWx0X3VuYmxhbmNlJFIxVkFSX0NWID0gc3FydChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxVkFSX1ZBUikvc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19WQVINCnNpbV9uYW5jeV9ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9uYW5jeV9ibGFuY2UkUjFWQVJfVkFSKS9zaW1fbmFuY3lfYmxhbmNlJFIxQVVDX1ZBUg0Kc2ltX25hbmN5X3VuYmxhbmNlJFIxVkFSX0NWID0gc3FydChzaW1fbmFuY3lfdW5ibGFuY2UkUjFWQVJfVkFSKS9zaW1fbmFuY3lfdW5ibGFuY2UkUjFBVUNfVkFSDQoNCg0Kc2ltX3Jlc3VsdF9ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX1ZBUikNCnNpbV9yZXN1bHRfdW5ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFWQVJfVkFSKQ0Kc2ltX25hbmN5X2JsYW5jZSRSMVZBUl9DViA9IHNxcnQoc2ltX25hbmN5X2JsYW5jZSRSMVZBUl9WQVIpL3NpbV9uYW5jeV9ibGFuY2UkUjFBVUNfVkFSDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFWQVJfQ1YgPSBzcXJ0KHNpbV9uYW5jeV91bmJsYW5jZSRSMVZBUl9WQVIpL3NpbV9uYW5jeV91bmJsYW5jZSRSMUFVQ19WQVINCiMjIENPViBDVg0KDQpzaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX0NWID0gc3FydChzaW1fcmVzdWx0X2JsYW5jZSRSMVIyQ09WX1ZBUikvc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9NQw0Kc2ltX3Jlc3VsdF91bmJsYW5jZSRSMVIyQ09WX0NWID0gc3FydChzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfVkFSKS9zaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfTUMNCnNpbV9uYW5jeV9ibGFuY2UkUjFSMkNPVl9DViA9IHNxcnQoc2ltX25hbmN5X2JsYW5jZSRSMVIyQ09WX1ZBUikvc2ltX25hbmN5X2JsYW5jZSRSMVIyQ09WX01DDQpzaW1fbmFuY3lfdW5ibGFuY2UkUjFSMkNPVl9DViA9IHNxcnQoc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfVkFSKS9zaW1fbmFuY3lfdW5ibGFuY2UkUjFSMkNPVl9NQw0KDQoNCg0KIyMgQ1YgcGxvdCAtLS0tIA0KDQojIyBBVUMgY3YNCkFVQ19DVl9jb21iaW5lID0gZGF0YS5mcmFtZShtZXRob2QgPSByZXAoYygiQ0NBVUMiLCJOYW5jeSIpLGVhY2ggPSAxNTApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IHJlcChyZXAoYygiYmFsYW5jZSIsInVuYmFsYW5jZSIpLGVhY2ggPSA3NSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDViA9IGMoc2ltX3Jlc3VsdF9ibGFuY2UkUjFBVUNfQ1Ysc2ltX3Jlc3VsdF91bmJsYW5jZSRSMUFVQ19DViwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9uYW5jeV9ibGFuY2UkUjFBVUNfQ1Ysc2ltX25hbmN5X3VuYmxhbmNlJFIxQVVDX0NWKSkNCg0KDQpwNCA9IGdncGxvdChBVUNfQ1ZfY29tYmluZSwgYWVzKHg9MTozMDAseSA9IENWKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IG1ldGhvZCwgc2hhcGUgPSBkZXNpZ24pKSsNCiAgZ2d0aXRsZSgiQVVDIENWIENvbXBhcmUiKSArIGxhYnMoeCA9ICJjb25maWd1cmF0aW9ucyIsIHkgPSAiQVVDIENWIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gc2VxKDc1LDIyNSxieSA9IDc1KSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9MC41KSArDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIA0KDQojIyBWQVIgQ1YNCg0KVkFSX0NWX2NvbWJpbmUgPSBkYXRhLmZyYW1lKG1ldGhvZCA9IHJlcChjKCJDQ0FVQyIsIk5hbmN5IiksZWFjaCA9IDE1MCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IHJlcChyZXAoYygiYmFsYW5jZSIsInVuYmFsYW5jZSIpLGVhY2ggPSA3NSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVQyA9IHJlcChBVUMsZWFjaCA9IDI1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhPID0gcmVwKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ID0gcmVwKHJlcChDT1YsMTUpLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1YgPSBjKHNpbV9yZXN1bHRfYmxhbmNlJFIxVkFSX0NWLHNpbV9yZXN1bHRfdW5ibGFuY2UkUjFWQVJfQ1YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fbmFuY3lfYmxhbmNlJFIxVkFSX0NWLHNpbV9uYW5jeV91bmJsYW5jZSRSMVZBUl9DVikpDQoNCg0KcDUgPSBnZ3Bsb3QoVkFSX0NWX2NvbWJpbmUlPiVmaWx0ZXIobWV0aG9kID09ICJDQ0FVQyIpLCBhZXMoeD0xOjE1MCx5ID0gQ1YpKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gQVVDLCBzaGFwZSA9IFJITykpKw0KIGxhYnMoeCA9ICJjb25maWd1cmF0aW9ucyIsIHkgPSAiVkFSIENWIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gc2VxKDc1LDE0OSxieSA9IDc1KSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9MC41KSArDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIA0KDQojIyBDT1YgQ1YNCg0KQ09WX0NWX2NvbWJpbmUgPSBkYXRhLmZyYW1lKG1ldGhvZCA9IHJlcChjKCJDQ0FVQyIsIk5hbmN5IiksZWFjaCA9IDE1MCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gcmVwKHJlcChjKCJiYWxhbmNlIiwidW5iYWxhbmNlIiksZWFjaCA9IDc1KSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVUMgPSByZXAoQVVDLGVhY2ggPSAyNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhPID0gcmVwKHJlcChyZXAoUkhPLGVhY2ggPSA1KSwzKSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSByZXAocmVwKENPViwxNSksMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDViA9IGMoc2ltX3Jlc3VsdF9ibGFuY2UkUjFSMkNPVl9DVixzaW1fcmVzdWx0X3VuYmxhbmNlJFIxUjJDT1ZfQ1YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fbmFuY3lfYmxhbmNlJFIxUjJDT1ZfQ1Ysc2ltX25hbmN5X3VuYmxhbmNlJFIxUjJDT1ZfQ1YpKQ0KDQoNCnA2ID0gZ2dwbG90KENPVl9DVl9jb21iaW5lJT4lZmlsdGVyKG1ldGhvZCA9PSAiQ0NBVUMiKSwgYWVzKHg9MToxNTAseSA9IENWKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IEFVQywgc2hhcGUgPSBSSE8pKSsNCiAgbGFicyh4ID0gImNvbmZpZ3VyYXRpb25zIiwgeSA9ICJDT1YgQ1YiKSArICN5bGltKDAsMi41KSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBzZXEoNzUsMTQ5LGJ5ID0gNzUpLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0wLjUpICsNCiAgdGhlbWVfYncoKSArICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgDQoNCg0KDQpncmlkLmFycmFuZ2UocDIscDMscDUscDYsbnJvdyA9IDIpDQoNCg0KDQoNCmBgYA0KDQoNCg0KIyMgQ29sdW1ucyBpbiB0aGUgYWJvdmUgZmlsZXMNCg0KICArICoqUjFBVUNfTUVBTioqOiBUaGUgbWVhbiBvZiByZWFkZXIgMSBiZXR3ZWVuLWNhc2VzIEFVQyBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLg0KICArICoqUjJBVUNfTUVBTioqOiBUaGUgbWVhbiBvZiByZWFkZXIgMiBiZXR3ZWVuLWNhc2VzIEFVQyBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLg0KICArICoqUjFBVUNfVkFSKio6IFRoZSB2YXJpYW5jZSBvZiByZWFkZXIgMSBiZXR3ZWVuLWNhc2VzIEFVQyBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLiANCiAgKyAqKlIyQVVDX1ZBUioqOiBUaGUgdmFyaWFuY2Ugb2YgcmVhZGVyIDIgYmV0d2Vlbi1jYXNlcyBBVUMgZXN0aW1hdGVzIGFtb25nIDEwLDAwMCBzaW11bGF0aW9ucy4gDQogICsgKipSMVZBUl9NRUFOKio6IFRoZSBtZWFuIG9mIHJlYWRlciAxIGJldHdlZW4tY2FzZXMgQVVDIHZhcmlhbmNlIGVzdGltYXRlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipSMlZBUl9NRUFOKio6IFRoZSBtZWFuIG9mIHJlYWRlciAyIGJldHdlZW4tY2FzZXMgQVVDIHZhcmlhbmNlIGVzdGltYXRlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipSMVZBUl9WQVIqKjogIFRoZSB2YXJpYW5jZSBvZiByZWFkZXIgMSBiZXR3ZWVuLWNhc2VzIEFVQyB2YXJpYW5jZSBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLg0KICArICoqUjJWQVJfVkFSKio6ICBUaGUgdmFyaWFuY2Ugb2YgcmVhZGVyIDIgYmV0d2Vlbi1jYXNlcyBBVUMgdmFyaWFuY2UgZXN0aW1hdGVzIGFtb25nIDEwLDAwMCBzaW11bGF0aW9ucy4NCiAgKyAqKlIxUjJDT1ZfTUVBTioqOiBUaGUgbWVhbiBvZiByZWFkZXIgMSBhbmQgcmVhZGVyIDIgYmV0d2Vlbi1jYXNlcyBBVUMgY292YXJpYW5jZSBlc3RpbWF0ZXMgYW1vbmcgMTAsMDAwIHNpbXVsYXRpb25zLg0KICArICoqUjFSMkNPVl9WQVIqKjogVGhlIHZhcmlhbmNlIG9mIHJlYWRlciAxIGFuZCByZWFkZXIgMiBiZXR3ZWVuLWNhc2VzIEFVQyBjb3ZhcmlhbmNlIGVzdGltYXRlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipUUlVFX1ZBUl9NRUFOKio6IFRoZSBtZWFuIG9mIGJldHdlZW4tY2FzZXMgQVVDIGVzdGltYXRvcidzIHRoZW9yZXRpY2FsIHZhcmlhbmNlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipUUlVFX1ZBUl9WQVIqKjogVGhlIHZhcmlhbmNlIG9mIGJldHdlZW4tY2FzZXMgQVVDIGVzdGltYXRvcidzIHRoZW9yZXRpY2FsIHZhcmlhbmNlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuIA0KICArICoqVFJVRV9DT1ZfTUVBTioqOiBUaGUgbWVhbiBvZiBiZXR3ZWVuLWNhc2VzIEFVQyBlc3RpbWF0b3IncyB0aGVvcmV0aWNhbCBjb3ZhcmlhbmNlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipUUlVFX0NPVl9WQVIqKjogVGhlIHZhcmlhbmNlIG9mIGJldHdlZW4tY2FzZXMgQVVDIGVzdGltYXRvcidzIHRoZW9yZXRpY2FsIGNvdmFyaWFuY2VzIGFtb25nIDEwLDAwMCBzaW11bGF0aW9ucy4gDQogICsgKipSMVIyQ09WX01DKio6IFRoZSBjb3ZhcmlhbmNlIGJldHdlZW4gcmVhZGVyIDEgYW5kIHJlYWRlciAyIGJldHdlZW4tY2FzZXMgQVVDIGVzdGltYXRlcyBhbW9uZyAxMCwwMDAgc2ltdWxhdGlvbnMuDQogICsgKipUUlVFX0FVQyoqOiBUaGUgdHJ1ZSBBVUMgdmFsdWVzIGZvciB0aGUgc2ltdWxhdGVkIGRhdGEuDQogIA0KIyMgNzUgY29uZmlndXJhdGlvbnMgaW4gdGhlIHNpbXVsYXRpb24NCg0KYGBge3IsZWNobz1GQUxTRX0NCg0Ka25pdHI6OmthYmxlKGNvbmZpZ3NfNzUsIGNhcHRpb24gPSAnNzUgY29uZmlndXJhdGlvbnMnKQ0KYGBgDQoNCg==