IyAgIEZpbGU6ICAgICAgIE1ha2VmaWxlLk1QVwojICAgVGFyZ2V0czogICAgQWxsLCBEeW5hbWljLCBTdGF0aWMgKGFuZCBDbGVhbiwgQ2xlYW4tQWxsKQojICAgQ3JlYXRlZDogICAgVHVlc2RheSwgSnVseSAwMiwgMjAwMgojCiMgICBNUFcgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIGV4cGF0IHVuZGVyIHRoZSAiY2xhc3NpYyIgKGkuZS4gcHJlLVgpIE1hYyBPUwojICAgQ29weXJpZ2h0IKkgMjAwMiBEYXJ5bGUgV2Fsa2VyCiMgICBQb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDAyIFRob21hcyBXZWduZXIKIyAgIFNlZSB0aGUgQ09QWUlORyBmaWxlIGZvciBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24KIwojICAgRGVzY3JpcHRpb246IAojICAgVGhpcyBNYWtlZmlsZSBsZXRzIHlvdSBidWlsZCBzdGF0aWMsIGR5bmFtaWMgKGkuZS4gc2hhcmVkKSBhbmQgc3R1YiAKIyAgIHZlcnNpb25zIG9mIHRoZSBleHBhdCBsaWJyYXJ5IGFzIHdlbGwgYXMgdGhlIGVsZW1lbnRzLmMgYW5kIG91dGxpbmUuYyAKIyAgIGV4YW1wbGVzIChidWlsdCBhcyB0b29scyBmb3IgTVBXKS4gVGhpcyBpcyBmb3IgUFBDIG9ubHk7IGl0IHNob3VsZCBiZSAKIyAgIG5vIHByb2JsZW0gdG8gYnVpbGQgYSA2OEsgdmVyc2lvbiBvZiB0aGUgZXhwYXQgbGlicmFyeSwgdGhvdWdoLgojCiMgCVVzYWdlOiAKIwkJCSAgICAgICBCdWlsZHByb2dyYW0gQWxsCiMJCQkgb3IgICAgQnVpbGRwcm9ncmFtIER5bmFtaWMKIwkJCSBvciAgICBCdWlsZHByb2dyYW0gU3RhdGljCiMKIyAgIE5vdGU6IFlvdSBmaXJzdCBoYXZlIHRvIHJlbmFtZSB0aGlzIGZpbGUgdG8gIk1ha2VmaWxlIiwgb3IgdGhlIEJ1aWxkcHJvZ3JhbSAKIyAgICAgICAgIGNvbW1hbmRvIHdpbGwgbm90IHJlY29nbml6ZSBpdC4KIwoKTUFLRUZJTEUgICAgICAgID0gTWFrZWZpbGUKpU1vbmRvQnVpbGSlICAgID0ge01BS0VGSUxFfSAgIyBNYWtlIGJsYW5rIHRvIGF2b2lkIHJlYnVpbGRzIHdoZW4gbWFrZWZpbGUgaXMgbW9kaWZpZWQKCk9iakRpciAgICAgICAgICA9IDoKU3JjRGlyICAgICAgICAgID0gOgpIZHJEaXIgICAgICAgICAgPSA6CgpUb29sRGlyICAgICAgICAgPSA6OmV4YW1wbGVzOgoKSW5jbHVkZXMgICAgICAgID0gLWkge0hkckRpcn0KClN5bS1QUEMgICAgICAgICA9IC1zeW0gb2ZmCgpEZWZpbmVzICAgICAgICAgPSAtZCBNQUNPU19DTEFTU0lDCgpQUENDT3B0aW9ucyAgICAgPSB7SW5jbHVkZXN9IHtTeW0tUFBDfSAtdyAzNSB7RGVmaW5lc30KCkZyYWdOYW1lICAgICAgICA9IGxpYmV4cGF0CgoKIyMjIFNvdXJjZSBGaWxlcyAjIyMKClNyY0ZpbGVzICAgICAgICA9ICC2CgkJCQkgICJ7U3JjRGlyfXhtbHBhcnNlLmMiILYKCQkJCSAgIntTcmNEaXJ9eG1scm9sZS5jIiC2CgkJCQkgICJ7U3JjRGlyfXhtbHRvay5jIgoKVG9vbFNyY0ZpbGVzICAgID0gILYKCQkJCSAgIntUb29sRGlyfWVsZW1lbnRzLmMiILYKCQkJCSAgIntUb29sRGlyfW91dGxpbmUuYyIKCgojIyMgT2JqZWN0IEZpbGVzICMjIwoKT2JqRmlsZXMtUFBDICAgID0gILYKCQkJCSAgIntPYmpEaXJ9eG1scGFyc2UuYy5vIiC2CgkJCQkgICJ7T2JqRGlyfXhtbHJvbGUuYy5vIiC2CgkJCQkgICJ7T2JqRGlyfXhtbHRvay5jLm8iCgpFbGVtZW50VG9vbE9iakZpbGUgICA9ICAie09iakRpcn1lbGVtZW50cy5jLm8iCgpPdXRsaW5lVG9vbE9iakZpbGUgICA9ICAie09iakRpcn1vdXRsaW5lLmMubyIKCgojIyMgTGlicmFyaWVzICMjIwoKU3RMaWJGaWxlcy1QUEMgICAgPSAgtgoJCQkJICAie1BQQ0xpYnJhcmllc31TdGRDUnVudGltZS5vIiC2CgkJCQkgICJ7UFBDTGlicmFyaWVzfVBQQ0NSdW50aW1lLm8iILYKCQkJCSAgIntQUENMaWJyYXJpZXN9UFBDVG9vbExpYnMubyIKClNoTGliRmlsZXMtUFBDICAgID0gILYKCQkJCSAgIntTaGFyZWRMaWJyYXJpZXN9SW50ZXJmYWNlTGliIiC2CgkJCQkgICJ7U2hhcmVkTGlicmFyaWVzfVN0ZENMaWIiILYKCQkJCSAgIntTaGFyZWRMaWJyYXJpZXN9TWF0aExpYiIKCkxpYkZpbGVzLVBQQyAgICA9ICC2CgkJCQkgIHtTdExpYkZpbGVzLVBQQ30gtgoJCQkJICB7U2hMaWJGaWxlcy1QUEN9CgoKIyMjIFNwZWNpYWwgRmlsZXMgIyMjCgpFeHBvcnRGaWxlICAgICAgPSAie09iakRpcn17RnJhZ05hbWV9LmV4cCIKClN0TGliRmlsZSAgICAgICA9ICJ7T2JqRGlyfXtGcmFnTmFtZX0uTXJDLm8iCgpTaExpYkZpbGUgICAgICAgPSAie09iakRpcn17RnJhZ05hbWV9IgoKU3R1YkZpbGUgICAgICAgID0gIntPYmpEaXJ9e0ZyYWdOYW1lfS5zdHViIgoKRWxlbWVudHNUb29sICAgID0gIntUb29sRGlyfWVsZW1lbnRzIgoKT3V0bGluZVRvb2wgICAgID0gIntUb29sRGlyfW91dGxpbmUiCgoKIyMjIERlZmF1bHQgUnVsZXMgIyMjCgouYy5vICDEICAuYyAge6VNb25kb0J1aWxkpX0KCXtQUENDfSB7ZGVwRGlyfXtkZWZhdWx0fS5jIC1vIHt0YXJnRGlyfXtkZWZhdWx0fS5jLm8ge1BQQ0NPcHRpb25zfQoKCiMjIyBCdWlsZCBSdWxlcyAjIyMKCkFsbCAgxCAgRHluYW1pYyB7RWxlbWVudHNUb29sfSB7T3V0bGluZVRvb2x9CgpTdGF0aWMgIMQgIHtTdExpYkZpbGV9CgpEeW5hbWljICDEICBTdGF0aWMge1NoTGliRmlsZX0ge1N0dWJGaWxlfQoKe1N0TGliRmlsZX0gIMTEICB7T2JqRmlsZXMtUFBDfSB7U3RMaWJGaWxlcy1QUEN9IHulTW9uZG9CdWlsZKV9CglQUENMaW5rILYKCQktbyB7VGFyZ30gtgoJCXtPYmpGaWxlcy1QUEN9ILYKCQl7U3RMaWJGaWxlcy1QUEN9ILYKCQl7U3ltLVBQQ30gtgoJCS1tZiAtZCC2CgkJLXQgJ1hDT0YnILYKCQktYyAnTVBTICcgtgoJCS14bSBsCgp7U2hMaWJGaWxlfSAgxMQgIHtTdExpYkZpbGV9IHtTaExpYkZpbGVzLVBQQ30ge0V4cG9ydEZpbGV9IHulTW9uZG9CdWlsZKV9CglQUENMaW5rILYKCQktbyB7VGFyZ30gtgoJCXtTdExpYkZpbGV9ILYKCQl7U2hMaWJGaWxlcy1QUEN9ILYKCQl7U3ltLVBQQ30gtgoJCS1AZXhwb3J0IHtFeHBvcnRGaWxlfSC2CgkJLWZyYWduYW1lIHtGcmFnTmFtZX0gtgoJCS1tZiAtZCC2CgkJLXQgJ3NobGInILYKCQktYyAnPz8/PycgtgoJCS14bSBzCgp7U3R1YkZpbGV9ICDExCAge1NoTGliRmlsZX0ge6VNb25kb0J1aWxkpX0KCXNobGIyc3R1YiAtbyB7VGFyZ30ge1NoTGliRmlsZX0KCntFbGVtZW50c1Rvb2x9ICDExCAge0VsZW1lbnRUb29sT2JqRmlsZX0ge1N0dWJGaWxlfSB7TGliRmlsZXMtUFBDfSB7pU1vbmRvQnVpbGSlfQoJUFBDTGluayC2CgkJLW8ge1Rhcmd9ILYKCQl7RWxlbWVudFRvb2xPYmpGaWxlfSC2CgkJe1N0TGliRmlsZX0gtgoJCXtMaWJGaWxlcy1QUEN9ILYKCQl7U3ltLVBQQ30gtgoJCS1tZiAtZCC2CgkJLXQgJ01QU1QnILYKCQktYyAnTVBTICcKCntPdXRsaW5lVG9vbH0gIMTEICB7T3V0bGluZVRvb2xPYmpGaWxlfSB7U3R1YkZpbGV9IHtMaWJGaWxlcy1QUEN9IHulTW9uZG9CdWlsZKV9CglQUENMaW5rILYKCQktbyB7VGFyZ30gtgoJCXtPdXRsaW5lVG9vbE9iakZpbGV9ILYKCQl7U3RMaWJGaWxlfSC2CgkJe0xpYkZpbGVzLVBQQ30gtgoJCXtTeW0tUFBDfSC2CgkJLW1mIC1kILYKCQktdCAnTVBTVCcgtgoJCS1jICdNUFMgJwoKCiMjIyBTcGVjaWFsIFJ1bGVzICMjIwoKe0V4cG9ydEZpbGV9ICDExCAgIntIZHJEaXJ9ZXhwYXQuaCIge6VNb25kb0J1aWxkpX0KCVN0cmVhbUVkaXQgLWQgtgoJCS1lICIvpSgnWE1MUEFSU0VBUEkoJ8UnKSAnKccwLDHIJ1hNTF8nKFtBLVphLXowLTlfXSspqDEnKCcvIFByaW50ICdYTUxfJyCoMSIgtgoJCSJ7SGRyRGlyfWV4cGF0LmgiID4ge1Rhcmd9CgoKIyMjIFJlcXVpcmVkIERlcGVuZGVuY2llcyAjIyMKCiJ7T2JqRGlyfXhtbHBhcnNlLmMubyIgIMQgICJ7U3JjRGlyfXhtbHBhcnNlLmMiCiJ7T2JqRGlyfXhtbHJvbGUuYy5vIiAgxCAgIntTcmNEaXJ9eG1scm9sZS5jIgoie09iakRpcn14bWx0b2suYy5vIiAgxCAgIntTcmNEaXJ9eG1sdG9rLmMiCgoie09iakRpcn1lbGVtZW50cy5jLm8iICDEICJ7VG9vbERpcn1lbGVtZW50cy5jIgoie09iakRpcn1vdXRsaW5lLmMubyIgIMQgIntUb29sRGlyfW91dGxpbmUuYyIKCgojIyMgT3B0aW9uYWwgRGVwZW5kZW5jaWVzICMjIwojIyMgQnVpbGQgdGhpcyB0YXJnZXQgdG8gY2xlYW4gb3V0IGdlbmVyYXRlZCBpbnRlcm1lZGlhdGUgZmlsZXMuICMjIwoKQ2xlYW4gIMQKCURlbGV0ZSB7T2JqRmlsZXMtUFBDfSB7RXhwb3J0RmlsZX0ge0VsZW1lbnRUb29sT2JqRmlsZX0ge091dGxpbmVUb29sT2JqRmlsZX0KCiMjIyBCdWlsZCB0aGlzIHRhcmdldCB0byBjbGVhbiBvdXQgYWxsIGdlbmVyYXRlZCBmaWxlcy4gIyMjCgpDbGVhbi1BbGwgIMQgIENsZWFuCglEZWxldGUge1N0TGliRmlsZX0ge1NoTGliRmlsZX0ge1N0dWJGaWxlfSB7RWxlbWVudHNUb29sfSB7T3V0bGluZVRvb2x9CgojIyMgQnVpbGQgdGhpcyB0YXJnZXQgdG8gZ2VuZXJhdGUgImluY2x1ZGUgZmlsZSIgZGVwZW5kZW5jaWVzLiAjIyMKCkRlcGVuZGVuY2llcyAgxCAgJE91dE9mRGF0ZQoJTWFrZURlcGVuZCC2CgkJLWFwcGVuZCB7TUFLRUZJTEV9ILYKCQktaWdub3JlICJ7Q0luY2x1ZGVzfSIgtgoJCS1vYmpkaXIgIntPYmpEaXJ9IiC2CgkJLW9iamV4dCAubyC2CgkJe0RlZmluZXN9ILYKCQl7SW5jbHVkZXN9ILYKCQl7U3JjRmlsZXN9CgoK