1778692585
441d63ebbc39eba359c9061ece8482bd-phpdoc%3A9a17b80071d640831d4255b9d739bd09-7aceb18fe57f56aa150f6a6f44cdec3e
s:65688:"TzozMzoicGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlIjoxNDp7czozOToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBuYW1lIjtzOjk6InRlc3QxLnBocCI7czo0NToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBuYW1lc3BhY2VzIjthOjA6e31zOjQzOiIAcGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlAGluY2x1ZGVzIjthOjA6e31zOjQ0OiIAcGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlAGZ1bmN0aW9ucyI7YTowOnt9czo0NDoiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBjb25zdGFudHMiO2E6MDp7fXM6NDI6IgBwaHBEb2N1bWVudG9yXFJlZmxlY3Rpb25cUGhwXEZpbGUAY2xhc3NlcyI7YTowOnt9czo0NToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBpbnRlcmZhY2VzIjthOjA6e31zOjQxOiIAcGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlAHRyYWl0cyI7YTowOnt9czo0MDoiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBlbnVtcyI7YTowOnt9czozOToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBoYXNoIjtzOjMyOiI3YWNlYjE4ZmU1N2Y1NmFhMTUwZjZhNmY0NGNkZWMzZSI7czozOToiAHBocERvY3VtZW50b3JcUmVmbGVjdGlvblxQaHBcRmlsZQBwYXRoIjtzOjE1OiJwYWdlcy90ZXN0MS5waHAiO3M6NDE6IgBwaHBEb2N1bWVudG9yXFJlZmxlY3Rpb25cUGhwXEZpbGUAc291cmNlIjtzOjQ4MzczOiI8P3BocA0Kc2Vzc2lvbl9zdGFydCgpOw0KaWYgKCFpc3NldCgkX1NFU1NJT05bJ2xvZ2dlZF9pbiddKSB8fCAkX1NFU1NJT05bJ2xvZ2dlZF9pbiddICE9PSB0cnVlKSB7DQogIGhlYWRlcignTG9jYXRpb246IGxvZ2luLnBocCcpOw0KICBleGl0Ow0KfQ0KPz4NCg0KPCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+DQogIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+DQoNCiAgPCEtLSBWaWV3cG9ydCBjb25maWd1cmFkbyBjb3JyZWN0YW1lbnRlIHBhcmEgbcOzdmlsZXMgLS0+DQogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSwgc2hyaW5rLXRvLWZpdD1ubyI+DQogIDx0aXRsZT5HZW50ZWxlbGxhIEFsZWxhISB8IDwvdGl0bGU+DQoNCiAgPGxpbmsgaHJlZj0iLi4vdmVuZG9ycy9ib290c3RyYXAvZGlzdC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+DQogIDxsaW5rIGhyZWY9Ii4uL3ZlbmRvcnMvZm9udC1hd2Vzb21lL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4NCiAgPGxpbmsgaHJlZj0iLi4vdmVuZG9ycy9pQ2hlY2svc2tpbnMvZmxhdC9ncmVlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+DQogIDxsaW5rIGhyZWY9Ii4uL3ZlbmRvcnMvYm9vdHN0cmFwLWRhdGVyYW5nZXBpY2tlci9kYXRlcmFuZ2VwaWNrZXIuY3NzIiByZWw9InN0eWxlc2hlZXQiPg0KICA8bGluayBocmVmPSIuLi92ZW5kb3JzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9idWlsZC9jc3MvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4NCiAgPGxpbmsgaHJlZj0iLi4vYnVpbGQvY3NzL2N1c3RvbS5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiPg0KDQogIDwhLS0g4pSA4pSAIEVubGFjZXMgY29ycmVnaWRvcyBkZSBEYXRhVGFibGVzIHBhcmEgQm9vdHN0cmFwIDQg4pSA4pSAIC0tPg0KICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEzLjYvY3NzL2RhdGFUYWJsZXMuYm9vdHN0cmFwNC5taW4uY3NzIj4NCiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cHM6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvcmVzcG9uc2l2ZS8yLjUuMC9jc3MvcmVzcG9uc2l2ZS5ib290c3RyYXA0Lm1pbi5jc3MiPg0KICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC9idXR0b25zLzIuNC4xL2Nzcy9idXR0b25zLmJvb3RzdHJhcDQubWluLmNzcyI+DQoNCiAgPCEtLSBSYXBoYWVsIC0tPg0KICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL21vcnJpcy5qcy8wLjUuMS9tb3JyaXMuY3NzIj4NCjwvaGVhZD4NCg0KPHN0eWxlPg0KICAgIC5ncmFmaWNvLXJlc3BvbnNpdmUgew0KICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgaGVpZ2h0OiAzNTBweDsNCiAgICB9DQoNCiAgICBAbWVkaWEgKG1heC13aWR0aDogODk2cHgpIHsNCiAgICAgICAgLmdyYWZpY28tcmVzcG9uc2l2ZSB7DQogICAgICAgICAgICBoZWlnaHQ6IDI3NXB4OyAvKiBFbiBtw7N2aWxlcyBzZXLDoSBtw6FzIGJham8gKi8NCiAgICAgICAgfQ0KICAgIH0NCiAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsNCiAgICAgICAgLmdyYWZpY28tcmVzcG9uc2l2ZSB7DQogICAgICAgICAgICBoZWlnaHQ6IDIyNXB4OyAvKiBFbiBtw7N2aWxlcyBzZXLDoSBtw6FzIGJham8gKi8NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICNhdmlzby1yb3RhY2lvbiB7DQogICAgICAgIGRpc3BsYXk6IG5vbmU7IC8qIE9jdWx0byBwb3IgZGVmZWN0byAqLw0KICAgICAgICBwb3NpdGlvbjogZml4ZWQ7DQogICAgICAgIHRvcDogMDsgbGVmdDogMDsgd2lkdGg6IDEwMHZ3OyBoZWlnaHQ6IDEwMHZoOw0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDQyLCA2MywgODQsIDAuNTUpOyAvKiBDb2xvciBvc2N1cm8gKi8NCiAgICAgICAgei1pbmRleDogOTk5OTk7DQogICAgICAgIGNvbG9yOiB3aGl0ZTsNCiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICAgICAgcGFkZGluZzogMjBweDsNCiAgICB9DQoNCiAgICAvKiBTb2xvIHNlIG11ZXN0cmEgc2kgZXMgbcOzdmlsICg8NzY4cHgpIHkgZXN0w6EgZW4gdmVydGljYWwgKi8NCiAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSB7DQogICAgICAgIGJvZHk6bm90KC5hdmlzby1jZXJyYWRvKSAjYXZpc28tcm90YWNpb24gew0KICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC5hbmltYWNpb24tbW92aWwgew0KICAgICAgICBmb250LXNpemU6IDgwcHg7DQogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgIC8qIEFuaW1hY2nDs24gcXVlIHNpbXVsYSBlbCBnaXJvIGRlbCB0ZWzDqWZvbm8gKi8NCiAgICAgICAgYW5pbWF0aW9uOiByb3Rhck1vdmlsIDEuNXMgaW5maW5pdGUgZWFzZS1pbi1vdXQgYWx0ZXJuYXRlOw0KICAgIH0NCg0KICAgIEBrZXlmcmFtZXMgcm90YXJNb3ZpbCB7DQogICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH0NCiAgICAgICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7IH0NCiAgICB9DQoNCiAgICAjcmVnbGFzLWNvbnRhaW5lciB0aCwNCiAgICAjcmVnbGFzLWxpc3RhIHRkIHsNCiAgICAgICAgcGFkZGluZzogMS40cHggIWltcG9ydGFudDsNCiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCiAgICB9DQo8L3N0eWxlPg0KDQoNCjxib2R5IGNsYXNzPSJuYXYtbWQiPg0KPCEtLSBQYW50YWxsYSBkZSByZWNvbWVuZGFjacOzbiBkZSBnaXJvIC0tPg0KPGRpdiBpZD0iYXZpc28tcm90YWNpb24iPg0KICA8ZGl2Pg0KICAgIDxpIGNsYXNzPSJmYSBmYS1tb2JpbGUgYW5pbWFjaW9uLW1vdmlsIj48L2k+DQogICAgPGgzIGNsYXNzPSJmb250LXdlaWdodC1ib2xkIj5HaXJhIHR1IGRpc3Bvc2l0aXZvPC9oMz4NCiAgICA8cCBjbGFzcz0ibXQtMiIgc3R5bGU9ImZvbnQtc2l6ZTogMTZweDsgbWF4LXdpZHRoOiAzMDBweDsgbWFyZ2luOiAwIGF1dG87Ij4NCiAgICAgIFBhcmEgdmlzdWFsaXphciBsb3MgZ3LDoWZpY29zIGRlIGZvcm1hIMOzcHRpbWEsIHRlIHJlY29tZW5kYW1vcyBlbCBtb2RvIGhvcml6b250YWwuDQogICAgPC9wPg0KICAgIDxidXR0b24gaWQ9ImJ0bi1jZXJyYXItYXZpc28iIGNsYXNzPSJidG4gYnRuLW91dGxpbmUtbGlnaHQgbXQtNCBweC00Ij4NCiAgICAgIEVudGVuZGlkbw0KICAgIDwvYnV0dG9uPg0KICA8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBjbGFzcz0iY29udGFpbmVyIGJvZHkiPg0KICA8ZGl2IGNsYXNzPSJtYWluX2NvbnRhaW5lciI+DQogICAgPGRpdiBpZD0ic2lkZWJhci1jb250YWluZXIiPjwvZGl2Pg0KICAgIDxkaXYgaWQ9InRvcGJhci1jb250YWluZXIiPjwvZGl2Pg0KDQogICAgPCEtLSBwYWdlIGNvbnRlbnQgLS0+DQogICAgPGRpdiBjbGFzcz0icmlnaHRfY29sIiByb2xlPSJtYWluIj4NCiAgICAgIDxkaXYgY2xhc3M9IiI+DQogICAgICAgIDxkaXYgY2xhc3M9InJvdyI+DQogICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTEyIGNvbC1zbS0xMiBjb2wtMTIiPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ieF9wYW5lbCI+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InhfdGl0bGUiPg0KICAgICAgICAgICAgICAgIDxoMj5HcsOhZmljbyBzb2JyZSBTZWN1bmRhcmlvPC9oMj4NCiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItcmlnaHQgcGFuZWxfdG9vbGJveCI+DQogICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9ImNvbGxhcHNlLWxpbmsiPjxpIGNsYXNzPSJmYSBmYS1jaGV2cm9uLXVwIj48L2k+PC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9ImNsb3NlLWxpbmsiPjxpIGNsYXNzPSJmYSBmYS1jbG9zZSI+PC9pPjwvYT48L2xpPg0KICAgICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPjwvZGl2Pg0KICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ4X2NvbnRlbnQiPg0KDQogICAgICAgICAgICAgICAgPCEtLSBQQU5FTCBERSBDT05UUk9MIC0tPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+DQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIgY29sLXNtLTEyIGNvbC0xMiI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InhfcGFuZWwiPg0KDQogICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYWJlY2VyYSBkZWwgUGFuZWwgLS0+DQogICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPSJ4X3RpdGxlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj48aSBjbGFzcz0iZmEgZmEtc2VhcmNoIj48L2k+IFBhcsOhbWV0cm9zIGRlIGNvbnN1bHRhIDxzbWFsbD5Db25maWd1cmEgbG9zIGZpbHRyb3M8L3NtYWxsPjwvaDI+DQogICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItcmlnaHQgcGFuZWxfdG9vbGJveCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz0iY29sbGFwc2UtbGluayI+PGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tdXAiPjwvaT48L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPg0KDQogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ieF9jb250ZW50Ij4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGSUxBIERFIENPTlRST0xFUyAtLT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBhbGlnbi1pdGVtcy1lbmQgbWItNCI+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSYW5nbyBkZSBGZWNoYXMgLS0+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0zIGNvbC1tZC0xMiBjb2wtc20tMTIgY29sLTEyIG1iLTIgbWItbWQtMiBtYi1sZy0wIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Im1lZGl1bSBmb250LXdlaWdodC1ib2xkIHRleHQtc2Vjb25kYXJ5IG1iLTEiPjEuIFJhbmdvIGRlIEZlY2hhczwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc20gbWItMCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cC1wcmVwZW5kIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLXRleHQgYmctbGlnaHQiPjxpIGNsYXNzPSJmYSBmYS1jYWxlbmRhciI+PC9pPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwaWNrZXItcmFuZ28iIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJJbmljaW8g4oCUIEZpbiIgcmVhZG9ubHkvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWxlcnRhcyBkZSBmZWNoYSBjb21wYWN0YXMgLS0+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZmVjaGEtZXJyb3IiIGNsYXNzPSJ0ZXh0LWRhbmdlciBzbWFsbCBtdC0xIiBzdHlsZT0iZGlzcGxheTpub25lOyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUiPjwvaT4gRmVjaGEgaW52w6FsaWRhLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdG9yIGRlIFRpcG8gLS0+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0zIGNvbC1tZC01IGNvbC1zbS02IGNvbC0xMiBtYi0yIG1iLW1kLTAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibWVkaXVtIGZvbnQtd2VpZ2h0LWJvbGQgdGV4dC1zZWNvbmRhcnkgbWItMSI+Mi4gVGlwbyBkZSBEYXRvPC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJmaWx0cm8tdGlwbyIgY2xhc3M9ImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj7igJQgVG9kb3Mg4oCUPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0b3IgZGUgU3VidGlwbyAtLT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTMgY29sLW1kLTUgY29sLXNtLTYgY29sLTEyIG1iLTIgbWItbWQtMCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJtZWRpdW0gZm9udC13ZWlnaHQtYm9sZCB0ZXh0LXNlY29uZGFyeSBtYi0xIj4zLiBTdWJ0aXBvIHkgTWVkaWRhPC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJmaWx0cm8tc3VidGlwbyIgY2xhc3M9ImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj7igJQgVG9kb3Mg4oCUPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQm90w7NuIEHDsWFkaXIgUmVnbGEgLS0+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0yIGNvbC1tZC0yIGNvbC1zbS0xMiBjb2wtMTIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImFkZF9idXR0b24iIGNsYXNzPSJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tc20gYnRuLWJsb2NrIG1iLTAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBsdXMiPjwvaT4gQcOxYWRpcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVEFCTEEgREUgUkVHTEFTIEFDVElWQVMgLS0+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3cgbWItMyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJtZWRpdW0gZm9udC13ZWlnaHQtYm9sZCB0ZXh0LXNlY29uZGFyeSBtYi0xIj5GaWx0cm9zIEFjdGl2b3M8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLXJlc3BvbnNpdmUgYm9yZGVyIHJvdW5kZWQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1zbSB0YWJsZS1ob3ZlciB0YWJsZS1zdHJpcGVkIG1iLTAgdGV4dC1jZW50ZXIiIHN0eWxlPSJmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDFyZW0iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQgY2xhc3M9InRoZWFkLWxpZ2h0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDMwJTsiIGNsYXNzPSJhbGlnbi1taWRkbGUiPlRpcG88L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDMwJTsiIGNsYXNzPSJhbGlnbi1taWRkbGUiPlN1YnRpcG88L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDMwJTsiIGNsYXNzPSJhbGlnbi1taWRkbGUiPlRpcG8gTWVkaWRhPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOiAxMCU7IiBjbGFzcz0iYWxpZ24tbWlkZGxlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9InJlbW92ZV9idXR0b24iIGNsYXNzPSJidG4gYnRuLWRhbmdlciBidG4tc20gcHktMCBweC0yIG1iLTAiIHRpdGxlPSJMaW1waWFyIFRvZG8iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHJhc2giPjwvaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD0icmVnbGFzLWxpc3RhIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0idGV4dC1tdXRlZCBwLTMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtPi0tLSBObyBzZSBoYW4gYcOxYWRpZG8gZmlsdHJvcyAtLS08L2VtPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8aHIgY2xhc3M9Im10LTIgbWItMyI+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQk9Uw5NOIERFIEFDQ0nDk04gUFJJTkNJUEFMIC0tPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93ICIgPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtNSBjb2wtc20tMTIgbWItMiBtYi1tZC0wIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbSIgPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAtcHJlcGVuZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLXRleHQgYmctbGlnaHQgdGV4dC1zZWNvbmRhcnkgZm9udC13ZWlnaHQtYm9sZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2xvY2stbyBtci0wIj48L2k+IEFncnVwYXIgcG9yOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0iZmlsdHJvLWFncnVwYWNpb24iIGNsYXNzPSJmb3JtLWNvbnRyb2wiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJub25lIj5TaW4gYWdydXBhciAoRGF0b3MgYnJ1dG9zKTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJtaW51dGUiPk1pbnV0b3M8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaG91ciIgc2VsZWN0ZWQ+SG9yYXM8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaG91cjYiPjYgSG9yYXM8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaG91cjEyIj4xMiBIb3Jhczwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJkYXkiPkTDrWFzPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IndlZWsiPlNlbWFuYXM8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibW9udGgiPk1lc2VzPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC01IGNvbC1zbS0xMiBtYi0yIG1iLW1kLTAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwLXByZXBlbmQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbnB1dC1ncm91cC10ZXh0IGJnLWxpZ2h0IHRleHQtc2Vjb25kYXJ5IGZvbnQtd2VpZ2h0LWJvbGQiIHRpdGxlPSJUaWVtcG8gbcOheGltbyBzaW4gZGF0b3MgYW50ZXMgZGUgZm9yemFyIGNhw61kYSBhIDAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWxldmVsLWRvd24gbXItMSI+PC9pPiBDYcOtZGEgYSBDZXJvOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0iZmlsdHJvLWh1ZWNvcyIgY2xhc3M9ImZvcm0tY29udHJvbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYwIiBzZWxlY3RlZD4xIG1pbnV0bzwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI2MDAiPjEwIG1pbnV0b3M8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTgwMCI+MzAgTWludXRvczwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzNjAwIj4xIEhvcmE8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNzIwMCI+MiBIb3Jhczwvb3B0aW9uPiA8IS0tIFBvciBkZWZlY3RvIDJoIC0tPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNDQwMCI+NCBIb3Jhczwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJjdXN0b20iPlBlcnNvbmFsaXphZG8uLi48L29wdGlvbj4gPCEtLSBOVUVWQSBPUENJw5NOIC0tPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iaW5wdXQtY3VzdG9tLXNlZ3VuZG9zIiBjbGFzcz0iZm9ybS1jb250cm9sIGQtbm9uZSIgcGxhY2Vob2xkZXI9IlNlZ3VuZG9zLi4uIiBtaW49IjEiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImFwcGx5X2J1dHRvbiIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyIgc3R5bGU9IndpZHRoOiAxMDAlOyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbGluZS1jaGFydCI+PC9pPiBCdXNjYXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz0iY29sLW1kLTIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iY2xlYXJfYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiIHN0eWxlPSJ3aWR0aDogMTAwJTsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZXJhc2VyIj48L2k+IEJvcnJhcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMSI+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGJyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb250ZW5lZG9yIGRpbsOhbWljbyBwYXJhIGxvcyBncsOhZmljb3MgLS0+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciIGlkPSJjb250ZW5lZG9yLWdyYWZpY29zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBHcsOhZmljb3MgbWVkaWFudGUgSlMgLS0+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gPCEtLSAveF9jb250ZW50IC0tPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gPCEtLSAveF9wYW5lbCAtLT4NCiAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgPCEtLSAgVGFibGEgZGUgZGF0b3MgcHJpbmNpcGFsIChSZXNwb25zaXZlIG5hdGl2byBkZSBEVCkgLS0+DQogICAgICAgICAgICAgICAgPCEtLSA8dGFibGUgaWQ9ImRhdGF0YWJsZS1idXR0b25zIiBjbGFzcz0idGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ib3JkZXJlZCBkdC1yZXNwb25zaXZlIG5vd3JhcCIgc3R5bGU9IndpZHRoOjEwMCUiPg0KICAgICAgICAgICAgICAgICAgPHRoZWFkPg0KICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgPHRoPklEPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICA8dGg+UHJpbWFyaW88L3RoPg0KICAgICAgICAgICAgICAgICAgICAgIDx0aD5TdWJ0aXBvPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICA8dGg+SUQgTWVkaWRhPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICA8dGg+VGlwbyBNZWRpZGE8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgIDx0aD5NZWRpZGE8L3RoPg0KICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgPC90aGVhZD4NCiAgICAgICAgICAgICAgICAgIDx0Ym9keT48L3Rib2R5Pg0KICAgICAgICAgICAgICAgIDwvdGFibGU+IC0tPg0KICAgICAgICAgICAgICAgIDwhLS0gIC9UYWJsYSBkZSBkYXRvcyBwcmluY2lwYWwgLS0+DQoNCiAgICAgICAgICAgICAgPC9kaXY+PCEtLSAveF9jb250ZW50IC0tPg0KICAgICAgICAgICAgPC9kaXY+PCEtLSAveF9wYW5lbCAtLT4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQoNCiAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICAgIDwhLS0gL3BhZ2UgY29udGVudCAtLT4NCg0KICAgIDwhLS0gZm9vdGVyICggcGxhbnRpbGxhICkgLS0+DQogICAgPGZvb3Rlcj4NCiAgICAgIDxkaXYgY2xhc3M9InB1bGwtcmlnaHQiPg0KICAgICAgICBHZW50ZWxlbGxhIC0gQm9vdHN0cmFwIEFkbWluIFRlbXBsYXRlIGJ5IDxhIGhyZWY9Imh0dHBzOi8vY29sb3JsaWIuY29tIj5Db2xvcmxpYjwvYT4NCiAgICAgIDwvZGl2Pg0KICAgICAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPjwvZGl2Pg0KICAgIDwvZm9vdGVyPg0KICAgIDwhLS0gZm9vdGVyIC0tPg0KICA8L2Rpdj4NCjwvZGl2Pg0KDQo8IS0tIGpRdWVyeSAtLT4NCjxzY3JpcHQgc3JjPSIuLi92ZW5kb3JzL2pxdWVyeS9kaXN0L2pxdWVyeS5taW4uanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCBzcmM9Ii4uL3ZlbmRvcnMvYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLmJ1bmRsZS5taW4uanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCBzcmM9Ii4uL3ZlbmRvcnMvZmFzdGNsaWNrL2xpYi9mYXN0Y2xpY2suanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCBzcmM9Ii4uL3ZlbmRvcnMvaUNoZWNrL2ljaGVjay5taW4uanMiPjwvc2NyaXB0Pg0KDQo8IS0tIOKUgOKUgCBFbmxhY2VzIGNvcnJlZ2lkb3MgZGUgRGF0YVRhYmxlcyBwYXJhIEJvb3RzdHJhcCA0IOKUgOKUgCAtLT4NCjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEzLjYvanMvanF1ZXJ5LmRhdGFUYWJsZXMubWluLmpzIj48L3NjcmlwdD4NCjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEzLjYvanMvZGF0YVRhYmxlcy5ib290c3RyYXA0Lm1pbi5qcyI+PC9zY3JpcHQ+DQoNCjwhLS0gRXh0ZW5zaW9uZXMgcGFyYSBxdWUgZWwgTW9iaWxlIFJlc3BvbnNpdmUgbm8gc29icmVzYWxnYSAtLT4NCjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC9yZXNwb25zaXZlLzIuNS4wL2pzL2RhdGFUYWJsZXMucmVzcG9uc2l2ZS5taW4uanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmRhdGF0YWJsZXMubmV0L3Jlc3BvbnNpdmUvMi41LjAvanMvcmVzcG9uc2l2ZS5ib290c3RyYXA0Lm1pbi5qcyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvYnV0dG9ucy8yLjQuMS9qcy9kYXRhVGFibGVzLmJ1dHRvbnMubWluLmpzIj48L3NjcmlwdD4NCjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5kYXRhdGFibGVzLm5ldC9idXR0b25zLzIuNC4xL2pzL2J1dHRvbnMuYm9vdHN0cmFwNC5taW4uanMiPjwvc2NyaXB0Pg0KDQo8c2NyaXB0IHNyYz0iLi4vdmVuZG9ycy9tb21lbnQvbWluL21vbWVudC13aXRoLWxvY2FsZXMubWluLmpzIj48L3NjcmlwdD4NCjxzY3JpcHQgc3JjPSIuLi92ZW5kb3JzL2Jvb3RzdHJhcC1kYXRlcmFuZ2VwaWNrZXIvZGF0ZXJhbmdlcGlja2VyLmpzIj48L3NjcmlwdD4NCjxzY3JpcHQgc3JjPSIuLi92ZW5kb3JzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9idWlsZC9qcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmpzIj48L3NjcmlwdD4NCg0KPCEtLSDilIDilIAgTElCUkVSw41BUyBQQVJBIEdSw4FGSUNPUyAoUmFwaGFlbCArIE1vcnJpcykg4pSA4pSAIC0tPg0KPHNjcmlwdCBzcmM9Ii4uL3ZlbmRvcnMvcmFwaGFlbC9yYXBoYWVsLm1pbi5qcyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHNyYz0iLi4vdmVuZG9ycy9tb3JyaXMuanMvbW9ycmlzLm1pbi5qcyI+PC9zY3JpcHQ+DQoNCjwhLS0gRWNoYXJ0IC0tPg0KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vZWNoYXJ0c0A1LjUuMC9kaXN0L2VjaGFydHMubWluLmpzIj48L3NjcmlwdD4NCg0KPCEtLSBTZW1pbGxhIC0tPg0KPHNjcmlwdCBzcmM9Ii8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3NlZWRyYW5kb20vMy4wLjUvc2VlZHJhbmRvbS5taW4uanMiPjwvc2NyaXB0Pg0KDQo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvanN6aXAvMy4xMC4xL2pzemlwLm1pbi5qcyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvcGRmbWFrZS8wLjIuNy9wZGZtYWtlLm1pbi5qcyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvcGRmbWFrZS8wLjIuNy92ZnNfZm9udHMuanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmRhdGF0YWJsZXMubmV0L2J1dHRvbnMvMi40LjEvanMvYnV0dG9ucy5odG1sNS5taW4uanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmRhdGF0YWJsZXMubmV0L2J1dHRvbnMvMi40LjEvanMvYnV0dG9ucy5wcmludC5taW4uanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCBzcmM9Ii4uL3ZlbmRvcnMvcG5vdGlmeS9kaXN0L3Bub3RpZnkuanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCBzcmM9Ii4uL3ZlbmRvcnMvcG5vdGlmeS9kaXN0L3Bub3RpZnkuYnV0dG9ucy5qcyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHNyYz0iLi4vdmVuZG9ycy9wbm90aWZ5L2Rpc3QvcG5vdGlmeS5ub25ibG9jay5qcyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHNyYz0ibmF2YmFycy9uYXZiYXJzLWxvYWRlci5qcyI+PC9zY3JpcHQ+DQoNCjxzY3JpcHQ+DQogICAgLy8gLS0gVkFSSUFCTEVTICAtLS0tLS0tLS0NCiAgICB2YXIgdGlwb3MgICAgICAgICAgICA9IFtdOyAgdmFyIHRhYmxhOw0KDQogICAgdmFyIHRpcG9TZWNJZCAgICAgICAgPSAtMTsgdmFyIHRpcG9TZWMgICAgICAgICAgPSAnJzsNCiAgICB2YXIgc3VidGlwb1NlY0lkICAgICA9IC0xOyB2YXIgc3VidGlwb1NlYyAgICAgICA9ICcnOw0KICAgIHZhciB0aXBvTWVkaWRhU2VjSWQgID0gLTE7IHZhciB0aXBvTWVkaWRhU2VjICAgID0gJyc7DQogICAgdmFyIHN1YnRpcG9QcmltYXJpb0lkPSAtMTsNCg0KICAgIHZhciByZWdsYXMgICAgICAgICAgID0gW107DQoNCiAgICB2YXIgc2VjdW5kYXJpb3MgICAgICA9IFtdOw0KDQogICAgLy8gLS0gRlVOQ0lPTkVTIElOSUNJTyAtLS0tLS0tDQogICAgJC5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5wdXNoKGZ1bmN0aW9uIChzZXR0aW5ncywgZGF0YSkgew0KICAgICAgICBpZiAocmVnbGFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7DQogICAgICAgIHJldHVybiByZWdsYXMuc29tZShmdW5jdGlvbiAocikgew0KICAgICAgICAgICAgdmFyIGNvaW5jaWRlVGlwbyAgID0gIXIudGlwbyAgICAgICB8fCBkYXRhWzFdID09PSByLnRpcG87DQogICAgICAgICAgICB2YXIgY29pbmNpZGVTdWIgICAgPSAhci5zdWJ0aXBvICAgIHx8IGRhdGFbMl0gPT09IHIuc3VidGlwbzsNCiAgICAgICAgICAgIHZhciBjb2luY2lkZU1lZGlkYSA9ICFyLnRpcG9tZWRpZGEgfHwgZGF0YVs0XSA9PT0gci50aXBvbWVkaWRhOw0KICAgICAgICAgICAgcmV0dXJuIGNvaW5jaWRlVGlwbyAmJiBjb2luY2lkZVN1YiAmJiBjb2luY2lkZU1lZGlkYTsNCiAgICAgICAgfSk7DQogICAgfSk7DQoNCiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7DQogICAgICAgIG9idGVuZXJfdGlwb3MoKS5kb25lKGZ1bmN0aW9uIChkYXRvcykgew0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdG9zKSAmJiBkYXRvcy5sZW5ndGggPiAwKSBpbmljaWFyX2NvbWJvYm94KCk7IC8vIOKGkCBBcnJheS5pc0FycmF5DQogICAgICAgICAgZWxzZSBjb25zb2xlLndhcm4oJ1NpbiBkYXRvcyBvIHJlc3B1ZXN0YSBpbmVzcGVyYWRhOicsIGRhdG9zKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJCgnI2ZpbHRyby10aXBvJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciByYXcgPSAkKHRoaXMpLnZhbCgpLCBwYXJ0ZXMgPSByYXcuc3BsaXQoJ3wnKTsNCg0KICAgICAgICAgICAgaWYgKHJhdyA9PT0gJycgfHwgcGFydGVzLmxlbmd0aCA8IDIpIHsgdGlwb1NlY0lkID0gLTE7IHRpcG9TZWMgPSAnJzsgfQ0KICAgICAgICAgICAgZWxzZSB7IHRpcG9TZWNJZCA9IHBhcnNlSW50KHBhcnRlc1swXSwgMTApOyB0aXBvU2VjID0gcGFydGVzWzFdOyB9DQoNCiAgICAgICAgICAgIHN1YnRpcG9TZWNJZCA9IC0xOyBzdWJ0aXBvU2VjID0gJyc7DQogICAgICAgICAgICB0aXBvTWVkaWRhU2VjSWQgPSAtMTsgdGlwb01lZGlkYVNlYyA9ICcnOw0KDQogICAgICAgICAgICBwb2JsYXJfc3VidGlwbyh0aXBvU2VjKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJCgnI2ZpbHRyby1odWVjb3MnKS5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PT0gJ2N1c3RvbScpIHsNCiAgICAgICAgICAgICAgICAkKCcjaW5wdXQtY3VzdG9tLXNlZ3VuZG9zJykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpLmZvY3VzKCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICQoJyNpbnB1dC1jdXN0b20tc2VndW5kb3MnKS5hZGRDbGFzcygnZC1ub25lJyk7DQogICAgICAgICAgICAgICAgaWYgKCQodGhpcykudmFsKCkgJiYgc2VjdW5kYXJpb3MubGVuZ3RoID4gMCkgZGlidWphcl9ncmFmaWNvcyhzZWN1bmRhcmlvcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGxldCBkZWJvdW5jZVRpbWVyID0gbnVsbDsNCg0KICAgICAgICAkKCcjaW5wdXQtY3VzdG9tLXNlZ3VuZG9zJykub24oJ2lucHV0JywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJzZUludCgkKHRoaXMpLnZhbCgpKTsNCiAgICAgICAgICAgIGlmICghdmFsIHx8IHZhbCA8PSAwKSByZXR1cm47DQoNCiAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyKTsNCiAgICAgICAgICAgIGRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIGlmIChzZWN1bmRhcmlvcykgZGlidWphcl9ncmFmaWNvcyhzZWN1bmRhcmlvcyk7DQogICAgICAgICAgICB9LCA2MDApOyAvLyBlc3BlcmEgNjAwbXMgdHJhcyBsYSDDumx0aW1hIHRlY2xhDQogICAgICAgIH0pOw0KDQogICAgICAgICQoJyNmaWx0cm8tc3VidGlwbycpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgcmF3ID0gJCh0aGlzKS52YWwoKSwgcGFydGVzID0gcmF3LnNwbGl0KCd8Jyk7DQogICAgICAgICAgICBpZiAocmF3ID09PSAnJyB8fCBwYXJ0ZXMubGVuZ3RoIDwgNSkgew0KICAgICAgICAgICAgICAgIHN1YnRpcG9TZWNJZCA9IC0xOyBzdWJ0aXBvU2VjID0gJyc7DQogICAgICAgICAgICAgICAgdGlwb01lZGlkYVNlY0lkID0gLTE7IHRpcG9NZWRpZGFTZWMgPSAnJzsNCiAgICAgICAgICAgICAgICBzdWJ0aXBvUHJpbWFyaW9JZCA9IC0xOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBzdWJ0aXBvU2VjSWQgICAgICA9IHBhcnNlSW50KHBhcnRlc1swXSwgMTApOw0KICAgICAgICAgICAgICAgIHN1YnRpcG9TZWMgICAgICAgID0gcGFydGVzWzFdOw0KICAgICAgICAgICAgICAgIHRpcG9NZWRpZGFTZWNJZCAgID0gcGFyc2VJbnQocGFydGVzWzJdLCAxMCk7DQogICAgICAgICAgICAgICAgdGlwb01lZGlkYVNlYyAgICAgPSBwYXJ0ZXNbM107DQogICAgICAgICAgICAgICAgc3VidGlwb1ByaW1hcmlvSWQgPSBwYXJzZUludChwYXJ0ZXNbNF0sIDEwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgJCgnI2FkZF9idXR0b24nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgeWFFeGlzdGUgPSByZWdsYXMuc29tZShyID0+DQogICAgICAgICAgICAgICAgci50aXBvU2VjSWQgICAgICAgPT09IHRpcG9TZWNJZCAgICAgICAmJg0KICAgICAgICAgICAgICAgIHIuc3VidGlwb1NlY0lkICAgID09PSBzdWJ0aXBvU2VjSWQgICAgICYmDQogICAgICAgICAgICAgICAgci50aXBvTWVkaWRhU2VjSWQgPT09IHRpcG9NZWRpZGFTZWNJZA0KICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgaWYgKHlhRXhpc3RlKSByZXR1cm47DQoNCiAgICAgICAgICAgIHJlZ2xhcy5wdXNoKHsNCiAgICAgICAgICAgICAgICB0aXBvU2VjSWQgICAgICAgIDogdGlwb1NlY0lkLA0KICAgICAgICAgICAgICAgIHN1YnRpcG9TZWNJZCAgICAgOiBzdWJ0aXBvU2VjSWQsDQogICAgICAgICAgICAgICAgdGlwb01lZGlkYVNlY0lkICA6IHRpcG9NZWRpZGFTZWNJZCwNCiAgICAgICAgICAgICAgICBzdWJ0aXBvUHJpbWFyaW9JZDogc3VidGlwb1ByaW1hcmlvSWQsDQogICAgICAgICAgICAgICAgdGlwbyAgICAgIDogdGlwb1NlYywNCiAgICAgICAgICAgICAgICBzdWJ0aXBvICAgOiBzdWJ0aXBvU2VjLA0KICAgICAgICAgICAgICAgIHRpcG9tZWRpZGE6IHRpcG9NZWRpZGFTZWMNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICByZW5kZXJpemFyX3JlZ2xhcygpOw0KICAgICAgICB9KTsNCg0KICAgICAgICAkKCcjcmVtb3ZlX2J1dHRvbicpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJlZ2xhcyA9W107DQogICAgICAgICAgICByZW5kZXJpemFyX3JlZ2xhcygpOw0KICAgICAgICB9KTsNCg0KICAgICAgICAkKCcjYXBwbHlfYnV0dG9uJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgLy8gYXBsaWNhcl9maWx0cm9zKCk7DQogICAgICAgICAgICAvLyBkaWJ1amFyX3RhYmxhKCk7DQogICAgICAgICAgICBvYnRlbmVyX3NlY3VuZGFyaW8od2luZG93Lm9idGVuZXJSYW5nb0ZlY2hhcygpKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJCgnI2ZpbHRyby1hZ3J1cGFjaW9uJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBpZiAoIHNlY3VuZGFyaW9zLmxlbmd0aCA+IDAgKSBkaWJ1amFyX2dyYWZpY29zKHNlY3VuZGFyaW9zKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5idG4tZWxpbWluYXItcmVnbGEnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZWdsYXMuc3BsaWNlKCQodGhpcykuZGF0YSgnaW5kZXgnKSwgMSk7DQogICAgICAgICAgICByZW5kZXJpemFyX3JlZ2xhcygpOw0KICAgICAgICB9KTsNCg0KICAgICAgICAvLyBEZWxlZ2FjacOzbiBkZSBldmVudG9zIHBhcmEgcGFuZWxlcyBkaW7DoW1pY29zIChNaW5pbWl6YXIgeSBDZXJyYXIpDQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuY29sbGFwc2UtbGluay1kaW5hbWljbycsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdmFyICRwYW5lbCA9ICQodGhpcykuY2xvc2VzdCgnLnhfcGFuZWwnKSwNCiAgICAgICAgICAgICAgICAkY29udGVudCA9ICRwYW5lbC5maW5kKCcueF9jb250ZW50Jyk7DQogICAgICAgICAgICAkcGFuZWwuZmluZCgnaScpLnRvZ2dsZUNsYXNzKCdmYS1jaGV2cm9uLXVwIGZhLWNoZXZyb24tZG93bicpOw0KICAgICAgICAgICAgJGNvbnRlbnQuc2xpZGVUb2dnbGUoMjAwKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5jbG9zZS1saW5rLWRpbmFtaWNvJywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb2wtZ3JhZmljbycpLmZhZGVPdXQoMzAwLCBmdW5jdGlvbigpIHsgJCh0aGlzKS5yZW1vdmUoKTsgfSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIC8vIENlcnJhciBlbCBhdmlzbyBkZSByb3RhY2nDs24geSBubyB2b2x2ZXIgYSBtb3N0cmFybG8gZW4gZXN0YSBzZXNpw7NuDQogICAgICAgICQoJyNidG4tY2VycmFyLWF2aXNvJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ2F2aXNvLWNlcnJhZG8nKTsNCiAgICAgICAgICAgICQoJyNhdmlzby1yb3RhY2lvbicpLmZhZGVPdXQoMzAwKTsNCiAgICAgICAgfSk7DQogICAgfSk7DQoNCiAgICAvLyAtLSBBSkFYIC0tLS0tLS0tLQ0KICAgIGZ1bmN0aW9uIG9idGVuZXJfdGlwb3MoKSB7DQogICAgICByZXR1cm4gJC5hamF4KHsNCiAgICAgICAgdXJsOiAnLi4vLi4vb2xpL2JhY2tlbmQvYXBpLnBocCcsDQogICAgICAgIG1ldGhvZDogJ1BPU1QnLA0KICAgICAgICBkYXRhVHlwZTogJ2pzb24nLCAgICAgICAgICAgICAgICAgICAvLyDihpAgYcOxYWRpciBlc3RvDQogICAgICAgIGRhdGE6IHsgYWN0aW9uOiAnbG9hZF90aXBvJyB9LA0KICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsNCiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHsgIC8vIOKGkCB2YWxpZGFyIHF1ZSBlcyBhcnJheQ0KICAgICAgICAgICAgdGlwb3MgPSByZXNwb25zZTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY29uc29sZS5lcnJvcignbG9hZF90aXBvIG5vIGRldm9sdmnDsyB1biBhcnJheTonLCByZXNwb25zZSk7DQogICAgICAgICAgICB0aXBvcyA9IFtdOw0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIsIHN0YXR1cywgZXJyb3IpIHsNCiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBBSkFYIHRpcG9zOicsIGVycm9yKTsNCiAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZXNwdWVzdGEgcmF3IGRlIFBIUDonLCB4aHIucmVzcG9uc2VUZXh0KTsgLy8g4oaQIGVzdG8gdGUgbXVlc3RyYSBlbCBIVE1MIGRlbCBlcnJvcg0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBvYnRlbmVyX3NlY3VuZGFyaW8oZmVjaGEpIHsNCiAgICAgICAgdmFyIHByaW1hcmlvcyA9IHJlZ2xhcy5tYXAociA9PiByLnN1YnRpcG9QcmltYXJpb0lkKTsNCiAgICAgICAgdmFyIHRpcG9zZWNzICA9IHJlZ2xhcy5tYXAociA9PiByLnRpcG9NZWRpZGFTZWNJZCk7DQogICAgICAgIHZhciBzdHNMaXN0ICAgPSByZWdsYXMubWFwKHIgPT4gci5zdWJ0aXBvU2VjSWQpOw0KDQogICAgICAgIGlmIChwcmltYXJpb3MubGVuZ3RoID09PSAwIHx8IHRpcG9zZWNzLmxlbmd0aCA9PT0gMCB8fCBzdHNMaXN0Lmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgc2VjdW5kYXJpb3MgPSBbXTsNCiAgICAgICAgICAgIHZhciAkY29udGVuZWRvciA9ICQoJyNjb250ZW5lZG9yLWdyYWZpY29zJyk7DQogICAgICAgICAgICAkY29udGVuZWRvci5lbXB0eSgpOw0KICAgICAgICAgICAgJGNvbnRlbmVkb3IuYXBwZW5kKCc8ZGl2IGNsYXNzPSJjb2wtMTIiPjxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmcgcC0yIj5ObyBzZSBpbnRyb2R1am8gbmluZ3VuIGZpbHRyby48L2Rpdj48L2Rpdj4nKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAkLmFqYXgoew0KICAgICAgICAgICAgdXJsOiAnLi4vLi4vb2xpL2JhY2tlbmQvYXBpLnBocCcsDQogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgICBhY3Rpb24gICA6ICdsb2FkX3NlY3VuZGFyaW8nLA0KICAgICAgICAgICAgICAgIHByaW1hcmlvIDogcHJpbWFyaW9zLA0KICAgICAgICAgICAgICAgIHRpcG9zZWMgIDogdGlwb3NlY3MsDQogICAgICAgICAgICAgICAgZmVjaGFfaW5pOiBmZWNoYVsnaW5pY2lvJ10sDQogICAgICAgICAgICAgICAgZmVjaGFfZmluOiBmZWNoYVsnZmluJ10sDQogICAgICAgICAgICAgICAgc3RzICAgICAgOiBzdHNMaXN0DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7DQogICAgICAgICAgICAgICAgc2VjdW5kYXJpb3MgPSByZXNwb25zZSB8fCBbXTsNCiAgICAgICAgICAgICAgICBkaWJ1amFyX2dyYWZpY29zKHNlY3VuZGFyaW9zKTsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiZGlidWphZG8iKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oeGhyLCBzdGF0dXMsIGVycm9yKSB7IGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNlY3VuZGFyaW9zOiAnLCBlcnJvcik7IH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gb2J0ZW5lcl91bHRpbWFGZWNoQ2FtcGFuaWEoKXsNCiAgICAgICAgcmV0dXJuICQuYWpheCh7DQogICAgICAgICAgICB1cmw6ICcuLi8uLi9vbGkvYmFja2VuZC9hcGkucGhwJywNCiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLA0KICAgICAgICAgICAgZGF0YTogeyBhY3Rpb246ICdsYXN0RmVjaGFDYW1wYW5pYScgfSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZSkgew0KICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiRmVjaGEgw7psdGltYSBjYW1wYcOxYSByZWNpYmlkYToiLCByZXNwb25zZSk7DQogICAgICAgICAgICAgICAgICAgIHZhciBmZWNoYUluaWNpbyA9IG1vbWVudChyZXNwb25zZSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoZmVjaGFJbmljaW8uaXNWYWxpZCgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmVjaGFGaW4gPSBmZWNoYUluaWNpby5jbG9uZSgpLmFkZCgxLCAneWVhcicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRk1UID0gJ0REL01NL1lZWVkgSEg6bW06c3MnOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ1JhbmdvID0gZmVjaGFJbmljaW8uZm9ybWF0KEZNVCkgKyAnICDigJQgICcgKyBmZWNoYUZpbi5mb3JtYXQoRk1UKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3BpY2tlci1yYW5nbycpLnZhbChzdHJpbmdSYW5nbyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwaWNrZXIgPSAkKCcjcGlja2VyLXJhbmdvJykuZGF0YSgnZGF0ZXJhbmdlcGlja2VyJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGlja2VyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2VyLnNldFN0YXJ0RGF0ZShmZWNoYUluaWNpbyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2VyLnNldEVuZERhdGUoZmVjaGFGaW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJMYSBmZWNoYSByZWNpYmlkYSBkZSBsYSBBUEkgbm8gZXMgdsOhbGlkYToiLCByZXNwb25zZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIsIHN0YXR1cywgZXJyb3IpIHsgY29uc29sZS5lcnJvcignRXJyb3IgQUpBWCB0aXBvczonLCBlcnJvcik7IH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgLy8gLS0gTU9OVEFKRSBDT01CT0JPWCAtLS0tLS0NCiAgICBmdW5jdGlvbiBidWlsZFN1YnRpcG9WYWx1ZShzdWJ0aXBvUywgcHJpbWFyaW9JZCkgew0KICAgICAgICB2YXIgbWVkaWRhSWQgICAgID0gc3VidGlwb1MudGlwb1NlY3VuZGFyaW8gPyBzdWJ0aXBvUy50aXBvU2VjdW5kYXJpby5pZCAgICAgOiAnJzsNCiAgICAgICAgdmFyIG1lZGlkYU5vbWJyZSA9IHN1YnRpcG9TLnRpcG9TZWN1bmRhcmlvID8gc3VidGlwb1MudGlwb1NlY3VuZGFyaW8ubm9tYnJlIDogJyc7DQogICAgICAgIHJldHVybiBgJHtzdWJ0aXBvUy5pZH18JHtzdWJ0aXBvUy5ldGlxdWV0YX18JHttZWRpZGFJZH18JHttZWRpZGFOb21icmV9fCR7cHJpbWFyaW9JZCA/PyAnJ31gOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGluaWNpYXJfY29tYm9ib3goKSB7DQogICAgICAgIHZhciAkdCA9ICQoJyNmaWx0cm8tdGlwbycpLCAkcyA9ICQoJyNmaWx0cm8tc3VidGlwbycpOw0KICAgICAgICB0aXBvcy5mb3JFYWNoKGZ1bmN0aW9uICh0aXBvKSB7DQogICAgICAgICAgICAkdC5hcHBlbmQoYDxvcHRpb24gdmFsdWU9IiR7dGlwby5pZH18JHt0aXBvLm5vbWJyZX0iPiR7dGlwby5ub21icmV9PC9vcHRpb24+YCk7DQogICAgICAgICAgICB0aXBvLnN1YnRpcG9QcmltYXJpby5mb3JFYWNoKGZ1bmN0aW9uIChzdWJ0aXBvUCkgew0KICAgICAgICAgICAgICAgIHN1YnRpcG9QLnN1YnRpcG9TZWN1bmRhcmlvLmZvckVhY2goZnVuY3Rpb24gKHN1YnRpcG9TKSB7DQogICAgICAgICAgICAgICAgICAgICRzLmFwcGVuZCgNCiAgICAgICAgICAgICAgICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPSIke2J1aWxkU3VidGlwb1ZhbHVlKHN1YnRpcG9TLCBzdWJ0aXBvUC5pZCl9Ij5gICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGAke3N1YnRpcG9TLmV0aXF1ZXRhfSAtICR7c3VidGlwb1MudGlwb1NlY3VuZGFyaW8gPyBzdWJ0aXBvUy50aXBvU2VjdW5kYXJpby5ub21icmUgOiAnJ308L29wdGlvbj5gDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcG9ibGFyX3N1YnRpcG8odGlwb1NlbCkgew0KICAgICAgICB2YXIgJHMgPSAkKCcjZmlsdHJvLXN1YnRpcG8nKTsNCiAgICAgICAgdmFyIHRpcG9TZWxlY3QgPSB0aXBvcy5maW5kKHQgPT4gdC5ub21icmUgPT09IHRpcG9TZWwpOw0KICAgICAgICAkcy5lbXB0eSgpLmFwcGVuZChgPG9wdGlvbiB2YWx1ZT0iIj7igJQgVG9kb3MgbG9zIHN1YnRpcG9zIOKAlDwvb3B0aW9uPmApOw0KICAgICAgICB2YXIgZnVlbnRlID0gdGlwb1NlbGVjdCA/IHRpcG9TZWxlY3Quc3VidGlwb1ByaW1hcmlvDQogICAgICAgICAgICA6IHRpcG9zLmZsYXRNYXAodCA9PiB0LnN1YnRpcG9QcmltYXJpbyk7DQogICAgICAgIGZ1ZW50ZS5mb3JFYWNoKGZ1bmN0aW9uIChzdWJ0aXBvUCkgew0KICAgICAgICAgICAgc3VidGlwb1Auc3VidGlwb1NlY3VuZGFyaW8uZm9yRWFjaChmdW5jdGlvbiAoc3VidGlwb1MpIHsNCiAgICAgICAgICAgICAgICAkcy5hcHBlbmQoDQogICAgICAgICAgICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPSIke2J1aWxkU3VidGlwb1ZhbHVlKHN1YnRpcG9TLCBzdWJ0aXBvUC5pZCl9Ij5gICsNCiAgICAgICAgICAgICAgICAgICAgYCR7c3VidGlwb1MuZXRpcXVldGF9IC0gJHtzdWJ0aXBvUy50aXBvU2VjdW5kYXJpbyA/IHN1YnRpcG9TLnRpcG9TZWN1bmRhcmlvLm5vbWJyZSA6ICcnfTwvb3B0aW9uPmANCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIC8vIC0tIEdSw4FGSUNBIC0tLS0tLQ0KICAgIGZ1bmN0aW9uIGRpYnVqYXJfZ3JhZmljb3MoZGF0b3NCcnV0b3MpIHsNCiAgICAgICAgdmFyICRjb250ZW5lZG9yID0gJCgnI2NvbnRlbmVkb3ItZ3JhZmljb3MnKTsNCiAgICAgICAgJGNvbnRlbmVkb3IuZW1wdHkoKTsNCg0KICAgICAgICBpZiAoIWRhdG9zQnJ1dG9zIHx8IGRhdG9zQnJ1dG9zLmxlbmd0aCA9PT0gMCApIHsNCiAgICAgICAgICAgICRjb250ZW5lZG9yLmFwcGVuZCgnPGRpdiBjbGFzcz0iY29sLTEyIj48ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIHAtMiI+U2luIGRhdG9zIHBhcmEgbW9zdHJhci48L2Rpdj48L2Rpdj4nKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBpbnRlcnZhbG8gPSAkKCcjZmlsdHJvLWFncnVwYWNpb24nKS52YWwoKTsNCg0KICAgICAgICB2YXIgbWF4R2FwU2VndW5kb3NVc3VhcmlvID0gMDsNCiAgICAgICAgdmFyIHZhbG9yU2VsZWN0SHVlY29zID0gJCgnI2ZpbHRyby1odWVjb3MnKS52YWwoKTsNCg0KICAgICAgICBpZiAodmFsb3JTZWxlY3RIdWVjb3MgPT09ICdjdXN0b20nKSB7DQogICAgICAgICAgICBtYXhHYXBTZWd1bmRvc1VzdWFyaW8gPSBwYXJzZUludCgkKCcjaW5wdXQtY3VzdG9tLXNlZ3VuZG9zJykudmFsKCkpIHx8IDA7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBtYXhHYXBTZWd1bmRvc1VzdWFyaW8gPSBwYXJzZUludCh2YWxvclNlbGVjdEh1ZWNvcywgMTApIHx8IDA7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgc2VndW5kb3NEZWxJbnRlcnZhbG8gPSBvYnRlbmVyU2VndW5kb3NJbnRlcnZhbG8oaW50ZXJ2YWxvKTsNCg0KICAgICAgICAvLyBDYWxjdWxhbW9zIGVsIHVtYnJhbCBmaW5hbA0KICAgICAgICB2YXIgdW1icmFsRmluYWxTZWd1bmRvcyA9IDA7DQogICAgICAgIGlmIChtYXhHYXBTZWd1bmRvc1VzdWFyaW8gPiAwKSB7DQogICAgICAgICAgICB1bWJyYWxGaW5hbFNlZ3VuZG9zID0gTWF0aC5tYXgobWF4R2FwU2VndW5kb3NVc3VhcmlvLCBzZWd1bmRvc0RlbEludGVydmFsbyk7DQogICAgICAgIH0NCg0KICAgICAgICBNYXRoLnNlZWRyYW5kb20oMSk7DQogICAgICAgIHZhciBwYWxldGFDb2xvcmVzID0gZ2VuZXJhclBhbGV0YURpc3RpbnRhKHJlZ2xhcy5sZW5ndGgpOw0KICAgICAgICB2YXIgZGF0b3NDb21iaW5hZG9zID0ge307DQogICAgICAgIHZhciBhcnJZS2V5cyA9IFtdOw0KICAgICAgICB2YXIgYXJyTGFiZWxzID1bXTsNCiAgICAgICAgdmFyIGFyckNvbG9yZXMgPVtdOw0KDQogICAgICAgIHJlZ2xhcy5mb3JFYWNoKGZ1bmN0aW9uKHJlZ2xhLCBpbmRleCkgew0KICAgICAgICAgICAgdmFyIGRhdG9zUmVnbGEgPSBkYXRvc0JydXRvcy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAgaXRlbS5zdHMgPT0gcmVnbGEuc3VidGlwb1NlY0lkICYmDQogICAgICAgICAgICAgICAgICAgIGl0ZW0udGlwb3NlYyA9PSByZWdsYS50aXBvTWVkaWRhU2VjSWQgJiYNCiAgICAgICAgICAgICAgICAgICAgaXRlbS5wcmltYXJpbyA9PSByZWdsYS5zdWJ0aXBvUHJpbWFyaW9JZDsNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAvLyBHZW5lcmFtb3MgdW5hIGNsYXZlIMO6bmljYSBwYXJhIGxhIHNlcmllIGRlIGVzdGEgcmVnbGENCiAgICAgICAgICAgIHZhciBzZXJpZUtleSA9ICdzZXJpZV8nICsgaW5kZXg7DQogICAgICAgICAgICBhcnJZS2V5cy5wdXNoKHNlcmllS2V5KTsNCiAgICAgICAgICAgIGFyckxhYmVscy5wdXNoKCBkYXRvc1JlZ2xhLmxlbmd0aCAhPT0gMCA/DQogICAgICAgICAgICAgICAgcmVnbGEuc3VidGlwbyArICcgKCcgKyByZWdsYS50aXBvbWVkaWRhICsgJyknIDoNCiAgICAgICAgICAgICAgICByZWdsYS5zdWJ0aXBvICsgJyAoJyArIHJlZ2xhLnRpcG9tZWRpZGEgKyAnKSBTSU4gREFUT1MnDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgYXJyQ29sb3Jlcy5wdXNoKHBhbGV0YUNvbG9yZXNbaW5kZXggJSBwYWxldGFDb2xvcmVzLmxlbmd0aF0pOw0KDQogICAgICAgICAgICAvLyBUcmF0YXIgeSBOb3JtYWxpemFyDQogICAgICAgICAgICB2YXIgZm9ybWF0ZWFkb3MgPSB0cmF0YXJfZGF0b3MoZGF0b3NSZWdsYSk7DQogICAgICAgICAgICB2YXIgbm9ybWFsaXphZG9zID0gbm9ybWFsaXphckRhdG9zUG9yVGllbXBvKGZvcm1hdGVhZG9zLCBpbnRlcnZhbG8pOw0KDQogICAgICAgICAgICBub3JtYWxpemFkb3Muc29ydChmdW5jdGlvbihhLCBiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChhLmZlY2hhLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLmRpZmYobW9tZW50KGIuZmVjaGEsICdZWVlZLU1NLUREIEhIOm1tOnNzJykpOw0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGlmICh1bWJyYWxGaW5hbFNlZ3VuZG9zID4gMCkgew0KICAgICAgICAgICAgICAgIG5vcm1hbGl6YWRvcyA9IHJlbGxlbmFySHVlY29zQ29uQ2Vybyhub3JtYWxpemFkb3MsIHVtYnJhbEZpbmFsU2VndW5kb3MpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBNZXpjbGFyIGNvbiBsb3MgZGF0b3MgbWFlc3Ryb3MgdXNhbmRvIGxhIGZlY2hhIGNvbW8gbGxhdmUNCiAgICAgICAgICAgIG5vcm1hbGl6YWRvcy5mb3JFYWNoKGZ1bmN0aW9uKHB1bnRvKSB7DQogICAgICAgICAgICAgICAgaWYgKCFkYXRvc0NvbWJpbmFkb3NbcHVudG8uZmVjaGFdKSB7DQogICAgICAgICAgICAgICAgICAgIGRhdG9zQ29tYmluYWRvc1twdW50by5mZWNoYV0gPSB7IGZlY2hhOiBwdW50by5mZWNoYSB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBkYXRvc0NvbWJpbmFkb3NbcHVudG8uZmVjaGFdW3NlcmllS2V5XSA9IHB1bnRvLnZhbG9yOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIC8vIENvbnZlcnRpciBlbCBvYmpldG8gZnVzaW9uYWRvIGVuIGFycmF5IHkgb3JkZW5hcmxvDQogICAgICAgIHZhciBkYXRvc0ZpbmFsZXNNdWx0aSA9IE9iamVjdC52YWx1ZXMoZGF0b3NDb21iaW5hZG9zKTsNCg0KICAgICAgICBpZiAoZGF0b3NGaW5hbGVzTXVsdGkubGVuZ3RoID09PSAwKSByZXR1cm47DQogICAgICAgIHZhciBjaGFydElkID0gJ2dyYXBoX3VuaWNvJzsNCiAgICAgICAgJGNvbnRlbmVkb3IuYXBwZW5kKGANCiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIgbWItNCBjb2wtZ3JhZmljbyI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ4X3BhbmVsIj4NCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ieF90aXRsZSI+DQogICAgICAgICAgICAgICAgPGgyPkdyYWZpY28gPHNtYWxsPkNvbXBhcmF0aXZhIGVudHJlIGRhdG9zPC9zbWFsbD48L2gyPg0KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1yaWdodCBwYW5lbF90b29sYm94Ij4NCiAgICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz0iY29sbGFwc2UtbGluay1kaW5hbWljbyI+PGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tdXAiPjwvaT48L2E+PC9saT4NCiAgICAgICAgICAgICAgICA8L3VsPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij48L2Rpdj4NCiAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InhfY29udGVudCI+DQogICAgICAgICAgICAgICAgPGRpdiBpZD0iJHtjaGFydElkfSIgc3R5bGU9IndpZHRoOiAxMDAlOyBtaW4taGVpZ2h0OiA0NTBweDsiPjwvZGl2Pg0KICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICBgKTsNCg0KICAgICAgICBpbmljaWFsaXphcl9lY2hhcnQoY2hhcnRJZCwgZGF0b3NGaW5hbGVzTXVsdGksIGFycllLZXlzLCBhcnJMYWJlbHMsIGFyckNvbG9yZXMpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0gLy8gZnVuY2lvbiBhdXhpbGlhciwgZ2VuZXJhciBjb2xvcmVzDQogICAgZnVuY3Rpb24gZ2VuZXJhclBhbGV0YURpc3RpbnRhKGNhbnRpZGFkKSB7DQogICAgICAgIHZhciBjb2xvcmVzID1bXTsNCg0KICAgICAgICB2YXIgaHVlQWN0dWFsID0gTWF0aC5yYW5kb20oKSAqIDM2MDsNCiAgICAgICAgdmFyIHBhc2/DgXVyZW8gPSAxMzcuNTA4OyAvLyBFbCDDoW5ndWxvIMOhdXJlbyBlbiBncmFkb3MNCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbnRpZGFkOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBoID0gaHVlQWN0dWFsICUgMzYwOyAgICAgICAgICAvLyBIOiBUb25vDQogICAgICAgICAgICB2YXIgcyA9IDcwICsgTWF0aC5yYW5kb20oKSAqIDE1OyAgLy8gUzogU2F0dXJhY2nDs24NCiAgICAgICAgICAgIHZhciBsID0gNDUgKyBNYXRoLnJhbmRvbSgpICogMTA7ICAvLyBMOiBMdW1pbm9zaWRhZC4NCg0KICAgICAgICAgICAgY29sb3Jlcy5wdXNoKGhzbFRvSGV4KGgsIHMsIGwpKTsNCiAgICAgICAgICAgIGh1ZUFjdHVhbCArPSBwYXNvw4F1cmVvOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGNvbG9yZXM7DQogICAgfQ0KDQogICAgLy8gLS0tLSAvLyBmdW5jacOzbiBhdXhpbGlhciwgY29udmVydGlyIEhTTCBhICNIRVgNCiAgICBmdW5jdGlvbiBoc2xUb0hleChoLCBzLCBsKSB7DQogICAgICAgIGwgLz0gMTAwOw0KICAgICAgICB2YXIgYSA9IHMgKiBNYXRoLm1pbihsLCAxIC0gbCkgLyAxMDA7DQogICAgICAgIHZhciBmID0gbiA9PiB7DQogICAgICAgICAgICB2YXIgayA9IChuICsgaCAvIDMwKSAlIDEyOw0KICAgICAgICAgICAgdmFyIGNvbG9yID0gbCAtIGEgKiBNYXRoLm1heChNYXRoLm1pbihrIC0gMywgOSAtIGssIDEpLCAtMSk7DQogICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgyNTUgKiBjb2xvcikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyk7DQogICAgICAgIH07DQogICAgICAgIHJldHVybiBgIyR7ZigwKX0ke2YoOCl9JHtmKDQpfWA7DQogICAgfQ0KDQogICAgLy8gLS0tLSAvLyBmdW5jaW9uIGF1eGlsaWFyLCBmb3JtYXRlYXIgZGF0b3MNCiAgICBmdW5jdGlvbiB0cmF0YXJfZGF0b3MoZGF0b3NSZWdsYSl7DQogICAgICAgIHJldHVybiBkYXRvc1JlZ2xhLm1hcChmdW5jdGlvbihpdGVtKSB7DQogICAgICAgICAgICB2YXIgZmVjaGFDb3JyZWdpZGEgPSBpdGVtLmZlY2hhOw0KICAgICAgICAgICAgaWYgKGZlY2hhQ29ycmVnaWRhLmluZGV4T2YoJzonKSA9PT0gNCkgew0KICAgICAgICAgICAgICAgIHZhciBwYXJ0ZXMgPSBmZWNoYUNvcnJlZ2lkYS5zcGxpdCgnICcpOw0KICAgICAgICAgICAgICAgIHZhciBmZWNoYVNvbG8gPSBwYXJ0ZXNbMF0ucmVwbGFjZSgvOi9nLCAnLScpOw0KICAgICAgICAgICAgICAgIGZlY2hhQ29ycmVnaWRhID0gZmVjaGFTb2xvICsgJyAnICsgKHBhcnRlc1sxXSB8fCAnMDA6MDA6MDAnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgZmVjaGE6IGZlY2hhQ29ycmVnaWRhLA0KICAgICAgICAgICAgICAgIHZhbG9yOiBwYXJzZUZsb2F0KGl0ZW0udmFsb3IpDQogICAgICAgICAgICB9Ow0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICAvLyAtLS0tIC8vIGZ1bmNpb24gYXV4aWxpYXIsIG5vcm1hbGl6YXIgdGllbXBvcyBzZWd1biBwZXJpb2RvDQogICAgZnVuY3Rpb24gbm9ybWFsaXphckRhdG9zUG9yVGllbXBvKGRhdG9zLCBpbnRlcnZhbG8pIHsNCiAgICAgICAgaWYgKGludGVydmFsbyA9PT0gJ25vbmUnIHx8ICFpbnRlcnZhbG8pIHJldHVybiBkYXRvczsNCg0KICAgICAgICB2YXIgYWdydXBhZG9zID0ge307DQoNCiAgICAgICAgLy8gQWdydXBhciBsb3MgZGF0b3MgZW4gc3VzIGJsb3F1ZXMgZGUgdGllbXBvDQogICAgICAgIGRhdG9zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgew0KICAgICAgICAgICAgdmFyIG0gPSBtb21lbnQoaXRlbS5mZWNoYSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKTsNCiAgICAgICAgICAgIGlmICghbS5pc1ZhbGlkKCkpIHJldHVybjsNCg0KICAgICAgICAgICAgdmFyIGNsYXZlRmVjaGEgPSAnJzsNCg0KICAgICAgICAgICAgc3dpdGNoIChpbnRlcnZhbG8pIHsNCiAgICAgICAgICAgICAgICBjYXNlICdtaW51dGUnOiBjbGF2ZUZlY2hhID0gbS5zdGFydE9mKCdtaW51dGUnKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06MDAnKTsgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnaG91cic6ICAgY2xhdmVGZWNoYSA9IG0uc3RhcnRPZignaG91cicpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTowMCcpOyBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdob3VyNic6DQogICAgICAgICAgICAgICAgICAgIHZhciBob3VyNiA9IE1hdGguZmxvb3IobS5ob3VyKCkgLyA2KSAqIDY7DQogICAgICAgICAgICAgICAgICAgIGNsYXZlRmVjaGEgPSBtLmhvdXIoaG91cjYpLnN0YXJ0T2YoJ2hvdXInKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06MDAnKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnaG91cjEyJzoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGhvcmExMiA9IE1hdGguZmxvb3IobS5ob3VyKCkgLyAxMikgKiAxMjsNCiAgICAgICAgICAgICAgICAgICAgY2xhdmVGZWNoYSA9IG0uaG91cihob3JhMTIpLnN0YXJ0T2YoJ2hvdXInKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06MDAnKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnZGF5JzogICAgY2xhdmVGZWNoYSA9IG0uc3RhcnRPZignZGF5JykuZm9ybWF0KCdZWVlZLU1NLUREJyk7IGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3dlZWsnOiAgIGNsYXZlRmVjaGEgPSBtLnN0YXJ0T2YoJ2lzb1dlZWsnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTsgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnbW9udGgnOiAgY2xhdmVGZWNoYSA9IG0uc3RhcnRPZignbW9udGgnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTsgYnJlYWs7DQogICAgICAgICAgICAgICAgLy8gY2FzZSAneWVhcic6ICAgY2xhdmVGZWNoYSA9IG0uc3RhcnRPZigneWVhcicpLmZvcm1hdCgnWVlZWS1NTS1ERCcpOyBicmVhazsNCiAgICAgICAgICAgICAgICAvLyBjYXNlICdkZWNhZGUnOiANCiAgICAgICAgICAgICAgICAvLyAgICAgdmFyIGRlY2FkYSA9IE1hdGguZmxvb3IobS55ZWFyKCkgLyAxMCkgKiAxMDsgDQogICAgICAgICAgICAgICAgLy8gICAgIGNsYXZlRmVjaGEgPSBkZWNhZGEgKyAnLTAxLTAxJzsgDQogICAgICAgICAgICAgICAgLy8gICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCFhZ3J1cGFkb3NbY2xhdmVGZWNoYV0pIHsNCiAgICAgICAgICAgICAgICBhZ3J1cGFkb3NbY2xhdmVGZWNoYV0gPSB7IHZhbG9yZXM6W10gfTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gR3VhcmRhbW9zIGVsIHZhbG9yIGluZGl2aWR1YWwgZW4gZWwgYXJyYXkgZGUgZXNlIGJsb3F1ZSBkZSB0aWVtcG8NCiAgICAgICAgICAgIGFncnVwYWRvc1tjbGF2ZUZlY2hhXS52YWxvcmVzLnB1c2goaXRlbS52YWxvcik7DQogICAgICAgIH0pOw0KDQogICAgICAgIHZhciByZXN1bHRhZG8gPVtdOw0KDQogICAgICAgIC8vIENhbGN1bG8gZGUgbWVkaWFuYQ0KICAgICAgICBmb3IgKHZhciBmZWNoYSBpbiBhZ3J1cGFkb3MpIHsNCiAgICAgICAgICAgIHZhciB2YWxvcmVzID0gYWdydXBhZG9zW2ZlY2hhXS52YWxvcmVzOw0KDQogICAgICAgICAgICAvLyBPcmRlbmFtb3MgZWwgYXJyYXkgbnVtw6lyaWNhbWVudGUgZGUgbWVub3IgYSBtYXlvcg0KICAgICAgICAgICAgdmFsb3Jlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9KTsNCg0KICAgICAgICAgICAgdmFyIG1pdGFkID0gTWF0aC5mbG9vcih2YWxvcmVzLmxlbmd0aCAvIDIpOw0KICAgICAgICAgICAgdmFyIG1lZGlhbmE7DQoNCiAgICAgICAgICAgIC8vIFNpIGxhIGNhbnRpZGFkIGRlIGRhdG9zIGVzIGltcGFyLCB0b21hbW9zIGVsIHZhbG9yIGNlbnRyYWwNCiAgICAgICAgICAgIC8vIFNpIGxhIGNhbnRpZGFkIGVzIHBhciwgdG9tYW1vcyBsb3MgZG9zIGNlbnRyYWxlcyB5IHNhY2Ftb3Mgc3UgcHJvbWVkaW8NCiAgICAgICAgICAgIGlmICh2YWxvcmVzLmxlbmd0aCAlIDIgIT09IDApIG1lZGlhbmEgPSB2YWxvcmVzW21pdGFkXTsNCiAgICAgICAgICAgIGVsc2UgbWVkaWFuYSA9ICh2YWxvcmVzW21pdGFkIC0gMV0gKyB2YWxvcmVzW21pdGFkXSkgLyAyLjA7DQoNCiAgICAgICAgICAgIHJlc3VsdGFkby5wdXNoKHsNCiAgICAgICAgICAgICAgICBmZWNoYTogZmVjaGEsDQogICAgICAgICAgICAgICAgdmFsb3I6IHBhcnNlRmxvYXQobWVkaWFuYS50b0ZpeGVkKDIpKQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gcmVzdWx0YWRvOw0KICAgIH0NCg0KICAgIC8vIC0tLS0gLy8gZnVuY2lvbiBhdXhpbGlhciwgbGEgcGFyYW5vaWEgZGUgbG9zIHNlZ3VuZG9zDQogICAgZnVuY3Rpb24gcmVsbGVuYXJIdWVjb3NDb25DZXJvKGRhdG9zLCB1bWJyYWxTZWd1bmRvcykgew0KICAgICAgICBpZiAoIWRhdG9zIHx8IGRhdG9zLmxlbmd0aCA8IDIpIHJldHVybiBkYXRvczsNCg0KICAgICAgICB2YXIgcmVzdWx0YWRvID0gW107DQogICAgICAgIHZhciBtb21BY3R1YWwgPSBtb21lbnQoZGF0b3NbMF0uZmVjaGEsICdZWVlZLU1NLUREIEhIOm1tOnNzJyk7DQoNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRvcy5sZW5ndGggLSAxOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBhY3R1YWwgICA9IGRhdG9zW2ldOw0KICAgICAgICAgICAgdmFyIHNpZ3VpZW50ZSA9IGRhdG9zW2kgKyAxXTsNCg0KICAgICAgICAgICAgcmVzdWx0YWRvLnB1c2goYWN0dWFsKTsNCg0KICAgICAgICAgICAgdmFyIG1vbVNpZyA9IG1vbWVudChzaWd1aWVudGUuZmVjaGEsICdZWVlZLU1NLUREIEhIOm1tOnNzJyk7DQogICAgICAgICAgICB2YXIgZGlmZXJlbmNpYVNlZ3VuZG9zID0gbW9tU2lnLmRpZmYobW9tQWN0dWFsLCAnc2Vjb25kcycpOw0KDQogICAgICAgICAgICBpZiAoZGlmZXJlbmNpYVNlZ3VuZG9zID4gdW1icmFsU2VndW5kb3MpIHsNCiAgICAgICAgICAgICAgICB2YXIgaXRlcmFkb3JNb21lbnRvID0gbW9tQWN0dWFsLmNsb25lKCkuYWRkKHVtYnJhbFNlZ3VuZG9zLCAnc2Vjb25kcycpOw0KDQogICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhZG9yTW9tZW50by5pc0JlZm9yZShtb21TaWcpKSB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkby5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhOiBpdGVyYWRvck1vbWVudG8uZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJyksDQogICAgICAgICAgICAgICAgICAgICAgICB2YWxvcjogMA0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgaXRlcmFkb3JNb21lbnRvLmFkZCh1bWJyYWxTZWd1bmRvcywgJ3NlY29uZHMnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIG1vbUFjdHVhbCA9IG1vbVNpZzsgLy8g4pm777iPIGVsIG1vbVNpZyBkZSBlc3RhIGl0ZXJhY2nDs24gZXMgZWwgbW9tQWN0dWFsIGRlIGxhIHNpZ3VpZW50ZQ0KICAgICAgICB9DQoNCiAgICAgICAgcmVzdWx0YWRvLnB1c2goZGF0b3NbZGF0b3MubGVuZ3RoIC0gMV0pOw0KDQogICAgICAgIHJldHVybiByZXN1bHRhZG87DQogICAgfQ0KDQogICAgLy8gLS0tLSAvLyBmdW5jaW9uIGF1eGlsaWFyLCBjYWxjdWxhciBzZWd1bmRvcyBkZWwgaW50ZXJ2YWxvIHNlbGVjY2lvbmFkbw0KICAgIGZ1bmN0aW9uIG9idGVuZXJTZWd1bmRvc0ludGVydmFsbyhpbnRlcnZhbG8pIHsNCiAgICAgICAgc3dpdGNoIChpbnRlcnZhbG8pIHsNCiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6ICAgcmV0dXJuIDYwOw0KICAgICAgICAgICAgY2FzZSAnaG91cic6ICAgcmV0dXJuIDM2MDA7DQogICAgICAgICAgICBjYXNlICdob3VyNic6ICByZXR1cm4gMjE2MDA7DQogICAgICAgICAgICBjYXNlICdob3VyMTInOiByZXR1cm4gNDMyMDA7DQogICAgICAgICAgICBjYXNlICdkYXknOiAgICByZXR1cm4gODY0MDA7DQogICAgICAgICAgICBjYXNlICd3ZWVrJzogICByZXR1cm4gNjA0ODAwOw0KICAgICAgICAgICAgY2FzZSAnbW9udGgnOiAgcmV0dXJuIDI1OTIwMDA7IC8vIGFwcm94IDMwIGTDrWFzDQogICAgICAgICAgICBjYXNlICd5ZWFyJzogICByZXR1cm4gMzE1MzYwMDA7DQogICAgICAgICAgICBjYXNlICdkZWNhZGUnOiByZXR1cm4gMzE1MzYwMDAwOw0KICAgICAgICAgICAgZGVmYXVsdDogICAgICAgcmV0dXJuIDA7IC8vICdub25lJyB1IG90cm8NCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgZnVuY3Rpb24gaW5pY2lhbGl6YXJfZWNoYXJ0KGNoYXJ0SWQsIGRhdG9zLCB5a2V5cywgbGFiZWxzLCBjb2xvcmVzKSB7DQogICAgICAgIHZhciBjaGFydERvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNoYXJ0SWQpOw0KICAgICAgICB2YXIgbXlDaGFydCAgPSBlY2hhcnRzLmdldEluc3RhbmNlQnlEb20oY2hhcnREb20pOw0KICAgICAgICBpZiAobXlDaGFydCkgbXlDaGFydC5kaXNwb3NlKCk7DQogICAgICAgIG15Q2hhcnQgPSBlY2hhcnRzLmluaXQoY2hhcnREb20pOw0KDQogICAgICAgIHZhciB4QXhpc0RhdGEgID0gW107DQogICAgICAgIHZhciBzZXJpZXNEYXRhID0geWtleXMubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pOw0KDQogICAgICAgIGRhdG9zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgew0KICAgICAgICAgICAgeEF4aXNEYXRhLnB1c2goaXRlbS5mZWNoYSk7DQogICAgICAgICAgICB5a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKHlrZXksIGkpIHsNCiAgICAgICAgICAgICAgICBzZXJpZXNEYXRhW2ldLnB1c2goaXRlbVt5a2V5XSAhPT0gdW5kZWZpbmVkID8gaXRlbVt5a2V5XSA6IG51bGwpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHZhciBzZXJpZXNFY2hhcnRzID0geWtleXMubWFwKGZ1bmN0aW9uKHlrZXksIGluZGV4KSB7DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIG5hbWU6ICAgICAgICAgbGFiZWxzW2luZGV4XSwNCiAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAgICdsaW5lJywNCiAgICAgICAgICAgICAgICBjb25uZWN0TnVsbHM6IHRydWUsDQogICAgICAgICAgICAgICAgZGF0YTogICAgICAgICBzZXJpZXNEYXRhW2luZGV4XSwNCiAgICAgICAgICAgICAgICBpdGVtU3R5bGU6ICAgIHsgY29sb3I6IGNvbG9yZXNbaW5kZXhdIH0sDQogICAgICAgICAgICAgICAgc3ltYm9sU2l6ZTogICA2LA0KICAgICAgICAgICAgICAgIHNob3dTeW1ib2w6ICAgZmFsc2UsDQogICAgICAgICAgICAgICAgc21vb3RoOiAgICAgICB0cnVlDQogICAgICAgICAgICB9Ow0KICAgICAgICB9KTsNCg0KICAgICAgICB2YXIgb3B0aW9uID0gew0KICAgICAgICAgICAgdG9vbHRpcDogew0KICAgICAgICAgICAgICAgIHRyaWdnZXI6ICdheGlzJywNCiAgICAgICAgICAgICAgICBmb3JtYXR0ZXI6IGZ1bmN0aW9uKHBhcmFtcykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiA1cHg7Ij48YiBzdHlsZT0iZm9udC1zaXplOjE0cHg7Ij4nICsgcGFyYW1zWzBdLmF4aXNWYWx1ZSArICc8L2I+PC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgIT09IG51bGwgJiYgaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZm9udC1zaXplOjEzcHg7IGRpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Ij4nICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuPicgKyBpdGVtLm1hcmtlciArICcgJyArIGl0ZW0uc2VyaWVzTmFtZSArICcmbmJzcDsmbmJzcDs8L3NwYW4+JyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8Yj4nICsgaXRlbS52YWx1ZSArICc8L2I+PC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBsZWdlbmQ6IHsgZGF0YTogbGFiZWxzLCB0eXBlOiAnc2Nyb2xsJywgYm90dG9tOiAnMCUnLCBpY29uOiAncm91bmRSZWN0JyB9LA0KICAgICAgICAgICAgZ3JpZDogeyBsZWZ0OiAnMiUnLCByaWdodDogJzQlJywgYm90dG9tOiAnMTIlJywgdG9wOiAnMTAlJywgY29udGFpbkxhYmVsOiB0cnVlIH0sDQogICAgICAgICAgICB0b29sYm94OiB7DQogICAgICAgICAgICAgICAgZmVhdHVyZTogew0KICAgICAgICAgICAgICAgICAgICBkYXRhWm9vbTogeyB5QXhpc0luZGV4OiAnbm9uZScsIHRpdGxlOiB7IHpvb206ICdab29tJywgYmFjazogJ1Jlc3RhdXJhciBab29tJyB9IH0sDQogICAgICAgICAgICAgICAgICAgIHJlc3RvcmU6IHsgdGl0bGU6ICdSZXN0YXVyYXInIH0sDQogICAgICAgICAgICAgICAgICAgIHNhdmVBc0ltYWdlOiB7IHRpdGxlOiAnRGVzY2FyZ2FyIElNRycgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB4QXhpczogew0KICAgICAgICAgICAgICAgIHR5cGU6ICdjYXRlZ29yeScsDQogICAgICAgICAgICAgICAgYm91bmRhcnlHYXA6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6IHhBeGlzRGF0YSwNCiAgICAgICAgICAgICAgICBheGlzTGFiZWw6IHsNCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudCh2YWx1ZSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKS5mb3JtYXQoJ0REL01NL1lZIEhIOm1tJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgeUF4aXM6ICB7IHR5cGU6ICd2YWx1ZScgfSwNCiAgICAgICAgICAgIHNlcmllczogc2VyaWVzRWNoYXJ0cw0KICAgICAgICB9Ow0KDQogICAgICAgIG15Q2hhcnQuc2V0T3B0aW9uKG9wdGlvbik7DQogICAgfQ0KDQogICAgLy8gLS0gVEFCTEEgLS0tLS0tLS0tDQogICAgZnVuY3Rpb24gZGlidWphcl90YWJsYSgpIHsNCiAgICAgICAgaWYgKCQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKCcjZGF0YXRhYmxlLWJ1dHRvbnMnKSkgew0KICAgICAgICAgICAgJCgnI2RhdGF0YWJsZS1idXR0b25zJykuRGF0YVRhYmxlKCkuY2xlYXIoKS5kZXN0cm95KCk7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgZmlsYXMgPSBhcGxhbmFyX2RhdG9zKHRpcG9zKTsNCiAgICAgICAgdmFyIGh0bWwgPSAnJzsNCg0KICAgICAgICBmaWxhcy5mb3JFYWNoKGZpbGEgPT4gew0KICAgICAgICAgICAgaHRtbCArPSBgDQogICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgIDx0ZD4ke2ZpbGEuaWR9PC90ZD4NCiAgICAgICAgICAgICAgPHRkPiR7ZmlsYS5ub21icmVfcHJpbWFyaW99PC90ZD4NCiAgICAgICAgICAgICAgPHRkPiR7ZmlsYS5ldGlxdWV0YX08L3RkPg0KICAgICAgICAgICAgICA8dGQ+JHtmaWxhLnByaW1hcmlvfTwvdGQ+DQogICAgICAgICAgICAgIDx0ZD4ke2ZpbGEudGlwb308L3RkPg0KICAgICAgICAgICAgICA8dGQ+JHtmaWxhLm1lZGlkYX08L3RkPg0KICAgICAgICAgICAgPC90cj5gOw0KICAgICAgICB9KTsNCg0KICAgICAgICAkKCcjZGF0YXRhYmxlLWJ1dHRvbnMgdGJvZHknKS5odG1sKGh0bWwpOw0KICAgICAgICBpbmljaWFsaXphcl90YWJsYSgpOw0KICAgICAgICAkKCcjY29udGFkb3ItZmlsYXMnKS50ZXh0KGZpbGFzLmxlbmd0aCArICcgZGF0b3MgZW4gdG90YWwnKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tIC8vIGZ1bmNpb24gYXV4aWxpYXIsIG1vc3RyYXIgc29sbyBkYXRvcyBjb25jcmV0b3MNCiAgICBmdW5jdGlvbiBhcGxhbmFyX2RhdG9zKGRhdG9zKSB7DQogICAgICAgIHZhciBmaWxhcyA9W107DQogICAgICAgIGRhdG9zLmZvckVhY2godGlwbyA9PiB7DQogICAgICAgICAgICB0aXBvLnN1YnRpcG9QcmltYXJpby5mb3JFYWNoKHByaW1hcmlvID0+IHsNCiAgICAgICAgICAgICAgICBwcmltYXJpby5zdWJ0aXBvU2VjdW5kYXJpby5mb3JFYWNoKHNlY3VuZGFyaW8gPT4gew0KICAgICAgICAgICAgICAgICAgICBmaWxhcy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbWJyZV9wcmltYXJpbzogdGlwby5ub21icmUsDQogICAgICAgICAgICAgICAgICAgICAgICBpZCAgICAgIDogc2VjdW5kYXJpby5pZCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcmlvOiBzZWN1bmRhcmlvLnByaW1hcmlvID8/ICctJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGV0aXF1ZXRhOiBzZWN1bmRhcmlvLmV0aXF1ZXRhICA/PyAnLScsDQogICAgICAgICAgICAgICAgICAgICAgICB0aXBvICAgIDogc2VjdW5kYXJpby50aXBvU2VjdW5kYXJpbyA/IHNlY3VuZGFyaW8udGlwb1NlY3VuZGFyaW8ubm9tYnJlIDogJy0nLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWRhICA6IHNlY3VuZGFyaW8ubWVkaWRhID8/ICctJw0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIGZpbGFzOw0KICAgIH0NCg0KICAgIC8vIC0tLS0gLy8gZnVuY2lvbiBhdXhpbGlhciwgaW5pY2lhbGl6YXIgdGFibGENCiAgICBmdW5jdGlvbiBpbmljaWFsaXphcl90YWJsYSgpIHsNCiAgICAgICAgdGFibGEgPSAkKCcjZGF0YXRhYmxlLWJ1dHRvbnMnKS5EYXRhVGFibGUoew0KICAgICAgICAgICAgcGFnZUxlbmd0aDogMjUsDQogICAgICAgICAgICBvcmRlcjogW1sxLCAnYXNjJ10sIFsyLCAnYXNjJ11dLA0KICAgICAgICAgICAgZG9tOiAnPCJyb3ciPCJjb2wtc20tMTIgY29sLW1kLTYiQj48ImNvbC1zbS0xMiBjb2wtbWQtNiJmPj5ydGlwJywNCiAgICAgICAgICAgIGF1dG9XaWR0aDogZmFsc2UsDQogICAgICAgICAgICByZXNwb25zaXZlOiB0cnVlLA0KICAgICAgICAgICAgZml4ZWRIZWFkZXI6IHRydWUsDQogICAgICAgICAgICBidXR0b25zOlsNCiAgICAgICAgICAgICAgICB7IGV4dGVuZDogJ2NvcHknLCAgICAgICB0ZXh0OiAnPGkgY2xhc3M9ImZhIGZhLWNvcHkiPjwvaT4gQ29waWFyJywgICAgIGNsYXNzTmFtZTogJ2J0biBidG4tZGVmYXVsdCBidG4tc20nIH0sDQogICAgICAgICAgICAgICAgeyBleHRlbmQ6ICdjc3YnLCAgICAgICAgdGV4dDogJzxpIGNsYXNzPSJmYSBmYS1maWxlLXRleHQtbyI+PC9pPiBDU1YnLCAgY2xhc3NOYW1lOiAnYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbScgfSwNCiAgICAgICAgICAgICAgICB7IGV4dGVuZDogJ2V4Y2VsSHRtbDUnLCB0ZXh0OiAnPGkgY2xhc3M9ImZhIGZhLWZpbGUtZXhjZWwtbyI+PC9pPiBFeGNlbCcsIGNsYXNzTmFtZTogJ2J0biBidG4tZGVmYXVsdCBidG4tc20nIH0sDQogICAgICAgICAgICAgICAgeyBleHRlbmQ6ICdwZGZIdG1sNScsICAgdGV4dDogJzxpIGNsYXNzPSJmYSBmYS1maWxlLXBkZi1vIj48L2k+IFBERicsICAgY2xhc3NOYW1lOiAnYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbScgfSwNCiAgICAgICAgICAgICAgICB7IGV4dGVuZDogJ3ByaW50JywgICAgICB0ZXh0OiAnPGkgY2xhc3M9ImZhIGZhLXByaW50Ij48L2k+IEltcHJpbWlyJywgICBjbGFzc05hbWU6ICdidG4gYnRuLWRlZmF1bHQgYnRuLXNtJyB9DQogICAgICAgICAgICBdDQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIC8vIC0tIEZJTFRST1MgIC0tLS0tLQ0KICAgIGZ1bmN0aW9uIHJlbmRlcml6YXJfcmVnbGFzKCkgew0KICAgICAgICB2YXIgJGxpc3RhID0gJCgnI3JlZ2xhcy1saXN0YScpOw0KICAgICAgICAkbGlzdGEuZW1wdHkoKTsNCg0KICAgICAgICBpZiAocmVnbGFzLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgJGxpc3RhLmFwcGVuZChgDQogICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0idGV4dC1tdXRlZCBwLTMiPg0KICAgICAgICAgICAgICAgIDxlbT4tLS0gTm8gc2UgaGFuIGHDsWFkaWRvIGZpbHRyb3MgLS0tPC9lbT4NCiAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgYCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICByZWdsYXMuZm9yRWFjaChmdW5jdGlvbiAociwgaSkgew0KICAgICAgICAgICAgJGxpc3RhLmFwcGVuZChgDQogICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYWxpZ24tbWlkZGxlIj4ke3IudGlwbyB8fCAnPHNwYW4gY2xhc3M9InRleHQtbXV0ZWQiPlRvZG9zPC9zcGFuPid9PC90ZD4NCiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJhbGlnbi1taWRkbGUiPiR7ci5zdWJ0aXBvIHx8ICc8c3BhbiBjbGFzcz0idGV4dC1tdXRlZCI+VG9kb3M8L3NwYW4+J308L3RkPg0KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImFsaWduLW1pZGRsZSI+JHtyLnRpcG9tZWRpZGEgfHwgJzxzcGFuIGNsYXNzPSJ0ZXh0LW11dGVkIj5Ub2Rvczwvc3Bhbj4nfTwvdGQ+DQogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYWxpZ24tbWlkZGxlIj4NCiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUtZGFuZ2VyIGJ0bi1zbSBweS0wIHB4LTIgbWItMCBidG4tZWxpbWluYXItcmVnbGEiIGRhdGEtaW5kZXg9IiR7aX0iIHRpdGxlPSJRdWl0YXIiPg0KICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+DQogICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICA8L3RyPg0KICAgICAgICAgIGApOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhcGxpY2FyX2ZpbHRyb3MoKSB7DQogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkYXRhdGFibGUtYnV0dG9ucyB0Ym9keScpLmlubmVySFRNTCA9ICcnOw0KICAgICAgICBpZiAodGFibGEpIHRhYmxhLmRyYXcoKTsNCiAgICB9DQoNCjwvc2NyaXB0Pg0KDQo8IS0tIFBpY2tlciBkZSBmZWNoYXMgLS0tLS0tLS0tPg0KPHNjcmlwdD4NCiAgICAkKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIEZNVCA9ICdERC9NTS9ZWVlZIEhIOm1tOnNzJzsNCiAgICAgICAgbW9tZW50LmxvY2FsZSgnZXMnKTsNCg0KICAgICAgICAkKCcjcGlja2VyLXJhbmdvJykuZGF0ZXJhbmdlcGlja2VyKHsNCiAgICAgICAgICAgIHRpbWVQaWNrZXIgICAgICAgOiB0cnVlLA0KICAgICAgICAgICAgdGltZVBpY2tlcjI0SG91ciA6IHRydWUsDQogICAgICAgICAgICB0aW1lUGlja2VyU2Vjb25kczogZmFsc2UsDQogICAgICAgICAgICBhdXRvVXBkYXRlSW5wdXQgIDogZmFsc2UsDQogICAgICAgICAgICBvcGVucyAgICAgICAgICAgIDogJ2NlbnRlcicsDQogICAgICAgICAgICBsb2NhbGU6IHsNCiAgICAgICAgICAgICAgICBmb3JtYXQgICAgIDogRk1ULA0KICAgICAgICAgICAgICAgIHNlcGFyYXRvciAgOiAnICDigJQgICcsDQogICAgICAgICAgICAgICAgYXBwbHlMYWJlbCA6ICdBY2VwdGFyJywNCiAgICAgICAgICAgICAgICBjYW5jZWxMYWJlbDogJ0NhbmNlbGFyJywNCiAgICAgICAgICAgICAgICB3ZWVrTGFiZWwgIDogJ1MnLA0KICAgICAgICAgICAgICAgIGRheXNPZldlZWsgOiBbJ0RvJywnTHUnLCdNYScsJ01pJywnSnUnLCdWaScsJ1NhJ10sDQogICAgICAgICAgICAgICAgbW9udGhOYW1lcyA6WydFbmVybycsJ0ZlYnJlcm8nLCdNYXJ6bycsJ0FicmlsJywnTWF5bycsJ0p1bmlvJywNCiAgICAgICAgICAgICAgICAgICAgJ0p1bGlvJywnQWdvc3RvJywnU2VwdGllbWJyZScsJ09jdHVicmUnLCdOb3ZpZW1icmUnLCdEaWNpZW1icmUnXSwNCiAgICAgICAgICAgICAgICBmaXJzdERheSAgIDogMQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBvYnRlbmVyX3VsdGltYUZlY2hDYW1wYW5pYSgpOw0KDQogICAgICAgICQoJyNwaWNrZXItcmFuZ28nKS5vbignYXBwbHkuZGF0ZXJhbmdlcGlja2VyJywgZnVuY3Rpb24gKGV2LCBwaWNrZXIpIHsNCiAgICAgICAgICAgICQodGhpcykudmFsKHBpY2tlci5zdGFydERhdGUuZm9ybWF0KEZNVCkgKyAnICDigJQgICcgKyBwaWNrZXIuZW5kRGF0ZS5mb3JtYXQoRk1UKSk7DQogICAgICAgICAgICB2YWxpZGFyUmFuZ28ocGlja2VyLnN0YXJ0RGF0ZSwgcGlja2VyLmVuZERhdGUpOw0KICAgICAgICB9KTsNCg0KICAgICAgICAkKCcjcGlja2VyLXJhbmdvJykub24oJ2NhbmNlbC5kYXRlcmFuZ2VwaWNrZXInLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAkKHRoaXMpLnZhbCgnJyk7DQogICAgICAgICAgICAkKCcjZmVjaGEtZXJyb3IsICNmZWNoYS1vaycpLmhpZGUoKTsNCiAgICAgICAgICAgICQoJyNwaWNrZXItcmFuZ28nKS5jbG9zZXN0KCcuZm9ybS1ncm91cCcpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZnVuY3Rpb24gdmFsaWRhclJhbmdvKGluaWNpbywgZmluKSB7DQogICAgICAgICAgICAkKCcjcGlja2VyLXJhbmdvJykuY2xvc2VzdCgnLmZvcm0tZ3JvdXAnKS5yZW1vdmVDbGFzcygnaGFzLWVycm9yJyk7DQogICAgICAgICAgICAkKCcjZmVjaGEtZXJyb3IsICNmZWNoYS1vaycpLmhpZGUoKTsNCiAgICAgICAgICAgIGlmIChpbmljaW8uaXNCZWZvcmUoZmluKSkgew0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkKCcjcGlja2VyLXJhbmdvJykuY2xvc2VzdCgnLmZvcm0tZ3JvdXAnKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7DQogICAgICAgICAgICAkKCcjZmVjaGEtZXJyb3InKS5zaG93KCk7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICB3aW5kb3cub2J0ZW5lclJhbmdvRmVjaGFzID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHZhbCA9ICQoJyNwaWNrZXItcmFuZ28nKS52YWwoKTsNCiAgICAgICAgICAgIGlmICghdmFsKSByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIHZhciBwYXJ0ZXMgPSB2YWwuc3BsaXQoJyAg4oCUICAnKTsNCiAgICAgICAgICAgIGlmIChwYXJ0ZXMubGVuZ3RoIDwgMikgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB2YXIgaW5pY2lvID0gbW9tZW50KHBhcnRlc1swXS50cmltKCksIEZNVCwgdHJ1ZSk7DQogICAgICAgICAgICB2YXIgZmluICAgID0gbW9tZW50KHBhcnRlc1sxXS50cmltKCksIEZNVCwgdHJ1ZSk7DQogICAgICAgICAgICBpZiAoIWluaWNpby5pc1ZhbGlkKCkgfHwgIWZpbi5pc1ZhbGlkKCkgfHwgIWluaWNpby5pc0JlZm9yZShmaW4pKSByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgaW5pY2lvICAgOiBpbmljaW8uZm9ybWF0KEZNVCksDQogICAgICAgICAgICAgICAgZmluICAgICAgOiBmaW4uZm9ybWF0KEZNVCksDQogICAgICAgICAgICAgICAgaW5pY2lvSVNPOiBpbmljaW8udG9JU09TdHJpbmcoKSwNCiAgICAgICAgICAgICAgICBmaW5JU08gICA6IGZpbi50b0lTT1N0cmluZygpDQogICAgICAgICAgICB9Ow0KICAgICAgICB9Ow0KICAgIH0pOw0KPC9zY3JpcHQ+DQoNCjwhLS0gUHVyYW1lbnRlIGRlYnVnIHBhcmEgY29uc29sYSAtLT4NCjxzY3JpcHQ+DQogICAgZnVuY3Rpb24gZGVidWdfc2VjdW5kYXJpbyAoKSB7DQogICAgICAgIHZhciBmZWNoYSA9IHdpbmRvdy5vYnRlbmVyUmFuZ29GZWNoYXMoKTsNCiAgICAgICAgaWYgKCFmZWNoYSkgeyBjb25zb2xlLndhcm4oJ0ZlY2hhcyBpbnbDoWxpZGFzIG8gdmFjw61hcycpOyByZXR1cm47IH0NCiAgICAgICAgY29uc29sZS5sb2coJ1BPU1RbJywgdGlwb01lZGlkYVNlY0lkLCAnLCcsIHN1YnRpcG9QcmltYXJpb0lkLCAnLCcsDQogICAgICAgICAgICBmZWNoYVsnaW5pY2lvJ10sICcsJywgZmVjaGFbJ2ZpbiddLCAnLCcsIHN1YnRpcG9TZWNJZCwgJ10nKTsNCiAgICAgICAgb2J0ZW5lcl9zZWN1bmRhcmlvKGZlY2hhKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkZWJ1Z19lc3RhZG8oKSB7DQogICAgICAgIHZhciBmZWNoYXMgPSB3aW5kb3cub2J0ZW5lclJhbmdvRmVjaGFzKCk7DQogICAgICAgIGNvbnNvbGUubG9nKCdGZWNoYXM6JywgZmVjaGFzKTsNCiAgICAgICAgY29uc29sZS5sb2coJ3RpcG9TZWNJZDonLCB0aXBvU2VjSWQsICd8IHRpcG9TZWM6JywgdGlwb1NlYyk7DQogICAgICAgIGNvbnNvbGUubG9nKCdzdWJ0aXBvU2VjSWQ6Jywgc3VidGlwb1NlY0lkLCAnfCBzdWJ0aXBvU2VjOicsIHN1YnRpcG9TZWMpOw0KICAgICAgICBjb25zb2xlLmxvZygndGlwb01lZGlkYVNlY0lkOicsIHRpcG9NZWRpZGFTZWNJZCwgJ3wgdGlwb01lZGlkYVNlYzonLCB0aXBvTWVkaWRhU2VjKTsNCiAgICAgICAgY29uc29sZS5sb2coJ3N1YnRpcG9QcmltYXJpb0lkOicsIHN1YnRpcG9QcmltYXJpb0lkKTsNCiAgICB9Ow0KPC9zY3JpcHQ+DQo8L2JvZHk+DQo8L2h0bWw+IjtzOjQzOiIAcGhwRG9jdW1lbnRvclxSZWZsZWN0aW9uXFBocFxGaWxlAGRvY0Jsb2NrIjtOO3M6NDM6IgBwaHBEb2N1bWVudG9yXFJlZmxlY3Rpb25cUGhwXEZpbGUAbWV0YWRhdGEiO2E6MDp7fX0=";