kuasha/cosmos

View on GitHub
cosmos/admin/samples/adminpaneldef.py

Summary

Maintainability
A
0 mins
Test Coverage
# ------------------------------------------------- #
# Auto generated. Modification will be overwritten. #
# ------------------------------------------------- #

import base64

file_data_list=[
{
'name': '/.bowerrc', 'data': base64.b64decode(b'ewogICJkaXJlY3RvcnkiOiAiYXBwL2Jvd2VyX2NvbXBvbmVudHMiCn0=')
},
{
'name': '/bower.json', 'data': base64.b64decode(b'ewogICJuYW1lIjogImNvc21vcy1hZG1pbi1wYW5lbCIsCiAgImRlc2NyaXB0aW9uIjogIkFkbWluIHBhbmVsIGZvciBjb3Ntb3MgZnJhbWV3b3JrIiwKICAidmVyc2lvbiI6ICIwLjAuMCIsCiAgImhvbWVwYWdlIjogImh0dHA6Ly9jb3Ntb3NmcmFtZXdvcmsuY29tIiwKICAibGljZW5zZSI6ICJNSVQiLAogICJwcml2YXRlIjogdHJ1ZSwKICAiZGVwZW5kZW5jaWVzIjogewogICAgImFuZ3VsYXIiOiAiMS4yLngiLAogICAgImFuZ3VsYXItcm91dGUiOiAiMS4yLngiLAogICAgImFuZ3VsYXItbG9hZGVyIjogIjEuMi54IiwKICAgICJhbmd1bGFyLW1vY2tzIjogIn4xLjMueCIsCiAgICAiaHRtbDUtYm9pbGVycGxhdGUiOiAifjQuMy4wIiwKICAgICJhbmd1bGFyLWJvb3RzdHJhcCI6ICJ+MC4xMS54IiwKICAgICJhbmd1bGFyLXVpLXNvcnRhYmxlIjoifjAuMTIueCIsCiAgICAiYW5ndWxhci11aS1hY2UiOiJ+MC4xLngiLAogICAgImFuZ3VsYXItanNvbi1odW1hbiI6In4xLjIueCIsCiAgICAiYW5ndWxhci1sb2NhbC1zdG9yYWdlIjogIiIsCiAgICAiYm9vdHN0cmFwIjogIiIsCiAgICAiYW5ndWxhci11aS1zZWxlY3QiOiAiIgogIH0sCiAgInJlc29sdXRpb25zIjogewogICAgImFuZ3VsYXIiOiAiMS4zLjEwIgogIH0KfQo=')
},
{
'name': '/LICENSE', 'data': base64.b64decode(b'VGhlIE1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNCBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmcKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo=')
},
{
'name': '/app/login_providers.html', 'data': base64.b64decode(b'PCFET0NUWVBFIGh0bWw+CjwhLS0gVE9ETzogQ29weSBucyBhbmQgc2NyaXB0IGZyb20gaW5kZXguaHRtbCByZWY6IGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2d1aWRlL2llLS0+CjxodG1sIG5nLWFwcD0iY29zbW9zVUlEZW1vIj4KPGhlYWQgbGFuZz0iZW4iPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPHRpdGxlPkxvZ2luPC90aXRsZT4KPC9oZWFkPgo8Ym9keSAgcm9sZT0iZG9jdW1lbnQiIG5nLWNvbnRyb2xsZXI9IkFkbWluTWFpbkN0cmwiPgogICAgPGRpdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1pbnZlcnNlIG5hdmJhci1maXhlZC10b3AiIHJvbGU9Im5hdmlnYXRpb24iPgogICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1oZWFkZXIiPgogICAgICAgICAgPGEgY2xhc3M9Im5hdmJhci1icmFuZCIgaHJlZj0iLyI+Q29zbW9zIEZyYW1ld29yazwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItY29sbGFwc2UgY29sbGFwc2UiPgogICAgICAgICAgPHVsIGNsYXNzPSJuYXYgbmF2YmFyLW5hdiI+CiAgICAgICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PjwhLS0vLm5hdi1jb2xsYXBzZSAtLT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgdGhlbWUtc2hvd2Nhc2UiIHJvbGU9Im1haW4iPgogICAgICAgICAgPGRpdiBjbGFzcz0ianVtYm90cm9uIj4KICAgICAgICAgICAgPGgzICBuZy1zaG93PSIhbG9nZ2VkSW4oKSI+TG9naW48L2gzPgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ0biBidG4tc21hbGwgYnRuLXByaW1hcnkiIGhyZWY9Ii9sb2dpbi9nb29nbGUvIj5Hb29nbGU8L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnRuIGJ0bi1zbWFsbCBidG4tcHJpbWFyeSIgaHJlZj0iL2xvZ2luL2ZhY2Vib29rZ3JhcGgvIj5GYWNlYm9vazwvYT4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1wcmltYXJ5IiBocmVmPSIvbG9naW4vZ2l0aHViLyI+R2l0aHViPC9hPgogICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICA8aHIgLz4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iL2xvZ2luL29wZW5pZC8iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+T3BlbmlkPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ib3BlbmlkLm9wX2VuZHBvaW50Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4iPgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgPGhyIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8Zm9ybSBuZy1zaG93PSIhbG9nZ2VkSW4oKSIgcm9sZT0iZm9ybSIgbWV0aG9kPSJwb3N0IiBhY3Rpb249Ii9sb2dpbi8iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlVzZXIgbmFtZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJ1c2VybmFtZSIgdHlwZT0idGV4dCIgbmFtZT0idXNlcm5hbWUiLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlBhc3N3b3JkPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIgdHlwZT0icGFzc3dvcmQiIGlkPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiIC8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0idW5wd2Rsb2dpbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIC8+CiAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgIDxkaXYgbmctc2hvdz0ibG9nZ2VkSW4oKSI+V2VsY29tZTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ic3RhdHVzIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgc3JjPSIvL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLy9uZXRkbmEuYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4xLjEvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii8vbmV0ZG5hLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMS4xL2Nzcy9ib290c3RyYXAubWluLmNzcyIgLz4KICAgIDxzY3JpcHQgc3JjPSIvL3Jhd2dpdGh1Yi5jb20vYW5ndWxhci11aS91aS1zb3J0YWJsZS9tYXN0ZXIvc3JjL3NvcnRhYmxlLmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyL2FuZ3VsYXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1yb3V0ZS9hbmd1bGFyLXJvdXRlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItYm9vdHN0cmFwL3VpLWJvb3RzdHJhcC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLWJvb3RzdHJhcC91aS1ib290c3RyYXAtdHBscy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy91dGlscy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9zZXJ2aWNlcy9zZXJ2aWNlcy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9jb250cm9sbGVycy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9maWx0ZXJzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJsaWIvY29zbW9zL2pzL2RpcmVjdGl2ZXMvZGlyZWN0aXZlcy5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImpzL2FwcC5qcyI+PC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo=')
},
{
'name': '/app/index.html', 'data': base64.b64decode(b'PCFET0NUWVBFIGh0bWw+CjwhLS1baWYgbHQgSUUgN10+ICAgICAgPGh0bWwgeG1sbnM6bmc9Imh0dHA6Ly9hbmd1bGFyanMub3JnIiBsYW5nPSJlbiIgbmctYXBwPSJjb3Ntb3NVSURlbW8iIG5nLWNvbnRyb2xsZXI9IkFkbWluTWFpbkN0cmwiIGNsYXNzPSJuby1qcyBsdC1pZTkgbHQtaWU4IGx0LWllNyI+IDwhW2VuZGlmXS0tPgo8IS0tW2lmIElFIDddPiAgICAgICAgIDxodG1sIHhtbG5zOm5nPSJodHRwOi8vYW5ndWxhcmpzLm9yZyIgbGFuZz0iZW4iIG5nLWFwcD0iY29zbW9zVUlEZW1vIiBuZy1jb250cm9sbGVyPSJBZG1pbk1haW5DdHJsIiBjbGFzcz0ibm8tanMgbHQtaWU5IGx0LWllOCI+IDwhW2VuZGlmXS0tPgo8IS0tW2lmIElFIDhdPiAgICAgICAgIDxodG1sIHhtbG5zOm5nPSJodHRwOi8vYW5ndWxhcmpzLm9yZyIgbGFuZz0iZW4iIG5nLWFwcD0iY29zbW9zVUlEZW1vIiBuZy1jb250cm9sbGVyPSJBZG1pbk1haW5DdHJsIiBjbGFzcz0ibm8tanMgbHQtaWU5Ij4gPCFbZW5kaWZdLS0+CjwhLS1baWYgZ3QgSUUgOF0+PCEtLT4gPGh0bWwgeG1sbnM6bmc9Imh0dHA6Ly9hbmd1bGFyanMub3JnIiBsYW5nPSJlbiIgbmctYXBwPSJjb3Ntb3NVSURlbW8iIG5nLWNvbnRyb2xsZXI9IkFkbWluTWFpbkN0cmwiIGNsYXNzPSJuby1qcyI+IDwhLS08IVtlbmRpZl0tLT4KCjxoZWFkPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgogIDx0aXRsZT5CZWVuZHU8L3RpdGxlPgogIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJib3dlcl9jb21wb25lbnRzL2h0bWw1LWJvaWxlcnBsYXRlL2Nzcy9ub3JtYWxpemUuY3NzIj4KICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvaHRtbDUtYm9pbGVycGxhdGUvY3NzL21haW4uY3NzIj4KICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImxpYi9jb3Ntb3MvY3NzL2FwcC5jc3MiLz4KICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImxpYi9jb3Ntb3MvY3NzL2NoYXJ0cy5jc3MiLz4KICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImxpYi9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiIC8+CiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2FuZ3VsYXJfbWF0ZXJpYWwvMS4wLjAvYW5ndWxhci1tYXRlcmlhbC5taW4uY3NzIj4KICA8c3R5bGU+CiAgICAgIGJvZHkgewogICAgICAgICAgcGFkZGluZy10b3A6IDUwcHg7CiAgICAgIH0KICA8L3N0eWxlPgoKICAgIDwhLS1baWYgbHRlIElFIDhdPgogICAgICA8c2NyaXB0PgogICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25nLWluY2x1ZGUnKTsKICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduZy1wbHVyYWxpemUnKTsKICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduZy12aWV3Jyk7CgogICAgICAgIC8vIE9wdGlvbmFsbHkgdGhlc2UgZm9yIENTUwogICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25nOmluY2x1ZGUnKTsKICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduZzpwbHVyYWxpemUnKTsKICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduZzp2aWV3Jyk7CiAgICAgIDwvc2NyaXB0PgogICAgPCFbZW5kaWZdLS0+CjwvaGVhZD4KPGJvZHkgcm9sZT0iZG9jdW1lbnQiPgogICAgPCEtLVtpZiBsdCBJRSA3XT4KICAgIDxwIGNsYXNzPSJicm93c2VoYXBweSI+WW91IGFyZSB1c2luZyBhbiA8c3Ryb25nPm91dGRhdGVkPC9zdHJvbmc+IGJyb3dzZXIuIFBsZWFzZSA8YSBocmVmPSJodHRwOi8vYnJvd3NlaGFwcHkuY29tLyI+dXBncmFkZSB5b3VyIGJyb3dzZXI8L2E+IHRvIGltcHJvdmUgeW91ciBleHBlcmllbmNlLjwvcD4KICAgIDwhW2VuZGlmXS0tPgoKICAgIDxkaXYgbmctdmlldz48L2Rpdj4KCiAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9odG1sNS1ib2lsZXJwbGF0ZS9qcy92ZW5kb3IvbW9kZXJuaXpyLTIuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImxpYi9qcy9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJsaWIvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2pzL2pxdWVyeS11aS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2pzL2QzLm1pbi5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ibGliL2pzL25vdGlmeS5taW4uanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXIvYW5ndWxhci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXJvdXRlL2FuZ3VsYXItcm91dGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1ib290c3RyYXAvdWktYm9vdHN0cmFwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItYm9vdHN0cmFwL3VpLWJvb3RzdHJhcC10cGxzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdWktc29ydGFibGUvc29ydGFibGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1sb2NhbC1zdG9yYWdlL2Rpc3QvYW5ndWxhci1sb2NhbC1zdG9yYWdlLm1pbi5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYm93ZXJfY29tcG9uZW50cy9hY2UtYnVpbGRzL3NyYy1taW4tbm9jb25mbGljdC9hY2UuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXVpLWFjZS91aS1hY2UuanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgZGF0YS1yZXF1aXJlPSJsb2Rhc2guanNAMi40LjEiIGRhdGEtc2VtdmVyPSIyLjQuMSIgc3JjPSJsaWIvanMvbG9kYXNoLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1qc29uLWh1bWFuL2Rpc3QvYW5ndWxhci1qc29uLWh1bWFuLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1qc29uLWh1bWFuL2Rpc3QvYW5ndWxhci1qc29uLWh1bWFuLm1pbi5jc3MiIC8+CgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXVpLXNlbGVjdC9kaXN0L3NlbGVjdC5taW4uanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdWktc2VsZWN0L2Rpc3Qvc2VsZWN0Lm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImxpYi9jc3Mvc2VsZWN0aXplLmJvb3RzdHJhcDMuY3NzIj4KCiAgICA8c2NyaXB0IHNyYz0iLy9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9hbmd1bGFyanMvMS40LjgvYW5ndWxhci5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvYW5ndWxhcmpzLzEuNC44L2FuZ3VsYXItYW5pbWF0ZS5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvYW5ndWxhcmpzLzEuNC44L2FuZ3VsYXItYXJpYS5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvYW5ndWxhcmpzLzEuNC44L2FuZ3VsYXItbWVzc2FnZXMubWluLmpzIj48L3NjcmlwdD4KCiAgICA8IS0tIEFuZ3VsYXIgTWF0ZXJpYWwgTGlicmFyeSAtLT4KICAgIDxzY3JpcHQgc3JjPSIvL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2FuZ3VsYXJfbWF0ZXJpYWwvMS4wLjAvYW5ndWxhci1tYXRlcmlhbC5taW4uanMiPjwvc2NyaXB0PgoKCiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy91dGlscy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jaGFydGhlbHBlci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9zZXJ2aWNlcy9zZXJ2aWNlcy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9jb250cm9sbGVycy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9maWx0ZXJzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJsaWIvY29zbW9zL2pzL2RpcmVjdGl2ZXMvZGlyZWN0aXZlcy5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImxpYi9jb3Ntb3MvanMvY29udHJvbGxlcnMvTG9naW5DdHJsLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJsaWIvY29zbW9zL2pzL2NvbnRyb2xsZXJzL0luZGV4Q3RybC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9UZXJtaW5hbEN0cmwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImxpYi9jb3Ntb3MvanMvY29udHJvbGxlcnMvVXNlcnNDdHJsLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJsaWIvY29zbW9zL2pzL2NvbnRyb2xsZXJzL1JvbGVzQ3RybC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9MaXN0Q3RybC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9MaXN0RGV0YWlsQ3RybC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9GaWxlVXBsb2FkQ3RybC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9Gb3JtRGVzaWduQ3RybC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9QYWdlRGVzaWduQ3RybC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9Gb3JtVmlld0N0cmwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImxpYi9jb3Ntb3MvanMvY29udHJvbGxlcnMvUGFnZVZpZXdDdHJsLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJsaWIvY29zbW9zL2pzL2NvbnRyb2xsZXJzL0ZpbGVNYW5hZ2VyQ3RybC5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImxpYi9jb3Ntb3MvanMvY29udHJvbGxlcnMvQXBwU3R1ZGlvQ3RybC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9jb250cm9sbGVycy9JdGVtRGVzaWduQ3RybC5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImxpYi9jb3Ntb3MvanMvZGlyZWN0aXZlcy9maWVsZC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9kaXJlY3RpdmVzL2ZpbHRlci5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCBzcmM9ImxpYi9jb3Ntb3MvanMvc2VydmljZXMvaHR0cC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibGliL2Nvc21vcy9qcy9zZXJ2aWNlcy9jYWNoZWRsb2FkZXIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImxpYi9jb3Ntb3MvanMvc2VydmljZXMvc2V0dGluZ3MuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImxpYi9jb3Ntb3MvanMvc2VydmljZXMvY29uc3RhbnRzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJsaWIvY29zbW9zL2pzL3NlcnZpY2VzL3V0aWxzLmpzIj48L3NjcmlwdD4KCiAgICA8c2NyaXB0IHNyYz0ianMvYXBwLmpzIj48L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgoK')
},
{
'name': '/app/img/.gitkeep', 'data': base64.b64decode(b'')
},
{
'name': '/app/lib/css/selectize.bootstrap3.css', 'data': base64.b64decode(b'LyoqCiAqIHNlbGVjdGl6ZS5ib290c3RyYXAzLmNzcyAodjAuOC41KSAtIEJvb3RzdHJhcCAzIFRoZW1lCiAqIENvcHlyaWdodCAoYykgMjAxMyBCcmlhbiBSZWF2aXMgJiBjb250cmlidXRvcnMKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzCiAqIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlcgogKiB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgogKiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICogQGF1dGhvciBCcmlhbiBSZWF2aXMgPGJyaWFuQHRoaXJkcm91dGUuY29tPgogKi8KCi5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tZHJhZ19kcm9wLm11bHRpID4gLnNlbGVjdGl6ZS1pbnB1dCA+IGRpdi51aS1zb3J0YWJsZS1wbGFjZWhvbGRlciB7CiAgYmFja2dyb3VuZDogI2YyZjJmMiAhaW1wb3J0YW50OwogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNikgIWltcG9ydGFudDsKICBib3JkZXI6IDAgbm9uZSAhaW1wb3J0YW50OwogIHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsKICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAxMnB4IDRweCAjZmZmZmZmOwogICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDEycHggNHB4ICNmZmZmZmY7Cn0KCi5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tZHJhZ19kcm9wIC51aS1zb3J0YWJsZS1wbGFjZWhvbGRlcjo6YWZ0ZXIgewogIGNvbnRlbnQ6ICchJzsKICB2aXNpYmlsaXR5OiBoaWRkZW47Cn0KCi5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tZHJhZ19kcm9wIC51aS1zb3J0YWJsZS1oZWxwZXIgewogIC13ZWJraXQtYm94LXNoYWRvdzogMCAycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7Cn0KCi5zZWxlY3RpemUtZHJvcGRvd24taGVhZGVyIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgcGFkZGluZzogM3B4IDEycHg7CiAgYmFja2dyb3VuZDogI2Y4ZjhmODsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2QwZDBkMDsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweCA0cHggMCAwOwogICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDsKfQoKLnNlbGVjdGl6ZS1kcm9wZG93bi1oZWFkZXItY2xvc2UgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDUwJTsKICByaWdodDogMTJweDsKICBtYXJnaW4tdG9wOiAtMTJweDsKICBmb250LXNpemU6IDIwcHggIWltcG9ydGFudDsKICBsaW5lLWhlaWdodDogMjBweDsKICBjb2xvcjogIzMzMzMzMzsKICBvcGFjaXR5OiAwLjQ7Cn0KCi5zZWxlY3RpemUtZHJvcGRvd24taGVhZGVyLWNsb3NlOmhvdmVyIHsKICBjb2xvcjogIzAwMDAwMDsKfQoKLnNlbGVjdGl6ZS1kcm9wZG93bi5wbHVnaW4tb3B0Z3JvdXBfY29sdW1ucyAub3B0Z3JvdXAgewogIGZsb2F0OiBsZWZ0OwogIGJvcmRlci10b3A6IDAgbm9uZTsKICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjJmMmYyOwogIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9Cgouc2VsZWN0aXplLWRyb3Bkb3duLnBsdWdpbi1vcHRncm91cF9jb2x1bW5zIC5vcHRncm91cDpsYXN0LWNoaWxkIHsKICBib3JkZXItcmlnaHQ6IDAgbm9uZTsKfQoKLnNlbGVjdGl6ZS1kcm9wZG93bi5wbHVnaW4tb3B0Z3JvdXBfY29sdW1ucyAub3B0Z3JvdXA6YmVmb3JlIHsKICBkaXNwbGF5OiBub25lOwp9Cgouc2VsZWN0aXplLWRyb3Bkb3duLnBsdWdpbi1vcHRncm91cF9jb2x1bW5zIC5vcHRncm91cC1oZWFkZXIgewogIGJvcmRlci10b3A6IDAgbm9uZTsKfQoKLnNlbGVjdGl6ZS1jb250cm9sLnBsdWdpbi1yZW1vdmVfYnV0dG9uIFtkYXRhLXZhbHVlXSB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHBhZGRpbmctcmlnaHQ6IDI0cHggIWltcG9ydGFudDsKfQoKLnNlbGVjdGl6ZS1jb250cm9sLnBsdWdpbi1yZW1vdmVfYnV0dG9uIFtkYXRhLXZhbHVlXSAucmVtb3ZlIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwOwogIHJpZ2h0OiAwOwogIGJvdHRvbTogMDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgd2lkdGg6IDE3cHg7CiAgcGFkZGluZzogMXB4IDAgMCAwOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogaW5oZXJpdDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDApOwogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMCAycHggMnB4IDA7CiAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAwIDJweCAycHggMDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMnB4IDJweCAwOwogIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9Cgouc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gW2RhdGEtdmFsdWVdIC5yZW1vdmU6aG92ZXIgewogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNSk7Cn0KCi5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiBbZGF0YS12YWx1ZV0uYWN0aXZlIC5yZW1vdmUgewogIGJvcmRlci1sZWZ0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwp9Cgouc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gLmRpc2FibGVkIFtkYXRhLXZhbHVlXSAucmVtb3ZlOmhvdmVyIHsKICBiYWNrZ3JvdW5kOiBub25lOwp9Cgouc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gLmRpc2FibGVkIFtkYXRhLXZhbHVlXSAucmVtb3ZlIHsKICBib3JkZXItbGVmdC1jb2xvcjogcmdiYSg3NywgNzcsIDc3LCAwKTsKfQoKLnNlbGVjdGl6ZS1jb250cm9sIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5zZWxlY3RpemUtZHJvcGRvd24sCi5zZWxlY3RpemUtaW5wdXQsCi5zZWxlY3RpemUtaW5wdXQgaW5wdXQgewogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTRweDsKICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBpbmhlcml0OwogIGxpbmUtaGVpZ2h0OiAyMHB4OwogIGNvbG9yOiAjMzMzMzMzOwp9Cgouc2VsZWN0aXplLWlucHV0LAouc2VsZWN0aXplLWNvbnRyb2wuc2luZ2xlIC5zZWxlY3RpemUtaW5wdXQuaW5wdXQtYWN0aXZlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgY3Vyc29yOiB0ZXh0OwogIGJhY2tncm91bmQ6ICNmZmZmZmY7Cn0KCi5zZWxlY3RpemUtaW5wdXQgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB6LWluZGV4OiAxOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICB3aWR0aDogMTAwJTsKICBwYWRkaW5nOiA2cHggMTJweDsKICBvdmVyZmxvdzogaGlkZGVuOwogIGJvcmRlcjogMXB4IHNvbGlkICNjY2NjY2M7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOwogICAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQuaGFzLWl0ZW1zIHsKICBwYWRkaW5nOiA1cHggMTJweCAycHg7Cn0KCi5zZWxlY3RpemUtaW5wdXQuZnVsbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKfQoKLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZCwKLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZCAqIHsKICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDsKfQoKLnNlbGVjdGl6ZS1pbnB1dC5mb2N1cyB7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTUpOwp9Cgouc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZSB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDsKICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweCA0cHggMCAwOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7Cn0KCi5zZWxlY3RpemUtaW5wdXQgPiAqIHsKICBkaXNwbGF5OiAtbW96LWlubGluZS1zdGFjazsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgKmRpc3BsYXk6IGlubGluZTsKICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CiAgem9vbTogMTsKfQoKLnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQgPiBkaXYgewogIHBhZGRpbmc6IDFweCAzcHg7CiAgbWFyZ2luOiAwIDNweCAzcHggMDsKICBjb2xvcjogIzMzMzMzMzsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYmFja2dyb3VuZDogI2VmZWZlZjsKICBib3JkZXI6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAwKTsKfQoKLnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQgPiBkaXYuYWN0aXZlIHsKICBjb2xvcjogI2ZmZmZmZjsKICBiYWNrZ3JvdW5kOiAjNDI4YmNhOwogIGJvcmRlcjogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDApOwp9Cgouc2VsZWN0aXplLWNvbnRyb2wubXVsdGkgLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZCA+IGRpdiwKLnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQuZGlzYWJsZWQgPiBkaXYuYWN0aXZlIHsKICBjb2xvcjogIzgwODA4MDsKICBiYWNrZ3JvdW5kOiAjZmZmZmZmOwogIGJvcmRlcjogMCBzb2xpZCByZ2JhKDc3LCA3NywgNzcsIDApOwp9Cgouc2VsZWN0aXplLWlucHV0ID4gaW5wdXQgewogIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50OwogIG1heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudDsKICBtaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogIG1hcmdpbjogMCAhaW1wb3J0YW50OwogIGxpbmUtaGVpZ2h0OiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgdGV4dC1pbmRlbnQ6IDAgIWltcG9ydGFudDsKICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgYm9yZGVyOiAwIG5vbmUgIWltcG9ydGFudDsKICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBhdXRvICFpbXBvcnRhbnQ7Cn0KCi5zZWxlY3RpemUtaW5wdXQgPiBpbnB1dDpmb2N1cyB7CiAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50Owp9Cgouc2VsZWN0aXplLWlucHV0OjphZnRlciB7CiAgZGlzcGxheTogYmxvY2s7CiAgY2xlYXI6IGxlZnQ7CiAgY29udGVudDogJyAnOwp9Cgouc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZTo6YmVmb3JlIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDA7CiAgYm90dG9tOiAwOwogIGxlZnQ6IDA7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxcHg7CiAgYmFja2dyb3VuZDogI2ZmZmZmZjsKICBjb250ZW50OiAnICc7Cn0KCi5zZWxlY3RpemUtZHJvcGRvd24gewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB6LWluZGV4OiAxMDsKICBtYXJnaW46IC0xcHggMCAwIDA7CiAgYmFja2dyb3VuZDogI2ZmZmZmZjsKICBib3JkZXI6IDFweCBzb2xpZCAjY2NjY2NjOwogIGJvcmRlci10b3A6IDAgbm9uZTsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4OwogICAgIC1tb3otYm9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgNHB4IDRweDsKICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpOwogIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9Cgouc2VsZWN0aXplLWRyb3Bkb3duIFtkYXRhLXNlbGVjdGFibGVdIHsKICBvdmVyZmxvdzogaGlkZGVuOwogIGN1cnNvcjogcG9pbnRlcjsKfQoKLnNlbGVjdGl6ZS1kcm9wZG93biBbZGF0YS1zZWxlY3RhYmxlXSAuaGlnaGxpZ2h0IHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjM3LCA0MCwgMC40KTsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDFweDsKICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDFweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDsKfQoKLnNlbGVjdGl6ZS1kcm9wZG93biBbZGF0YS1zZWxlY3RhYmxlXSwKLnNlbGVjdGl6ZS1kcm9wZG93biAub3B0Z3JvdXAtaGVhZGVyIHsKICBwYWRkaW5nOiAzcHggMTJweDsKfQoKLnNlbGVjdGl6ZS1kcm9wZG93biAub3B0Z3JvdXA6Zmlyc3QtY2hpbGQgLm9wdGdyb3VwLWhlYWRlciB7CiAgYm9yZGVyLXRvcDogMCBub25lOwp9Cgouc2VsZWN0aXplLWRyb3Bkb3duIC5vcHRncm91cC1oZWFkZXIgewogIGNvbG9yOiAjOTk5OTk5OwogIGN1cnNvcjogZGVmYXVsdDsKICBiYWNrZ3JvdW5kOiAjZmZmZmZmOwp9Cgouc2VsZWN0aXplLWRyb3Bkb3duIC5hY3RpdmUgewogIGNvbG9yOiAjZmZmZmZmOwogIGJhY2tncm91bmQtY29sb3I6ICM0MjhiY2E7Cn0KCi5zZWxlY3RpemUtZHJvcGRvd24gLmFjdGl2ZS5jcmVhdGUgewogIGNvbG9yOiAjZmZmZmZmOwp9Cgouc2VsZWN0aXplLWRyb3Bkb3duIC5jcmVhdGUgewogIGNvbG9yOiByZ2JhKDUxLCA1MSwgNTEsIDAuNSk7Cn0KCi5zZWxlY3RpemUtZHJvcGRvd24tY29udGVudCB7CiAgbWF4LWhlaWdodDogMjAwcHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGF1dG87Cn0KCi5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dCwKLnNlbGVjdGl6ZS1jb250cm9sLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0IGlucHV0IHsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUsCi5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUgaW5wdXQgewogIGN1cnNvcjogdGV4dDsKfQoKLnNlbGVjdGl6ZS1jb250cm9sLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0OmFmdGVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiA1MCU7CiAgcmlnaHQ6IDE3cHg7CiAgZGlzcGxheTogYmxvY2s7CiAgd2lkdGg6IDA7CiAgaGVpZ2h0OiAwOwogIG1hcmdpbi10b3A6IC0zcHg7CiAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OwogIGJvcmRlci1zdHlsZTogc29saWQ7CiAgYm9yZGVyLXdpZHRoOiA1cHggNXB4IDAgNXB4OwogIGNvbnRlbnQ6ICcgJzsKfQoKLnNlbGVjdGl6ZS1jb250cm9sLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZTphZnRlciB7CiAgbWFyZ2luLXRvcDogLTRweDsKICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICMwMDAwMDAgdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXdpZHRoOiAwIDVweCA1cHggNXB4Owp9Cgouc2VsZWN0aXplLWNvbnRyb2wucnRsLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0OmFmdGVyIHsKICByaWdodDogYXV0bzsKICBsZWZ0OiAxN3B4Owp9Cgouc2VsZWN0aXplLWNvbnRyb2wucnRsIC5zZWxlY3RpemUtaW5wdXQgPiBpbnB1dCB7CiAgbWFyZ2luOiAwIDRweCAwIC0ycHggIWltcG9ydGFudDsKfQoKLnNlbGVjdGl6ZS1jb250cm9sIC5zZWxlY3RpemUtaW5wdXQuZGlzYWJsZWQgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgb3BhY2l0eTogMC41Owp9Cgouc2VsZWN0aXplLWRyb3Bkb3duLAouc2VsZWN0aXplLWRyb3Bkb3duLmZvcm0tY29udHJvbCB7CiAgei1pbmRleDogMTAwMDsKICBoZWlnaHQ6IGF1dG87CiAgcGFkZGluZzogMDsKICBtYXJnaW46IDJweCAwIDAgMDsKICBiYWNrZ3JvdW5kOiAjZmZmZmZmOwogIGJvcmRlcjogMXB4IHNvbGlkICNjY2NjY2M7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAtd2Via2l0LWJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjE3NSk7CiAgICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNzUpOwp9Cgouc2VsZWN0aXplLWRyb3Bkb3duIC5vcHRncm91cC1oZWFkZXIgewogIGZvbnQtc2l6ZTogMTJweDsKICBsaW5lLWhlaWdodDogMS40Mjg1NzE0Mjk7Cn0KCi5zZWxlY3RpemUtZHJvcGRvd24gLm9wdGdyb3VwOmZpcnN0LWNoaWxkOmJlZm9yZSB7CiAgZGlzcGxheTogbm9uZTsKfQoKLnNlbGVjdGl6ZS1kcm9wZG93biAub3B0Z3JvdXA6YmVmb3JlIHsKICBkaXNwbGF5OiBibG9jazsKICBoZWlnaHQ6IDFweDsKICBtYXJnaW46IDlweCAwOwogIG1hcmdpbi1yaWdodDogLTEycHg7CiAgbWFyZ2luLWxlZnQ6IC0xMnB4OwogIG92ZXJmbG93OiBoaWRkZW47CiAgYmFja2dyb3VuZC1jb2xvcjogI2U1ZTVlNTsKICBjb250ZW50OiAnICc7Cn0KCi5zZWxlY3RpemUtZHJvcGRvd24tY29udGVudCB7CiAgcGFkZGluZzogNXB4IDA7Cn0KCi5zZWxlY3RpemUtZHJvcGRvd24taGVhZGVyIHsKICBwYWRkaW5nOiA2cHggMTJweDsKfQoKLnNlbGVjdGl6ZS1pbnB1dCB7CiAgbWluLWhlaWdodDogMzRweDsKfQoKLnNlbGVjdGl6ZS1pbnB1dC5kcm9wZG93bi1hY3RpdmUgewogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OwogICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4Owp9Cgouc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZTo6YmVmb3JlIHsKICBkaXNwbGF5OiBub25lOwp9Cgouc2VsZWN0aXplLWlucHV0LmZvY3VzIHsKICBib3JkZXItY29sb3I6ICM2NmFmZTk7CiAgb3V0bGluZTogMDsKICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSwgMCAwIDhweCByZ2JhKDEwMiwgMTc1LCAyMzMsIDAuNik7CiAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjA3NSksIDAgMCA4cHggcmdiYSgxMDIsIDE3NSwgMjMzLCAwLjYpOwp9Cgouc2VsZWN0aXplLWNvbnRyb2wubXVsdGkgLnNlbGVjdGl6ZS1pbnB1dC5oYXMtaXRlbXMgewogIHBhZGRpbmctcmlnaHQ6IDlweDsKICBwYWRkaW5nLWxlZnQ6IDlweDsKfQoKLnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQgPiBkaXYgewogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OwogICAgIC1tb3otYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgouZm9ybS1jb250cm9sLnNlbGVjdGl6ZS1jb250cm9sIHsKICBoZWlnaHQ6IGF1dG87CiAgcGFkZGluZzogMDsKICBiYWNrZ3JvdW5kOiBub25lOwogIGJvcmRlcjogbm9uZTsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7CiAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAwOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7CiAgICAgICAgICBib3gtc2hhZG93OiBub25lOwp9')
},
{
'name': '/app/lib/css/bootstrap.min.css', 'data': base64.b64decode(b'LyohCiAqIEJvb3RzdHJhcCB2My4xLjEgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKQogKiBDb3B5cmlnaHQgMjAxMS0yMDE0IFR3aXR0ZXIsIEluYy4KICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSkKICovCgovKiEgbm9ybWFsaXplLmNzcyB2My4wLjAgfCBNSVQgTGljZW5zZSB8IGdpdC5pby9ub3JtYWxpemUgKi9odG1se2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWFydGljbGUsYXNpZGUsZGV0YWlscyxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLGhncm91cCxtYWluLG5hdixzZWN0aW9uLHN1bW1hcnl7ZGlzcGxheTpibG9ja31hdWRpbyxjYW52YXMscHJvZ3Jlc3MsdmlkZW97ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9YXVkaW86bm90KFtjb250cm9sc10pe2Rpc3BsYXk6bm9uZTtoZWlnaHQ6MH1baGlkZGVuXSx0ZW1wbGF0ZXtkaXNwbGF5Om5vbmV9YXtiYWNrZ3JvdW5kOjAgMH1hOmFjdGl2ZSxhOmhvdmVye291dGxpbmU6MH1hYmJyW3RpdGxlXXtib3JkZXItYm90dG9tOjFweCBkb3R0ZWR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6NzAwfWRmbntmb250LXN0eWxlOml0YWxpY31oMXtmb250LXNpemU6MmVtO21hcmdpbjouNjdlbSAwfW1hcmt7YmFja2dyb3VuZDojZmYwO2NvbG9yOiMwMDB9c21hbGx7Zm9udC1zaXplOjgwJX1zdWIsc3Vwe2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1zdXB7dG9wOi0uNWVtfXN1Yntib3R0b206LS4yNWVtfWltZ3tib3JkZXI6MH1zdmc6bm90KDpyb290KXtvdmVyZmxvdzpoaWRkZW59ZmlndXJle21hcmdpbjoxZW0gNDBweH1ocnstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtoZWlnaHQ6MH1wcmV7b3ZlcmZsb3c6YXV0b31jb2RlLGtiZCxwcmUsc2FtcHtmb250LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19YnV0dG9uLGlucHV0LG9wdGdyb3VwLHNlbGVjdCx0ZXh0YXJlYXtjb2xvcjppbmhlcml0O2ZvbnQ6aW5oZXJpdDttYXJnaW46MH1idXR0b257b3ZlcmZsb3c6dmlzaWJsZX1idXR0b24sc2VsZWN0e3RleHQtdHJhbnNmb3JtOm5vbmV9YnV0dG9uLGh0bWwgaW5wdXRbdHlwZT1idXR0b25dLGlucHV0W3R5cGU9cmVzZXRdLGlucHV0W3R5cGU9c3VibWl0XXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2N1cnNvcjpwb2ludGVyfWJ1dHRvbltkaXNhYmxlZF0saHRtbCBpbnB1dFtkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9YnV0dG9uOjotbW96LWZvY3VzLWlubmVyLGlucHV0OjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowO3BhZGRpbmc6MH1pbnB1dHtsaW5lLWhlaWdodDpub3JtYWx9aW5wdXRbdHlwZT1jaGVja2JveF0saW5wdXRbdHlwZT1yYWRpb117Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MH1pbnB1dFt0eXBlPW51bWJlcl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24saW5wdXRbdHlwZT1udW1iZXJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfWlucHV0W3R5cGU9c2VhcmNoXXstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkOy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveH1pbnB1dFt0eXBlPXNlYXJjaF06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24saW5wdXRbdHlwZT1zZWFyY2hdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfWZpZWxkc2V0e2JvcmRlcjoxcHggc29saWQgc2lsdmVyO21hcmdpbjowIDJweDtwYWRkaW5nOi4zNWVtIC42MjVlbSAuNzVlbX1sZWdlbmR7Ym9yZGVyOjA7cGFkZGluZzowfXRleHRhcmVhe292ZXJmbG93OmF1dG99b3B0Z3JvdXB7Zm9udC13ZWlnaHQ6NzAwfXRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowfXRkLHRoe3BhZGRpbmc6MH1AbWVkaWEgcHJpbnR7Knt0ZXh0LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjojMDAwIWltcG9ydGFudDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fWEsYTp2aXNpdGVke3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9YVtocmVmXTphZnRlcntjb250ZW50OiIgKCIgYXR0cihocmVmKSAiKSJ9YWJiclt0aXRsZV06YWZ0ZXJ7Y29udGVudDoiICgiIGF0dHIodGl0bGUpICIpIn1hW2hyZWZePSJqYXZhc2NyaXB0OiJdOmFmdGVyLGFbaHJlZl49IiMiXTphZnRlcntjb250ZW50OiIifXByZSxibG9ja3F1b3Rle2JvcmRlcjoxcHggc29saWQgIzk5OTtwYWdlLWJyZWFrLWluc2lkZTphdm9pZH10aGVhZHtkaXNwbGF5OnRhYmxlLWhlYWRlci1ncm91cH10cixpbWd7cGFnZS1icmVhay1pbnNpZGU6YXZvaWR9aW1ne21heC13aWR0aDoxMDAlIWltcG9ydGFudH1wLGgyLGgze29ycGhhbnM6Mzt3aWRvd3M6M31oMixoM3twYWdlLWJyZWFrLWFmdGVyOmF2b2lkfXNlbGVjdHtiYWNrZ3JvdW5kOiNmZmYhaW1wb3J0YW50fS5uYXZiYXJ7ZGlzcGxheTpub25lfS50YWJsZSB0ZCwudGFibGUgdGh7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudH0uYnRuPi5jYXJldCwuZHJvcHVwPi5idG4+LmNhcmV0e2JvcmRlci10b3AtY29sb3I6IzAwMCFpbXBvcnRhbnR9LmxhYmVse2JvcmRlcjoxcHggc29saWQgIzAwMH0udGFibGV7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlIWltcG9ydGFudH0udGFibGUtYm9yZGVyZWQgdGgsLnRhYmxlLWJvcmRlcmVkIHRke2JvcmRlcjoxcHggc29saWQgI2RkZCFpbXBvcnRhbnR9fSp7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fTpiZWZvcmUsOmFmdGVyey13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1se2ZvbnQtc2l6ZTo2Mi41JTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKX1ib2R5e2ZvbnQtZmFtaWx5OiJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2ZmZn1pbnB1dCxidXR0b24sc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7bGluZS1oZWlnaHQ6aW5oZXJpdH1he2NvbG9yOiM0MjhiY2E7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpob3ZlcixhOmZvY3Vze2NvbG9yOiMyYTY0OTY7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1hOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQ7b3V0bGluZTo1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7b3V0bGluZS1vZmZzZXQ6LTJweH1maWd1cmV7bWFyZ2luOjB9aW1ne3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaW1nLXJlc3BvbnNpdmUsLnRodW1ibmFpbD5pbWcsLnRodW1ibmFpbCBhPmltZywuY2Fyb3VzZWwtaW5uZXI+Lml0ZW0+aW1nLC5jYXJvdXNlbC1pbm5lcj4uaXRlbT5hPmltZ3tkaXNwbGF5OmJsb2NrO21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvfS5pbWctcm91bmRlZHtib3JkZXItcmFkaXVzOjZweH0uaW1nLXRodW1ibmFpbHtwYWRkaW5nOjRweDtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuMnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjphbGwgLjJzIGVhc2UtaW4tb3V0O2Rpc3BsYXk6aW5saW5lLWJsb2NrO21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvfS5pbWctY2lyY2xle2JvcmRlci1yYWRpdXM6NTAlfWhye21hcmdpbi10b3A6MjBweDttYXJnaW4tYm90dG9tOjIwcHg7Ym9yZGVyOjA7Ym9yZGVyLXRvcDoxcHggc29saWQgI2VlZX0uc3Itb25seXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7aGVpZ2h0OjFweDttYXJnaW46LTFweDtwYWRkaW5nOjA7b3ZlcmZsb3c6aGlkZGVuO2NsaXA6cmVjdCgwLDAsMCwwKTtib3JkZXI6MH1oMSxoMixoMyxoNCxoNSxoNiwuaDEsLmgyLC5oMywuaDQsLmg1LC5oNntmb250LWZhbWlseTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMDtsaW5lLWhlaWdodDoxLjE7Y29sb3I6aW5oZXJpdH1oMSBzbWFsbCxoMiBzbWFsbCxoMyBzbWFsbCxoNCBzbWFsbCxoNSBzbWFsbCxoNiBzbWFsbCwuaDEgc21hbGwsLmgyIHNtYWxsLC5oMyBzbWFsbCwuaDQgc21hbGwsLmg1IHNtYWxsLC5oNiBzbWFsbCxoMSAuc21hbGwsaDIgLnNtYWxsLGgzIC5zbWFsbCxoNCAuc21hbGwsaDUgLnNtYWxsLGg2IC5zbWFsbCwuaDEgLnNtYWxsLC5oMiAuc21hbGwsLmgzIC5zbWFsbCwuaDQgLnNtYWxsLC5oNSAuc21hbGwsLmg2IC5zbWFsbHtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojOTk5fWgxLC5oMSxoMiwuaDIsaDMsLmgze21hcmdpbi10b3A6MjBweDttYXJnaW4tYm90dG9tOjEwcHh9aDEgc21hbGwsLmgxIHNtYWxsLGgyIHNtYWxsLC5oMiBzbWFsbCxoMyBzbWFsbCwuaDMgc21hbGwsaDEgLnNtYWxsLC5oMSAuc21hbGwsaDIgLnNtYWxsLC5oMiAuc21hbGwsaDMgLnNtYWxsLC5oMyAuc21hbGx7Zm9udC1zaXplOjY1JX1oNCwuaDQsaDUsLmg1LGg2LC5oNnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fWg0IHNtYWxsLC5oNCBzbWFsbCxoNSBzbWFsbCwuaDUgc21hbGwsaDYgc21hbGwsLmg2IHNtYWxsLGg0IC5zbWFsbCwuaDQgLnNtYWxsLGg1IC5zbWFsbCwuaDUgLnNtYWxsLGg2IC5zbWFsbCwuaDYgLnNtYWxse2ZvbnQtc2l6ZTo3NSV9aDEsLmgxe2ZvbnQtc2l6ZTozNnB4fWgyLC5oMntmb250LXNpemU6MzBweH1oMywuaDN7Zm9udC1zaXplOjI0cHh9aDQsLmg0e2ZvbnQtc2l6ZToxOHB4fWg1LC5oNXtmb250LXNpemU6MTRweH1oNiwuaDZ7Zm9udC1zaXplOjEycHh9cHttYXJnaW46MCAwIDEwcHh9LmxlYWR7bWFyZ2luLWJvdHRvbToyMHB4O2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjIwMDtsaW5lLWhlaWdodDoxLjR9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5sZWFke2ZvbnQtc2l6ZToyMXB4fX1zbWFsbCwuc21hbGx7Zm9udC1zaXplOjg1JX1jaXRle2ZvbnQtc3R5bGU6bm9ybWFsfS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LXJpZ2h0e3RleHQtYWxpZ246cmlnaHR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS50ZXh0LWp1c3RpZnl7dGV4dC1hbGlnbjpqdXN0aWZ5fS50ZXh0LW11dGVke2NvbG9yOiM5OTl9LnRleHQtcHJpbWFyeXtjb2xvcjojNDI4YmNhfWEudGV4dC1wcmltYXJ5OmhvdmVye2NvbG9yOiMzMDcxYTl9LnRleHQtc3VjY2Vzc3tjb2xvcjojM2M3NjNkfWEudGV4dC1zdWNjZXNzOmhvdmVye2NvbG9yOiMyYjU0MmN9LnRleHQtaW5mb3tjb2xvcjojMzE3MDhmfWEudGV4dC1pbmZvOmhvdmVye2NvbG9yOiMyNDUyNjl9LnRleHQtd2FybmluZ3tjb2xvcjojOGE2ZDNifWEudGV4dC13YXJuaW5nOmhvdmVye2NvbG9yOiM2NjUxMmN9LnRleHQtZGFuZ2Vye2NvbG9yOiNhOTQ0NDJ9YS50ZXh0LWRhbmdlcjpob3Zlcntjb2xvcjojODQzNTM0fS5iZy1wcmltYXJ5e2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNDI4YmNhfWEuYmctcHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzMDcxYTl9LmJnLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojZGZmMGQ4fWEuYmctc3VjY2Vzczpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjMWUyYjN9LmJnLWluZm97YmFja2dyb3VuZC1jb2xvcjojZDllZGY3fWEuYmctaW5mbzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNhZmQ5ZWV9LmJnLXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzfWEuYmctd2FybmluZzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmN2VjYjV9LmJnLWRhbmdlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMmRlZGV9YS5iZy1kYW5nZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTRiOWI5fS5wYWdlLWhlYWRlcntwYWRkaW5nLWJvdHRvbTo5cHg7bWFyZ2luOjQwcHggMCAyMHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWV9dWwsb2x7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MTBweH11bCB1bCxvbCB1bCx1bCBvbCxvbCBvbHttYXJnaW4tYm90dG9tOjB9Lmxpc3QtdW5zdHlsZWR7cGFkZGluZy1sZWZ0OjA7bGlzdC1zdHlsZTpub25lfS5saXN0LWlubGluZXtwYWRkaW5nLWxlZnQ6MDtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luLWxlZnQ6LTVweH0ubGlzdC1pbmxpbmU+bGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZy1sZWZ0OjVweDtwYWRkaW5nLXJpZ2h0OjVweH1kbHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToyMHB4fWR0LGRke2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDN9ZHR7Zm9udC13ZWlnaHQ6NzAwfWRke21hcmdpbi1sZWZ0OjB9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5kbC1ob3Jpem9udGFsIGR0e2Zsb2F0OmxlZnQ7d2lkdGg6MTYwcHg7Y2xlYXI6bGVmdDt0ZXh0LWFsaWduOnJpZ2h0O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uZGwtaG9yaXpvbnRhbCBkZHttYXJnaW4tbGVmdDoxODBweH19YWJiclt0aXRsZV0sYWJicltkYXRhLW9yaWdpbmFsLXRpdGxlXXtjdXJzb3I6aGVscDtib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgIzk5OX0uaW5pdGlhbGlzbXtmb250LXNpemU6OTAlO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX1ibG9ja3F1b3Rle3BhZGRpbmc6MTBweCAyMHB4O21hcmdpbjowIDAgMjBweDtmb250LXNpemU6MTcuNXB4O2JvcmRlci1sZWZ0OjVweCBzb2xpZCAjZWVlfWJsb2NrcXVvdGUgcDpsYXN0LWNoaWxkLGJsb2NrcXVvdGUgdWw6bGFzdC1jaGlsZCxibG9ja3F1b3RlIG9sOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfWJsb2NrcXVvdGUgZm9vdGVyLGJsb2NrcXVvdGUgc21hbGwsYmxvY2txdW90ZSAuc21hbGx7ZGlzcGxheTpibG9jaztmb250LXNpemU6ODAlO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7Y29sb3I6Izk5OX1ibG9ja3F1b3RlIGZvb3RlcjpiZWZvcmUsYmxvY2txdW90ZSBzbWFsbDpiZWZvcmUsYmxvY2txdW90ZSAuc21hbGw6YmVmb3Jle2NvbnRlbnQ6J1wyMDE0IFwwMEEwJ30uYmxvY2txdW90ZS1yZXZlcnNlLGJsb2NrcXVvdGUucHVsbC1yaWdodHtwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjA7Ym9yZGVyLXJpZ2h0OjVweCBzb2xpZCAjZWVlO2JvcmRlci1sZWZ0OjA7dGV4dC1hbGlnbjpyaWdodH0uYmxvY2txdW90ZS1yZXZlcnNlIGZvb3RlcjpiZWZvcmUsYmxvY2txdW90ZS5wdWxsLXJpZ2h0IGZvb3RlcjpiZWZvcmUsLmJsb2NrcXVvdGUtcmV2ZXJzZSBzbWFsbDpiZWZvcmUsYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxsOmJlZm9yZSwuYmxvY2txdW90ZS1yZXZlcnNlIC5zbWFsbDpiZWZvcmUsYmxvY2txdW90ZS5wdWxsLXJpZ2h0IC5zbWFsbDpiZWZvcmV7Y29udGVudDonJ30uYmxvY2txdW90ZS1yZXZlcnNlIGZvb3RlcjphZnRlcixibG9ja3F1b3RlLnB1bGwtcmlnaHQgZm9vdGVyOmFmdGVyLC5ibG9ja3F1b3RlLXJldmVyc2Ugc21hbGw6YWZ0ZXIsYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxsOmFmdGVyLC5ibG9ja3F1b3RlLXJldmVyc2UgLnNtYWxsOmFmdGVyLGJsb2NrcXVvdGUucHVsbC1yaWdodCAuc21hbGw6YWZ0ZXJ7Y29udGVudDonXDAwQTAgXDIwMTQnfWJsb2NrcXVvdGU6YmVmb3JlLGJsb2NrcXVvdGU6YWZ0ZXJ7Y29udGVudDoiIn1hZGRyZXNze21hcmdpbi1ib3R0b206MjBweDtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDoxLjQyODU3MTQzfWNvZGUsa2JkLHByZSxzYW1we2ZvbnQtZmFtaWx5Ok1lbmxvLE1vbmFjbyxDb25zb2xhcywiQ291cmllciBOZXciLG1vbm9zcGFjZX1jb2Rle3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6OTAlO2NvbG9yOiNjNzI1NGU7YmFja2dyb3VuZC1jb2xvcjojZjlmMmY0O3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXItcmFkaXVzOjRweH1rYmR7cGFkZGluZzoycHggNHB4O2ZvbnQtc2l6ZTo5MCU7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzMzM7Ym9yZGVyLXJhZGl1czozcHg7Ym94LXNoYWRvdzppbnNldCAwIC0xcHggMCByZ2JhKDAsMCwwLC4yNSl9cHJle2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo5LjVweDttYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mzt3b3JkLWJyZWFrOmJyZWFrLWFsbDt3b3JkLXdyYXA6YnJlYWstd29yZDtjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJhZGl1czo0cHh9cHJlIGNvZGV7cGFkZGluZzowO2ZvbnQtc2l6ZTppbmhlcml0O2NvbG9yOmluaGVyaXQ7d2hpdGUtc3BhY2U6cHJlLXdyYXA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjB9LnByZS1zY3JvbGxhYmxle21heC1oZWlnaHQ6MzQwcHg7b3ZlcmZsb3cteTpzY3JvbGx9LmNvbnRhaW5lcnttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvO3BhZGRpbmctbGVmdDoxNXB4O3BhZGRpbmctcmlnaHQ6MTVweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmNvbnRhaW5lcnt3aWR0aDo3NTBweH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5jb250YWluZXJ7d2lkdGg6OTcwcHh9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LmNvbnRhaW5lcnt3aWR0aDoxMTcwcHh9fS5jb250YWluZXItZmx1aWR7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0bztwYWRkaW5nLWxlZnQ6MTVweDtwYWRkaW5nLXJpZ2h0OjE1cHh9LnJvd3ttYXJnaW4tbGVmdDotMTVweDttYXJnaW4tcmlnaHQ6LTE1cHh9LmNvbC14cy0xLC5jb2wtc20tMSwuY29sLW1kLTEsLmNvbC1sZy0xLC5jb2wteHMtMiwuY29sLXNtLTIsLmNvbC1tZC0yLC5jb2wtbGctMiwuY29sLXhzLTMsLmNvbC1zbS0zLC5jb2wtbWQtMywuY29sLWxnLTMsLmNvbC14cy00LC5jb2wtc20tNCwuY29sLW1kLTQsLmNvbC1sZy00LC5jb2wteHMtNSwuY29sLXNtLTUsLmNvbC1tZC01LC5jb2wtbGctNSwuY29sLXhzLTYsLmNvbC1zbS02LC5jb2wtbWQtNiwuY29sLWxnLTYsLmNvbC14cy03LC5jb2wtc20tNywuY29sLW1kLTcsLmNvbC1sZy03LC5jb2wteHMtOCwuY29sLXNtLTgsLmNvbC1tZC04LC5jb2wtbGctOCwuY29sLXhzLTksLmNvbC1zbS05LC5jb2wtbWQtOSwuY29sLWxnLTksLmNvbC14cy0xMCwuY29sLXNtLTEwLC5jb2wtbWQtMTAsLmNvbC1sZy0xMCwuY29sLXhzLTExLC5jb2wtc20tMTEsLmNvbC1tZC0xMSwuY29sLWxnLTExLC5jb2wteHMtMTIsLmNvbC1zbS0xMiwuY29sLW1kLTEyLC5jb2wtbGctMTJ7cG9zaXRpb246cmVsYXRpdmU7bWluLWhlaWdodDoxcHg7cGFkZGluZy1sZWZ0OjE1cHg7cGFkZGluZy1yaWdodDoxNXB4fS5jb2wteHMtMSwuY29sLXhzLTIsLmNvbC14cy0zLC5jb2wteHMtNCwuY29sLXhzLTUsLmNvbC14cy02LC5jb2wteHMtNywuY29sLXhzLTgsLmNvbC14cy05LC5jb2wteHMtMTAsLmNvbC14cy0xMSwuY29sLXhzLTEye2Zsb2F0OmxlZnR9LmNvbC14cy0xMnt3aWR0aDoxMDAlfS5jb2wteHMtMTF7d2lkdGg6OTEuNjY2NjY2NjclfS5jb2wteHMtMTB7d2lkdGg6ODMuMzMzMzMzMzMlfS5jb2wteHMtOXt3aWR0aDo3NSV9LmNvbC14cy04e3dpZHRoOjY2LjY2NjY2NjY3JX0uY29sLXhzLTd7d2lkdGg6NTguMzMzMzMzMzMlfS5jb2wteHMtNnt3aWR0aDo1MCV9LmNvbC14cy01e3dpZHRoOjQxLjY2NjY2NjY3JX0uY29sLXhzLTR7d2lkdGg6MzMuMzMzMzMzMzMlfS5jb2wteHMtM3t3aWR0aDoyNSV9LmNvbC14cy0ye3dpZHRoOjE2LjY2NjY2NjY3JX0uY29sLXhzLTF7d2lkdGg6OC4zMzMzMzMzMyV9LmNvbC14cy1wdWxsLTEye3JpZ2h0OjEwMCV9LmNvbC14cy1wdWxsLTExe3JpZ2h0OjkxLjY2NjY2NjY3JX0uY29sLXhzLXB1bGwtMTB7cmlnaHQ6ODMuMzMzMzMzMzMlfS5jb2wteHMtcHVsbC05e3JpZ2h0Ojc1JX0uY29sLXhzLXB1bGwtOHtyaWdodDo2Ni42NjY2NjY2NyV9LmNvbC14cy1wdWxsLTd7cmlnaHQ6NTguMzMzMzMzMzMlfS5jb2wteHMtcHVsbC02e3JpZ2h0OjUwJX0uY29sLXhzLXB1bGwtNXtyaWdodDo0MS42NjY2NjY2NyV9LmNvbC14cy1wdWxsLTR7cmlnaHQ6MzMuMzMzMzMzMzMlfS5jb2wteHMtcHVsbC0ze3JpZ2h0OjI1JX0uY29sLXhzLXB1bGwtMntyaWdodDoxNi42NjY2NjY2NyV9LmNvbC14cy1wdWxsLTF7cmlnaHQ6OC4zMzMzMzMzMyV9LmNvbC14cy1wdWxsLTB7cmlnaHQ6MH0uY29sLXhzLXB1c2gtMTJ7bGVmdDoxMDAlfS5jb2wteHMtcHVzaC0xMXtsZWZ0OjkxLjY2NjY2NjY3JX0uY29sLXhzLXB1c2gtMTB7bGVmdDo4My4zMzMzMzMzMyV9LmNvbC14cy1wdXNoLTl7bGVmdDo3NSV9LmNvbC14cy1wdXNoLTh7bGVmdDo2Ni42NjY2NjY2NyV9LmNvbC14cy1wdXNoLTd7bGVmdDo1OC4zMzMzMzMzMyV9LmNvbC14cy1wdXNoLTZ7bGVmdDo1MCV9LmNvbC14cy1wdXNoLTV7bGVmdDo0MS42NjY2NjY2NyV9LmNvbC14cy1wdXNoLTR7bGVmdDozMy4zMzMzMzMzMyV9LmNvbC14cy1wdXNoLTN7bGVmdDoyNSV9LmNvbC14cy1wdXNoLTJ7bGVmdDoxNi42NjY2NjY2NyV9LmNvbC14cy1wdXNoLTF7bGVmdDo4LjMzMzMzMzMzJX0uY29sLXhzLXB1c2gtMHtsZWZ0OjB9LmNvbC14cy1vZmZzZXQtMTJ7bWFyZ2luLWxlZnQ6MTAwJX0uY29sLXhzLW9mZnNldC0xMXttYXJnaW4tbGVmdDo5MS42NjY2NjY2NyV9LmNvbC14cy1vZmZzZXQtMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMzMzMlfS5jb2wteHMtb2Zmc2V0LTl7bWFyZ2luLWxlZnQ6NzUlfS5jb2wteHMtb2Zmc2V0LTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjY2NjclfS5jb2wteHMtb2Zmc2V0LTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMzMzMlfS5jb2wteHMtb2Zmc2V0LTZ7bWFyZ2luLWxlZnQ6NTAlfS5jb2wteHMtb2Zmc2V0LTV7bWFyZ2luLWxlZnQ6NDEuNjY2NjY2NjclfS5jb2wteHMtb2Zmc2V0LTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMzMzMlfS5jb2wteHMtb2Zmc2V0LTN7bWFyZ2luLWxlZnQ6MjUlfS5jb2wteHMtb2Zmc2V0LTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjY2NjclfS5jb2wteHMtb2Zmc2V0LTF7bWFyZ2luLWxlZnQ6OC4zMzMzMzMzMyV9LmNvbC14cy1vZmZzZXQtMHttYXJnaW4tbGVmdDowfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuY29sLXNtLTEsLmNvbC1zbS0yLC5jb2wtc20tMywuY29sLXNtLTQsLmNvbC1zbS01LC5jb2wtc20tNiwuY29sLXNtLTcsLmNvbC1zbS04LC5jb2wtc20tOSwuY29sLXNtLTEwLC5jb2wtc20tMTEsLmNvbC1zbS0xMntmbG9hdDpsZWZ0fS5jb2wtc20tMTJ7d2lkdGg6MTAwJX0uY29sLXNtLTExe3dpZHRoOjkxLjY2NjY2NjY3JX0uY29sLXNtLTEwe3dpZHRoOjgzLjMzMzMzMzMzJX0uY29sLXNtLTl7d2lkdGg6NzUlfS5jb2wtc20tOHt3aWR0aDo2Ni42NjY2NjY2NyV9LmNvbC1zbS03e3dpZHRoOjU4LjMzMzMzMzMzJX0uY29sLXNtLTZ7d2lkdGg6NTAlfS5jb2wtc20tNXt3aWR0aDo0MS42NjY2NjY2NyV9LmNvbC1zbS00e3dpZHRoOjMzLjMzMzMzMzMzJX0uY29sLXNtLTN7d2lkdGg6MjUlfS5jb2wtc20tMnt3aWR0aDoxNi42NjY2NjY2NyV9LmNvbC1zbS0xe3dpZHRoOjguMzMzMzMzMzMlfS5jb2wtc20tcHVsbC0xMntyaWdodDoxMDAlfS5jb2wtc20tcHVsbC0xMXtyaWdodDo5MS42NjY2NjY2NyV9LmNvbC1zbS1wdWxsLTEwe3JpZ2h0OjgzLjMzMzMzMzMzJX0uY29sLXNtLXB1bGwtOXtyaWdodDo3NSV9LmNvbC1zbS1wdWxsLTh7cmlnaHQ6NjYuNjY2NjY2NjclfS5jb2wtc20tcHVsbC03e3JpZ2h0OjU4LjMzMzMzMzMzJX0uY29sLXNtLXB1bGwtNntyaWdodDo1MCV9LmNvbC1zbS1wdWxsLTV7cmlnaHQ6NDEuNjY2NjY2NjclfS5jb2wtc20tcHVsbC00e3JpZ2h0OjMzLjMzMzMzMzMzJX0uY29sLXNtLXB1bGwtM3tyaWdodDoyNSV9LmNvbC1zbS1wdWxsLTJ7cmlnaHQ6MTYuNjY2NjY2NjclfS5jb2wtc20tcHVsbC0xe3JpZ2h0OjguMzMzMzMzMzMlfS5jb2wtc20tcHVsbC0we3JpZ2h0OjB9LmNvbC1zbS1wdXNoLTEye2xlZnQ6MTAwJX0uY29sLXNtLXB1c2gtMTF7bGVmdDo5MS42NjY2NjY2NyV9LmNvbC1zbS1wdXNoLTEwe2xlZnQ6ODMuMzMzMzMzMzMlfS5jb2wtc20tcHVzaC05e2xlZnQ6NzUlfS5jb2wtc20tcHVzaC04e2xlZnQ6NjYuNjY2NjY2NjclfS5jb2wtc20tcHVzaC03e2xlZnQ6NTguMzMzMzMzMzMlfS5jb2wtc20tcHVzaC02e2xlZnQ6NTAlfS5jb2wtc20tcHVzaC01e2xlZnQ6NDEuNjY2NjY2NjclfS5jb2wtc20tcHVzaC00e2xlZnQ6MzMuMzMzMzMzMzMlfS5jb2wtc20tcHVzaC0ze2xlZnQ6MjUlfS5jb2wtc20tcHVzaC0ye2xlZnQ6MTYuNjY2NjY2NjclfS5jb2wtc20tcHVzaC0xe2xlZnQ6OC4zMzMzMzMzMyV9LmNvbC1zbS1wdXNoLTB7bGVmdDowfS5jb2wtc20tb2Zmc2V0LTEye21hcmdpbi1sZWZ0OjEwMCV9LmNvbC1zbS1vZmZzZXQtMTF7bWFyZ2luLWxlZnQ6OTEuNjY2NjY2NjclfS5jb2wtc20tb2Zmc2V0LTEwe21hcmdpbi1sZWZ0OjgzLjMzMzMzMzMzJX0uY29sLXNtLW9mZnNldC05e21hcmdpbi1sZWZ0Ojc1JX0uY29sLXNtLW9mZnNldC04e21hcmdpbi1sZWZ0OjY2LjY2NjY2NjY3JX0uY29sLXNtLW9mZnNldC03e21hcmdpbi1sZWZ0OjU4LjMzMzMzMzMzJX0uY29sLXNtLW9mZnNldC02e21hcmdpbi1sZWZ0OjUwJX0uY29sLXNtLW9mZnNldC01e21hcmdpbi1sZWZ0OjQxLjY2NjY2NjY3JX0uY29sLXNtLW9mZnNldC00e21hcmdpbi1sZWZ0OjMzLjMzMzMzMzMzJX0uY29sLXNtLW9mZnNldC0ze21hcmdpbi1sZWZ0OjI1JX0uY29sLXNtLW9mZnNldC0ye21hcmdpbi1sZWZ0OjE2LjY2NjY2NjY3JX0uY29sLXNtLW9mZnNldC0xe21hcmdpbi1sZWZ0OjguMzMzMzMzMzMlfS5jb2wtc20tb2Zmc2V0LTB7bWFyZ2luLWxlZnQ6MH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5jb2wtbWQtMSwuY29sLW1kLTIsLmNvbC1tZC0zLC5jb2wtbWQtNCwuY29sLW1kLTUsLmNvbC1tZC02LC5jb2wtbWQtNywuY29sLW1kLTgsLmNvbC1tZC05LC5jb2wtbWQtMTAsLmNvbC1tZC0xMSwuY29sLW1kLTEye2Zsb2F0OmxlZnR9LmNvbC1tZC0xMnt3aWR0aDoxMDAlfS5jb2wtbWQtMTF7d2lkdGg6OTEuNjY2NjY2NjclfS5jb2wtbWQtMTB7d2lkdGg6ODMuMzMzMzMzMzMlfS5jb2wtbWQtOXt3aWR0aDo3NSV9LmNvbC1tZC04e3dpZHRoOjY2LjY2NjY2NjY3JX0uY29sLW1kLTd7d2lkdGg6NTguMzMzMzMzMzMlfS5jb2wtbWQtNnt3aWR0aDo1MCV9LmNvbC1tZC01e3dpZHRoOjQxLjY2NjY2NjY3JX0uY29sLW1kLTR7d2lkdGg6MzMuMzMzMzMzMzMlfS5jb2wtbWQtM3t3aWR0aDoyNSV9LmNvbC1tZC0ye3dpZHRoOjE2LjY2NjY2NjY3JX0uY29sLW1kLTF7d2lkdGg6OC4zMzMzMzMzMyV9LmNvbC1tZC1wdWxsLTEye3JpZ2h0OjEwMCV9LmNvbC1tZC1wdWxsLTExe3JpZ2h0OjkxLjY2NjY2NjY3JX0uY29sLW1kLXB1bGwtMTB7cmlnaHQ6ODMuMzMzMzMzMzMlfS5jb2wtbWQtcHVsbC05e3JpZ2h0Ojc1JX0uY29sLW1kLXB1bGwtOHtyaWdodDo2Ni42NjY2NjY2NyV9LmNvbC1tZC1wdWxsLTd7cmlnaHQ6NTguMzMzMzMzMzMlfS5jb2wtbWQtcHVsbC02e3JpZ2h0OjUwJX0uY29sLW1kLXB1bGwtNXtyaWdodDo0MS42NjY2NjY2NyV9LmNvbC1tZC1wdWxsLTR7cmlnaHQ6MzMuMzMzMzMzMzMlfS5jb2wtbWQtcHVsbC0ze3JpZ2h0OjI1JX0uY29sLW1kLXB1bGwtMntyaWdodDoxNi42NjY2NjY2NyV9LmNvbC1tZC1wdWxsLTF7cmlnaHQ6OC4zMzMzMzMzMyV9LmNvbC1tZC1wdWxsLTB7cmlnaHQ6MH0uY29sLW1kLXB1c2gtMTJ7bGVmdDoxMDAlfS5jb2wtbWQtcHVzaC0xMXtsZWZ0OjkxLjY2NjY2NjY3JX0uY29sLW1kLXB1c2gtMTB7bGVmdDo4My4zMzMzMzMzMyV9LmNvbC1tZC1wdXNoLTl7bGVmdDo3NSV9LmNvbC1tZC1wdXNoLTh7bGVmdDo2Ni42NjY2NjY2NyV9LmNvbC1tZC1wdXNoLTd7bGVmdDo1OC4zMzMzMzMzMyV9LmNvbC1tZC1wdXNoLTZ7bGVmdDo1MCV9LmNvbC1tZC1wdXNoLTV7bGVmdDo0MS42NjY2NjY2NyV9LmNvbC1tZC1wdXNoLTR7bGVmdDozMy4zMzMzMzMzMyV9LmNvbC1tZC1wdXNoLTN7bGVmdDoyNSV9LmNvbC1tZC1wdXNoLTJ7bGVmdDoxNi42NjY2NjY2NyV9LmNvbC1tZC1wdXNoLTF7bGVmdDo4LjMzMzMzMzMzJX0uY29sLW1kLXB1c2gtMHtsZWZ0OjB9LmNvbC1tZC1vZmZzZXQtMTJ7bWFyZ2luLWxlZnQ6MTAwJX0uY29sLW1kLW9mZnNldC0xMXttYXJnaW4tbGVmdDo5MS42NjY2NjY2NyV9LmNvbC1tZC1vZmZzZXQtMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMzMzMlfS5jb2wtbWQtb2Zmc2V0LTl7bWFyZ2luLWxlZnQ6NzUlfS5jb2wtbWQtb2Zmc2V0LTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjY2NjclfS5jb2wtbWQtb2Zmc2V0LTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMzMzMlfS5jb2wtbWQtb2Zmc2V0LTZ7bWFyZ2luLWxlZnQ6NTAlfS5jb2wtbWQtb2Zmc2V0LTV7bWFyZ2luLWxlZnQ6NDEuNjY2NjY2NjclfS5jb2wtbWQtb2Zmc2V0LTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMzMzMlfS5jb2wtbWQtb2Zmc2V0LTN7bWFyZ2luLWxlZnQ6MjUlfS5jb2wtbWQtb2Zmc2V0LTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjY2NjclfS5jb2wtbWQtb2Zmc2V0LTF7bWFyZ2luLWxlZnQ6OC4zMzMzMzMzMyV9LmNvbC1tZC1vZmZzZXQtMHttYXJnaW4tbGVmdDowfX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey5jb2wtbGctMSwuY29sLWxnLTIsLmNvbC1sZy0zLC5jb2wtbGctNCwuY29sLWxnLTUsLmNvbC1sZy02LC5jb2wtbGctNywuY29sLWxnLTgsLmNvbC1sZy05LC5jb2wtbGctMTAsLmNvbC1sZy0xMSwuY29sLWxnLTEye2Zsb2F0OmxlZnR9LmNvbC1sZy0xMnt3aWR0aDoxMDAlfS5jb2wtbGctMTF7d2lkdGg6OTEuNjY2NjY2NjclfS5jb2wtbGctMTB7d2lkdGg6ODMuMzMzMzMzMzMlfS5jb2wtbGctOXt3aWR0aDo3NSV9LmNvbC1sZy04e3dpZHRoOjY2LjY2NjY2NjY3JX0uY29sLWxnLTd7d2lkdGg6NTguMzMzMzMzMzMlfS5jb2wtbGctNnt3aWR0aDo1MCV9LmNvbC1sZy01e3dpZHRoOjQxLjY2NjY2NjY3JX0uY29sLWxnLTR7d2lkdGg6MzMuMzMzMzMzMzMlfS5jb2wtbGctM3t3aWR0aDoyNSV9LmNvbC1sZy0ye3dpZHRoOjE2LjY2NjY2NjY3JX0uY29sLWxnLTF7d2lkdGg6OC4zMzMzMzMzMyV9LmNvbC1sZy1wdWxsLTEye3JpZ2h0OjEwMCV9LmNvbC1sZy1wdWxsLTExe3JpZ2h0OjkxLjY2NjY2NjY3JX0uY29sLWxnLXB1bGwtMTB7cmlnaHQ6ODMuMzMzMzMzMzMlfS5jb2wtbGctcHVsbC05e3JpZ2h0Ojc1JX0uY29sLWxnLXB1bGwtOHtyaWdodDo2Ni42NjY2NjY2NyV9LmNvbC1sZy1wdWxsLTd7cmlnaHQ6NTguMzMzMzMzMzMlfS5jb2wtbGctcHVsbC02e3JpZ2h0OjUwJX0uY29sLWxnLXB1bGwtNXtyaWdodDo0MS42NjY2NjY2NyV9LmNvbC1sZy1wdWxsLTR7cmlnaHQ6MzMuMzMzMzMzMzMlfS5jb2wtbGctcHVsbC0ze3JpZ2h0OjI1JX0uY29sLWxnLXB1bGwtMntyaWdodDoxNi42NjY2NjY2NyV9LmNvbC1sZy1wdWxsLTF7cmlnaHQ6OC4zMzMzMzMzMyV9LmNvbC1sZy1wdWxsLTB7cmlnaHQ6MH0uY29sLWxnLXB1c2gtMTJ7bGVmdDoxMDAlfS5jb2wtbGctcHVzaC0xMXtsZWZ0OjkxLjY2NjY2NjY3JX0uY29sLWxnLXB1c2gtMTB7bGVmdDo4My4zMzMzMzMzMyV9LmNvbC1sZy1wdXNoLTl7bGVmdDo3NSV9LmNvbC1sZy1wdXNoLTh7bGVmdDo2Ni42NjY2NjY2NyV9LmNvbC1sZy1wdXNoLTd7bGVmdDo1OC4zMzMzMzMzMyV9LmNvbC1sZy1wdXNoLTZ7bGVmdDo1MCV9LmNvbC1sZy1wdXNoLTV7bGVmdDo0MS42NjY2NjY2NyV9LmNvbC1sZy1wdXNoLTR7bGVmdDozMy4zMzMzMzMzMyV9LmNvbC1sZy1wdXNoLTN7bGVmdDoyNSV9LmNvbC1sZy1wdXNoLTJ7bGVmdDoxNi42NjY2NjY2NyV9LmNvbC1sZy1wdXNoLTF7bGVmdDo4LjMzMzMzMzMzJX0uY29sLWxnLXB1c2gtMHtsZWZ0OjB9LmNvbC1sZy1vZmZzZXQtMTJ7bWFyZ2luLWxlZnQ6MTAwJX0uY29sLWxnLW9mZnNldC0xMXttYXJnaW4tbGVmdDo5MS42NjY2NjY2NyV9LmNvbC1sZy1vZmZzZXQtMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMzMzMlfS5jb2wtbGctb2Zmc2V0LTl7bWFyZ2luLWxlZnQ6NzUlfS5jb2wtbGctb2Zmc2V0LTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjY2NjclfS5jb2wtbGctb2Zmc2V0LTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMzMzMlfS5jb2wtbGctb2Zmc2V0LTZ7bWFyZ2luLWxlZnQ6NTAlfS5jb2wtbGctb2Zmc2V0LTV7bWFyZ2luLWxlZnQ6NDEuNjY2NjY2NjclfS5jb2wtbGctb2Zmc2V0LTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMzMzMlfS5jb2wtbGctb2Zmc2V0LTN7bWFyZ2luLWxlZnQ6MjUlfS5jb2wtbGctb2Zmc2V0LTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjY2NjclfS5jb2wtbGctb2Zmc2V0LTF7bWFyZ2luLWxlZnQ6OC4zMzMzMzMzMyV9LmNvbC1sZy1vZmZzZXQtMHttYXJnaW4tbGVmdDowfX10YWJsZXttYXgtd2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fXRoe3RleHQtYWxpZ246bGVmdH0udGFibGV7d2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjIwcHh9LnRhYmxlPnRoZWFkPnRyPnRoLC50YWJsZT50Ym9keT50cj50aCwudGFibGU+dGZvb3Q+dHI+dGgsLnRhYmxlPnRoZWFkPnRyPnRkLC50YWJsZT50Ym9keT50cj50ZCwudGFibGU+dGZvb3Q+dHI+dGR7cGFkZGluZzo4cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mzt2ZXJ0aWNhbC1hbGlnbjp0b3A7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RkZH0udGFibGU+dGhlYWQ+dHI+dGh7dmVydGljYWwtYWxpZ246Ym90dG9tO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNkZGR9LnRhYmxlPmNhcHRpb24rdGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGgsLnRhYmxlPmNvbGdyb3VwK3RoZWFkPnRyOmZpcnN0LWNoaWxkPnRoLC50YWJsZT50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZD50aCwudGFibGU+Y2FwdGlvbit0aGVhZD50cjpmaXJzdC1jaGlsZD50ZCwudGFibGU+Y29sZ3JvdXArdGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGQsLnRhYmxlPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkPnRke2JvcmRlci10b3A6MH0udGFibGU+dGJvZHkrdGJvZHl7Ym9yZGVyLXRvcDoycHggc29saWQgI2RkZH0udGFibGUgLnRhYmxle2JhY2tncm91bmQtY29sb3I6I2ZmZn0udGFibGUtY29uZGVuc2VkPnRoZWFkPnRyPnRoLC50YWJsZS1jb25kZW5zZWQ+dGJvZHk+dHI+dGgsLnRhYmxlLWNvbmRlbnNlZD50Zm9vdD50cj50aCwudGFibGUtY29uZGVuc2VkPnRoZWFkPnRyPnRkLC50YWJsZS1jb25kZW5zZWQ+dGJvZHk+dHI+dGQsLnRhYmxlLWNvbmRlbnNlZD50Zm9vdD50cj50ZHtwYWRkaW5nOjVweH0udGFibGUtYm9yZGVyZWR7Ym9yZGVyOjFweCBzb2xpZCAjZGRkfS50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aCwudGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGgsLnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRoLC50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50ZCwudGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGQsLnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRke2JvcmRlcjoxcHggc29saWQgI2RkZH0udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGgsLnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRke2JvcmRlci1ib3R0b20td2lkdGg6MnB4fS50YWJsZS1zdHJpcGVkPnRib2R5PnRyOm50aC1jaGlsZChvZGQpPnRkLC50YWJsZS1zdHJpcGVkPnRib2R5PnRyOm50aC1jaGlsZChvZGQpPnRoe2JhY2tncm91bmQtY29sb3I6I2Y5ZjlmOX0udGFibGUtaG92ZXI+dGJvZHk+dHI6aG92ZXI+dGQsLnRhYmxlLWhvdmVyPnRib2R5PnRyOmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX10YWJsZSBjb2xbY2xhc3MqPWNvbC1de3Bvc2l0aW9uOnN0YXRpYztmbG9hdDpub25lO2Rpc3BsYXk6dGFibGUtY29sdW1ufXRhYmxlIHRkW2NsYXNzKj1jb2wtXSx0YWJsZSB0aFtjbGFzcyo9Y29sLV17cG9zaXRpb246c3RhdGljO2Zsb2F0Om5vbmU7ZGlzcGxheTp0YWJsZS1jZWxsfS50YWJsZT50aGVhZD50cj50ZC5hY3RpdmUsLnRhYmxlPnRib2R5PnRyPnRkLmFjdGl2ZSwudGFibGU+dGZvb3Q+dHI+dGQuYWN0aXZlLC50YWJsZT50aGVhZD50cj50aC5hY3RpdmUsLnRhYmxlPnRib2R5PnRyPnRoLmFjdGl2ZSwudGFibGU+dGZvb3Q+dHI+dGguYWN0aXZlLC50YWJsZT50aGVhZD50ci5hY3RpdmU+dGQsLnRhYmxlPnRib2R5PnRyLmFjdGl2ZT50ZCwudGFibGU+dGZvb3Q+dHIuYWN0aXZlPnRkLC50YWJsZT50aGVhZD50ci5hY3RpdmU+dGgsLnRhYmxlPnRib2R5PnRyLmFjdGl2ZT50aCwudGFibGU+dGZvb3Q+dHIuYWN0aXZlPnRoe2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX0udGFibGUtaG92ZXI+dGJvZHk+dHI+dGQuYWN0aXZlOmhvdmVyLC50YWJsZS1ob3Zlcj50Ym9keT50cj50aC5hY3RpdmU6aG92ZXIsLnRhYmxlLWhvdmVyPnRib2R5PnRyLmFjdGl2ZTpob3Zlcj50ZCwudGFibGUtaG92ZXI+dGJvZHk+dHIuYWN0aXZlOmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2U4ZThlOH0udGFibGU+dGhlYWQ+dHI+dGQuc3VjY2VzcywudGFibGU+dGJvZHk+dHI+dGQuc3VjY2VzcywudGFibGU+dGZvb3Q+dHI+dGQuc3VjY2VzcywudGFibGU+dGhlYWQ+dHI+dGguc3VjY2VzcywudGFibGU+dGJvZHk+dHI+dGguc3VjY2VzcywudGFibGU+dGZvb3Q+dHI+dGguc3VjY2VzcywudGFibGU+dGhlYWQ+dHIuc3VjY2Vzcz50ZCwudGFibGU+dGJvZHk+dHIuc3VjY2Vzcz50ZCwudGFibGU+dGZvb3Q+dHIuc3VjY2Vzcz50ZCwudGFibGU+dGhlYWQ+dHIuc3VjY2Vzcz50aCwudGFibGU+dGJvZHk+dHIuc3VjY2Vzcz50aCwudGFibGU+dGZvb3Q+dHIuc3VjY2Vzcz50aHtiYWNrZ3JvdW5kLWNvbG9yOiNkZmYwZDh9LnRhYmxlLWhvdmVyPnRib2R5PnRyPnRkLnN1Y2Nlc3M6aG92ZXIsLnRhYmxlLWhvdmVyPnRib2R5PnRyPnRoLnN1Y2Nlc3M6aG92ZXIsLnRhYmxlLWhvdmVyPnRib2R5PnRyLnN1Y2Nlc3M6aG92ZXI+dGQsLnRhYmxlLWhvdmVyPnRib2R5PnRyLnN1Y2Nlc3M6aG92ZXI+dGh7YmFja2dyb3VuZC1jb2xvcjojZDBlOWM2fS50YWJsZT50aGVhZD50cj50ZC5pbmZvLC50YWJsZT50Ym9keT50cj50ZC5pbmZvLC50YWJsZT50Zm9vdD50cj50ZC5pbmZvLC50YWJsZT50aGVhZD50cj50aC5pbmZvLC50YWJsZT50Ym9keT50cj50aC5pbmZvLC50YWJsZT50Zm9vdD50cj50aC5pbmZvLC50YWJsZT50aGVhZD50ci5pbmZvPnRkLC50YWJsZT50Ym9keT50ci5pbmZvPnRkLC50YWJsZT50Zm9vdD50ci5pbmZvPnRkLC50YWJsZT50aGVhZD50ci5pbmZvPnRoLC50YWJsZT50Ym9keT50ci5pbmZvPnRoLC50YWJsZT50Zm9vdD50ci5pbmZvPnRoe2JhY2tncm91bmQtY29sb3I6I2Q5ZWRmN30udGFibGUtaG92ZXI+dGJvZHk+dHI+dGQuaW5mbzpob3ZlciwudGFibGUtaG92ZXI+dGJvZHk+dHI+dGguaW5mbzpob3ZlciwudGFibGUtaG92ZXI+dGJvZHk+dHIuaW5mbzpob3Zlcj50ZCwudGFibGUtaG92ZXI+dGJvZHk+dHIuaW5mbzpob3Zlcj50aHtiYWNrZ3JvdW5kLWNvbG9yOiNjNGUzZjN9LnRhYmxlPnRoZWFkPnRyPnRkLndhcm5pbmcsLnRhYmxlPnRib2R5PnRyPnRkLndhcm5pbmcsLnRhYmxlPnRmb290PnRyPnRkLndhcm5pbmcsLnRhYmxlPnRoZWFkPnRyPnRoLndhcm5pbmcsLnRhYmxlPnRib2R5PnRyPnRoLndhcm5pbmcsLnRhYmxlPnRmb290PnRyPnRoLndhcm5pbmcsLnRhYmxlPnRoZWFkPnRyLndhcm5pbmc+dGQsLnRhYmxlPnRib2R5PnRyLndhcm5pbmc+dGQsLnRhYmxlPnRmb290PnRyLndhcm5pbmc+dGQsLnRhYmxlPnRoZWFkPnRyLndhcm5pbmc+dGgsLnRhYmxlPnRib2R5PnRyLndhcm5pbmc+dGgsLnRhYmxlPnRmb290PnRyLndhcm5pbmc+dGh7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzfS50YWJsZS1ob3Zlcj50Ym9keT50cj50ZC53YXJuaW5nOmhvdmVyLC50YWJsZS1ob3Zlcj50Ym9keT50cj50aC53YXJuaW5nOmhvdmVyLC50YWJsZS1ob3Zlcj50Ym9keT50ci53YXJuaW5nOmhvdmVyPnRkLC50YWJsZS1ob3Zlcj50Ym9keT50ci53YXJuaW5nOmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2ZhZjJjY30udGFibGU+dGhlYWQ+dHI+dGQuZGFuZ2VyLC50YWJsZT50Ym9keT50cj50ZC5kYW5nZXIsLnRhYmxlPnRmb290PnRyPnRkLmRhbmdlciwudGFibGU+dGhlYWQ+dHI+dGguZGFuZ2VyLC50YWJsZT50Ym9keT50cj50aC5kYW5nZXIsLnRhYmxlPnRmb290PnRyPnRoLmRhbmdlciwudGFibGU+dGhlYWQ+dHIuZGFuZ2VyPnRkLC50YWJsZT50Ym9keT50ci5kYW5nZXI+dGQsLnRhYmxlPnRmb290PnRyLmRhbmdlcj50ZCwudGFibGU+dGhlYWQ+dHIuZGFuZ2VyPnRoLC50YWJsZT50Ym9keT50ci5kYW5nZXI+dGgsLnRhYmxlPnRmb290PnRyLmRhbmdlcj50aHtiYWNrZ3JvdW5kLWNvbG9yOiNmMmRlZGV9LnRhYmxlLWhvdmVyPnRib2R5PnRyPnRkLmRhbmdlcjpob3ZlciwudGFibGUtaG92ZXI+dGJvZHk+dHI+dGguZGFuZ2VyOmhvdmVyLC50YWJsZS1ob3Zlcj50Ym9keT50ci5kYW5nZXI6aG92ZXI+dGQsLnRhYmxlLWhvdmVyPnRib2R5PnRyLmRhbmdlcjpob3Zlcj50aHtiYWNrZ3JvdW5kLWNvbG9yOiNlYmNjY2N9QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpey50YWJsZS1yZXNwb25zaXZle3dpZHRoOjEwMCU7bWFyZ2luLWJvdHRvbToxNXB4O292ZXJmbG93LXk6aGlkZGVuO292ZXJmbG93LXg6c2Nyb2xsOy1tcy1vdmVyZmxvdy1zdHlsZTotbXMtYXV0b2hpZGluZy1zY3JvbGxiYXI7Ym9yZGVyOjFweCBzb2xpZCAjZGRkOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS50YWJsZS1yZXNwb25zaXZlPi50YWJsZXttYXJnaW4tYm90dG9tOjB9LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlPnRoZWFkPnRyPnRoLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZT50Ym9keT50cj50aCwudGFibGUtcmVzcG9uc2l2ZT4udGFibGU+dGZvb3Q+dHI+dGgsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlPnRoZWFkPnRyPnRkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZT50Ym9keT50cj50ZCwudGFibGUtcmVzcG9uc2l2ZT4udGFibGU+dGZvb3Q+dHI+dGR7d2hpdGUtc3BhY2U6bm93cmFwfS50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZHtib3JkZXI6MH0udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGg6Zmlyc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRoOmZpcnN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50aDpmaXJzdC1jaGlsZCwudGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGQ6Zmlyc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRkOmZpcnN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZDpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDowfS50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50aDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50aDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50ZDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50ZDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZDpsYXN0LWNoaWxke2JvcmRlci1yaWdodDowfS50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpsYXN0LWNoaWxkPnRoLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cjpsYXN0LWNoaWxkPnRoLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpsYXN0LWNoaWxkPnRkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cjpsYXN0LWNoaWxkPnRke2JvcmRlci1ib3R0b206MH19ZmllbGRzZXR7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO21pbi13aWR0aDowfWxlZ2VuZHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZzowO21hcmdpbi1ib3R0b206MjBweDtmb250LXNpemU6MjFweDtsaW5lLWhlaWdodDppbmhlcml0O2NvbG9yOiMzMzM7Ym9yZGVyOjA7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U1ZTVlNX1sYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tYm90dG9tOjVweDtmb250LXdlaWdodDo3MDB9aW5wdXRbdHlwZT1zZWFyY2hdey13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH1pbnB1dFt0eXBlPXJhZGlvXSxpbnB1dFt0eXBlPWNoZWNrYm94XXttYXJnaW46NHB4IDAgMDttYXJnaW4tdG9wOjFweCBcOTtsaW5lLWhlaWdodDpub3JtYWx9aW5wdXRbdHlwZT1maWxlXXtkaXNwbGF5OmJsb2NrfWlucHV0W3R5cGU9cmFuZ2Vde2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJX1zZWxlY3RbbXVsdGlwbGVdLHNlbGVjdFtzaXplXXtoZWlnaHQ6YXV0b31pbnB1dFt0eXBlPWZpbGVdOmZvY3VzLGlucHV0W3R5cGU9cmFkaW9dOmZvY3VzLGlucHV0W3R5cGU9Y2hlY2tib3hdOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQ7b3V0bGluZTo1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7b3V0bGluZS1vZmZzZXQ6LTJweH1vdXRwdXR7ZGlzcGxheTpibG9jaztwYWRkaW5nLXRvcDo3cHg7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojNTU1fS5mb3JtLWNvbnRyb2x7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2hlaWdodDozNHB4O3BhZGRpbmc6NnB4IDEycHg7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojNTU1O2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOy13ZWJraXQtdHJhbnNpdGlvbjpib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cyxib3gtc2hhZG93IGVhc2UtaW4tb3V0IC4xNXM7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cyxib3gtc2hhZG93IGVhc2UtaW4tb3V0IC4xNXN9LmZvcm0tY29udHJvbDpmb2N1c3tib3JkZXItY29sb3I6IzY2YWZlOTtvdXRsaW5lOjA7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpfS5mb3JtLWNvbnRyb2w6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6Izk5OTtvcGFjaXR5OjF9LmZvcm0tY29udHJvbDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6Izk5OX0uZm9ybS1jb250cm9sOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM5OTl9LmZvcm0tY29udHJvbFtkaXNhYmxlZF0sLmZvcm0tY29udHJvbFtyZWFkb25seV0sZmllbGRzZXRbZGlzYWJsZWRdIC5mb3JtLWNvbnRyb2x7Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQtY29sb3I6I2VlZTtvcGFjaXR5OjF9dGV4dGFyZWEuZm9ybS1jb250cm9se2hlaWdodDphdXRvfWlucHV0W3R5cGU9c2VhcmNoXXstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX1pbnB1dFt0eXBlPWRhdGVde2xpbmUtaGVpZ2h0OjM0cHh9LmZvcm0tZ3JvdXB7bWFyZ2luLWJvdHRvbToxNXB4fS5yYWRpbywuY2hlY2tib3h7ZGlzcGxheTpibG9jazttaW4taGVpZ2h0OjIwcHg7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nLWxlZnQ6MjBweH0ucmFkaW8gbGFiZWwsLmNoZWNrYm94IGxhYmVse2Rpc3BsYXk6aW5saW5lO2ZvbnQtd2VpZ2h0OjQwMDtjdXJzb3I6cG9pbnRlcn0ucmFkaW8gaW5wdXRbdHlwZT1yYWRpb10sLnJhZGlvLWlubGluZSBpbnB1dFt0eXBlPXJhZGlvXSwuY2hlY2tib3ggaW5wdXRbdHlwZT1jaGVja2JveF0sLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPWNoZWNrYm94XXtmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0Oi0yMHB4fS5yYWRpbysucmFkaW8sLmNoZWNrYm94Ky5jaGVja2JveHttYXJnaW4tdG9wOi01cHh9LnJhZGlvLWlubGluZSwuY2hlY2tib3gtaW5saW5le2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmctbGVmdDoyMHB4O21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC13ZWlnaHQ6NDAwO2N1cnNvcjpwb2ludGVyfS5yYWRpby1pbmxpbmUrLnJhZGlvLWlubGluZSwuY2hlY2tib3gtaW5saW5lKy5jaGVja2JveC1pbmxpbmV7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjEwcHh9aW5wdXRbdHlwZT1yYWRpb11bZGlzYWJsZWRdLGlucHV0W3R5cGU9Y2hlY2tib3hdW2Rpc2FibGVkXSwucmFkaW9bZGlzYWJsZWRdLC5yYWRpby1pbmxpbmVbZGlzYWJsZWRdLC5jaGVja2JveFtkaXNhYmxlZF0sLmNoZWNrYm94LWlubGluZVtkaXNhYmxlZF0sZmllbGRzZXRbZGlzYWJsZWRdIGlucHV0W3R5cGU9cmFkaW9dLGZpZWxkc2V0W2Rpc2FibGVkXSBpbnB1dFt0eXBlPWNoZWNrYm94XSxmaWVsZHNldFtkaXNhYmxlZF0gLnJhZGlvLGZpZWxkc2V0W2Rpc2FibGVkXSAucmFkaW8taW5saW5lLGZpZWxkc2V0W2Rpc2FibGVkXSAuY2hlY2tib3gsZmllbGRzZXRbZGlzYWJsZWRdIC5jaGVja2JveC1pbmxpbmV7Y3Vyc29yOm5vdC1hbGxvd2VkfS5pbnB1dC1zbXtoZWlnaHQ6MzBweDtwYWRkaW5nOjVweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOjNweH1zZWxlY3QuaW5wdXQtc217aGVpZ2h0OjMwcHg7bGluZS1oZWlnaHQ6MzBweH10ZXh0YXJlYS5pbnB1dC1zbSxzZWxlY3RbbXVsdGlwbGVdLmlucHV0LXNte2hlaWdodDphdXRvfS5pbnB1dC1sZ3toZWlnaHQ6NDZweDtwYWRkaW5nOjEwcHggMTZweDtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoxLjMzO2JvcmRlci1yYWRpdXM6NnB4fXNlbGVjdC5pbnB1dC1sZ3toZWlnaHQ6NDZweDtsaW5lLWhlaWdodDo0NnB4fXRleHRhcmVhLmlucHV0LWxnLHNlbGVjdFttdWx0aXBsZV0uaW5wdXQtbGd7aGVpZ2h0OmF1dG99Lmhhcy1mZWVkYmFja3twb3NpdGlvbjpyZWxhdGl2ZX0uaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2x7cGFkZGluZy1yaWdodDo0Mi41cHh9Lmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNre3Bvc2l0aW9uOmFic29sdXRlO3RvcDoyNXB4O3JpZ2h0OjA7ZGlzcGxheTpibG9jazt3aWR0aDozNHB4O2hlaWdodDozNHB4O2xpbmUtaGVpZ2h0OjM0cHg7dGV4dC1hbGlnbjpjZW50ZXJ9Lmhhcy1zdWNjZXNzIC5oZWxwLWJsb2NrLC5oYXMtc3VjY2VzcyAuY29udHJvbC1sYWJlbCwuaGFzLXN1Y2Nlc3MgLnJhZGlvLC5oYXMtc3VjY2VzcyAuY2hlY2tib3gsLmhhcy1zdWNjZXNzIC5yYWRpby1pbmxpbmUsLmhhcy1zdWNjZXNzIC5jaGVja2JveC1pbmxpbmV7Y29sb3I6IzNjNzYzZH0uaGFzLXN1Y2Nlc3MgLmZvcm0tY29udHJvbHtib3JkZXItY29sb3I6IzNjNzYzZDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KX0uaGFzLXN1Y2Nlc3MgLmZvcm0tY29udHJvbDpmb2N1c3tib3JkZXItY29sb3I6IzJiNTQyYzstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDZweCAjNjdiMTY4O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDZweCAjNjdiMTY4fS5oYXMtc3VjY2VzcyAuaW5wdXQtZ3JvdXAtYWRkb257Y29sb3I6IzNjNzYzZDtib3JkZXItY29sb3I6IzNjNzYzZDtiYWNrZ3JvdW5kLWNvbG9yOiNkZmYwZDh9Lmhhcy1zdWNjZXNzIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7Y29sb3I6IzNjNzYzZH0uaGFzLXdhcm5pbmcgLmhlbHAtYmxvY2ssLmhhcy13YXJuaW5nIC5jb250cm9sLWxhYmVsLC5oYXMtd2FybmluZyAucmFkaW8sLmhhcy13YXJuaW5nIC5jaGVja2JveCwuaGFzLXdhcm5pbmcgLnJhZGlvLWlubGluZSwuaGFzLXdhcm5pbmcgLmNoZWNrYm94LWlubGluZXtjb2xvcjojOGE2ZDNifS5oYXMtd2FybmluZyAuZm9ybS1jb250cm9se2JvcmRlci1jb2xvcjojOGE2ZDNiOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpfS5oYXMtd2FybmluZyAuZm9ybS1jb250cm9sOmZvY3Vze2JvcmRlci1jb2xvcjojNjY1MTJjOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgNnB4ICNjMGExNmI7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgNnB4ICNjMGExNmJ9Lmhhcy13YXJuaW5nIC5pbnB1dC1ncm91cC1hZGRvbntjb2xvcjojOGE2ZDNiO2JvcmRlci1jb2xvcjojOGE2ZDNiO2JhY2tncm91bmQtY29sb3I6I2ZjZjhlM30uaGFzLXdhcm5pbmcgLmZvcm0tY29udHJvbC1mZWVkYmFja3tjb2xvcjojOGE2ZDNifS5oYXMtZXJyb3IgLmhlbHAtYmxvY2ssLmhhcy1lcnJvciAuY29udHJvbC1sYWJlbCwuaGFzLWVycm9yIC5yYWRpbywuaGFzLWVycm9yIC5jaGVja2JveCwuaGFzLWVycm9yIC5yYWRpby1pbmxpbmUsLmhhcy1lcnJvciAuY2hlY2tib3gtaW5saW5le2NvbG9yOiNhOTQ0NDJ9Lmhhcy1lcnJvciAuZm9ybS1jb250cm9se2JvcmRlci1jb2xvcjojYTk0NDQyOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpfS5oYXMtZXJyb3IgLmZvcm0tY29udHJvbDpmb2N1c3tib3JkZXItY29sb3I6Izg0MzUzNDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDZweCAjY2U4NDgzO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDZweCAjY2U4NDgzfS5oYXMtZXJyb3IgLmlucHV0LWdyb3VwLWFkZG9ue2NvbG9yOiNhOTQ0NDI7Ym9yZGVyLWNvbG9yOiNhOTQ0NDI7YmFja2dyb3VuZC1jb2xvcjojZjJkZWRlfS5oYXMtZXJyb3IgLmZvcm0tY29udHJvbC1mZWVkYmFja3tjb2xvcjojYTk0NDQyfS5mb3JtLWNvbnRyb2wtc3RhdGlje21hcmdpbi1ib3R0b206MH0uaGVscC1ibG9ja3tkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206MTBweDtjb2xvcjojNzM3MzczfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuZm9ybS1pbmxpbmUgLmZvcm0tZ3JvdXB7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWJvdHRvbTowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZm9ybS1pbmxpbmUgLmZvcm0tY29udHJvbHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDphdXRvO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwPi5mb3JtLWNvbnRyb2x7d2lkdGg6MTAwJX0uZm9ybS1pbmxpbmUgLmNvbnRyb2wtbGFiZWx7bWFyZ2luLWJvdHRvbTowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZm9ybS1pbmxpbmUgLnJhZGlvLC5mb3JtLWlubGluZSAuY2hlY2tib3h7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDtwYWRkaW5nLWxlZnQ6MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZvcm0taW5saW5lIC5yYWRpbyBpbnB1dFt0eXBlPXJhZGlvXSwuZm9ybS1pbmxpbmUgLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hde2Zsb2F0Om5vbmU7bWFyZ2luLWxlZnQ6MH0uZm9ybS1pbmxpbmUgLmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNre3RvcDowfX0uZm9ybS1ob3Jpem9udGFsIC5jb250cm9sLWxhYmVsLC5mb3JtLWhvcml6b250YWwgLnJhZGlvLC5mb3JtLWhvcml6b250YWwgLmNoZWNrYm94LC5mb3JtLWhvcml6b250YWwgLnJhZGlvLWlubGluZSwuZm9ybS1ob3Jpem9udGFsIC5jaGVja2JveC1pbmxpbmV7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDtwYWRkaW5nLXRvcDo3cHh9LmZvcm0taG9yaXpvbnRhbCAucmFkaW8sLmZvcm0taG9yaXpvbnRhbCAuY2hlY2tib3h7bWluLWhlaWdodDoyN3B4fS5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXB7bWFyZ2luLWxlZnQ6LTE1cHg7bWFyZ2luLXJpZ2h0Oi0xNXB4fS5mb3JtLWhvcml6b250YWwgLmZvcm0tY29udHJvbC1zdGF0aWN7cGFkZGluZy10b3A6N3B4fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuZm9ybS1ob3Jpem9udGFsIC5jb250cm9sLWxhYmVse3RleHQtYWxpZ246cmlnaHR9fS5mb3JtLWhvcml6b250YWwgLmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNre3RvcDowO3JpZ2h0OjE1cHh9LmJ0bntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tYm90dG9tOjA7Zm9udC13ZWlnaHQ6NDAwO3RleHQtYWxpZ246Y2VudGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDt3aGl0ZS1zcGFjZTpub3dyYXA7cGFkZGluZzo2cHggMTJweDtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uYnRuOmZvY3VzLC5idG46YWN0aXZlOmZvY3VzLC5idG4uYWN0aXZlOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQ7b3V0bGluZTo1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7b3V0bGluZS1vZmZzZXQ6LTJweH0uYnRuOmhvdmVyLC5idG46Zm9jdXN7Y29sb3I6IzMzMzt0ZXh0LWRlY29yYXRpb246bm9uZX0uYnRuOmFjdGl2ZSwuYnRuLmFjdGl2ZXtvdXRsaW5lOjA7YmFja2dyb3VuZC1pbWFnZTpub25lOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDNweCA1cHggcmdiYSgwLDAsMCwuMTI1KTtib3gtc2hhZG93Omluc2V0IDAgM3B4IDVweCByZ2JhKDAsMCwwLC4xMjUpfS5idG4uZGlzYWJsZWQsLmJ0bltkaXNhYmxlZF0sZmllbGRzZXRbZGlzYWJsZWRdIC5idG57Y3Vyc29yOm5vdC1hbGxvd2VkO3BvaW50ZXItZXZlbnRzOm5vbmU7b3BhY2l0eTouNjU7ZmlsdGVyOmFscGhhKG9wYWNpdHk9NjUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0uYnRuLWRlZmF1bHR7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiNjY2N9LmJ0bi1kZWZhdWx0OmhvdmVyLC5idG4tZGVmYXVsdDpmb2N1cywuYnRuLWRlZmF1bHQ6YWN0aXZlLC5idG4tZGVmYXVsdC5hY3RpdmUsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5idG4tZGVmYXVsdHtjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2ViZWJlYjtib3JkZXItY29sb3I6I2FkYWRhZH0uYnRuLWRlZmF1bHQ6YWN0aXZlLC5idG4tZGVmYXVsdC5hY3RpdmUsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5idG4tZGVmYXVsdHtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmJ0bi1kZWZhdWx0LmRpc2FibGVkLC5idG4tZGVmYXVsdFtkaXNhYmxlZF0sZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdCwuYnRuLWRlZmF1bHQuZGlzYWJsZWQ6aG92ZXIsLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXTpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0OmhvdmVyLC5idG4tZGVmYXVsdC5kaXNhYmxlZDpmb2N1cywuYnRuLWRlZmF1bHRbZGlzYWJsZWRdOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQ6Zm9jdXMsLmJ0bi1kZWZhdWx0LmRpc2FibGVkOmFjdGl2ZSwuYnRuLWRlZmF1bHRbZGlzYWJsZWRdOmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0OmFjdGl2ZSwuYnRuLWRlZmF1bHQuZGlzYWJsZWQuYWN0aXZlLC5idG4tZGVmYXVsdFtkaXNhYmxlZF0uYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQuYWN0aXZle2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItY29sb3I6I2NjY30uYnRuLWRlZmF1bHQgLmJhZGdle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzMzfS5idG4tcHJpbWFyeXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzQyOGJjYTtib3JkZXItY29sb3I6IzM1N2ViZH0uYnRuLXByaW1hcnk6aG92ZXIsLmJ0bi1wcmltYXJ5OmZvY3VzLC5idG4tcHJpbWFyeTphY3RpdmUsLmJ0bi1wcmltYXJ5LmFjdGl2ZSwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmJ0bi1wcmltYXJ5e2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzI3NmIxO2JvcmRlci1jb2xvcjojMjg1ZThlfS5idG4tcHJpbWFyeTphY3RpdmUsLmJ0bi1wcmltYXJ5LmFjdGl2ZSwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmJ0bi1wcmltYXJ5e2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uYnRuLXByaW1hcnkuZGlzYWJsZWQsLmJ0bi1wcmltYXJ5W2Rpc2FibGVkXSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1wcmltYXJ5LC5idG4tcHJpbWFyeS5kaXNhYmxlZDpob3ZlciwuYnRuLXByaW1hcnlbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnk6aG92ZXIsLmJ0bi1wcmltYXJ5LmRpc2FibGVkOmZvY3VzLC5idG4tcHJpbWFyeVtkaXNhYmxlZF06Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeTpmb2N1cywuYnRuLXByaW1hcnkuZGlzYWJsZWQ6YWN0aXZlLC5idG4tcHJpbWFyeVtkaXNhYmxlZF06YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnk6YWN0aXZlLC5idG4tcHJpbWFyeS5kaXNhYmxlZC5hY3RpdmUsLmJ0bi1wcmltYXJ5W2Rpc2FibGVkXS5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeS5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNDI4YmNhO2JvcmRlci1jb2xvcjojMzU3ZWJkfS5idG4tcHJpbWFyeSAuYmFkZ2V7Y29sb3I6IzQyOGJjYTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmJ0bi1zdWNjZXNze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNWNiODVjO2JvcmRlci1jb2xvcjojNGNhZTRjfS5idG4tc3VjY2Vzczpob3ZlciwuYnRuLXN1Y2Nlc3M6Zm9jdXMsLmJ0bi1zdWNjZXNzOmFjdGl2ZSwuYnRuLXN1Y2Nlc3MuYWN0aXZlLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuYnRuLXN1Y2Nlc3N7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM0N2E0NDc7Ym9yZGVyLWNvbG9yOiMzOTg0Mzl9LmJ0bi1zdWNjZXNzOmFjdGl2ZSwuYnRuLXN1Y2Nlc3MuYWN0aXZlLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuYnRuLXN1Y2Nlc3N7YmFja2dyb3VuZC1pbWFnZTpub25lfS5idG4tc3VjY2Vzcy5kaXNhYmxlZCwuYnRuLXN1Y2Nlc3NbZGlzYWJsZWRdLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXN1Y2Nlc3MsLmJ0bi1zdWNjZXNzLmRpc2FibGVkOmhvdmVyLC5idG4tc3VjY2Vzc1tkaXNhYmxlZF06aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2Vzczpob3ZlciwuYnRuLXN1Y2Nlc3MuZGlzYWJsZWQ6Zm9jdXMsLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXTpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzOmZvY3VzLC5idG4tc3VjY2Vzcy5kaXNhYmxlZDphY3RpdmUsLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXTphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2VzczphY3RpdmUsLmJ0bi1zdWNjZXNzLmRpc2FibGVkLmFjdGl2ZSwuYnRuLXN1Y2Nlc3NbZGlzYWJsZWRdLmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzLmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiM1Y2I4NWM7Ym9yZGVyLWNvbG9yOiM0Y2FlNGN9LmJ0bi1zdWNjZXNzIC5iYWRnZXtjb2xvcjojNWNiODVjO2JhY2tncm91bmQtY29sb3I6I2ZmZn0uYnRuLWluZm97Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM1YmMwZGU7Ym9yZGVyLWNvbG9yOiM0NmI4ZGF9LmJ0bi1pbmZvOmhvdmVyLC5idG4taW5mbzpmb2N1cywuYnRuLWluZm86YWN0aXZlLC5idG4taW5mby5hY3RpdmUsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5idG4taW5mb3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzM5YjNkNztib3JkZXItY29sb3I6IzI2OWFiY30uYnRuLWluZm86YWN0aXZlLC5idG4taW5mby5hY3RpdmUsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5idG4taW5mb3tiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmJ0bi1pbmZvLmRpc2FibGVkLC5idG4taW5mb1tkaXNhYmxlZF0sZmllbGRzZXRbZGlzYWJsZWRdIC5idG4taW5mbywuYnRuLWluZm8uZGlzYWJsZWQ6aG92ZXIsLmJ0bi1pbmZvW2Rpc2FibGVkXTpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvOmhvdmVyLC5idG4taW5mby5kaXNhYmxlZDpmb2N1cywuYnRuLWluZm9bZGlzYWJsZWRdOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm86Zm9jdXMsLmJ0bi1pbmZvLmRpc2FibGVkOmFjdGl2ZSwuYnRuLWluZm9bZGlzYWJsZWRdOmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvOmFjdGl2ZSwuYnRuLWluZm8uZGlzYWJsZWQuYWN0aXZlLC5idG4taW5mb1tkaXNhYmxlZF0uYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm8uYWN0aXZle2JhY2tncm91bmQtY29sb3I6IzViYzBkZTtib3JkZXItY29sb3I6IzQ2YjhkYX0uYnRuLWluZm8gLmJhZGdle2NvbG9yOiM1YmMwZGU7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5idG4td2FybmluZ3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2YwYWQ0ZTtib3JkZXItY29sb3I6I2VlYTIzNn0uYnRuLXdhcm5pbmc6aG92ZXIsLmJ0bi13YXJuaW5nOmZvY3VzLC5idG4td2FybmluZzphY3RpdmUsLmJ0bi13YXJuaW5nLmFjdGl2ZSwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmJ0bi13YXJuaW5ne2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojZWQ5YzI4O2JvcmRlci1jb2xvcjojZDU4NTEyfS5idG4td2FybmluZzphY3RpdmUsLmJ0bi13YXJuaW5nLmFjdGl2ZSwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmJ0bi13YXJuaW5ne2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uYnRuLXdhcm5pbmcuZGlzYWJsZWQsLmJ0bi13YXJuaW5nW2Rpc2FibGVkXSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi13YXJuaW5nLC5idG4td2FybmluZy5kaXNhYmxlZDpob3ZlciwuYnRuLXdhcm5pbmdbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmc6aG92ZXIsLmJ0bi13YXJuaW5nLmRpc2FibGVkOmZvY3VzLC5idG4td2FybmluZ1tkaXNhYmxlZF06Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZzpmb2N1cywuYnRuLXdhcm5pbmcuZGlzYWJsZWQ6YWN0aXZlLC5idG4td2FybmluZ1tkaXNhYmxlZF06YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmc6YWN0aXZlLC5idG4td2FybmluZy5kaXNhYmxlZC5hY3RpdmUsLmJ0bi13YXJuaW5nW2Rpc2FibGVkXS5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZy5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZjBhZDRlO2JvcmRlci1jb2xvcjojZWVhMjM2fS5idG4td2FybmluZyAuYmFkZ2V7Y29sb3I6I2YwYWQ0ZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmJ0bi1kYW5nZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNkOTUzNGY7Ym9yZGVyLWNvbG9yOiNkNDNmM2F9LmJ0bi1kYW5nZXI6aG92ZXIsLmJ0bi1kYW5nZXI6Zm9jdXMsLmJ0bi1kYW5nZXI6YWN0aXZlLC5idG4tZGFuZ2VyLmFjdGl2ZSwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmJ0bi1kYW5nZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNkMjMyMmQ7Ym9yZGVyLWNvbG9yOiNhYzI5MjV9LmJ0bi1kYW5nZXI6YWN0aXZlLC5idG4tZGFuZ2VyLmFjdGl2ZSwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmJ0bi1kYW5nZXJ7YmFja2dyb3VuZC1pbWFnZTpub25lfS5idG4tZGFuZ2VyLmRpc2FibGVkLC5idG4tZGFuZ2VyW2Rpc2FibGVkXSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXIsLmJ0bi1kYW5nZXIuZGlzYWJsZWQ6aG92ZXIsLmJ0bi1kYW5nZXJbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcjpob3ZlciwuYnRuLWRhbmdlci5kaXNhYmxlZDpmb2N1cywuYnRuLWRhbmdlcltkaXNhYmxlZF06Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGFuZ2VyOmZvY3VzLC5idG4tZGFuZ2VyLmRpc2FibGVkOmFjdGl2ZSwuYnRuLWRhbmdlcltkaXNhYmxlZF06YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcjphY3RpdmUsLmJ0bi1kYW5nZXIuZGlzYWJsZWQuYWN0aXZlLC5idG4tZGFuZ2VyW2Rpc2FibGVkXS5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGFuZ2VyLmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNkOTUzNGY7Ym9yZGVyLWNvbG9yOiNkNDNmM2F9LmJ0bi1kYW5nZXIgLmJhZGdle2NvbG9yOiNkOTUzNGY7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5idG4tbGlua3tjb2xvcjojNDI4YmNhO2ZvbnQtd2VpZ2h0OjQwMDtjdXJzb3I6cG9pbnRlcjtib3JkZXItcmFkaXVzOjB9LmJ0bi1saW5rLC5idG4tbGluazphY3RpdmUsLmJ0bi1saW5rW2Rpc2FibGVkXSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1saW5re2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS5idG4tbGluaywuYnRuLWxpbms6aG92ZXIsLmJ0bi1saW5rOmZvY3VzLC5idG4tbGluazphY3RpdmV7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5idG4tbGluazpob3ZlciwuYnRuLWxpbms6Zm9jdXN7Y29sb3I6IzJhNjQ5Njt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmJ0bi1saW5rW2Rpc2FibGVkXTpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1saW5rOmhvdmVyLC5idG4tbGlua1tkaXNhYmxlZF06Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tbGluazpmb2N1c3tjb2xvcjojOTk5O3RleHQtZGVjb3JhdGlvbjpub25lfS5idG4tbGcsLmJ0bi1ncm91cC1sZz4uYnRue3BhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjEuMzM7Ym9yZGVyLXJhZGl1czo2cHh9LmJ0bi1zbSwuYnRuLWdyb3VwLXNtPi5idG57cGFkZGluZzo1cHggMTBweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjU7Ym9yZGVyLXJhZGl1czozcHh9LmJ0bi14cywuYnRuLWdyb3VwLXhzPi5idG57cGFkZGluZzoxcHggNXB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOjNweH0uYnRuLWJsb2Nre2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjB9LmJ0bi1ibG9jaysuYnRuLWJsb2Nre21hcmdpbi10b3A6NXB4fWlucHV0W3R5cGU9c3VibWl0XS5idG4tYmxvY2ssaW5wdXRbdHlwZT1yZXNldF0uYnRuLWJsb2NrLGlucHV0W3R5cGU9YnV0dG9uXS5idG4tYmxvY2t7d2lkdGg6MTAwJX0uZmFkZXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjE1cyBsaW5lYXI7dHJhbnNpdGlvbjpvcGFjaXR5IC4xNXMgbGluZWFyfS5mYWRlLmlue29wYWNpdHk6MX0uY29sbGFwc2V7ZGlzcGxheTpub25lfS5jb2xsYXBzZS5pbntkaXNwbGF5OmJsb2NrfS5jb2xsYXBzaW5ne3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDowO292ZXJmbG93OmhpZGRlbjstd2Via2l0LXRyYW5zaXRpb246aGVpZ2h0IC4zNXMgZWFzZTt0cmFuc2l0aW9uOmhlaWdodCAuMzVzIGVhc2V9QGZvbnQtZmFjZXtmb250LWZhbWlseTonR2x5cGhpY29ucyBIYWxmbGluZ3MnO3NyYzp1cmwoLi4vZm9udHMvZ2x5cGhpY29ucy1oYWxmbGluZ3MtcmVndWxhci5lb3QpO3NyYzp1cmwoLi4vZm9udHMvZ2x5cGhpY29ucy1oYWxmbGluZ3MtcmVndWxhci5lb3Q/I2llZml4KSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksdXJsKC4uL2ZvbnRzL2dseXBoaWNvbnMtaGFsZmxpbmdzLXJlZ3VsYXIud29mZikgZm9ybWF0KCd3b2ZmJyksdXJsKC4uL2ZvbnRzL2dseXBoaWNvbnMtaGFsZmxpbmdzLXJlZ3VsYXIudHRmKSBmb3JtYXQoJ3RydWV0eXBlJyksdXJsKC4uL2ZvbnRzL2dseXBoaWNvbnMtaGFsZmxpbmdzLXJlZ3VsYXIuc3ZnI2dseXBoaWNvbnNfaGFsZmxpbmdzcmVndWxhcikgZm9ybWF0KCdzdmcnKX0uZ2x5cGhpY29ue3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDoxcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1mYW1pbHk6J0dseXBoaWNvbnMgSGFsZmxpbmdzJztmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uZ2x5cGhpY29uLWFzdGVyaXNrOmJlZm9yZXtjb250ZW50OiJcMmEifS5nbHlwaGljb24tcGx1czpiZWZvcmV7Y29udGVudDoiXDJiIn0uZ2x5cGhpY29uLWV1cm86YmVmb3Jle2NvbnRlbnQ6IlwyMGFjIn0uZ2x5cGhpY29uLW1pbnVzOmJlZm9yZXtjb250ZW50OiJcMjIxMiJ9LmdseXBoaWNvbi1jbG91ZDpiZWZvcmV7Y29udGVudDoiXDI2MDEifS5nbHlwaGljb24tZW52ZWxvcGU6YmVmb3Jle2NvbnRlbnQ6IlwyNzA5In0uZ2x5cGhpY29uLXBlbmNpbDpiZWZvcmV7Y29udGVudDoiXDI3MGYifS5nbHlwaGljb24tZ2xhc3M6YmVmb3Jle2NvbnRlbnQ6IlxlMDAxIn0uZ2x5cGhpY29uLW11c2ljOmJlZm9yZXtjb250ZW50OiJcZTAwMiJ9LmdseXBoaWNvbi1zZWFyY2g6YmVmb3Jle2NvbnRlbnQ6IlxlMDAzIn0uZ2x5cGhpY29uLWhlYXJ0OmJlZm9yZXtjb250ZW50OiJcZTAwNSJ9LmdseXBoaWNvbi1zdGFyOmJlZm9yZXtjb250ZW50OiJcZTAwNiJ9LmdseXBoaWNvbi1zdGFyLWVtcHR5OmJlZm9yZXtjb250ZW50OiJcZTAwNyJ9LmdseXBoaWNvbi11c2VyOmJlZm9yZXtjb250ZW50OiJcZTAwOCJ9LmdseXBoaWNvbi1maWxtOmJlZm9yZXtjb250ZW50OiJcZTAwOSJ9LmdseXBoaWNvbi10aC1sYXJnZTpiZWZvcmV7Y29udGVudDoiXGUwMTAifS5nbHlwaGljb24tdGg6YmVmb3Jle2NvbnRlbnQ6IlxlMDExIn0uZ2x5cGhpY29uLXRoLWxpc3Q6YmVmb3Jle2NvbnRlbnQ6IlxlMDEyIn0uZ2x5cGhpY29uLW9rOmJlZm9yZXtjb250ZW50OiJcZTAxMyJ9LmdseXBoaWNvbi1yZW1vdmU6YmVmb3Jle2NvbnRlbnQ6IlxlMDE0In0uZ2x5cGhpY29uLXpvb20taW46YmVmb3Jle2NvbnRlbnQ6IlxlMDE1In0uZ2x5cGhpY29uLXpvb20tb3V0OmJlZm9yZXtjb250ZW50OiJcZTAxNiJ9LmdseXBoaWNvbi1vZmY6YmVmb3Jle2NvbnRlbnQ6IlxlMDE3In0uZ2x5cGhpY29uLXNpZ25hbDpiZWZvcmV7Y29udGVudDoiXGUwMTgifS5nbHlwaGljb24tY29nOmJlZm9yZXtjb250ZW50OiJcZTAxOSJ9LmdseXBoaWNvbi10cmFzaDpiZWZvcmV7Y29udGVudDoiXGUwMjAifS5nbHlwaGljb24taG9tZTpiZWZvcmV7Y29udGVudDoiXGUwMjEifS5nbHlwaGljb24tZmlsZTpiZWZvcmV7Y29udGVudDoiXGUwMjIifS5nbHlwaGljb24tdGltZTpiZWZvcmV7Y29udGVudDoiXGUwMjMifS5nbHlwaGljb24tcm9hZDpiZWZvcmV7Y29udGVudDoiXGUwMjQifS5nbHlwaGljb24tZG93bmxvYWQtYWx0OmJlZm9yZXtjb250ZW50OiJcZTAyNSJ9LmdseXBoaWNvbi1kb3dubG9hZDpiZWZvcmV7Y29udGVudDoiXGUwMjYifS5nbHlwaGljb24tdXBsb2FkOmJlZm9yZXtjb250ZW50OiJcZTAyNyJ9LmdseXBoaWNvbi1pbmJveDpiZWZvcmV7Y29udGVudDoiXGUwMjgifS5nbHlwaGljb24tcGxheS1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxlMDI5In0uZ2x5cGhpY29uLXJlcGVhdDpiZWZvcmV7Y29udGVudDoiXGUwMzAifS5nbHlwaGljb24tcmVmcmVzaDpiZWZvcmV7Y29udGVudDoiXGUwMzEifS5nbHlwaGljb24tbGlzdC1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDMyIn0uZ2x5cGhpY29uLWxvY2s6YmVmb3Jle2NvbnRlbnQ6IlxlMDMzIn0uZ2x5cGhpY29uLWZsYWc6YmVmb3Jle2NvbnRlbnQ6IlxlMDM0In0uZ2x5cGhpY29uLWhlYWRwaG9uZXM6YmVmb3Jle2NvbnRlbnQ6IlxlMDM1In0uZ2x5cGhpY29uLXZvbHVtZS1vZmY6YmVmb3Jle2NvbnRlbnQ6IlxlMDM2In0uZ2x5cGhpY29uLXZvbHVtZS1kb3duOmJlZm9yZXtjb250ZW50OiJcZTAzNyJ9LmdseXBoaWNvbi12b2x1bWUtdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMDM4In0uZ2x5cGhpY29uLXFyY29kZTpiZWZvcmV7Y29udGVudDoiXGUwMzkifS5nbHlwaGljb24tYmFyY29kZTpiZWZvcmV7Y29udGVudDoiXGUwNDAifS5nbHlwaGljb24tdGFnOmJlZm9yZXtjb250ZW50OiJcZTA0MSJ9LmdseXBoaWNvbi10YWdzOmJlZm9yZXtjb250ZW50OiJcZTA0MiJ9LmdseXBoaWNvbi1ib29rOmJlZm9yZXtjb250ZW50OiJcZTA0MyJ9LmdseXBoaWNvbi1ib29rbWFyazpiZWZvcmV7Y29udGVudDoiXGUwNDQifS5nbHlwaGljb24tcHJpbnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDQ1In0uZ2x5cGhpY29uLWNhbWVyYTpiZWZvcmV7Y29udGVudDoiXGUwNDYifS5nbHlwaGljb24tZm9udDpiZWZvcmV7Y29udGVudDoiXGUwNDcifS5nbHlwaGljb24tYm9sZDpiZWZvcmV7Y29udGVudDoiXGUwNDgifS5nbHlwaGljb24taXRhbGljOmJlZm9yZXtjb250ZW50OiJcZTA0OSJ9LmdseXBoaWNvbi10ZXh0LWhlaWdodDpiZWZvcmV7Y29udGVudDoiXGUwNTAifS5nbHlwaGljb24tdGV4dC13aWR0aDpiZWZvcmV7Y29udGVudDoiXGUwNTEifS5nbHlwaGljb24tYWxpZ24tbGVmdDpiZWZvcmV7Y29udGVudDoiXGUwNTIifS5nbHlwaGljb24tYWxpZ24tY2VudGVyOmJlZm9yZXtjb250ZW50OiJcZTA1MyJ9LmdseXBoaWNvbi1hbGlnbi1yaWdodDpiZWZvcmV7Y29udGVudDoiXGUwNTQifS5nbHlwaGljb24tYWxpZ24tanVzdGlmeTpiZWZvcmV7Y29udGVudDoiXGUwNTUifS5nbHlwaGljb24tbGlzdDpiZWZvcmV7Y29udGVudDoiXGUwNTYifS5nbHlwaGljb24taW5kZW50LWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDU3In0uZ2x5cGhpY29uLWluZGVudC1yaWdodDpiZWZvcmV7Y29udGVudDoiXGUwNTgifS5nbHlwaGljb24tZmFjZXRpbWUtdmlkZW86YmVmb3Jle2NvbnRlbnQ6IlxlMDU5In0uZ2x5cGhpY29uLXBpY3R1cmU6YmVmb3Jle2NvbnRlbnQ6IlxlMDYwIn0uZ2x5cGhpY29uLW1hcC1tYXJrZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMDYyIn0uZ2x5cGhpY29uLWFkanVzdDpiZWZvcmV7Y29udGVudDoiXGUwNjMifS5nbHlwaGljb24tdGludDpiZWZvcmV7Y29udGVudDoiXGUwNjQifS5nbHlwaGljb24tZWRpdDpiZWZvcmV7Y29udGVudDoiXGUwNjUifS5nbHlwaGljb24tc2hhcmU6YmVmb3Jle2NvbnRlbnQ6IlxlMDY2In0uZ2x5cGhpY29uLWNoZWNrOmJlZm9yZXtjb250ZW50OiJcZTA2NyJ9LmdseXBoaWNvbi1tb3ZlOmJlZm9yZXtjb250ZW50OiJcZTA2OCJ9LmdseXBoaWNvbi1zdGVwLWJhY2t3YXJkOmJlZm9yZXtjb250ZW50OiJcZTA2OSJ9LmdseXBoaWNvbi1mYXN0LWJhY2t3YXJkOmJlZm9yZXtjb250ZW50OiJcZTA3MCJ9LmdseXBoaWNvbi1iYWNrd2FyZDpiZWZvcmV7Y29udGVudDoiXGUwNzEifS5nbHlwaGljb24tcGxheTpiZWZvcmV7Y29udGVudDoiXGUwNzIifS5nbHlwaGljb24tcGF1c2U6YmVmb3Jle2NvbnRlbnQ6IlxlMDczIn0uZ2x5cGhpY29uLXN0b3A6YmVmb3Jle2NvbnRlbnQ6IlxlMDc0In0uZ2x5cGhpY29uLWZvcndhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDc1In0uZ2x5cGhpY29uLWZhc3QtZm9yd2FyZDpiZWZvcmV7Y29udGVudDoiXGUwNzYifS5nbHlwaGljb24tc3RlcC1mb3J3YXJkOmJlZm9yZXtjb250ZW50OiJcZTA3NyJ9LmdseXBoaWNvbi1lamVjdDpiZWZvcmV7Y29udGVudDoiXGUwNzgifS5nbHlwaGljb24tY2hldnJvbi1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTA3OSJ9LmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTA4MCJ9LmdseXBoaWNvbi1wbHVzLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMDgxIn0uZ2x5cGhpY29uLW1pbnVzLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMDgyIn0uZ2x5cGhpY29uLXJlbW92ZS1zaWduOmJlZm9yZXtjb250ZW50OiJcZTA4MyJ9LmdseXBoaWNvbi1vay1zaWduOmJlZm9yZXtjb250ZW50OiJcZTA4NCJ9LmdseXBoaWNvbi1xdWVzdGlvbi1zaWduOmJlZm9yZXtjb250ZW50OiJcZTA4NSJ9LmdseXBoaWNvbi1pbmZvLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMDg2In0uZ2x5cGhpY29uLXNjcmVlbnNob3Q6YmVmb3Jle2NvbnRlbnQ6IlxlMDg3In0uZ2x5cGhpY29uLXJlbW92ZS1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxlMDg4In0uZ2x5cGhpY29uLW9rLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGUwODkifS5nbHlwaGljb24tYmFuLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGUwOTAifS5nbHlwaGljb24tYXJyb3ctbGVmdDpiZWZvcmV7Y29udGVudDoiXGUwOTEifS5nbHlwaGljb24tYXJyb3ctcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDkyIn0uZ2x5cGhpY29uLWFycm93LXVwOmJlZm9yZXtjb250ZW50OiJcZTA5MyJ9LmdseXBoaWNvbi1hcnJvdy1kb3duOmJlZm9yZXtjb250ZW50OiJcZTA5NCJ9LmdseXBoaWNvbi1zaGFyZS1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDk1In0uZ2x5cGhpY29uLXJlc2l6ZS1mdWxsOmJlZm9yZXtjb250ZW50OiJcZTA5NiJ9LmdseXBoaWNvbi1yZXNpemUtc21hbGw6YmVmb3Jle2NvbnRlbnQ6IlxlMDk3In0uZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMTAxIn0uZ2x5cGhpY29uLWdpZnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTAyIn0uZ2x5cGhpY29uLWxlYWY6YmVmb3Jle2NvbnRlbnQ6IlxlMTAzIn0uZ2x5cGhpY29uLWZpcmU6YmVmb3Jle2NvbnRlbnQ6IlxlMTA0In0uZ2x5cGhpY29uLWV5ZS1vcGVuOmJlZm9yZXtjb250ZW50OiJcZTEwNSJ9LmdseXBoaWNvbi1leWUtY2xvc2U6YmVmb3Jle2NvbnRlbnQ6IlxlMTA2In0uZ2x5cGhpY29uLXdhcm5pbmctc2lnbjpiZWZvcmV7Y29udGVudDoiXGUxMDcifS5nbHlwaGljb24tcGxhbmU6YmVmb3Jle2NvbnRlbnQ6IlxlMTA4In0uZ2x5cGhpY29uLWNhbGVuZGFyOmJlZm9yZXtjb250ZW50OiJcZTEwOSJ9LmdseXBoaWNvbi1yYW5kb206YmVmb3Jle2NvbnRlbnQ6IlxlMTEwIn0uZ2x5cGhpY29uLWNvbW1lbnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTExIn0uZ2x5cGhpY29uLW1hZ25ldDpiZWZvcmV7Y29udGVudDoiXGUxMTIifS5nbHlwaGljb24tY2hldnJvbi11cDpiZWZvcmV7Y29udGVudDoiXGUxMTMifS5nbHlwaGljb24tY2hldnJvbi1kb3duOmJlZm9yZXtjb250ZW50OiJcZTExNCJ9LmdseXBoaWNvbi1yZXR3ZWV0OmJlZm9yZXtjb250ZW50OiJcZTExNSJ9LmdseXBoaWNvbi1zaG9wcGluZy1jYXJ0OmJlZm9yZXtjb250ZW50OiJcZTExNiJ9LmdseXBoaWNvbi1mb2xkZXItY2xvc2U6YmVmb3Jle2NvbnRlbnQ6IlxlMTE3In0uZ2x5cGhpY29uLWZvbGRlci1vcGVuOmJlZm9yZXtjb250ZW50OiJcZTExOCJ9LmdseXBoaWNvbi1yZXNpemUtdmVydGljYWw6YmVmb3Jle2NvbnRlbnQ6IlxlMTE5In0uZ2x5cGhpY29uLXJlc2l6ZS1ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OiJcZTEyMCJ9LmdseXBoaWNvbi1oZGQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTIxIn0uZ2x5cGhpY29uLWJ1bGxob3JuOmJlZm9yZXtjb250ZW50OiJcZTEyMiJ9LmdseXBoaWNvbi1iZWxsOmJlZm9yZXtjb250ZW50OiJcZTEyMyJ9LmdseXBoaWNvbi1jZXJ0aWZpY2F0ZTpiZWZvcmV7Y29udGVudDoiXGUxMjQifS5nbHlwaGljb24tdGh1bWJzLXVwOmJlZm9yZXtjb250ZW50OiJcZTEyNSJ9LmdseXBoaWNvbi10aHVtYnMtZG93bjpiZWZvcmV7Y29udGVudDoiXGUxMjYifS5nbHlwaGljb24taGFuZC1yaWdodDpiZWZvcmV7Y29udGVudDoiXGUxMjcifS5nbHlwaGljb24taGFuZC1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTEyOCJ9LmdseXBoaWNvbi1oYW5kLXVwOmJlZm9yZXtjb250ZW50OiJcZTEyOSJ9LmdseXBoaWNvbi1oYW5kLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMTMwIn0uZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1yaWdodDpiZWZvcmV7Y29udGVudDoiXGUxMzEifS5nbHlwaGljb24tY2lyY2xlLWFycm93LWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTMyIn0uZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy11cDpiZWZvcmV7Y29udGVudDoiXGUxMzMifS5nbHlwaGljb24tY2lyY2xlLWFycm93LWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMTM0In0uZ2x5cGhpY29uLWdsb2JlOmJlZm9yZXtjb250ZW50OiJcZTEzNSJ9LmdseXBoaWNvbi13cmVuY2g6YmVmb3Jle2NvbnRlbnQ6IlxlMTM2In0uZ2x5cGhpY29uLXRhc2tzOmJlZm9yZXtjb250ZW50OiJcZTEzNyJ9LmdseXBoaWNvbi1maWx0ZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMTM4In0uZ2x5cGhpY29uLWJyaWVmY2FzZTpiZWZvcmV7Y29udGVudDoiXGUxMzkifS5nbHlwaGljb24tZnVsbHNjcmVlbjpiZWZvcmV7Y29udGVudDoiXGUxNDAifS5nbHlwaGljb24tZGFzaGJvYXJkOmJlZm9yZXtjb250ZW50OiJcZTE0MSJ9LmdseXBoaWNvbi1wYXBlcmNsaXA6YmVmb3Jle2NvbnRlbnQ6IlxlMTQyIn0uZ2x5cGhpY29uLWhlYXJ0LWVtcHR5OmJlZm9yZXtjb250ZW50OiJcZTE0MyJ9LmdseXBoaWNvbi1saW5rOmJlZm9yZXtjb250ZW50OiJcZTE0NCJ9LmdseXBoaWNvbi1waG9uZTpiZWZvcmV7Y29udGVudDoiXGUxNDUifS5nbHlwaGljb24tcHVzaHBpbjpiZWZvcmV7Y29udGVudDoiXGUxNDYifS5nbHlwaGljb24tdXNkOmJlZm9yZXtjb250ZW50OiJcZTE0OCJ9LmdseXBoaWNvbi1nYnA6YmVmb3Jle2NvbnRlbnQ6IlxlMTQ5In0uZ2x5cGhpY29uLXNvcnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTUwIn0uZ2x5cGhpY29uLXNvcnQtYnktYWxwaGFiZXQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTUxIn0uZ2x5cGhpY29uLXNvcnQtYnktYWxwaGFiZXQtYWx0OmJlZm9yZXtjb250ZW50OiJcZTE1MiJ9LmdseXBoaWNvbi1zb3J0LWJ5LW9yZGVyOmJlZm9yZXtjb250ZW50OiJcZTE1MyJ9LmdseXBoaWNvbi1zb3J0LWJ5LW9yZGVyLWFsdDpiZWZvcmV7Y29udGVudDoiXGUxNTQifS5nbHlwaGljb24tc29ydC1ieS1hdHRyaWJ1dGVzOmJlZm9yZXtjb250ZW50OiJcZTE1NSJ9LmdseXBoaWNvbi1zb3J0LWJ5LWF0dHJpYnV0ZXMtYWx0OmJlZm9yZXtjb250ZW50OiJcZTE1NiJ9LmdseXBoaWNvbi11bmNoZWNrZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTU3In0uZ2x5cGhpY29uLWV4cGFuZDpiZWZvcmV7Y29udGVudDoiXGUxNTgifS5nbHlwaGljb24tY29sbGFwc2UtZG93bjpiZWZvcmV7Y29udGVudDoiXGUxNTkifS5nbHlwaGljb24tY29sbGFwc2UtdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMTYwIn0uZ2x5cGhpY29uLWxvZy1pbjpiZWZvcmV7Y29udGVudDoiXGUxNjEifS5nbHlwaGljb24tZmxhc2g6YmVmb3Jle2NvbnRlbnQ6IlxlMTYyIn0uZ2x5cGhpY29uLWxvZy1vdXQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTYzIn0uZ2x5cGhpY29uLW5ldy13aW5kb3c6YmVmb3Jle2NvbnRlbnQ6IlxlMTY0In0uZ2x5cGhpY29uLXJlY29yZDpiZWZvcmV7Y29udGVudDoiXGUxNjUifS5nbHlwaGljb24tc2F2ZTpiZWZvcmV7Y29udGVudDoiXGUxNjYifS5nbHlwaGljb24tb3BlbjpiZWZvcmV7Y29udGVudDoiXGUxNjcifS5nbHlwaGljb24tc2F2ZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTY4In0uZ2x5cGhpY29uLWltcG9ydDpiZWZvcmV7Y29udGVudDoiXGUxNjkifS5nbHlwaGljb24tZXhwb3J0OmJlZm9yZXtjb250ZW50OiJcZTE3MCJ9LmdseXBoaWNvbi1zZW5kOmJlZm9yZXtjb250ZW50OiJcZTE3MSJ9LmdseXBoaWNvbi1mbG9wcHktZGlzazpiZWZvcmV7Y29udGVudDoiXGUxNzIifS5nbHlwaGljb24tZmxvcHB5LXNhdmVkOmJlZm9yZXtjb250ZW50OiJcZTE3MyJ9LmdseXBoaWNvbi1mbG9wcHktcmVtb3ZlOmJlZm9yZXtjb250ZW50OiJcZTE3NCJ9LmdseXBoaWNvbi1mbG9wcHktc2F2ZTpiZWZvcmV7Y29udGVudDoiXGUxNzUifS5nbHlwaGljb24tZmxvcHB5LW9wZW46YmVmb3Jle2NvbnRlbnQ6IlxlMTc2In0uZ2x5cGhpY29uLWNyZWRpdC1jYXJkOmJlZm9yZXtjb250ZW50OiJcZTE3NyJ9LmdseXBoaWNvbi10cmFuc2ZlcjpiZWZvcmV7Y29udGVudDoiXGUxNzgifS5nbHlwaGljb24tY3V0bGVyeTpiZWZvcmV7Y29udGVudDoiXGUxNzkifS5nbHlwaGljb24taGVhZGVyOmJlZm9yZXtjb250ZW50OiJcZTE4MCJ9LmdseXBoaWNvbi1jb21wcmVzc2VkOmJlZm9yZXtjb250ZW50OiJcZTE4MSJ9LmdseXBoaWNvbi1lYXJwaG9uZTpiZWZvcmV7Y29udGVudDoiXGUxODIifS5nbHlwaGljb24tcGhvbmUtYWx0OmJlZm9yZXtjb250ZW50OiJcZTE4MyJ9LmdseXBoaWNvbi10b3dlcjpiZWZvcmV7Y29udGVudDoiXGUxODQifS5nbHlwaGljb24tc3RhdHM6YmVmb3Jle2NvbnRlbnQ6IlxlMTg1In0uZ2x5cGhpY29uLXNkLXZpZGVvOmJlZm9yZXtjb250ZW50OiJcZTE4NiJ9LmdseXBoaWNvbi1oZC12aWRlbzpiZWZvcmV7Y29udGVudDoiXGUxODcifS5nbHlwaGljb24tc3VidGl0bGVzOmJlZm9yZXtjb250ZW50OiJcZTE4OCJ9LmdseXBoaWNvbi1zb3VuZC1zdGVyZW86YmVmb3Jle2NvbnRlbnQ6IlxlMTg5In0uZ2x5cGhpY29uLXNvdW5kLWRvbGJ5OmJlZm9yZXtjb250ZW50OiJcZTE5MCJ9LmdseXBoaWNvbi1zb3VuZC01LTE6YmVmb3Jle2NvbnRlbnQ6IlxlMTkxIn0uZ2x5cGhpY29uLXNvdW5kLTYtMTpiZWZvcmV7Y29udGVudDoiXGUxOTIifS5nbHlwaGljb24tc291bmQtNy0xOmJlZm9yZXtjb250ZW50OiJcZTE5MyJ9LmdseXBoaWNvbi1jb3B5cmlnaHQtbWFyazpiZWZvcmV7Y29udGVudDoiXGUxOTQifS5nbHlwaGljb24tcmVnaXN0cmF0aW9uLW1hcms6YmVmb3Jle2NvbnRlbnQ6IlxlMTk1In0uZ2x5cGhpY29uLWNsb3VkLWRvd25sb2FkOmJlZm9yZXtjb250ZW50OiJcZTE5NyJ9LmdseXBoaWNvbi1jbG91ZC11cGxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTk4In0uZ2x5cGhpY29uLXRyZWUtY29uaWZlcjpiZWZvcmV7Y29udGVudDoiXGUxOTkifS5nbHlwaGljb24tdHJlZS1kZWNpZHVvdXM6YmVmb3Jle2NvbnRlbnQ6IlxlMjAwIn0uY2FyZXR7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDttYXJnaW4tbGVmdDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO2JvcmRlci10b3A6NHB4IHNvbGlkO2JvcmRlci1yaWdodDo0cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkIHRyYW5zcGFyZW50fS5kcm9wZG93bntwb3NpdGlvbjpyZWxhdGl2ZX0uZHJvcGRvd24tdG9nZ2xlOmZvY3Vze291dGxpbmU6MH0uZHJvcGRvd24tbWVudXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjA7ei1pbmRleDoxMDAwO2Rpc3BsYXk6bm9uZTtmbG9hdDpsZWZ0O21pbi13aWR0aDoxNjBweDtwYWRkaW5nOjVweCAwO21hcmdpbjoycHggMCAwO2xpc3Qtc3R5bGU6bm9uZTtmb250LXNpemU6MTRweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMTUpO2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzowIDZweCAxMnB4IHJnYmEoMCwwLDAsLjE3NSk7Ym94LXNoYWRvdzowIDZweCAxMnB4IHJnYmEoMCwwLDAsLjE3NSk7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94fS5kcm9wZG93bi1tZW51LnB1bGwtcmlnaHR7cmlnaHQ6MDtsZWZ0OmF1dG99LmRyb3Bkb3duLW1lbnUgLmRpdmlkZXJ7aGVpZ2h0OjFweDttYXJnaW46OXB4IDA7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6I2U1ZTVlNX0uZHJvcGRvd24tbWVudT5saT5he2Rpc3BsYXk6YmxvY2s7cGFkZGluZzozcHggMjBweDtjbGVhcjpib3RoO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2NvbG9yOiMzMzM7d2hpdGUtc3BhY2U6bm93cmFwfS5kcm9wZG93bi1tZW51PmxpPmE6aG92ZXIsLmRyb3Bkb3duLW1lbnU+bGk+YTpmb2N1c3t0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojMjYyNjI2O2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX0uZHJvcGRvd24tbWVudT4uYWN0aXZlPmEsLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hOmhvdmVyLC5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YTpmb2N1c3tjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO291dGxpbmU6MDtiYWNrZ3JvdW5kLWNvbG9yOiM0MjhiY2F9LmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmEsLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmE6aG92ZXIsLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmE6Zm9jdXN7Y29sb3I6Izk5OX0uZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpob3ZlciwuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpmb2N1c3t0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JhY2tncm91bmQtaW1hZ2U6bm9uZTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KGVuYWJsZWQ9ZmFsc2UpO2N1cnNvcjpub3QtYWxsb3dlZH0ub3Blbj4uZHJvcGRvd24tbWVudXtkaXNwbGF5OmJsb2NrfS5vcGVuPmF7b3V0bGluZTowfS5kcm9wZG93bi1tZW51LXJpZ2h0e2xlZnQ6YXV0bztyaWdodDowfS5kcm9wZG93bi1tZW51LWxlZnR7bGVmdDowO3JpZ2h0OmF1dG99LmRyb3Bkb3duLWhlYWRlcntkaXNwbGF5OmJsb2NrO3BhZGRpbmc6M3B4IDIwcHg7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojOTk5fS5kcm9wZG93bi1iYWNrZHJvcHtwb3NpdGlvbjpmaXhlZDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDt0b3A6MDt6LWluZGV4Ojk5MH0ucHVsbC1yaWdodD4uZHJvcGRvd24tbWVudXtyaWdodDowO2xlZnQ6YXV0b30uZHJvcHVwIC5jYXJldCwubmF2YmFyLWZpeGVkLWJvdHRvbSAuZHJvcGRvd24gLmNhcmV0e2JvcmRlci10b3A6MDtib3JkZXItYm90dG9tOjRweCBzb2xpZDtjb250ZW50OiIifS5kcm9wdXAgLmRyb3Bkb3duLW1lbnUsLm5hdmJhci1maXhlZC1ib3R0b20gLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51e3RvcDphdXRvO2JvdHRvbToxMDAlO21hcmdpbi1ib3R0b206MXB4fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLXJpZ2h0IC5kcm9wZG93bi1tZW51e2xlZnQ6YXV0bztyaWdodDowfS5uYXZiYXItcmlnaHQgLmRyb3Bkb3duLW1lbnUtbGVmdHtsZWZ0OjA7cmlnaHQ6YXV0b319LmJ0bi1ncm91cCwuYnRuLWdyb3VwLXZlcnRpY2Fse3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uYnRuLWdyb3VwPi5idG4sLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRue3Bvc2l0aW9uOnJlbGF0aXZlO2Zsb2F0OmxlZnR9LmJ0bi1ncm91cD4uYnRuOmhvdmVyLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjpob3ZlciwuYnRuLWdyb3VwPi5idG46Zm9jdXMsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOmZvY3VzLC5idG4tZ3JvdXA+LmJ0bjphY3RpdmUsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOmFjdGl2ZSwuYnRuLWdyb3VwPi5idG4uYWN0aXZlLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi5hY3RpdmV7ei1pbmRleDoyfS5idG4tZ3JvdXA+LmJ0bjpmb2N1cywuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46Zm9jdXN7b3V0bGluZTowfS5idG4tZ3JvdXAgLmJ0bisuYnRuLC5idG4tZ3JvdXAgLmJ0bisuYnRuLWdyb3VwLC5idG4tZ3JvdXAgLmJ0bi1ncm91cCsuYnRuLC5idG4tZ3JvdXAgLmJ0bi1ncm91cCsuYnRuLWdyb3Vwe21hcmdpbi1sZWZ0Oi0xcHh9LmJ0bi10b29sYmFye21hcmdpbi1sZWZ0Oi01cHh9LmJ0bi10b29sYmFyIC5idG4tZ3JvdXAsLmJ0bi10b29sYmFyIC5pbnB1dC1ncm91cHtmbG9hdDpsZWZ0fS5idG4tdG9vbGJhcj4uYnRuLC5idG4tdG9vbGJhcj4uYnRuLWdyb3VwLC5idG4tdG9vbGJhcj4uaW5wdXQtZ3JvdXB7bWFyZ2luLWxlZnQ6NXB4fS5idG4tZ3JvdXA+LmJ0bjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKXtib3JkZXItcmFkaXVzOjB9LmJ0bi1ncm91cD4uYnRuOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjB9LmJ0bi1ncm91cD4uYnRuOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpe2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0uYnRuLWdyb3VwPi5idG46bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSwuYnRuLWdyb3VwPi5kcm9wZG93bi10b2dnbGU6bm90KDpmaXJzdC1jaGlsZCl7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MH0uYnRuLWdyb3VwPi5idG4tZ3JvdXB7ZmxvYXQ6bGVmdH0uYnRuLWdyb3VwPi5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKT4uYnRue2JvcmRlci1yYWRpdXM6MH0uYnRuLWdyb3VwPi5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ+LmJ0bjpsYXN0LWNoaWxkLC5idG4tZ3JvdXA+LmJ0bi1ncm91cDpmaXJzdC1jaGlsZD4uZHJvcGRvd24tdG9nZ2xle2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0uYnRuLWdyb3VwPi5idG4tZ3JvdXA6bGFzdC1jaGlsZD4uYnRuOmZpcnN0LWNoaWxke2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjB9LmJ0bi1ncm91cCAuZHJvcGRvd24tdG9nZ2xlOmFjdGl2ZSwuYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZXtvdXRsaW5lOjB9LmJ0bi1ncm91cD4uYnRuKy5kcm9wZG93bi10b2dnbGV7cGFkZGluZy1sZWZ0OjhweDtwYWRkaW5nLXJpZ2h0OjhweH0uYnRuLWdyb3VwPi5idG4tbGcrLmRyb3Bkb3duLXRvZ2dsZXtwYWRkaW5nLWxlZnQ6MTJweDtwYWRkaW5nLXJpZ2h0OjEycHh9LmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGV7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgM3B4IDVweCByZ2JhKDAsMCwwLC4xMjUpO2JveC1zaGFkb3c6aW5zZXQgMCAzcHggNXB4IHJnYmEoMCwwLDAsLjEyNSl9LmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGUuYnRuLWxpbmt7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS5idG4gLmNhcmV0e21hcmdpbi1sZWZ0OjB9LmJ0bi1sZyAuY2FyZXR7Ym9yZGVyLXdpZHRoOjVweCA1cHggMDtib3JkZXItYm90dG9tLXdpZHRoOjB9LmRyb3B1cCAuYnRuLWxnIC5jYXJldHtib3JkZXItd2lkdGg6MCA1cHggNXB4fS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0biwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXAsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWdyb3VwPi5idG57ZGlzcGxheTpibG9jaztmbG9hdDpub25lO3dpZHRoOjEwMCU7bWF4LXdpZHRoOjEwMCV9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWdyb3VwPi5idG57ZmxvYXQ6bm9uZX0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4rLmJ0biwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4rLmJ0bi1ncm91cCwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXArLmJ0biwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXArLmJ0bi1ncm91cHttYXJnaW4tdG9wOi0xcHg7bWFyZ2luLWxlZnQ6MH0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItcmFkaXVzOjB9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCl7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpPi5idG57Ym9yZGVyLXJhZGl1czowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpPi5idG46bGFzdC1jaGlsZCwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKT4uZHJvcGRvd24tdG9nZ2xle2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpPi5idG46Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjB9LmJ0bi1ncm91cC1qdXN0aWZpZWR7ZGlzcGxheTp0YWJsZTt3aWR0aDoxMDAlO3RhYmxlLWxheW91dDpmaXhlZDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGV9LmJ0bi1ncm91cC1qdXN0aWZpZWQ+LmJ0biwuYnRuLWdyb3VwLWp1c3RpZmllZD4uYnRuLWdyb3Vwe2Zsb2F0Om5vbmU7ZGlzcGxheTp0YWJsZS1jZWxsO3dpZHRoOjElfS5idG4tZ3JvdXAtanVzdGlmaWVkPi5idG4tZ3JvdXAgLmJ0bnt3aWR0aDoxMDAlfVtkYXRhLXRvZ2dsZT1idXR0b25zXT4uYnRuPmlucHV0W3R5cGU9cmFkaW9dLFtkYXRhLXRvZ2dsZT1idXR0b25zXT4uYnRuPmlucHV0W3R5cGU9Y2hlY2tib3hde2Rpc3BsYXk6bm9uZX0uaW5wdXQtZ3JvdXB7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTp0YWJsZTtib3JkZXItY29sbGFwc2U6c2VwYXJhdGV9LmlucHV0LWdyb3VwW2NsYXNzKj1jb2wtXXtmbG9hdDpub25lO3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MH0uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbHtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjI7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlO21hcmdpbi1ib3R0b206MH0uaW5wdXQtZ3JvdXAtbGc+LmZvcm0tY29udHJvbCwuaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWFkZG9uLC5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYnRuPi5idG57aGVpZ2h0OjQ2cHg7cGFkZGluZzoxMHB4IDE2cHg7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MS4zMztib3JkZXItcmFkaXVzOjZweH1zZWxlY3QuaW5wdXQtZ3JvdXAtbGc+LmZvcm0tY29udHJvbCxzZWxlY3QuaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWFkZG9uLHNlbGVjdC5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYnRuPi5idG57aGVpZ2h0OjQ2cHg7bGluZS1oZWlnaHQ6NDZweH10ZXh0YXJlYS5pbnB1dC1ncm91cC1sZz4uZm9ybS1jb250cm9sLHRleHRhcmVhLmlucHV0LWdyb3VwLWxnPi5pbnB1dC1ncm91cC1hZGRvbix0ZXh0YXJlYS5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYnRuPi5idG4sc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1sZz4uZm9ybS1jb250cm9sLHNlbGVjdFttdWx0aXBsZV0uaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWFkZG9uLHNlbGVjdFttdWx0aXBsZV0uaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWJ0bj4uYnRue2hlaWdodDphdXRvfS5pbnB1dC1ncm91cC1zbT4uZm9ybS1jb250cm9sLC5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYWRkb24sLmlucHV0LWdyb3VwLXNtPi5pbnB1dC1ncm91cC1idG4+LmJ0bntoZWlnaHQ6MzBweDtwYWRkaW5nOjVweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOjNweH1zZWxlY3QuaW5wdXQtZ3JvdXAtc20+LmZvcm0tY29udHJvbCxzZWxlY3QuaW5wdXQtZ3JvdXAtc20+LmlucHV0LWdyb3VwLWFkZG9uLHNlbGVjdC5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYnRuPi5idG57aGVpZ2h0OjMwcHg7bGluZS1oZWlnaHQ6MzBweH10ZXh0YXJlYS5pbnB1dC1ncm91cC1zbT4uZm9ybS1jb250cm9sLHRleHRhcmVhLmlucHV0LWdyb3VwLXNtPi5pbnB1dC1ncm91cC1hZGRvbix0ZXh0YXJlYS5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYnRuPi5idG4sc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1zbT4uZm9ybS1jb250cm9sLHNlbGVjdFttdWx0aXBsZV0uaW5wdXQtZ3JvdXAtc20+LmlucHV0LWdyb3VwLWFkZG9uLHNlbGVjdFttdWx0aXBsZV0uaW5wdXQtZ3JvdXAtc20+LmlucHV0LWdyb3VwLWJ0bj4uYnRue2hlaWdodDphdXRvfS5pbnB1dC1ncm91cC1hZGRvbiwuaW5wdXQtZ3JvdXAtYnRuLC5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9se2Rpc3BsYXk6dGFibGUtY2VsbH0uaW5wdXQtZ3JvdXAtYWRkb246bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSwuaW5wdXQtZ3JvdXAtYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCksLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItcmFkaXVzOjB9LmlucHV0LWdyb3VwLWFkZG9uLC5pbnB1dC1ncm91cC1idG57d2lkdGg6MSU7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaW5wdXQtZ3JvdXAtYWRkb257cGFkZGluZzo2cHggMTJweDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojNTU1O3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6I2VlZTtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJhZGl1czo0cHh9LmlucHV0LWdyb3VwLWFkZG9uLmlucHV0LXNte3BhZGRpbmc6NXB4IDEwcHg7Zm9udC1zaXplOjEycHg7Ym9yZGVyLXJhZGl1czozcHh9LmlucHV0LWdyb3VwLWFkZG9uLmlucHV0LWxne3BhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxOHB4O2JvcmRlci1yYWRpdXM6NnB4fS5pbnB1dC1ncm91cC1hZGRvbiBpbnB1dFt0eXBlPXJhZGlvXSwuaW5wdXQtZ3JvdXAtYWRkb24gaW5wdXRbdHlwZT1jaGVja2JveF17bWFyZ2luLXRvcDowfS5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOmZpcnN0LWNoaWxkLC5pbnB1dC1ncm91cC1hZGRvbjpmaXJzdC1jaGlsZCwuaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuLWdyb3VwPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uZHJvcGRvd24tdG9nZ2xlLC5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZD4uYnRuOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpLC5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZD4uYnRuLWdyb3VwOm5vdCg6bGFzdC1jaGlsZCk+LmJ0bntib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9LmlucHV0LWdyb3VwLWFkZG9uOmZpcnN0LWNoaWxke2JvcmRlci1yaWdodDowfS5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOmxhc3QtY2hpbGQsLmlucHV0LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGQsLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkPi5idG4tZ3JvdXA+LmJ0biwuaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQ+LmRyb3Bkb3duLXRvZ2dsZSwuaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkPi5idG46bm90KDpmaXJzdC1jaGlsZCksLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpPi5idG57Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MH0uaW5wdXQtZ3JvdXAtYWRkb246bGFzdC1jaGlsZHtib3JkZXItbGVmdDowfS5pbnB1dC1ncm91cC1idG57cG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOjA7d2hpdGUtc3BhY2U6bm93cmFwfS5pbnB1dC1ncm91cC1idG4+LmJ0bntwb3NpdGlvbjpyZWxhdGl2ZX0uaW5wdXQtZ3JvdXAtYnRuPi5idG4rLmJ0bnttYXJnaW4tbGVmdDotMXB4fS5pbnB1dC1ncm91cC1idG4+LmJ0bjpob3ZlciwuaW5wdXQtZ3JvdXAtYnRuPi5idG46Zm9jdXMsLmlucHV0LWdyb3VwLWJ0bj4uYnRuOmFjdGl2ZXt6LWluZGV4OjJ9LmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuLC5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQ+LmJ0bi1ncm91cHttYXJnaW4tcmlnaHQ6LTFweH0uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQ+LmJ0biwuaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQ+LmJ0bi1ncm91cHttYXJnaW4tbGVmdDotMXB4fS5uYXZ7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctbGVmdDowO2xpc3Qtc3R5bGU6bm9uZX0ubmF2Pmxpe3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2t9Lm5hdj5saT5he3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7cGFkZGluZzoxMHB4IDE1cHh9Lm5hdj5saT5hOmhvdmVyLC5uYXY+bGk+YTpmb2N1c3t0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm5hdj5saS5kaXNhYmxlZD5he2NvbG9yOiM5OTl9Lm5hdj5saS5kaXNhYmxlZD5hOmhvdmVyLC5uYXY+bGkuZGlzYWJsZWQ+YTpmb2N1c3tjb2xvcjojOTk5O3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y3Vyc29yOm5vdC1hbGxvd2VkfS5uYXYgLm9wZW4+YSwubmF2IC5vcGVuPmE6aG92ZXIsLm5hdiAub3Blbj5hOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2VlZTtib3JkZXItY29sb3I6IzQyOGJjYX0ubmF2IC5uYXYtZGl2aWRlcntoZWlnaHQ6MXB4O21hcmdpbjo5cHggMDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1jb2xvcjojZTVlNWU1fS5uYXY+bGk+YT5pbWd7bWF4LXdpZHRoOm5vbmV9Lm5hdi10YWJze2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGR9Lm5hdi10YWJzPmxpe2Zsb2F0OmxlZnQ7bWFyZ2luLWJvdHRvbTotMXB4fS5uYXYtdGFicz5saT5he21hcmdpbi1yaWdodDoycHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDB9Lm5hdi10YWJzPmxpPmE6aG92ZXJ7Ym9yZGVyLWNvbG9yOiNlZWUgI2VlZSAjZGRkfS5uYXYtdGFicz5saS5hY3RpdmU+YSwubmF2LXRhYnM+bGkuYWN0aXZlPmE6aG92ZXIsLm5hdi10YWJzPmxpLmFjdGl2ZT5hOmZvY3Vze2NvbG9yOiM1NTU7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2RkZDtib3JkZXItYm90dG9tLWNvbG9yOnRyYW5zcGFyZW50O2N1cnNvcjpkZWZhdWx0fS5uYXYtdGFicy5uYXYtanVzdGlmaWVke3dpZHRoOjEwMCU7Ym9yZGVyLWJvdHRvbTowfS5uYXYtdGFicy5uYXYtanVzdGlmaWVkPmxpe2Zsb2F0Om5vbmV9Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+bGk+YXt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjVweH0ubmF2LXRhYnMubmF2LWp1c3RpZmllZD4uZHJvcGRvd24gLmRyb3Bkb3duLW1lbnV7dG9wOmF1dG87bGVmdDphdXRvfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2LXRhYnMubmF2LWp1c3RpZmllZD5saXtkaXNwbGF5OnRhYmxlLWNlbGw7d2lkdGg6MSV9Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+bGk+YXttYXJnaW4tYm90dG9tOjB9fS5uYXYtdGFicy5uYXYtanVzdGlmaWVkPmxpPmF7bWFyZ2luLXJpZ2h0OjA7Ym9yZGVyLXJhZGl1czo0cHh9Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+LmFjdGl2ZT5hLC5uYXYtdGFicy5uYXYtanVzdGlmaWVkPi5hY3RpdmU+YTpob3ZlciwubmF2LXRhYnMubmF2LWp1c3RpZmllZD4uYWN0aXZlPmE6Zm9jdXN7Ym9yZGVyOjFweCBzb2xpZCAjZGRkfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2LXRhYnMubmF2LWp1c3RpZmllZD5saT5he2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLXJhZGl1czo0cHggNHB4IDAgMH0ubmF2LXRhYnMubmF2LWp1c3RpZmllZD4uYWN0aXZlPmEsLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+LmFjdGl2ZT5hOmhvdmVyLC5uYXYtdGFicy5uYXYtanVzdGlmaWVkPi5hY3RpdmU+YTpmb2N1c3tib3JkZXItYm90dG9tLWNvbG9yOiNmZmZ9fS5uYXYtcGlsbHM+bGl7ZmxvYXQ6bGVmdH0ubmF2LXBpbGxzPmxpPmF7Ym9yZGVyLXJhZGl1czo0cHh9Lm5hdi1waWxscz5saStsaXttYXJnaW4tbGVmdDoycHh9Lm5hdi1waWxscz5saS5hY3RpdmU+YSwubmF2LXBpbGxzPmxpLmFjdGl2ZT5hOmhvdmVyLC5uYXYtcGlsbHM+bGkuYWN0aXZlPmE6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM0MjhiY2F9Lm5hdi1zdGFja2VkPmxpe2Zsb2F0Om5vbmV9Lm5hdi1zdGFja2VkPmxpK2xpe21hcmdpbi10b3A6MnB4O21hcmdpbi1sZWZ0OjB9Lm5hdi1qdXN0aWZpZWR7d2lkdGg6MTAwJX0ubmF2LWp1c3RpZmllZD5saXtmbG9hdDpub25lfS5uYXYtanVzdGlmaWVkPmxpPmF7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLWJvdHRvbTo1cHh9Lm5hdi1qdXN0aWZpZWQ+LmRyb3Bkb3duIC5kcm9wZG93bi1tZW51e3RvcDphdXRvO2xlZnQ6YXV0b31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdi1qdXN0aWZpZWQ+bGl7ZGlzcGxheTp0YWJsZS1jZWxsO3dpZHRoOjElfS5uYXYtanVzdGlmaWVkPmxpPmF7bWFyZ2luLWJvdHRvbTowfX0ubmF2LXRhYnMtanVzdGlmaWVke2JvcmRlci1ib3R0b206MH0ubmF2LXRhYnMtanVzdGlmaWVkPmxpPmF7bWFyZ2luLXJpZ2h0OjA7Ym9yZGVyLXJhZGl1czo0cHh9Lm5hdi10YWJzLWp1c3RpZmllZD4uYWN0aXZlPmEsLm5hdi10YWJzLWp1c3RpZmllZD4uYWN0aXZlPmE6aG92ZXIsLm5hdi10YWJzLWp1c3RpZmllZD4uYWN0aXZlPmE6Zm9jdXN7Ym9yZGVyOjFweCBzb2xpZCAjZGRkfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2LXRhYnMtanVzdGlmaWVkPmxpPmF7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtib3JkZXItcmFkaXVzOjRweCA0cHggMCAwfS5uYXYtdGFicy1qdXN0aWZpZWQ+LmFjdGl2ZT5hLC5uYXYtdGFicy1qdXN0aWZpZWQ+LmFjdGl2ZT5hOmhvdmVyLC5uYXYtdGFicy1qdXN0aWZpZWQ+LmFjdGl2ZT5hOmZvY3Vze2JvcmRlci1ib3R0b20tY29sb3I6I2ZmZn19LnRhYi1jb250ZW50Pi50YWItcGFuZXtkaXNwbGF5Om5vbmV9LnRhYi1jb250ZW50Pi5hY3RpdmV7ZGlzcGxheTpibG9ja30ubmF2LXRhYnMgLmRyb3Bkb3duLW1lbnV7bWFyZ2luLXRvcDotMXB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowfS5uYXZiYXJ7cG9zaXRpb246cmVsYXRpdmU7bWluLWhlaWdodDo1MHB4O21hcmdpbi1ib3R0b206MjBweDtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFye2JvcmRlci1yYWRpdXM6NHB4fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhci1oZWFkZXJ7ZmxvYXQ6bGVmdH19Lm5hdmJhci1jb2xsYXBzZXttYXgtaGVpZ2h0OjM0MHB4O292ZXJmbG93LXg6dmlzaWJsZTtwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjE1cHg7Ym9yZGVyLXRvcDoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5uYXZiYXItY29sbGFwc2UuaW57b3ZlcmZsb3cteTphdXRvfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLWNvbGxhcHNle3dpZHRoOmF1dG87Ym9yZGVyLXRvcDowO2JveC1zaGFkb3c6bm9uZX0ubmF2YmFyLWNvbGxhcHNlLmNvbGxhcHNle2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50O2hlaWdodDphdXRvIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbTowO292ZXJmbG93OnZpc2libGUhaW1wb3J0YW50fS5uYXZiYXItY29sbGFwc2UuaW57b3ZlcmZsb3cteTp2aXNpYmxlfS5uYXZiYXItZml4ZWQtdG9wIC5uYXZiYXItY29sbGFwc2UsLm5hdmJhci1zdGF0aWMtdG9wIC5uYXZiYXItY29sbGFwc2UsLm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1jb2xsYXBzZXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjB9fS5jb250YWluZXI+Lm5hdmJhci1oZWFkZXIsLmNvbnRhaW5lci1mbHVpZD4ubmF2YmFyLWhlYWRlciwuY29udGFpbmVyPi5uYXZiYXItY29sbGFwc2UsLmNvbnRhaW5lci1mbHVpZD4ubmF2YmFyLWNvbGxhcHNle21hcmdpbi1yaWdodDotMTVweDttYXJnaW4tbGVmdDotMTVweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmNvbnRhaW5lcj4ubmF2YmFyLWhlYWRlciwuY29udGFpbmVyLWZsdWlkPi5uYXZiYXItaGVhZGVyLC5jb250YWluZXI+Lm5hdmJhci1jb2xsYXBzZSwuY29udGFpbmVyLWZsdWlkPi5uYXZiYXItY29sbGFwc2V7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MH19Lm5hdmJhci1zdGF0aWMtdG9we3otaW5kZXg6MTAwMDtib3JkZXItd2lkdGg6MCAwIDFweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhci1zdGF0aWMtdG9we2JvcmRlci1yYWRpdXM6MH19Lm5hdmJhci1maXhlZC10b3AsLm5hdmJhci1maXhlZC1ib3R0b217cG9zaXRpb246Zml4ZWQ7cmlnaHQ6MDtsZWZ0OjA7ei1pbmRleDoxMDMwfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLWZpeGVkLXRvcCwubmF2YmFyLWZpeGVkLWJvdHRvbXtib3JkZXItcmFkaXVzOjB9fS5uYXZiYXItZml4ZWQtdG9we3RvcDowO2JvcmRlci13aWR0aDowIDAgMXB4fS5uYXZiYXItZml4ZWQtYm90dG9te2JvdHRvbTowO21hcmdpbi1ib3R0b206MDtib3JkZXItd2lkdGg6MXB4IDAgMH0ubmF2YmFyLWJyYW5ke2Zsb2F0OmxlZnQ7cGFkZGluZzoxNXB4O2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjIwcHg7aGVpZ2h0OjUwcHh9Lm5hdmJhci1icmFuZDpob3ZlciwubmF2YmFyLWJyYW5kOmZvY3Vze3RleHQtZGVjb3JhdGlvbjpub25lfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyPi5jb250YWluZXIgLm5hdmJhci1icmFuZCwubmF2YmFyPi5jb250YWluZXItZmx1aWQgLm5hdmJhci1icmFuZHttYXJnaW4tbGVmdDotMTVweH19Lm5hdmJhci10b2dnbGV7cG9zaXRpb246cmVsYXRpdmU7ZmxvYXQ6cmlnaHQ7bWFyZ2luLXJpZ2h0OjE1cHg7cGFkZGluZzo5cHggMTBweDttYXJnaW4tdG9wOjhweDttYXJnaW4tYm90dG9tOjhweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JhY2tncm91bmQtaW1hZ2U6bm9uZTtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NHB4fS5uYXZiYXItdG9nZ2xlOmZvY3Vze291dGxpbmU6MH0ubmF2YmFyLXRvZ2dsZSAuaWNvbi1iYXJ7ZGlzcGxheTpibG9jazt3aWR0aDoyMnB4O2hlaWdodDoycHg7Ym9yZGVyLXJhZGl1czoxcHh9Lm5hdmJhci10b2dnbGUgLmljb24tYmFyKy5pY29uLWJhcnttYXJnaW4tdG9wOjRweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhci10b2dnbGV7ZGlzcGxheTpub25lfX0ubmF2YmFyLW5hdnttYXJnaW46Ny41cHggLTE1cHh9Lm5hdmJhci1uYXY+bGk+YXtwYWRkaW5nLXRvcDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7bGluZS1oZWlnaHQ6MjBweH1AbWVkaWEgKG1heC13aWR0aDo3NjdweCl7Lm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnV7cG9zaXRpb246c3RhdGljO2Zsb2F0Om5vbmU7d2lkdGg6YXV0bzttYXJnaW4tdG9wOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MDtib3gtc2hhZG93Om5vbmV9Lm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+bGk+YSwubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudSAuZHJvcGRvd24taGVhZGVye3BhZGRpbmc6NXB4IDE1cHggNXB4IDI1cHh9Lm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+bGk+YXtsaW5lLWhlaWdodDoyMHB4fS5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmE6aG92ZXIsLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+bGk+YTpmb2N1c3tiYWNrZ3JvdW5kLWltYWdlOm5vbmV9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLW5hdntmbG9hdDpsZWZ0O21hcmdpbjowfS5uYXZiYXItbmF2Pmxpe2Zsb2F0OmxlZnR9Lm5hdmJhci1uYXY+bGk+YXtwYWRkaW5nLXRvcDoxNXB4O3BhZGRpbmctYm90dG9tOjE1cHh9Lm5hdmJhci1uYXYubmF2YmFyLXJpZ2h0Omxhc3QtY2hpbGR7bWFyZ2luLXJpZ2h0Oi0xNXB4fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhci1sZWZ0e2Zsb2F0OmxlZnQhaW1wb3J0YW50fS5uYXZiYXItcmlnaHR7ZmxvYXQ6cmlnaHQhaW1wb3J0YW50fX0ubmF2YmFyLWZvcm17bWFyZ2luLWxlZnQ6LTE1cHg7bWFyZ2luLXJpZ2h0Oi0xNXB4O3BhZGRpbmc6MTBweCAxNXB4O2JvcmRlci10b3A6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSk7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLWJvdHRvbTo4cHh9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItZm9ybSAuZm9ybS1ncm91cHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tYm90dG9tOjA7dmVydGljYWwtYWxpZ246bWlkZGxlfS5uYXZiYXItZm9ybSAuZm9ybS1jb250cm9se2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOmF1dG87dmVydGljYWwtYWxpZ246bWlkZGxlfS5uYXZiYXItZm9ybSAuaW5wdXQtZ3JvdXA+LmZvcm0tY29udHJvbHt3aWR0aDoxMDAlfS5uYXZiYXItZm9ybSAuY29udHJvbC1sYWJlbHttYXJnaW4tYm90dG9tOjA7dmVydGljYWwtYWxpZ246bWlkZGxlfS5uYXZiYXItZm9ybSAucmFkaW8sLm5hdmJhci1mb3JtIC5jaGVja2JveHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctbGVmdDowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubmF2YmFyLWZvcm0gLnJhZGlvIGlucHV0W3R5cGU9cmFkaW9dLC5uYXZiYXItZm9ybSAuY2hlY2tib3ggaW5wdXRbdHlwZT1jaGVja2JveF17ZmxvYXQ6bm9uZTttYXJnaW4tbGVmdDowfS5uYXZiYXItZm9ybSAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7dG9wOjB9fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsubmF2YmFyLWZvcm0gLmZvcm0tZ3JvdXB7bWFyZ2luLWJvdHRvbTo1cHh9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLWZvcm17d2lkdGg6YXV0bztib3JkZXI6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO3BhZGRpbmctdG9wOjA7cGFkZGluZy1ib3R0b206MDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9Lm5hdmJhci1mb3JtLm5hdmJhci1yaWdodDpsYXN0LWNoaWxke21hcmdpbi1yaWdodDotMTVweH19Lm5hdmJhci1uYXY+bGk+LmRyb3Bkb3duLW1lbnV7bWFyZ2luLXRvcDowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowfS5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItbmF2PmxpPi5kcm9wZG93bi1tZW51e2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5uYXZiYXItYnRue21hcmdpbi10b3A6OHB4O21hcmdpbi1ib3R0b206OHB4fS5uYXZiYXItYnRuLmJ0bi1zbXttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS5uYXZiYXItYnRuLmJ0bi14c3ttYXJnaW4tdG9wOjE0cHg7bWFyZ2luLWJvdHRvbToxNHB4fS5uYXZiYXItdGV4dHttYXJnaW4tdG9wOjE1cHg7bWFyZ2luLWJvdHRvbToxNXB4fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLXRleHR7ZmxvYXQ6bGVmdDttYXJnaW4tbGVmdDoxNXB4O21hcmdpbi1yaWdodDoxNXB4fS5uYXZiYXItdGV4dC5uYXZiYXItcmlnaHQ6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH19Lm5hdmJhci1kZWZhdWx0e2JhY2tncm91bmQtY29sb3I6I2Y4ZjhmODtib3JkZXItY29sb3I6I2U3ZTdlN30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1icmFuZHtjb2xvcjojNzc3fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmhvdmVyLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmZvY3Vze2NvbG9yOiM1ZTVlNWU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10ZXh0e2NvbG9yOiM3Nzd9Lm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2PmxpPmF7Y29sb3I6Izc3N30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YTpob3ZlciwubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YTpmb2N1c3tjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2Pi5hY3RpdmU+YSwubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+LmFjdGl2ZT5hOmhvdmVyLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4uYWN0aXZlPmE6Zm9jdXN7Y29sb3I6IzU1NTtiYWNrZ3JvdW5kLWNvbG9yOiNlN2U3ZTd9Lm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2Pi5kaXNhYmxlZD5hLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4uZGlzYWJsZWQ+YTpob3ZlciwubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+LmRpc2FibGVkPmE6Zm9jdXN7Y29sb3I6I2NjYztiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLXRvZ2dsZXtib3JkZXItY29sb3I6I2RkZH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGU6aG92ZXIsLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItdG9nZ2xlOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2RkZH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGUgLmljb24tYmFye2JhY2tncm91bmQtY29sb3I6Izg4OH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1mb3Jte2JvcmRlci1jb2xvcjojZTdlN2U3fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4ub3Blbj5hLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4ub3Blbj5hOmhvdmVyLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4ub3Blbj5hOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2U3ZTdlNztjb2xvcjojNTU1fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+bGk+YXtjb2xvcjojNzc3fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5hOmhvdmVyLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5hOmZvY3Vze2NvbG9yOiMzMzM7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uYWN0aXZlPmE6aG92ZXIsLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YTpmb2N1c3tjb2xvcjojNTU1O2JhY2tncm91bmQtY29sb3I6I2U3ZTdlN30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmEsLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmhvdmVyLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpmb2N1c3tjb2xvcjojY2NjO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWxpbmt7Y29sb3I6Izc3N30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1saW5rOmhvdmVye2NvbG9yOiMzMzN9Lm5hdmJhci1pbnZlcnNle2JhY2tncm91bmQtY29sb3I6IzIyMjtib3JkZXItY29sb3I6IzA4MDgwOH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1icmFuZHtjb2xvcjojOTk5fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWJyYW5kOmhvdmVyLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWJyYW5kOmZvY3Vze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci10ZXh0e2NvbG9yOiM5OTl9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2PmxpPmF7Y29sb3I6Izk5OX0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+bGk+YTpob3ZlciwubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+bGk+YTpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2Pi5hY3RpdmU+YSwubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+LmFjdGl2ZT5hOmhvdmVyLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4uYWN0aXZlPmE6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwODA4MDh9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2Pi5kaXNhYmxlZD5hLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4uZGlzYWJsZWQ+YTpob3ZlciwubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+LmRpc2FibGVkPmE6Zm9jdXN7Y29sb3I6IzQ0NDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXRvZ2dsZXtib3JkZXItY29sb3I6IzMzM30ubmF2YmFyLWludmVyc2UgLm5hdmJhci10b2dnbGU6aG92ZXIsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzMzM30ubmF2YmFyLWludmVyc2UgLm5hdmJhci10b2dnbGUgLmljb24tYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWludmVyc2UgLm5hdmJhci1mb3Jte2JvcmRlci1jb2xvcjojMTAxMDEwfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4ub3Blbj5hLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4ub3Blbj5hOmhvdmVyLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4ub3Blbj5hOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzA4MDgwODtjb2xvcjojZmZmfUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmRyb3Bkb3duLWhlYWRlcntib3JkZXItY29sb3I6IzA4MDgwOH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgLmRpdmlkZXJ7YmFja2dyb3VuZC1jb2xvcjojMDgwODA4fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5he2NvbG9yOiM5OTl9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmE6aG92ZXIsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmE6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uYWN0aXZlPmEsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YTpob3ZlciwubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hOmZvY3Vze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDgwODA4fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YSwubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmE6aG92ZXIsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmZvY3Vze2NvbG9yOiM0NDQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH19Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbGlua3tjb2xvcjojOTk5fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWxpbms6aG92ZXJ7Y29sb3I6I2ZmZn0uYnJlYWRjcnVtYntwYWRkaW5nOjhweCAxNXB4O21hcmdpbi1ib3R0b206MjBweDtsaXN0LXN0eWxlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci1yYWRpdXM6NHB4fS5icmVhZGNydW1iPmxpe2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5icmVhZGNydW1iPmxpK2xpOmJlZm9yZXtjb250ZW50OiIvXDAwYTAiO3BhZGRpbmc6MCA1cHg7Y29sb3I6I2NjY30uYnJlYWRjcnVtYj4uYWN0aXZle2NvbG9yOiM5OTl9LnBhZ2luYXRpb257ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZy1sZWZ0OjA7bWFyZ2luOjIwcHggMDtib3JkZXItcmFkaXVzOjRweH0ucGFnaW5hdGlvbj5saXtkaXNwbGF5OmlubGluZX0ucGFnaW5hdGlvbj5saT5hLC5wYWdpbmF0aW9uPmxpPnNwYW57cG9zaXRpb246cmVsYXRpdmU7ZmxvYXQ6bGVmdDtwYWRkaW5nOjZweCAxMnB4O2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6IzQyOGJjYTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO21hcmdpbi1sZWZ0Oi0xcHh9LnBhZ2luYXRpb24+bGk6Zmlyc3QtY2hpbGQ+YSwucGFnaW5hdGlvbj5saTpmaXJzdC1jaGlsZD5zcGFue21hcmdpbi1sZWZ0OjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHh9LnBhZ2luYXRpb24+bGk6bGFzdC1jaGlsZD5hLC5wYWdpbmF0aW9uPmxpOmxhc3QtY2hpbGQ+c3Bhbntib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4fS5wYWdpbmF0aW9uPmxpPmE6aG92ZXIsLnBhZ2luYXRpb24+bGk+c3Bhbjpob3ZlciwucGFnaW5hdGlvbj5saT5hOmZvY3VzLC5wYWdpbmF0aW9uPmxpPnNwYW46Zm9jdXN7Y29sb3I6IzJhNjQ5NjtiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Ym9yZGVyLWNvbG9yOiNkZGR9LnBhZ2luYXRpb24+LmFjdGl2ZT5hLC5wYWdpbmF0aW9uPi5hY3RpdmU+c3BhbiwucGFnaW5hdGlvbj4uYWN0aXZlPmE6aG92ZXIsLnBhZ2luYXRpb24+LmFjdGl2ZT5zcGFuOmhvdmVyLC5wYWdpbmF0aW9uPi5hY3RpdmU+YTpmb2N1cywucGFnaW5hdGlvbj4uYWN0aXZlPnNwYW46Zm9jdXN7ei1pbmRleDoyO2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNDI4YmNhO2JvcmRlci1jb2xvcjojNDI4YmNhO2N1cnNvcjpkZWZhdWx0fS5wYWdpbmF0aW9uPi5kaXNhYmxlZD5zcGFuLC5wYWdpbmF0aW9uPi5kaXNhYmxlZD5zcGFuOmhvdmVyLC5wYWdpbmF0aW9uPi5kaXNhYmxlZD5zcGFuOmZvY3VzLC5wYWdpbmF0aW9uPi5kaXNhYmxlZD5hLC5wYWdpbmF0aW9uPi5kaXNhYmxlZD5hOmhvdmVyLC5wYWdpbmF0aW9uPi5kaXNhYmxlZD5hOmZvY3Vze2NvbG9yOiM5OTk7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1jb2xvcjojZGRkO2N1cnNvcjpub3QtYWxsb3dlZH0ucGFnaW5hdGlvbi1sZz5saT5hLC5wYWdpbmF0aW9uLWxnPmxpPnNwYW57cGFkZGluZzoxMHB4IDE2cHg7Zm9udC1zaXplOjE4cHh9LnBhZ2luYXRpb24tbGc+bGk6Zmlyc3QtY2hpbGQ+YSwucGFnaW5hdGlvbi1sZz5saTpmaXJzdC1jaGlsZD5zcGFue2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NnB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NnB4fS5wYWdpbmF0aW9uLWxnPmxpOmxhc3QtY2hpbGQ+YSwucGFnaW5hdGlvbi1sZz5saTpsYXN0LWNoaWxkPnNwYW57Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NnB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjZweH0ucGFnaW5hdGlvbi1zbT5saT5hLC5wYWdpbmF0aW9uLXNtPmxpPnNwYW57cGFkZGluZzo1cHggMTBweDtmb250LXNpemU6MTJweH0ucGFnaW5hdGlvbi1zbT5saTpmaXJzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLXNtPmxpOmZpcnN0LWNoaWxkPnNwYW57Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHh9LnBhZ2luYXRpb24tc20+bGk6bGFzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLXNtPmxpOmxhc3QtY2hpbGQ+c3Bhbntib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czozcHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6M3B4fS5wYWdlcntwYWRkaW5nLWxlZnQ6MDttYXJnaW46MjBweCAwO2xpc3Qtc3R5bGU6bm9uZTt0ZXh0LWFsaWduOmNlbnRlcn0ucGFnZXIgbGl7ZGlzcGxheTppbmxpbmV9LnBhZ2VyIGxpPmEsLnBhZ2VyIGxpPnNwYW57ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzo1cHggMTRweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JvcmRlci1yYWRpdXM6MTVweH0ucGFnZXIgbGk+YTpob3ZlciwucGFnZXIgbGk+YTpmb2N1c3t0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9LnBhZ2VyIC5uZXh0PmEsLnBhZ2VyIC5uZXh0PnNwYW57ZmxvYXQ6cmlnaHR9LnBhZ2VyIC5wcmV2aW91cz5hLC5wYWdlciAucHJldmlvdXM+c3BhbntmbG9hdDpsZWZ0fS5wYWdlciAuZGlzYWJsZWQ+YSwucGFnZXIgLmRpc2FibGVkPmE6aG92ZXIsLnBhZ2VyIC5kaXNhYmxlZD5hOmZvY3VzLC5wYWdlciAuZGlzYWJsZWQ+c3Bhbntjb2xvcjojOTk5O2JhY2tncm91bmQtY29sb3I6I2ZmZjtjdXJzb3I6bm90LWFsbG93ZWR9LmxhYmVse2Rpc3BsYXk6aW5saW5lO3BhZGRpbmc6LjJlbSAuNmVtIC4zZW07Zm9udC1zaXplOjc1JTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTtib3JkZXItcmFkaXVzOi4yNWVtfS5sYWJlbFtocmVmXTpob3ZlciwubGFiZWxbaHJlZl06Zm9jdXN7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6cG9pbnRlcn0ubGFiZWw6ZW1wdHl7ZGlzcGxheTpub25lfS5idG4gLmxhYmVse3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDotMXB4fS5sYWJlbC1kZWZhdWx0e2JhY2tncm91bmQtY29sb3I6Izk5OX0ubGFiZWwtZGVmYXVsdFtocmVmXTpob3ZlciwubGFiZWwtZGVmYXVsdFtocmVmXTpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOmdyYXl9LmxhYmVsLXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojNDI4YmNhfS5sYWJlbC1wcmltYXJ5W2hyZWZdOmhvdmVyLC5sYWJlbC1wcmltYXJ5W2hyZWZdOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzMwNzFhOX0ubGFiZWwtc3VjY2Vzc3tiYWNrZ3JvdW5kLWNvbG9yOiM1Y2I4NWN9LmxhYmVsLXN1Y2Nlc3NbaHJlZl06aG92ZXIsLmxhYmVsLXN1Y2Nlc3NbaHJlZl06Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojNDQ5ZDQ0fS5sYWJlbC1pbmZve2JhY2tncm91bmQtY29sb3I6IzViYzBkZX0ubGFiZWwtaW5mb1tocmVmXTpob3ZlciwubGFiZWwtaW5mb1tocmVmXTpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMzMWIwZDV9LmxhYmVsLXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZjBhZDRlfS5sYWJlbC13YXJuaW5nW2hyZWZdOmhvdmVyLC5sYWJlbC13YXJuaW5nW2hyZWZdOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2VjOTcxZn0ubGFiZWwtZGFuZ2Vye2JhY2tncm91bmQtY29sb3I6I2Q5NTM0Zn0ubGFiZWwtZGFuZ2VyW2hyZWZdOmhvdmVyLC5sYWJlbC1kYW5nZXJbaHJlZl06Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojYzkzMDJjfS5iYWRnZXtkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6MTBweDtwYWRkaW5nOjNweCA3cHg7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiNmZmY7bGluZS1oZWlnaHQ6MTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojOTk5O2JvcmRlci1yYWRpdXM6MTBweH0uYmFkZ2U6ZW1wdHl7ZGlzcGxheTpub25lfS5idG4gLmJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDotMXB4fS5idG4teHMgLmJhZGdle3RvcDowO3BhZGRpbmc6MXB4IDVweH1hLmJhZGdlOmhvdmVyLGEuYmFkZ2U6Zm9jdXN7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6cG9pbnRlcn1hLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU+LmJhZGdlLC5uYXYtcGlsbHM+LmFjdGl2ZT5hPi5iYWRnZXtjb2xvcjojNDI4YmNhO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubmF2LXBpbGxzPmxpPmE+LmJhZGdle21hcmdpbi1sZWZ0OjNweH0uanVtYm90cm9ue3BhZGRpbmc6MzBweDttYXJnaW4tYm90dG9tOjMwcHg7Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lmp1bWJvdHJvbiBoMSwuanVtYm90cm9uIC5oMXtjb2xvcjppbmhlcml0fS5qdW1ib3Ryb24gcHttYXJnaW4tYm90dG9tOjE1cHg7Zm9udC1zaXplOjIxcHg7Zm9udC13ZWlnaHQ6MjAwfS5jb250YWluZXIgLmp1bWJvdHJvbntib3JkZXItcmFkaXVzOjZweH0uanVtYm90cm9uIC5jb250YWluZXJ7bWF4LXdpZHRoOjEwMCV9QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7Lmp1bWJvdHJvbntwYWRkaW5nLXRvcDo0OHB4O3BhZGRpbmctYm90dG9tOjQ4cHh9LmNvbnRhaW5lciAuanVtYm90cm9ue3BhZGRpbmctbGVmdDo2MHB4O3BhZGRpbmctcmlnaHQ6NjBweH0uanVtYm90cm9uIGgxLC5qdW1ib3Ryb24gLmgxe2ZvbnQtc2l6ZTo2M3B4fX0udGh1bWJuYWlse2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo0cHg7bWFyZ2luLWJvdHRvbToyMHB4O2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2RkZDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LXRyYW5zaXRpb246YWxsIC4ycyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOmFsbCAuMnMgZWFzZS1pbi1vdXR9LnRodW1ibmFpbD5pbWcsLnRodW1ibmFpbCBhPmltZ3ttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfWEudGh1bWJuYWlsOmhvdmVyLGEudGh1bWJuYWlsOmZvY3VzLGEudGh1bWJuYWlsLmFjdGl2ZXtib3JkZXItY29sb3I6IzQyOGJjYX0udGh1bWJuYWlsIC5jYXB0aW9ue3BhZGRpbmc6OXB4O2NvbG9yOiMzMzN9LmFsZXJ0e3BhZGRpbmc6MTVweDttYXJnaW4tYm90dG9tOjIwcHg7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjRweH0uYWxlcnQgaDR7bWFyZ2luLXRvcDowO2NvbG9yOmluaGVyaXR9LmFsZXJ0IC5hbGVydC1saW5re2ZvbnQtd2VpZ2h0OjcwMH0uYWxlcnQ+cCwuYWxlcnQ+dWx7bWFyZ2luLWJvdHRvbTowfS5hbGVydD5wK3B7bWFyZ2luLXRvcDo1cHh9LmFsZXJ0LWRpc21pc3NhYmxle3BhZGRpbmctcmlnaHQ6MzVweH0uYWxlcnQtZGlzbWlzc2FibGUgLmNsb3Nle3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDotMnB4O3JpZ2h0Oi0yMXB4O2NvbG9yOmluaGVyaXR9LmFsZXJ0LXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojZGZmMGQ4O2JvcmRlci1jb2xvcjojZDZlOWM2O2NvbG9yOiMzYzc2M2R9LmFsZXJ0LXN1Y2Nlc3MgaHJ7Ym9yZGVyLXRvcC1jb2xvcjojYzllMmIzfS5hbGVydC1zdWNjZXNzIC5hbGVydC1saW5re2NvbG9yOiMyYjU0MmN9LmFsZXJ0LWluZm97YmFja2dyb3VuZC1jb2xvcjojZDllZGY3O2JvcmRlci1jb2xvcjojYmNlOGYxO2NvbG9yOiMzMTcwOGZ9LmFsZXJ0LWluZm8gaHJ7Ym9yZGVyLXRvcC1jb2xvcjojYTZlMWVjfS5hbGVydC1pbmZvIC5hbGVydC1saW5re2NvbG9yOiMyNDUyNjl9LmFsZXJ0LXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzO2JvcmRlci1jb2xvcjojZmFlYmNjO2NvbG9yOiM4YTZkM2J9LmFsZXJ0LXdhcm5pbmcgaHJ7Ym9yZGVyLXRvcC1jb2xvcjojZjdlMWI1fS5hbGVydC13YXJuaW5nIC5hbGVydC1saW5re2NvbG9yOiM2NjUxMmN9LmFsZXJ0LWRhbmdlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMmRlZGU7Ym9yZGVyLWNvbG9yOiNlYmNjZDE7Y29sb3I6I2E5NDQ0Mn0uYWxlcnQtZGFuZ2VyIGhye2JvcmRlci10b3AtY29sb3I6I2U0YjljMH0uYWxlcnQtZGFuZ2VyIC5hbGVydC1saW5re2NvbG9yOiM4NDM1MzR9QC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVze2Zyb217YmFja2dyb3VuZC1wb3NpdGlvbjo0MHB4IDB9dG97YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9fUBrZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXN7ZnJvbXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjQwcHggMH10b3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH19LnByb2dyZXNze292ZXJmbG93OmhpZGRlbjtoZWlnaHQ6MjBweDttYXJnaW4tYm90dG9tOjIwcHg7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwuMSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwuMSl9LnByb2dyZXNzLWJhcntmbG9hdDpsZWZ0O3dpZHRoOjA7aGVpZ2h0OjEwMCU7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MjBweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IzQyOGJjYTstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMTUpO2JveC1zaGFkb3c6aW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMTUpOy13ZWJraXQtdHJhbnNpdGlvbjp3aWR0aCAuNnMgZWFzZTt0cmFuc2l0aW9uOndpZHRoIC42cyBlYXNlfS5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXJ7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtc2l6ZTo0MHB4IDQwcHh9LnByb2dyZXNzLmFjdGl2ZSAucHJvZ3Jlc3MtYmFyey13ZWJraXQtYW5pbWF0aW9uOnByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTthbmltYXRpb246cHJvZ3Jlc3MtYmFyLXN0cmlwZXMgMnMgbGluZWFyIGluZmluaXRlfS5wcm9ncmVzcy1iYXItc3VjY2Vzc3tiYWNrZ3JvdW5kLWNvbG9yOiM1Y2I4NWN9LnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhci1zdWNjZXNze2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0ucHJvZ3Jlc3MtYmFyLWluZm97YmFja2dyb3VuZC1jb2xvcjojNWJjMGRlfS5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXItaW5mb3tiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCl9LnByb2dyZXNzLWJhci13YXJuaW5ne2JhY2tncm91bmQtY29sb3I6I2YwYWQ0ZX0ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLXdhcm5pbmd7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpfS5wcm9ncmVzcy1iYXItZGFuZ2Vye2JhY2tncm91bmQtY29sb3I6I2Q5NTM0Zn0ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLWRhbmdlcntiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCl9Lm1lZGlhLC5tZWRpYS1ib2R5e292ZXJmbG93OmhpZGRlbjt6b29tOjF9Lm1lZGlhLC5tZWRpYSAubWVkaWF7bWFyZ2luLXRvcDoxNXB4fS5tZWRpYTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9Lm1lZGlhLW9iamVjdHtkaXNwbGF5OmJsb2NrfS5tZWRpYS1oZWFkaW5ne21hcmdpbjowIDAgNXB4fS5tZWRpYT4ucHVsbC1sZWZ0e21hcmdpbi1yaWdodDoxMHB4fS5tZWRpYT4ucHVsbC1yaWdodHttYXJnaW4tbGVmdDoxMHB4fS5tZWRpYS1saXN0e3BhZGRpbmctbGVmdDowO2xpc3Qtc3R5bGU6bm9uZX0ubGlzdC1ncm91cHttYXJnaW4tYm90dG9tOjIwcHg7cGFkZGluZy1sZWZ0OjB9Lmxpc3QtZ3JvdXAtaXRlbXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MTBweCAxNXB4O21hcmdpbi1ib3R0b206LTFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZGRkfS5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4fS5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NHB4fS5saXN0LWdyb3VwLWl0ZW0+LmJhZGdle2Zsb2F0OnJpZ2h0fS5saXN0LWdyb3VwLWl0ZW0+LmJhZGdlKy5iYWRnZXttYXJnaW4tcmlnaHQ6NXB4fWEubGlzdC1ncm91cC1pdGVte2NvbG9yOiM1NTV9YS5saXN0LWdyb3VwLWl0ZW0gLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5ne2NvbG9yOiMzMzN9YS5saXN0LWdyb3VwLWl0ZW06aG92ZXIsYS5saXN0LWdyb3VwLWl0ZW06Zm9jdXN7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1fWEubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSxhLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIsYS5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3Vze3otaW5kZXg6Mjtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzQyOGJjYTtib3JkZXItY29sb3I6IzQyOGJjYX1hLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLGEubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsYS5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZ3tjb2xvcjppbmhlcml0fWEubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSAubGlzdC1ncm91cC1pdGVtLXRleHQsYS5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0tdGV4dCxhLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0e2NvbG9yOiNlMWVkZjd9Lmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNze2NvbG9yOiMzYzc2M2Q7YmFja2dyb3VuZC1jb2xvcjojZGZmMGQ4fWEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3N7Y29sb3I6IzNjNzYzZH1hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZ3tjb2xvcjppbmhlcml0fWEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3M6aG92ZXIsYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzczpmb2N1c3tjb2xvcjojM2M3NjNkO2JhY2tncm91bmQtY29sb3I6I2QwZTljNn1hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZSxhLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZTpob3ZlcixhLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZTpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzNjNzYzZDtib3JkZXItY29sb3I6IzNjNzYzZH0ubGlzdC1ncm91cC1pdGVtLWluZm97Y29sb3I6IzMxNzA4ZjtiYWNrZ3JvdW5kLWNvbG9yOiNkOWVkZjd9YS5saXN0LWdyb3VwLWl0ZW0taW5mb3tjb2xvcjojMzE3MDhmfWEubGlzdC1ncm91cC1pdGVtLWluZm8gLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5ne2NvbG9yOmluaGVyaXR9YS5saXN0LWdyb3VwLWl0ZW0taW5mbzpob3ZlcixhLmxpc3QtZ3JvdXAtaXRlbS1pbmZvOmZvY3Vze2NvbG9yOiMzMTcwOGY7YmFja2dyb3VuZC1jb2xvcjojYzRlM2YzfWEubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlLGEubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmhvdmVyLGEubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmZvY3Vze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzE3MDhmO2JvcmRlci1jb2xvcjojMzE3MDhmfS5saXN0LWdyb3VwLWl0ZW0td2FybmluZ3tjb2xvcjojOGE2ZDNiO2JhY2tncm91bmQtY29sb3I6I2ZjZjhlM31hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5ne2NvbG9yOiM4YTZkM2J9YS5saXN0LWdyb3VwLWl0ZW0td2FybmluZyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmd7Y29sb3I6aW5oZXJpdH1hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nOmhvdmVyLGEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmc6Zm9jdXN7Y29sb3I6IzhhNmQzYjtiYWNrZ3JvdW5kLWNvbG9yOiNmYWYyY2N9YS5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmUsYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmU6aG92ZXIsYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmU6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM4YTZkM2I7Ym9yZGVyLWNvbG9yOiM4YTZkM2J9Lmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXJ7Y29sb3I6I2E5NDQ0MjtiYWNrZ3JvdW5kLWNvbG9yOiNmMmRlZGV9YS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2Vye2NvbG9yOiNhOTQ0NDJ9YS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZ3tjb2xvcjppbmhlcml0fWEubGlzdC1ncm91cC1pdGVtLWRhbmdlcjpob3ZlcixhLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXI6Zm9jdXN7Y29sb3I6I2E5NDQ0MjtiYWNrZ3JvdW5kLWNvbG9yOiNlYmNjY2N9YS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZSxhLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlOmhvdmVyLGEubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmU6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNhOTQ0NDI7Ym9yZGVyLWNvbG9yOiNhOTQ0NDJ9Lmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5ne21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjVweH0ubGlzdC1ncm91cC1pdGVtLXRleHR7bWFyZ2luLWJvdHRvbTowO2xpbmUtaGVpZ2h0OjEuM30ucGFuZWx7bWFyZ2luLWJvdHRvbToyMHB4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpO2JveC1zaGFkb3c6MCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KX0ucGFuZWwtYm9keXtwYWRkaW5nOjE1cHh9LnBhbmVsLWhlYWRpbmd7cGFkZGluZzoxMHB4IDE1cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6M3B4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6M3B4fS5wYW5lbC1oZWFkaW5nPi5kcm9wZG93biAuZHJvcGRvd24tdG9nZ2xle2NvbG9yOmluaGVyaXR9LnBhbmVsLXRpdGxle21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjE2cHg7Y29sb3I6aW5oZXJpdH0ucGFuZWwtdGl0bGU+YXtjb2xvcjppbmhlcml0fS5wYW5lbC1mb290ZXJ7cGFkZGluZzoxMHB4IDE1cHg7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6M3B4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6M3B4fS5wYW5lbD4ubGlzdC1ncm91cHttYXJnaW4tYm90dG9tOjB9LnBhbmVsPi5saXN0LWdyb3VwIC5saXN0LWdyb3VwLWl0ZW17Ym9yZGVyLXdpZHRoOjFweCAwO2JvcmRlci1yYWRpdXM6MH0ucGFuZWw+Lmxpc3QtZ3JvdXA6Zmlyc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6M3B4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6M3B4fS5wYW5lbD4ubGlzdC1ncm91cDpsYXN0LWNoaWxkIC5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZHtib3JkZXItYm90dG9tOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6M3B4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6M3B4fS5wYW5lbC1oZWFkaW5nKy5saXN0LWdyb3VwIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC13aWR0aDowfS5wYW5lbD4udGFibGUsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZXttYXJnaW4tYm90dG9tOjB9LnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxke2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjNweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjNweH0ucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZD50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZD50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHh9LnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZD50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZD50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxkPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZD50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9LnBhbmVsPi50YWJsZTpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjNweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjNweH0ucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRib2R5Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRib2R5Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjNweH0ucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZD50Ym9keTpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZD4udGFibGU6bGFzdC1jaGlsZD50Ym9keTpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6M3B4fS5wYW5lbD4ucGFuZWwtYm9keSsudGFibGUsLnBhbmVsPi5wYW5lbC1ib2R5Ky50YWJsZS1yZXNwb25zaXZle2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGR9LnBhbmVsPi50YWJsZT50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0aCwucGFuZWw+LnRhYmxlPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRke2JvcmRlci10b3A6MH0ucGFuZWw+LnRhYmxlLWJvcmRlcmVkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWR7Ym9yZGVyOjB9LnBhbmVsPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGQ6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6MH0ucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGQ6bGFzdC1jaGlsZHtib3JkZXItcmlnaHQ6MH0ucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyOmZpcnN0LWNoaWxkPnRkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpmaXJzdC1jaGlsZD50ZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmZpcnN0LWNoaWxkPnRkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGgsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cjpmaXJzdC1jaGlsZD50aCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmZpcnN0LWNoaWxkPnRoLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI6Zmlyc3QtY2hpbGQ+dGh7Ym9yZGVyLWJvdHRvbTowfS5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI6bGFzdC1jaGlsZD50ZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmxhc3QtY2hpbGQ+dGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cjpsYXN0LWNoaWxkPnRkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI6bGFzdC1jaGlsZD50ZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmxhc3QtY2hpbGQ+dGgsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpsYXN0LWNoaWxkPnRoLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI6bGFzdC1jaGlsZD50aCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyOmxhc3QtY2hpbGQ+dGh7Ym9yZGVyLWJvdHRvbTowfS5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZXtib3JkZXI6MDttYXJnaW4tYm90dG9tOjB9LnBhbmVsLWdyb3Vwe21hcmdpbi1ib3R0b206MjBweH0ucGFuZWwtZ3JvdXAgLnBhbmVse21hcmdpbi1ib3R0b206MDtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzpoaWRkZW59LnBhbmVsLWdyb3VwIC5wYW5lbCsucGFuZWx7bWFyZ2luLXRvcDo1cHh9LnBhbmVsLWdyb3VwIC5wYW5lbC1oZWFkaW5ne2JvcmRlci1ib3R0b206MH0ucGFuZWwtZ3JvdXAgLnBhbmVsLWhlYWRpbmcrLnBhbmVsLWNvbGxhcHNlIC5wYW5lbC1ib2R5e2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGR9LnBhbmVsLWdyb3VwIC5wYW5lbC1mb290ZXJ7Ym9yZGVyLXRvcDowfS5wYW5lbC1ncm91cCAucGFuZWwtZm9vdGVyKy5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkfS5wYW5lbC1kZWZhdWx0e2JvcmRlci1jb2xvcjojZGRkfS5wYW5lbC1kZWZhdWx0Pi5wYW5lbC1oZWFkaW5ne2NvbG9yOiMzMzM7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci1jb2xvcjojZGRkfS5wYW5lbC1kZWZhdWx0Pi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiNkZGR9LnBhbmVsLWRlZmF1bHQ+LnBhbmVsLWZvb3RlcisucGFuZWwtY29sbGFwc2UgLnBhbmVsLWJvZHl7Ym9yZGVyLWJvdHRvbS1jb2xvcjojZGRkfS5wYW5lbC1wcmltYXJ5e2JvcmRlci1jb2xvcjojNDI4YmNhfS5wYW5lbC1wcmltYXJ5Pi5wYW5lbC1oZWFkaW5ne2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNDI4YmNhO2JvcmRlci1jb2xvcjojNDI4YmNhfS5wYW5lbC1wcmltYXJ5Pi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiM0MjhiY2F9LnBhbmVsLXByaW1hcnk+LnBhbmVsLWZvb3RlcisucGFuZWwtY29sbGFwc2UgLnBhbmVsLWJvZHl7Ym9yZGVyLWJvdHRvbS1jb2xvcjojNDI4YmNhfS5wYW5lbC1zdWNjZXNze2JvcmRlci1jb2xvcjojZDZlOWM2fS5wYW5lbC1zdWNjZXNzPi5wYW5lbC1oZWFkaW5ne2NvbG9yOiMzYzc2M2Q7YmFja2dyb3VuZC1jb2xvcjojZGZmMGQ4O2JvcmRlci1jb2xvcjojZDZlOWM2fS5wYW5lbC1zdWNjZXNzPi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiNkNmU5YzZ9LnBhbmVsLXN1Y2Nlc3M+LnBhbmVsLWZvb3RlcisucGFuZWwtY29sbGFwc2UgLnBhbmVsLWJvZHl7Ym9yZGVyLWJvdHRvbS1jb2xvcjojZDZlOWM2fS5wYW5lbC1pbmZve2JvcmRlci1jb2xvcjojYmNlOGYxfS5wYW5lbC1pbmZvPi5wYW5lbC1oZWFkaW5ne2NvbG9yOiMzMTcwOGY7YmFja2dyb3VuZC1jb2xvcjojZDllZGY3O2JvcmRlci1jb2xvcjojYmNlOGYxfS5wYW5lbC1pbmZvPi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiNiY2U4ZjF9LnBhbmVsLWluZm8+LnBhbmVsLWZvb3RlcisucGFuZWwtY29sbGFwc2UgLnBhbmVsLWJvZHl7Ym9yZGVyLWJvdHRvbS1jb2xvcjojYmNlOGYxfS5wYW5lbC13YXJuaW5ne2JvcmRlci1jb2xvcjojZmFlYmNjfS5wYW5lbC13YXJuaW5nPi5wYW5lbC1oZWFkaW5ne2NvbG9yOiM4YTZkM2I7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzO2JvcmRlci1jb2xvcjojZmFlYmNjfS5wYW5lbC13YXJuaW5nPi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiNmYWViY2N9LnBhbmVsLXdhcm5pbmc+LnBhbmVsLWZvb3RlcisucGFuZWwtY29sbGFwc2UgLnBhbmVsLWJvZHl7Ym9yZGVyLWJvdHRvbS1jb2xvcjojZmFlYmNjfS5wYW5lbC1kYW5nZXJ7Ym9yZGVyLWNvbG9yOiNlYmNjZDF9LnBhbmVsLWRhbmdlcj4ucGFuZWwtaGVhZGluZ3tjb2xvcjojYTk0NDQyO2JhY2tncm91bmQtY29sb3I6I2YyZGVkZTtib3JkZXItY29sb3I6I2ViY2NkMX0ucGFuZWwtZGFuZ2VyPi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiNlYmNjZDF9LnBhbmVsLWRhbmdlcj4ucGFuZWwtZm9vdGVyKy5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keXtib3JkZXItYm90dG9tLWNvbG9yOiNlYmNjZDF9LndlbGx7bWluLWhlaWdodDoyMHB4O3BhZGRpbmc6MTlweDttYXJnaW4tYm90dG9tOjIwcHg7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlcjoxcHggc29saWQgI2UzZTNlMztib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSl9LndlbGwgYmxvY2txdW90ZXtib3JkZXItY29sb3I6I2RkZDtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTUpfS53ZWxsLWxne3BhZGRpbmc6MjRweDtib3JkZXItcmFkaXVzOjZweH0ud2VsbC1zbXtwYWRkaW5nOjlweDtib3JkZXItcmFkaXVzOjNweH0uY2xvc2V7ZmxvYXQ6cmlnaHQ7Zm9udC1zaXplOjIxcHg7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7Y29sb3I6IzAwMDt0ZXh0LXNoYWRvdzowIDFweCAwICNmZmY7b3BhY2l0eTouMjtmaWx0ZXI6YWxwaGEob3BhY2l0eT0yMCl9LmNsb3NlOmhvdmVyLC5jbG9zZTpmb2N1c3tjb2xvcjojMDAwO3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjpwb2ludGVyO29wYWNpdHk6LjU7ZmlsdGVyOmFscGhhKG9wYWNpdHk9NTApfWJ1dHRvbi5jbG9zZXtwYWRkaW5nOjA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDowIDA7Ym9yZGVyOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Lm1vZGFsLW9wZW57b3ZlcmZsb3c6aGlkZGVufS5tb2RhbHtkaXNwbGF5Om5vbmU7b3ZlcmZsb3c6YXV0bztvdmVyZmxvdy15OnNjcm9sbDtwb3NpdGlvbjpmaXhlZDt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDt6LWluZGV4OjEwNTA7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7b3V0bGluZTowfS5tb2RhbC5mYWRlIC5tb2RhbC1kaWFsb2d7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDAsLTI1JSk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGUoMCwtMjUlKTt0cmFuc2Zvcm06dHJhbnNsYXRlKDAsLTI1JSk7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDstbW96LXRyYW5zaXRpb246LW1vei10cmFuc2Zvcm0gLjNzIGVhc2Utb3V0Oy1vLXRyYW5zaXRpb246LW8tdHJhbnNmb3JtIC4zcyBlYXNlLW91dDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuM3MgZWFzZS1vdXR9Lm1vZGFsLmluIC5tb2RhbC1kaWFsb2d7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDAsMCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGUoMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlKDAsMCl9Lm1vZGFsLWRpYWxvZ3twb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDphdXRvO21hcmdpbjoxMHB4fS5tb2RhbC1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICM5OTk7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTtib3JkZXItcmFkaXVzOjZweDstd2Via2l0LWJveC1zaGFkb3c6MCAzcHggOXB4IHJnYmEoMCwwLDAsLjUpO2JveC1zaGFkb3c6MCAzcHggOXB4IHJnYmEoMCwwLDAsLjUpO2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtvdXRsaW5lOjB9Lm1vZGFsLWJhY2tkcm9we3Bvc2l0aW9uOmZpeGVkO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3otaW5kZXg6MTA0MDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1vZGFsLWJhY2tkcm9wLmZhZGV7b3BhY2l0eTowO2ZpbHRlcjphbHBoYShvcGFjaXR5PTApfS5tb2RhbC1iYWNrZHJvcC5pbntvcGFjaXR5Oi41O2ZpbHRlcjphbHBoYShvcGFjaXR5PTUwKX0ubW9kYWwtaGVhZGVye3BhZGRpbmc6MTVweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTVlNWU1O21pbi1oZWlnaHQ6MTYuNDI4NTcxNDNweH0ubW9kYWwtaGVhZGVyIC5jbG9zZXttYXJnaW4tdG9wOi0ycHh9Lm1vZGFsLXRpdGxle21hcmdpbjowO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDN9Lm1vZGFsLWJvZHl7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzoyMHB4fS5tb2RhbC1mb290ZXJ7bWFyZ2luLXRvcDoxNXB4O3BhZGRpbmc6MTlweCAyMHB4IDIwcHg7dGV4dC1hbGlnbjpyaWdodDtib3JkZXItdG9wOjFweCBzb2xpZCAjZTVlNWU1fS5tb2RhbC1mb290ZXIgLmJ0bisuYnRue21hcmdpbi1sZWZ0OjVweDttYXJnaW4tYm90dG9tOjB9Lm1vZGFsLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0bnttYXJnaW4tbGVmdDotMXB4fS5tb2RhbC1mb290ZXIgLmJ0bi1ibG9jaysuYnRuLWJsb2Nre21hcmdpbi1sZWZ0OjB9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5tb2RhbC1kaWFsb2d7d2lkdGg6NjAwcHg7bWFyZ2luOjMwcHggYXV0b30ubW9kYWwtY29udGVudHstd2Via2l0LWJveC1zaGFkb3c6MCA1cHggMTVweCByZ2JhKDAsMCwwLC41KTtib3gtc2hhZG93OjAgNXB4IDE1cHggcmdiYSgwLDAsMCwuNSl9Lm1vZGFsLXNte3dpZHRoOjMwMHB4fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7Lm1vZGFsLWxne3dpZHRoOjkwMHB4fX0udG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMzA7ZGlzcGxheTpibG9jazt2aXNpYmlsaXR5OnZpc2libGU7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MS40O29wYWNpdHk6MDtmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKX0udG9vbHRpcC5pbntvcGFjaXR5Oi45O2ZpbHRlcjphbHBoYShvcGFjaXR5PTkwKX0udG9vbHRpcC50b3B7bWFyZ2luLXRvcDotM3B4O3BhZGRpbmc6NXB4IDB9LnRvb2x0aXAucmlnaHR7bWFyZ2luLWxlZnQ6M3B4O3BhZGRpbmc6MCA1cHh9LnRvb2x0aXAuYm90dG9te21hcmdpbi10b3A6M3B4O3BhZGRpbmc6NXB4IDB9LnRvb2x0aXAubGVmdHttYXJnaW4tbGVmdDotM3B4O3BhZGRpbmc6MCA1cHh9LnRvb2x0aXAtaW5uZXJ7bWF4LXdpZHRoOjIwMHB4O3BhZGRpbmc6M3B4IDhweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6IzAwMDtib3JkZXItcmFkaXVzOjRweH0udG9vbHRpcC1hcnJvd3twb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDowO2hlaWdodDowO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWR9LnRvb2x0aXAudG9wIC50b29sdGlwLWFycm93e2JvdHRvbTowO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi01cHg7Ym9yZGVyLXdpZHRoOjVweCA1cHggMDtib3JkZXItdG9wLWNvbG9yOiMwMDB9LnRvb2x0aXAudG9wLWxlZnQgLnRvb2x0aXAtYXJyb3d7Ym90dG9tOjA7bGVmdDo1cHg7Ym9yZGVyLXdpZHRoOjVweCA1cHggMDtib3JkZXItdG9wLWNvbG9yOiMwMDB9LnRvb2x0aXAudG9wLXJpZ2h0IC50b29sdGlwLWFycm93e2JvdHRvbTowO3JpZ2h0OjVweDtib3JkZXItd2lkdGg6NXB4IDVweCAwO2JvcmRlci10b3AtY29sb3I6IzAwMH0udG9vbHRpcC5yaWdodCAudG9vbHRpcC1hcnJvd3t0b3A6NTAlO2xlZnQ6MDttYXJnaW4tdG9wOi01cHg7Ym9yZGVyLXdpZHRoOjVweCA1cHggNXB4IDA7Ym9yZGVyLXJpZ2h0LWNvbG9yOiMwMDB9LnRvb2x0aXAubGVmdCAudG9vbHRpcC1hcnJvd3t0b3A6NTAlO3JpZ2h0OjA7bWFyZ2luLXRvcDotNXB4O2JvcmRlci13aWR0aDo1cHggMCA1cHggNXB4O2JvcmRlci1sZWZ0LWNvbG9yOiMwMDB9LnRvb2x0aXAuYm90dG9tIC50b29sdGlwLWFycm93e3RvcDowO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi01cHg7Ym9yZGVyLXdpZHRoOjAgNXB4IDVweDtib3JkZXItYm90dG9tLWNvbG9yOiMwMDB9LnRvb2x0aXAuYm90dG9tLWxlZnQgLnRvb2x0aXAtYXJyb3d7dG9wOjA7bGVmdDo1cHg7Ym9yZGVyLXdpZHRoOjAgNXB4IDVweDtib3JkZXItYm90dG9tLWNvbG9yOiMwMDB9LnRvb2x0aXAuYm90dG9tLXJpZ2h0IC50b29sdGlwLWFycm93e3RvcDowO3JpZ2h0OjVweDtib3JkZXItd2lkdGg6MCA1cHggNXB4O2JvcmRlci1ib3R0b20tY29sb3I6IzAwMH0ucG9wb3Zlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7ei1pbmRleDoxMDEwO2Rpc3BsYXk6bm9uZTttYXgtd2lkdGg6Mjc2cHg7cGFkZGluZzoxcHg7dGV4dC1hbGlnbjpsZWZ0O2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMik7Ym9yZGVyLXJhZGl1czo2cHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMik7Ym94LXNoYWRvdzowIDVweCAxMHB4IHJnYmEoMCwwLDAsLjIpO3doaXRlLXNwYWNlOm5vcm1hbH0ucG9wb3Zlci50b3B7bWFyZ2luLXRvcDotMTBweH0ucG9wb3Zlci5yaWdodHttYXJnaW4tbGVmdDoxMHB4fS5wb3BvdmVyLmJvdHRvbXttYXJnaW4tdG9wOjEwcHh9LnBvcG92ZXIubGVmdHttYXJnaW4tbGVmdDotMTBweH0ucG9wb3Zlci10aXRsZXttYXJnaW46MDtwYWRkaW5nOjhweCAxNHB4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxOHB4O2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmNztib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2JvcmRlci1yYWRpdXM6NXB4IDVweCAwIDB9LnBvcG92ZXItY29udGVudHtwYWRkaW5nOjlweCAxNHB4fS5wb3BvdmVyPi5hcnJvdywucG9wb3Zlcj4uYXJyb3c6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWR9LnBvcG92ZXI+LmFycm93e2JvcmRlci13aWR0aDoxMXB4fS5wb3BvdmVyPi5hcnJvdzphZnRlcntib3JkZXItd2lkdGg6MTBweDtjb250ZW50OiIifS5wb3BvdmVyLnRvcD4uYXJyb3d7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTExcHg7Ym9yZGVyLWJvdHRvbS13aWR0aDowO2JvcmRlci10b3AtY29sb3I6Izk5OTtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjI1KTtib3R0b206LTExcHh9LnBvcG92ZXIudG9wPi5hcnJvdzphZnRlcntjb250ZW50OiIgIjtib3R0b206MXB4O21hcmdpbi1sZWZ0Oi0xMHB4O2JvcmRlci1ib3R0b20td2lkdGg6MDtib3JkZXItdG9wLWNvbG9yOiNmZmZ9LnBvcG92ZXIucmlnaHQ+LmFycm93e3RvcDo1MCU7bGVmdDotMTFweDttYXJnaW4tdG9wOi0xMXB4O2JvcmRlci1sZWZ0LXdpZHRoOjA7Ym9yZGVyLXJpZ2h0LWNvbG9yOiM5OTk7Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjI1KX0ucG9wb3Zlci5yaWdodD4uYXJyb3c6YWZ0ZXJ7Y29udGVudDoiICI7bGVmdDoxcHg7Ym90dG9tOi0xMHB4O2JvcmRlci1sZWZ0LXdpZHRoOjA7Ym9yZGVyLXJpZ2h0LWNvbG9yOiNmZmZ9LnBvcG92ZXIuYm90dG9tPi5hcnJvd3tsZWZ0OjUwJTttYXJnaW4tbGVmdDotMTFweDtib3JkZXItdG9wLXdpZHRoOjA7Ym9yZGVyLWJvdHRvbS1jb2xvcjojOTk5O2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMjUpO3RvcDotMTFweH0ucG9wb3Zlci5ib3R0b20+LmFycm93OmFmdGVye2NvbnRlbnQ6IiAiO3RvcDoxcHg7bWFyZ2luLWxlZnQ6LTEwcHg7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20tY29sb3I6I2ZmZn0ucG9wb3Zlci5sZWZ0Pi5hcnJvd3t0b3A6NTAlO3JpZ2h0Oi0xMXB4O21hcmdpbi10b3A6LTExcHg7Ym9yZGVyLXJpZ2h0LXdpZHRoOjA7Ym9yZGVyLWxlZnQtY29sb3I6Izk5OTtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9LnBvcG92ZXIubGVmdD4uYXJyb3c6YWZ0ZXJ7Y29udGVudDoiICI7cmlnaHQ6MXB4O2JvcmRlci1yaWdodC13aWR0aDowO2JvcmRlci1sZWZ0LWNvbG9yOiNmZmY7Ym90dG9tOi0xMHB4fS5jYXJvdXNlbHtwb3NpdGlvbjpyZWxhdGl2ZX0uY2Fyb3VzZWwtaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCV9LmNhcm91c2VsLWlubmVyPi5pdGVte2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXRyYW5zaXRpb246LjZzIGVhc2UtaW4tb3V0IGxlZnQ7dHJhbnNpdGlvbjouNnMgZWFzZS1pbi1vdXQgbGVmdH0uY2Fyb3VzZWwtaW5uZXI+Lml0ZW0+aW1nLC5jYXJvdXNlbC1pbm5lcj4uaXRlbT5hPmltZ3tsaW5lLWhlaWdodDoxfS5jYXJvdXNlbC1pbm5lcj4uYWN0aXZlLC5jYXJvdXNlbC1pbm5lcj4ubmV4dCwuY2Fyb3VzZWwtaW5uZXI+LnByZXZ7ZGlzcGxheTpibG9ja30uY2Fyb3VzZWwtaW5uZXI+LmFjdGl2ZXtsZWZ0OjB9LmNhcm91c2VsLWlubmVyPi5uZXh0LC5jYXJvdXNlbC1pbm5lcj4ucHJldntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt3aWR0aDoxMDAlfS5jYXJvdXNlbC1pbm5lcj4ubmV4dHtsZWZ0OjEwMCV9LmNhcm91c2VsLWlubmVyPi5wcmV2e2xlZnQ6LTEwMCV9LmNhcm91c2VsLWlubmVyPi5uZXh0LmxlZnQsLmNhcm91c2VsLWlubmVyPi5wcmV2LnJpZ2h0e2xlZnQ6MH0uY2Fyb3VzZWwtaW5uZXI+LmFjdGl2ZS5sZWZ0e2xlZnQ6LTEwMCV9LmNhcm91c2VsLWlubmVyPi5hY3RpdmUucmlnaHR7bGVmdDoxMDAlfS5jYXJvdXNlbC1jb250cm9se3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtib3R0b206MDt3aWR0aDoxNSU7b3BhY2l0eTouNTtmaWx0ZXI6YWxwaGEob3BhY2l0eT01MCk7Zm9udC1zaXplOjIwcHg7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXNoYWRvdzowIDFweCAycHggcmdiYSgwLDAsMCwuNil9LmNhcm91c2VsLWNvbnRyb2wubGVmdHtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsY29sb3Itc3RvcChyZ2JhKDAsMCwwLC41KSAwKSxjb2xvci1zdG9wKHJnYmEoMCwwLDAsLjAwMDEpIDEwMCUpKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC41KSAwLHJnYmEoMCwwLDAsLjAwMDEpIDEwMCUpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14O2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nIzgwMDAwMDAwJywgZW5kQ29sb3JzdHI9JyMwMDAwMDAwMCcsIEdyYWRpZW50VHlwZT0xKX0uY2Fyb3VzZWwtY29udHJvbC5yaWdodHtsZWZ0OmF1dG87cmlnaHQ6MDtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsY29sb3Itc3RvcChyZ2JhKDAsMCwwLC4wMDAxKSAwKSxjb2xvci1zdG9wKHJnYmEoMCwwLDAsLjUpIDEwMCUpKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC4wMDAxKSAwLHJnYmEoMCwwLDAsLjUpIDEwMCUpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14O2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nIzAwMDAwMDAwJywgZW5kQ29sb3JzdHI9JyM4MDAwMDAwMCcsIEdyYWRpZW50VHlwZT0xKX0uY2Fyb3VzZWwtY29udHJvbDpob3ZlciwuY2Fyb3VzZWwtY29udHJvbDpmb2N1c3tvdXRsaW5lOjA7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtvcGFjaXR5Oi45O2ZpbHRlcjphbHBoYShvcGFjaXR5PTkwKX0uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQsLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7ei1pbmRleDo1O2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXYsLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnR7bGVmdDo1MCV9LmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dCwuY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHR7cmlnaHQ6NTAlfS5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXYsLmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dHt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O21hcmdpbi10b3A6LTEwcHg7bWFyZ2luLWxlZnQ6LTEwcHg7Zm9udC1mYW1pbHk6c2VyaWZ9LmNhcm91c2VsLWNvbnRyb2wgLmljb24tcHJldjpiZWZvcmV7Y29udGVudDonXDIwMzknfS5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQ6YmVmb3Jle2NvbnRlbnQ6J1wyMDNhJ30uY2Fyb3VzZWwtaW5kaWNhdG9yc3twb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MTBweDtsZWZ0OjUwJTt6LWluZGV4OjE1O3dpZHRoOjYwJTttYXJnaW4tbGVmdDotMzAlO3BhZGRpbmctbGVmdDowO2xpc3Qtc3R5bGU6bm9uZTt0ZXh0LWFsaWduOmNlbnRlcn0uY2Fyb3VzZWwtaW5kaWNhdG9ycyBsaXtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21hcmdpbjoxcHg7dGV4dC1pbmRlbnQ6LTk5OXB4O2JvcmRlcjoxcHggc29saWQgI2ZmZjtib3JkZXItcmFkaXVzOjEwcHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojMDAwIFw5O2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKX0uY2Fyb3VzZWwtaW5kaWNhdG9ycyAuYWN0aXZle21hcmdpbjowO3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5jYXJvdXNlbC1jYXB0aW9ue3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MTUlO3JpZ2h0OjE1JTtib3R0b206MjBweDt6LWluZGV4OjEwO3BhZGRpbmctdG9wOjIwcHg7cGFkZGluZy1ib3R0b206MjBweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3RleHQtc2hhZG93OjAgMXB4IDJweCByZ2JhKDAsMCwwLC42KX0uY2Fyb3VzZWwtY2FwdGlvbiAuYnRue3RleHQtc2hhZG93Om5vbmV9QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXYsLmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dHt3aWR0aDozMHB4O2hlaWdodDozMHB4O21hcmdpbi10b3A6LTE1cHg7bWFyZ2luLWxlZnQ6LTE1cHg7Zm9udC1zaXplOjMwcHh9LmNhcm91c2VsLWNhcHRpb257bGVmdDoyMCU7cmlnaHQ6MjAlO3BhZGRpbmctYm90dG9tOjMwcHh9LmNhcm91c2VsLWluZGljYXRvcnN7Ym90dG9tOjIwcHh9fS5jbGVhcmZpeDpiZWZvcmUsLmNsZWFyZml4OmFmdGVyLC5jb250YWluZXI6YmVmb3JlLC5jb250YWluZXI6YWZ0ZXIsLmNvbnRhaW5lci1mbHVpZDpiZWZvcmUsLmNvbnRhaW5lci1mbHVpZDphZnRlciwucm93OmJlZm9yZSwucm93OmFmdGVyLC5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXA6YmVmb3JlLC5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXA6YWZ0ZXIsLmJ0bi10b29sYmFyOmJlZm9yZSwuYnRuLXRvb2xiYXI6YWZ0ZXIsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWdyb3VwOmJlZm9yZSwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6YWZ0ZXIsLm5hdjpiZWZvcmUsLm5hdjphZnRlciwubmF2YmFyOmJlZm9yZSwubmF2YmFyOmFmdGVyLC5uYXZiYXItaGVhZGVyOmJlZm9yZSwubmF2YmFyLWhlYWRlcjphZnRlciwubmF2YmFyLWNvbGxhcHNlOmJlZm9yZSwubmF2YmFyLWNvbGxhcHNlOmFmdGVyLC5wYWdlcjpiZWZvcmUsLnBhZ2VyOmFmdGVyLC5wYW5lbC1ib2R5OmJlZm9yZSwucGFuZWwtYm9keTphZnRlciwubW9kYWwtZm9vdGVyOmJlZm9yZSwubW9kYWwtZm9vdGVyOmFmdGVye2NvbnRlbnQ6IiAiO2Rpc3BsYXk6dGFibGV9LmNsZWFyZml4OmFmdGVyLC5jb250YWluZXI6YWZ0ZXIsLmNvbnRhaW5lci1mbHVpZDphZnRlciwucm93OmFmdGVyLC5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXA6YWZ0ZXIsLmJ0bi10b29sYmFyOmFmdGVyLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDphZnRlciwubmF2OmFmdGVyLC5uYXZiYXI6YWZ0ZXIsLm5hdmJhci1oZWFkZXI6YWZ0ZXIsLm5hdmJhci1jb2xsYXBzZTphZnRlciwucGFnZXI6YWZ0ZXIsLnBhbmVsLWJvZHk6YWZ0ZXIsLm1vZGFsLWZvb3RlcjphZnRlcntjbGVhcjpib3RofS5jZW50ZXItYmxvY2t7ZGlzcGxheTpibG9jazttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0IWltcG9ydGFudH0ucHVsbC1sZWZ0e2Zsb2F0OmxlZnQhaW1wb3J0YW50fS5oaWRle2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnNob3d7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0udGV4dC1oaWRle2ZvbnQ6MC8wIGE7Y29sb3I6dHJhbnNwYXJlbnQ7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowfS5oaWRkZW57ZGlzcGxheTpub25lIWltcG9ydGFudDt2aXNpYmlsaXR5OmhpZGRlbiFpbXBvcnRhbnR9LmFmZml4e3Bvc2l0aW9uOmZpeGVkfUAtbXMtdmlld3BvcnR7d2lkdGg6ZGV2aWNlLXdpZHRofS52aXNpYmxlLXhzLC52aXNpYmxlLXNtLC52aXNpYmxlLW1kLC52aXNpYmxlLWxne2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpey52aXNpYmxlLXhze2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fXRhYmxlLnZpc2libGUteHN7ZGlzcGxheTp0YWJsZX10ci52aXNpYmxlLXhze2Rpc3BsYXk6dGFibGUtcm93IWltcG9ydGFudH10aC52aXNpYmxlLXhzLHRkLnZpc2libGUteHN7ZGlzcGxheTp0YWJsZS1jZWxsIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudmlzaWJsZS1zbXtkaXNwbGF5OmJsb2NrIWltcG9ydGFudH10YWJsZS52aXNpYmxlLXNte2Rpc3BsYXk6dGFibGV9dHIudmlzaWJsZS1zbXtkaXNwbGF5OnRhYmxlLXJvdyFpbXBvcnRhbnR9dGgudmlzaWJsZS1zbSx0ZC52aXNpYmxlLXNte2Rpc3BsYXk6dGFibGUtY2VsbCFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjk5MnB4KSBhbmQgKG1heC13aWR0aDoxMTk5cHgpey52aXNpYmxlLW1ke2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fXRhYmxlLnZpc2libGUtbWR7ZGlzcGxheTp0YWJsZX10ci52aXNpYmxlLW1ke2Rpc3BsYXk6dGFibGUtcm93IWltcG9ydGFudH10aC52aXNpYmxlLW1kLHRkLnZpc2libGUtbWR7ZGlzcGxheTp0YWJsZS1jZWxsIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXsudmlzaWJsZS1sZ3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH10YWJsZS52aXNpYmxlLWxne2Rpc3BsYXk6dGFibGV9dHIudmlzaWJsZS1sZ3tkaXNwbGF5OnRhYmxlLXJvdyFpbXBvcnRhbnR9dGgudmlzaWJsZS1sZyx0ZC52aXNpYmxlLWxne2Rpc3BsYXk6dGFibGUtY2VsbCFpbXBvcnRhbnR9fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsuaGlkZGVuLXhze2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KSBhbmQgKG1heC13aWR0aDo5OTFweCl7LmhpZGRlbi1zbXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCkgYW5kIChtYXgtd2lkdGg6MTE5OXB4KXsuaGlkZGVuLW1ke2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LmhpZGRlbi1sZ3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX0udmlzaWJsZS1wcmludHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fUBtZWRpYSBwcmludHsudmlzaWJsZS1wcmludHtkaXNwbGF5OmJsb2NrIWltcG9ydGFudH10YWJsZS52aXNpYmxlLXByaW50e2Rpc3BsYXk6dGFibGV9dHIudmlzaWJsZS1wcmludHtkaXNwbGF5OnRhYmxlLXJvdyFpbXBvcnRhbnR9dGgudmlzaWJsZS1wcmludCx0ZC52aXNpYmxlLXByaW50e2Rpc3BsYXk6dGFibGUtY2VsbCFpbXBvcnRhbnR9fUBtZWRpYSBwcmludHsuaGlkZGVuLXByaW50e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fQ==')
},
{
'name': '/app/lib/cosmos/css/app.css', 'data': base64.b64decode(b'LyogYXBwIGNzcyBzdHlsZXNoZWV0ICovCgoubWVudSB7CiAgbGlzdC1zdHlsZTogbm9uZTsKICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCBibGFjazsKICBtYXJnaW4tYm90dG9tOiAyZW07CiAgcGFkZGluZzogMCAwIDAuNWVtOwp9CgoubWVudTpiZWZvcmUgewogIGNvbnRlbnQ6ICJbIjsKfQoKLm1lbnU6YWZ0ZXIgewogIGNvbnRlbnQ6ICJdIjsKfQoKLm1lbnUgPiBsaSB7CiAgZGlzcGxheTogaW5saW5lOwp9CgoubWVudSA+IGxpOmJlZm9yZSB7CiAgY29udGVudDogInwiOwogIHBhZGRpbmctcmlnaHQ6IDAuM2VtOwp9CgoubWVudSA+IGxpOm50aC1jaGlsZCgxKTpiZWZvcmUgewogIGNvbnRlbnQ6ICIiOwogIHBhZGRpbmc6IDA7Cn0KCi5lZGl0b3J7CiAgICBtaW4td2lkdGg6IDQwMHB4Owp9CgouYWNlX2VkaXRvciB7CiAgICBtaW4taGVpZ2h0OiAyMDBweDsKfQoKLnRhYmxlLWhvdmVyIHRib2R5IHRyOmhvdmVyID4gdGQgewogICAgY3Vyc29yOiBwb2ludGVyOwogICAgY3Vyc29yOiBoYW5kOwp9')
},
{
'name': '/app/lib/cosmos/css/charts.css', 'data': base64.b64decode(b'LyogQmFyIGNoYXJ0IHN0eWxlICovCgouYmFyIHsKICBmaWxsOiBzdGVlbGJsdWU7Cn0KCi5iYXI6aG92ZXIgewogIGZpbGw6IGJyb3duOwp9CgouYXhpcyB7CiAgZm9udDogMTBweCBzYW5zLXNlcmlmOwp9CgouYXhpcyBwYXRoLAouYXhpcyBsaW5lIHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogIzAwMDsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7Cn0KCi54LmF4aXMgcGF0aCB7CiAgZGlzcGxheTogbm9uZTsKfQoKLyogRU5EIEJhciBjaGFydCBzdHlsZSAqLwoKLyogTGluZSBDaGFydCBTdHlsZXMqLwoKLmF4aXMgcGF0aCwKLmF4aXMgbGluZSB7CiAgZmlsbDogbm9uZTsKICBzdHJva2U6ICMwMDA7CiAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzOwp9CgoueC5heGlzIHBhdGggewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5saW5lIHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogc3RlZWxibHVlOwogIHN0cm9rZS13aWR0aDogMS41cHg7Cn0KCi8qIEVORCBMaW5lIENoYXJ0IFN0eWxlcyovCgovKiBQaWUgY2hhcnQgc3R5bGUgKi8KLmFyYyBwYXRoIHsKICBzdHJva2U6ICNmZmY7Cn0KCi8qIEVuZCBQaWUgQ2hhcnQgU3R5bGUgKi8KCi5jaGFydEhvbGRlcgp7CiAgICB3aWR0aDo5ODBweDsKICAgIGhlaWdodDo1MjBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgb3ZlcmZsb3c6IGF1dG87Cn0KLmNoYXJ0ewogICAgd2lkdGg6OTcwcHg7CiAgICBoZWlnaHQ6NTEwcHg7Cn0KCg==')
},
{
'name': '/app/lib/cosmos/partials/show_json.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgIDxoMyBjbGFzcz0ibW9kYWwtdGl0bGUiPkRldGFpbHM8L2gzPgo8L2Rpdj4KPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICA8ZGl2IGpzb24taHVtYW49Im1vZGVsIj48L2Rpdj4KPC9kaXY+CjxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MiIG5nLWNsaWNrPSJjYW5jZWwoKSI+Q2xvc2U8L2J1dHRvbj4KPC9kaXY+')
},
{
'name': '/app/lib/cosmos/partials/login.html', 'data': base64.b64decode(b'ICAgIDxkaXYgY2xhc3M9Im5hdmJhciBuYXZiYXItaW52ZXJzZSBuYXZiYXItZml4ZWQtdG9wIiByb2xlPSJuYXZpZ2F0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPkxvZ2luPC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1jb2xsYXBzZSBjb2xsYXBzZSI+CiAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItbmF2Ij4KICAgICAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPjxhIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+PCEtLS8ubmF2LWNvbGxhcHNlIC0tPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciB0aGVtZS1zaG93Y2FzZSIgcm9sZT0ibWFpbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJqdW1ib3Ryb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgPGgzICBuZy1zaG93PSIhbG9nZ2VkSW4oKSI+PHNwYW4gbmctc2hvdz0iaGF2ZUFjY291bnQiPkxvZ2luPC9zcGFuPjxzcGFuIG5nLXNob3c9IiFoYXZlQWNjb3VudCI+Q3JlYXRlIGFjY291bnQ8L3NwYW4+IDwvaDM+CiAgICAgICAgICAgICAgICA8ZGl2IG5nLWJpbmQ9ImVycm9yIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgbmctc2hvdz0iIWxvZ2dlZEluKCkiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC14cy00Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+VXNlciBuYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0idXNlcm5hbWUiIHR5cGU9InRleHQiIG5hbWU9InVzZXJuYW1lIiBuZy1tb2RlbD0idXNlcm5hbWUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlBhc3N3b3JkPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiB0eXBlPSJwYXNzd29yZCIgaWQ9InBhc3N3b3JkIiBuYW1lPSJwYXNzd29yZCIgbmctbW9kZWw9InBhc3N3b3JkIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCIgbmctc2hvdz0iIWhhdmVBY2NvdW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5QYXNzd29yZCBhZ2FpbjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIgdHlwZT0icGFzc3dvcmQiIGlkPSJwYXNzd29yZF9yZSIgbmFtZT0icGFzc3dvcmRfcmUiIG5nLW1vZGVsPSJwYXNzd29yZF9yZSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiIG5nLXNob3c9ImhhdmVBY2NvdW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImxvZ2luYnRuIiB2YWx1ZT0iTG9naW4iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG5nLWNsaWNrPSJsb2dpbigpIj5Mb2dpbjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiIG5nLXNob3c9IiFoYXZlQWNjb3VudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJzaWdudXBidG4iIHZhbHVlPSJMb2dpbiIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgbmctY2xpY2s9InNpZ251cCgpIj5DcmVhdGUgYWNjb3VudDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGhyIGNvbG9yPSJncmVlbiIvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1zaG93PSJoYXZlQWNjb3VudCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBidG4teHMiICBuZy1jbGljaz0iaGF2ZUFjY291bnQ9ZmFsc2U7Ij5TaWduIHVwIGZvciBhIG5ldyBhY2NvdW50PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLXNob3c9IiFoYXZlQWNjb3VudCIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyBidG4teHMiICBuZy1jbGljaz0iaGF2ZUFjY291bnQ9dHJ1ZTsiPkkgYWxyZWFkeSBoYXZlIGFuIGFjY291bnQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICA8ZGl2IG5nLXNob3c9ImxvZ2dlZEluKCkiPldlbGNvbWU8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9InN0YXR1cyI+PC9kaXY+CiAgICA8L2Rpdj4=')
},
{
'name': '/app/lib/cosmos/partials/terminal.html', 'data': base64.b64decode(b'ICAgIDxkaXYgY2xhc3M9Im5hdmJhciBuYXZiYXItaW52ZXJzZSBuYXZiYXItZml4ZWQtdG9wIiByb2xlPSJuYXZpZ2F0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8jL3Rlcm1pbmFsLyI+VGVybWluYWw8L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItY29sbGFwc2UgY29sbGFwc2UiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXYgbmF2YmFyLW5hdiI+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii8jL2ZpbGVtYW5hZ2VyLyI+RmlsZSBNYW5hZ2VyPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii8jL2FwcHN0dWRpby8iPkFwcCBTdHVkaW88L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iIy91c2VycyI+VXNlcnM8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iIy9yb2xlcyI+Um9sZXM8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+IDxhIGhyZWY9Ii9sb2dvdXQvIj5Mb2dvdXQgW3t7dXNlck5hbWV9fV08L2E+IDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpIG5nLXNob3c9IiFsb2dnZWRJbigpIj48YSBocmVmPSIvIy9sb2dpbi8/cmVkaXJlY3Q9L3Rlcm1pbmFsLyI+TG9naW48L2E+PC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgdGhlbWUtc2hvd2Nhc2UiIHJvbGU9Im1haW4iPgogICAgICAgIDxlcnJvci1iYW5uZXI+PC9lcnJvci1iYW5uZXI+CgogICAgICAgIDxoMz5PcGVyYXRpb25zPC9oMz4KICAgICAgICA8Zm9ybSBjbGFzcz0iYmFzaWMtb3BlcmF0aW9ucyIgcm9sZT0iZm9ybSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgPGxhYmVsPlNlcnZpY2UgVVJMIChyZWxhdGl2ZSkgKjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9Im5hbWUiIHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIG5nLW1vZGVsPSJzZXJ2aWNlIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICA8bGFiZWw+Q29sdW1ucyBbR0VUXTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImNvbHVtbnMiIHR5cGU9InRleHQiIG5hbWU9ImNvbHVtbnMiIG5nLW1vZGVsPSJjb2x1bW5zIiBwbGFjZWhvbGRlcj0ibmFtZSxhZGRyZXNzIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICA8bGFiZWw+RmlsdGVyIFtHRVRdPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0iZmlsdGVyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJmaWx0ZXIiIG5nLW1vZGVsPSJmaWx0ZXIiIHBsYWNlaG9sZGVyPSd7Im5hbWUiOiJBYnJhaGFtIn0nLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgPGxhYmVsPkRhdGEgWyogUE9TVHxQVVRdPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgdWktYWNlPSJ7J21vZGUnOidqc29uJ30iIG5nLW1vZGVsPSJkYXRhIj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxsYWJlbD5SZXN1bHQ8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiB1aS1hY2U9InsnbW9kZSc6J2pzb24nfSIgbmctbW9kZWw9InJlc3VsdCI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgbmctY2xpY2s9ImdldCgpIj4gIEdFVCA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgbmctY2xpY2s9InBvc3QoKSI+IFBPU1QgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWluZm8iIG5nLWNsaWNrPSJwdXQoKSI+ICBQVVQgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWRhbmdlciIgbmctY2xpY2s9ImRlbGV0ZSgpIj5ERUxFVEU8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2Pg==')
},
{
'name': '/app/lib/cosmos/partials/page.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0iY29udGFpbmVyIHRoZW1lLXNob3djYXNlIiByb2xlPSJtYWluIj4KICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iZmllbGQgaW4gcGFnZS5maWVsZHMiPgogICAgICAgICAgICA8ZmllbGQgaXRlbT0iZmllbGQiPjwvZmllbGQ+CiAgICAgICAgPC9kaXY+CjwvZGl2Pg==')
},
{
'name': '/app/lib/cosmos/partials/list.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0iY29udGFpbmVyIHRoZW1lLXNob3djYXNlIiByb2xlPSJtYWluIj4KICAgIDxkaXYgbmctc2hvdz0iaGFzRXJyb3IiIGNsYXNzPSJiZy13YXJuaW5nIj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1kYW5nZXIgZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUgcHVsbC1yaWdodCIgbmctY2xpY2s9ImNsZWFyRXJyb3IoKTsiPjwvYnV0dG9uPgogICAgICAgIDxkaXY+PGxhYmVsPkVycm9yIGNvZGU6PC9sYWJlbD48c3BhbiBuZy1iaW5kPSJzdGF0dXMiIC8+PC9kaXY+CiAgICAgICAgPGRpdiBuZy1iaW5kPSJzdGF0dXNfZGF0YSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8aDM+e3t0aXRsZX19PC9oMz4KICAgIDx0YWJsZSBjbGFzcz0idGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0aD5JZDwvdGg+CiAgICAgICAgICAgIDx0aD5OYW1lPC90aD4KICAgICAgICA8L3RyPgogICAgICAgIDwvdGhlYWQ+CiAgICAgICAgPHRib2R5PgogICAgICAgIDx0ciBuZy1yZXBlYXQ9Imxpc3QgaW4gbGlzdHMiPgogICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIy97e3NlcnZpY2VOYW1lfX0ve3tsaXN0Ll9pZH19LyI+e3tsaXN0Ll9pZH19PC9hPjwvdGQ+CiAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjL3t7c2VydmljZU5hbWV9fS97e2xpc3QuX2lkfX0vIj57e2xpc3QudGl0bGV9fTwvYT48L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPC90Ym9keT4KICAgIDwvdGFibGU+CgogICAgPGRpdiBuZy1yZXBlYXQ9ImxpbmsgaW4gbGlua3MiPgogICAgICAgIDxhIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGhyZWY9Int7bGluay5ocmVmfX0iPnt7bGluay50aXRsZX19PC9hPiZuYnNwOwogICAgPC9kaXY+CjwvZGl2Pg==')
},
{
'name': '/app/lib/cosmos/partials/pageholder.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0iY29udGFpbmVyIHRoZW1lLXNob3djYXNlIiByb2xlPSJtYWluIj4KICAgICAgICA8ZGl2IG5nLXNob3c9InBhZ2VSZWZzICYmIHBhZ2VSZWZzLmxlbmd0aD4wIiBuZy1yZXBlYXQ9InBhZ2UgaW4gcGFnZVJlZnMiPgogICAgICAgICAgICA8cGFnZSBwYWdlaWQ9InBhZ2UucGFnZUlkIj48L3BhZ2U+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgbmctc2hvdz0icGFnZXMgJiYgcGFnZXMubGVuZ3RoPjAiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWludmVyc2UgbmF2YmFyLWZpeGVkLXRvcCIgcm9sZT0ibmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0ibmF2YmFyLWJyYW5kIiBocmVmPSIvIj5iZWVuZHU8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXY+TGlzdCBvZiBwYWdlczwvZGl2PgogICAgICAgICAgICA8ZGl2ICBuZy1yZXBlYXQ9InBhZ2UgaW4gcGFnZXMiPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iLyMvYS97e2FwcFNldHRpbmdzLnBhdGh9fS9wYWdlL3t7cGFnZS5faWR9fSI+e3twYWdlLnRpdGxlfX08L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKPC9kaXY+')
},
{
'name': '/app/lib/cosmos/partials/uploadfile.html', 'data': base64.b64decode(b'PHN0eWxlPgouZmlsZS1saXN0IHsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9Ci5maWxlLXNlbGVjdG9yewogICAgbWFyZ2luOiA1cHg7Cn0KPC9zdHlsZT4KCjxkaXYgbmctc2hvdz0iaGFzRXJyb3IiIGNsYXNzPSJiZy13YXJuaW5nIj4KICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IiBuZy1jbGljaz0iY2xlYXJFcnJvcigpOyI+PC9idXR0b24+CiAgICA8ZGl2PjxsYWJlbD5FcnJvciBjb2RlOjwvbGFiZWw+PHNwYW4gbmctYmluZD0ic3RhdHVzIj48L3NwYW4+PC9kaXY+CiAgICA8ZGl2IG5nLWJpbmQ9InN0YXR1c19kYXRhIj48L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImlGcmFtZVBsYWNlaG9sZGVyIj48L2Rpdj4KCjx0YWJsZSBjbGFzcz0idGFibGUiPgogICAgPHRoZWFkPgogICAgPHRyPgogICAgICAgIDx0aD5GaWxlIElkPC90aD4KICAgICAgICA8dGg+RmlsZSBzaXplPC90aD4KICAgICAgICA8dGg+RmlsZSBuYW1lPC90aD4KICAgICAgICA8dGg+RmlsZSBNRDU8L3RoPgogICAgICAgIDx0aD4mbmJzcDs8L3RoPgogICAgICAgIDx0aD4mbmJzcDs8L3RoPgogICAgPC90cj4KICAgIDwvdGhlYWQ+CiAgICA8dGJvZHk+CiAgICA8dHIgbmctcmVwZWF0PSJmaWxlIGluIHVwbG9hZGVkX2ZpbGVzIj4KICAgICAgICA8dGQ+e3tmaWxlLmZpbGVfaWR9fTwvdGQ+PHRkPnt7ZmlsZS5sZW5ndGh9fTwvdGQ+PHRkPnt7ZmlsZS5maWxlbmFtZX19PC90ZD48dGQ+e3tmaWxlLm1kNX19PC90ZD4KICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxhIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1zdWNjZXNzIGdseXBoaWNvbiBnbHlwaGljb24tZG93bmxvYWQiIGhyZWY9Ii9ncmlkZnMve3tmaWxlLmNvbGxlY3Rpb25fbmFtZX19L3t7ZmlsZS5maWxlX2lkfX0vIj48L2E+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSIgbmctY2xpY2s9InJlbW92ZUZpbGUoJGluZGV4KSI+PC9idXR0b24+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8L3Rib2R5Pgo8L3RhYmxlPgoKPGZvcm0gbmctaW5pdD0ic2V0QWN0aW9uKCkiIGlkPSJ1cGxvYWRGb3JtIiBuYW1lPSJ1cGxvYWRGb3JtIiBtZXRob2Q9J1BPU1QnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnIHRhcmdldD0nc3VibWl0LWlmcmFtZScgYWN0aW9uPSIvZ3JpZGZzLyI+CiAgICA8ZGl2IGNsYXNzPSJmaWxlLWxpc3QiIGlkPSJmaWxlTGlzdCI+CiAgICAgICAgPGlucHV0IGNsYXNzPSJmaWxlLXNlbGVjdG9yIiBuYW1lPSJ1cGxvYWRlZGZpbGUiIHR5cGU9ImZpbGUiIG9uY2hhbmdlPSJhbmd1bGFyLmVsZW1lbnQodGhpcykuc2NvcGUoKS5maWxlTmFtZUNoYW5nZWQodGhpcykiIC8+CiAgICA8L2Rpdj4KICAgIDxidXR0b24gIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgZ2x5cGhpY29uIGdseXBoaWNvbi1jbG91ZC11cGxvYWQiIG5nLWNsaWNrPSJ1cGxvYWRGaWxlKCkiID4gVXBsb2FkIDwvYnV0dG9uPgo8L2Zvcm0+')
},
{
'name': '/app/lib/cosmos/partials/widget-host.html', 'data': base64.b64decode(b'PGRpdiBuZy1pbmNsdWRlPSJsaXN0Q29uZmlndXJhdGlvbi53aWRnZXROYW1lIiAvPjwvZGl2Pg==')
},
{
'name': '/app/lib/cosmos/partials/appstudio.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1pbnZlcnNlIG5hdmJhci1maXhlZC10b3AiIHJvbGU9Im5hdmlnYXRpb24iPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgICAgPGEgY2xhc3M9Im5hdmJhci1icmFuZCIgaHJlZj0iLyMvYXBwc3R1ZGlvLyI+QXBwIFN0dWRpbzwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItY29sbGFwc2UgY29sbGFwc2UiPgogICAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItbmF2Ij4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIvIy9hcHBzdHVkaW8vIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLyMvdGVybWluYWwvIj5UZXJtaW5hbDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpIG5nLXNob3c9ImxvZ2dlZEluKCkiPjxhIGhyZWY9IiMvdXNlcnMiPlVzZXJzPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iIy9yb2xlcyI+Um9sZXM8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSJsb2dnZWRJbigpIj48YSBocmVmPSIvbG9nb3V0LyI+TG9nb3V0IFt7e3VzZXJOYW1lfX1dPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0iIWxvZ2dlZEluKCkiPjxhIGhyZWY9Ii8jL2xvZ2luP3JlZGlyZWN0PS9hcHBzdHVkaW8vIj5Mb2dpbjwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJjb250YWluZXIgdGhlbWUtc2hvd2Nhc2UiIHJvbGU9Im1haW4iIG5nLWluaXQ9ImluaXQoKSI+CiAgICA8ZXJyb3ItYmFubmVyPjwvZXJyb3ItYmFubmVyPgogICAgPGRpdj4KICAgICAgICA8bGFiZWwgbmctYmluZD0iZ2V0Q3VycmVudEFwcGxpY2F0aW9uVGl0bGUoKSI+PC9sYWJlbD4KICAgICAgICA8YnV0dG9uIGlkPSJjbG9zZV9hcHBfYnRuIiBuZy1zaG93PSJpc0FwcE9wZW5lZCgpIiBuZy1jbGljaz0iY2xvc2VBcHAoKSIgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIGJ0bi14cyI+Q2xvc2UgQXBwPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBpZD0icmVmcmVzaF9hcHBfYnRuIiBuZy1zaG93PSJpc0FwcE9wZW5lZCgpIiBuZy1jbGljaz0ibG9hZEFwcEl0ZW1zRm9yU2VsZWN0ZWRBcHAoKSIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyBidG4teHMiPlJlZnJlc2g8L2J1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgbmctaGlkZT0iaXNBcHBPcGVuZWQoKSI+CiAgICAgICAgPGRpdiBuZy1zaG93PSIhbG9nZ2VkSW4oKSI+CiAgICAgICAgICAgIDxwPllvdSBzaG91bGQgbG9naW4gKGFzIGFkbWluKSB0byBpbnN0YWxsIGFuIGFwcGxpY2F0aW9uLjwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBuZy1zaG93PSJsb2dnZWRJbigpIj4KICAgICAgICAgICAgPGgyPkluc3RhbGwgYXBwbGljYXRpb248L2gyPgoKICAgICAgICAgICAgPGZvcm0gZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9hcHBsaWNhdGlvbi9pbnN0YWxsLyI+CiAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBwYWNrYWdlOiA8aW5wdXQgbmFtZT0iYXBwbGljYXRpb24iIHR5cGU9ImZpbGUiLz48YnIvPgogICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAgICAgICBJbnN0YWxsIEFwcGxpY2F0aW9uICAgICAgIi8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGgyPkFwcGxpY2F0aW9uczwvaDI+CgogICAgICAgIDxkaXYgaWQ9ImFwcCI+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUiPgogICAgICAgICAgICAgICAgPHRyIG5nLXJlcGVhdD0iY2FwcCBpbiBhcHBsaWNhdGlvbnMiPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAge3tjYXBwLnRpdGxlfX0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0ib3Blbl97e2NhcHAuaWR9fSIgbmctY2xpY2s9Im9wZW5BcHAoY2FwcCkiIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MgYnRuLXNtIj5PcGVuIEFwcDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iYnJvd3NlX3t7Y2FwcC5pZH19IiBocmVmPSIvIy9hL3t7Y2FwcC5wYXRofX0vIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSI+QnJvd3NlIEFwcDwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0ic2V0X2RlZmF1bHRfe3tjYXBwLmlkfX0iIG5nLWhpZGU9ImNhcHAuaWQgPT09IGdsb2JhbFNldHRpbmdzLmRlZmF1bHRhcHBpZCIgIG5nLWNsaWNrPSJzZXRBc0RlZmF1bHQoY2FwcCkiIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MgYnRuLXNtIj5TZXQgZGVmYXVsdDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGVmYXVsdF90eHRfe3tjYXBwLmlkfX0iIG5nLXNob3c9ImNhcHAuaWQgPT09IGdsb2JhbFNldHRpbmdzLmRlZmF1bHRhcHBpZCI+RGVmYXVsdDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9InNldHRpbmdzX3t7Y2FwcC5pZH19IiBuZy1ocmVmPSIjL2FwcHN0dWRpby9hcHAvY29zbW9zYXBwL3t7Y2FwcC5faWR9fSIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBidG4tc20iPlNldHRpbmdzPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iZXhwb3J0X3t7Y2FwcC5pZH19IiBuZy1ocmVmPSIvYXBwbGljYXRpb24vcGFja2FnZS97e2NhcHAuaWR9fSIgY2xhc3M9ImJ0biBidG4taW5mbyBidG4tc20iPkV4cG9ydCBBcHA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRlbGV0ZV97e2NhcHAuaWR9fSIgbmctY2xpY2s9ImRlbGV0ZUFwcChjYXBwKTsiIGNsYXNzPSJidG4gYnRuLWRhbmdlciBidG4tc20iPkRlbGV0ZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2PgogICAgICAgICAgICA8YSBpZD0iY3JlYXRlX2FwcF9idG4iIG5nLWhyZWY9IiMvYXBwc3R1ZGlvL2FwcC9jb3Ntb3NhcHAiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkNyZWF0ZSBBcHBsaWNhdGlvbjwvYT4KICAgICAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KCiAgICA8ZGl2IG5nLXNob3c9ImlzQXBwT3BlbmVkKCkiPgoKICAgICAgICA8dGFic2V0PgogICAgICAgICAgICA8dGFiIGhlYWRpbmc9IlBhZ2VzIiBpZD0icGFnZXNfdGFiIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9InBhZ2VzIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPkNvbnRyb2w8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlZpZXc8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgbmctcmVwZWF0PSJwYWdlIGluIHNlbGVjdGVkQXBwbGljYXRpb24ucGFnZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJlZGl0X3BnX3t7cGFnZS5faWR9fSIgbmctaHJlZj0iIy9hcHBzdHVkaW8vcGFnZS97e3NlbGVjdGVkQXBwbGljYXRpb24ucGF0aH19L3t7cGFnZS5faWR9fSI+W0VkaXQge3twYWdlLnRpdGxlfX1dPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0idmlld19wZ197e3BhZ2UuX2lkfX0iIG5nLWhyZWY9IiMvYS97e3NlbGVjdGVkQXBwbGljYXRpb24ucGF0aH19L3BhZ2Uve3twYWdlLl9pZH19Ij5bVmlldyB7e3BhZ2UudGl0bGV9fV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9InNldF9kZWZhdWx0X3BnX3t7cGFnZS5faWR9fSIgbmctaGlkZT0icGFnZS5faWQgPT09IHNlbGVjdGVkQXBwbGljYXRpb24uc2V0dGluZ3MuaW5kZXhQYWdlSWQiICBuZy1jbGljaz0ic2V0UGFnZUFzRGVmYXVsdChwYWdlKSIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyBidG4teHMiPlNldCBkZWZhdWx0PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRlZmF1bHRfdHh0X3t7cGFnZS5faWR9fSIgbmctc2hvdz0icGFnZS5faWQgPT09IHNlbGVjdGVkQXBwbGljYXRpb24uc2V0dGluZ3MuaW5kZXhQYWdlSWQiPkRlZmF1bHQ8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRlbGV0ZV9wZ197e3BhZ2UuX2lkfX0iIG5nLWNsaWNrPSJkZWxldGVJdGVtKG51bGwsICdwYWdlJywgcGFnZS50aXRsZSwgJ3BhZ2Vjb25maWdvYmplY3QnICwgcGFnZS5faWQpIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIgYnRuLXhzIj5EZWxldGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8YSBpZD0iY3JlYXRlX3BhZ2VfYnRuIiBuZy1ocmVmPSIjL2FwcHN0dWRpby9wYWdlL3t7c2VsZWN0ZWRBcHBsaWNhdGlvbi5wYXRofX0vIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5DcmVhdGUgcGFnZTwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RhYj4KICAgICAgICAgICAgPHRhYiBoZWFkaW5nPSJGb3JtcyIgaWQ9ImZvcm1zX3RhYiI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJmb3JtcyI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9ImZvcm0gaW4gc2VsZWN0ZWRBcHBsaWNhdGlvbi5mb3JtcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImVkaXRfZm9ybV97e2Zvcm0uX2lkfX0iIG5nLWhyZWY9IiMvYXBwc3R1ZGlvL2Zvcm0ve3tzZWxlY3RlZEFwcGxpY2F0aW9uLnBhdGh9fS97e2Zvcm0uX2lkfX0iPlt7e2Zvcm0udGl0bGV9fV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRlbGV0ZV9mb3JtX3t7Zm9ybS5faWR9fSIgbmctY2xpY2s9ImRlbGV0ZUl0ZW0obnVsbCwgJ2Zvcm0nLCBmb3JtLnRpdGxlLCAnZm9ybWNvbmZpZ29iamVjdCcgLCBmb3JtLl9pZCkiIGNsYXNzPSJidG4gYnRuLWRhbmdlciBidG4teHMiPkRlbGV0ZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDxhIGlkPSJjcmVhdGVfZm9ybV9idG4iIG5nLWhyZWY9IiMvYXBwc3R1ZGlvL2Zvcm0ve3tzZWxlY3RlZEFwcGxpY2F0aW9uLnBhdGh9fS8iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkNyZWF0ZSBmb3JtPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGFiPgogICAgICAgICAgICA8dGFiIGhlYWRpbmc9Ikxpc3RzIiBpZD0ibGlzdHNfdGFiIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9Imxpc3RzIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG5nLXJlcGVhdD0ibGlzdCBpbiBzZWxlY3RlZEFwcGxpY2F0aW9uLmxpc3RzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iZWRpdF9saXN0X3t7bGlzdC5faWR9fSIgbmctaHJlZj0iIy9hcHBzdHVkaW8vbGlzdC97e3NlbGVjdGVkQXBwbGljYXRpb24ucGF0aH19L3t7bGlzdC5faWR9fSI+W3t7bGlzdC50aXRsZX19XTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZGVsZXRlX2xpc3Rfe3tsaXN0Ll9pZH19IiBuZy1jbGljaz0iZGVsZXRlSXRlbShudWxsLCAnbGlzdCcsIGxpc3QudGl0bGUsICdsaXN0Y29uZmlnb2JqZWN0JyAsIGxpc3QuX2lkKSIgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIGJ0bi14cyI+RGVsZXRlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImNyZWF0ZV9saXN0X2J0biIgbmctaHJlZj0iIy9hcHBzdHVkaW8vbGlzdC97e3NlbGVjdGVkQXBwbGljYXRpb24ucGF0aH19LyIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+Q3JlYXRlIExpc3Q8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90YWI+CiAgICAgICAgICAgIDx0YWIgaGVhZGluZz0iQ2hhcnRzIiBpZD0iY2hhcnRzX3RhYiI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjaGFydHMiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgbmctcmVwZWF0PSJjaGFydCBpbiBzZWxlY3RlZEFwcGxpY2F0aW9uLmNoYXJ0cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjaGFydC50aXRsZX19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2hhcnQuY2hhcnRUeXBlfX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaWQ9ImVkaXRfY2hhcnRfe3tjaGFydC5faWR9fSIgY2xhc3M9ImJ0biBidG4teHMgYnRuLWluZm8iIG5nLWhyZWY9IiMvYXBwc3R1ZGlvL2NoYXJ0L3t7c2VsZWN0ZWRBcHBsaWNhdGlvbi5wYXRofX0ve3tjaGFydC5faWR9fSI+RWRpdDwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRlbGV0ZV9jaGFydF97e2NoYXJ0Ll9pZH19IiBuZy1jbGljaz0iZGVsZXRlSXRlbShudWxsLCAnY2hhcnQnLCBjaGFydC50aXRsZSwgJ2NoYXJ0Y29uZmlnb2JqZWN0JyAsIGNoYXJ0Ll9pZCkiIGNsYXNzPSJidG4gYnRuLWRhbmdlciBidG4teHMiPkRlbGV0ZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8YSBpZD0iY3JlYXRlX2NoYXJ0X2J0biIgbmctaHJlZj0iIy9hcHBzdHVkaW8vY2hhcnQve3tzZWxlY3RlZEFwcGxpY2F0aW9uLnBhdGh9fS8iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkNyZWF0ZSBDaGFydDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RhYj4KICAgICAgICAgICAgPHRhYiBoZWFkaW5nPSJJdGVtIFZpZXdzIiBpZD0iaXRlbXZpZXdzX3RhYiI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzaW5nbGVpdGVtdmlld3MiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgbmctcmVwZWF0PSJzaXYgaW4gc2VsZWN0ZWRBcHBsaWNhdGlvbi5zaW5nbGVpdGVtdmlld3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJlZGl0X2l0ZW1fdmlld197e3Npdi5faWR9fSIgbmctaHJlZj0iIy9hcHBzdHVkaW8vc2luZ2xlaXRlbXZpZXcve3tzZWxlY3RlZEFwcGxpY2F0aW9uLnBhdGh9fS97e3Npdi5faWR9fSI+W3t7c2l2Lm9iamVjdE5hbWV9fV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRlbGV0ZV9pdGVtX3ZpZXdfe3tzaXYuX2lkfX0iIG5nLWNsaWNrPSJkZWxldGVJdGVtKG51bGwsICdpdGVtIHZpZXcgb2YgJywgc2l2Lm9iamVjdE5hbWUsICdzaW5nbGVpdGVtY29uZmlnb2JqZWN0JyAsIHNpdi5faWQpIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIgYnRuLXhzIj5EZWxldGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8YSBpZD0iY3JlYXRlX2l0ZW12aWV3X2J0biIgbmctaHJlZj0iIy9hcHBzdHVkaW8vc2luZ2xlaXRlbXZpZXcve3tzZWxlY3RlZEFwcGxpY2F0aW9uLnBhdGh9fS8iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkNyZWF0ZSBJdGVtIFZpZXc8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90YWI+CiAgICAgICAgICAgIDx0YWIgaGVhZGluZz0iV2lkZ2V0cyIgaWQ9IndpZGdldHNfdGFiIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IndpZGdldHMiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgbmctcmVwZWF0PSJ3aWRnZXQgaW4gc2VsZWN0ZWRBcHBsaWNhdGlvbi53aWRnZXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iZWRpdF93aWRnZXRfe3t3aWRnZXQuX2lkfX0iIG5nLWhyZWY9IiMvYXBwc3R1ZGlvL3dpZGdldC97e3NlbGVjdGVkQXBwbGljYXRpb24ucGF0aH19L3t7d2lkZ2V0Ll9pZH19Ij5be3t3aWRnZXQubmFtZX19XTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZGVsZXRlX3dpZGdldF97e3dpZGdldC5faWR9fSIgbmctY2xpY2s9ImRlbGV0ZUl0ZW0obnVsbCwgJ3dpZGdldCcsIHdpZGdldC5uYW1lLCAnd2lkZ2V0b2JqZWN0JyAsIHdpZGdldC5faWQpIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIgYnRuLXhzIj5EZWxldGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8YSBpZD0iY3JlYXRlX3dpZGdldF9idG4iIG5nLWhyZWY9IiMvYXBwc3R1ZGlvL3dpZGdldC97e3NlbGVjdGVkQXBwbGljYXRpb24ucGF0aH19LyIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+Q3JlYXRlIHdpZGdldDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RhYj4KICAgICAgICAgICAgPHRhYiBoZWFkaW5nPSJNZW51cyIgaWQ9Im1lbnVzX3RhYiI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtZW51cyI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9Im1lbnUgaW4gc2VsZWN0ZWRBcHBsaWNhdGlvbi5tZW51cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImVkaXRfbWVudV97e21lbnUuX2lkfX0iIG5nLWhyZWY9IiMvYXBwc3R1ZGlvL21lbnUve3tzZWxlY3RlZEFwcGxpY2F0aW9uLnBhdGh9fS97e21lbnUuX2lkfX0iPlt7e21lbnUuYnJhbmR0aXRsZX19XTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZGVsZXRlX21lbnVfe3ttZW51Ll9pZH19IiBuZy1jbGljaz0iZGVsZXRlSXRlbShudWxsLCAnbWVudScsIG1lbnUuYnJhbmR0aXRsZSwgJ21lbnVjb25maWdvYmplY3QnICwgbWVudS5faWQpIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIgYnRuLXhzIj5EZWxldGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8YSBpZD0iY3JlYXRlX21lbnVfYnRuIiBuZy1ocmVmPSIjL2FwcHN0dWRpby9tZW51L3t7c2VsZWN0ZWRBcHBsaWNhdGlvbi5wYXRofX0vIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5DcmVhdGUgbWVudTwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RhYj4KICAgICAgICAgICAgPHRhYiBoZWFkaW5nPSJTb3VyY2UgQ29kZSIgaWQ9InNvdXJjZV9jb2RlX3RhYiI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzb3VyY2Vjb2RlIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG5nLXJlcGVhdD0ic291cmNlZmlsZSBpbiBzZWxlY3RlZEFwcGxpY2F0aW9uLnNvdXJjZWZpbGVzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NvdXJjZWZpbGUuZmlsZW5hbWV9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NvdXJjZWZpbGUuZnVsbG5hbWV9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3NvdXJjZWZpbGUudHlwZX19PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBpZD0iZWRpdF9zb3VyY2Vfe3tzb3VyY2VmaWxlLl9pZH19IiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tcHJpbWFyeSIgbmctaHJlZj0iIy9hcHBzdHVkaW8vc291cmNlZmlsZXMve3tzZWxlY3RlZEFwcGxpY2F0aW9uLnBhdGh9fS97e3NvdXJjZWZpbGUuX2lkfX0iPkVkaXQ8L2E+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YnV0dG9uIGlkPSJkZWxldGVfc291cmNlX3t7c291cmNlZmlsZS5faWR9fSIgY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciIgbmctY2xpY2s9ImRlbGV0ZVNvdXJjZUZpbGUoc291cmNlZmlsZSk7Ij5EZWxldGU8L2J1dHRvbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImNyZWF0ZV9zb3VyY2VfYnRuIiBuZy1ocmVmPSIjL2FwcHN0dWRpby9zb3VyY2VmaWxlcy97e3NlbGVjdGVkQXBwbGljYXRpb24ucGF0aH19LyIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+TmV3IHNvdXJjZTwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RhYj4KICAgICAgICAgICAgPHRhYiBoZWFkaW5nPSJJbnRlcmNlcHRvcnMiIGlkPSJpbmNlcHRvcnNfdGFiIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImludGVyY2VwdG9ycyI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9ImludGVyY2VwdG9yIGluIHNlbGVjdGVkQXBwbGljYXRpb24uaW50ZXJjZXB0b3JzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuZy1ocmVmPSIjL2FwcHN0dWRpby9pbnRlcmNlcHRvci97e3NlbGVjdGVkQXBwbGljYXRpb24ucGF0aH19L3t7aW50ZXJjZXB0b3IuX2lkfX0iPnt7aW50ZXJjZXB0b3Iub2JqZWN0X25hbWV9fTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpbnRlcmNlcHRvci5hY2Nlc3N9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2ludGVyY2VwdG9yLmludGVyY2VwdG9yX25hbWV9fTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaWQ9ImVkaXRfaW50ZXJjZXB0b3Jfe3tpbnRlcmNlcHRvci5faWR9fSIgY2xhc3M9ImJ0biBidG4teHMgYnRuLWluZm8iIG5nLWhyZWY9IiMvYXBwc3R1ZGlvL2ludGVyY2VwdG9yL3t7c2VsZWN0ZWRBcHBsaWNhdGlvbi5wYXRofX0ve3tpbnRlcmNlcHRvci5faWR9fSI+RWRpdDwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRlbGV0ZV9pbnRlcmNlcHRvcl97e2ludGVyY2VwdG9yLl9pZH19IiBuZy1jbGljaz0iZGVsZXRlSXRlbShudWxsLCAnaW50ZXJjZXB0b3IgZm9yICAnLCBpbnRlcmNlcHRvci5vYmplY3RfbmFtZSwgJ2ludGVyY2VwdG9yY29uaWdvYmplY3QnICwgaW50ZXJjZXB0b3IuX2lkKSIgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIGJ0bi14cyI+RGVsZXRlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImNyZWF0ZV9pbnRlcmNlcHRvcl9idG4iIG5nLWhyZWY9IiMvYXBwc3R1ZGlvL2ludGVyY2VwdG9yL3t7c2VsZWN0ZWRBcHBsaWNhdGlvbi5wYXRofX0vIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5OZXcgaW50ZXJjZXB0b3I8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90YWI+CiAgICAgICAgICAgIDx0YWIgaGVhZGluZz0iRW5kcG9pbnRzIiBpZD0iZW5kcG9pbnRzX3RhYiI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJlbmRwb2ludHMiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgbmctcmVwZWF0PSJlbmRwb2ludCBpbiBzZWxlY3RlZEFwcGxpY2F0aW9uLmFwcGVuZHBvaW50cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImVkaXRfZW5kcG9pbnRfe3tlbmRwb2ludC5faWR9fSIgbmctaHJlZj0iIy9hcHBzdHVkaW8vYXBwZW5kcG9pbnQve3tzZWxlY3RlZEFwcGxpY2F0aW9uLnBhdGh9fS97e2VuZHBvaW50Ll9pZH19Ij57e2VuZHBvaW50LnVyaV9wYXR0ZXJufX08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZW5kcG9pbnQuaGFuZGxlcl9tb2R1bGV9fS57e2VuZHBvaW50LmhhbmRsZXJfbmFtZX19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7aW50ZXJjZXB0b3IuaW50ZXJjZXB0b3JfbmFtZX19PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBjbGFzcz0iYnRuIGJ0bi14cyBidG4taW5mbyIgbmctaHJlZj0iIy9hcHBzdHVkaW8vYXBwZW5kcG9pbnQve3tzZWxlY3RlZEFwcGxpY2F0aW9uLnBhdGh9fS97e2VuZHBvaW50Ll9pZH19Ij5FZGl0PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZGVsZXRlX2VuZHBvaW50X3t7ZW5kcG9pbnQuX2lkfX0iIG5nLWNsaWNrPSJkZWxldGVJdGVtKG51bGwsICdlbmRwb2ludCBmb3InLCBlbmRwb2ludC51cmlfcGF0dGVybiwgJ2FwcGVuZHBvaW50Y29uaWdvYmplY3QnICwgZW5kcG9pbnQuX2lkKSIgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIGJ0bi14cyI+RGVsZXRlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgoKICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDxhIGlkPSJjcmVhdGVfZW5kcG9pbnRfYnRuIiBuZy1ocmVmPSIjL2FwcHN0dWRpby9hcHBlbmRwb2ludC97e3NlbGVjdGVkQXBwbGljYXRpb24ucGF0aH19LyIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+TmV3IGVuZHBvaW50PC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGFiPgogICAgICAgIDwvdGFic2V0PgogICAgPC9kaXY+CjwvZGl2Pg==')
},
{
'name': '/app/lib/cosmos/partials/page-design.html', 'data': base64.b64decode(b'PHN0eWxlPgogICAgLmxpc3QgewogICAgICAgIGxpc3Qtc3R5bGU6IG5vbmUgb3V0c2lkZSBub25lOwogICAgICAgIHBhZGRpbmctbGVmdDogMDsKICAgIH0KCiAgICAuYXBwcy1jb250YWluZXIgewogICAgICAgIGJvcmRlcjogMXB4IGRhc2hlZCBsaWdodGdyYXk7CiAgICAgICAgbWluLWhlaWdodDogMjRweDsKICAgICAgICBtaW4td2lkdGg6IDEyOHB4OwogICAgICAgIHBhZGRpbmctdG9wOiAxMHB4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgfQoKICAgIC5wYWdlIHsKICAgICAgICBtaW4td2lkdGg6IDgwMHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDY0cHg7CiAgICB9CgogICAgLnBhZ2UgdWwgewogICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDBweDsKICAgIH0KCiAgICAuZmxvYXRsZWZ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgIH0KCiAgICAuZmxvYXRyaWdodCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgfQoKICAgIC5jbGVhciB7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICB9CgogICAgLmdlbi1keW5hbWljLWRpcmVjdGl2ZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICB9CgogICAgLmJlaW5nRHJhZ2dlZCB7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IC41ZW0gIWltcG9ydGFudDsKICAgICAgICBib3JkZXI6IDFweCBkYXNoZWQgI2NjYyAhaW1wb3J0YW50OwogICAgfQoKICAgIC5wcm9wZXJ0aWVzewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgfQoKICAgIC5zZXR0aW5ncy10YWItY29udGFpbmVyewogICAgICAgIG1pbi13aWR0aDogMzAwcHg7CiAgICAgICAgd2lkdGg6MzAwcHg7CiAgICB9CgogICAgLnRvb2xzLXRhYi1jb250YWluZXJ7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICB3aWR0aDoxNTBweDsKICAgIH0KCjwvc3R5bGU+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJtZW51cmVmLWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxkaXYgbmctYmluZD0iZmllbGQudHlwZSI+PC9kaXY+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJmb3JtcmVmLWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxkaXYgbmctYmluZD0iZmllbGQudHlwZSI+PC9kaXY+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJwYWdlcmVmLWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxkaXYgbmctYmluZD0iZmllbGQudHlwZSI+PC9kaXY+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJ3aWRnZXRob3N0LWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxkaXYgbmctYmluZD0iZmllbGQudHlwZSI+PC9kaXY+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJodG1sYmxvY2stZmllbGQuaHRtbCI+CiAgICA8ZGl2IG5nLWNsaWNrPSJzZWxlY3RJdGVtKGZpZWxkKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyI+CiAgICAgICAgPGRpdiBuZy1pZj0iZmllbGQuYmxvY2t0eXBlIj4KICAgICAgICAgICAgPGZpZWxkIGl0ZW09ImZpZWxkIiAvPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgbmctaWY9IiFmaWVsZC5ibG9ja3R5cGUiPiZuYnNwOzwvZGl2PgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0ibGlzdHJlZi1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8ZGl2IG5nLWJpbmQ9ImZpZWxkLnR5cGUiPjwvZGl2PgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0iY3NzcmVmLWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxkaXYgbmctYmluZD0iZmllbGQudHlwZSI+PC9kaXY+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJqc3JlZi1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8ZGl2PkludGVybmFsIEpTIEZpbGUge3tpdGVtLnNyY319PC9kaXY+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJleHRqc3JlZi1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8ZGl2PkV4dGVybmFsIEpTIEZpbGUge3tpdGVtLnNyY319PC9kaXY+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJjaGFydHJlZi1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8ZGl2IG5nLWJpbmQ9ImZpZWxkLnR5cGUiPjwvZGl2PgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0idHdvY29sdW1uLWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxkaXYgbmctc2hvdz0ic2VsZWN0ZWRJdGVtID09IGZpZWxkIj4mbmJzcDs8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXItZmx1aWQiID4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iYXBwcy1jb250YWluZXIgY29sLW1kLTYgY29sdW1uMCIgbmctaW5pdD0iZmllbGQubGVmdGNvbHVtbiA9IGZpZWxkLmxlZnRjb2x1bW4gfHwgW10iCiAgICAgICAgICAgICAgICAgICAgdWktc29ydGFibGU9InNvcnRhYmxlT3B0aW9ucyIKICAgICAgICAgICAgICAgICAgICBuZy1tb2RlbD0iZmllbGQubGVmdGNvbHVtbiI+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJpbm5lckNvbnQiIG5nLXJlcGVhdD0iZmllbGQgaW4gZmllbGQubGVmdGNvbHVtbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmctc2hvdz0ic2VsZWN0ZWRJdGVtID09IGZpZWxkIiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIHB1bGwtcmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctY2xpY2s9InJlbW92ZUl0ZW0oJHBhcmVudC5maWVsZC5sZWZ0Y29sdW1uLCAkaW5kZXgpOyI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctaW5jbHVkZT0iZmllbGQudHlwZSsnLWZpZWxkLmh0bWwnIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iYXBwcy1jb250YWluZXIgY29sLW1kLTYgY29sdW1uMSIgbmctaW5pdD0iZmllbGQucmlnaHRjb2x1bW4gPSBmaWVsZC5yaWdodGNvbHVtbiB8fCBbXSIKICAgICAgICAgICAgICAgICAgICB1aS1zb3J0YWJsZT0ic29ydGFibGVPcHRpb25zIgogICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJmaWVsZC5yaWdodGNvbHVtbiI+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJpbm5lckNvbnQiIG5nLXJlcGVhdD0iZmllbGQgaW4gZmllbGQucmlnaHRjb2x1bW4iPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLXNob3c9InNlbGVjdGVkSXRlbSA9PSBmaWVsZCIgY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPSJyZW1vdmVJdGVtKCRwYXJlbnQuZmllbGQucmlnaHRjb2x1bW4sICRpbmRleCk7Ij48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1pbmNsdWRlPSJmaWVsZC50eXBlKyctZmllbGQuaHRtbCciPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9InRocmVlY29sdW1uLWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxkaXYgbmctc2hvdz0ic2VsZWN0ZWRJdGVtID09IGZpZWxkIj4mbmJzcDs8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXItZmx1aWQiID4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iYXBwcy1jb250YWluZXIgY29sLW1kLTQgIGNvbHVtbjAiIG5nLWluaXQ9ImZpZWxkLmxlZnRjb2x1bW4gPSBmaWVsZC5sZWZ0Y29sdW1uIHx8IFtdIgogICAgICAgICAgICAgICAgICAgIHVpLXNvcnRhYmxlPSJzb3J0YWJsZU9wdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgbmctbW9kZWw9ImZpZWxkLmxlZnRjb2x1bW4iPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iaW5uZXJDb250IiBuZy1yZXBlYXQ9ImZpZWxkIGluIGZpZWxkLmxlZnRjb2x1bW4iPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLXNob3c9InNlbGVjdGVkSXRlbSA9PSBmaWVsZCIgY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPSJyZW1vdmVJdGVtKCRwYXJlbnQuZmllbGQubGVmdGNvbHVtbiwgJGluZGV4KTsiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLWluY2x1ZGU9ImZpZWxkLnR5cGUrJy1maWVsZC5odG1sJyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9ImFwcHMtY29udGFpbmVyIGNvbC1tZC00IGNvbHVtbjEiIG5nLWluaXQ9ImZpZWxkLm1pZGNvbHVtbiA9IGZpZWxkLm1pZGNvbHVtbiB8fCBbXSIKICAgICAgICAgICAgICAgICAgICB1aS1zb3J0YWJsZT0ic29ydGFibGVPcHRpb25zIgogICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJmaWVsZC5taWRjb2x1bW4iPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iaW5uZXJDb250IiBuZy1yZXBlYXQ9ImZpZWxkIGluIGZpZWxkLm1pZGNvbHVtbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmctc2hvdz0ic2VsZWN0ZWRJdGVtID09IGZpZWxkIiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIHB1bGwtcmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctY2xpY2s9InJlbW92ZUl0ZW0oJHBhcmVudC5maWVsZC5taWRjb2x1bW4sICRpbmRleCk7Ij48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1pbmNsdWRlPSJmaWVsZC50eXBlKyctZmllbGQuaHRtbCciPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJhcHBzLWNvbnRhaW5lciBjb2wtbWQtNCBjb2x1bW4yIiBuZy1pbml0PSJmaWVsZC5yaWdodGNvbHVtbiA9IGZpZWxkLnJpZ2h0Y29sdW1uIHx8IFtdIgogICAgICAgICAgICAgICAgICAgIHVpLXNvcnRhYmxlPSJzb3J0YWJsZU9wdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgbmctbW9kZWw9ImZpZWxkLnJpZ2h0Y29sdW1uIj4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImlubmVyQ29udCIgbmctcmVwZWF0PSJmaWVsZCBpbiBmaWVsZC5yaWdodGNvbHVtbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmctc2hvdz0ic2VsZWN0ZWRJdGVtID09IGZpZWxkIiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIHB1bGwtcmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctY2xpY2s9InJlbW92ZUl0ZW0oJHBhcmVudC5maWVsZC5yaWdodGNvbHVtbiwgJGluZGV4KTsiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLWluY2x1ZGU9ImZpZWxkLnR5cGUrJy1maWVsZC5odG1sJyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0iY29uZGl0aW9uLWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCI+e3tmaWVsZC5sYWJlbH19PC9sYWJlbD4KICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCI+SUY8L2xhYmVsPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJhcHBzLWNvbnRhaW5lciIKICAgICAgICAgICAgICAgICAgICB1aS1zb3J0YWJsZT0ic29ydGFibGVPcHRpb25zIgogICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJmaWVsZC5maWVsZHMiPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iaW5uZXJDb250IiBuZy1yZXBlYXQ9ImZpZWxkIGluIGZpZWxkLmZpZWxkcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPSJyZW1vdmVJdGVtKCRwYXJlbnQuZmllbGQuZmllbGRzLCAkaW5kZXgpOyI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctaW5jbHVkZT0iZmllbGQudHlwZSsnLWZpZWxkLmh0bWwnIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb250cm9sLWxhYmVsIj5FTFNFPC9sYWJlbD4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iYXBwcy1jb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgdWktc29ydGFibGU9InNvcnRhYmxlT3B0aW9ucyIKICAgICAgICAgICAgICAgICAgICBuZy1tb2RlbD0iZmllbGQuZWxzZWZpZWxkcyI+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJpbm5lckNvbnQiIG5nLXJlcGVhdD0iZmllbGQgaW4gZmllbGQuZWxzZWZpZWxkcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPSJyZW1vdmVJdGVtKCRwYXJlbnQuZmllbGQuZWxzZWZpZWxkcywgJGluZGV4KTsiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLWluY2x1ZGU9ImZpZWxkLnR5cGUrJy1maWVsZC5odG1sJyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9ImFycmF5LWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCI+e3tmaWVsZC5sYWJlbH19IFsgXTwvbGFiZWw+CiAgICAgICAgPHVsIGNsYXNzPSJhcHBzLWNvbnRhaW5lciIgdWktc29ydGFibGU9InNvcnRhYmxlT3B0aW9ucyIgbmctbW9kZWw9ImZpZWxkLmZpZWxkcyI+CiAgICAgICAgICAgIDxsaSBjbGFzcz0iaW5uZXJDb250IiBuZy1yZXBlYXQ9ImZpZWxkIGluIGZpZWxkLmZpZWxkcyI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1kYW5nZXIgZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUgcHVsbC1yaWdodCIgbmctY2xpY2s9InJlbW92ZUl0ZW0oJHBhcmVudC5maWVsZC5maWVsZHMsICRpbmRleCk7Ij48L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxkaXYgbmctaW5jbHVkZT0iZmllbGQudHlwZSsnLWZpZWxkLmh0bWwnIj48L2Rpdj4KICAgICAgICAgICAgPC9saT4KICAgICAgICA8L3VsPgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0iZmllbGQtb3B0aW9ucy5odG1sIj4KICAgIDxkaXY+CgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0iY29udHJvbC10YWItdG9vbHMuaHRtbCI+CiAgICA8ZGl2PgogICAgICAgIDx1bCBjbGFzcz0iYXBwcy1jb250YWluZXIgZmlyc3QiIHVpLXNvcnRhYmxlPSJzb3J0YWJsZVRvb2xzT3B0aW9ucyIgbmctbW9kZWw9ImNvbXBvbmVudHMiPgogICAgICAgICAgICA8bGkgbmctcmVwZWF0PSJjb21wIGluIGNvbXBvbmVudHMiPgogICAgICAgICAgICAgICAgIHt7Y29tcC5sYWJlbH19CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9ImZvcm0tb3B0aW9ucy5odG1sIj4KICAgIDxkaXY+CiAgICAgICAgPGxhYmVsPkFjdGlvbjwvbGFiZWw+CiAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzZWxlY3RlZEl0ZW0uYWN0aW9uIiAvPgogICAgPC9kaXY+CiAgICA8ZGl2PgogICAgICAgIDxsYWJlbD5PbiBzdWNjZXNzPC9sYWJlbD4KICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPGxhYmVsPlR5cGU8L2xhYmVsPgogICAgICAgICAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD0ic2VsZWN0ZWRJdGVtLm9uc3VjY2Vzcy50eXBlIiBuZy1vcHRpb25zPSJvdHlwZS5uYW1lIGFzIG90eXBlLmxhYmVsIGZvciBvdHlwZSBpbiBvbnN1Y2Nlc3NfdHlwZXMiPjwvc2VsZWN0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxsYWJlbD5WYWx1ZTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InNlbGVjdGVkSXRlbS5vbnN1Y2Nlc3MudmFsdWUiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPGRpdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1pbnZlcnNlIG5hdmJhci1maXhlZC10b3AiIHJvbGU9Im5hdmlnYXRpb24iPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgICAgPGEgY2xhc3M9Im5hdmJhci1icmFuZCIgaHJlZj0iL2FwcHN0dWRpby8iPkFwcCBTdHVkaW88L2E+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibmF2YmFyLWNvbGxhcHNlIGNvbGxhcHNlIj4KICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXYgbmF2YmFyLW5hdiI+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLyMvYXBwc3R1ZGlvLyI+SG9tZTwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpIG5nLXNob3c9ImxvZ2dlZEluKCkiPjxhIGhyZWY9Ii9sb2dvdXQvIj5Mb2dvdXQgW3t7dXNlck5hbWV9fV08L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSIhbG9nZ2VkSW4oKSI+PGEgaHJlZj0iLyMvbG9naW4vIj5Mb2dpbjwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBuZy1pbml0PSJpbml0KCkiIGNsYXNzPSJjb250YWluZXItZmx1aWQiPgoKICAgIDxkaXYgbmctc2hvdz0iaGFzRXJyb3IiIGNsYXNzPSJiZy13YXJuaW5nIj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1kYW5nZXIgZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUgcHVsbC1yaWdodCIgbmctY2xpY2s9ImNsZWFyRXJyb3IoKTsiPjwvYnV0dG9uPgogICAgICAgIDxkaXY+PGxhYmVsPkVycm9yIGNvZGU6PC9sYWJlbD48c3BhbiBuZy1iaW5kPSJzdGF0dXMiLz48L2Rpdj4KICAgICAgICA8ZGl2IG5nLWJpbmQ9InN0YXR1c19kYXRhIj48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICA8bGFiZWw+UGFnZSBJZDogPC9sYWJlbD48bGFiZWwgbmctaWY9InBhZ2UuX2lkIiBpZD0icGFnZV9pZF9sYWJlbCI+e3twYWdlLl9pZH19PC9sYWJlbD48YnIvPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgIDxkaXYgaWQ9InRvb2xiYXIiIGNsYXNzPSJjb2wtc20tMiI+CiAgICAgICAgICAgIDx1bCBjbGFzcz0iYXBwcy1jb250YWluZXIgZmlyc3QiIHVpLXNvcnRhYmxlPSJzb3J0YWJsZVRvb2xzT3B0aW9ucyIgbmctbW9kZWw9ImNvbXBvbmVudHMiPgogICAgICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0iY29tcCBpbiBjb21wb25lbnRzIiBpZD0idG9vbF97e2NvbXAudHlwZX19Ij4KICAgICAgICAgICAgICAgICAgICB7e2NvbXAubGFiZWx9fQogICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tOCBwYWdlIj4KICAgICAgICAgICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShwYWdlKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyI+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9ImRlc2lnbl90aXRsZV9sYWJlbCIgY2xhc3M9ImNvbnRyb2wtbGFiZWwiPnt7cGFnZS50aXRsZX19PC9sYWJlbD4KICAgICAgICAgICAgICAgIDx1bCBpZD0iZGVzaWduX2NhbnZhcyIgY2xhc3M9ImFwcHMtY29udGFpbmVyIiB1aS1zb3J0YWJsZT0ic29ydGFibGVPcHRpb25zIiBuZy1tb2RlbD0icGFnZS5maWVsZHMiPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iaW5uZXJDb250IiBuZy1yZXBlYXQ9ImZpZWxkIGluIHBhZ2UuZmllbGRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1zaG93PSJzZWxlY3RlZEl0ZW0gPT0gZmllbGQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPSJyZW1vdmVJdGVtKHBhZ2UuZmllbGRzLCAkaW5kZXgpOyI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctaW5jbHVkZT0iZmllbGQudHlwZSsnLWZpZWxkLmh0bWwnIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTIiPgogICAgICAgICAgICA8ZGl2IG5nLWlmPSJzZWxlY3RlZEl0ZW0iPgogICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3tvcHRpb25zZm9ybS50aXRsZX19PC9sYWJlbD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9ImZpZWxkIGluIG9wdGlvbnNmb3JtLmZpZWxkcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZCBpdGVtPSJmaWVsZCIgdmFsPSJzZWxlY3RlZEl0ZW1bZmllbGQubmFtZV0iPjwvZmllbGQ+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBzdHlsZT0iY2xlYXI6IGJvdGg7Ij48L2Rpdj4KCiAgICA8ZGl2PgogICAgICAgIDxidXR0b24gaWQ9InNhdmVfcGFnZV9idXR0b24iIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MiIG5nLWNsaWNrPSJzYXZlUGFnZSgpIj5TYXZlIFBhZ2U8L2J1dHRvbj4KICAgIDwvZGl2PgogICAgPGRpdj4KICAgICAgICA8bGFiZWw+RGF0YTwvbGFiZWw+CgogICAgICAgIDxwPnt7cGFnZX19PC9wPgogICAgPC9kaXY+CgogICAgPGRpdj4KICAgICAgICA8bGFiZWw+UmVzdWx0PC9sYWJlbD4KCiAgICAgICAgPHA+e3tyZXN1bHR9fTwvcD4KICAgIDwvZGl2PgoKPC9kaXY+Cg==')
},
{
'name': '/app/lib/cosmos/partials/adduser.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgIDxoMyBjbGFzcz0ibW9kYWwtdGl0bGUiIG5nLXNob3c9IiFpc1VwZGF0aW5nIj5DcmVhdGUgbmV3IHVzZXI8L2gzPgogICAgPGgzIGNsYXNzPSJtb2RhbC10aXRsZSIgbmctc2hvdz0iaXNVcGRhdGluZyI+VXBkYXRlIHVzZXI8L2gzPgo8L2Rpdj4KPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICA8Zm9ybSBjbGFzcz0iZm9ybS1ob3Jpem9udGFsIiByb2xlPSJmb3JtIj4KICAgICAgICA8ZGl2IG5nLXNob3c9Imhhc2Vycm9yIj5UaGVyZSBpcyBhbiBlcnJvciEhITwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbC1zbS0zIGNvbnRyb2wtbGFiZWwiPlVzZXJuYW1lPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5nLW1vZGVsPSJ1c2VyLnVzZXJuYW1lIiBuZy1yZWFkb25seT0iaXNVcGRhdGluZyI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbC1zbS0zIGNvbnRyb2wtbGFiZWwiPlBhc3N3b3JkPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InBhc3N3b3JkIiBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1tb2RlbD0idXNlci5wYXNzd29yZCIgbmctc2hvdz0iIWlzVXBkYXRpbmciIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5nLW1vZGVsPSJ1c2VyLnBhc3N3b3JkIiAgbmctc2hvdz0iaXNVcGRhdGluZyIKICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iTGVhdmUgYmxhbmsgdG8ga2VlcCBjdXJyZW50IHBhc3N3b3JkIiAvPgoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29sLXNtLTMgY29udHJvbC1sYWJlbCI+UGFzc3dvcmQgYWdhaW48L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5nLW1vZGVsPSJ1c2VyLnBhc3N3b3JkX3JlIiBuZy1zaG93PSIhaXNVcGRhdGluZyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5nLW1vZGVsPSJ1c2VyLnBhc3N3b3JkX3JlIiBuZy1zaG93PSJpc1VwZGF0aW5nIgogICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJMZWF2ZSBibGFuayB0byBrZWVwIGN1cnJlbnQgcGFzc3dvcmQiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbC1zbS0zIGNvbnRyb2wtbGFiZWwiPkVtYWlsPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImVtYWlsIiBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1tb2RlbD0idXNlci5lbWFpbCI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2wtc20tMiBjb250cm9sLWxhYmVsIj5Sb2xlczwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS0xMCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLWhvdmVyIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TSUQ8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGg+Jm5ic3A7PC90aD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9InJvbGVfc2lkIGluIHVzZXIucm9sZXMiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHNwYW4+e3tnZXRSb2xlTmFtZShyb2xlX3NpZCk7fX08L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxzcGFuPnt7cm9sZV9zaWR9fTwvc3Bhbj4gPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciIgbmctY2xpY2s9InJlbW92ZVJvbGUoJGluZGV4KSI+eDwvYnV0dG9uPiA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1tb2RlbD0ic2VsZWN0ZWRfcm9sZSIgbmctb3B0aW9ucz0icm9sZS5zaWQgYXMgcm9sZS5uYW1lIGZvciByb2xlIGluIHJvbGVzIj48L3NlbGVjdD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYWRkLXVzZXItYWRkLXJvbGUtYnRuIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBuZy1jbGljaz0iYWRkUm9sZShzZWxlY3RlZF9yb2xlKSI+QWRkPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgPGJ1dHRvbiBpZD0iYWRkLXVzZXItb2stYnRuIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBuZy1jbGljaz0ib2soKSI+T0s8L2J1dHRvbj4KICAgIDxidXR0b24gaWQ9ImFkZC11c2VyLWNhbmNlbC1idG4iICBjbGFzcz0iYnRuIGJ0bi13YXJuaW5nIiBuZy1jbGljaz0iY2FuY2VsKCkiPkNhbmNlbDwvYnV0dG9uPgo8L2Rpdj4=')
},
{
'name': '/app/lib/cosmos/partials/roles.html', 'data': base64.b64decode(b'ICAgIDxkaXYgY2xhc3M9Im5hdmJhciBuYXZiYXItaW52ZXJzZSBuYXZiYXItZml4ZWQtdG9wIiByb2xlPSJuYXZpZ2F0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8jL3Rlcm1pbmFsLyI+VGVybWluYWw8L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItY29sbGFwc2UgY29sbGFwc2UiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXYgbmF2YmFyLW5hdiI+CiAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii8jL2FwcHN0dWRpby8iPkFwcCBTdHVkaW88L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iIy91c2VycyI+VXNlcnM8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iIy9yb2xlcyI+Um9sZXM8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+IDxhIGhyZWY9Ii9sb2dvdXQvIj5Mb2dvdXQgW3t7dXNlck5hbWV9fV08L2E+IDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpIG5nLXNob3c9IiFsb2dnZWRJbigpIj48YSBocmVmPSIvIy9sb2dpbi8/cmVkaXJlY3Q9L3Rlcm1pbmFsLyI+TG9naW48L2E+PC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cgo8ZGl2IGNsYXNzPSJjb250YWluZXIgdGhlbWUtc2hvd2Nhc2UiIHJvbGU9Im1haW4iPgogICAgPGRpdiBuZy1zaG93PSJoYXNFcnJvciIgY2xhc3M9ImJnLXdhcm5pbmciPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IiBuZy1jbGljaz0iY2xlYXJFcnJvcigpOyI+PC9idXR0b24+CiAgICAgICAgPGRpdj48bGFiZWw+RXJyb3IgY29kZTo8L2xhYmVsPjxzcGFuIG5nLWJpbmQ9InN0YXR1cyIgLz48L2Rpdj4KICAgICAgICA8ZGl2IG5nLWJpbmQ9InN0YXR1c19kYXRhIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxoMz5Sb2xlczwvaDM+CgogICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSI+CiAgICAgICAgPHRoZWFkPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGg+U0lEPC90aD4KICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD4KICAgICAgICAgICAgICAgIDx0aD4mbmJzcDs8L3RoPgogICAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGhlYWQ+CiAgICAgICAgPHRib2R5PgogICAgICAgIDx0ciBuZy1yZXBlYXQ9InJvbGUgaW4gcm9sZXMiPgogICAgICAgICAgICA8dGQ+e3tyb2xlLnNpZH19PC90ZD48dGQ+e3tyb2xlLm5hbWV9fTwvdGQ+CiAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLXdhcm5pbmcgZ2x5cGhpY29uIGdseXBoaWNvbi1lZGl0IiBuZy1jbGljaz0iZWRpdFJvbGUoJGluZGV4KTsiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0icmVtb3ZlLXJvbGUte3tyb2xlLnNpZH19IiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIiBuZy1jbGljaz0icmVtb3ZlUm9sZSgkaW5kZXgpOyI+PC9idXR0b24+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8L3Rib2R5PgogICAgPC90YWJsZT4KCiAgICA8YnV0dG9uIGlkPSJjcmVhdGUtcm9sZS1idG4iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG5nLWNsaWNrPSJhZGRSb2xlKCdsZycpIj5DcmVhdGUgcm9sZTwvYnV0dG9uPgo8L2Rpdj4=')
},
{
'name': '/app/lib/cosmos/partials/singleitemview.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0iY29udGFpbmVyIHRoZW1lLXNob3djYXNlIiByb2xlPSJtYWluIj4KICAgIDxvYmplY3R2aWV3IGNvbmZpZy1pZD0iY29uZmlnSWQiIGl0ZW0taWQ9Iml0ZW1JZCIgLz4KPC9kaXY+')
},
{
'name': '/app/lib/cosmos/partials/addrole.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgIDxoMyBjbGFzcz0ibW9kYWwtdGl0bGUiIG5nLXNob3c9IiFpc1VwZGF0aW5nIj5DcmVhdGUgbmV3IHJvbGU8L2gzPgogICAgPGgzIGNsYXNzPSJtb2RhbC10aXRsZSIgbmctc2hvdz0iaXNVcGRhdGluZyI+VXBkYXRlIHJvbGU8L2gzPgo8L2Rpdj4KPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICA8Zm9ybSBjbGFzcz0iZm9ybS1ob3Jpem9udGFsIiByb2xlPSJmb3JtIj4KICAgICAgICA8ZGl2IG5nLXNob3c9Imhhc2Vycm9yIj5UaGVyZSBpcyBhbiBlcnJvciEhITwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbC1zbS0yIGNvbnRyb2wtbGFiZWwiPk5hbWUgKjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS00Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1tb2RlbD0icm9sZS5uYW1lIiBwbGFjZWhvbGRlcj0iUm9sZSBuYW1lIj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29sLXNtLTIgY29udHJvbC1sYWJlbCI+U0lEPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTgiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiICBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1tb2RlbD0icm9sZS5zaWQiIG5nLXJlYWRvbmx5PSJpc1VwZGF0aW5nIiBwbGFjZWhvbGRlcj0iT3B0aW9uYWwsIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGxlZnQgZW1wdHkiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2wtc20tMiBjb250cm9sLWxhYmVsIj5Sb2xlIGl0ZW1zPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTEwIj4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ob3ZlciI+CiAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGg+QWNjZXNzIHR5cGU8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImNvbC14cy0yIj5PYmplY3QgbmFtZTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iY29sLXhzLTIiPlByb3BlcnR5PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFjY2VzczwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4mbmJzcDs8L3RoPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9InJvbGVfaXRlbSBpbiByb2xlLnJvbGVfaXRlbXMiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHNlbGVjdCBpZD0icm9sZS1pdGVtLXt7JGluZGV4fX0tdHlwZSIgY2xhc3M9ImZvcm0tY29udHJvbCIgbmctbW9kZWw9InJvbGVfaXRlbS50eXBlIiBuZy1vcHRpb25zPSJhY2Nlc3NfdHlwZS5uYW1lIGFzIGFjY2Vzc190eXBlLmRpc3BsYXkgZm9yIGFjY2Vzc190eXBlIGluIGFjY2Vzc190eXBlcyI+PC9zZWxlY3Q+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2wteHMtMiI+PGlucHV0IGlkPSJyb2xlLWl0ZW0te3skaW5kZXh9fS1vYmplY3QtbmFtZSIgY2xhc3M9ImZvcm0tY29udHJvbCIgdHlwZT0idGV4dCIgbmctbW9kZWw9InJvbGVfaXRlbS5vYmplY3RfbmFtZSIgLz4gPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2wteHMtMiI+PGlucHV0IGlkPSJyb2xlLWl0ZW0te3skaW5kZXh9fS1wcm9wZXJ0eS1uYW1lIiBjbGFzcz0iZm9ybS1jb250cm9sIiB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0icm9sZV9pdGVtLnByb3BlcnR5X25hbWUiIC8+IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0icm9sZS1pdGVtLXt7JGluZGV4fX0tYWNjZXNzLWJpdHMtcmVhZCIgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJyb2xlX2l0ZW0uYWNjZXNzX2JpdHMucmVhZCIgLz4gUmVhZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJyb2xlLWl0ZW0te3skaW5kZXh9fS1hY2Nlc3MtYml0cy1pbnNlcnQiIHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0icm9sZV9pdGVtLmFjY2Vzc19iaXRzLmluc2VydCIgLz4gSW5zZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InJvbGUtaXRlbS17eyRpbmRleH19LWFjY2Vzcy1iaXRzLXdyaXRlIiB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9InJvbGVfaXRlbS5hY2Nlc3NfYml0cy53cml0ZSIgLz4gV3JpdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0icm9sZS1pdGVtLXt7JGluZGV4fX0tYWNjZXNzLWJpdHMtZGVsZXRlIiB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9InJvbGVfaXRlbS5hY2Nlc3NfYml0cy5kZWxldGUiIC8+IERlbGV0ZQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGJ1dHRvbiBpZD0icmVtb3ZlLXJvbGUtaXRlbS17eyRpbmRleH19LWJ0biIgIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1kYW5nZXIiIG5nLWNsaWNrPSJyZW1vdmVSb2xlSXRlbSgkaW5kZXgpIj54PC9idXR0b24+IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij48YnV0dG9uIGlkPSJhZGQtcm9sZS1pdGVtLWJ0biIgY2xhc3M9ImJ0biBidG4taW5mbyBidG4tc20iIG5nLWNsaWNrPSJhZGRSb2xlSXRlbSgpIj5BZGQ8L2J1dHRvbj4gPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgPGJ1dHRvbiBpZD0iYWRkLXJvbGUtb2stYnRuIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBuZy1jbGljaz0ib2soKSI+T0s8L2J1dHRvbj4KICAgIDxidXR0b24gaWQ9ImFkZC1yb2xlLWNhbmNlbC1idG4iIGNsYXNzPSJidG4gYnRuLXdhcm5pbmciIG5nLWNsaWNrPSJjYW5jZWwoKSI+Q2FuY2VsPC9idXR0b24+CjwvZGl2Pg==')
},
{
'name': '/app/lib/cosmos/partials/users.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1pbnZlcnNlIG5hdmJhci1maXhlZC10b3AiIHJvbGU9Im5hdmlnYXRpb24iPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgICAgPGEgY2xhc3M9Im5hdmJhci1icmFuZCIgaHJlZj0iLyMvdGVybWluYWwvIj5UZXJtaW5hbDwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItY29sbGFwc2UgY29sbGFwc2UiPgogICAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItbmF2Ij4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIvIy9hcHBzdHVkaW8vIj5BcHAgU3R1ZGlvPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iIy91c2VycyI+VXNlcnM8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSJsb2dnZWRJbigpIj48YSBocmVmPSIjL3JvbGVzIj5Sb2xlczwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpIG5nLXNob3c9ImxvZ2dlZEluKCkiPjxhIGhyZWY9Ii9sb2dvdXQvIj5Mb2dvdXQgW3t7dXNlck5hbWV9fV08L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSIhbG9nZ2VkSW4oKSI+PGEgaHJlZj0iLyMvbG9naW4vP3JlZGlyZWN0PS90ZXJtaW5hbC8iPkxvZ2luPC9hPjwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJjb250YWluZXIgdGhlbWUtc2hvd2Nhc2UiIHJvbGU9Im1haW4iPgogICAgPGRpdiBuZy1zaG93PSJoYXNFcnJvciIgY2xhc3M9ImJnLXdhcm5pbmciPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IiBuZy1jbGljaz0iY2xlYXJFcnJvcigpOyI+PC9idXR0b24+CiAgICAgICAgPGRpdj48bGFiZWw+RXJyb3IgY29kZTo8L2xhYmVsPjxzcGFuIG5nLWJpbmQ9InN0YXR1cyIvPjwvZGl2PgogICAgICAgIDxkaXYgbmctYmluZD0ic3RhdHVzX2RhdGEiPjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgzPlVzZXJzPC9oMz4KCiAgICA8dGFibGUgY2xhc3M9InRhYmxlIj4KICAgICAgICA8dGhlYWQ+CiAgICAgICAgPHRyPgogICAgICAgICAgICA8dGg+TmFtZTwvdGg+CiAgICAgICAgICAgIDx0aD5FbWFpbDwvdGg+CiAgICAgICAgICAgIDx0aD4mbmJzcDs8L3RoPgogICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+CiAgICAgICAgPHRyIG5nLXJlcGVhdD0idXNlciBpbiB1c2VycyI+CiAgICAgICAgICAgIDx0ZD57e3VzZXIudXNlcm5hbWV9fTwvdGQ+CiAgICAgICAgICAgIDx0ZD57e3VzZXIuZW1haWx9fTwvdGQ+CiAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImVkaXQtdXNlci17e3VzZXIudXNlcm5hbWV9fSIgIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi13YXJuaW5nIGdseXBoaWNvbiBnbHlwaGljb24tZWRpdCIKICAgICAgICAgICAgICAgICAgICAgICAgbmctY2xpY2s9ImVkaXRVc2VyKCRpbmRleCk7Ij48L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9InJlbW92ZS11c2VyLXt7dXNlci51c2VybmFtZX19IiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIgogICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz0icmVtb3ZlVXNlcigkaW5kZXgpOyI+PC9idXR0b24+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8L3Rib2R5PgogICAgPC90YWJsZT4KCiAgICA8YnV0dG9uIGlkPSJjcmVhdGUtdXNlci1idG4iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG5nLWNsaWNrPSJhZGRVc2VyKCdsZycpIj5DcmVhdGUgdXNlcjwvYnV0dG9uPgo8L2Rpdj4=')
},
{
'name': '/app/lib/cosmos/partials/item-design.html', 'data': base64.b64decode(b'PHN0eWxlPgppbnB1dC5uZy1pbnZhbGlkCnsKICAgIGJvcmRlcjoxcHggc29saWQgI0MwMDsKfQo8L3N0eWxlPgoKPGRpdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1pbnZlcnNlIG5hdmJhci1maXhlZC10b3AiIHJvbGU9Im5hdmlnYXRpb24iPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgICAgPGEgY2xhc3M9Im5hdmJhci1icmFuZCIgaHJlZj0iLyMvYXBwc3R1ZGlvLyI+QXBwIFN0dWRpbzwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItY29sbGFwc2UgY29sbGFwc2UiPgogICAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItbmF2Ij4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIvIy9hcHBzdHVkaW8vIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLyMvdGVybWluYWwvIj5UZXJtaW5hbDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpIG5nLXNob3c9ImxvZ2dlZEluKCkiPjxhIGhyZWY9IiMvdXNlcnMiPlVzZXJzPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iIy9yb2xlcyI+Um9sZXM8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSJsb2dnZWRJbigpIj48YSBocmVmPSIvbG9nb3V0LyI+TG9nb3V0IFt7e3VzZXJOYW1lfX1dPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0iIWxvZ2dlZEluKCkiPjxhIGhyZWY9Ii8jL2xvZ2luP3JlZGlyZWN0PS9hcHBzdHVkaW8vIj5Mb2dpbjwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBuZy1pbml0PSJpbml0KCkiIGNsYXNzPSJjb250YWluZXIgdGhlbWUtc2hvd2Nhc2UiIHJvbGU9Im1haW4iPgogICAgPGxhYmVsPi97e2l0ZW1UeXBlfX0ve3thcHBQYXRofX0vPC9sYWJlbD48bGFiZWwgbmctc2hvdz0iaXRlbUlkIiBpZD0iaXRlbV9pZF9sYWJlbCI+e3tpdGVtSWR9fTwvbGFiZWw+CiAgICA8aHIgLz4KCiAgICA8Zm9ybSBuYW1lPSJpdGVtY29uZmlnZm9ybSIgbm92YWxpZGF0ZSBjbGFzcz0iZm9ybS1ob3Jpem9udGFsIiBuZy1pZiA9ICJyZWFkeSI+CiAgICAgICAgPGRpdiBuZy1pZj0iaXRlbVR5cGUgPT09ICd3aWRnZXQnIj4KICAgICAgICAgICAgPGZpZWxkIHR5cGU9ImZvcm0iIGl0ZW09IndpZGdldEVkaXRvckZvcm0iIHZhbD0id2lkZ2V0Ij48L2ZpZWxkPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgbmctaWY9Iml0ZW1UeXBlID09PSAnbGlzdCciPgogICAgICAgICAgICA8ZmllbGQgdHlwZT0iZm9ybSIgaXRlbT0ibGlzdEVkaXRvckZvcm0iIHZhbD0ibGlzdCI+PC9maWVsZD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBuZy1pZj0iaXRlbVR5cGUgPT09ICdjaGFydCciPgogICAgICAgICAgICA8ZmllbGQgdHlwZT0iZm9ybSIgaXRlbT0iY2hhcnRjb25maWdFZGl0b3JGb3JtIiB2YWw9ImNoYXJ0Ij48L2ZpZWxkPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IG5nLWlmPSJpdGVtVHlwZSA9PT0gJ21lbnUnIj4KICAgICAgICAgICAgPGZpZWxkIHR5cGU9ImZvcm0iIGl0ZW09Im1lbnVFZGl0b3JGb3JtIiB2YWw9Im1lbnUiPjwvZmllbGQ+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgbmctaWY9Iml0ZW1UeXBlID09PSAnc2luZ2xlaXRlbXZpZXcnIj4KICAgICAgICAgICAgPGZpZWxkIHR5cGU9ImZvcm0iIGl0ZW09InNpbmdsZWl0ZW1jb25maWdFZGl0b3JGb3JtIiB2YWw9InNpbmdsZWl0ZW12aWV3Ij48L2ZpZWxkPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IG5nLWlmPSJpdGVtVHlwZSA9PT0gJ2FwcCciPgogICAgICAgICAgICA8ZmllbGQgdHlwZT0iZm9ybSIgaXRlbT0iYXBwRWRpdG9yRm9ybSIgdmFsPSJhcHAiPjwvZmllbGQ+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgbmctaWY9Iml0ZW1UeXBlID09PSAnc291cmNlZmlsZXMnIj4KICAgICAgICAgICAgPGZpZWxkIGl0ZW09J3sidHlwZSI6ImlucHV0IiwgInJlcXVpcmVkIjp0cnVlLCAibmFtZSI6ImZpbGVuYW1lIiwgImxhYmVsIjoiRmlsZSBuYW1lIn0nIHZhbD0ic291cmNlZmlsZXMuZmlsZW5hbWUiPjwvZmllbGQ+CiAgICAgICAgICAgIDxmaWVsZCBpdGVtPSd7InR5cGUiOiJpbnB1dCIsICJyZXF1aXJlZCI6dHJ1ZSwgIm5hbWUiOiJtb2R1bGVuYW1lIiwgImxhYmVsIjoiTW9kdWxlIG5hbWUifScgdmFsPSJzb3VyY2VmaWxlcy5mdWxsbmFtZSI+PC9maWVsZD4KICAgICAgICAgICAgPGZpZWxkIG5nLWlmPSJzb3VyY2VmaWxlcy50eXBlPT09J2dyaWRmaWxlJyIgaXRlbT0neyJ0eXBlIjoiY29kZWVkaXRvciIsICJyZXF1aXJlZCI6dHJ1ZSwgImxhYmVsIjoiU291cmNlIGNvZGUiLCAibmFtZSI6ImNvZGUifScgdmFsPSJzb3VyY2UuY29kZSI+PC9maWVsZD4KICAgICAgICAgICAgPGZpZWxkIG5nLWlmPSJzb3VyY2VmaWxlcy50eXBlPT09J2VtYmVkZGVkJyIgaXRlbT0neyJ0eXBlIjoiY29kZWVkaXRvciIsICJsYWJlbCI6IlNvdXJjZSBjb2RlIiwgIm5hbWUiOiJjb2RlIn0nIHZhbD0ic291cmNlZmlsZXMuY29kZSI+PC9maWVsZD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBuZy1pZj0iaXRlbVR5cGUgPT09ICdpbnRlcmNlcHRvciciPgogICAgICAgICAgICA8ZmllbGQgdHlwZT0iZm9ybSIgaXRlbT0iaW50ZXJjZXB0b3JFZGl0b3JGb3JtIiB2YWw9ImludGVyY2VwdG9yIj48L2ZpZWxkPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IG5nLWlmPSJpdGVtVHlwZSA9PT0gJ2FwcGVuZHBvaW50JyI+CiAgICAgICAgICAgIDxmaWVsZCB0eXBlPSJmb3JtIiBpdGVtPSJhcHBlbmRwb2ludEVkaXRvckZvcm0iIHZhbD0iYXBwZW5kcG9pbnQiPjwvZmllbGQ+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJjcmVhdGVfaXRlbV9idG4iIG5nLWRpc2FibGVkPSIhKGl0ZW1jb25maWdmb3JtLiR2YWxpZCkiIG5nLWNsaWNrPSJzYXZlSXRlbSgpIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5TYXZlIHt7aXRlbVR5cGV9fTwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9mb3JtPgo8L2Rpdj4=')
},
{
'name': '/app/lib/cosmos/partials/browsefile.html', 'data': base64.b64decode(b'PHN0eWxlPgouZmlsZS1saXN0IHsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9Ci5maWxlLXNlbGVjdG9yewogICAgbWFyZ2luOiA1cHg7Cn0KICAgLnNlbGVjdGVkewogICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0RERDsKICAgfQo8L3N0eWxlPgoKPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgIDxoMyBjbGFzcz0ibW9kYWwtdGl0bGUiID5TZWxlY3QgYSBmaWxlPC9oMz4KPC9kaXY+CjxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgPGRpdj4KICAgICAgICA8ZGl2IG5nLWJpbmQ9ImZpbGVPYmplY3ROYW1lIj48L2Rpdj4KICAgICAgICA8ZGl2IG5nLXNob3c9Imhhc0Vycm9yIiBjbGFzcz0iYmctd2FybmluZyI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IiBuZy1jbGljaz0iY2xlYXJFcnJvcigpOyI+PC9idXR0b24+CiAgICAgICAgICAgIDxkaXY+PGxhYmVsPkVycm9yIGNvZGU6PC9sYWJlbD48c3BhbiBuZy1iaW5kPSJzdGF0dXMiPjwvc3Bhbj48L2Rpdj4KICAgICAgICAgICAgPGRpdiBuZy1iaW5kPSJzdGF0dXNfZGF0YSI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iaUZyYW1lUGxhY2Vob2xkZXIiPjwvZGl2PgogICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aD5GaWxlIElkPC90aD4KICAgICAgICAgICAgICAgIDx0aD5GaWxlIHNpemU8L3RoPgogICAgICAgICAgICAgICAgPHRoPkZpbGUgbmFtZTwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RmlsZSBNRDU8L3RoPgogICAgICAgICAgICAgICAgPHRoPiZuYnNwOzwvdGg+CiAgICAgICAgICAgICAgICA8dGg+Jm5ic3A7PC90aD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICA8dHIgbmctcmVwZWF0PSJmaWxlIGluIHVwbG9hZGVkX2ZpbGVzIiBuZy1jbGljaz0ic2VsZWN0RmlsZShmaWxlKSIgbmctY2xhc3M9IihmaWxlLmZpbGVfaWQgPT0gc2VsZWN0ZWRGaWxlLmZpbGVfaWQpPydzZWxlY3RlZCc6JyciPgogICAgICAgICAgICAgICAgPHRkPnt7ZmlsZS5maWxlX2lkfX08L3RkPgogICAgICAgICAgICAgICAgPHRkPnt7ZmlsZS5sZW5ndGh9fTwvdGQ+PHRkPnt7ZmlsZS5maWxlbmFtZX19PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD57e2ZpbGUubWQ1fX08L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1zdWNjZXNzIGdseXBoaWNvbiBnbHlwaGljb24tZG93bmxvYWQiIGhyZWY9Ii9ncmlkZnMve3tmaWxlLmNvbGxlY3Rpb25fbmFtZX19L3t7ZmlsZS5maWxlX2lkfX0vIj48L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSIgbmctY2xpY2s9InJlbW92ZUZpbGUoJGluZGV4KSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3Rib2R5PgogICAgICAgIDwvdGFibGU+CiAgICAgICAgPGZvcm0gbmctaW5pdD0ic2V0QWN0aW9uKCkiIGlkPSJ1cGxvYWRGb3JtIiBuYW1lPSJ1cGxvYWRGb3JtIiBtZXRob2Q9J1BPU1QnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnIHRhcmdldD0nc3VibWl0LWlmcmFtZScgYWN0aW9uPSIvZ3JpZGZzLyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtbGlzdCIgaWQ9ImZpbGVMaXN0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZmlsZS1zZWxlY3RvciIgbmFtZT0idXBsb2FkZWRmaWxlIiB0eXBlPSJmaWxlIiBvbmNoYW5nZT0iYW5ndWxhci5lbGVtZW50KHRoaXMpLnNjb3BlKCkuZmlsZU5hbWVDaGFuZ2VkKHRoaXMpIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiAgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBnbHlwaGljb24gZ2x5cGhpY29uLWNsb3VkLXVwbG9hZCIgbmctY2xpY2s9InVwbG9hZEZpbGUoKSIgPiBVcGxvYWQgPC9idXR0b24+CiAgICAgICAgPC9mb3JtPgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgIDxidXR0b24gbmctZGlzYWJsZWQ9IiFzZWxlY3RlZEZpbGUiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG5nLWNsaWNrPSJvaygpIj5PSzwvYnV0dG9uPgogICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi13YXJuaW5nIiBuZy1jbGljaz0iY2FuY2VsKCkiPkNhbmNlbDwvYnV0dG9uPgo8L2Rpdj4=')
},
{
'name': '/app/lib/cosmos/partials/filemanager.html', 'data': base64.b64decode(b'PHN0eWxlPgogICAgLmZpbGUtbGlzdCB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDEwcHg7CiAgICB9CgogICAgLmZpbGUtc2VsZWN0b3IgewogICAgICAgIG1hcmdpbjogNXB4OwogICAgfQoKICAgIC5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0RERDsKICAgIH0KPC9zdHlsZT4KCjxkaXYgY2xhc3M9Im5hdmJhciBuYXZiYXItaW52ZXJzZSBuYXZiYXItZml4ZWQtdG9wIiByb2xlPSJuYXZpZ2F0aW9uIj4KICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICAgICAgICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8jL2ZpbGVtYW5hZ2VyLyI+RmlsZSBNYW5hZ2VyPC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1jb2xsYXBzZSBjb2xsYXBzZSI+CiAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii8jL3Rlcm1pbmFsLyI+VGVybWluYWw8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIvIy9hcHBzdHVkaW8vIj5BcHAgU3R1ZGlvPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iIy91c2VycyI+VXNlcnM8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSJsb2dnZWRJbigpIj48YSBocmVmPSIjL3JvbGVzIj5Sb2xlczwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpIG5nLXNob3c9ImxvZ2dlZEluKCkiPjxhIGhyZWY9Ii9sb2dvdXQvIj5Mb2dvdXQgW3t7dXNlck5hbWV9fV08L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSIhbG9nZ2VkSW4oKSI+PGEgaHJlZj0iLyMvbG9naW4vP3JlZGlyZWN0PS90ZXJtaW5hbC8iPkxvZ2luPC9hPjwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJjb250YWluZXIgdGhlbWUtc2hvd2Nhc2UiIHJvbGU9Im1haW4iIG5nLWluaXQ9ImluaXQoKTsiPgogICAgPHA+PC9wPgogICAgPGRpdj4KICAgICAgICA8ZGl2IG5nLXNob3c9Imhhc0Vycm9yIiBjbGFzcz0iYmctd2FybmluZyI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4teHMgYnRuLWRhbmdlciBnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZSBwdWxsLXJpZ2h0IgogICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPSJjbGVhckVycm9yKCk7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGRpdj48bGFiZWw+RXJyb3IgY29kZTo8L2xhYmVsPjxzcGFuIG5nLWJpbmQ9InN0YXR1cyI+PC9zcGFuPjwvZGl2PgogICAgICAgICAgICA8ZGl2IG5nLWJpbmQ9InN0YXR1c19kYXRhIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzID0gcm93PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5nLW1vZGVsPSJmaWxlT2JqZWN0TmFtZSIgcGxhY2Vob2xkZXI9IkZpbGUgb2JqZWN0IG5hbWUgbGlrZSBhbm5pdmVyc2FyeS5waG90b3MiLz4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5wdXQtZ3JvdXAtYnRuIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB0eXBlPSJidXR0b24iIG5nLWNsaWNrPSJyZWZyZXNoKCk7Ij5SZWZyZXNoPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+PCEtLSAvaW5wdXQtZ3JvdXAgLS0+CiAgICAgICAgICAgIDwvZGl2PjwhLS0gLy5jb2wtbGctNiAtLT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJpRnJhbWVQbGFjZWhvbGRlciI+PC9kaXY+CiAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSI+CiAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpbGUgSWQ8L3RoPgogICAgICAgICAgICAgICAgPHRoPkZpbGUgc2l6ZTwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RmlsZSBuYW1lPC90aD4KICAgICAgICAgICAgICAgIDx0aD5GaWxlIE1ENTwvdGg+CiAgICAgICAgICAgICAgICA8dGg+Jm5ic3A7PC90aD4KICAgICAgICAgICAgICAgIDx0aD4mbmJzcDs8L3RoPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9ImZpbGUgaW4gdXBsb2FkZWRfZmlsZXMiIG5nLWNsaWNrPSJzZWxlY3RGaWxlKGZpbGUpIgogICAgICAgICAgICAgICAgbmctY2xhc3M9IihmaWxlLmZpbGVfaWQgPT0gc2VsZWN0ZWRGaWxlLmZpbGVfaWQpPydzZWxlY3RlZCc6JyciPgogICAgICAgICAgICAgICAgPHRkPnt7ZmlsZS5maWxlX2lkfX08L3RkPgogICAgICAgICAgICAgICAgPHRkPnt7ZmlsZS5sZW5ndGh9fTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+e3tmaWxlLmZpbGVuYW1lfX08L3RkPgogICAgICAgICAgICAgICAgPHRkPnt7ZmlsZS5tZDV9fTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ0biBidG4teHMgYnRuLXN1Y2Nlc3MgZ2x5cGhpY29uIGdseXBoaWNvbi1kb3dubG9hZCIKICAgICAgICAgICAgICAgICAgICAgICBocmVmPSJ7e3Jvb3RQYXRofX17e2ZpbGUuZmlsZU9iamVjdE5hbWV9fS97e2ZpbGUuZmlsZV9pZH19LyI+PC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1kYW5nZXIgZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz0icmVtb3ZlRmlsZSgkaW5kZXgpIj48L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgPC90YWJsZT4KICAgICAgICA8Zm9ybSBuZy1pbml0PSJzZXRBY3Rpb24oKSIgaWQ9InVwbG9hZEZvcm0iIG5hbWU9InVwbG9hZEZvcm0iIG1ldGhvZD0nUE9TVCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YScKICAgICAgICAgICAgICB0YXJnZXQ9J3N1Ym1pdC1pZnJhbWUnIGFjdGlvbj0ie3tyb290UGF0aH19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1saXN0IiBpZD0iZmlsZUxpc3QiPgogICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmaWxlLXNlbGVjdG9yIiBuYW1lPSJ1cGxvYWRlZGZpbGUiIHR5cGU9ImZpbGUiCiAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9ImFuZ3VsYXIuZWxlbWVudCh0aGlzKS5zY29wZSgpLmZpbGVOYW1lQ2hhbmdlZCh0aGlzKSIvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IGdseXBoaWNvbiBnbHlwaGljb24tY2xvdWQtdXBsb2FkIiBuZy1jbGljaz0idXBsb2FkRmlsZSgpIj4gVXBsb2FkPC9idXR0b24+CiAgICAgICAgPC9mb3JtPgogICAgPC9kaXY+CjwvZGl2Pgo=')
},
{
'name': '/app/lib/cosmos/partials/applist.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1pbnZlcnNlIG5hdmJhci1maXhlZC10b3AiIHJvbGU9Im5hdmlnYXRpb24iPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgICAgPGEgY2xhc3M9Im5hdmJhci1icmFuZCIgaHJlZj0iLyI+YmVlbmR1PC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1jb2xsYXBzZSBjb2xsYXBzZSI+CiAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii8jL2FwcHN0dWRpby8iPkFwcCBTdHVkaW88L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIvIy90ZXJtaW5hbC8iPlRlcm1pbmFsPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iIy91c2VycyI+VXNlcnM8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSJsb2dnZWRJbigpIj48YSBocmVmPSIjL3JvbGVzIj5Sb2xlczwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpIG5nLXNob3c9ImxvZ2dlZEluKCkiPjxhIGhyZWY9Ii9sb2dvdXQvIj5Mb2dvdXQgW3t7dXNlck5hbWV9fV08L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSIhbG9nZ2VkSW4oKSI+PGEgaHJlZj0iLyMvbG9naW4/cmVkaXJlY3Q9L2FwcHN0dWRpby8iPkxvZ2luPC9hPjwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IG5nLWluaXQ9ImluaXQoKSIgY2xhc3M9ImNvbnRhaW5lciB0aGVtZS1zaG93Y2FzZSIgcm9sZT0ibWFpbiI+CiAgICA8ZGl2IG5nLXNob3c9Imhhc0Vycm9yIiBjbGFzcz0iYmctd2FybmluZyI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIHB1bGwtcmlnaHQiIG5nLWNsaWNrPSJjbGVhckVycm9yKCk7Ij48L2J1dHRvbj4KICAgICAgICA8ZGl2PjxsYWJlbD5FcnJvciBjb2RlOjwvbGFiZWw+PHNwYW4gbmctYmluZD0ic3RhdHVzIiAvPjwvZGl2PgogICAgICAgIDxkaXYgbmctYmluZD0ic3RhdHVzX2RhdGEiPjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgzPkF2YWlsYWJsZSBBcHBsaWNhdGlvbnM8L2gzPgogICAgPGRpdiBuZy1yZXBlYXQ9ImFwcCBpbiBhcHBzIj4KICAgICAgICA8dGQ+PGEgaHJlZj0iIy9hL3t7YXBwLnBhdGh9fS8iPnt7YXBwLnRpdGxlfX08L2E+PC90ZD4KICAgIDwvZGl2Pgo8L2Rpdj4=')
},
{
'name': '/app/lib/cosmos/partials/message.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0iY29udGFpbmVyIHRoZW1lLXNob3djYXNlIiByb2xlPSJtYWluIj4KICAgIDxoMT57e21lc3NhZ2UudGl0bGV9fTwvaDE+CiAgICA8ZGl2Pnt7bWVzc2FnZS5tZXNzYWdlfX08L2Rpdj4KICAgIDxkaXY+e3ttZXNzYWdlLmRhdGF9fTwvZGl2Pgo8L2Rpdj4=')
},
{
'name': '/app/lib/cosmos/partials/formview.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0iY29udGFpbmVyIHRoZW1lLXNob3djYXNlIiByb2xlPSJtYWluIj4KICAgIDxmaWVsZCBpdGVtPSJmb3JtcmVmIiB2YWw9ImRhdGFJZCI+PC9maWVsZD4KPC9kaXY+Cg==')
},
{
'name': '/app/lib/cosmos/partials/form-design.html', 'data': base64.b64decode(b'PHN0eWxlPgogICAgLmxpc3QgewogICAgICAgIGxpc3Qtc3R5bGU6IG5vbmUgb3V0c2lkZSBub25lOwogICAgICAgIG1hcmdpbjogMTBweCAwIDMwcHg7CiAgICB9CgogICAgLmFwcHMtY29udGFpbmVyIHsKICAgICAgICBib3JkZXI6IDFweCBkYXNoZWQgbGlnaHRncmF5OwogICAgICAgIG1pbi1oZWlnaHQ6IDI0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxMjhweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsKICAgIH0KCiAgICAuZm9ybSB7CiAgICAgICAgbWluLXdpZHRoOiA2NTBweDsKICAgICAgICBtaW4taGVpZ2h0OiA2NHB4OwogICAgfQoKICAgIC5mb3JtIHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICB9CgogICAgLmZsb2F0bGVmdCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICB9CgogICAgLmZsb2F0cmlnaHQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgIH0KCiAgICAuY2xlYXIgewogICAgICAgIGNsZWFyOiBib3RoOwogICAgfQoKICAgIC5nZW4tZHluYW1pYy1kaXJlY3RpdmUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgfQoKICAgIC5iZWluZ0RyYWdnZWQgewogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAuNWVtICFpbXBvcnRhbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggZGFzaGVkICNjY2MgIWltcG9ydGFudDsKICAgIH0KICAgIC5wcm9wZXJ0aWVzewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgfQogICAgLnNldHRpbmdzLXRhYi1jb250YWluZXJ7CiAgICAgICAgbWluLXdpZHRoOiAzMDBweDsKICAgICAgICB3aWR0aDo0MDBweDsKICAgIH0KCjwvc3R5bGU+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJpbnB1dC1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8bGFiZWw+e3tmaWVsZC5sYWJlbH19PHNwYW4gbmctaWY9ImZpZWxkLnJlcXVpcmVkIj4mbmJzcDsqPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgPGlucHV0IG5nLWNsYXNzPSJmaWVsZC5jbGFzc05hbWUiIHR5cGU9Int7ZmllbGQuaHRtbHR5cGUgfHwgJ3RleHQnfX0iIG5hbWU9Int7ZmllbGQubW9kZWx9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiBkaXNhYmxlZD0iZGlzYWJsZWQiLz4KICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9InN0YXRpYy1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8bGFiZWw+e3tmaWVsZC5sYWJlbH19PC9sYWJlbD4KICAgICAgICA8aW5wdXQgbmctY2xhc3M9ImZpZWxkLmNsYXNzTmFtZSIgdHlwZT0idGV4dCIgbmFtZT0ie3tmaWVsZC5tb2RlbH19IiBuZy1tb2RlbD0iZmllbGQub3B0aW9ucy52YWx1ZSIvPgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0idGV4dGFyZWEtZmllbGQuaHRtbCI+CiAgICA8ZGl2IG5nLWNsaWNrPSJzZWxlY3RJdGVtKGZpZWxkKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyI+CiAgICAgICAgPGxhYmVsPnt7ZmllbGQubGFiZWx9fTwvbGFiZWw+CiAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJlZGl0b3IiIG5nLWNsYXNzPSJmaWVsZC5jbGFzc05hbWUiIG5hbWU9Int7ZmllbGQubW9kZWx9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiBkaXNhYmxlZD0iZGlzYWJsZWQiPjwvdGV4dGFyZWE+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJmaWxlY3RybC1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8bGFiZWw+e3tmaWVsZC5sYWJlbH19PC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctY2xhc3M9ImZpZWxkLmNsYXNzTmFtZSIgbmFtZT0ie3tmaWVsZC5tb2RlbH19IiByZWFkb25seT0icmVhZG9ubHkiIGRpc2FibGVkPSJkaXNhYmxlZCIgLz4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5Ij5Ccm93c2U8L2J1dHRvbj4KICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9ImNvZGVlZGl0b3ItZmllbGQuaHRtbCI+CiAgICA8ZGl2IG5nLWNsaWNrPSJzZWxlY3RJdGVtKGZpZWxkKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyI+CiAgICAgICAgPGxhYmVsPnt7ZmllbGQubGFiZWx9fTwvbGFiZWw+CiAgICAgICAgPGRpdiB1aS1hY2UgY2xhc3M9ImVkaXRvciIgbmctY2xhc3M9ImZpZWxkLmNsYXNzTmFtZSIgbmFtZT0ie3tmaWVsZC5tb2RlbH19IiByZWFkb25seT0icmVhZG9ubHkiIGRpc2FibGVkPSJkaXNhYmxlZCI+PC9kaXY+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJjaGVja2JveC1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLWNsYXNzPSJmaWVsZC5jbGFzc05hbWUiIG5hbWU9Int7ZmllbGQubW9kZWx9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiBkaXNhYmxlZD0iZGlzYWJsZWQiPgogICAgICAgIDxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCI+e3tmaWVsZC5sYWJlbH19PC9sYWJlbD4KICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9InJhZGlvZ3JvdXAtZmllbGQuaHRtbCI+CiAgICA8ZGl2IG5nLWNsaWNrPSJzZWxlY3RJdGVtKGZpZWxkKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyI+CiAgICAgICAgPGxhYmVsIGNsYXNzPSJjb250cm9sLWxhYmVsIj57e2ZpZWxkLmxhYmVsfX08L2xhYmVsPgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb21wb3NpdGUiIG5nLXJlcGVhdD0iY2hvaWNlIGluIGZpZWxkLm9wdGlvbnMuY2hvaWNlcyI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmctY2xhc3M9ImZpZWxkLmNsYXNzTmFtZSIgbmFtZT0ie3tmaWVsZC5tb2RlbH19IiBuZy12YWx1ZT0iY2hvaWNlLnZhbHVlIgogICAgICAgICAgICAgICAgICAgcmVhZG9ubHk9InJlYWRvbmx5IiBkaXNhYmxlZD0iZGlzYWJsZWQiPgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRyb2wtbGFiZWwiPnt7Y2hvaWNlLmxhYmVsfX08L2xhYmVsPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0ic2VsZWN0LWZpZWxkLmh0bWwiPgogICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmaWVsZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiPgogICAgICAgIDxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCI+e3tmaWVsZC5sYWJlbH19PC9sYWJlbD4KICAgICAgICA8c2VsZWN0IG5nLWNsYXNzPSJmaWVsZC5jbGFzc05hbWUiIG5hbWU9Int7ZmllbGQubW9kZWx9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiBkaXNhYmxlZD0iZGlzYWJsZWQiPgogICAgICAgICAgICA8b3B0aW9uIG5nLWlmPSJmaWVsZC5udWxsYWJsZSA9PT0gdHJ1ZSIgbmctdmFsdWU9IiI+IC0tLSBTZWxlY3QgLS0tPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gbmctdmFsdWU9Im9wdGlvbi52YWx1ZSIgbmctcmVwZWF0PSJjaG9pY2UgaW4gZmllbGQub3B0aW9ucy5jaG9pY2VzIj57e2Nob2ljZS5sYWJlbH19PC9vcHRpb24+CiAgICAgICAgPC9zZWxlY3Q+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJsb29rdXAtZmllbGQuaHRtbCI+CiAgICA8ZGl2IG5nLWNsaWNrPSJzZWxlY3RJdGVtKGZpZWxkKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyI+CiAgICAgICAgPGxhYmVsIGNsYXNzPSJjb250cm9sLWxhYmVsIj57e2ZpZWxkLmxhYmVsfX08L2xhYmVsPgogICAgICAgIDxzZWxlY3QgcmVhZG9ubHk9InJlYWRvbmx5IiBkaXNhYmxlZD0iZGlzYWJsZWQiPgogICAgICAgIDwvc2VsZWN0PgogICAgICAgIDxzZWxlY3QgbmctaGlkZT0iZmllbGQub3B0aW9ucy5zYXZlVmFsdWVPbmx5IiByZWFkb25seT0icmVhZG9ubHkiIGRpc2FibGVkPSJkaXNhYmxlZCI+CiAgICAgICAgPC9zZWxlY3Q+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJjb21wb3NpdGUtZmllbGQuaHRtbCI+CiAgICA8ZGl2IG5nLWNsaWNrPSJzZWxlY3RJdGVtKGZpZWxkKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyI+CiAgICAgICAgPGxhYmVsIGNsYXNzPSJjb250cm9sLWxhYmVsIj57e2ZpZWxkLmxhYmVsfX08L2xhYmVsPgogICAgICAgIDx1bCBuZy1pZj0iZmllbGQudHlwZSA9PT0gJ2NvbXBvc2l0ZScgfHwgZmllbGQudHlwZSA9PT0gJ2Zvcm0nIiBjbGFzcz0iYXBwcy1jb250YWluZXIiIHVpLXNvcnRhYmxlPSJzb3J0YWJsZU9wdGlvbnMiCiAgICAgICAgICAgIG5nLW1vZGVsPSJmaWVsZC5maWVsZHMiPgogICAgICAgICAgICA8bGkgY2xhc3M9ImlubmVyQ29udCIgbmctcmVwZWF0PSJmaWVsZCBpbiBmaWVsZC5maWVsZHMiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1zaG93PSJmaWVsZCA9PT0gc2VsZWN0ZWRJdGVtIiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIHB1bGwtcmlnaHQiIG5nLWNsaWNrPSJyZW1vdmVJdGVtKCRwYXJlbnQuZmllbGQuZmllbGRzLCAkaW5kZXgpOyI+PC9idXR0b24+CiAgICAgICAgICAgICAgICA8ZGl2IG5nLWluY2x1ZGU9ImZpZWxkLnR5cGUrJy1maWVsZC5odG1sJyI+PC9kaXY+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9ImNvbmRpdGlvbi1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRyb2wtbGFiZWwiPnt7ZmllbGQubGFiZWx9fTwvbGFiZWw+CiAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRyb2wtbGFiZWwiPklGPC9sYWJlbD4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iYXBwcy1jb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgdWktc29ydGFibGU9InNvcnRhYmxlT3B0aW9ucyIKICAgICAgICAgICAgICAgICAgICBuZy1tb2RlbD0iZmllbGQuZmllbGRzIj4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImlubmVyQ29udCIgbmctcmVwZWF0PSJmaWVsZCBpbiBmaWVsZC5maWVsZHMiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLXNob3c9ImZpZWxkID09PSBzZWxlY3RlZEl0ZW0iIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1kYW5nZXIgZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUgcHVsbC1yaWdodCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz0icmVtb3ZlSXRlbSgkcGFyZW50LmZpZWxkLmZpZWxkcywgJGluZGV4KTsiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLWluY2x1ZGU9ImZpZWxkLnR5cGUrJy1maWVsZC5odG1sJyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCI+RUxTRTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9ImFwcHMtY29udGFpbmVyIgogICAgICAgICAgICAgICAgICAgIHVpLXNvcnRhYmxlPSJzb3J0YWJsZU9wdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgbmctbW9kZWw9ImZpZWxkLmVsc2VmaWVsZHMiPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iaW5uZXJDb250IiBuZy1yZXBlYXQ9ImZpZWxkIGluIGZpZWxkLmVsc2VmaWVsZHMiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLXNob3c9ImZpZWxkID09PSBzZWxlY3RlZEl0ZW0iIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1kYW5nZXIgZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUgcHVsbC1yaWdodCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz0icmVtb3ZlSXRlbSgkcGFyZW50LmZpZWxkLmVsc2VmaWVsZHMsICRpbmRleCk7Ij48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1pbmNsdWRlPSJmaWVsZC50eXBlKyctZmllbGQuaHRtbCciPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJhcnJheS1maWVsZC5odG1sIj4KICAgIDxkaXYgbmctY2xpY2s9InNlbGVjdEl0ZW0oZmllbGQpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4KICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRyb2wtbGFiZWwiPnt7ZmllbGQubGFiZWx9fSBbIF08L2xhYmVsPgogICAgICAgIDx1bCBjbGFzcz0iYXBwcy1jb250YWluZXIiIHVpLXNvcnRhYmxlPSJzb3J0YWJsZU9wdGlvbnMiIG5nLW1vZGVsPSJmaWVsZC5maWVsZHMiPgogICAgICAgICAgICA8bGkgY2xhc3M9ImlubmVyQ29udCIgbmctcmVwZWF0PSJmaWVsZCBpbiBmaWVsZC5maWVsZHMiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1zaG93PSJmaWVsZCA9PT0gc2VsZWN0ZWRJdGVtIiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIHB1bGwtcmlnaHQiIG5nLWNsaWNrPSJyZW1vdmVJdGVtKCRwYXJlbnQuZmllbGQuZmllbGRzLCAkaW5kZXgpOyI+PC9idXR0b24+CiAgICAgICAgICAgICAgICA8ZGl2IG5nLWluY2x1ZGU9ImZpZWxkLnR5cGUrJy1maWVsZC5odG1sJyI+PC9kaXY+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9ImZpZWxkLW9wdGlvbnMuaHRtbCI+CiAgICA8ZGl2PgoKICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9ImNvbnRyb2wtdGFiLXRvb2xzLmh0bWwiPgogICAgPGRpdj4KICAgICAgICA8dWwgY2xhc3M9ImFwcHMtY29udGFpbmVyIGZpcnN0IiB1aS1zb3J0YWJsZT0ic29ydGFibGVUb29sc09wdGlvbnMiIG5nLW1vZGVsPSJjb21wb25lbnRzIj4KICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0iY29tcCBpbiBjb21wb25lbnRzIj4KICAgICAgICAgICAgICAgICB7e2NvbXAubGFiZWx9fQogICAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSJmb3JtLW9wdGlvbnMuaHRtbCI+CiAgICA8ZGl2PgogICAgICAgIDxsYWJlbD5BY3Rpb248L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic2VsZWN0ZWRJdGVtLmFjdGlvbiIgLz4KICAgIDwvZGl2PgogICAgPGRpdj4KICAgICAgICA8bGFiZWw+T24gc3VjY2VzczwvbGFiZWw+CiAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxsYWJlbD5UeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9InNlbGVjdGVkSXRlbS5vbnN1Y2Nlc3MudHlwZSIgbmctb3B0aW9ucz0ib3R5cGUubmFtZSBhcyBvdHlwZS5sYWJlbCBmb3Igb3R5cGUgaW4gb25zdWNjZXNzX3R5cGVzIj48L3NlbGVjdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8bGFiZWw+VmFsdWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzZWxlY3RlZEl0ZW0ub25zdWNjZXNzLnZhbHVlIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L3NjcmlwdD4KCjxkaXYgY2xhc3M9Im5hdmJhciBuYXZiYXItaW52ZXJzZSBuYXZiYXItZml4ZWQtdG9wIiByb2xlPSJuYXZpZ2F0aW9uIj4KICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+CiAgICAgICAgICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii9hcHBzdHVkaW8vIj5BcHAgU3R1ZGlvPC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1jb2xsYXBzZSBjb2xsYXBzZSI+CiAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii8jL2FwcHN0dWRpby8iPkhvbWU8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaSBuZy1zaG93PSJsb2dnZWRJbigpIj48YSBocmVmPSIvbG9nb3V0LyI+TG9nb3V0IFt7e3VzZXJOYW1lfX1dPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0iIWxvZ2dlZEluKCkiPjxhIGhyZWY9Ii8jL2xvZ2luLyI+TG9naW48L2E+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KCjxkaXYgbmctaW5pdD0iaW5pdCgpIiBjbGFzcz0iY29udGFpbmVyLWZsdWlkIj4KCiAgICA8ZGl2IG5nLXNob3c9Imhhc0Vycm9yIiBjbGFzcz0iYmctd2FybmluZyI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIHB1bGwtcmlnaHQiIG5nLWNsaWNrPSJjbGVhckVycm9yKCk7Ij48L2J1dHRvbj4KICAgICAgICA8ZGl2PjxsYWJlbD5FcnJvciBjb2RlOjwvbGFiZWw+PHNwYW4gbmctYmluZD0ic3RhdHVzIi8+PC9kaXY+CiAgICAgICAgPGRpdiBuZy1iaW5kPSJzdGF0dXNfZGF0YSI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgIGNsYXNzPSJyb3ciPgogICAgICAgICAgICA8bGFiZWw+Rm9ybSBJZDogPC9sYWJlbD48bGFiZWwgaWQ9ImZvcm1faWRfbGFiZWwiPnt7Zm9ybS5faWR9fTwvbGFiZWw+PGJyIC8+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTIiPgogICAgICAgICAgICA8dWwgY2xhc3M9ImFwcHMtY29udGFpbmVyIGZpcnN0IiB1aS1zb3J0YWJsZT0ic29ydGFibGVUb29sc09wdGlvbnMiIG5nLW1vZGVsPSJjb21wb25lbnRzIj4KICAgICAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9ImNvbXAgaW4gY29tcG9uZW50cyIgaWQ9InRvb2xfe3tjb21wLnR5cGV9fSI+CiAgICAgICAgICAgICAgICAgICAge3tjb21wLmxhYmVsfX0KICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTggcGFnZSI+CiAgICAgICAgPGRpdiBuZy1jbGljaz0ic2VsZWN0SXRlbShmb3JtKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyI+CiAgICAgICAgICAgIDxsYWJlbCBpZD0iZGVzaWduX3RpdGxlX2xhYmVsIiBjbGFzcz0iY29udHJvbC1sYWJlbCI+e3tmb3JtLnRpdGxlfX08L2xhYmVsPgogICAgICAgICAgICA8dWwgaWQ9ImRlc2lnbl9jYW52YXMiIGNsYXNzPSJhcHBzLWNvbnRhaW5lciIgdWktc29ydGFibGU9InNvcnRhYmxlT3B0aW9ucyIgbmctbW9kZWw9ImZvcm0uZmllbGRzIj4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iaW5uZXJDb250IiBuZy1yZXBlYXQ9ImZpZWxkIGluIGZvcm0uZmllbGRzIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLXNob3c9ImZpZWxkID09PSBzZWxlY3RlZEl0ZW0iIGNsYXNzPSJidG4gYnRuLXhzIGJ0bi1kYW5nZXIgZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUgcHVsbC1yaWdodCIgbmctY2xpY2s9InJlbW92ZUl0ZW0oZm9ybS5maWVsZHMsICRpbmRleCk7Ij48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLWluY2x1ZGU9ImZpZWxkLnR5cGUrJy1maWVsZC5odG1sJyI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS0yIj4KICAgICAgICAgICAgPGRpdiBuZy1pZj0ic2VsZWN0ZWRJdGVtIj4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7b3B0aW9uc2Zvcm0udGl0bGV9fTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICA8bGkgbmctcmVwZWF0PSJmaWVsZCBpbiBvcHRpb25zZm9ybS5maWVsZHMiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGQgaXRlbT0iZmllbGQiIHZhbD0ic2VsZWN0ZWRJdGVtW2ZpZWxkLm5hbWVdIj48L2ZpZWxkPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgc3R5bGU9ImNsZWFyOiBib3RoOyI+PC9kaXY+CgogICAgPGRpdj4KICAgICAgICA8YnV0dG9uIGlkPSJzYXZlX2Zvcm1fYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIiBuZy1jbGljaz0ic2F2ZUZvcm0oKSI+U2F2ZSBGb3JtPC9idXR0b24+CiAgICA8L2Rpdj4KICAgIDxkaXY+CiAgICAgICAgPGxhYmVsPkRhdGE8L2xhYmVsPgogICAgICAgIDxwPnt7Zm9ybX19PC9wPgogICAgPC9kaXY+CgogICAgPGRpdj4KICAgICAgICA8bGFiZWw+UmVzdWx0PC9sYWJlbD4KICAgICAgICA8cD57e3Jlc3VsdH19PC9wPgogICAgPC9kaXY+Cgo8L2Rpdj4K')
},
{
'name': '/app/lib/cosmos/partials/install.html', 'data': base64.b64decode(b'PGRpdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1pbnZlcnNlIG5hdmJhci1maXhlZC10b3AiIHJvbGU9Im5hdmlnYXRpb24iPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgICAgPGEgY2xhc3M9Im5hdmJhci1icmFuZCIgaHJlZj0iLyI+Q29zbW9zIEZyYW1ld29yazwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItY29sbGFwc2UgY29sbGFwc2UiPgogICAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItbmF2Ij4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIvIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iIy90ZXJtaW5hbC8iPlRlcm1pbmFsPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgbmctc2hvdz0ibG9nZ2VkSW4oKSI+PGEgaHJlZj0iL2xvZ291dC8iPkxvZ291dCBbe3t1c2VyTmFtZX19XTwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpIG5nLXNob3c9IiFsb2dnZWRJbigpIj48YSBocmVmPSIvIy9sb2dpbi8iPkxvZ2luPC9hPjwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJjb250YWluZXIgdGhlbWUtc2hvd2Nhc2UiIHJvbGU9Im1haW4iPgogICAgPGVycm9yLWJhbm5lcj48L2Vycm9yLWJhbm5lcj4KICAgIDxkaXYgbmctc2hvdz0ibG9nZ2VkSW4oKSI+CiAgICAgICAgPGgxPkluc3RhbGwgYXBwbGljYXRpb248L2gxPgoKICAgICAgICA8Zm9ybSBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL2FwcGxpY2F0aW9uL2luc3RhbGwvIj4KICAgICAgICAgICAgQXBwbGljYXRpb24gcGFja2FnZTogPGlucHV0IG5hbWU9ImFwcGxpY2F0aW9uIiB0eXBlPSJmaWxlIi8+PGJyLz4KICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAgICAgICBJbnN0YWxsICAgICAgICIvPgogICAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAgPGRpdiBuZy1zaG93PSIhbG9nZ2VkSW4oKSI+CiAgICAgICAgPHA+WW91IHNob3VsZCBsb2dpbiAoYXMgYWRtaW4pIHRvIGluc3RhbGwgYW4gYXBwbGljYXRpb24uPC9wPgogICAgPC9kaXY+CjwvZGl2Pg==')
},
{
'name': '/app/lib/cosmos/js/filters.js', 'data': base64.b64decode(b'J3VzZSBzdHJpY3QnOwoKLyogRmlsdGVycyAqLwoKYW5ndWxhci5tb2R1bGUoJ2Nvc21vc1VJLmZpbHRlcnMnLCBbXSkuCiAgZmlsdGVyKCdpbnRlcnBvbGF0ZScsIFsndmVyc2lvbicsIGZ1bmN0aW9uKHZlcnNpb24pIHsKICAgIHJldHVybiBmdW5jdGlvbih0ZXh0KSB7CiAgICAgIHJldHVybiBTdHJpbmcodGV4dCkucmVwbGFjZSgvXCVWRVJTSU9OXCUvbWcsIHZlcnNpb24pOwogICAgfTsKICB9XSk7Cg==')
},
{
'name': '/app/lib/cosmos/js/charthelper.js', 'data': base64.b64decode(b'LyoKICAgIC8vSG93IHRvIGNyZWF0ZSBjaGFydAoKICAgICA8ZGl2IGNsYXNzPSJjaGFydEhvbGRlciI+PGRpdiBpZD0iY2hhcnQiIGNsYXNzPSJjaGFydCI+PC9kaXY+PC9kaXY+CgogICAgdmFyIGJhckNoYXJ0Q29uZmlnID0gewogICAgICAgIHRpY3M6IDEwLAogICAgICAgIHRpY3NfbW9kaWZpZXI6ICIlIiwKCiAgICAgICAgeEF4aXNGaWVsZDogImxldHRlciIsCiAgICAgICAgeUF4aXNGaWVsZDogImZyZXF1ZW5jeSIsCiAgICAgICAgYmFyU2VwYXJhdG9yV2lkdGg6IDAuMSwKICAgICAgICB5QXhpc1RpdGxlOiAiRnJlcXVlbmN5IiwKICAgICAgICBtYXJnaW46IHt0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMzAsIGxlZnQ6IDQwfSwKICAgICAgICB3aWR0aDo5NjAsCiAgICAgICAgaGVpZ2h0OjUwMAogICAgfTsKCiAgICB2YXIgY2hhcnREYXRhID0gSlNPTi5wYXJzZSgnW3sibGV0dGVyIjoiQSIsImZyZXF1ZW5jeSI6MC4wODE2N30seyJsZXR0ZXIiOiJCIiwiZnJlcXVlbmN5IjowLjAxNDkyfSx7ImxldHRlciI6IkMiLCJmcmVxdWVuY3kiOjAuMDI3ODJ9LHsibGV0dGVyIjoiRCIsImZyZXF1ZW5jeSI6MC4wNDI1M30seyJsZXR0ZXIiOiJFIiwiZnJlcXVlbmN5IjowLjEyNzAyfSx7ImxldHRlciI6IkYiLCJmcmVxdWVuY3kiOjAuMDIyODh9LHsibGV0dGVyIjoiRyIsImZyZXF1ZW5jeSI6MC4wMjAxNX0seyJsZXR0ZXIiOiJIIiwiZnJlcXVlbmN5IjowLjA2MDk0fSx7ImxldHRlciI6IkkiLCJmcmVxdWVuY3kiOjAuMDY5NjZ9LHsibGV0dGVyIjoiSiIsImZyZXF1ZW5jeSI6MC4wMDE1M30seyJsZXR0ZXIiOiJLIiwiZnJlcXVlbmN5IjowLjAwNzcyfSx7ImxldHRlciI6IkwiLCJmcmVxdWVuY3kiOjAuMDQwMjV9LHsibGV0dGVyIjoiTSIsImZyZXF1ZW5jeSI6MC4wMjQwNn0seyJsZXR0ZXIiOiJOIiwiZnJlcXVlbmN5IjowLjA2NzQ5fSx7ImxldHRlciI6Ik8iLCJmcmVxdWVuY3kiOjAuMDc1MDd9LHsibGV0dGVyIjoiUCIsImZyZXF1ZW5jeSI6MC4wMTkyOX0seyJsZXR0ZXIiOiJRIiwiZnJlcXVlbmN5IjowLjAwMDk1fSx7ImxldHRlciI6IlIiLCJmcmVxdWVuY3kiOjAuMDU5ODd9LHsibGV0dGVyIjoiUyIsImZyZXF1ZW5jeSI6MC4wNjMyN30seyJsZXR0ZXIiOiJUIiwiZnJlcXVlbmN5IjowLjA5MDU2fSx7ImxldHRlciI6IlUiLCJmcmVxdWVuY3kiOjAuMDI3NTh9LHsibGV0dGVyIjoiViIsImZyZXF1ZW5jeSI6MC4wMDk3OH0seyJsZXR0ZXIiOiJXIiwiZnJlcXVlbmN5IjowLjAyMzZ9LHsibGV0dGVyIjoiWCIsImZyZXF1ZW5jeSI6MC4wMDE1fSx7ImxldHRlciI6IlkiLCJmcmVxdWVuY3kiOjAuMDE5NzR9LHsibGV0dGVyIjoiWiIsImZyZXF1ZW5jeSI6MC4wMDA3NH1dJyk7CiAgICBkcmF3QmFyQ2hhcnQoIiNjaGFydCIsYmFyQ2hhcnRDb25maWcsIGNoYXJ0RGF0YSk7CgoKICAgIHZhciBkYXRhTGluZSA9ICBKU09OLnBhcnNlKCdbeyJkYXRlIjoiMS1NYXktMTIiLCJjbG9zZSI6IjU4Mi4xMyJ9LHsiZGF0ZSI6IjMwLUFwci0xMiIsImNsb3NlIjoiNTgzLjk4In0seyJkYXRlIjoiMjctQXByLTEyIiwiY2xvc2UiOiI2MDMuMDAifSx7ImRhdGUiOiIyNi1BcHItMTIiLCJjbG9zZSI6IjYwNy43MCJ9LHsiZGF0ZSI6IjI1LUFwci0xMiIsImNsb3NlIjoiNjEwLjAwIn0seyJkYXRlIjoiMjQtQXByLTEyIiwiY2xvc2UiOiI1NjAuMjgifSx7ImRhdGUiOiIyMy1BcHItMTIiLCJjbG9zZSI6IjU3MS43MCJ9LHsiZGF0ZSI6IjIwLUFwci0xMiIsImNsb3NlIjoiNTcyLjk4In0seyJkYXRlIjoiMTktQXByLTEyIiwiY2xvc2UiOiI1ODcuNDQifSx7ImRhdGUiOiIxOC1BcHItMTIiLCJjbG9zZSI6IjYwOC4zNCJ9LHsiZGF0ZSI6IjE3LUFwci0xMiIsImNsb3NlIjoiNjA5LjcwIn0seyJkYXRlIjoiMTYtQXByLTEyIiwiY2xvc2UiOiI1ODAuMTMifSx7ImRhdGUiOiIxMy1BcHItMTIiLCJjbG9zZSI6IjYwNS4yMyJ9LHsiZGF0ZSI6IjEyLUFwci0xMiIsImNsb3NlIjoiNjIyLjc3In0seyJkYXRlIjoiMTEtQXByLTEyIiwiY2xvc2UiOiI2MjYuMjAifSx7ImRhdGUiOiIxMC1BcHItMTIiLCJjbG9zZSI6IjYyOC40NCJ9LHsiZGF0ZSI6IjktQXByLTEyIiwiY2xvc2UiOiI2MzYuMjMifSx7ImRhdGUiOiI1LUFwci0xMiIsImNsb3NlIjoiNjMzLjY4In0seyJkYXRlIjoiNC1BcHItMTIiLCJjbG9zZSI6IjYyNC4zMSJ9LHsiZGF0ZSI6IjMtQXByLTEyIiwiY2xvc2UiOiI2MjkuMzIifSx7ImRhdGUiOiIyLUFwci0xMiIsImNsb3NlIjoiNjE4LjYzIn0seyJkYXRlIjoiMzAtTWFyLTEyIiwiY2xvc2UiOiI1OTkuNTUifSx7ImRhdGUiOiIyOS1NYXItMTIiLCJjbG9zZSI6IjYwOS44NiJ9LHsiZGF0ZSI6IjI4LU1hci0xMiIsImNsb3NlIjoiNjE3LjYyIn0seyJkYXRlIjoiMjctTWFyLTEyIiwiY2xvc2UiOiI2MTQuNDgifSx7ImRhdGUiOiIyNi1NYXItMTIiLCJjbG9zZSI6IjYwNi45OCJ9LHsiZGF0ZSI6IjIzLU1hci0xMiIsImNsb3NlIjoiNTk2LjA1In0seyJkYXRlIjoiMjItTWFyLTEyIiwiY2xvc2UiOiI1OTkuMzQifSx7ImRhdGUiOiIyMS1NYXItMTIiLCJjbG9zZSI6IjYwMi41MCJ9LHsiZGF0ZSI6IjIwLU1hci0xMiIsImNsb3NlIjoiNjA1Ljk2In0seyJkYXRlIjoiMTktTWFyLTEyIiwiY2xvc2UiOiI2MDEuMTAifSx7ImRhdGUiOiIxNi1NYXItMTIiLCJjbG9zZSI6IjU4NS41NyJ9LHsiZGF0ZSI6IjE1LU1hci0xMiIsImNsb3NlIjoiNTg1LjU2In0seyJkYXRlIjoiMTQtTWFyLTEyIiwiY2xvc2UiOiI1ODkuNTgifSx7ImRhdGUiOiIxMy1NYXItMTIiLCJjbG9zZSI6IjU2OC4xMCJ9LHsiZGF0ZSI6IjEyLU1hci0xMiIsImNsb3NlIjoiNTUyLjAwIn0seyJkYXRlIjoiOS1NYXItMTIiLCJjbG9zZSI6IjU0NS4xNyJ9LHsiZGF0ZSI6IjgtTWFyLTEyIiwiY2xvc2UiOiI1NDEuOTkifSx7ImRhdGUiOiI3LU1hci0xMiIsImNsb3NlIjoiNTMwLjY5In0seyJkYXRlIjoiNi1NYXItMTIiLCJjbG9zZSI6IjUzMC4yNiJ9LHsiZGF0ZSI6IjUtTWFyLTEyIiwiY2xvc2UiOiI1MzMuMTYifSx7ImRhdGUiOiIyLU1hci0xMiIsImNsb3NlIjoiNTQ1LjE4In0seyJkYXRlIjoiMS1NYXItMTIiLCJjbG9zZSI6IjU0NC40NyJ9LHsiZGF0ZSI6IjI5LUZlYi0xMiIsImNsb3NlIjoiNTQyLjQ0In0seyJkYXRlIjoiMjgtRmViLTEyIiwiY2xvc2UiOiI1MzUuNDEifSx7ImRhdGUiOiIyNy1GZWItMTIiLCJjbG9zZSI6IjUyNS43NiJ9LHsiZGF0ZSI6IjI0LUZlYi0xMiIsImNsb3NlIjoiNTIyLjQxIn0seyJkYXRlIjoiMjMtRmViLTEyIiwiY2xvc2UiOiI1MTYuMzkifSx7ImRhdGUiOiIyMi1GZWItMTIiLCJjbG9zZSI6IjUxMy4wNCJ9LHsiZGF0ZSI6IjIxLUZlYi0xMiIsImNsb3NlIjoiNTE0Ljg1In0seyJkYXRlIjoiMTctRmViLTEyIiwiY2xvc2UiOiI1MDIuMTIifSx7ImRhdGUiOiIxNi1GZWItMTIiLCJjbG9zZSI6IjUwMi4yMSJ9LHsiZGF0ZSI6IjE1LUZlYi0xMiIsImNsb3NlIjoiNDk3LjY3In0seyJkYXRlIjoiMTQtRmViLTEyIiwiY2xvc2UiOiI1MDkuNDYifSx7ImRhdGUiOiIxMy1GZWItMTIiLCJjbG9zZSI6IjUwMi42MCJ9LHsiZGF0ZSI6IjEwLUZlYi0xMiIsImNsb3NlIjoiNDkzLjQyIn0seyJkYXRlIjoiOS1GZWItMTIiLCJjbG9zZSI6IjQ5My4xNyJ9LHsiZGF0ZSI6IjgtRmViLTEyIiwiY2xvc2UiOiI0NzYuNjgifSx7ImRhdGUiOiI3LUZlYi0xMiIsImNsb3NlIjoiNDY4LjgzIn0seyJkYXRlIjoiNi1GZWItMTIiLCJjbG9zZSI6IjQ2My45NyJ9LHsiZGF0ZSI6IjMtRmViLTEyIiwiY2xvc2UiOiI0NTkuNjgifSx7ImRhdGUiOiIyLUZlYi0xMiIsImNsb3NlIjoiNDU1LjEyIn0seyJkYXRlIjoiMS1GZWItMTIiLCJjbG9zZSI6IjQ1Ni4xOSJ9LHsiZGF0ZSI6IjMxLUphbi0xMiIsImNsb3NlIjoiNDU2LjQ4In0seyJkYXRlIjoiMzAtSmFuLTEyIiwiY2xvc2UiOiI0NTMuMDEifSx7ImRhdGUiOiIyNy1KYW4tMTIiLCJjbG9zZSI6IjQ0Ny4yOCJ9LHsiZGF0ZSI6IjI2LUphbi0xMiIsImNsb3NlIjoiNDQ0LjYzIn0seyJkYXRlIjoiMjUtSmFuLTEyIiwiY2xvc2UiOiI0NDYuNjYifSx7ImRhdGUiOiIyNC1KYW4tMTIiLCJjbG9zZSI6IjQyMC40MSJ9LHsiZGF0ZSI6IjIzLUphbi0xMiIsImNsb3NlIjoiNDI3LjQxIn0seyJkYXRlIjoiMjAtSmFuLTEyIiwiY2xvc2UiOiI0MjAuMzAifSx7ImRhdGUiOiIxOS1KYW4tMTIiLCJjbG9zZSI6IjQyNy43NSJ9LHsiZGF0ZSI6IjE4LUphbi0xMiIsImNsb3NlIjoiNDI5LjExIn0seyJkYXRlIjoiMTctSmFuLTEyIiwiY2xvc2UiOiI0MjQuNzAifSx7ImRhdGUiOiIxMy1KYW4tMTIiLCJjbG9zZSI6IjQxOS44MSJ9LHsiZGF0ZSI6IjEyLUphbi0xMiIsImNsb3NlIjoiNDIxLjM5In0seyJkYXRlIjoiMTEtSmFuLTEyIiwiY2xvc2UiOiI0MjIuNTUifSx7ImRhdGUiOiIxMC1KYW4tMTIiLCJjbG9zZSI6IjQyMy4yNCJ9LHsiZGF0ZSI6IjktSmFuLTEyIiwiY2xvc2UiOiI0MjEuNzMifSx7ImRhdGUiOiI2LUphbi0xMiIsImNsb3NlIjoiNDIyLjQwIn0seyJkYXRlIjoiNS1KYW4tMTIiLCJjbG9zZSI6IjQxOC4wMyJ9LHsiZGF0ZSI6IjQtSmFuLTEyIiwiY2xvc2UiOiI0MTMuNDQifSx7ImRhdGUiOiIzLUphbi0xMiIsImNsb3NlIjoiNDExLjIzIn0seyJkYXRlIjoiMzAtRGVjLTExIiwiY2xvc2UiOiI0MDUuMDAifSx7ImRhdGUiOiIyOS1EZWMtMTEiLCJjbG9zZSI6IjQwNS4xMiJ9LHsiZGF0ZSI6IjI4LURlYy0xMSIsImNsb3NlIjoiNDAyLjY0In0seyJkYXRlIjoiMjctRGVjLTExIiwiY2xvc2UiOiI0MDYuNTMifSx7ImRhdGUiOiIyMy1EZWMtMTEiLCJjbG9zZSI6IjQwMy40MyJ9LHsiZGF0ZSI6IjIyLURlYy0xMSIsImNsb3NlIjoiMzk4LjU1In0seyJkYXRlIjoiMjEtRGVjLTExIiwiY2xvc2UiOiIzOTYuNDQifSx7ImRhdGUiOiIyMC1EZWMtMTEiLCJjbG9zZSI6IjM5NS45NSJ9LHsiZGF0ZSI6IjE5LURlYy0xMSIsImNsb3NlIjoiMzgyLjIxIn0seyJkYXRlIjoiMTYtRGVjLTExIiwiY2xvc2UiOiIzODEuMDIifSx7ImRhdGUiOiIxNS1EZWMtMTEiLCJjbG9zZSI6IjM3OC45NCJ9LHsiZGF0ZSI6IjE0LURlYy0xMSIsImNsb3NlIjoiMzgwLjE5In0seyJkYXRlIjoiMTMtRGVjLTExIiwiY2xvc2UiOiIzODguODEifSx7ImRhdGUiOiIxMi1EZWMtMTEiLCJjbG9zZSI6IjM5MS44NCJ9LHsiZGF0ZSI6IjktRGVjLTExIiwiY2xvc2UiOiIzOTMuNjIifSx7ImRhdGUiOiI4LURlYy0xMSIsImNsb3NlIjoiMzkwLjY2In0seyJkYXRlIjoiNy1EZWMtMTEiLCJjbG9zZSI6IjM4OS4wOSJ9LHsiZGF0ZSI6IjYtRGVjLTExIiwiY2xvc2UiOiIzOTAuOTUifSx7ImRhdGUiOiI1LURlYy0xMSIsImNsb3NlIjoiMzkzLjAxIn0seyJkYXRlIjoiMi1EZWMtMTEiLCJjbG9zZSI6IjM4OS43MCJ9LHsiZGF0ZSI6IjEtRGVjLTExIiwiY2xvc2UiOiIzODcuOTMifSx7ImRhdGUiOiIzMC1Ob3YtMTEiLCJjbG9zZSI6IjM4Mi4yMCJ9LHsiZGF0ZSI6IjI5LU5vdi0xMSIsImNsb3NlIjoiMzczLjIwIn0seyJkYXRlIjoiMjgtTm92LTExIiwiY2xvc2UiOiIzNzYuMTIifSx7ImRhdGUiOiIyNS1Ob3YtMTEiLCJjbG9zZSI6IjM2My41NyJ9LHsiZGF0ZSI6IjIzLU5vdi0xMSIsImNsb3NlIjoiMzY2Ljk5In0seyJkYXRlIjoiMjItTm92LTExIiwiY2xvc2UiOiIzNzYuNTEifSx7ImRhdGUiOiIyMS1Ob3YtMTEiLCJjbG9zZSI6IjM2OS4wMSJ9LHsiZGF0ZSI6IjE4LU5vdi0xMSIsImNsb3NlIjoiMzc0Ljk0In0seyJkYXRlIjoiMTctTm92LTExIiwiY2xvc2UiOiIzNzcuNDEifSx7ImRhdGUiOiIxNi1Ob3YtMTEiLCJjbG9zZSI6IjM4NC43NyJ9LHsiZGF0ZSI6IjE1LU5vdi0xMSIsImNsb3NlIjoiMzg4LjgzIn0seyJkYXRlIjoiMTQtTm92LTExIiwiY2xvc2UiOiIzNzkuMjYifSx7ImRhdGUiOiIxMS1Ob3YtMTEiLCJjbG9zZSI6IjM4NC42MiJ9LHsiZGF0ZSI6IjEwLU5vdi0xMSIsImNsb3NlIjoiMzg1LjIyIn0seyJkYXRlIjoiOS1Ob3YtMTEiLCJjbG9zZSI6IjM5NS4yOCJ9LHsiZGF0ZSI6IjgtTm92LTExIiwiY2xvc2UiOiI0MDYuMjMifSx7ImRhdGUiOiI3LU5vdi0xMSIsImNsb3NlIjoiMzk5LjczIn0seyJkYXRlIjoiNC1Ob3YtMTEiLCJjbG9zZSI6IjQwMC4yNCJ9LHsiZGF0ZSI6IjMtTm92LTExIiwiY2xvc2UiOiI0MDMuMDcifSx7ImRhdGUiOiIyLU5vdi0xMSIsImNsb3NlIjoiMzk3LjQxIn0seyJkYXRlIjoiMS1Ob3YtMTEiLCJjbG9zZSI6IjM5Ni41MSJ9LHsiZGF0ZSI6IjMxLU9jdC0xMSIsImNsb3NlIjoiNDA0Ljc4In0seyJkYXRlIjoiMjgtT2N0LTExIiwiY2xvc2UiOiI0MDQuOTUifSx7ImRhdGUiOiIyNy1PY3QtMTEiLCJjbG9zZSI6IjQwNC42OSJ9LHsiZGF0ZSI6IjI2LU9jdC0xMSIsImNsb3NlIjoiNDAwLjYwIn0seyJkYXRlIjoiMjUtT2N0LTExIiwiY2xvc2UiOiIzOTcuNzcifSx7ImRhdGUiOiIyNC1PY3QtMTEiLCJjbG9zZSI6IjQwNS43NyJ9LHsiZGF0ZSI6IjIxLU9jdC0xMSIsImNsb3NlIjoiMzkyLjg3In0seyJkYXRlIjoiMjAtT2N0LTExIiwiY2xvc2UiOiIzOTUuMzEifSx7ImRhdGUiOiIxOS1PY3QtMTEiLCJjbG9zZSI6IjM5OC42MiJ9LHsiZGF0ZSI6IjE4LU9jdC0xMSIsImNsb3NlIjoiNDIyLjI0In0seyJkYXRlIjoiMTctT2N0LTExIiwiY2xvc2UiOiI0MTkuOTkifSx7ImRhdGUiOiIxNC1PY3QtMTEiLCJjbG9zZSI6IjQyMi4wMCJ9LHsiZGF0ZSI6IjEzLU9jdC0xMSIsImNsb3NlIjoiNDA4LjQzIn0seyJkYXRlIjoiMTItT2N0LTExIiwiY2xvc2UiOiI0MDIuMTkifSx7ImRhdGUiOiIxMS1PY3QtMTEiLCJjbG9zZSI6IjQwMC4yOSJ9LHsiZGF0ZSI6IjEwLU9jdC0xMSIsImNsb3NlIjoiMzg4LjgxIn0seyJkYXRlIjoiNy1PY3QtMTEiLCJjbG9zZSI6IjM2OS44MCJ9LHsiZGF0ZSI6IjYtT2N0LTExIiwiY2xvc2UiOiIzNzcuMzcifSx7ImRhdGUiOiI1LU9jdC0xMSIsImNsb3NlIjoiMzc4LjI1In0seyJkYXRlIjoiNC1PY3QtMTEiLCJjbG9zZSI6IjM3Mi41MCJ9LHsiZGF0ZSI6IjMtT2N0LTExIiwiY2xvc2UiOiIzNzQuNjAifSx7ImRhdGUiOiIzMC1TZXAtMTEiLCJjbG9zZSI6IjM4MS4zMiJ9LHsiZGF0ZSI6IjI5LVNlcC0xMSIsImNsb3NlIjoiMzkwLjU3In0seyJkYXRlIjoiMjgtU2VwLTExIiwiY2xvc2UiOiIzOTcuMDEifSx7ImRhdGUiOiIyNy1TZXAtMTEiLCJjbG9zZSI6IjM5OS4yNiJ9LHsiZGF0ZSI6IjI2LVNlcC0xMSIsImNsb3NlIjoiNDAzLjE3In0seyJkYXRlIjoiMjMtU2VwLTExIiwiY2xvc2UiOiI0MDQuMzAifSx7ImRhdGUiOiIyMi1TZXAtMTEiLCJjbG9zZSI6IjQwMS44MiJ9LHsiZGF0ZSI6IjIxLVNlcC0xMSIsImNsb3NlIjoiNDEyLjE0In0seyJkYXRlIjoiMjAtU2VwLTExIiwiY2xvc2UiOiI0MTMuNDUifSx7ImRhdGUiOiIxOS1TZXAtMTEiLCJjbG9zZSI6IjQxMS42MyJ9LHsiZGF0ZSI6IjE2LVNlcC0xMSIsImNsb3NlIjoiNDAwLjUwIn0seyJkYXRlIjoiMTUtU2VwLTExIiwiY2xvc2UiOiIzOTIuOTYifSx7ImRhdGUiOiIxNC1TZXAtMTEiLCJjbG9zZSI6IjM4OS4zMCJ9LHsiZGF0ZSI6IjEzLVNlcC0xMSIsImNsb3NlIjoiMzg0LjYyIn0seyJkYXRlIjoiMTItU2VwLTExIiwiY2xvc2UiOiIzNzkuOTQifSx7ImRhdGUiOiI5LVNlcC0xMSIsImNsb3NlIjoiMzc3LjQ4In0seyJkYXRlIjoiOC1TZXAtMTEiLCJjbG9zZSI6IjM4NC4xNCJ9LHsiZGF0ZSI6IjctU2VwLTExIiwiY2xvc2UiOiIzODMuOTMifSx7ImRhdGUiOiI2LVNlcC0xMSIsImNsb3NlIjoiMzc5Ljc0In0seyJkYXRlIjoiMi1TZXAtMTEiLCJjbG9zZSI6IjM3NC4wNSJ9LHsiZGF0ZSI6IjEtU2VwLTExIiwiY2xvc2UiOiIzODEuMDMifSx7ImRhdGUiOiIzMS1BdWctMTEiLCJjbG9zZSI6IjM4NC44MyJ9LHsiZGF0ZSI6IjMwLUF1Zy0xMSIsImNsb3NlIjoiMzg5Ljk5In0seyJkYXRlIjoiMjktQXVnLTExIiwiY2xvc2UiOiIzODkuOTcifSx7ImRhdGUiOiIyNi1BdWctMTEiLCJjbG9zZSI6IjM4My41OCJ9LHsiZGF0ZSI6IjI1LUF1Zy0xMSIsImNsb3NlIjoiMzczLjcyIn0seyJkYXRlIjoiMjQtQXVnLTExIiwiY2xvc2UiOiIzNzYuMTgifSx7ImRhdGUiOiIyMy1BdWctMTEiLCJjbG9zZSI6IjM3My42MCJ9LHsiZGF0ZSI6IjIyLUF1Zy0xMSIsImNsb3NlIjoiMzU2LjQ0In0seyJkYXRlIjoiMTktQXVnLTExIiwiY2xvc2UiOiIzNTYuMDMifSx7ImRhdGUiOiIxOC1BdWctMTEiLCJjbG9zZSI6IjM2Ni4wNSJ9LHsiZGF0ZSI6IjE3LUF1Zy0xMSIsImNsb3NlIjoiMzgwLjQ0In0seyJkYXRlIjoiMTYtQXVnLTExIiwiY2xvc2UiOiIzODAuNDgifSx7ImRhdGUiOiIxNS1BdWctMTEiLCJjbG9zZSI6IjM4My40MSJ9LHsiZGF0ZSI6IjEyLUF1Zy0xMSIsImNsb3NlIjoiMzc2Ljk5In0seyJkYXRlIjoiMTEtQXVnLTExIiwiY2xvc2UiOiIzNzMuNzAifSx7ImRhdGUiOiIxMC1BdWctMTEiLCJjbG9zZSI6IjM2My42OSJ9LHsiZGF0ZSI6IjktQXVnLTExIiwiY2xvc2UiOiIzNzQuMDEifSx7ImRhdGUiOiI4LUF1Zy0xMSIsImNsb3NlIjoiMzUzLjIxIn0seyJkYXRlIjoiNS1BdWctMTEiLCJjbG9zZSI6IjM3My42MiJ9LHsiZGF0ZSI6IjQtQXVnLTExIiwiY2xvc2UiOiIzNzcuMzcifSx7ImRhdGUiOiIzLUF1Zy0xMSIsImNsb3NlIjoiMzkyLjU3In0seyJkYXRlIjoiMi1BdWctMTEiLCJjbG9zZSI6IjM4OC45MSJ9LHsiZGF0ZSI6IjEtQXVnLTExIiwiY2xvc2UiOiIzOTYuNzUifSx7ImRhdGUiOiIyOS1KdWwtMTEiLCJjbG9zZSI6IjM5MC40OCJ9LHsiZGF0ZSI6IjI4LUp1bC0xMSIsImNsb3NlIjoiMzkxLjgyIn0seyJkYXRlIjoiMjctSnVsLTExIiwiY2xvc2UiOiIzOTIuNTkifSx7ImRhdGUiOiIyNi1KdWwtMTEiLCJjbG9zZSI6IjQwMy40MSJ9LHsiZGF0ZSI6IjI1LUp1bC0xMSIsImNsb3NlIjoiMzk4LjUwIn0seyJkYXRlIjoiMjItSnVsLTExIiwiY2xvc2UiOiIzOTMuMzAifSx7ImRhdGUiOiIyMS1KdWwtMTEiLCJjbG9zZSI6IjM4Ny4yOSJ9LHsiZGF0ZSI6IjIwLUp1bC0xMSIsImNsb3NlIjoiMzg2LjkwIn0seyJkYXRlIjoiMTktSnVsLTExIiwiY2xvc2UiOiIzNzYuODUifSx7ImRhdGUiOiIxOC1KdWwtMTEiLCJjbG9zZSI6IjM3My44MCJ9LHsiZGF0ZSI6IjE1LUp1bC0xMSIsImNsb3NlIjoiMzY0LjkyIn0seyJkYXRlIjoiMTQtSnVsLTExIiwiY2xvc2UiOiIzNTcuNzcifSx7ImRhdGUiOiIxMy1KdWwtMTEiLCJjbG9zZSI6IjM1OC4wMiJ9LHsiZGF0ZSI6IjEyLUp1bC0xMSIsImNsb3NlIjoiMzUzLjc1In0seyJkYXRlIjoiMTEtSnVsLTExIiwiY2xvc2UiOiIzNTQuMDAifSx7ImRhdGUiOiI4LUp1bC0xMSIsImNsb3NlIjoiMzU5LjcxIn0seyJkYXRlIjoiNy1KdWwtMTEiLCJjbG9zZSI6IjM1Ny4yMCJ9LHsiZGF0ZSI6IjYtSnVsLTExIiwiY2xvc2UiOiIzNTEuNzYifSx7ImRhdGUiOiI1LUp1bC0xMSIsImNsb3NlIjoiMzQ5LjQzIn0seyJkYXRlIjoiMS1KdWwtMTEiLCJjbG9zZSI6IjM0My4yNiJ9LHsiZGF0ZSI6IjMwLUp1bi0xMSIsImNsb3NlIjoiMzM1LjY3In0seyJkYXRlIjoiMjktSnVuLTExIiwiY2xvc2UiOiIzMzQuMDQifSx7ImRhdGUiOiIyOC1KdW4tMTEiLCJjbG9zZSI6IjMzNS4yNiJ9LHsiZGF0ZSI6IjI3LUp1bi0xMSIsImNsb3NlIjoiMzMyLjA0In0seyJkYXRlIjoiMjQtSnVuLTExIiwiY2xvc2UiOiIzMjYuMzUifSx7ImRhdGUiOiIyMy1KdW4tMTEiLCJjbG9zZSI6IjMzMS4yMyJ9LHsiZGF0ZSI6IjIyLUp1bi0xMSIsImNsb3NlIjoiMzIyLjYxIn0seyJkYXRlIjoiMjEtSnVuLTExIiwiY2xvc2UiOiIzMjUuMzAifSx7ImRhdGUiOiIyMC1KdW4tMTEiLCJjbG9zZSI6IjMxNS4zMiJ9LHsiZGF0ZSI6IjE3LUp1bi0xMSIsImNsb3NlIjoiMzIwLjI2In0seyJkYXRlIjoiMTYtSnVuLTExIiwiY2xvc2UiOiIzMjUuMTYifSx7ImRhdGUiOiIxNS1KdW4tMTEiLCJjbG9zZSI6IjMyNi43NSJ9LHsiZGF0ZSI6IjE0LUp1bi0xMSIsImNsb3NlIjoiMzMyLjQ0In0seyJkYXRlIjoiMTMtSnVuLTExIiwiY2xvc2UiOiIzMjYuNjAifSx7ImRhdGUiOiIxMC1KdW4tMTEiLCJjbG9zZSI6IjMyNS45MCJ9LHsiZGF0ZSI6IjktSnVuLTExIiwiY2xvc2UiOiIzMzEuNDkifSx7ImRhdGUiOiI4LUp1bi0xMSIsImNsb3NlIjoiMzMyLjI0In0seyJkYXRlIjoiNy1KdW4tMTEiLCJjbG9zZSI6IjMzMi4wNCJ9LHsiZGF0ZSI6IjYtSnVuLTExIiwiY2xvc2UiOiIzMzguMDQifSx7ImRhdGUiOiIzLUp1bi0xMSIsImNsb3NlIjoiMzQzLjQ0In0seyJkYXRlIjoiMi1KdW4tMTEiLCJjbG9zZSI6IjM0Ni4xMCJ9LHsiZGF0ZSI6IjEtSnVuLTExIiwiY2xvc2UiOiIzNDUuNTEifSx7ImRhdGUiOiIzMS1NYXktMTEiLCJjbG9zZSI6IjM0Ny44MyJ9LHsiZGF0ZSI6IjI3LU1heS0xMSIsImNsb3NlIjoiMzM3LjQxIn0seyJkYXRlIjoiMjYtTWF5LTExIiwiY2xvc2UiOiIzMzUuMDAifSx7ImRhdGUiOiIyNS1NYXktMTEiLCJjbG9zZSI6IjMzNi43OCJ9LHsiZGF0ZSI6IjI0LU1heS0xMSIsImNsb3NlIjoiMzMyLjE5In0seyJkYXRlIjoiMjMtTWF5LTExIiwiY2xvc2UiOiIzMzQuNDAifSx7ImRhdGUiOiIyMC1NYXktMTEiLCJjbG9zZSI6IjMzNS4yMiJ9LHsiZGF0ZSI6IjE5LU1heS0xMSIsImNsb3NlIjoiMzQwLjUzIn0seyJkYXRlIjoiMTgtTWF5LTExIiwiY2xvc2UiOiIzMzkuODcifSx7ImRhdGUiOiIxNy1NYXktMTEiLCJjbG9zZSI6IjMzNi4xNCJ9LHsiZGF0ZSI6IjE2LU1heS0xMSIsImNsb3NlIjoiMzMzLjMwIn0seyJkYXRlIjoiMTMtTWF5LTExIiwiY2xvc2UiOiIzNDAuNTAifSx7ImRhdGUiOiIxMi1NYXktMTEiLCJjbG9zZSI6IjM0Ni41NyJ9LHsiZGF0ZSI6IjExLU1heS0xMSIsImNsb3NlIjoiMzQ3LjIzIn0seyJkYXRlIjoiMTAtTWF5LTExIiwiY2xvc2UiOiIzNDkuNDUifSx7ImRhdGUiOiI5LU1heS0xMSIsImNsb3NlIjoiMzQ3LjYwIn0seyJkYXRlIjoiNi1NYXktMTEiLCJjbG9zZSI6IjM0Ni42NiJ9LHsiZGF0ZSI6IjUtTWF5LTExIiwiY2xvc2UiOiIzNDYuNzUifSx7ImRhdGUiOiI0LU1heS0xMSIsImNsb3NlIjoiMzQ5LjU3In0seyJkYXRlIjoiMy1NYXktMTEiLCJjbG9zZSI6IjM0OC4yMCJ9LHsiZGF0ZSI6IjItTWF5LTExIiwiY2xvc2UiOiIzNDYuMjgifSx7ImRhdGUiOiIyOS1BcHItMTEiLCJjbG9zZSI6IjM1MC4xMyJ9LHsiZGF0ZSI6IjI4LUFwci0xMSIsImNsb3NlIjoiMzQ2Ljc1In0seyJkYXRlIjoiMjctQXByLTExIiwiY2xvc2UiOiIzNTAuMTUifSx7ImRhdGUiOiIyNi1BcHItMTEiLCJjbG9zZSI6IjM1MC40MiJ9LHsiZGF0ZSI6IjI1LUFwci0xMSIsImNsb3NlIjoiMzUzLjAxIn0seyJkYXRlIjoiMjEtQXByLTExIiwiY2xvc2UiOiIzNTAuNzAifSx7ImRhdGUiOiIyMC1BcHItMTEiLCJjbG9zZSI6IjM0Mi40MSJ9LHsiZGF0ZSI6IjE5LUFwci0xMSIsImNsb3NlIjoiMzM3Ljg2In0seyJkYXRlIjoiMTgtQXByLTExIiwiY2xvc2UiOiIzMzEuODUifSx7ImRhdGUiOiIxNS1BcHItMTEiLCJjbG9zZSI6IjMyNy40NiJ9LHsiZGF0ZSI6IjE0LUFwci0xMSIsImNsb3NlIjoiMzMyLjQyIn0seyJkYXRlIjoiMTMtQXByLTExIiwiY2xvc2UiOiIzMzYuMTMifSx7ImRhdGUiOiIxMi1BcHItMTEiLCJjbG9zZSI6IjMzMi40MCJ9LHsiZGF0ZSI6IjExLUFwci0xMSIsImNsb3NlIjoiMzMwLjgwIn0seyJkYXRlIjoiOC1BcHItMTEiLCJjbG9zZSI6IjMzNS4wNiJ9LHsiZGF0ZSI6IjctQXByLTExIiwiY2xvc2UiOiIzMzguMDgifSx7ImRhdGUiOiI2LUFwci0xMSIsImNsb3NlIjoiMzM4LjA0In0seyJkYXRlIjoiNS1BcHItMTEiLCJjbG9zZSI6IjMzOC44OSJ9LHsiZGF0ZSI6IjQtQXByLTExIiwiY2xvc2UiOiIzNDEuMTkifSx7ImRhdGUiOiIxLUFwci0xMSIsImNsb3NlIjoiMzQ0LjU2In0seyJkYXRlIjoiMzEtTWFyLTExIiwiY2xvc2UiOiIzNDguNTEifSx7ImRhdGUiOiIzMC1NYXItMTEiLCJjbG9zZSI6IjM0OC42MyJ9LHsiZGF0ZSI6IjI5LU1hci0xMSIsImNsb3NlIjoiMzUwLjk2In0seyJkYXRlIjoiMjgtTWFyLTExIiwiY2xvc2UiOiIzNTAuNDQifSx7ImRhdGUiOiIyNS1NYXItMTEiLCJjbG9zZSI6IjM1MS41NCJ9LHsiZGF0ZSI6IjI0LU1hci0xMSIsImNsb3NlIjoiMzQ0Ljk3In0seyJkYXRlIjoiMjMtTWFyLTExIiwiY2xvc2UiOiIzMzkuMTkifSx7ImRhdGUiOiIyMi1NYXItMTEiLCJjbG9zZSI6IjM0MS4yMCJ9LHsiZGF0ZSI6IjIxLU1hci0xMSIsImNsb3NlIjoiMzM5LjMwIn0seyJkYXRlIjoiMTgtTWFyLTExIiwiY2xvc2UiOiIzMzAuNjcifSx7ImRhdGUiOiIxNy1NYXItMTEiLCJjbG9zZSI6IjMzNC42NCJ9LHsiZGF0ZSI6IjE2LU1hci0xMSIsImNsb3NlIjoiMzMwLjAxIn0seyJkYXRlIjoiMTUtTWFyLTExIiwiY2xvc2UiOiIzNDUuNDMifSx7ImRhdGUiOiIxNC1NYXItMTEiLCJjbG9zZSI6IjM1My41NiJ9LHsiZGF0ZSI6IjExLU1hci0xMSIsImNsb3NlIjoiMzUxLjk5In0seyJkYXRlIjoiMTAtTWFyLTExIiwiY2xvc2UiOiIzNDYuNjcifSx7ImRhdGUiOiI5LU1hci0xMSIsImNsb3NlIjoiMzUyLjQ3In0seyJkYXRlIjoiOC1NYXItMTEiLCJjbG9zZSI6IjM1NS43NiJ9LHsiZGF0ZSI6IjctTWFyLTExIiwiY2xvc2UiOiIzNTUuMzYifSx7ImRhdGUiOiI0LU1hci0xMSIsImNsb3NlIjoiMzYwLjAwIn0seyJkYXRlIjoiMy1NYXItMTEiLCJjbG9zZSI6IjM1OS41NiJ9LHsiZGF0ZSI6IjItTWFyLTExIiwiY2xvc2UiOiIzNTIuMTIifSx7ImRhdGUiOiIxLU1hci0xMSIsImNsb3NlIjoiMzQ5LjMxIn0seyJkYXRlIjoiMjgtRmViLTExIiwiY2xvc2UiOiIzNTMuMjEifSx7ImRhdGUiOiIyNS1GZWItMTEiLCJjbG9zZSI6IjM0OC4xNiJ9LHsiZGF0ZSI6IjI0LUZlYi0xMSIsImNsb3NlIjoiMzQyLjg4In0seyJkYXRlIjoiMjMtRmViLTExIiwiY2xvc2UiOiIzNDIuNjIifSx7ImRhdGUiOiIyMi1GZWItMTEiLCJjbG9zZSI6IjMzOC42MSJ9LHsiZGF0ZSI6IjE4LUZlYi0xMSIsImNsb3NlIjoiMzUwLjU2In0seyJkYXRlIjoiMTctRmViLTExIiwiY2xvc2UiOiIzNTguMzAifSx7ImRhdGUiOiIxNi1GZWItMTEiLCJjbG9zZSI6IjM2My4xMyJ9LHsiZGF0ZSI6IjE1LUZlYi0xMSIsImNsb3NlIjoiMzU5LjkwIn0seyJkYXRlIjoiMTQtRmViLTExIiwiY2xvc2UiOiIzNTkuMTgifSx7ImRhdGUiOiIxMS1GZWItMTEiLCJjbG9zZSI6IjM1Ni44NSJ9LHsiZGF0ZSI6IjEwLUZlYi0xMSIsImNsb3NlIjoiMzU0LjU0In0seyJkYXRlIjoiOS1GZWItMTEiLCJjbG9zZSI6IjM1OC4xNiJ9LHsiZGF0ZSI6IjgtRmViLTExIiwiY2xvc2UiOiIzNTUuMjAifSx7ImRhdGUiOiI3LUZlYi0xMSIsImNsb3NlIjoiMzUxLjg4In0seyJkYXRlIjoiNC1GZWItMTEiLCJjbG9zZSI6IjM0Ni41MCJ9LHsiZGF0ZSI6IjMtRmViLTExIiwiY2xvc2UiOiIzNDMuNDQifSx7ImRhdGUiOiIyLUZlYi0xMSIsImNsb3NlIjoiMzQ0LjMyIn0seyJkYXRlIjoiMS1GZWItMTEiLCJjbG9zZSI6IjM0NS4wMyJ9LHsiZGF0ZSI6IjMxLUphbi0xMSIsImNsb3NlIjoiMzM5LjMyIn0seyJkYXRlIjoiMjgtSmFuLTExIiwiY2xvc2UiOiIzMzYuMTAifSx7ImRhdGUiOiIyNy1KYW4tMTEiLCJjbG9zZSI6IjM0My4yMSJ9LHsiZGF0ZSI6IjI2LUphbi0xMSIsImNsb3NlIjoiMzQzLjg1In0seyJkYXRlIjoiMjUtSmFuLTExIiwiY2xvc2UiOiIzNDEuNDAifSx7ImRhdGUiOiIyNC1KYW4tMTEiLCJjbG9zZSI6IjMzNy40NSJ9LHsiZGF0ZSI6IjIxLUphbi0xMSIsImNsb3NlIjoiMzI2LjcyIn0seyJkYXRlIjoiMjAtSmFuLTExIiwiY2xvc2UiOiIzMzIuNjgifSx7ImRhdGUiOiIxOS1KYW4tMTEiLCJjbG9zZSI6IjMzOC44NCJ9LHsiZGF0ZSI6IjE4LUphbi0xMSIsImNsb3NlIjoiMzQwLjY1In0seyJkYXRlIjoiMTQtSmFuLTExIiwiY2xvc2UiOiIzNDguNDgifSx7ImRhdGUiOiIxMy1KYW4tMTEiLCJjbG9zZSI6IjM0NS42OCJ9LHsiZGF0ZSI6IjEyLUphbi0xMSIsImNsb3NlIjoiMzQ0LjQyIn0seyJkYXRlIjoiMTEtSmFuLTExIiwiY2xvc2UiOiIzNDEuNjQifSx7ImRhdGUiOiIxMC1KYW4tMTEiLCJjbG9zZSI6IjM0Mi40NiJ9LHsiZGF0ZSI6IjctSmFuLTExIiwiY2xvc2UiOiIzMzYuMTIifSx7ImRhdGUiOiI2LUphbi0xMSIsImNsb3NlIjoiMzMzLjczIn0seyJkYXRlIjoiNS1KYW4tMTEiLCJjbG9zZSI6IjMzNC4wMCJ9LHsiZGF0ZSI6IjQtSmFuLTExIiwiY2xvc2UiOiIzMzEuMjkifSx7ImRhdGUiOiIzLUphbi0xMSIsImNsb3NlIjoiMzI5LjU3In0seyJkYXRlIjoiMzEtRGVjLTEwIiwiY2xvc2UiOiIzMjIuNTYifSx7ImRhdGUiOiIzMC1EZWMtMTAiLCJjbG9zZSI6IjMyMy42NiJ9LHsiZGF0ZSI6IjI5LURlYy0xMCIsImNsb3NlIjoiMzI1LjI5In0seyJkYXRlIjoiMjgtRGVjLTEwIiwiY2xvc2UiOiIzMjUuNDcifSx7ImRhdGUiOiIyNy1EZWMtMTAiLCJjbG9zZSI6IjMyNC42OCJ9LHsiZGF0ZSI6IjIzLURlYy0xMCIsImNsb3NlIjoiMzIzLjYwIn0seyJkYXRlIjoiMjItRGVjLTEwIiwiY2xvc2UiOiIzMjUuMTYifSx7ImRhdGUiOiIyMS1EZWMtMTAiLCJjbG9zZSI6IjMyNC4yMCJ9LHsiZGF0ZSI6IjIwLURlYy0xMCIsImNsb3NlIjoiMzIyLjIxIn0seyJkYXRlIjoiMTctRGVjLTEwIiwiY2xvc2UiOiIzMjAuNjEifSx7ImRhdGUiOiIxNi1EZWMtMTAiLCJjbG9zZSI6IjMyMS4yNSJ9LHsiZGF0ZSI6IjE1LURlYy0xMCIsImNsb3NlIjoiMzIwLjM2In0seyJkYXRlIjoiMTQtRGVjLTEwIiwiY2xvc2UiOiIzMjAuMjkifSx7ImRhdGUiOiIxMy1EZWMtMTAiLCJjbG9zZSI6IjMyMS42NyJ9LHsiZGF0ZSI6IjEwLURlYy0xMCIsImNsb3NlIjoiMzIwLjU2In0seyJkYXRlIjoiOS1EZWMtMTAiLCJjbG9zZSI6IjMxOS43NiJ9LHsiZGF0ZSI6IjgtRGVjLTEwIiwiY2xvc2UiOiIzMjEuMDEifSx7ImRhdGUiOiI3LURlYy0xMCIsImNsb3NlIjoiMzE4LjIxIn0seyJkYXRlIjoiNi1EZWMtMTAiLCJjbG9zZSI6IjMyMC4xNSJ9LHsiZGF0ZSI6IjMtRGVjLTEwIiwiY2xvc2UiOiIzMTcuNDQifSx7ImRhdGUiOiIyLURlYy0xMCIsImNsb3NlIjoiMzE4LjE1In0seyJkYXRlIjoiMS1EZWMtMTAiLCJjbG9zZSI6IjMxNi40MCJ9LHsiZGF0ZSI6IjMwLU5vdi0xMCIsImNsb3NlIjoiMzExLjE1In0seyJkYXRlIjoiMjktTm92LTEwIiwiY2xvc2UiOiIzMTYuODcifSx7ImRhdGUiOiIyNi1Ob3YtMTAiLCJjbG9zZSI6IjMxNS4wMCJ9LHsiZGF0ZSI6IjI0LU5vdi0xMCIsImNsb3NlIjoiMzE0LjgwIn0seyJkYXRlIjoiMjMtTm92LTEwIiwiY2xvc2UiOiIzMDguNzMifSx7ImRhdGUiOiIyMi1Ob3YtMTAiLCJjbG9zZSI6IjMxMy4zNiJ9LHsiZGF0ZSI6IjE5LU5vdi0xMCIsImNsb3NlIjoiMzA2LjczIn0seyJkYXRlIjoiMTgtTm92LTEwIiwiY2xvc2UiOiIzMDguNDMifSx7ImRhdGUiOiIxNy1Ob3YtMTAiLCJjbG9zZSI6IjMwMC41MCJ9LHsiZGF0ZSI6IjE2LU5vdi0xMCIsImNsb3NlIjoiMzAxLjU5In0seyJkYXRlIjoiMTUtTm92LTEwIiwiY2xvc2UiOiIzMDcuMDQifSx7ImRhdGUiOiIxMi1Ob3YtMTAiLCJjbG9zZSI6IjMwOC4wMyJ9LHsiZGF0ZSI6IjExLU5vdi0xMCIsImNsb3NlIjoiMzE2LjY2In0seyJkYXRlIjoiMTAtTm92LTEwIiwiY2xvc2UiOiIzMTguMDMifSx7ImRhdGUiOiI5LU5vdi0xMCIsImNsb3NlIjoiMzE2LjA4In0seyJkYXRlIjoiOC1Ob3YtMTAiLCJjbG9zZSI6IjMxOC42MiJ9LHsiZGF0ZSI6IjUtTm92LTEwIiwiY2xvc2UiOiIzMTcuMTMifSx7ImRhdGUiOiI0LU5vdi0xMCIsImNsb3NlIjoiMzE4LjI3In0seyJkYXRlIjoiMy1Ob3YtMTAiLCJjbG9zZSI6IjMxMi44MCJ9LHsiZGF0ZSI6IjItTm92LTEwIiwiY2xvc2UiOiIzMDkuMzYifSx7ImRhdGUiOiIxLU5vdi0xMCIsImNsb3NlIjoiMzA0LjE4In0seyJkYXRlIjoiMjktT2N0LTEwIiwiY2xvc2UiOiIzMDAuOTgifSx7ImRhdGUiOiIyOC1PY3QtMTAiLCJjbG9zZSI6IjMwNS4yNCJ9LHsiZGF0ZSI6IjI3LU9jdC0xMCIsImNsb3NlIjoiMzA3LjgzIn0seyJkYXRlIjoiMjYtT2N0LTEwIiwiY2xvc2UiOiIzMDguMDUifSx7ImRhdGUiOiIyNS1PY3QtMTAiLCJjbG9zZSI6IjMwOC44NCJ9LHsiZGF0ZSI6IjIyLU9jdC0xMCIsImNsb3NlIjoiMzA3LjQ3In0seyJkYXRlIjoiMjEtT2N0LTEwIiwiY2xvc2UiOiIzMDkuNTIifSx7ImRhdGUiOiIyMC1PY3QtMTAiLCJjbG9zZSI6IjMxMC41MyJ9LHsiZGF0ZSI6IjE5LU9jdC0xMCIsImNsb3NlIjoiMzA5LjQ5In0seyJkYXRlIjoiMTgtT2N0LTEwIiwiY2xvc2UiOiIzMTguMDAifSx7ImRhdGUiOiIxNS1PY3QtMTAiLCJjbG9zZSI6IjMxNC43NCJ9LHsiZGF0ZSI6IjE0LU9jdC0xMCIsImNsb3NlIjoiMzAyLjMxIn0seyJkYXRlIjoiMTMtT2N0LTEwIiwiY2xvc2UiOiIzMDAuMTQifSx7ImRhdGUiOiIxMi1PY3QtMTAiLCJjbG9zZSI6IjI5OC41NCJ9LHsiZGF0ZSI6IjExLU9jdC0xMCIsImNsb3NlIjoiMjk1LjM2In0seyJkYXRlIjoiOC1PY3QtMTAiLCJjbG9zZSI6IjI5NC4wNyJ9LHsiZGF0ZSI6IjctT2N0LTEwIiwiY2xvc2UiOiIyODkuMjIifSx7ImRhdGUiOiI2LU9jdC0xMCIsImNsb3NlIjoiMjg5LjE5In0seyJkYXRlIjoiNS1PY3QtMTAiLCJjbG9zZSI6IjI4OC45NCJ9LHsiZGF0ZSI6IjQtT2N0LTEwIiwiY2xvc2UiOiIyNzguNjQifSx7ImRhdGUiOiIxLU9jdC0xMCIsImNsb3NlIjoiMjgyLjUyIn0seyJkYXRlIjoiMzAtU2VwLTEwIiwiY2xvc2UiOiIyODMuNzUifSx7ImRhdGUiOiIyOS1TZXAtMTAiLCJjbG9zZSI6IjI4Ny4zNyJ9LHsiZGF0ZSI6IjI4LVNlcC0xMCIsImNsb3NlIjoiMjg2Ljg2In0seyJkYXRlIjoiMjctU2VwLTEwIiwiY2xvc2UiOiIyOTEuMTYifSx7ImRhdGUiOiIyNC1TZXAtMTAiLCJjbG9zZSI6IjI5Mi4zMiJ9LHsiZGF0ZSI6IjIzLVNlcC0xMCIsImNsb3NlIjoiMjg4LjkyIn0seyJkYXRlIjoiMjItU2VwLTEwIiwiY2xvc2UiOiIyODcuNzUifSx7ImRhdGUiOiIyMS1TZXAtMTAiLCJjbG9zZSI6IjI4My43NyJ9LHsiZGF0ZSI6IjIwLVNlcC0xMCIsImNsb3NlIjoiMjgzLjIzIn0seyJkYXRlIjoiMTctU2VwLTEwIiwiY2xvc2UiOiIyNzUuMzcifSx7ImRhdGUiOiIxNi1TZXAtMTAiLCJjbG9zZSI6IjI3Ni41NyJ9LHsiZGF0ZSI6IjE1LVNlcC0xMCIsImNsb3NlIjoiMjcwLjIyIn0seyJkYXRlIjoiMTQtU2VwLTEwIiwiY2xvc2UiOiIyNjguMDYifSx7ImRhdGUiOiIxMy1TZXAtMTAiLCJjbG9zZSI6IjI2Ny4wNCJ9LHsiZGF0ZSI6IjEwLVNlcC0xMCIsImNsb3NlIjoiMjYzLjQxIn0seyJkYXRlIjoiOS1TZXAtMTAiLCJjbG9zZSI6IjI2My4wNyJ9LHsiZGF0ZSI6IjgtU2VwLTEwIiwiY2xvc2UiOiIyNjIuOTIifSx7ImRhdGUiOiI3LVNlcC0xMCIsImNsb3NlIjoiMjU3LjgxIn0seyJkYXRlIjoiNi1TZXAtMTAiLCJjbG9zZSI6IjI1OC43NyJ9LHsiZGF0ZSI6IjMtU2VwLTEwIiwiY2xvc2UiOiIyNTguNzcifSx7ImRhdGUiOiIyLVNlcC0xMCIsImNsb3NlIjoiMjUyLjE3In0seyJkYXRlIjoiMS1TZXAtMTAiLCJjbG9zZSI6IjI1MC4zMyJ9LHsiZGF0ZSI6IjMxLUF1Zy0xMCIsImNsb3NlIjoiMjQzLjEwIn0seyJkYXRlIjoiMzAtQXVnLTEwIiwiY2xvc2UiOiIyNDIuNTAifSx7ImRhdGUiOiIyNy1BdWctMTAiLCJjbG9zZSI6IjI0MS42MiJ9LHsiZGF0ZSI6IjI2LUF1Zy0xMCIsImNsb3NlIjoiMjQwLjI4In0seyJkYXRlIjoiMjUtQXVnLTEwIiwiY2xvc2UiOiIyNDIuODkifSx7ImRhdGUiOiIyNC1BdWctMTAiLCJjbG9zZSI6IjIzOS45MyJ9LHsiZGF0ZSI6IjIzLUF1Zy0xMCIsImNsb3NlIjoiMjQ1LjgwIn0seyJkYXRlIjoiMjAtQXVnLTEwIiwiY2xvc2UiOiIyNDkuNjQifSx7ImRhdGUiOiIxOS1BdWctMTAiLCJjbG9zZSI6IjI0OS44OCJ9LHsiZGF0ZSI6IjE4LUF1Zy0xMCIsImNsb3NlIjoiMjUzLjA3In0seyJkYXRlIjoiMTctQXVnLTEwIiwiY2xvc2UiOiIyNTEuOTcifSx7ImRhdGUiOiIxNi1BdWctMTAiLCJjbG9zZSI6IjI0Ny42NCJ9LHsiZGF0ZSI6IjEzLUF1Zy0xMCIsImNsb3NlIjoiMjQ5LjEwIn0seyJkYXRlIjoiMTItQXVnLTEwIiwiY2xvc2UiOiIyNTEuNzkifSx7ImRhdGUiOiIxMS1BdWctMTAiLCJjbG9zZSI6IjI1MC4xOSJ9LHsiZGF0ZSI6IjEwLUF1Zy0xMCIsImNsb3NlIjoiMjU5LjQxIn0seyJkYXRlIjoiOS1BdWctMTAiLCJjbG9zZSI6IjI2MS43NSJ9LHsiZGF0ZSI6IjYtQXVnLTEwIiwiY2xvc2UiOiIyNjAuMDkifSx7ImRhdGUiOiI1LUF1Zy0xMCIsImNsb3NlIjoiMjYxLjcwIn0seyJkYXRlIjoiNC1BdWctMTAiLCJjbG9zZSI6IjI2Mi45OCJ9LHsiZGF0ZSI6IjMtQXVnLTEwIiwiY2xvc2UiOiIyNjEuOTMifSx7ImRhdGUiOiIyLUF1Zy0xMCIsImNsb3NlIjoiMjYxLjg1In0seyJkYXRlIjoiMzAtSnVsLTEwIiwiY2xvc2UiOiIyNTcuMjUifSx7ImRhdGUiOiIyOS1KdWwtMTAiLCJjbG9zZSI6IjI1OC4xMSJ9LHsiZGF0ZSI6IjI4LUp1bC0xMCIsImNsb3NlIjoiMjYwLjk2In0seyJkYXRlIjoiMjctSnVsLTEwIiwiY2xvc2UiOiIyNjQuMDgifSx7ImRhdGUiOiIyNi1KdWwtMTAiLCJjbG9zZSI6IjI1OS4yOCJ9LHsiZGF0ZSI6IjIzLUp1bC0xMCIsImNsb3NlIjoiMjU5Ljk0In0seyJkYXRlIjoiMjItSnVsLTEwIiwiY2xvc2UiOiIyNTkuMDIifSx7ImRhdGUiOiIyMS1KdWwtMTAiLCJjbG9zZSI6IjI1NC4yNCJ9LHsiZGF0ZSI6IjIwLUp1bC0xMCIsImNsb3NlIjoiMjUxLjg5In0seyJkYXRlIjoiMTktSnVsLTEwIiwiY2xvc2UiOiIyNDUuNTgifSx7ImRhdGUiOiIxNi1KdWwtMTAiLCJjbG9zZSI6IjI0OS45MCJ9LHsiZGF0ZSI6IjE1LUp1bC0xMCIsImNsb3NlIjoiMjUxLjQ1In0seyJkYXRlIjoiMTQtSnVsLTEwIiwiY2xvc2UiOiIyNTIuNzMifSx7ImRhdGUiOiIxMy1KdWwtMTAiLCJjbG9zZSI6IjI1MS44MCJ9LHsiZGF0ZSI6IjEyLUp1bC0xMCIsImNsb3NlIjoiMjU3LjI4In0seyJkYXRlIjoiOS1KdWwtMTAiLCJjbG9zZSI6IjI1OS42MiJ9LHsiZGF0ZSI6IjgtSnVsLTEwIiwiY2xvc2UiOiIyNTguMDkifSx7ImRhdGUiOiI3LUp1bC0xMCIsImNsb3NlIjoiMjU4LjY2In0seyJkYXRlIjoiNi1KdWwtMTAiLCJjbG9zZSI6IjI0OC42MyJ9LHsiZGF0ZSI6IjUtSnVsLTEwIiwiY2xvc2UiOiIyNDYuOTQifSx7ImRhdGUiOiIyLUp1bC0xMCIsImNsb3NlIjoiMjQ2Ljk0In0seyJkYXRlIjoiMS1KdWwtMTAiLCJjbG9zZSI6IjI0OC40OCJ9LHsiZGF0ZSI6IjMwLUp1bi0xMCIsImNsb3NlIjoiMjUxLjUzIn0seyJkYXRlIjoiMjktSnVuLTEwIiwiY2xvc2UiOiIyNTYuMTcifSx7ImRhdGUiOiIyOC1KdW4tMTAiLCJjbG9zZSI6IjI2OC4zMCJ9LHsiZGF0ZSI6IjI1LUp1bi0xMCIsImNsb3NlIjoiMjY2LjcwIn0seyJkYXRlIjoiMjQtSnVuLTEwIiwiY2xvc2UiOiIyNjkuMDAifSx7ImRhdGUiOiIyMy1KdW4tMTAiLCJjbG9zZSI6IjI3MC45NyJ9LHsiZGF0ZSI6IjIyLUp1bi0xMCIsImNsb3NlIjoiMjczLjg1In0seyJkYXRlIjoiMjEtSnVuLTEwIiwiY2xvc2UiOiIyNzAuMTcifSx7ImRhdGUiOiIxOC1KdW4tMTAiLCJjbG9zZSI6IjI3NC4wNyJ9LHsiZGF0ZSI6IjE3LUp1bi0xMCIsImNsb3NlIjoiMjcxLjg3In0seyJkYXRlIjoiMTYtSnVuLTEwIiwiY2xvc2UiOiIyNjcuMjUifSx7ImRhdGUiOiIxNS1KdW4tMTAiLCJjbG9zZSI6IjI1OS42OSJ9LHsiZGF0ZSI6IjE0LUp1bi0xMCIsImNsb3NlIjoiMjU0LjI4In0seyJkYXRlIjoiMTEtSnVuLTEwIiwiY2xvc2UiOiIyNTMuNTEifSx7ImRhdGUiOiIxMC1KdW4tMTAiLCJjbG9zZSI6IjI1MC41MSJ9LHsiZGF0ZSI6IjktSnVuLTEwIiwiY2xvc2UiOiIyNDMuMjAifSx7ImRhdGUiOiI4LUp1bi0xMCIsImNsb3NlIjoiMjQ5LjMzIn0seyJkYXRlIjoiNy1KdW4tMTAiLCJjbG9zZSI6IjI1MC45NCJ9LHsiZGF0ZSI6IjQtSnVuLTEwIiwiY2xvc2UiOiIyNTUuOTYifSx7ImRhdGUiOiIzLUp1bi0xMCIsImNsb3NlIjoiMjYzLjEyIn0seyJkYXRlIjoiMi1KdW4tMTAiLCJjbG9zZSI6IjI2My45NSJ9LHsiZGF0ZSI6IjEtSnVuLTEwIiwiY2xvc2UiOiIyNjAuODMifSx7ImRhdGUiOiIzMS1NYXktMTAiLCJjbG9zZSI6IjI1Ni44OCJ9LHsiZGF0ZSI6IjI4LU1heS0xMCIsImNsb3NlIjoiMjU2Ljg4In0seyJkYXRlIjoiMjctTWF5LTEwIiwiY2xvc2UiOiIyNTMuMzUifSx7ImRhdGUiOiIyNi1NYXktMTAiLCJjbG9zZSI6IjI0NC4xMSJ9LHsiZGF0ZSI6IjI1LU1heS0xMCIsImNsb3NlIjoiMjQ1LjIyIn0seyJkYXRlIjoiMjQtTWF5LTEwIiwiY2xvc2UiOiIyNDYuNzYifSx7ImRhdGUiOiIyMS1NYXktMTAiLCJjbG9zZSI6IjI0Mi4zMiJ9LHsiZGF0ZSI6IjIwLU1heS0xMCIsImNsb3NlIjoiMjM3Ljc2In0seyJkYXRlIjoiMTktTWF5LTEwIiwiY2xvc2UiOiIyNDguMzQifSx7ImRhdGUiOiIxOC1NYXktMTAiLCJjbG9zZSI6IjI1Mi4zNiJ9LHsiZGF0ZSI6IjE3LU1heS0xMCIsImNsb3NlIjoiMjU0LjIyIn0seyJkYXRlIjoiMTQtTWF5LTEwIiwiY2xvc2UiOiIyNTMuODIifSx7ImRhdGUiOiIxMy1NYXktMTAiLCJjbG9zZSI6IjI1OC4zNiJ9LHsiZGF0ZSI6IjEyLU1heS0xMCIsImNsb3NlIjoiMjYyLjA5In0seyJkYXRlIjoiMTEtTWF5LTEwIiwiY2xvc2UiOiIyNTYuNTIifSx7ImRhdGUiOiIxMC1NYXktMTAiLCJjbG9zZSI6IjI1My45OSJ9LHsiZGF0ZSI6IjctTWF5LTEwIiwiY2xvc2UiOiIyMzUuODYifSx7ImRhdGUiOiI2LU1heS0xMCIsImNsb3NlIjoiMjQ2LjI1In0seyJkYXRlIjoiNS1NYXktMTAiLCJjbG9zZSI6IjI1NS45OCJ9LHsiZGF0ZSI6IjQtTWF5LTEwIiwiY2xvc2UiOiIyNTguNjgifSx7ImRhdGUiOiIzLU1heS0xMCIsImNsb3NlIjoiMjY2LjM1In0seyJkYXRlIjoiMzAtQXByLTEwIiwiY2xvc2UiOiIyNjEuMDkifSx7ImRhdGUiOiIyOS1BcHItMTAiLCJjbG9zZSI6IjI2OC42NCJ9LHsiZGF0ZSI6IjI4LUFwci0xMCIsImNsb3NlIjoiMjYxLjYwIn0seyJkYXRlIjoiMjctQXByLTEwIiwiY2xvc2UiOiIyNjIuMDQifSx7ImRhdGUiOiIyNi1BcHItMTAiLCJjbG9zZSI6IjI2OS41MCJ9LHsiZGF0ZSI6IjIzLUFwci0xMCIsImNsb3NlIjoiMjcwLjgzIn0seyJkYXRlIjoiMjItQXByLTEwIiwiY2xvc2UiOiIyNjYuNDcifSx7ImRhdGUiOiIyMS1BcHItMTAiLCJjbG9zZSI6IjI1OS4yMiJ9LHsiZGF0ZSI6IjIwLUFwci0xMCIsImNsb3NlIjoiMjQ0LjU5In0seyJkYXRlIjoiMTktQXByLTEwIiwiY2xvc2UiOiIyNDcuMDcifSx7ImRhdGUiOiIxNi1BcHItMTAiLCJjbG9zZSI6IjI0Ny40MCJ9LHsiZGF0ZSI6IjE1LUFwci0xMCIsImNsb3NlIjoiMjQ4LjkyIn0seyJkYXRlIjoiMTQtQXByLTEwIiwiY2xvc2UiOiIyNDUuNjkifSx7ImRhdGUiOiIxMy1BcHItMTAiLCJjbG9zZSI6IjI0Mi40MyJ9LHsiZGF0ZSI6IjEyLUFwci0xMCIsImNsb3NlIjoiMjQyLjI5In0seyJkYXRlIjoiOS1BcHItMTAiLCJjbG9zZSI6IjI0MS43OSJ9LHsiZGF0ZSI6IjgtQXByLTEwIiwiY2xvc2UiOiIyMzkuOTUifSx7ImRhdGUiOiI3LUFwci0xMCIsImNsb3NlIjoiMjQwLjYwIn0seyJkYXRlIjoiNi1BcHItMTAiLCJjbG9zZSI6IjIzOS41NCJ9LHsiZGF0ZSI6IjUtQXByLTEwIiwiY2xvc2UiOiIyMzguNDkifSx7ImRhdGUiOiIyLUFwci0xMCIsImNsb3NlIjoiMjM1Ljk3In0seyJkYXRlIjoiMS1BcHItMTAiLCJjbG9zZSI6IjIzNS45NyJ9LHsiZGF0ZSI6IjMxLU1hci0xMCIsImNsb3NlIjoiMjM1LjAwIn0seyJkYXRlIjoiMzAtTWFyLTEwIiwiY2xvc2UiOiIyMzUuODQifSx7ImRhdGUiOiIyOS1NYXItMTAiLCJjbG9zZSI6IjIzMi4zOSJ9LHsiZGF0ZSI6IjI2LU1hci0xMCIsImNsb3NlIjoiMjMwLjkwIn0seyJkYXRlIjoiMjUtTWFyLTEwIiwiY2xvc2UiOiIyMjYuNjUifSx7ImRhdGUiOiIyNC1NYXItMTAiLCJjbG9zZSI6IjIyOS4zNyJ9LHsiZGF0ZSI6IjIzLU1hci0xMCIsImNsb3NlIjoiMjI4LjM2In0seyJkYXRlIjoiMjItTWFyLTEwIiwiY2xvc2UiOiIyMjQuNzUifSx7ImRhdGUiOiIxOS1NYXItMTAiLCJjbG9zZSI6IjIyMi4yNSJ9LHsiZGF0ZSI6IjE4LU1hci0xMCIsImNsb3NlIjoiMjI0LjY1In0seyJkYXRlIjoiMTctTWFyLTEwIiwiY2xvc2UiOiIyMjQuMTIifSx7ImRhdGUiOiIxNi1NYXItMTAiLCJjbG9zZSI6IjIyNC40NSJ9LHsiZGF0ZSI6IjE1LU1hci0xMCIsImNsb3NlIjoiMjIzLjg0In0seyJkYXRlIjoiMTItTWFyLTEwIiwiY2xvc2UiOiIyMjYuNjAifSx7ImRhdGUiOiIxMS1NYXItMTAiLCJjbG9zZSI6IjIyNS41MCJ9LHsiZGF0ZSI6IjEwLU1hci0xMCIsImNsb3NlIjoiMjI0Ljg0In0seyJkYXRlIjoiOS1NYXItMTAiLCJjbG9zZSI6IjIyMy4wMiJ9LHsiZGF0ZSI6IjgtTWFyLTEwIiwiY2xvc2UiOiIyMTkuMDgifSx7ImRhdGUiOiI1LU1hci0xMCIsImNsb3NlIjoiMjE4Ljk1In0seyJkYXRlIjoiNC1NYXItMTAiLCJjbG9zZSI6IjIxMC43MSJ9LHsiZGF0ZSI6IjMtTWFyLTEwIiwiY2xvc2UiOiIyMDkuMzMifSx7ImRhdGUiOiIyLU1hci0xMCIsImNsb3NlIjoiMjA4Ljg1In0seyJkYXRlIjoiMS1NYXItMTAiLCJjbG9zZSI6IjIwOC45OSJ9LHsiZGF0ZSI6IjI2LUZlYi0xMCIsImNsb3NlIjoiMjA0LjYyIn0seyJkYXRlIjoiMjUtRmViLTEwIiwiY2xvc2UiOiIyMDIuMDAifSx7ImRhdGUiOiIyNC1GZWItMTAiLCJjbG9zZSI6IjIwMC42NiJ9LHsiZGF0ZSI6IjIzLUZlYi0xMCIsImNsb3NlIjoiMTk3LjA2In0seyJkYXRlIjoiMjItRmViLTEwIiwiY2xvc2UiOiIyMDAuNDIifSx7ImRhdGUiOiIxOS1GZWItMTAiLCJjbG9zZSI6IjIwMS42NyJ9LHsiZGF0ZSI6IjE4LUZlYi0xMCIsImNsb3NlIjoiMjAyLjkzIn0seyJkYXRlIjoiMTctRmViLTEwIiwiY2xvc2UiOiIyMDIuNTUifSx7ImRhdGUiOiIxNi1GZWItMTAiLCJjbG9zZSI6IjIwMy40MCJ9LHsiZGF0ZSI6IjE1LUZlYi0xMCIsImNsb3NlIjoiMjAwLjM4In0seyJkYXRlIjoiMTItRmViLTEwIiwiY2xvc2UiOiIyMDAuMzgifSx7ImRhdGUiOiIxMS1GZWItMTAiLCJjbG9zZSI6IjE5OC42NyJ9LHsiZGF0ZSI6IjEwLUZlYi0xMCIsImNsb3NlIjoiMTk1LjEyIn0seyJkYXRlIjoiOS1GZWItMTAiLCJjbG9zZSI6IjE5Ni4xOSJ9LHsiZGF0ZSI6IjgtRmViLTEwIiwiY2xvc2UiOiIxOTQuMTIifSx7ImRhdGUiOiI1LUZlYi0xMCIsImNsb3NlIjoiMTk1LjQ2In0seyJkYXRlIjoiNC1GZWItMTAiLCJjbG9zZSI6IjE5Mi4wNSJ9LHsiZGF0ZSI6IjMtRmViLTEwIiwiY2xvc2UiOiIxOTkuMjMifSx7ImRhdGUiOiIyLUZlYi0xMCIsImNsb3NlIjoiMTk1Ljg2In0seyJkYXRlIjoiMS1GZWItMTAiLCJjbG9zZSI6IjE5NC43MyJ9LHsiZGF0ZSI6IjI5LUphbi0xMCIsImNsb3NlIjoiMTkyLjA2In0seyJkYXRlIjoiMjgtSmFuLTEwIiwiY2xvc2UiOiIxOTkuMjkifSx7ImRhdGUiOiIyNy1KYW4tMTAiLCJjbG9zZSI6IjIwNy44OCJ9LHsiZGF0ZSI6IjI2LUphbi0xMCIsImNsb3NlIjoiMjA1Ljk0In0seyJkYXRlIjoiMjUtSmFuLTEwIiwiY2xvc2UiOiIyMDMuMDgifSx7ImRhdGUiOiIyMi1KYW4tMTAiLCJjbG9zZSI6IjE5Ny43NSJ9LHsiZGF0ZSI6IjIxLUphbi0xMCIsImNsb3NlIjoiMjA4LjA3In0seyJkYXRlIjoiMjAtSmFuLTEwIiwiY2xvc2UiOiIyMTEuNzIifSx7ImRhdGUiOiIxOS1KYW4tMTAiLCJjbG9zZSI6IjIxNS4wNCJ9LHsiZGF0ZSI6IjE4LUphbi0xMCIsImNsb3NlIjoiMjA1LjkzIn0seyJkYXRlIjoiMTUtSmFuLTEwIiwiY2xvc2UiOiIyMDUuOTMifSx7ImRhdGUiOiIxNC1KYW4tMTAiLCJjbG9zZSI6IjIwOS40MyJ9LHsiZGF0ZSI6IjEzLUphbi0xMCIsImNsb3NlIjoiMjEwLjY1In0seyJkYXRlIjoiMTItSmFuLTEwIiwiY2xvc2UiOiIyMDcuNzIifSx7ImRhdGUiOiIxMS1KYW4tMTAiLCJjbG9zZSI6IjIxMC4xMSJ9LHsiZGF0ZSI6IjgtSmFuLTEwIiwiY2xvc2UiOiIyMTEuOTgifSx7ImRhdGUiOiI3LUphbi0xMCIsImNsb3NlIjoiMjEwLjU4In0seyJkYXRlIjoiNi1KYW4tMTAiLCJjbG9zZSI6IjIxMC45NyJ9LHsiZGF0ZSI6IjUtSmFuLTEwIiwiY2xvc2UiOiIyMTQuMzgifSx7ImRhdGUiOiI0LUphbi0xMCIsImNsb3NlIjoiMjE0LjAxIn0seyJkYXRlIjoiMS1KYW4tMTAiLCJjbG9zZSI6IjIxMC43MyJ9LHsiZGF0ZSI6IjMxLURlYy0wOSIsImNsb3NlIjoiMjEwLjczIn0seyJkYXRlIjoiMzAtRGVjLTA5IiwiY2xvc2UiOiIyMTEuNjQifSx7ImRhdGUiOiIyOS1EZWMtMDkiLCJjbG9zZSI6IjIwOS4xMCJ9LHsiZGF0ZSI6IjI4LURlYy0wOSIsImNsb3NlIjoiMjExLjYxIn0seyJkYXRlIjoiMjUtRGVjLTA5IiwiY2xvc2UiOiIyMDkuMDQifSx7ImRhdGUiOiIyNC1EZWMtMDkiLCJjbG9zZSI6IjIwOS4wNCJ9LHsiZGF0ZSI6IjIzLURlYy0wOSIsImNsb3NlIjoiMjAyLjEwIn0seyJkYXRlIjoiMjItRGVjLTA5IiwiY2xvc2UiOiIyMDAuMzYifSx7ImRhdGUiOiIyMS1EZWMtMDkiLCJjbG9zZSI6IjE5OC4yMyJ9LHsiZGF0ZSI6IjE4LURlYy0wOSIsImNsb3NlIjoiMTk1LjQzIn0seyJkYXRlIjoiMTctRGVjLTA5IiwiY2xvc2UiOiIxOTEuODYifSx7ImRhdGUiOiIxNi1EZWMtMDkiLCJjbG9zZSI6IjE5NS4wMyJ9LHsiZGF0ZSI6IjE1LURlYy0wOSIsImNsb3NlIjoiMTk0LjE3In0seyJkYXRlIjoiMTQtRGVjLTA5IiwiY2xvc2UiOiIxOTYuOTgifSx7ImRhdGUiOiIxMS1EZWMtMDkiLCJjbG9zZSI6IjE5NC42NyJ9LHsiZGF0ZSI6IjEwLURlYy0wOSIsImNsb3NlIjoiMTk2LjQzIn0seyJkYXRlIjoiOS1EZWMtMDkiLCJjbG9zZSI6IjE5Ny44MCJ9LHsiZGF0ZSI6IjgtRGVjLTA5IiwiY2xvc2UiOiIxODkuODcifSx7ImRhdGUiOiI3LURlYy0wOSIsImNsb3NlIjoiMTg4Ljk1In0seyJkYXRlIjoiNC1EZWMtMDkiLCJjbG9zZSI6IjE5My4zMiJ9LHsiZGF0ZSI6IjMtRGVjLTA5IiwiY2xvc2UiOiIxOTYuNDgifSx7ImRhdGUiOiIyLURlYy0wOSIsImNsb3NlIjoiMTk2LjIzIn0seyJkYXRlIjoiMS1EZWMtMDkiLCJjbG9zZSI6IjE5Ni45NyJ9LHsiZGF0ZSI6IjMwLU5vdi0wOSIsImNsb3NlIjoiMTk5LjkxIn0seyJkYXRlIjoiMjctTm92LTA5IiwiY2xvc2UiOiIyMDAuNTkifSx7ImRhdGUiOiIyNi1Ob3YtMDkiLCJjbG9zZSI6IjIwNC4xOSJ9LHsiZGF0ZSI6IjI1LU5vdi0wOSIsImNsb3NlIjoiMjA0LjE5In0seyJkYXRlIjoiMjQtTm92LTA5IiwiY2xvc2UiOiIyMDQuNDQifSx7ImRhdGUiOiIyMy1Ob3YtMDkiLCJjbG9zZSI6IjIwNS44OCJ9LHsiZGF0ZSI6IjIwLU5vdi0wOSIsImNsb3NlIjoiMTk5LjkyIn0seyJkYXRlIjoiMTktTm92LTA5IiwiY2xvc2UiOiIyMDAuNTEifSx7ImRhdGUiOiIxOC1Ob3YtMDkiLCJjbG9zZSI6IjIwNS45NiJ9LHsiZGF0ZSI6IjE3LU5vdi0wOSIsImNsb3NlIjoiMjA3LjAwIn0seyJkYXRlIjoiMTYtTm92LTA5IiwiY2xvc2UiOiIyMDYuNjMifSx7ImRhdGUiOiIxMy1Ob3YtMDkiLCJjbG9zZSI6IjIwNC40NSJ9LHsiZGF0ZSI6IjEyLU5vdi0wOSIsImNsb3NlIjoiMjAxLjk5In0seyJkYXRlIjoiMTEtTm92LTA5IiwiY2xvc2UiOiIyMDMuMjUifSx7ImRhdGUiOiIxMC1Ob3YtMDkiLCJjbG9zZSI6IjIwMi45OCJ9LHsiZGF0ZSI6IjktTm92LTA5IiwiY2xvc2UiOiIyMDEuNDYifSx7ImRhdGUiOiI2LU5vdi0wOSIsImNsb3NlIjoiMTk0LjM0In0seyJkYXRlIjoiNS1Ob3YtMDkiLCJjbG9zZSI6IjE5NC4wMyJ9LHsiZGF0ZSI6IjQtTm92LTA5IiwiY2xvc2UiOiIxOTAuODEifSx7ImRhdGUiOiIzLU5vdi0wOSIsImNsb3NlIjoiMTg4Ljc1In0seyJkYXRlIjoiMi1Ob3YtMDkiLCJjbG9zZSI6IjE4OS4zMSJ9LHsiZGF0ZSI6IjMwLU9jdC0wOSIsImNsb3NlIjoiMTg4LjUwIn0seyJkYXRlIjoiMjktT2N0LTA5IiwiY2xvc2UiOiIxOTYuMzUifSx7ImRhdGUiOiIyOC1PY3QtMDkiLCJjbG9zZSI6IjE5Mi40MCJ9LHsiZGF0ZSI6IjI3LU9jdC0wOSIsImNsb3NlIjoiMTk3LjM3In0seyJkYXRlIjoiMjYtT2N0LTA5IiwiY2xvc2UiOiIyMDIuNDgifSx7ImRhdGUiOiIyMy1PY3QtMDkiLCJjbG9zZSI6IjIwMy45NCJ9LHsiZGF0ZSI6IjIyLU9jdC0wOSIsImNsb3NlIjoiMjA1LjIwIn0seyJkYXRlIjoiMjEtT2N0LTA5IiwiY2xvc2UiOiIyMDQuOTIifSx7ImRhdGUiOiIyMC1PY3QtMDkiLCJjbG9zZSI6IjE5OC43NiJ9LHsiZGF0ZSI6IjE5LU9jdC0wOSIsImNsb3NlIjoiMTg5Ljg2In0seyJkYXRlIjoiMTYtT2N0LTA5IiwiY2xvc2UiOiIxODguMDUifSx7ImRhdGUiOiIxNS1PY3QtMDkiLCJjbG9zZSI6IjE5MC41NiJ9LHsiZGF0ZSI6IjE0LU9jdC0wOSIsImNsb3NlIjoiMTkxLjI5In0seyJkYXRlIjoiMTMtT2N0LTA5IiwiY2xvc2UiOiIxOTAuMDIifSx7ImRhdGUiOiIxMi1PY3QtMDkiLCJjbG9zZSI6IjE5MC44MSJ9LHsiZGF0ZSI6IjktT2N0LTA5IiwiY2xvc2UiOiIxOTAuNDcifSx7ImRhdGUiOiI4LU9jdC0wOSIsImNsb3NlIjoiMTg5LjI3In0seyJkYXRlIjoiNy1PY3QtMDkiLCJjbG9zZSI6IjE5MC4yNSJ9LHsiZGF0ZSI6IjYtT2N0LTA5IiwiY2xvc2UiOiIxOTAuMDEifSx7ImRhdGUiOiI1LU9jdC0wOSIsImNsb3NlIjoiMTg2LjAyIn0seyJkYXRlIjoiMi1PY3QtMDkiLCJjbG9zZSI6IjE4NC45MCJ9LHsiZGF0ZSI6IjEtT2N0LTA5IiwiY2xvc2UiOiIxODAuODYifSx7ImRhdGUiOiIzMC1TZXAtMDkiLCJjbG9zZSI6IjE4NS4zNSJ9LHsiZGF0ZSI6IjI5LVNlcC0wOSIsImNsb3NlIjoiMTg1LjM4In0seyJkYXRlIjoiMjgtU2VwLTA5IiwiY2xvc2UiOiIxODYuMTUifSx7ImRhdGUiOiIyNS1TZXAtMDkiLCJjbG9zZSI6IjE4Mi4zNyJ9LHsiZGF0ZSI6IjI0LVNlcC0wOSIsImNsb3NlIjoiMTgzLjgyIn0seyJkYXRlIjoiMjMtU2VwLTA5IiwiY2xvc2UiOiIxODUuNTAifSx7ImRhdGUiOiIyMi1TZXAtMDkiLCJjbG9zZSI6IjE4NC40OCJ9LHsiZGF0ZSI6IjIxLVNlcC0wOSIsImNsb3NlIjoiMTg0LjAyIn0seyJkYXRlIjoiMTgtU2VwLTA5IiwiY2xvc2UiOiIxODUuMDIifSx7ImRhdGUiOiIxNy1TZXAtMDkiLCJjbG9zZSI6IjE4NC41NSJ9LHsiZGF0ZSI6IjE2LVNlcC0wOSIsImNsb3NlIjoiMTgxLjg3In0seyJkYXRlIjoiMTUtU2VwLTA5IiwiY2xvc2UiOiIxNzUuMTYifSx7ImRhdGUiOiIxNC1TZXAtMDkiLCJjbG9zZSI6IjE3My43MiJ9LHsiZGF0ZSI6IjExLVNlcC0wOSIsImNsb3NlIjoiMTcyLjE2In0seyJkYXRlIjoiMTAtU2VwLTA5IiwiY2xvc2UiOiIxNzIuNTYifSx7ImRhdGUiOiI5LVNlcC0wOSIsImNsb3NlIjoiMTcxLjE0In0seyJkYXRlIjoiOC1TZXAtMDkiLCJjbG9zZSI6IjE3Mi45MyJ9LHsiZGF0ZSI6IjQtU2VwLTA5IiwiY2xvc2UiOiIxNzAuMzEifSx7ImRhdGUiOiIzLVNlcC0wOSIsImNsb3NlIjoiMTY2LjU1In0seyJkYXRlIjoiMi1TZXAtMDkiLCJjbG9zZSI6IjE2NS4xOCJ9LHsiZGF0ZSI6IjEtU2VwLTA5IiwiY2xvc2UiOiIxNjUuMzAifSx7ImRhdGUiOiIzMS1BdWctMDkiLCJjbG9zZSI6IjE2OC4yMSJ9LHsiZGF0ZSI6IjI4LUF1Zy0wOSIsImNsb3NlIjoiMTcwLjA1In0seyJkYXRlIjoiMjctQXVnLTA5IiwiY2xvc2UiOiIxNjkuNDUifSx7ImRhdGUiOiIyNi1BdWctMDkiLCJjbG9zZSI6IjE2Ny40MSJ9LHsiZGF0ZSI6IjI1LUF1Zy0wOSIsImNsb3NlIjoiMTY5LjQwIn0seyJkYXRlIjoiMjQtQXVnLTA5IiwiY2xvc2UiOiIxNjkuMDYifSx7ImRhdGUiOiIyMS1BdWctMDkiLCJjbG9zZSI6IjE2OS4yMiJ9LHsiZGF0ZSI6IjIwLUF1Zy0wOSIsImNsb3NlIjoiMTY2LjMzIn0seyJkYXRlIjoiMTktQXVnLTA5IiwiY2xvc2UiOiIxNjQuNjAifSx7ImRhdGUiOiIxOC1BdWctMDkiLCJjbG9zZSI6IjE2NC4wMCJ9LHsiZGF0ZSI6IjE3LUF1Zy0wOSIsImNsb3NlIjoiMTU5LjU5In0seyJkYXRlIjoiMTQtQXVnLTA5IiwiY2xvc2UiOiIxNjYuNzgifSx7ImRhdGUiOiIxMy1BdWctMDkiLCJjbG9zZSI6IjE2OC40MiJ9LHsiZGF0ZSI6IjEyLUF1Zy0wOSIsImNsb3NlIjoiMTY1LjMxIn0seyJkYXRlIjoiMTAtQXVnLTA5IiwiY2xvc2UiOiIxNjQuNzIifSx7ImRhdGUiOiI3LUF1Zy0wOSIsImNsb3NlIjoiMTY1LjUxIn0seyJkYXRlIjoiNi1BdWctMDkiLCJjbG9zZSI6IjE2My45MSJ9LHsiZGF0ZSI6IjUtQXVnLTA5IiwiY2xvc2UiOiIxNjUuMTEifSx7ImRhdGUiOiI0LUF1Zy0wOSIsImNsb3NlIjoiMTY1LjU1In0seyJkYXRlIjoiMy1BdWctMDkiLCJjbG9zZSI6IjE2Ni40MyJ9LHsiZGF0ZSI6IjMxLUp1bC0wOSIsImNsb3NlIjoiMTYzLjM5In0seyJkYXRlIjoiMzAtSnVsLTA5IiwiY2xvc2UiOiIxNjIuNzkifSx7ImRhdGUiOiIyOS1KdWwtMDkiLCJjbG9zZSI6IjE2MC4wMyJ9LHsiZGF0ZSI6IjI4LUp1bC0wOSIsImNsb3NlIjoiMTYwLjAwIn0seyJkYXRlIjoiMjctSnVsLTA5IiwiY2xvc2UiOiIxNjAuMTAifSx7ImRhdGUiOiIyNC1KdWwtMDkiLCJjbG9zZSI6IjE1OS45OSJ9LHsiZGF0ZSI6IjIzLUp1bC0wOSIsImNsb3NlIjoiMTU3LjgyIn0seyJkYXRlIjoiMjItSnVsLTA5IiwiY2xvc2UiOiIxNTYuNzQifSx7ImRhdGUiOiIyMS1KdWwtMDkiLCJjbG9zZSI6IjE1MS41MSJ9LHsiZGF0ZSI6IjIwLUp1bC0wOSIsImNsb3NlIjoiMTUyLjkxIn0seyJkYXRlIjoiMTctSnVsLTA5IiwiY2xvc2UiOiIxNTEuNzUifSx7ImRhdGUiOiIxNi1KdWwtMDkiLCJjbG9zZSI6IjE0Ny41MiJ9LHsiZGF0ZSI6IjE1LUp1bC0wOSIsImNsb3NlIjoiMTQ2Ljg4In0seyJkYXRlIjoiMTQtSnVsLTA5IiwiY2xvc2UiOiIxNDIuMjcifSx7ImRhdGUiOiIxMy1KdWwtMDkiLCJjbG9zZSI6IjE0Mi4zNCJ9LHsiZGF0ZSI6IjEwLUp1bC0wOSIsImNsb3NlIjoiMTM4LjUyIn0seyJkYXRlIjoiOS1KdWwtMDkiLCJjbG9zZSI6IjEzNi4zNiJ9LHsiZGF0ZSI6IjgtSnVsLTA5IiwiY2xvc2UiOiIxMzcuMjIifSx7ImRhdGUiOiI3LUp1bC0wOSIsImNsb3NlIjoiMTM1LjQwIn0seyJkYXRlIjoiNi1KdWwtMDkiLCJjbG9zZSI6IjEzOC42MSJ9LHsiZGF0ZSI6IjMtSnVsLTA5IiwiY2xvc2UiOiIxNDAuMDIifSx7ImRhdGUiOiIyLUp1bC0wOSIsImNsb3NlIjoiMTQwLjAyIn0seyJkYXRlIjoiMS1KdWwtMDkiLCJjbG9zZSI6IjE0Mi44MyJ9LHsiZGF0ZSI6IjMwLUp1bi0wOSIsImNsb3NlIjoiMTQyLjQzIn0seyJkYXRlIjoiMjktSnVuLTA5IiwiY2xvc2UiOiIxNDEuOTcifSx7ImRhdGUiOiIyNi1KdW4tMDkiLCJjbG9zZSI6IjE0Mi40NCJ9LHsiZGF0ZSI6IjI1LUp1bi0wOSIsImNsb3NlIjoiMTM5Ljg2In0seyJkYXRlIjoiMjQtSnVuLTA5IiwiY2xvc2UiOiIxMzYuMjIifSx7ImRhdGUiOiIyMy1KdW4tMDkiLCJjbG9zZSI6IjEzNC4wMSJ9LHsiZGF0ZSI6IjIyLUp1bi0wOSIsImNsb3NlIjoiMTM3LjM3In0seyJkYXRlIjoiMTktSnVuLTA5IiwiY2xvc2UiOiIxMzkuNDgifSx7ImRhdGUiOiIxOC1KdW4tMDkiLCJjbG9zZSI6IjEzNS44OCJ9LHsiZGF0ZSI6IjE3LUp1bi0wOSIsImNsb3NlIjoiMTM1LjU4In0seyJkYXRlIjoiMTYtSnVuLTA5IiwiY2xvc2UiOiIxMzYuMzUifSx7ImRhdGUiOiIxNS1KdW4tMDkiLCJjbG9zZSI6IjEzNi4wOSJ9LHsiZGF0ZSI6IjEyLUp1bi0wOSIsImNsb3NlIjoiMTM2Ljk3In0seyJkYXRlIjoiMTEtSnVuLTA5IiwiY2xvc2UiOiIxMzkuOTUifSx7ImRhdGUiOiIxMC1KdW4tMDkiLCJjbG9zZSI6IjE0MC4yNSJ9LHsiZGF0ZSI6IjktSnVuLTA5IiwiY2xvc2UiOiIxNDIuNzIifSx7ImRhdGUiOiI4LUp1bi0wOSIsImNsb3NlIjoiMTQzLjg1In0seyJkYXRlIjoiNS1KdW4tMDkiLCJjbG9zZSI6IjE0NC42NyJ9LHsiZGF0ZSI6IjQtSnVuLTA5IiwiY2xvc2UiOiIxNDMuNzQifSx7ImRhdGUiOiIzLUp1bi0wOSIsImNsb3NlIjoiMTQwLjk1In0seyJkYXRlIjoiMi1KdW4tMDkiLCJjbG9zZSI6IjEzOS40OSJ9LHsiZGF0ZSI6IjEtSnVuLTA5IiwiY2xvc2UiOiIxMzkuMzUifSx7ImRhdGUiOiIyOS1NYXktMDkiLCJjbG9zZSI6IjEzNS44MSJ9LHsiZGF0ZSI6IjI4LU1heS0wOSIsImNsb3NlIjoiMTM1LjA3In0seyJkYXRlIjoiMjctTWF5LTA5IiwiY2xvc2UiOiIxMzMuMDUifSx7ImRhdGUiOiIyNi1NYXktMDkiLCJjbG9zZSI6IjEzMC43OCJ9LHsiZGF0ZSI6IjIyLU1heS0wOSIsImNsb3NlIjoiMTIyLjUwIn0seyJkYXRlIjoiMjEtTWF5LTA5IiwiY2xvc2UiOiIxMjQuMTgifSx7ImRhdGUiOiIyMC1NYXktMDkiLCJjbG9zZSI6IjEyNS44NyJ9LHsiZGF0ZSI6IjE5LU1heS0wOSIsImNsb3NlIjoiMTI3LjQ1In0seyJkYXRlIjoiMTgtTWF5LTA5IiwiY2xvc2UiOiIxMjYuNjUifSx7ImRhdGUiOiIxNS1NYXktMDkiLCJjbG9zZSI6IjEyMi40MiJ9LHsiZGF0ZSI6IjE0LU1heS0wOSIsImNsb3NlIjoiMTIyLjk1In0seyJkYXRlIjoiMTMtTWF5LTA5IiwiY2xvc2UiOiIxMTkuNDkifSx7ImRhdGUiOiIxMi1NYXktMDkiLCJjbG9zZSI6IjEyNC40MiJ9LHsiZGF0ZSI6IjExLU1heS0wOSIsImNsb3NlIjoiMTI5LjU3In0seyJkYXRlIjoiOC1NYXktMDkiLCJjbG9zZSI6IjEyOS4xOSJ9LHsiZGF0ZSI6IjctTWF5LTA5IiwiY2xvc2UiOiIxMjkuMDYifSx7ImRhdGUiOiI2LU1heS0wOSIsImNsb3NlIjoiMTMyLjUwIn0seyJkYXRlIjoiNS1NYXktMDkiLCJjbG9zZSI6IjEzMi43MSJ9LHsiZGF0ZSI6IjQtTWF5LTA5IiwiY2xvc2UiOiIxMzIuMDcifSx7ImRhdGUiOiIxLU1heS0wOSIsImNsb3NlIjoiMTI3LjI0In0seyJkYXRlIjoiMzAtQXByLTA5IiwiY2xvc2UiOiIxMjUuODMifSx7ImRhdGUiOiIyOS1BcHItMDkiLCJjbG9zZSI6IjEyNS4xNCJ9LHsiZGF0ZSI6IjI4LUFwci0wOSIsImNsb3NlIjoiMTIzLjkwIn0seyJkYXRlIjoiMjctQXByLTA5IiwiY2xvc2UiOiIxMjQuNzMifSx7ImRhdGUiOiIyNC1BcHItMDkiLCJjbG9zZSI6IjEyMy45MCJ9LHsiZGF0ZSI6IjIzLUFwci0wOSIsImNsb3NlIjoiMTI1LjQwIn0seyJkYXRlIjoiMjItQXByLTA5IiwiY2xvc2UiOiIxMjEuNTEifSx7ImRhdGUiOiIyMS1BcHItMDkiLCJjbG9zZSI6IjEyMS43NiJ9LHsiZGF0ZSI6IjIwLUFwci0wOSIsImNsb3NlIjoiMTIwLjUwIn0seyJkYXRlIjoiMTctQXByLTA5IiwiY2xvc2UiOiIxMjMuNDIifSx7ImRhdGUiOiIxNi1BcHItMDkiLCJjbG9zZSI6IjEyMS40NSJ9LHsiZGF0ZSI6IjE1LUFwci0wOSIsImNsb3NlIjoiMTE3LjY0In0seyJkYXRlIjoiMTQtQXByLTA5IiwiY2xvc2UiOiIxMTguMzEifSx7ImRhdGUiOiIxMy1BcHItMDkiLCJjbG9zZSI6IjEyMC4yMiJ9LHsiZGF0ZSI6IjEwLUFwci0wOSIsImNsb3NlIjoiMTE5LjU3In0seyJkYXRlIjoiOS1BcHItMDkiLCJjbG9zZSI6IjExOS41NyJ9LHsiZGF0ZSI6IjgtQXByLTA5IiwiY2xvc2UiOiIxMTYuMzIifSx7ImRhdGUiOiI3LUFwci0wOSIsImNsb3NlIjoiMTE1LjAwIn0seyJkYXRlIjoiNi1BcHItMDkiLCJjbG9zZSI6IjExOC40NSJ9LHsiZGF0ZSI6IjMtQXByLTA5IiwiY2xvc2UiOiIxMTUuOTkifSx7ImRhdGUiOiIyLUFwci0wOSIsImNsb3NlIjoiMTEyLjcxIn0seyJkYXRlIjoiMS1BcHItMDkiLCJjbG9zZSI6IjEwOC42OSJ9LHsiZGF0ZSI6IjMxLU1hci0wOSIsImNsb3NlIjoiMTA1LjEyIn0seyJkYXRlIjoiMzAtTWFyLTA5IiwiY2xvc2UiOiIxMDQuNDkifSx7ImRhdGUiOiIyNy1NYXItMDkiLCJjbG9zZSI6IjEwNi44NSJ9LHsiZGF0ZSI6IjI2LU1hci0wOSIsImNsb3NlIjoiMTA5Ljg3In0seyJkYXRlIjoiMjUtTWFyLTA5IiwiY2xvc2UiOiIxMDYuNDkifSx7ImRhdGUiOiIyNC1NYXItMDkiLCJjbG9zZSI6IjEwNi41MCJ9LHsiZGF0ZSI6IjIzLU1hci0wOSIsImNsb3NlIjoiMTA3LjY2In0seyJkYXRlIjoiMjAtTWFyLTA5IiwiY2xvc2UiOiIxMDEuNTkifSx7ImRhdGUiOiIxOS1NYXItMDkiLCJjbG9zZSI6IjEwMS42MiJ9LHsiZGF0ZSI6IjE4LU1hci0wOSIsImNsb3NlIjoiMTAxLjUyIn0seyJkYXRlIjoiMTctTWFyLTA5IiwiY2xvc2UiOiI5OS42NiJ9LHsiZGF0ZSI6IjE2LU1hci0wOSIsImNsb3NlIjoiOTUuNDIifSx7ImRhdGUiOiIxMy1NYXItMDkiLCJjbG9zZSI6Ijk1LjkzIn0seyJkYXRlIjoiMTItTWFyLTA5IiwiY2xvc2UiOiI5Ni4zNSJ9LHsiZGF0ZSI6IjExLU1hci0wOSIsImNsb3NlIjoiOTIuNjgifSx7ImRhdGUiOiIxMC1NYXItMDkiLCJjbG9zZSI6Ijg4LjYzIn0seyJkYXRlIjoiOS1NYXItMDkiLCJjbG9zZSI6IjgzLjExIn0seyJkYXRlIjoiNi1NYXItMDkiLCJjbG9zZSI6Ijg1LjMwIn0seyJkYXRlIjoiNS1NYXItMDkiLCJjbG9zZSI6Ijg4Ljg0In0seyJkYXRlIjoiNC1NYXItMDkiLCJjbG9zZSI6IjkxLjE3In0seyJkYXRlIjoiMy1NYXItMDkiLCJjbG9zZSI6Ijg4LjM3In0seyJkYXRlIjoiMi1NYXItMDkiLCJjbG9zZSI6Ijg3Ljk0In0seyJkYXRlIjoiMjctRmViLTA5IiwiY2xvc2UiOiI4OS4zMSJ9LHsiZGF0ZSI6IjI2LUZlYi0wOSIsImNsb3NlIjoiODkuMTkifSx7ImRhdGUiOiIyNS1GZWItMDkiLCJjbG9zZSI6IjkxLjE2In0seyJkYXRlIjoiMjQtRmViLTA5IiwiY2xvc2UiOiI5MC4yNSJ9LHsiZGF0ZSI6IjIzLUZlYi0wOSIsImNsb3NlIjoiODYuOTUifSx7ImRhdGUiOiIyMC1GZWItMDkiLCJjbG9zZSI6IjkxLjIwIn0seyJkYXRlIjoiMTktRmViLTA5IiwiY2xvc2UiOiI5MC42NCJ9LHsiZGF0ZSI6IjE4LUZlYi0wOSIsImNsb3NlIjoiOTQuMzcifSx7ImRhdGUiOiIxNy1GZWItMDkiLCJjbG9zZSI6Ijk0LjUzIn0seyJkYXRlIjoiMTMtRmViLTA5IiwiY2xvc2UiOiI5OS4xNiJ9LHsiZGF0ZSI6IjEyLUZlYi0wOSIsImNsb3NlIjoiOTkuMjcifSx7ImRhdGUiOiIxMS1GZWItMDkiLCJjbG9zZSI6Ijk2LjgyIn0seyJkYXRlIjoiMTAtRmViLTA5IiwiY2xvc2UiOiI5Ny44MyJ9LHsiZGF0ZSI6IjktRmViLTA5IiwiY2xvc2UiOiIxMDIuNTEifSx7ImRhdGUiOiI2LUZlYi0wOSIsImNsb3NlIjoiOTkuNzIifSx7ImRhdGUiOiI1LUZlYi0wOSIsImNsb3NlIjoiOTYuNDYifSx7ImRhdGUiOiI0LUZlYi0wOSIsImNsb3NlIjoiOTMuNTUifSx7ImRhdGUiOiIzLUZlYi0wOSIsImNsb3NlIjoiOTIuOTgifSx7ImRhdGUiOiIyLUZlYi0wOSIsImNsb3NlIjoiOTEuNTEifSx7ImRhdGUiOiIzMC1KYW4tMDkiLCJjbG9zZSI6IjkwLjEzIn0seyJkYXRlIjoiMjktSmFuLTA5IiwiY2xvc2UiOiI5My4wMCJ9LHsiZGF0ZSI6IjI4LUphbi0wOSIsImNsb3NlIjoiOTQuMjAifSx7ImRhdGUiOiIyNy1KYW4tMDkiLCJjbG9zZSI6IjkwLjczIn0seyJkYXRlIjoiMjYtSmFuLTA5IiwiY2xvc2UiOiI4OS42NCJ9LHsiZGF0ZSI6IjIzLUphbi0wOSIsImNsb3NlIjoiODguMzYifSx7ImRhdGUiOiIyMi1KYW4tMDkiLCJjbG9zZSI6Ijg4LjM2In0seyJkYXRlIjoiMjEtSmFuLTA5IiwiY2xvc2UiOiI4Mi44MyJ9LHsiZGF0ZSI6IjIwLUphbi0wOSIsImNsb3NlIjoiNzguMjAifSx7ImRhdGUiOiIxNi1KYW4tMDkiLCJjbG9zZSI6IjgyLjMzIn0seyJkYXRlIjoiMTUtSmFuLTA5IiwiY2xvc2UiOiI4My4zOCJ9LHsiZGF0ZSI6IjE0LUphbi0wOSIsImNsb3NlIjoiODUuMzMifSx7ImRhdGUiOiIxMy1KYW4tMDkiLCJjbG9zZSI6Ijg3LjcxIn0seyJkYXRlIjoiMTItSmFuLTA5IiwiY2xvc2UiOiI4OC42NiJ9LHsiZGF0ZSI6IjktSmFuLTA5IiwiY2xvc2UiOiI5MC41OCJ9LHsiZGF0ZSI6IjgtSmFuLTA5IiwiY2xvc2UiOiI5Mi43MCJ9LHsiZGF0ZSI6IjctSmFuLTA5IiwiY2xvc2UiOiI5MS4wMSJ9LHsiZGF0ZSI6IjYtSmFuLTA5IiwiY2xvc2UiOiI5My4wMiJ9LHsiZGF0ZSI6IjUtSmFuLTA5IiwiY2xvc2UiOiI5NC41OCJ9LHsiZGF0ZSI6IjItSmFuLTA5IiwiY2xvc2UiOiI5MC43NSJ9LHsiZGF0ZSI6IjEtSmFuLTA5IiwiY2xvc2UiOiI4NS4zNSJ9LHsiZGF0ZSI6IjMxLURlYy0wOCIsImNsb3NlIjoiODUuMzUifSx7ImRhdGUiOiIzMC1EZWMtMDgiLCJjbG9zZSI6Ijg2LjI5In0seyJkYXRlIjoiMjktRGVjLTA4IiwiY2xvc2UiOiI4Ni42MSJ9LHsiZGF0ZSI6IjI2LURlYy0wOCIsImNsb3NlIjoiODUuODEifSx7ImRhdGUiOiIyNS1EZWMtMDgiLCJjbG9zZSI6Ijg1LjA0In0seyJkYXRlIjoiMjQtRGVjLTA4IiwiY2xvc2UiOiI4NS4wNCJ9LHsiZGF0ZSI6IjIzLURlYy0wOCIsImNsb3NlIjoiODYuMzgifSx7ImRhdGUiOiIyMi1EZWMtMDgiLCJjbG9zZSI6Ijg1Ljc0In0seyJkYXRlIjoiMTktRGVjLTA4IiwiY2xvc2UiOiI5MC4wMCJ9LHsiZGF0ZSI6IjE4LURlYy0wOCIsImNsb3NlIjoiODkuNDMifSx7ImRhdGUiOiIxNy1EZWMtMDgiLCJjbG9zZSI6Ijg5LjE2In0seyJkYXRlIjoiMTYtRGVjLTA4IiwiY2xvc2UiOiI5NS40MyJ9LHsiZGF0ZSI6IjE1LURlYy0wOCIsImNsb3NlIjoiOTQuNzUifSx7ImRhdGUiOiIxMi1EZWMtMDgiLCJjbG9zZSI6Ijk4LjI3In0seyJkYXRlIjoiMTEtRGVjLTA4IiwiY2xvc2UiOiI5NS4wMCJ9LHsiZGF0ZSI6IjEwLURlYy0wOCIsImNsb3NlIjoiOTguMjEifSx7ImRhdGUiOiI5LURlYy0wOCIsImNsb3NlIjoiMTAwLjA2In0seyJkYXRlIjoiOC1EZWMtMDgiLCJjbG9zZSI6Ijk5LjcyIn0seyJkYXRlIjoiNS1EZWMtMDgiLCJjbG9zZSI6Ijk0LjAwIn0seyJkYXRlIjoiNC1EZWMtMDgiLCJjbG9zZSI6IjkxLjQxIn0seyJkYXRlIjoiMy1EZWMtMDgiLCJjbG9zZSI6Ijk1LjkwIn0seyJkYXRlIjoiMi1EZWMtMDgiLCJjbG9zZSI6IjkyLjQ3In0seyJkYXRlIjoiMS1EZWMtMDgiLCJjbG9zZSI6Ijg4LjkzIn0seyJkYXRlIjoiMjgtTm92LTA4IiwiY2xvc2UiOiI5Mi42NyJ9LHsiZGF0ZSI6IjI3LU5vdi0wOCIsImNsb3NlIjoiOTUuMDAifSx7ImRhdGUiOiIyNi1Ob3YtMDgiLCJjbG9zZSI6Ijk1LjAwIn0seyJkYXRlIjoiMjUtTm92LTA4IiwiY2xvc2UiOiI5MC44MCJ9LHsiZGF0ZSI6IjI0LU5vdi0wOCIsImNsb3NlIjoiOTIuOTUifSx7ImRhdGUiOiIyMS1Ob3YtMDgiLCJjbG9zZSI6IjgyLjU4In0seyJkYXRlIjoiMjAtTm92LTA4IiwiY2xvc2UiOiI4MC40OSJ9LHsiZGF0ZSI6IjE5LU5vdi0wOCIsImNsb3NlIjoiODYuMjkifSx7ImRhdGUiOiIxOC1Ob3YtMDgiLCJjbG9zZSI6Ijg5LjkxIn0seyJkYXRlIjoiMTctTm92LTA4IiwiY2xvc2UiOiI4OC4xNCJ9LHsiZGF0ZSI6IjE0LU5vdi0wOCIsImNsb3NlIjoiOTAuMjQifSx7ImRhdGUiOiIxMy1Ob3YtMDgiLCJjbG9zZSI6Ijk2LjQ0In0seyJkYXRlIjoiMTItTm92LTA4IiwiY2xvc2UiOiI5MC4xMiJ9LHsiZGF0ZSI6IjExLU5vdi0wOCIsImNsb3NlIjoiOTQuNzcifSx7ImRhdGUiOiIxMC1Ob3YtMDgiLCJjbG9zZSI6Ijk1Ljg4In0seyJkYXRlIjoiNy1Ob3YtMDgiLCJjbG9zZSI6Ijk4LjI0In0seyJkYXRlIjoiNi1Ob3YtMDgiLCJjbG9zZSI6Ijk5LjEwIn0seyJkYXRlIjoiNS1Ob3YtMDgiLCJjbG9zZSI6IjEwMy4zMCJ9LHsiZGF0ZSI6IjQtTm92LTA4IiwiY2xvc2UiOiIxMTAuOTkifSx7ImRhdGUiOiIzLU5vdi0wOCIsImNsb3NlIjoiMTA2Ljk2In0seyJkYXRlIjoiMzEtT2N0LTA4IiwiY2xvc2UiOiIxMDcuNTkifSx7ImRhdGUiOiIzMC1PY3QtMDgiLCJjbG9zZSI6IjExMS4wNCJ9LHsiZGF0ZSI6IjI5LU9jdC0wOCIsImNsb3NlIjoiMTA0LjU1In0seyJkYXRlIjoiMjgtT2N0LTA4IiwiY2xvc2UiOiI5OS45MSJ9LHsiZGF0ZSI6IjI3LU9jdC0wOCIsImNsb3NlIjoiOTIuMDkifSx7ImRhdGUiOiIyNC1PY3QtMDgiLCJjbG9zZSI6Ijk2LjM4In0seyJkYXRlIjoiMjMtT2N0LTA4IiwiY2xvc2UiOiI5OC4yMyJ9LHsiZGF0ZSI6IjIyLU9jdC0wOCIsImNsb3NlIjoiOTYuODcifSx7ImRhdGUiOiIyMS1PY3QtMDgiLCJjbG9zZSI6IjkxLjQ5In0seyJkYXRlIjoiMjAtT2N0LTA4IiwiY2xvc2UiOiI5OC40NCJ9LHsiZGF0ZSI6IjE3LU9jdC0wOCIsImNsb3NlIjoiOTcuNDAifSx7ImRhdGUiOiIxNi1PY3QtMDgiLCJjbG9zZSI6IjEwMS44OSJ9LHsiZGF0ZSI6IjE1LU9jdC0wOCIsImNsb3NlIjoiOTcuOTUifSx7ImRhdGUiOiIxNC1PY3QtMDgiLCJjbG9zZSI6IjEwNC4wOCJ9LHsiZGF0ZSI6IjEzLU9jdC0wOCIsImNsb3NlIjoiMTEwLjI2In0seyJkYXRlIjoiMTAtT2N0LTA4IiwiY2xvc2UiOiI5Ni44MCJ9LHsiZGF0ZSI6IjktT2N0LTA4IiwiY2xvc2UiOiI4OC43NCJ9LHsiZGF0ZSI6IjgtT2N0LTA4IiwiY2xvc2UiOiI4OS43OSJ9LHsiZGF0ZSI6IjctT2N0LTA4IiwiY2xvc2UiOiI4OS4xNiJ9LHsiZGF0ZSI6IjYtT2N0LTA4IiwiY2xvc2UiOiI5OC4xNCJ9LHsiZGF0ZSI6IjMtT2N0LTA4IiwiY2xvc2UiOiI5Ny4wNyJ9LHsiZGF0ZSI6IjItT2N0LTA4IiwiY2xvc2UiOiIxMDAuMTAifSx7ImRhdGUiOiIxLU9jdC0wOCIsImNsb3NlIjoiMTA5LjEyIn0seyJkYXRlIjoiMzAtU2VwLTA4IiwiY2xvc2UiOiIxMTMuNjYifSx7ImRhdGUiOiIyOS1TZXAtMDgiLCJjbG9zZSI6IjEwNS4yNiJ9LHsiZGF0ZSI6IjI2LVNlcC0wOCIsImNsb3NlIjoiMTI4LjI0In0seyJkYXRlIjoiMjUtU2VwLTA4IiwiY2xvc2UiOiIxMzEuOTMifSx7ImRhdGUiOiIyNC1TZXAtMDgiLCJjbG9zZSI6IjEyOC43MSJ9LHsiZGF0ZSI6IjIzLVNlcC0wOCIsImNsb3NlIjoiMTI2Ljg0In0seyJkYXRlIjoiMjItU2VwLTA4IiwiY2xvc2UiOiIxMzEuMDUifSx7ImRhdGUiOiIxOS1TZXAtMDgiLCJjbG9zZSI6IjE0MC45MSJ9LHsiZGF0ZSI6IjE4LVNlcC0wOCIsImNsb3NlIjoiMTM0LjA5In0seyJkYXRlIjoiMTctU2VwLTA4IiwiY2xvc2UiOiIxMjcuODMifSx7ImRhdGUiOiIxNi1TZXAtMDgiLCJjbG9zZSI6IjEzOS44OCJ9LHsiZGF0ZSI6IjE1LVNlcC0wOCIsImNsb3NlIjoiMTQwLjM2In0seyJkYXRlIjoiMTItU2VwLTA4IiwiY2xvc2UiOiIxNDguOTQifSx7ImRhdGUiOiIxMS1TZXAtMDgiLCJjbG9zZSI6IjE1Mi42NSJ9LHsiZGF0ZSI6IjEwLVNlcC0wOCIsImNsb3NlIjoiMTUxLjYxIn0seyJkYXRlIjoiOS1TZXAtMDgiLCJjbG9zZSI6IjE1MS42OCJ9LHsiZGF0ZSI6IjgtU2VwLTA4IiwiY2xvc2UiOiIxNTcuOTIifSx7ImRhdGUiOiI1LVNlcC0wOCIsImNsb3NlIjoiMTYwLjE4In0seyJkYXRlIjoiNC1TZXAtMDgiLCJjbG9zZSI6IjE2MS4yMiJ9LHsiZGF0ZSI6IjMtU2VwLTA4IiwiY2xvc2UiOiIxNjYuOTYifSx7ImRhdGUiOiIyLVNlcC0wOCIsImNsb3NlIjoiMTY2LjE5In0seyJkYXRlIjoiMjktQXVnLTA4IiwiY2xvc2UiOiIxNjkuNTMifSx7ImRhdGUiOiIyOC1BdWctMDgiLCJjbG9zZSI6IjE3My43NCJ9LHsiZGF0ZSI6IjI3LUF1Zy0wOCIsImNsb3NlIjoiMTc0LjY3In0seyJkYXRlIjoiMjYtQXVnLTA4IiwiY2xvc2UiOiIxNzMuNjQifSx7ImRhdGUiOiIyNS1BdWctMDgiLCJjbG9zZSI6IjE3Mi41NSJ9LHsiZGF0ZSI6IjIyLUF1Zy0wOCIsImNsb3NlIjoiMTc2Ljc5In0seyJkYXRlIjoiMjEtQXVnLTA4IiwiY2xvc2UiOiIxNzQuMjkifSx7ImRhdGUiOiIyMC1BdWctMDgiLCJjbG9zZSI6IjE3NS44NCJ9LHsiZGF0ZSI6IjE5LUF1Zy0wOCIsImNsb3NlIjoiMTczLjUzIn0seyJkYXRlIjoiMTgtQXVnLTA4IiwiY2xvc2UiOiIxNzUuMzkifSx7ImRhdGUiOiIxNS1BdWctMDgiLCJjbG9zZSI6IjE3NS43NCJ9LHsiZGF0ZSI6IjE0LUF1Zy0wOCIsImNsb3NlIjoiMTc5LjMyIn0seyJkYXRlIjoiMTMtQXVnLTA4IiwiY2xvc2UiOiIxNzkuMzAifSx7ImRhdGUiOiIxMi1BdWctMDgiLCJjbG9zZSI6IjE3Ni43MyJ9LHsiZGF0ZSI6IjExLUF1Zy0wOCIsImNsb3NlIjoiMTczLjU2In0seyJkYXRlIjoiOC1BdWctMDgiLCJjbG9zZSI6IjE2OS41NSJ9LHsiZGF0ZSI6IjctQXVnLTA4IiwiY2xvc2UiOiIxNjMuNTcifSx7ImRhdGUiOiI2LUF1Zy0wOCIsImNsb3NlIjoiMTY0LjE5In0seyJkYXRlIjoiNS1BdWctMDgiLCJjbG9zZSI6IjE2MC42NCJ9LHsiZGF0ZSI6IjQtQXVnLTA4IiwiY2xvc2UiOiIxNTMuMjMifSx7ImRhdGUiOiIxLUF1Zy0wOCIsImNsb3NlIjoiMTU2LjY2In0seyJkYXRlIjoiMzEtSnVsLTA4IiwiY2xvc2UiOiIxNTguOTUifSx7ImRhdGUiOiIzMC1KdWwtMDgiLCJjbG9zZSI6IjE1OS44OCJ9LHsiZGF0ZSI6IjI5LUp1bC0wOCIsImNsb3NlIjoiMTU3LjA4In0seyJkYXRlIjoiMjgtSnVsLTA4IiwiY2xvc2UiOiIxNTQuNDAifSx7ImRhdGUiOiIyNS1KdWwtMDgiLCJjbG9zZSI6IjE2Mi4xMiJ9LHsiZGF0ZSI6IjI0LUp1bC0wOCIsImNsb3NlIjoiMTU5LjAzIn0seyJkYXRlIjoiMjMtSnVsLTA4IiwiY2xvc2UiOiIxNjYuMjYifSx7ImRhdGUiOiIyMi1KdWwtMDgiLCJjbG9zZSI6IjE2Mi4wMiJ9LHsiZGF0ZSI6IjIxLUp1bC0wOCIsImNsb3NlIjoiMTY2LjI5In0seyJkYXRlIjoiMTgtSnVsLTA4IiwiY2xvc2UiOiIxNjUuMTUifSx7ImRhdGUiOiIxNy1KdWwtMDgiLCJjbG9zZSI6IjE3MS44MSJ9LHsiZGF0ZSI6IjE2LUp1bC0wOCIsImNsb3NlIjoiMTcyLjgxIn0seyJkYXRlIjoiMTUtSnVsLTA4IiwiY2xvc2UiOiIxNjkuNjQifSx7ImRhdGUiOiIxNC1KdWwtMDgiLCJjbG9zZSI6IjE3My44OCJ9LHsiZGF0ZSI6IjExLUp1bC0wOCIsImNsb3NlIjoiMTcyLjU4In0seyJkYXRlIjoiMTAtSnVsLTA4IiwiY2xvc2UiOiIxNzYuNjMifSx7ImRhdGUiOiI5LUp1bC0wOCIsImNsb3NlIjoiMTc0LjI1In0seyJkYXRlIjoiOC1KdWwtMDgiLCJjbG9zZSI6IjE3OS41NSJ9LHsiZGF0ZSI6IjctSnVsLTA4IiwiY2xvc2UiOiIxNzUuMTYifSx7ImRhdGUiOiIzLUp1bC0wOCIsImNsb3NlIjoiMTcwLjEyIn0seyJkYXRlIjoiMi1KdWwtMDgiLCJjbG9zZSI6IjE2OC4xOCJ9LHsiZGF0ZSI6IjEtSnVsLTA4IiwiY2xvc2UiOiIxNzQuNjgifSx7ImRhdGUiOiIzMC1KdW4tMDgiLCJjbG9zZSI6IjE2Ny40NCJ9LHsiZGF0ZSI6IjI3LUp1bi0wOCIsImNsb3NlIjoiMTcwLjA5In0seyJkYXRlIjoiMjYtSnVuLTA4IiwiY2xvc2UiOiIxNjguMjYifSx7ImRhdGUiOiIyNS1KdW4tMDgiLCJjbG9zZSI6IjE3Ny4zOSJ9LHsiZGF0ZSI6IjI0LUp1bi0wOCIsImNsb3NlIjoiMTczLjI1In0seyJkYXRlIjoiMjMtSnVuLTA4IiwiY2xvc2UiOiIxNzMuMTYifSx7ImRhdGUiOiIyMC1KdW4tMDgiLCJjbG9zZSI6IjE3NS4yNyJ9LHsiZGF0ZSI6IjE5LUp1bi0wOCIsImNsb3NlIjoiMTgwLjkwIn0seyJkYXRlIjoiMTgtSnVuLTA4IiwiY2xvc2UiOiIxNzguNzUifSx7ImRhdGUiOiIxNy1KdW4tMDgiLCJjbG9zZSI6IjE4MS40MyJ9LHsiZGF0ZSI6IjE2LUp1bi0wOCIsImNsb3NlIjoiMTc2Ljg0In0seyJkYXRlIjoiMTMtSnVuLTA4IiwiY2xvc2UiOiIxNzIuMzcifSx7ImRhdGUiOiIxMi1KdW4tMDgiLCJjbG9zZSI6IjE3My4yNiJ9LHsiZGF0ZSI6IjExLUp1bi0wOCIsImNsb3NlIjoiMTgwLjgxIn0seyJkYXRlIjoiMTAtSnVuLTA4IiwiY2xvc2UiOiIxODUuNjQifSx7ImRhdGUiOiI5LUp1bi0wOCIsImNsb3NlIjoiMTgxLjYxIn0seyJkYXRlIjoiNi1KdW4tMDgiLCJjbG9zZSI6IjE4NS42NCJ9LHsiZGF0ZSI6IjUtSnVuLTA4IiwiY2xvc2UiOiIxODkuNDMifSx7ImRhdGUiOiI0LUp1bi0wOCIsImNsb3NlIjoiMTg1LjE5In0seyJkYXRlIjoiMy1KdW4tMDgiLCJjbG9zZSI6IjE4NS4zNyJ9LHsiZGF0ZSI6IjItSnVuLTA4IiwiY2xvc2UiOiIxODYuMTAifSx7ImRhdGUiOiIzMC1NYXktMDgiLCJjbG9zZSI6IjE4OC43NSJ9LHsiZGF0ZSI6IjI5LU1heS0wOCIsImNsb3NlIjoiMTg2LjY5In0seyJkYXRlIjoiMjgtTWF5LTA4IiwiY2xvc2UiOiIxODcuMDEifSx7ImRhdGUiOiIyNy1NYXktMDgiLCJjbG9zZSI6IjE4Ni40MyJ9LHsiZGF0ZSI6IjIzLU1heS0wOCIsImNsb3NlIjoiMTgxLjE3In0seyJkYXRlIjoiMjItTWF5LTA4IiwiY2xvc2UiOiIxNzcuMDUifSx7ImRhdGUiOiIyMS1NYXktMDgiLCJjbG9zZSI6IjE3OC4xOSJ9LHsiZGF0ZSI6IjIwLU1heS0wOCIsImNsb3NlIjoiMTg1LjkwIn0seyJkYXRlIjoiMTktTWF5LTA4IiwiY2xvc2UiOiIxODMuNjAifSx7ImRhdGUiOiIxNi1NYXktMDgiLCJjbG9zZSI6IjE4Ny42MiJ9LHsiZGF0ZSI6IjE1LU1heS0wOCIsImNsb3NlIjoiMTg5LjczIn0seyJkYXRlIjoiMTQtTWF5LTA4IiwiY2xvc2UiOiIxODYuMjYifSx7ImRhdGUiOiIxMy1NYXktMDgiLCJjbG9zZSI6IjE4OS45NiJ9LHsiZGF0ZSI6IjEyLU1heS0wOCIsImNsb3NlIjoiMTg4LjE2In0seyJkYXRlIjoiOS1NYXktMDgiLCJjbG9zZSI6IjE4My40NSJ9LHsiZGF0ZSI6IjgtTWF5LTA4IiwiY2xvc2UiOiIxODUuMDYifSx7ImRhdGUiOiI3LU1heS0wOCIsImNsb3NlIjoiMTgyLjU5In0seyJkYXRlIjoiNi1NYXktMDgiLCJjbG9zZSI6IjE4Ni42NiJ9LHsiZGF0ZSI6IjUtTWF5LTA4IiwiY2xvc2UiOiIxODQuNzMifSx7ImRhdGUiOiIyLU1heS0wOCIsImNsb3NlIjoiMTgwLjk0In0seyJkYXRlIjoiMS1NYXktMDgiLCJjbG9zZSI6IjE4MC4wMCJ9LHsiZGF0ZSI6IjMwLUFwci0wOCIsImNsb3NlIjoiMTczLjk1In0seyJkYXRlIjoiMjktQXByLTA4IiwiY2xvc2UiOiIxNzUuMDUifSx7ImRhdGUiOiIyOC1BcHItMDgiLCJjbG9zZSI6IjE3Mi4yNCJ9LHsiZGF0ZSI6IjI1LUFwci0wOCIsImNsb3NlIjoiMTY5LjczIn0seyJkYXRlIjoiMjQtQXByLTA4IiwiY2xvc2UiOiIxNjguOTQifSx7ImRhdGUiOiIyMy1BcHItMDgiLCJjbG9zZSI6IjE2Mi44OSJ9LHsiZGF0ZSI6IjIyLUFwci0wOCIsImNsb3NlIjoiMTYwLjIwIn0seyJkYXRlIjoiMjEtQXByLTA4IiwiY2xvc2UiOiIxNjguMTYifSx7ImRhdGUiOiIxOC1BcHItMDgiLCJjbG9zZSI6IjE2MS4wNCJ9LHsiZGF0ZSI6IjE3LUFwci0wOCIsImNsb3NlIjoiMTU0LjQ5In0seyJkYXRlIjoiMTYtQXByLTA4IiwiY2xvc2UiOiIxNTMuNzAifSx7ImRhdGUiOiIxNS1BcHItMDgiLCJjbG9zZSI6IjE0OC4zOCJ9LHsiZGF0ZSI6IjE0LUFwci0wOCIsImNsb3NlIjoiMTQ3Ljc4In0seyJkYXRlIjoiMTEtQXByLTA4IiwiY2xvc2UiOiIxNDcuMTQifSx7ImRhdGUiOiIxMC1BcHItMDgiLCJjbG9zZSI6IjE1NC41NSJ9LHsiZGF0ZSI6IjktQXByLTA4IiwiY2xvc2UiOiIxNTEuNDQifSx7ImRhdGUiOiI4LUFwci0wOCIsImNsb3NlIjoiMTUyLjg0In0seyJkYXRlIjoiNy1BcHItMDgiLCJjbG9zZSI6IjE1NS44OSJ9LHsiZGF0ZSI6IjQtQXByLTA4IiwiY2xvc2UiOiIxNTMuMDgifSx7ImRhdGUiOiIzLUFwci0wOCIsImNsb3NlIjoiMTUxLjYxIn0seyJkYXRlIjoiMi1BcHItMDgiLCJjbG9zZSI6IjE0Ny40OSJ9LHsiZGF0ZSI6IjEtQXByLTA4IiwiY2xvc2UiOiIxNDkuNTMifSx7ImRhdGUiOiIzMS1NYXItMDgiLCJjbG9zZSI6IjE0My41MCJ9LHsiZGF0ZSI6IjI4LU1hci0wOCIsImNsb3NlIjoiMTQzLjAxIn0seyJkYXRlIjoiMjctTWFyLTA4IiwiY2xvc2UiOiIxNDAuMjUifSx7ImRhdGUiOiIyNi1NYXItMDgiLCJjbG9zZSI6IjE0NS4wNiJ9LHsiZGF0ZSI6IjI1LU1hci0wOCIsImNsb3NlIjoiMTQwLjk4In0seyJkYXRlIjoiMjQtTWFyLTA4IiwiY2xvc2UiOiIxMzkuNTMifSx7ImRhdGUiOiIyMC1NYXItMDgiLCJjbG9zZSI6IjEzMy4yNyJ9LHsiZGF0ZSI6IjE5LU1hci0wOCIsImNsb3NlIjoiMTI5LjY3In0seyJkYXRlIjoiMTgtTWFyLTA4IiwiY2xvc2UiOiIxMzIuODIifSx7ImRhdGUiOiIxNy1NYXItMDgiLCJjbG9zZSI6IjEyNi43MyJ9LHsiZGF0ZSI6IjE0LU1hci0wOCIsImNsb3NlIjoiMTI2LjYxIn0seyJkYXRlIjoiMTMtTWFyLTA4IiwiY2xvc2UiOiIxMjcuOTQifSx7ImRhdGUiOiIxMi1NYXItMDgiLCJjbG9zZSI6IjEyNi4wMyJ9LHsiZGF0ZSI6IjExLU1hci0wOCIsImNsb3NlIjoiMTI3LjM1In0seyJkYXRlIjoiMTAtTWFyLTA4IiwiY2xvc2UiOiIxMTkuNjkifSx7ImRhdGUiOiI3LU1hci0wOCIsImNsb3NlIjoiMTIyLjI1In0seyJkYXRlIjoiNi1NYXItMDgiLCJjbG9zZSI6IjEyMC45MyJ9LHsiZGF0ZSI6IjUtTWFyLTA4IiwiY2xvc2UiOiIxMjQuNDkifSx7ImRhdGUiOiI0LU1hci0wOCIsImNsb3NlIjoiMTI0LjYyIn0seyJkYXRlIjoiMy1NYXItMDgiLCJjbG9zZSI6IjEyMS43MyJ9LHsiZGF0ZSI6IjI5LUZlYi0wOCIsImNsb3NlIjoiMTI1LjAyIn0seyJkYXRlIjoiMjgtRmViLTA4IiwiY2xvc2UiOiIxMjkuOTEifSx7ImRhdGUiOiIyNy1GZWItMDgiLCJjbG9zZSI6IjEyMi45NiJ9LHsiZGF0ZSI6IjI2LUZlYi0wOCIsImNsb3NlIjoiMTE5LjE1In0seyJkYXRlIjoiMjUtRmViLTA4IiwiY2xvc2UiOiIxMTkuNzQifSx7ImRhdGUiOiIyMi1GZWItMDgiLCJjbG9zZSI6IjExOS40NiJ9LHsiZGF0ZSI6IjIxLUZlYi0wOCIsImNsb3NlIjoiMTIxLjU0In0seyJkYXRlIjoiMjAtRmViLTA4IiwiY2xvc2UiOiIxMjMuODIifSx7ImRhdGUiOiIxOS1GZWItMDgiLCJjbG9zZSI6IjEyMi4xOCJ9LHsiZGF0ZSI6IjE1LUZlYi0wOCIsImNsb3NlIjoiMTI0LjYzIn0seyJkYXRlIjoiMTQtRmViLTA4IiwiY2xvc2UiOiIxMjcuNDYifSx7ImRhdGUiOiIxMy1GZWItMDgiLCJjbG9zZSI6IjEyOS40MCJ9LHsiZGF0ZSI6IjEyLUZlYi0wOCIsImNsb3NlIjoiMTI0Ljg2In0seyJkYXRlIjoiMTEtRmViLTA4IiwiY2xvc2UiOiIxMjkuNDUifSx7ImRhdGUiOiI4LUZlYi0wOCIsImNsb3NlIjoiMTI1LjQ4In0seyJkYXRlIjoiNy1GZWItMDgiLCJjbG9zZSI6IjEyMS4yNCJ9LHsiZGF0ZSI6IjYtRmViLTA4IiwiY2xvc2UiOiIxMjIuMDAifSx7ImRhdGUiOiI1LUZlYi0wOCIsImNsb3NlIjoiMTI5LjM2In0seyJkYXRlIjoiNC1GZWItMDgiLCJjbG9zZSI6IjEzMS42NSJ9LHsiZGF0ZSI6IjEtRmViLTA4IiwiY2xvc2UiOiIxMzMuNzUifSx7ImRhdGUiOiIzMS1KYW4tMDgiLCJjbG9zZSI6IjEzNS4zNiJ9LHsiZGF0ZSI6IjMwLUphbi0wOCIsImNsb3NlIjoiMTMyLjE4In0seyJkYXRlIjoiMjktSmFuLTA4IiwiY2xvc2UiOiIxMzEuNTQifSx7ImRhdGUiOiIyOC1KYW4tMDgiLCJjbG9zZSI6IjEzMC4wMSJ9LHsiZGF0ZSI6IjI1LUphbi0wOCIsImNsb3NlIjoiMTMwLjAxIn0seyJkYXRlIjoiMjQtSmFuLTA4IiwiY2xvc2UiOiIxMzUuNjAifSx7ImRhdGUiOiIyMy1KYW4tMDgiLCJjbG9zZSI6IjEzOS4wNyJ9LHsiZGF0ZSI6IjIyLUphbi0wOCIsImNsb3NlIjoiMTU1LjY0In0seyJkYXRlIjoiMTgtSmFuLTA4IiwiY2xvc2UiOiIxNjEuMzYifSx7ImRhdGUiOiIxNy1KYW4tMDgiLCJjbG9zZSI6IjE2MC44OSJ9LHsiZGF0ZSI6IjE2LUphbi0wOCIsImNsb3NlIjoiMTU5LjY0In0seyJkYXRlIjoiMTUtSmFuLTA4IiwiY2xvc2UiOiIxNjkuMDQifSx7ImRhdGUiOiIxNC1KYW4tMDgiLCJjbG9zZSI6IjE3OC43OCJ9LHsiZGF0ZSI6IjExLUphbi0wOCIsImNsb3NlIjoiMTcyLjY5In0seyJkYXRlIjoiMTAtSmFuLTA4IiwiY2xvc2UiOiIxNzguMDIifSx7ImRhdGUiOiI5LUphbi0wOCIsImNsb3NlIjoiMTc5LjQwIn0seyJkYXRlIjoiOC1KYW4tMDgiLCJjbG9zZSI6IjE3MS4yNSJ9LHsiZGF0ZSI6IjctSmFuLTA4IiwiY2xvc2UiOiIxNzcuNjQifSx7ImRhdGUiOiI0LUphbi0wOCIsImNsb3NlIjoiMTgwLjA1In0seyJkYXRlIjoiMy1KYW4tMDgiLCJjbG9zZSI6IjE5NC45MyJ9LHsiZGF0ZSI6IjItSmFuLTA4IiwiY2xvc2UiOiIxOTQuODQifSx7ImRhdGUiOiIzMS1EZWMtMDciLCJjbG9zZSI6IjE5OC4wOCJ9LHsiZGF0ZSI6IjI4LURlYy0wNyIsImNsb3NlIjoiMTk5LjgzIn0seyJkYXRlIjoiMjctRGVjLTA3IiwiY2xvc2UiOiIxOTguNTcifSx7ImRhdGUiOiIyNi1EZWMtMDciLCJjbG9zZSI6IjE5OC45NSJ9LHsiZGF0ZSI6IjI0LURlYy0wNyIsImNsb3NlIjoiMTk4LjgwIn0seyJkYXRlIjoiMjEtRGVjLTA3IiwiY2xvc2UiOiIxOTMuOTEifSx7ImRhdGUiOiIyMC1EZWMtMDciLCJjbG9zZSI6IjE4Ny4yMSJ9LHsiZGF0ZSI6IjE5LURlYy0wNyIsImNsb3NlIjoiMTgzLjEyIn0seyJkYXRlIjoiMTgtRGVjLTA3IiwiY2xvc2UiOiIxODIuOTgifSx7ImRhdGUiOiIxNy1EZWMtMDciLCJjbG9zZSI6IjE4NC40MCJ9LHsiZGF0ZSI6IjE0LURlYy0wNyIsImNsb3NlIjoiMTkwLjM5In0seyJkYXRlIjoiMTMtRGVjLTA3IiwiY2xvc2UiOiIxOTEuODMifSx7ImRhdGUiOiIxMi1EZWMtMDciLCJjbG9zZSI6IjE5MC44NiJ9LHsiZGF0ZSI6IjExLURlYy0wNyIsImNsb3NlIjoiMTg4LjU0In0seyJkYXRlIjoiMTAtRGVjLTA3IiwiY2xvc2UiOiIxOTQuMjEifSx7ImRhdGUiOiI3LURlYy0wNyIsImNsb3NlIjoiMTk0LjMwIn0seyJkYXRlIjoiNi1EZWMtMDciLCJjbG9zZSI6IjE4OS45NSJ9LHsiZGF0ZSI6IjUtRGVjLTA3IiwiY2xvc2UiOiIxODUuNTAifSx7ImRhdGUiOiI0LURlYy0wNyIsImNsb3NlIjoiMTc5LjgxIn0seyJkYXRlIjoiMy1EZWMtMDciLCJjbG9zZSI6IjE3OC44NiJ9LHsiZGF0ZSI6IjMwLU5vdi0wNyIsImNsb3NlIjoiMTgyLjIyIn0seyJkYXRlIjoiMjktTm92LTA3IiwiY2xvc2UiOiIxODQuMjkifSx7ImRhdGUiOiIyOC1Ob3YtMDciLCJjbG9zZSI6IjE4MC4yMiJ9LHsiZGF0ZSI6IjI3LU5vdi0wNyIsImNsb3NlIjoiMTc0LjgxIn0seyJkYXRlIjoiMjYtTm92LTA3IiwiY2xvc2UiOiIxNzIuNTQifSx7ImRhdGUiOiIyMy1Ob3YtMDciLCJjbG9zZSI6IjE3MS41NCJ9LHsiZGF0ZSI6IjIxLU5vdi0wNyIsImNsb3NlIjoiMTY4LjQ2In0seyJkYXRlIjoiMjAtTm92LTA3IiwiY2xvc2UiOiIxNjguODUifSx7ImRhdGUiOiIxOS1Ob3YtMDciLCJjbG9zZSI6IjE2My45NSJ9LHsiZGF0ZSI6IjE2LU5vdi0wNyIsImNsb3NlIjoiMTY2LjM5In0seyJkYXRlIjoiMTUtTm92LTA3IiwiY2xvc2UiOiIxNjQuMzAifSx7ImRhdGUiOiIxNC1Ob3YtMDciLCJjbG9zZSI6IjE2Ni4xMSJ9LHsiZGF0ZSI6IjEzLU5vdi0wNyIsImNsb3NlIjoiMTY5Ljk2In0seyJkYXRlIjoiMTItTm92LTA3IiwiY2xvc2UiOiIxNTMuNzYifSx7ImRhdGUiOiI5LU5vdi0wNyIsImNsb3NlIjoiMTY1LjM3In0seyJkYXRlIjoiOC1Ob3YtMDciLCJjbG9zZSI6IjE3NS40NyJ9LHsiZGF0ZSI6IjctTm92LTA3IiwiY2xvc2UiOiIxODYuMzAifSx7ImRhdGUiOiI2LU5vdi0wNyIsImNsb3NlIjoiMTkxLjc5In0seyJkYXRlIjoiNS1Ob3YtMDciLCJjbG9zZSI6IjE4Ni4xOCJ9LHsiZGF0ZSI6IjItTm92LTA3IiwiY2xvc2UiOiIxODcuODcifSx7ImRhdGUiOiIxLU5vdi0wNyIsImNsb3NlIjoiMTg3LjQ0In0seyJkYXRlIjoiMzEtT2N0LTA3IiwiY2xvc2UiOiIxODkuOTUifSx7ImRhdGUiOiIzMC1PY3QtMDciLCJjbG9zZSI6IjE4Ny4wMCJ9LHsiZGF0ZSI6IjI5LU9jdC0wNyIsImNsb3NlIjoiMTg1LjA5In0seyJkYXRlIjoiMjYtT2N0LTA3IiwiY2xvc2UiOiIxODQuNzAifSx7ImRhdGUiOiIyNS1PY3QtMDciLCJjbG9zZSI6IjE4Mi43OCJ9LHsiZGF0ZSI6IjI0LU9jdC0wNyIsImNsb3NlIjoiMTg1LjkzIn0seyJkYXRlIjoiMjMtT2N0LTA3IiwiY2xvc2UiOiIxODYuMTYifSx7ImRhdGUiOiIyMi1PY3QtMDciLCJjbG9zZSI6IjE3NC4zNiJ9LHsiZGF0ZSI6IjE5LU9jdC0wNyIsImNsb3NlIjoiMTcwLjQyIn0seyJkYXRlIjoiMTgtT2N0LTA3IiwiY2xvc2UiOiIxNzMuNTAifSx7ImRhdGUiOiIxNy1PY3QtMDciLCJjbG9zZSI6IjE3Mi43NSJ9LHsiZGF0ZSI6IjE2LU9jdC0wNyIsImNsb3NlIjoiMTY5LjU4In0seyJkYXRlIjoiMTUtT2N0LTA3IiwiY2xvc2UiOiIxNjYuOTgifSx7ImRhdGUiOiIxMi1PY3QtMDciLCJjbG9zZSI6IjE2Ny4yNSJ9LHsiZGF0ZSI6IjExLU9jdC0wNyIsImNsb3NlIjoiMTYyLjIzIn0seyJkYXRlIjoiMTAtT2N0LTA3IiwiY2xvc2UiOiIxNjYuNzkifSx7ImRhdGUiOiI5LU9jdC0wNyIsImNsb3NlIjoiMTY3Ljg2In0seyJkYXRlIjoiOC1PY3QtMDciLCJjbG9zZSI6IjE2Ny45MSJ9LHsiZGF0ZSI6IjUtT2N0LTA3IiwiY2xvc2UiOiIxNjEuNDUifSx7ImRhdGUiOiI0LU9jdC0wNyIsImNsb3NlIjoiMTU2LjI0In0seyJkYXRlIjoiMy1PY3QtMDciLCJjbG9zZSI6IjE1Ny45MiJ9LHsiZGF0ZSI6IjItT2N0LTA3IiwiY2xvc2UiOiIxNTguNDUifSx7ImRhdGUiOiIxLU9jdC0wNyIsImNsb3NlIjoiMTU2LjM0In0seyJkYXRlIjoiMjgtU2VwLTA3IiwiY2xvc2UiOiIxNTMuNDcifSx7ImRhdGUiOiIyNy1TZXAtMDciLCJjbG9zZSI6IjE1NC41MCJ9LHsiZGF0ZSI6IjI2LVNlcC0wNyIsImNsb3NlIjoiMTUyLjc3In0seyJkYXRlIjoiMjUtU2VwLTA3IiwiY2xvc2UiOiIxNTMuMTgifSx7ImRhdGUiOiIyNC1TZXAtMDciLCJjbG9zZSI6IjE0OC4yOCJ9LHsiZGF0ZSI6IjIxLVNlcC0wNyIsImNsb3NlIjoiMTQ0LjE1In0seyJkYXRlIjoiMjAtU2VwLTA3IiwiY2xvc2UiOiIxNDAuMzEifSx7ImRhdGUiOiIxOS1TZXAtMDciLCJjbG9zZSI6IjE0MC43NyJ9LHsiZGF0ZSI6IjE4LVNlcC0wNyIsImNsb3NlIjoiMTQwLjkyIn0seyJkYXRlIjoiMTctU2VwLTA3IiwiY2xvc2UiOiIxMzguNDEifSx7ImRhdGUiOiIxNC1TZXAtMDciLCJjbG9zZSI6IjEzOC44MSJ9LHsiZGF0ZSI6IjEzLVNlcC0wNyIsImNsb3NlIjoiMTM3LjIwIn0seyJkYXRlIjoiMTItU2VwLTA3IiwiY2xvc2UiOiIxMzYuODUifSx7ImRhdGUiOiIxMS1TZXAtMDciLCJjbG9zZSI6IjEzNS40OSJ9LHsiZGF0ZSI6IjEwLVNlcC0wNyIsImNsb3NlIjoiMTM2LjcxIn0seyJkYXRlIjoiNy1TZXAtMDciLCJjbG9zZSI6IjEzMS43NyJ9LHsiZGF0ZSI6IjYtU2VwLTA3IiwiY2xvc2UiOiIxMzUuMDEifSx7ImRhdGUiOiI1LVNlcC0wNyIsImNsb3NlIjoiMTM2Ljc2In0seyJkYXRlIjoiNC1TZXAtMDciLCJjbG9zZSI6IjE0NC4xNiJ9LHsiZGF0ZSI6IjMxLUF1Zy0wNyIsImNsb3NlIjoiMTM4LjQ4In0seyJkYXRlIjoiMzAtQXVnLTA3IiwiY2xvc2UiOiIxMzYuMjUifSx7ImRhdGUiOiIyOS1BdWctMDciLCJjbG9zZSI6IjEzNC4wOCJ9LHsiZGF0ZSI6IjI4LUF1Zy0wNyIsImNsb3NlIjoiMTI2LjgyIn0seyJkYXRlIjoiMjctQXVnLTA3IiwiY2xvc2UiOiIxMzIuMjUifSx7ImRhdGUiOiIyNC1BdWctMDciLCJjbG9zZSI6IjEzNS4zMCJ9LHsiZGF0ZSI6IjIzLUF1Zy0wNyIsImNsb3NlIjoiMTMxLjA3In0seyJkYXRlIjoiMjItQXVnLTA3IiwiY2xvc2UiOiIxMzIuNTEifSx7ImRhdGUiOiIyMS1BdWctMDciLCJjbG9zZSI6IjEyNy41NyJ9LHsiZGF0ZSI6IjIwLUF1Zy0wNyIsImNsb3NlIjoiMTIyLjIyIn0seyJkYXRlIjoiMTctQXVnLTA3IiwiY2xvc2UiOiIxMjIuMDYifSx7ImRhdGUiOiIxNi1BdWctMDciLCJjbG9zZSI6IjExNy4wNSJ9LHsiZGF0ZSI6IjE1LUF1Zy0wNyIsImNsb3NlIjoiMTE5LjkwIn0seyJkYXRlIjoiMTQtQXVnLTA3IiwiY2xvc2UiOiIxMjQuMDMifSx7ImRhdGUiOiIxMy1BdWctMDciLCJjbG9zZSI6IjEyNy43OSJ9LHsiZGF0ZSI6IjEwLUF1Zy0wNyIsImNsb3NlIjoiMTI1LjAwIn0seyJkYXRlIjoiOS1BdWctMDciLCJjbG9zZSI6IjEyNi4zOSJ9LHsiZGF0ZSI6IjgtQXVnLTA3IiwiY2xvc2UiOiIxMzQuMDEifSx7ImRhdGUiOiI3LUF1Zy0wNyIsImNsb3NlIjoiMTM1LjAzIn0seyJkYXRlIjoiNi1BdWctMDciLCJjbG9zZSI6IjEzNS4yNSJ9LHsiZGF0ZSI6IjMtQXVnLTA3IiwiY2xvc2UiOiIxMzEuODUifSx7ImRhdGUiOiIyLUF1Zy0wNyIsImNsb3NlIjoiMTM2LjQ5In0seyJkYXRlIjoiMS1BdWctMDciLCJjbG9zZSI6IjEzNS4wMCJ9LHsiZGF0ZSI6IjMxLUp1bC0wNyIsImNsb3NlIjoiMTMxLjc2In0seyJkYXRlIjoiMzAtSnVsLTA3IiwiY2xvc2UiOiIxNDEuNDMifSx7ImRhdGUiOiIyNy1KdWwtMDciLCJjbG9zZSI6IjE0My44NSJ9LHsiZGF0ZSI6IjI2LUp1bC0wNyIsImNsb3NlIjoiMTQ2LjAwIn0seyJkYXRlIjoiMjUtSnVsLTA3IiwiY2xvc2UiOiIxMzcuMjYifSx7ImRhdGUiOiIyNC1KdWwtMDciLCJjbG9zZSI6IjEzNC44OSJ9LHsiZGF0ZSI6IjIzLUp1bC0wNyIsImNsb3NlIjoiMTQzLjcwIn0seyJkYXRlIjoiMjAtSnVsLTA3IiwiY2xvc2UiOiIxNDMuNzUifSx7ImRhdGUiOiIxOS1KdWwtMDciLCJjbG9zZSI6IjE0MC4wMCJ9LHsiZGF0ZSI6IjE4LUp1bC0wNyIsImNsb3NlIjoiMTM4LjEyIn0seyJkYXRlIjoiMTctSnVsLTA3IiwiY2xvc2UiOiIxMzguOTEifSx7ImRhdGUiOiIxNi1KdWwtMDciLCJjbG9zZSI6IjEzOC4xMCJ9LHsiZGF0ZSI6IjEzLUp1bC0wNyIsImNsb3NlIjoiMTM3LjczIn0seyJkYXRlIjoiMTItSnVsLTA3IiwiY2xvc2UiOiIxMzQuMDcifSx7ImRhdGUiOiIxMS1KdWwtMDciLCJjbG9zZSI6IjEzMi4zOSJ9LHsiZGF0ZSI6IjEwLUp1bC0wNyIsImNsb3NlIjoiMTMyLjM1In0seyJkYXRlIjoiOS1KdWwtMDciLCJjbG9zZSI6IjEzMC4zMyJ9LHsiZGF0ZSI6IjYtSnVsLTA3IiwiY2xvc2UiOiIxMzIuMzAifSx7ImRhdGUiOiI1LUp1bC0wNyIsImNsb3NlIjoiMTMyLjc1In0seyJkYXRlIjoiMy1KdWwtMDciLCJjbG9zZSI6IjEyNy4xNyJ9LHsiZGF0ZSI6IjItSnVsLTA3IiwiY2xvc2UiOiIxMjEuMjYifSx7ImRhdGUiOiIyOS1KdW4tMDciLCJjbG9zZSI6IjEyMi4wNCJ9LHsiZGF0ZSI6IjI4LUp1bi0wNyIsImNsb3NlIjoiMTIwLjU2In0seyJkYXRlIjoiMjctSnVuLTA3IiwiY2xvc2UiOiIxMjEuODkifSx7ImRhdGUiOiIyNi1KdW4tMDciLCJjbG9zZSI6IjExOS42NSJ9LHsiZGF0ZSI6IjI1LUp1bi0wNyIsImNsb3NlIjoiMTIyLjM0In0seyJkYXRlIjoiMjItSnVuLTA3IiwiY2xvc2UiOiIxMjMuMDAifSx7ImRhdGUiOiIyMS1KdW4tMDciLCJjbG9zZSI6IjEyMy45MCJ9LHsiZGF0ZSI6IjIwLUp1bi0wNyIsImNsb3NlIjoiMTIxLjU1In0seyJkYXRlIjoiMTktSnVuLTA3IiwiY2xvc2UiOiIxMjMuNjYifSx7ImRhdGUiOiIxOC1KdW4tMDciLCJjbG9zZSI6IjEyNS4wOSJ9LHsiZGF0ZSI6IjE1LUp1bi0wNyIsImNsb3NlIjoiMTIwLjUwIn0seyJkYXRlIjoiMTQtSnVuLTA3IiwiY2xvc2UiOiIxMTguNzUifSx7ImRhdGUiOiIxMy1KdW4tMDciLCJjbG9zZSI6IjExNy41MCJ9LHsiZGF0ZSI6IjEyLUp1bi0wNyIsImNsb3NlIjoiMTIwLjM4In0seyJkYXRlIjoiMTEtSnVuLTA3IiwiY2xvc2UiOiIxMjAuMTkifSx7ImRhdGUiOiI4LUp1bi0wNyIsImNsb3NlIjoiMTI0LjQ5In0seyJkYXRlIjoiNy1KdW4tMDciLCJjbG9zZSI6IjEyNC4wNyJ9LHsiZGF0ZSI6IjYtSnVuLTA3IiwiY2xvc2UiOiIxMjMuNjQifSx7ImRhdGUiOiI1LUp1bi0wNyIsImNsb3NlIjoiMTIyLjY3In0seyJkYXRlIjoiNC1KdW4tMDciLCJjbG9zZSI6IjEyMS4zMyJ9LHsiZGF0ZSI6IjEtSnVuLTA3IiwiY2xvc2UiOiIxMTguNDAifSx7ImRhdGUiOiIzMS1NYXktMDciLCJjbG9zZSI6IjEyMS4xOSJ9LHsiZGF0ZSI6IjMwLU1heS0wNyIsImNsb3NlIjoiMTE4Ljc3In0seyJkYXRlIjoiMjktTWF5LTA3IiwiY2xvc2UiOiIxMTQuMzUifSx7ImRhdGUiOiIyNS1NYXktMDciLCJjbG9zZSI6IjExMy42MiJ9LHsiZGF0ZSI6IjI0LU1heS0wNyIsImNsb3NlIjoiMTEwLjY5In0seyJkYXRlIjoiMjMtTWF5LTA3IiwiY2xvc2UiOiIxMTIuODkifSx7ImRhdGUiOiIyMi1NYXktMDciLCJjbG9zZSI6IjExMy41NCJ9LHsiZGF0ZSI6IjIxLU1heS0wNyIsImNsb3NlIjoiMTExLjk4In0seyJkYXRlIjoiMTgtTWF5LTA3IiwiY2xvc2UiOiIxMTAuMDIifSx7ImRhdGUiOiIxNy1NYXktMDciLCJjbG9zZSI6IjEwOS40NCJ9LHsiZGF0ZSI6IjE2LU1heS0wNyIsImNsb3NlIjoiMTA3LjM0In0seyJkYXRlIjoiMTUtTWF5LTA3IiwiY2xvc2UiOiIxMDcuNTIifSx7ImRhdGUiOiIxNC1NYXktMDciLCJjbG9zZSI6IjEwOS4zNiJ9LHsiZGF0ZSI6IjExLU1heS0wNyIsImNsb3NlIjoiMTA4Ljc0In0seyJkYXRlIjoiMTAtTWF5LTA3IiwiY2xvc2UiOiIxMDcuMzQifSx7ImRhdGUiOiI5LU1heS0wNyIsImNsb3NlIjoiMTA2Ljg4In0seyJkYXRlIjoiOC1NYXktMDciLCJjbG9zZSI6IjEwNS4wNiJ9LHsiZGF0ZSI6IjctTWF5LTA3IiwiY2xvc2UiOiIxMDMuOTIifSx7ImRhdGUiOiI0LU1heS0wNyIsImNsb3NlIjoiMTAwLjgxIn0seyJkYXRlIjoiMy1NYXktMDciLCJjbG9zZSI6IjEwMC40MCJ9LHsiZGF0ZSI6IjItTWF5LTA3IiwiY2xvc2UiOiIxMDAuMzkifSx7ImRhdGUiOiIxLU1heS0wNyIsImNsb3NlIjoiOTkuNDcifSx7ImRhdGUiOiIzMC1BcHItMDciLCJjbG9zZSI6Ijk5LjgwIn0seyJkYXRlIjoiMjctQXByLTA3IiwiY2xvc2UiOiI5OS45MiJ9LHsiZGF0ZSI6IjI2LUFwci0wNyIsImNsb3NlIjoiOTguODQifSx7ImRhdGUiOiIyNS1BcHItMDciLCJjbG9zZSI6Ijk1LjM1In0seyJkYXRlIjoiMjQtQXByLTA3IiwiY2xvc2UiOiI5My4yNCJ9XScpOwogICAgdmFyIHBhcnNlRGF0ZSA9IGQzLnRpbWUuZm9ybWF0KCIlZC0lYi0leSIpLnBhcnNlOwoKICAgIGRhdGFMaW5lLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICBkLmRhdGUgPSBwYXJzZURhdGUoZC5kYXRlKTsKICAgICAgICBkLmNsb3NlID0gK2QuY2xvc2U7CiAgICB9KTsKCiAgICB2YXIgbGluZUNoYXJ0Q29uZmlnID0gewogICAgICAgIHhBeGlzRmllbGQ6ICJkYXRlIiwKICAgICAgICB5QXhpc0ZpZWxkOiAiY2xvc2UiLAogICAgICAgIHlBeGlzVGl0bGU6ICJQcmljZSIsCiAgICAgICAgbWFyZ2luOiB7dG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDMwLCBsZWZ0OiA0MH0sCiAgICAgICAgd2lkdGg6OTYwLAogICAgICAgIGhlaWdodDo1MDAKICAgIH07CgogICAgZHJhd0xpbmVDaGFydCgiI2NoYXJ0IiwgbGluZUNoYXJ0Q29uZmlnLCBkYXRhTGluZSk7CgoKICAgIHZhciBwaWVEYXRhID0gSlNPTi5wYXJzZSgnW3siYWdlIjoiPDUiLCJwb3B1bGF0aW9uIjoiMjcwNDY1OSJ9LHsiYWdlIjoiNS0xMyIsInBvcHVsYXRpb24iOiI0NDk5ODkwIn0seyJhZ2UiOiIxNC0xNyIsInBvcHVsYXRpb24iOiIyMTU5OTgxIn0seyJhZ2UiOiIxOC0yNCIsInBvcHVsYXRpb24iOiIzODUzNzg4In0seyJhZ2UiOiIyNS00NCIsInBvcHVsYXRpb24iOiIxNDEwNjU0MyJ9LHsiYWdlIjoiNDUtNjQiLCJwb3B1bGF0aW9uIjoiODgxOTM0MiJ9LHsiYWdlIjoi4omlNjUiLCJwb3B1bGF0aW9uIjoiNjEyNDYzIn1dJyk7CgogICAgdmFyIHBpZUNoYXJ0Q29uZmlnID0gewogICAgICAgIHZhbHVlRmllbGROYW1lOiAicG9wdWxhdGlvbiIsCiAgICAgICAgZ3JvdXBGaWVsZE5hbWU6ICJhZ2UiLAogICAgICAgIGNvbG9yczogWyIjOThhYmM1IiwgIiM4YTg5YTYiLCAiIzdiNjg4OCIsICIjNmI0ODZiIiwgIiNhMDVkNTYiLCAiI2QwNzQzYyIsICIjZmY4YzAwIl0sCiAgICAgICAgd2lkdGg6OTYwLAogICAgICAgIGhlaWdodDo1MDAKICAgIH07CgogICAgZHJhd1BpZUNoYXJ0KCIjY2hhcnQiLCBwaWVDaGFydENvbmZpZyAsIHBpZURhdGEpOwoqLwoKLy9UT0RPOiBtb3ZlL3dyYXAgZnVuY3Rpb25zIG9mIHRoaXMgZmlsZSBpbiBhIHNlcnZpY2Ugb3IgZGlyZWN0aXZlIGFzIGFwcHJvcHJpYXRlIHNvIHVzZXJzIG9mIHRoZSBBUEkgY2FuIGJlIHVuaXQgdGVzdGVkLgpmdW5jdGlvbiBkcmF3QmFyQ2hhcnQoY29udGFpbmVySWQsIGNvbmZpZywgZGF0YSkgewoKICAgIGlmKCEoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApKXsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIHdpZHRoID0gY29uZmlnLndpZHRoIC0gY29uZmlnLm1hcmdpbi5sZWZ0IC0gY29uZmlnLm1hcmdpbi5yaWdodCwKICAgICAgICBoZWlnaHQgPSBjb25maWcuaGVpZ2h0IC0gY29uZmlnLm1hcmdpbi50b3AgLSBjb25maWcubWFyZ2luLmJvdHRvbTsKCiAgICB2YXIgeERvbWFpbiA9IGRhdGEubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGRbY29uZmlnLnhBeGlzRmllbGRdOwogICAgfSk7CiAgICB2YXIgeURvbWFpbiA9IFswLCBkMy5tYXgoZGF0YSwgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZFtjb25maWcueUF4aXNGaWVsZF07CiAgICB9KV07CgogICAgdmFyIHggPSBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2VCYW5kcyhbMCwgd2lkdGhdLCBjb25maWcuYmFyU2VwYXJhdG9yV2lkdGgpOwogICAgdmFyIHkgPSBkMy5zY2FsZS5saW5lYXIoKS5yYW5nZShbaGVpZ2h0LCAwXSk7CgogICAgdmFyIHhBeGlzID0gZDMuc3ZnLmF4aXMoKQogICAgICAgIC5zY2FsZSh4KQogICAgICAgIC5vcmllbnQoImJvdHRvbSIpOwoKICAgIHZhciB5QXhpcyA9IGQzLnN2Zy5heGlzKCkKICAgICAgICAuc2NhbGUoeSkKICAgICAgICAub3JpZW50KCJsZWZ0IikKICAgICAgICAudGlja3MoY29uZmlnLnRpY3MsIGNvbmZpZy50aWNzX21vZGlmaWVyKTsKCiAgICB2YXIgc3ZnID0gZDMuc2VsZWN0KGNvbnRhaW5lcklkKQogICAgICAgIC5hcHBlbmQoInN2ZyIpCiAgICAgICAgLmF0dHIoIndpZHRoIiwgd2lkdGggKyBjb25maWcubWFyZ2luLmxlZnQgKyBjb25maWcubWFyZ2luLnJpZ2h0KQogICAgICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQgKyBjb25maWcubWFyZ2luLnRvcCArIGNvbmZpZy5tYXJnaW4uYm90dG9tKQogICAgICAgIC5hcHBlbmQoImciKQogICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBjb25maWcubWFyZ2luLmxlZnQgKyAiLCIgKyBjb25maWcubWFyZ2luLnRvcCArICIpIik7CgogICAgeC5kb21haW4oeERvbWFpbik7CiAgICB5LmRvbWFpbih5RG9tYWluKTsKCiAgICBzdmcuYXBwZW5kKCJnIikKICAgICAgICAuYXR0cigiY2xhc3MiLCAieCBheGlzIikKICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLCIgKyBoZWlnaHQgKyAiKSIpCiAgICAgICAgLmNhbGwoeEF4aXMpOwoKICAgIHN2Zy5hcHBlbmQoImciKQogICAgICAgIC5hdHRyKCJjbGFzcyIsICJ5IGF4aXMiKQogICAgICAgIC5jYWxsKHlBeGlzKQogICAgICAgIC5hcHBlbmQoInRleHQiKQogICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAicm90YXRlKC05MCkiKQogICAgICAgIC5hdHRyKCJ5IiwgNikKICAgICAgICAuYXR0cigiZHkiLCAiLjcxZW0iKQogICAgICAgIC5zdHlsZSgidGV4dC1hbmNob3IiLCAiZW5kIikKICAgICAgICAudGV4dChjb25maWcueUF4aXNUaXRsZSk7CgogICAgc3ZnLnNlbGVjdEFsbCgiLmJhciIpCiAgICAgICAgLmRhdGEoZGF0YSkKICAgICAgICAuZW50ZXIoKQogICAgICAgIC5hcHBlbmQoInJlY3QiKQogICAgICAgIC5hdHRyKCJjbGFzcyIsICJiYXIiKQogICAgICAgIC5hdHRyKCJ4IiwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgcmV0dXJuIHgoZFtjb25maWcueEF4aXNGaWVsZF0pOwogICAgICAgIH0pCiAgICAgICAgLmF0dHIoIndpZHRoIiwgeC5yYW5nZUJhbmQoKSkKICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiB5KGRbY29uZmlnLnlBeGlzRmllbGRdKTsKICAgICAgICB9KQogICAgICAgIC5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4gaGVpZ2h0IC0geShkW2NvbmZpZy55QXhpc0ZpZWxkXSk7CiAgICAgICAgfSk7Cn0KCmZ1bmN0aW9uIGRyYXdMaW5lQ2hhcnQoY29udGFpbmVySWQsIGNvbmZpZywgZGF0YSkgewogICAgdmFyIHdpZHRoID0gY29uZmlnLndpZHRoIC0gY29uZmlnLm1hcmdpbi5sZWZ0IC0gY29uZmlnLm1hcmdpbi5yaWdodCwKICAgICAgICBoZWlnaHQgPSBjb25maWcuaGVpZ2h0IC0gY29uZmlnLm1hcmdpbi50b3AgLSBjb25maWcubWFyZ2luLmJvdHRvbTsKCiAgICB2YXIgeCA9IGQzLnRpbWUuc2NhbGUoKQogICAgICAgIC5yYW5nZShbMCwgd2lkdGhdKTsKCiAgICB2YXIgeSA9IGQzLnNjYWxlLmxpbmVhcigpCiAgICAgICAgLnJhbmdlKFtoZWlnaHQsIDBdKTsKCiAgICB2YXIgeEF4aXMgPSBkMy5zdmcuYXhpcygpCiAgICAgICAgLnNjYWxlKHgpCiAgICAgICAgLm9yaWVudCgiYm90dG9tIik7CgogICAgdmFyIHlBeGlzID0gZDMuc3ZnLmF4aXMoKQogICAgICAgIC5zY2FsZSh5KQogICAgICAgIC5vcmllbnQoImxlZnQiKTsKCiAgICB2YXIgbGluZSA9IGQzLnN2Zy5saW5lKCkKICAgICAgICAueChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4geChkW2NvbmZpZy54QXhpc0ZpZWxkXSk7CiAgICAgICAgfSkKICAgICAgICAueShmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4geShkW2NvbmZpZy55QXhpc0ZpZWxkXSk7CiAgICAgICAgfSk7CgogICAgdmFyIHN2ZyA9IGQzLnNlbGVjdChjb250YWluZXJJZCkuYXBwZW5kKCJzdmciKQogICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoICsgY29uZmlnLm1hcmdpbi5sZWZ0ICsgY29uZmlnLm1hcmdpbi5yaWdodCkKICAgICAgICAuYXR0cigiaGVpZ2h0IiwgaGVpZ2h0ICsgY29uZmlnLm1hcmdpbi50b3AgKyBjb25maWcubWFyZ2luLmJvdHRvbSkKICAgICAgICAuYXBwZW5kKCJnIikKICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgY29uZmlnLm1hcmdpbi5sZWZ0ICsgIiwiICsgY29uZmlnLm1hcmdpbi50b3AgKyAiKSIpOwoKICAgIHguZG9tYWluKGQzLmV4dGVudChkYXRhLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkW2NvbmZpZy54QXhpc0ZpZWxkXTsKICAgIH0pKTsKICAgIHkuZG9tYWluKGQzLmV4dGVudChkYXRhLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkW2NvbmZpZy55QXhpc0ZpZWxkXTsKICAgIH0pKTsKCiAgICBzdmcuYXBwZW5kKCJnIikKICAgICAgICAuYXR0cigiY2xhc3MiLCAieCBheGlzIikKICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLCIgKyBoZWlnaHQgKyAiKSIpCiAgICAgICAgLmNhbGwoeEF4aXMpOwoKICAgIHN2Zy5hcHBlbmQoImciKQogICAgICAgIC5hdHRyKCJjbGFzcyIsICJ5IGF4aXMiKQogICAgICAgIC5jYWxsKHlBeGlzKQogICAgICAgIC5hcHBlbmQoInRleHQiKQogICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAicm90YXRlKC05MCkiKQogICAgICAgIC5hdHRyKCJ5IiwgNikKICAgICAgICAuYXR0cigiZHkiLCAiLjcxZW0iKQogICAgICAgIC5zdHlsZSgidGV4dC1hbmNob3IiLCAiZW5kIikKICAgICAgICAudGV4dChjb25maWcueUF4aXNUaXRsZSk7CgogICAgc3ZnLmFwcGVuZCgicGF0aCIpCiAgICAgICAgLmRhdHVtKGRhdGEpCiAgICAgICAgLmF0dHIoImNsYXNzIiwgImxpbmUiKQogICAgICAgIC5hdHRyKCJkIiwgbGluZSk7Cn0KCmZ1bmN0aW9uIGRyYXdQaWVDaGFydChjb250YWluZXJJZCwgY29uZmlnLCBkYXRhKSB7CgogICAgdmFyIHJhZGl1cyA9IE1hdGgubWluKGNvbmZpZy53aWR0aCwgY29uZmlnLmhlaWdodCkgLyAyOwoKICAgIHZhciBjb2xvciA9IGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShjb25maWcuY29sb3JzKTsKCiAgICB2YXIgYXJjID0gZDMuc3ZnLmFyYygpCiAgICAgICAgLm91dGVyUmFkaXVzKHJhZGl1cyAtIDEwKQogICAgICAgIC5pbm5lclJhZGl1cygwKTsKCiAgICB2YXIgcGllID0gZDMubGF5b3V0LnBpZSgpCiAgICAgICAgLnNvcnQobnVsbCkKICAgICAgICAudmFsdWUoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgcmV0dXJuIGRbY29uZmlnLnZhbHVlRmllbGROYW1lXTsKICAgICAgICB9KTsKCiAgICB2YXIgc3ZnID0gZDMuc2VsZWN0KGNvbnRhaW5lcklkKS5hcHBlbmQoInN2ZyIpCiAgICAgICAgLmF0dHIoIndpZHRoIiwgY29uZmlnLndpZHRoKQogICAgICAgIC5hdHRyKCJoZWlnaHQiLCBjb25maWcuaGVpZ2h0KQogICAgICAgIC5hcHBlbmQoImciKQogICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBjb25maWcud2lkdGggLyAyICsgIiwiICsgY29uZmlnLmhlaWdodCAvIDIgKyAiKSIpOwoKICAgIHZhciBnID0gc3ZnLnNlbGVjdEFsbCgiLmFyYyIpCiAgICAgICAgLmRhdGEocGllKGRhdGEpKQogICAgICAgIC5lbnRlcigpLmFwcGVuZCgiZyIpCiAgICAgICAgLmF0dHIoImNsYXNzIiwgImFyYyIpOwoKICAgIGcuYXBwZW5kKCJwYXRoIikKICAgICAgICAuYXR0cigiZCIsIGFyYykKICAgICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4gY29sb3IoZC5kYXRhW2NvbmZpZy5ncm91cEZpZWxkTmFtZV0pOwogICAgICAgIH0pOwoKICAgIGcuYXBwZW5kKCJ0ZXh0IikKICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIGFyYy5jZW50cm9pZChkKSArICIpIjsKICAgICAgICB9KQogICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgLnN0eWxlKCJ0ZXh0LWFuY2hvciIsICJtaWRkbGUiKQogICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBkLmRhdGFbY29uZmlnLmdyb3VwRmllbGROYW1lXTsKICAgICAgICB9KTsKfQo=')
},
{
'name': '/app/lib/cosmos/js/utils.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgbWFuaXJ1enphbWFuIG9uIDcvNS8xNC4KICovCgoKZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHsKICAgIHZhciB2YWx1ZSA9ICI7ICIgKyBkb2N1bWVudC5jb29raWU7CiAgICB2YXIgcGFydHMgPSB2YWx1ZS5zcGxpdCgiOyAiICsgbmFtZSArICI9Iik7CiAgICBpZiAocGFydHMubGVuZ3RoID09IDIpIHJldHVybiBwYXJ0cy5wb3AoKS5zcGxpdCgiOyIpLnNoaWZ0KCk7Cn0KCmZ1bmN0aW9uIGdldFVzZXJOYW1lKGRlZmF1bHRfdXNlcil7CiAgICB2YXIgdXNlckNvb2tpZSA9IGdldENvb2tpZSgidXNlciIpOwogICAgaWYodXNlckNvb2tpZSl7CiAgICAgICAgdXNlckNvb2tpZSA9IHVzZXJDb29raWUucmVwbGFjZSgvXCIvZywgIiIpCiAgICAgICAgdmFyIGRlY29kZWQgPSBKU09OLnBhcnNlKHdpbmRvdy5hdG9iKHVzZXJDb29raWUpKTsKICAgICAgICByZXR1cm4gZGVjb2RlZFsidXNlcm5hbWUiXSB8fCBkZWZhdWx0X3VzZXI7CiAgICB9CgogICAgcmV0dXJuIGRlZmF1bHRfdXNlcjsKfQoKZnVuY3Rpb24gbG9nZ2VkSW4oKXsKICAgIHZhciB1c2VyQ29va2llID0gZ2V0Q29va2llKCJ1c2Vyc2VjcmV0Iik7CiAgICBpZih1c2VyQ29va2llKXsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQ==')
},
{
'name': '/app/lib/cosmos/js/serviceapi.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgTWFydWYgTWFuaXJ1enphbWFuIChtYXJ1Zm1AY29zbW9zZnJhbWV3b3JrLmNvbSkgb24gNi8xNC8xNC4KICovCgpmdW5jdGlvbiBwcm9jZXNzRXJyb3IoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKXsKICAgIGpRdWVyeSgiI3N0YXR1cyIpLmh0bWwoIjxoMz5FcnJvcjwvaDM+PGRpdj4iK2Vycm9yVGhyb3duKyI8L2Rpdj4iKTsKfQoKZnVuY3Rpb24gcHJvY2Vzc1N1Y2Nlc3MoZGF0YSl7CiAgICB2YXIgZGF0YTIgPSBKU09OLnBhcnNlKGRhdGEpOwogICAgalF1ZXJ5KCIjcmVzdWx0IikudmFsKEpTT04uc3RyaW5naWZ5KGRhdGEyLHVuZGVmaW5lZCwgMikpOwp9CgpmdW5jdGlvbiBnZXRTZXJ2aWNlVXJsKHNlcnZpY2UpIHsKICAgIHZhciByb290ID0gZG9jdW1lbnQuVVJMOwogICAgaWYoc2VydmljZVswXSA9PSAnLycpewogICAgICAgIHNlcnZpY2UgPSBzZXJ2aWNlLnN1YnN0cmluZygxKTsKICAgIH0KICAgIHJldHVybiByb290K3NlcnZpY2U7Cn0KCmZ1bmN0aW9uIGRvX29wZXJhdGlvbih1cmwsIG1ldGhvZCwgZGF0YSwgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKXsKICAgIGpRdWVyeSgiI3Jlc3VsdCIpLnZhbCgiIik7CiAgICBqUXVlcnkoIiNzdGF0dXMiKS5odG1sKCIiKTsKICAgIGNvbnNvbGUubG9nKG1ldGhvZCsgIjogIit1cmwpCiAgICAkLmFqYXgoewogICAgICAgIHVybDogdXJsLAogICAgICAgIHR5cGU6IG1ldGhvZCwKICAgICAgICBkYXRhOmRhdGEsCiAgICAgICAgc3VjY2VzczogY2FsbGJhY2ssCiAgICAgICAgZXJyb3I6IGVycm9yX2NhbGxiYWNrCiAgICB9KTsKfQoKZnVuY3Rpb24gaW5zZXJ0U2VydmljZSgpewogICAgdmFyIG5hbWUgPSBqUXVlcnkoIiNuYW1lIikudmFsKCk7CiAgICB2YXIgZGF0YSA9IGpRdWVyeSgiI2RhdGEiKS52YWwoKTsKCiAgICB2YXIgdXJsID0gIGdldFNlcnZpY2VVcmwobmFtZSk7CiAgICBkb19vcGVyYXRpb24odXJsLCAnUE9TVCcsIGRhdGEsIHByb2Nlc3NTdWNjZXNzLCBwcm9jZXNzRXJyb3IpOwp9CgpmdW5jdGlvbiBkZWxldGVJdGVtKCl7CiAgICB2YXIgbmFtZSA9IGpRdWVyeSgiI25hbWUiKS52YWwoKTsKICAgIHZhciBkYXRhID0galF1ZXJ5KCIjZGF0YSIpLnZhbCgpOwoKICAgIHZhciB1cmwgPSAgZ2V0U2VydmljZVVybChuYW1lKTsKCiAgICBkb19vcGVyYXRpb24odXJsLCAnREVMRVRFJywgZGF0YSwgcHJvY2Vzc1N1Y2Nlc3MsIHByb2Nlc3NFcnJvcik7Cn0KCmZ1bmN0aW9uIGxvYWRJdGVtKCl7CiAgICB2YXIgbmFtZSA9IGpRdWVyeSgiI25hbWUiKS52YWwoKTsKICAgIHZhciBkYXRhID0galF1ZXJ5KCIjZGF0YSIpLnZhbCgpOwogICAgdmFyIGNvbHVtbnMgPSBqUXVlcnkoIiNjb2x1bW5zIikudmFsKCk7CiAgICB2YXIgZmlsdGVyID0galF1ZXJ5KCIjZmlsdGVyIikudmFsKCk7CgogICAgdmFyIHVybCA9ICBnZXRTZXJ2aWNlVXJsKG5hbWUpOwogICAgaWYoY29sdW1ucyl7CiAgICAgICAgdXJsID0gdXJsKyI/IjsKICAgICAgICB1cmwgPXVybCsgImNvbHVtbnM9Iitjb2x1bW5zOwogICAgfQogICAgaWYoZmlsdGVyKXsKICAgICAgICBpZighY29sdW1ucykgewogICAgICAgICAgICB1cmwgPSB1cmwgKyAiPyI7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIHVybD11cmwrIiYiOwogICAgICAgIH0KICAgICAgICB1cmwgPSB1cmwrImZpbHRlcj0iK2ZpbHRlcgogICAgfQoKICAgIGRvX29wZXJhdGlvbih1cmwsICdHRVQnLCBkYXRhLCBwcm9jZXNzU3VjY2VzcyAscHJvY2Vzc0Vycm9yKTsKfQoKZnVuY3Rpb24gdXBkYXRlSXRlbSgpewogICAgdmFyIG5hbWUgPSBqUXVlcnkoIiNuYW1lIikudmFsKCk7CiAgICB2YXIgZGF0YSA9IGpRdWVyeSgiI2RhdGEiKS52YWwoKTsKCiAgICB2YXIgdXJsID0gIGdldFNlcnZpY2VVcmwobmFtZSk7CgogICAgZG9fb3BlcmF0aW9uKHVybCwgJ1BVVCcsIGRhdGEsIHByb2Nlc3NTdWNjZXNzLCBwcm9jZXNzRXJyb3IpOwp9CgpmdW5jdGlvbiBzdWJzY3JpYmUgKG1vbml0b3JfZW5kcG9pbnQsIG9iamVjdF9uYW1lLCBjYWxsYmFjaykgewogICAgLy9UT0RPOiBVbmlmeSB0aGUgb2JzZXJ2ZXIgdG8gbGlzdGVuIHRvIG1hbnkgb2JqZWN0cyBhdCBhIHRpbWUgdXNpbmcgZGlmZmVyZW50IGNhbGxiYWNrCiAgICAvL3ZhciBtb25pdG9yX2VuZHBvaW50ID0gIndzOi8vbG9jYWxob3N0OjgwODAvY2hhbmdlbW9uaXRvciIKICAgIHZhciB3ZWJzb2NrZXQgPSBuZXcgV2ViU29ja2V0KG1vbml0b3JfZW5kcG9pbnQpOwogICAgdmFyIGZuID0gY2FsbGJhY2s7CiAgICB3ZWJzb2NrZXQub25vcGVuID0gZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJTb2NrZXQgb3BlbmVkIik7CiAgICAgICAgd2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyJ0eXBlIjogIm1vbml0b3JfbnMiLCAibnMiOiBvYmplY3RfbmFtZX0pKQogICAgfQoKICAgIHdlYnNvY2tldC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZ0KSB7CiAgICAgICAgY29uc29sZS5sb2coIk9uIG1lc3NhZ2U6ICIgKyBldnQuZGF0YSk7CiAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgIGZuKGV2dC5kYXRhKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgIC8vSW4gY2FsbGJhY2sgeW91IG1heSBkbyBzb21ldGhpbmcgbGlrZSAoYWxzbyBjb25zaWRlciB0aGUgZXZ0LmRhdGEgaWYgeW91IGFyZSBtb25pdG9yaW5nIG11bHRpcGxlIG9iamVjdHMuOgogICAgICAgICAgICAgJGh0dHAuZ2V0KCcvc2VydmljZS8nK29iamVjdF9uYW1lKycvJykuc3VjY2VzcyhmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAkc2NvcGUuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICovCiAgICAgICAgfQoKICAgIH0KCiAgICB3ZWJzb2NrZXQub25jbG9zZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiT24gY2xvc2VkIik7CiAgICB9Cn0=')
},
{
'name': '/app/lib/cosmos/js/services/http.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKc2VydmljZXMuZmFjdG9yeSgnQ29zbW9zU2VydmljZScsIFsnJGh0dHAnLCBmdW5jdGlvbiAoJGh0dHApIHsKICAgIHJldHVybnsKICAgICAgICBnZXQ6IGZ1bmN0aW9uICh1cmksIGNhbGxiYWNrLCBlcnJvcl9jYWxsYmFjaykgewogICAgICAgICAgICAkaHR0cC5nZXQodXJpKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZWRfZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLl9jb3Ntb3Nfc2VydmljZV9hcnJheV9yZXN1bHRfKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWRfZGF0YSA9IEpTT04ucGFyc2UoZGF0YS5fZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXR1cm5lZF9kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5lcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yX2NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NhbGxiYWNrKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICBzZWFyY2g6IGZ1bmN0aW9uICh1cmksIHBhcmFtcywgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7CiAgICAgICAgICAgICRodHRwLmdldCh1cmksIHBhcmFtcykuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgdmFyIHJldHVybmVkX2RhdGEgPSBkYXRhOwogICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5fY29zbW9zX3NlcnZpY2VfYXJyYXlfcmVzdWx0XykgewogICAgICAgICAgICAgICAgICAgIHJldHVybmVkX2RhdGEgPSBKU09OLnBhcnNlKGRhdGEuX2QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socmV0dXJuZWRfZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcl9jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jYWxsYmFjayhkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH0sCiAgICAgICAgcG9zdDogZnVuY3Rpb24gKHVyaSwgZGF0YSwgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSB7CiAgICAgICAgICAgICRodHRwLnBvc3QodXJpLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZWRfZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLl9jb3Ntb3Nfc2VydmljZV9hcnJheV9yZXN1bHRfKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWRfZGF0YSA9IEpTT04ucGFyc2UoZGF0YS5fZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXR1cm5lZF9kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5lcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yX2NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NhbGxiYWNrKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcG9zdFdpdGhBcmdzOiBmdW5jdGlvbiAodXJpLCBkYXRhLCBjYWxsYmFjaywgY2FsbGJhY2tBcmdzLCBlcnJvcl9jYWxsYmFjaywgZXJyb3JDYWxsYmFja0FyZ3MpIHsKICAgICAgICAgICAgJGh0dHAucG9zdCh1cmksIGRhdGEpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZF9kYXRhID0gZGF0YTsKICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuX2Nvc21vc19zZXJ2aWNlX2FycmF5X3Jlc3VsdF8pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm5lZF9kYXRhID0gSlNPTi5wYXJzZShkYXRhLl9kKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJldHVybmVkX2RhdGEsIGNhbGxiYWNrQXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcl9jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jYWxsYmFjayhkYXRhLCBzdGF0dXMsIGVycm9yQ2FsbGJhY2tBcmdzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBwdXQ6IGZ1bmN0aW9uICh1cmksIGRhdGEsIGNhbGxiYWNrLCBlcnJvcl9jYWxsYmFjaykgewogICAgICAgICAgICAkaHR0cC5wdXQodXJpLCBkYXRhKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5lcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yX2NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NhbGxiYWNrKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZGVsZXRlOiBmdW5jdGlvbiAodXJpLCBjYWxsYmFjaywgZXJyb3JfY2FsbGJhY2spIHsKICAgICAgICAgICAgJGh0dHAuZGVsZXRlKHVyaSkuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcl9jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jYWxsYmFjayhkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHNhdmVGaWxlOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGNvbnRlbnQsIGNvbnRlbnRUeXBlLCBmaWxlTmFtZSwgZmlsZUlkLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW2NvbnRlbnRdLCB7IHR5cGU6IGNvbnRlbnRUeXBlfSk7CgogICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoInVwbG9hZGVkZmlsZSIsIGJsb2IsIGZpbGVOYW1lKTsKCiAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgogICAgICAgICAgICB2YXIgdXJsID0gICIvZ3JpZGZzLyIgKyBjb2xsZWN0aW9uTmFtZSArICIvIiArIChmaWxlSWQ/IChmaWxlSWQgKyAiLyIpOicnKTsKCiAgICAgICAgICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICBpZihvblN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVkX2RhdGEgPSBKU09OLnBhcnNlKHJlcXVlc3QucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWRfZGF0YSAmJiByZXR1cm5lZF9kYXRhLl9jb3Ntb3Nfc2VydmljZV9hcnJheV9yZXN1bHRfKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZF9kYXRhID0gSlNPTi5wYXJzZShyZXR1cm5lZF9kYXRhLl9kKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldHVybmVkX2RhdGEgJiYgcmV0dXJuZWRfZGF0YS5sZW5ndGg+MCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWRfZGF0YSA9IHJldHVybmVkX2RhdGFbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHJldHVybmVkX2RhdGEpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZihvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IocmVxdWVzdC5zdGF0dXMsIHJlcXVlc3QucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciByZXF1ZXN0TWV0aG9kID0gZmlsZUlkPyJQVVQiOiJQT1NUIjsKCiAgICAgICAgICAgIHJlcXVlc3Qub3BlbihyZXF1ZXN0TWV0aG9kLHVybCk7CiAgICAgICAgICAgIHJlcXVlc3Quc2VuZChmb3JtRGF0YSk7CiAgICAgICAgfQogICAgfQoKfV0pOw==')
},
{
'name': '/app/lib/cosmos/js/services/settings.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKdmFyIGdldEFwcFNldHRpbmdzQnlBcHBJbXBsID0gZnVuY3Rpb24gKGFwcGxpY2F0aW9uLCBzZXR0aW5nc05hbWUpIHsKICAgIGlmIChhcHBsaWNhdGlvbiAmJiBhcHBsaWNhdGlvblsic2V0dGluZ3MiXQogICAgICAgICYmIGFwcGxpY2F0aW9uWyJzZXR0aW5ncyJdWyJvYmplY3RtYXAiXQogICAgICAgICYmIGFwcGxpY2F0aW9uWyJzZXR0aW5ncyJdWyJvYmplY3RtYXAiXVtzZXR0aW5nc05hbWVdKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXBwbGljYXRpb25bInNldHRpbmdzIl1bIm9iamVjdG1hcCJdW3NldHRpbmdzTmFtZV07CgogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KfTsKCnNlcnZpY2VzLmZhY3RvcnkoJ2Nvc21vcy5zZXR0aW5ncycsIFsnQ29zbW9zU2VydmljZScsICdjb3Ntb3MuY2FjaGVkbG9hZGVyJywgImNvc21vcy5jb25maWdOYW1lcyIsIGZ1bmN0aW9uIChDb3Ntb3NTZXJ2aWNlLCBjYWNoZWRsb2FkZXIsIGNvbmZpZ05hbWVzKSB7CiAgICByZXR1cm57CiAgICAgICAgZ2V0QXBwU2V0dGluZ3M6IGZ1bmN0aW9uIChhcHBQYXRoLCBzZXR0aW5nc05hbWUsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgaWYoc2V0dGluZ3NOYW1lID09PSAiYXBwY29uZmlnb2JqZWN0Iil7CiAgICAgICAgICAgICAgICBpZihzdWNjZXNzQ2FsbGJhY2spewogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygiY29zbW9zLmFwcGxpY2F0aW9ucyIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb3Ntb3MuYXBwbGljYXRpb25zIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoc2V0dGluZ3NOYW1lID09PSAid2lkZ2V0b2JqZWN0Iil7CiAgICAgICAgICAgICAgICBpZihzdWNjZXNzQ2FsbGJhY2spewogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygiY29zbW9zLndpZGdldHMiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29zbW9zLndpZGdldHMiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihzZXR0aW5nc05hbWUgPT09ICJzb3VyY2Vjb2xuYW1lIil7CiAgICAgICAgICAgICAgICBpZihzdWNjZXNzQ2FsbGJhY2spewogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygiY29zbW9zLnNvdXJjZW1vZHVsZXMiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29zbW9zLnNvdXJjZW1vZHVsZXMiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihzZXR0aW5nc05hbWUgPT09ICJpbnRlcmNlcHRvcmNvbmlnb2JqZWN0Iil7CiAgICAgICAgICAgICAgICBpZihzdWNjZXNzQ2FsbGJhY2spewogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygiY29zbW9zLmludGVyY2VwdG9ycyIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAiY29zbW9zLmludGVyY2VwdG9ycyI7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBpZihzZXR0aW5nc05hbWUgPT09ICJhcHBlbmRwb2ludGNvbmlnb2JqZWN0Iil7CiAgICAgICAgICAgICAgICBpZihzdWNjZXNzQ2FsbGJhY2spewogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygiY29zbW9zLmFwcGVuZHBvaW50cyIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gImNvc21vcy5hcHBlbmRwb2ludHMiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgYXBwQ2FjaGUgPSAiQXBwbGljYXRpb24uIiArIGFwcFBhdGg7CiAgICAgICAgICAgIHZhciBhcHBVcmwgPSAnL3NlcnZpY2UvY29zbW9zLmFwcGxpY2F0aW9ucy8/ZmlsdGVyPXsicGF0aCI6IicgKyBhcHBQYXRoICsgJyJ9JzsKCiAgICAgICAgICAgIGNhY2hlZGxvYWRlci5nZXQoYXBwQ2FjaGUsIGFwcFVybCwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChhcHBsaWNhdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXBwbGljYXRpb247CgogICAgICAgICAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbnMgJiYgYXBwbGljYXRpb25zLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uID0gYXBwbGljYXRpb25zWzBdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZ2V0QXBwU2V0dGluZ3NCeUFwcEltcGwoYXBwbGljYXRpb24sIHNldHRpbmdzTmFtZSk7CgogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZihzdWNjZXNzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soIlNldHRpbmdzIG5vdCBmb3VuZCBmb3IgdGhlIGdpdmVuIHBhdGguIFBhdGggPSAiICsgYXBwUGF0aCArICIgU2V0dGluZ3MgbmFtZT0gIisgc2V0dGluZ3NOYW1lLCA0MDQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBpZihlcnJvckNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0Q29uZmlnT2JqZWN0TmFtZSA6IGZ1bmN0aW9uKGNvbmZpZ05hbWUpewogICAgICAgICAgICBpZihjb25maWdOYW1lID09PSBjb25maWdOYW1lcy5NRU5VKXsKICAgICAgICAgICAgICAgIHJldHVybiAibWVudWNvbmZpZ29iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGNvbmZpZ05hbWUgPT09IGNvbmZpZ05hbWVzLkxJU1QpIHsKICAgICAgICAgICAgICAgIHJldHVybiAgImxpc3Rjb25maWdvYmplY3QiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGNvbmZpZ05hbWUgPT09IGNvbmZpZ05hbWVzLkNIQVJUKXsKICAgICAgICAgICAgICAgIHJldHVybiAiY2hhcnRjb25maWdvYmplY3QiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihjb25maWdOYW1lID09PSBjb25maWdOYW1lcy5GT1JNKXsKICAgICAgICAgICAgICAgIHJldHVybiAiZm9ybWNvbmZpZ29iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGNvbmZpZ05hbWUgPT09IGNvbmZpZ05hbWVzLlNPVVJDRUZJTEVTKXsKICAgICAgICAgICAgICAgIHJldHVybiAic291cmNlY29sbmFtZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGNvbmZpZ05hbWUgPT09ICJpbnRlcmNlcHRvciIpewogICAgICAgICAgICAgICAgcmV0dXJuICJpbnRlcmNlcHRvcmNvbmlnb2JqZWN0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoY29uZmlnTmFtZSA9PT0gImFwcGVuZHBvaW50Iil7CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGVuZHBvaW50Y29uaWdvYmplY3QiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0QXBwU2V0dGluZ3NCeUFwcCA6IGZ1bmN0aW9uIChhcHBsaWNhdGlvbiwgc2V0dGluZ3NOYW1lKSB7CiAgICAgICAgICAgIGlmKHNldHRpbmdzTmFtZSA9PT0gImFwcGNvbmZpZ29iamVjdCIpewogICAgICAgICAgICAgICAgcmV0dXJuICJjb3Ntb3MuYXBwbGljYXRpb25zIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoc2V0dGluZ3NOYW1lID09PSAid2lkZ2V0b2JqZWN0Iil7CiAgICAgICAgICAgICAgICByZXR1cm4gImNvc21vcy53aWRnZXRzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoc2V0dGluZ3NOYW1lID09PSAic291cmNlY29sbmFtZSIpewogICAgICAgICAgICAgICAgcmV0dXJuICJjb3Ntb3Muc291cmNlbW9kdWxlcyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHNldHRpbmdzTmFtZSA9PT0gImludGVyY2VwdG9yY29uaWdvYmplY3QiKXsKICAgICAgICAgICAgICAgIHJldHVybiAiY29zbW9zLmludGVyY2VwdG9ycyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHNldHRpbmdzTmFtZSA9PT0gImFwcGVuZHBvaW50Y29uaWdvYmplY3QiKXsKICAgICAgICAgICAgICAgIHJldHVybiAiY29zbW9zLmFwcGVuZHBvaW50cyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBnZXRBcHBTZXR0aW5nc0J5QXBwSW1wbChhcHBsaWNhdGlvbiwgc2V0dGluZ3NOYW1lKTsKICAgICAgICB9LAoKICAgICAgICBnZXRBcHBsaWNhdGlvbjogZnVuY3Rpb24gKGFwcFBhdGgsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykgewogICAgICAgICAgICB2YXIgYXBwQ2FjaGUgPSAiQXBwbGljYXRpb24uIiArIGFwcFBhdGg7CiAgICAgICAgICAgIHZhciBhcHBVcmwgPSAnL3NlcnZpY2UvY29zbW9zLmFwcGxpY2F0aW9ucy8/ZmlsdGVyPXsicGF0aCI6IicgKyBhcHBQYXRoICsgJyJ9JzsKCiAgICAgICAgICAgIGNhY2hlZGxvYWRlci5nZXQoYXBwQ2FjaGUsIGFwcFVybCwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChhcHBsaWNhdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYXBwbGljYXRpb25zICYmIGFwcGxpY2F0aW9ucy5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbnNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcHBsaWNhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKCJBcHBsaWNhdGlvbiBub3QgZm91bmQgZm9yIHRoZSBnaXZlbiBwYXRoLiBQYXRoID0gIiArIGFwcFBhdGgsIDQwNCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIGNsZWFyQ2FjaGUgOiBmdW5jdGlvbihjYWNoZU5hbWUpewogICAgICAgICAgICBjYWNoZWRsb2FkZXIuY2xlYXJDYWNoZShjYWNoZU5hbWUpOwogICAgICAgIH0sCgogICAgICAgIGdldEFsbEFwcENhY2hlTmFtZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgcmV0dXJuICJBcHBsaWNhdGlvbi5fQ29zbW9zX0FsbF9BcHBsaWNhdGlvbnNfIjsKICAgICAgICB9LAoKICAgICAgICBnZXRBcHBsaWNhdGlvbnMgOiBmdW5jdGlvbihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spewogICAgICAgICAgICB2YXIgYXBwQ2FjaGUgPSAiQXBwbGljYXRpb24uX0Nvc21vc19BbGxfQXBwbGljYXRpb25zXyI7CiAgICAgICAgICAgIHZhciBhcHBVcmwgPSAnL3NlcnZpY2UvY29zbW9zLmFwcGxpY2F0aW9ucy8nOwogICAgICAgICAgICBjYWNoZWRsb2FkZXIuZ2V0KGFwcENhY2hlLCBhcHBVcmwsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoYXBwbGljYXRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGFwcGxpY2F0aW9ucyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBnZXRHbG9iYWxTZXR0aW5nczogZnVuY3Rpb24ob25TdWNjZXNzLCBvbkVycm9yKXsKICAgICAgICAgICAgdmFyIGNhY2hlTmFtZSA9ICJTZXR0aW5ncy5fQ29zbW9zX0dsb2JhbF9TZXR0aW5nc18iOwogICAgICAgICAgICB2YXIgdXJsID0gJy9zZXJ2aWNlL2Nvc21vcy5nbG9iYWxzZXR0aW5ncy8nOwogICAgICAgICAgICBjYWNoZWRsb2FkZXIuZ2V0KGNhY2hlTmFtZSwgdXJsLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGdzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZ3MgJiYgZ3MubGVuZ3RoPT0xKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihvblN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhnc1swXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYob25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcig0MDQsICJHbG9iYWwgc2V0dGluZ3Mgbm90IGZvdW5kIG9yIG1vcmUgdGhhbiBvbmUgZm91bmQuIENvdW50ID0gIiArIGdzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYob25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIGluaXRTZXR0aW5nczogZnVuY3Rpb24ob25TdWNjZXNzLCBvbkVycm9yKXsKICAgICAgICAgICAgdGhpcy5nZXRHbG9iYWxTZXR0aW5ncyhvblN1Y2Nlc3MsIG9uRXJyb3IpOwogICAgICAgIH0KICAgIH0KfV0pOw==')
},
{
'name': '/app/lib/cosmos/js/services/utils.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTIvMTQvMTQuCiAqLwoKCnNlcnZpY2VzLmZhY3RvcnkoJ2Nvc21vcy51dGlscycsIFsnQ29zbW9zU2VydmljZScsICdjb3Ntb3MuY2FjaGVkbG9hZGVyJywgJ2Nvc21vcy5zZXR0aW5ncycsCiAgICBmdW5jdGlvbiAoQ29zbW9zU2VydmljZSwgY2FjaGVkbG9hZGVyLCBzZXR0aW5ncykgewogICAgcmV0dXJuewogICAgICAgIHNpdGVXaWRlQ291bnRlciA6IDAsCiAgICAgICAgc2V0QXBwQXNEZWZhdWx0OiBmdW5jdGlvbiAoYXBwLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIGlmIChhcHAgJiYgYXBwLmlkKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJpID0gIi9zZXJ2aWNlL2Nvc21vcy5nbG9iYWxzZXR0aW5ncy8iOwogICAgICAgICAgICAgICAgQ29zbW9zU2VydmljZS5nZXQodXJpLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncyA9IGRhdGFbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkgPSB1cmkgKyBncy5faWQgKyAnLyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHV0ZGF0YSA9IHsiZGVmYXVsdGFwcGlkIjogYXBwLmlkfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UucHV0KHVyaSwgcHV0ZGF0YSwgb25TdWNjZXNzLCBvbkVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2xvYmFsIHNldHRpbmdzIG5vdCBmb3VuZCAtIGNyZWF0ZSBvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwdXRkYXRhID0geyJkZWZhdWx0YXBwaWQiOiBhcHAuaWR9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zbW9zU2VydmljZS5wb3N0KHVyaSwgcHV0ZGF0YSwgb25TdWNjZXNzLCBvbkVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25FcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAob25FcnJvcikgewogICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoNDA0LCAiQXBwbGljYXRpb24gbm90IGZvdW5kIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBzZXRQYWdlQXNEZWZhdWx0OiBmdW5jdGlvbiAoYXBwLCBwYWdlLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKICAgICAgICAgICAgaWYgKGFwcCAmJiBhcHAuX2lkKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJpID0gIi9zZXJ2aWNlL2Nvc21vcy5hcHBsaWNhdGlvbnMvIithcHAuX2lkOwogICAgICAgICAgICAgICAgQ29zbW9zU2VydmljZS5nZXQodXJpLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRlZEFwcCA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRBcHAuc2V0dGluZ3MuaW5kZXhQYWdlSWQgPSBwYWdlLl9pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwdXRkYXRhID0geyAic2V0dGluZ3MiIDogbG9hZGVkQXBwLnNldHRpbmdzfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UucHV0KHVyaSwgcHV0ZGF0YSwgb25TdWNjZXNzLCBvbkVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoNDA0LCAiQXBwbGljYXRpb24gbm90IGZvdW5kIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9uRXJyb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDQwNCwgIkFwcGxpY2F0aW9uIG5vdCBmb3VuZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0QWxsUGFnZXM6IGZ1bmN0aW9uIChhcHAsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykgewogICAgICAgICAgICB2YXIgYXBwQ2FjaGUgPSAiUGFnZS5fQ29zbW9zX0FsbF9QYWdlc18iOwogICAgICAgICAgICB2YXIgYXBwVXJsID0gJy9zZXJ2aWNlLycgKyBhcHAuc2V0dGluZ3Mub2JqZWN0bWFwLnBhZ2Vjb25maWdvYmplY3QgKyAnLyc7CiAgICAgICAgICAgIGNhY2hlZGxvYWRlci5nZXQoYXBwQ2FjaGUsIGFwcFVybCwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChwYWdlcykgewogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhwYWdlcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBnZXROZXh0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKXsKICAgICAgICAgICAgaWYodmFsdWUpewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2l0ZVdpZGVDb3VudGVyICs9MTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2l0ZVdpZGVDb3VudGVyOwogICAgICAgIH0sCgogICAgICAgIGdldENhcGNoYVNpdGVLZXk6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHZhciBnbG9iYWxTZXR0aW5ncyA9IGNhY2hlZGxvYWRlci5nZXRGcm9tQ2FjaGUoIlNldHRpbmdzLl9Db3Ntb3NfR2xvYmFsX1NldHRpbmdzXyIpOwogICAgICAgICAgICBpZihnbG9iYWxTZXR0aW5ncyl7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsU2V0dGluZ3NbMF1bInJlY2FwY2hhc2l0ZWtleSJdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9XSk7')
},
{
'name': '/app/lib/cosmos/js/services/services.js', 'data': base64.b64decode(b'J3VzZSBzdHJpY3QnOwoKLyogU2VydmljZXMgKi8KCnZhciBzZXJ2aWNlczsKc2VydmljZXMgPSBhbmd1bGFyLm1vZHVsZSgnY29zbW9zVUkuc2VydmljZXMnLCBbXSkKICAgIC52YWx1ZSgndmVyc2lvbicsICcwLjEnKQogICAgLmZhY3RvcnkoJ21lc3NhZ2UnLCBbJyRodHRwJywgZnVuY3Rpb24gKCRodHRwKSB7CiAgICAgICAgdmFyIG1zZ3MgPSBbXTsKICAgICAgICByZXR1cm57CiAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChtc2cpIHsKICAgICAgICAgICAgICAgIG1zZ3MucHVzaChtc2cpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwb3A6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtc2dzLnNoaWZ0KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGhhc01lc3NhZ2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAobXNncyAmJiBtc2dzLmxlbmd0aCA+IDApOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH1dKQogICAgLmZhY3RvcnkoJ2dsb2JhbGhhc2h0YWJsZScsIFsnJGh0dHAnLCAnbG9jYWxTdG9yYWdlU2VydmljZScsIGZ1bmN0aW9uICgkaHR0cCwgbG9jYWxTdG9yYWdlU2VydmljZSkgewogICAgICAgIHJldHVybnsKICAgICAgICAgICAgY29sbGVjdGlvbnM6IGxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0KCdnbG9iYWxoYXNodGFibGUnKSB8fCB7fSwKICAgICAgICAgICAgZ2V0QWxsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSwgb2JqZWN0KSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25zW25hbWVdID0gb2JqZWN0OwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlU2VydmljZS5zZXQoJ2dsb2JhbGhhc2h0YWJsZScsIHRoaXMuY29sbGVjdGlvbnMpCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uc1tuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH1dKQoKICAgIC5mYWN0b3J5KCduYW1lZGNvbGVjdGlvbicsIFsnJGh0dHAnLCAnbG9jYWxTdG9yYWdlU2VydmljZScsIGZ1bmN0aW9uICgkaHR0cCwgbG9jYWxTdG9yYWdlU2VydmljZSkgewogICAgICAgIHJldHVybnsKICAgICAgICAgICAgY29sbGVjdGlvbnM6IHt9LAogICAgICAgICAgICAvLyBUT0RPOiBtYXliZSBwdXQgYWxsIG5hbWVkIGNvbGxlY3Rpb24gaW4gdGhlIGxvY2FsIHN0b3JhZ2UgYXQgb25jZS0gbm93IHdlIGFyZSBzYXZpbmcgaW5kaXZpZHVhbAogICAgICAgICAgICAvLyB3ZSBzaG91bGQgYmUgY2FyZWZ1bCBhYm91dCB0aGlzIHNpbmNlIGRhdGEgc2l6ZSBtYXkgaW5jcmVhc2UgYSBsb3QgZm9yIGxhcmdlIGFwcGxpY2F0aW9ucwoKICAgICAgICAgICAgZ2V0Q29sbGVjdGlvbjogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgIHZhciBvYmplY3RzID0gdGhpcy5jb2xsZWN0aW9uc1tuYW1lXTsKCiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdHMpIHsKICAgICAgICAgICAgICAgICAgICBvYmplY3RzID0gbG9jYWxTdG9yYWdlU2VydmljZS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmplY3RzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9uc1tuYW1lXSA9IG9iamVjdHM7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlU2VydmljZS5zZXQobmFtZSwgb2JqZWN0cyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdHM7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhcHBlbmQ6IGZ1bmN0aW9uIChuYW1lLCBvYmplY3QpIHsKICAgICAgICAgICAgICAgIGlmICghbmFtZSB8fCAhb2JqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBvYmplY3RzID0gdGhpcy5nZXRDb2xsZWN0aW9uKG5hbWUpOwoKICAgICAgICAgICAgICAgIG9iamVjdHMucHVzaChvYmplY3QpOwoKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0KG5hbWUsIG9iamVjdHMpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgcmVtb3ZlQXQ6IGZ1bmN0aW9uIChuYW1lLCBpbmRleCkgeyAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgb2JqZWN0cyA9IHRoaXMuZ2V0Q29sbGVjdGlvbihuYW1lKTsKICAgICAgICAgICAgICAgIGlmICghb2JqZWN0cyB8fCBvYmplY3RzLmxlbmd0aDw9aW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvYmplY3RzLnNwbGljZShpbmRleCwgMSk7ICAgIAogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlU2VydmljZS5zZXQobmFtZSwgb2JqZWN0cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICByZW1vdmVCeUlkOiBmdW5jdGlvbiAobmFtZSwgX2lkKSB7CiAgICAgICAgICAgICAgICB2YXIgZm91bmRJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgdmFyIG9iamVjdHMgPSB0aGlzLmdldENvbGxlY3Rpb24obmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRJbmRleDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChvYmplY3RzLCBmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggPCAwICYmIHZhbHVlWyJfaWQiXSA9PT0gX2lkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoZm91bmRJbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5zcGxpY2UoZm91bmRJbmRleCwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldChuYW1lLCBvYmplY3RzKTsKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEluZGV4OwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgdmFyIG9iamVjdHMgPSB0aGlzLmdldENvbGxlY3Rpb24obmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9XSkKCiAgICAuZmFjdG9yeSgnY2FsY3VsYXRvcicsIFsnJGh0dHAnLCBmdW5jdGlvbiAoJGh0dHApIHsKICAgICAgICByZXR1cm57CgogICAgICAgICAgICBzdW1Db2x1bW5WYWx1ZXM6IGZ1bmN0aW9uIChsaXN0LCBjb2x1bW5OYW1lKSB7CiAgICAgICAgICAgICAgICB2YXIgdG90YWwgPSAwOwogICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGxpc3QsIGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gTnVtYmVyKHZhbHVlW2NvbHVtbk5hbWVdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGN1cjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGF2ZXJhZ2VDb2x1bW5WYWx1ZXM6IGZ1bmN0aW9uIChsaXN0LCBjb2x1bW5OYW1lKSB7CiAgICAgICAgICAgICAgICBpZiAobGlzdC5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHN1bSA9IHN1bUNvbHVtblZhbHVlcyhsaXN0LCBjb2x1bW5OYW1lKTsKICAgICAgICAgICAgICAgIHZhciBhdmVyYWdlID0gc3VtIC8gbGlzdC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9XSkKCiAgICAuZmFjdG9yeSgnY29zbW9zLmNhY2hlJywgWyckaHR0cCcsIGZ1bmN0aW9uICgkaHR0cCkgewogICAgICAgIHJldHVybnsKICAgICAgICAgICAgc3RvcmU6IHt9LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChpZCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmVbaWRdID0gdmFsdWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVtpZF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9XSk7Cg==')
},
{
'name': '/app/lib/cosmos/js/services/cachedloader.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKc2VydmljZXMuZmFjdG9yeSgnY29zbW9zLmNhY2hlZGxvYWRlcicsIFsnQ29zbW9zU2VydmljZScsIGZ1bmN0aW9uIChDb3Ntb3NTZXJ2aWNlKSB7CiAgICByZXR1cm57CiAgICAgICAgc3RvcmU6IHt9LAogICAgICAgIGNsZWFyQ2FjaGU6IGZ1bmN0aW9uKG5hbWUpewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdG9yZVtuYW1lXTsKICAgICAgICB9LAogICAgICAgIGdldDogZnVuY3Rpb24gKG5hbWUsIHVyaSwgY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrLCByZWZyZXNoKSB7CgogICAgICAgICAgICBpZiAoIXJlZnJlc2gpIHsKICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZF9kYXRhID0gdGhpcy5zdG9yZVtuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmV0dXJuZWRfZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socmV0dXJuZWRfZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCh1cmksCiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmVbbmFtZV0gPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JfY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NhbGxiYWNrKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBnZXRGcm9tQ2FjaGU6IGZ1bmN0aW9uKG5hbWUpewogICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVtuYW1lXTsKICAgICAgICB9CiAgICB9Cn1dKTs=')
},
{
'name': '/app/lib/cosmos/js/services/constants.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTIvMTMvMTQuCiAqLwoKc2VydmljZXMuY29uc3RhbnQoCiAgICAiY29zbW9zLmNvbmZpZ05hbWVzIix7CiAgICAgICAgIk1FTlUiOiAibWVudSIsCiAgICAgICAgIkZPUk0iOiJmb3JtIiwKICAgICAgICAiUEFHRSI6InBhZ2UiLAogICAgICAgICJMSVNUIjogImxpc3QiLAogICAgICAgICJDSEFSVCI6ICJjaGFydCIsCiAgICAgICAgIldJREdFVCI6ICJ3aWRnZXQiLAogICAgICAgICJBUFAiOiAiYXBwIiwKICAgICAgICAiU0lOR0xFX09CSkVDVCI6ICJzaW5nbGVvYmplY3QiLAogICAgICAgICJTT1VSQ0VGSUxFUyI6ICJzb3VyY2VmaWxlcyIKICAgIH0KKTs=')
},
{
'name': '/app/lib/cosmos/js/directives/field.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKZGlyZWN0aXZlcy5kaXJlY3RpdmUoJ2ZpZWxkJywgZnVuY3Rpb24gKCRjb21waWxlKSB7CiAgICByZXR1cm4gewogICAgICAgIHJlc3RyaWN0OiAnRScsCiAgICAgICAgc2NvcGU6IHsKICAgICAgICAgICAgaXRlbTogJz0nLAogICAgICAgICAgICB2YWw6ICc9JwogICAgICAgIH0sCgogICAgICAgIGNvbnRyb2xsZXI6IFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICckcm91dGVQYXJhbXMnLCAnJG1vZGFsJywgJ21lc3NhZ2UnLCAnQ29zbW9zU2VydmljZScsICduYW1lZGNvbGVjdGlvbicsCiAgICAgICAgICAgICdjYWxjdWxhdG9yJywgJ2dsb2JhbGhhc2h0YWJsZScsICdjb3Ntb3Muc2V0dGluZ3MnLCAnY29zbW9zLmNvbmZpZ05hbWVzJywnY29zbW9zLnV0aWxzJywKICAgICAgICAgICAgZnVuY3Rpb24gKCRzY29wZSwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsICRtb2RhbCwgbWVzc2FnZSwgQ29zbW9zU2VydmljZSwgbmFtZWRjb2xlY3Rpb24sIGNhbGN1bGF0b3IsCiAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGUsIHNldHRpbmdzLCBjb25maWdOYW1lcywgdXRpbHMpIHsKICAgICAgICAgICAgICAgICRzY29wZS5uYW1lZGNvbGVjdGlvbiA9IG5hbWVkY29sZWN0aW9uOwogICAgICAgICAgICAgICAgJHNjb3BlLmNhbGN1bGF0b3IgPSBjYWxjdWxhdG9yOwogICAgICAgICAgICAgICAgJHNjb3BlLkNvc21vc1NlcnZpY2UgPSBDb3Ntb3NTZXJ2aWNlOwogICAgICAgICAgICAgICAgJHNjb3BlLmhhc2h0YWJsZSA9IGhhc2h0YWJsZTsKCiAgICAgICAgICAgICAgICAkc2NvcGUucm91dGVQYXJhbXMgPSAkcm91dGVQYXJhbXM7CgogICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvciA9IGZ1bmN0aW9uKGRhdGEsIHN0YXR1cyl7CgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkc2NvcGUucmVjZWl2ZVNlcnZpY2VEYXRhQXMgPSBmdW5jdGlvbiAoZGF0YSwgYXJncykgewogICAgICAgICAgICAgICAgICAgIGlmICghYXJncykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGFyZ3NbJ25hbWUnXTsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2UgPSBhcmdzWydwYXJzZSddOwoKICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZVtuYW1lXSA9IEpTT04ucGFyc2UoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGVbbmFtZV0gPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkc2NvcGUucHJlcGFyZU9iamVjdCA9IGZ1bmN0aW9uIChpdGVtLCBkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGl0ZW0uZmllbGRzLCBmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlID09PSAiY29tcG9zaXRlIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVt2YWx1ZS5uYW1lXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByZXBhcmVPYmplY3QodmFsdWUsIGRhdGFbdmFsdWUubmFtZV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICJhcnJheSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbdmFsdWUubmFtZV0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbdmFsdWUubmFtZV1bMF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcmVwYXJlT2JqZWN0KHZhbHVlLCBkYXRhW3ZhbHVlLm5hbWVdWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVt2YWx1ZS5uYW1lXSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kYXRhW3ZhbHVlXSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRzY29wZS5hZGRfcHJpbWl0aXZlX2l0ZW0gPSBmdW5jdGlvbiAocG9zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3SXRlbSA9ICIiOwogICAgICAgICAgICAgICAgICAgICRzY29wZS5wcmVwYXJlT2JqZWN0KCRzY29wZS5pdGVtLCBuZXdJdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnZhbC5zcGxpY2UocG9zaXRpb24gKyAxLCAwLCBuZXdJdGVtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJHNjb3BlLmFkZF9pdGVtID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0l0ZW0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJlcGFyZU9iamVjdCgkc2NvcGUuaXRlbSwgbmV3SXRlbSk7CgogICAgICAgICAgICAgICAgICAgIGlmICghJHNjb3BlLnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IFRoaXMgY29uZGl0aW9uIHNob3VsZCBiZSBoYW5kbGVkIGZyb20gbGluayBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmFsID0gW107CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmFsLnNwbGljZShwb3NpdGlvbiArIDEsIDAsIG5ld0l0ZW0pOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkc2NvcGUucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICRzY29wZS52YWwuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJHNjb3BlLmdldExvb2t1cCA9IGZ1bmN0aW9uIChmaWVsZCwgcmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvb2t1cEZvdW5kOwogICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChmaWVsZC5vcHRpb25zLmxvb2t1cHMsIGZ1bmN0aW9uIChsb29rdXAsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb29rdXAucmVmID09PSByZWYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cEZvdW5kID0gbG9va3VwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cEZvdW5kOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkc2NvcGUudXBkYXRlT3B0aW9ucyA9IGZ1bmN0aW9uIChmaWVsZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBsb29rdXA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5pdGVtLm9wdGlvbnMuc2F2ZVZhbHVlT25seSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyRzY29wZS52YWwgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cCA9ICRzY29wZS5nZXRMb29rdXAoZmllbGQsICRzY29wZS5yZWYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kc2NvcGUudmFsLmRhdGEgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cCA9ICRzY29wZS5nZXRMb29rdXAoZmllbGQsICRzY29wZS52YWwucmVmIHx8ICRzY29wZS5yZWYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbkRhdGFbbG9va3VwLnJlZl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm9wdGlvbkRhdGEgPSBmaWVsZC5vcHRpb25EYXRhW2xvb2t1cC5yZWZdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9IGxvb2t1cC51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUub3B0aW9uRGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQub3B0aW9uRGF0YVtsb29rdXAucmVmXSA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGdldCpDb25maWd1cmF0aW9uQnlVcmwgYW5kIGdldCpDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgY29tYmluZWQKICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZm9yIGFsbCBpbnN0ZWFkIG9mIHNwZWNpZmljIG5hbWUgZm9yIGNvbmZpZwoKICAgICAgICAgICAgICAgICRzY29wZS5nZXREYXRhID0gZnVuY3Rpb24gKGNvbHVtbnMsIG9iamVjdE5hbWUsIGRhdGFJZCwgZmlsdGVyLCBtb2RlbE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uc0NzdiA9ICcnOwogICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChjb2x1bW5zLCBmdW5jdGlvbiAoY29sdW1uLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zQ3N2ICs9IGNvbHVtbi5uYW1lICsgIiwiOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZmlsdGVyUXVlcnkgPSBmaWx0ZXIgPyAiJmZpbHRlcj0iK2ZpbHRlciA6ICcnOwogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyhkYXRhSWQ/KCcvJytkYXRhSWQpOicnKSsnLz9jb2x1bW5zPScgKyBjb2x1bW5zQ3N2ICsgZmlsdGVyUXVlcnk7CgogICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZVttb2RlbE5hbWVdID0gZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRzY29wZS5nZXRDb25maWd1cmF0aW9uID0gZnVuY3Rpb24gKGNvbmZpZ05hbWUsIGl0ZW1JZCwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFwcFBhdGggPSAkcm91dGVQYXJhbXMuYXBwUGF0aDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZ09iamVjdE5hbWUgPSBzZXR0aW5ncy5nZXRDb25maWdPYmplY3ROYW1lKGNvbmZpZ05hbWUpOwoKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBTZXR0aW5ncygkc2NvcGUuYXBwUGF0aCwgY29uZmlnT2JqZWN0TmFtZSwgZnVuY3Rpb24gKG9iamVjdE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLycgKyBpdGVtSWQgKyAnLyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCh1cmwsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9uU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChzdGF0dXMsIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGRhdGEsIHN0YXR1cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vU1RBUlQgTWVudVJlZiBtZXRob2RzCiAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0TWVudUNvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb24oY29uZmlnTmFtZXMuTUVOVSwgJHNjb3BlLml0ZW0udmFsdWUubWVudUlkLAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihkYXRhKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5kYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubWVudUNvbmZpZ3VyYXRpb24gPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihzdGF0dXMsIGRhdGEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy9FTkQgTWVudVJlZiBtZXRob2RzCgogICAgICAgICAgICAgICAgLy9TVEFSVCBMaXN0IG1ldGhvZHMKCiAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0TGlzdERhdGFCeSA9IGZ1bmN0aW9uIChjb2x1bW5zLCBvYmplY3ROYW1lLCBmaWx0ZXIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uc0NzdiA9ICcnOwogICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChjb2x1bW5zLCBmdW5jdGlvbiAoY29sdW1uLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zQ3N2ICs9IGNvbHVtbi5uYW1lICsgIiwiOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZmlsdGVyUGFyYW0gPSAoZmlsdGVyKT8nJmZpbHRlcj0nKyBKU09OLnN0cmluZ2lmeShmaWx0ZXIpOicnOwogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLz9jb2x1bW5zPScgKyBjb2x1bW5zQ3N2ICsgZmlsdGVyUGFyYW07CgogICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5kYXRhID0gZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRzY29wZS5nZXRMaXN0RGF0YUZyb21Db25maWcgPSBmdW5jdGlvbiAobGlzdENvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1ucyA9IGxpc3RDb25maWd1cmF0aW9uLmNvbHVtbnM7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9iamVjdE5hbWUgPSBsaXN0Q29uZmlndXJhdGlvbi5vYmplY3ROYW1lOwogICAgICAgICAgICAgICAgICAgIHZhciBsaXN0RmlsdGVyID0gSlNPTi5wYXJzZShsaXN0Q29uZmlndXJhdGlvbi5maWx0ZXIgfHwgInt9Iik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5RmlsdGVyID0gbGlzdENvbmZpZ3VyYXRpb24udXNlUXVlcnlGaWx0ZXJQYXJhbSA/IEpTT04ucGFyc2UoJHJvdXRlUGFyYW1zLmZpbHRlciB8fCAie30iKSA6IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciB1c2VyRmlsdGVyID0ge307CgogICAgICAgICAgICAgICAgICAgIGZvcih2YXIgdWk9MDsgdWk8JHNjb3BlLnRvb2xiYXJGaWx0ZXJzLmxlbmd0aDsgdWkrKyl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gJHNjb3BlLnRvb2xiYXJGaWx0ZXJzW3VpXTsKICAgICAgICAgICAgICAgICAgICAgICAgdXNlckZpbHRlcltmLmNvbHVtbl0gPSBmLmZpcnN0T3BlcmFuZDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBhbmd1bGFyLmV4dGVuZCh7fSwgbGlzdEZpbHRlciwgcXVlcnlGaWx0ZXIsIHVzZXJGaWx0ZXIpOwoKICAgICAgICAgICAgICAgICAgICBpZihPYmplY3Qua2V5cyhmaWx0ZXIpLmxlbmd0aCA8IDEpewogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldExpc3REYXRhQnkoY29sdW1ucywgb2JqZWN0TmFtZSxmaWx0ZXIpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0TGlzdENvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb24oY29uZmlnTmFtZXMuTElTVCwgJHNjb3BlLml0ZW0udmFsdWUubGlzdElkLAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihkYXRhKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5kYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubGlzdENvbmZpZ3VyYXRpb24gPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldExpc3REYXRhRnJvbUNvbmZpZygkc2NvcGUubGlzdENvbmZpZ3VyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJHNjb3BlLmVkaXRMaXN0SXRlbSA9IGZ1bmN0aW9uIChkYXRhLCBsaXN0Q29uZmlndXJhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0Q29uZmlndXJhdGlvbi5lZGl0YWJsZSAmJiBsaXN0Q29uZmlndXJhdGlvbi5pdGVtZWRpdG9yX2lkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJG1vZGFsLm9wZW4oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9mb3Jtdmlldy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICJGb3JtVmlld01vZGFsQ3RybCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnbGcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93aW5kb3dDbGFzczonbW9kYWwtaHVnZScsIC8vVE9ETzogc2V0IHdpbmRvdyBiaWdnZXIgdGhhbiBkZWZhdWx0IG9mIGxnIHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUlkOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlzdENvbmZpZ3VyYXRpb24uaXRlbWVkaXRvcl9pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJHNjb3BlLnNob3dMaXN0SXRlbURldGFpbHMgPSBmdW5jdGlvbiAoZGF0YSwgbGlzdENvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGlzdENvbmZpZ3VyYXRpb24uYWxsb3dEZXRhaWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJG1vZGFsLm9wZW4oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9zaG93X2pzb24uaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAiU2hvd0pzb25EYXRhQ3RybCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnbGcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvL0VORCBMaXN0IG1ldGhvZHMKCiAgICAgICAgICAgICAgIC8vU1RBUlQgQ2hhcnQgbWV0aG9kcwoKICAgICAgICAgICAgICAgIC8vQ2hhcnQgcmVmCgogICAgICAgICAgICAgICAgJHNjb3BlLmdldENoYXJ0RGF0YUJ5ID0gZnVuY3Rpb24gKGNvbHVtbnMsIG9iamVjdE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAvL1RPRE86IHRoaXMgZnVuY3Rpb24gaXMgZHVwbGljYXRlIHRvIGdldExpc3REYXRhQnkKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uc0NzdiA9ICcnOwogICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChjb2x1bW5zLCBmdW5jdGlvbiAoY29sdW1uLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zQ3N2ICs9IGNvbHVtbi5uYW1lICsgIiwiOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLz9jb2x1bW5zPScgKyBjb2x1bW5zQ3N2OwoKICAgICAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCh1cmwsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Q2hhcnREYXRhRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChjaGFydENvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1ucyA9IGNoYXJ0Q29uZmlndXJhdGlvbi5jb2x1bW5zOwogICAgICAgICAgICAgICAgICAgIHZhciBvYmplY3ROYW1lID0gY2hhcnRDb25maWd1cmF0aW9uLm9iamVjdE5hbWU7CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRDaGFydERhdGFCeShjb2x1bW5zLCBvYmplY3ROYW1lKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJHNjb3BlLmdldENoYXJ0Q29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbihjb25maWdOYW1lcy5DSEFSVCwgJHNjb3BlLml0ZW0udmFsdWUuY2hhcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmNoYXJ0Q29uZmlndXJhdGlvbiA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Q2hhcnREYXRhRnJvbUNvbmZpZygkc2NvcGUuY2hhcnRDb25maWd1cmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vRU5EIENoYXJ0IG1ldGhvZHMKCiAgICAgICAgICAgICAgICAvLyBTVEFSVCBGb3JtUmVmIG1ldGhvZHMKCiAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Rm9ybUNvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb24oY29uZmlnTmFtZXMuRk9STSwgJHNjb3BlLml0ZW0udmFsdWUuZm9ybUlkLAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihkYXRhKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5kYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZm9ybSA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRGb3JtRGF0YSgkc2NvcGUuZm9ybSwgJHNjb3BlLnZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Rm9ybURhdGEgPSBmdW5jdGlvbiAoZm9ybSwgZGF0YUlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFJZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gZm9ybS5hY3Rpb24gKyAnLycgKyBkYXRhSWQgKyAnLyc7CiAgICAgICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXh0ZW5kKGRhdGEsICRzY29wZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRm9ybVJlc3VsdCA9IGZ1bmN0aW9uIChmb3JtLCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSAmJiBmb3JtLm9uc3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybS5vbnN1Y2Nlc3MudHlwZSA9PT0gInVybCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfaWQgPSAoJHNjb3BlLnZhbCB8fCBKU09OLnBhcnNlKHJlc3VsdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBmb3JtLm9uc3VjY2Vzcy52YWx1ZS5yZXBsYWNlKCJ7e19pZH19IiwgX2lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3JtLm9uc3VjY2Vzcy50eXBlID09PSAibWVzc2FnZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHVzaCh7Im1lc3NhZ2UiOiBmb3JtLm9uc3VjY2Vzcy52YWx1ZSwgInRpdGxlIjogIlN1Y2VzcyIsICJkYXRhIjogcmVzdWx0fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgnL21lc3NhZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3JtLm9uc3VjY2Vzcy50eXBlID09PSAiaW5saW5lbWVzc2FnZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zdWJtaXREb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJHNjb3BlLm9uRm9ybVN1Ym1pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmZvcm0uYWN0aW9uKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZigkc2NvcGUuZm9ybS5lbmFibGVSZUNhcGNoYSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FwY2hhUmVzcG9uc2UgPSBncmVjYXB0Y2hhLmdldFJlc3BvbnNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighY2FwY2hhUmVzcG9uc2UgfHwgY2FwY2hhUmVzcG9uc2UubGVuZ3RoIDwgMTApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoIkNhcGNoYSBub3Qgc2F0aXNmaWVkIiwgNDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmRhdGFbImctcmVjYXB0Y2hhLXJlc3BvbnNlIl0gPSBjYXBjaGFSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkc2NvcGUudmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLnBvc3QoJHNjb3BlLmZvcm0uYWN0aW9uLCAkc2NvcGUuZGF0YSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NGb3JtUmVzdWx0KCRzY29wZS5mb3JtLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gJHNjb3BlLmZvcm0uYWN0aW9uICsgJy8nICsgJHNjb3BlLnZhbCArICcvJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UucHV0KHVybCwgJHNjb3BlLmRhdGEsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRm9ybVJlc3VsdCgkc2NvcGUuZm9ybSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyBFTkQgRm9ybVJlZiBtZXRob2RzCgogICAgICAgICAgICAgICAgJHNjb3BlLnZhbGlkYXRlQmxvY2tUeXBlID0gZnVuY3Rpb24gKGJsb2NrVHlwZSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYmxvY2tUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gxJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaDInOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdoMyc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2g0JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaDUnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgIkhUTUwgYmxvY2sgbm90IGFsbG93ZWQiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtVHlwZSA9IGl0ZW0udHlwZTsKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvL1BhZ2UgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImh0bWxibG9jayI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmFsaWRhdGVCbG9ja1R5cGUoaXRlbS5ibG9ja3R5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnPCcgKyBpdGVtLmJsb2NrdHlwZSArICcgbmctY2xhc3M9Iml0ZW0uY3NzY2xhc3MiPnt7aXRlbS52YWx1ZX19PC8nICsgaXRlbS5ibG9ja3R5cGUgKyAnPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImh5cGVybGluayI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICc8YSBuZy1jbGFzcz0iaXRlbS5jc3NjbGFzcyIgaHJlZj0iJyArIGl0ZW0udmFsdWUuaHJlZiArICciPicgKyBpdGVtLnZhbHVlLnRleHQgKyAnPC9hPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImltYWdlIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJzxpbWcgbmctc3JjPSJ7e2l0ZW0uc3JjfX0iIC8+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAidHdvY29sdW1uIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJycgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8ZGl2IGNsYXNzPSJyb3ciPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPGRpdiBuZy1yZXBlYXQ9ImZpZWxkIGluIGl0ZW0ubGVmdGNvbHVtbiIgY2xhc3M9ImNvbC1tZC02Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICA8ZmllbGQgaXRlbT0iZmllbGQiPjwvZmllbGQ+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxkaXYgbmctcmVwZWF0PSJmaWVsZCBpbiBpdGVtLnJpZ2h0Y29sdW1uIiBjbGFzcz0iY29sLW1kLTYiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgIDxmaWVsZCBpdGVtPSJmaWVsZCI+PC9maWVsZD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ0aHJlZWNvbHVtbiI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgPGRpdiBjbGFzcz0icm93Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxkaXYgbmctcmVwZWF0PSJmaWVsZCBpbiBpdGVtLmxlZnRjb2x1bW4iIGNsYXNzPSJjb2wteHMtNCI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgPGZpZWxkIGl0ZW09ImZpZWxkIj48L2ZpZWxkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICA8ZGl2IG5nLXJlcGVhdD0iZmllbGQgaW4gaXRlbS5taWRjb2x1bW4iIGNsYXNzPSJjb2wteHMtNCI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgPGZpZWxkIGl0ZW09ImZpZWxkIj48L2ZpZWxkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICA8ZGl2IG5nLXJlcGVhdD0iZmllbGQgaW4gaXRlbS5yaWdodGNvbHVtbiIgY2xhc3M9ImNvbC14cy00Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICA8ZmllbGQgaXRlbT0iZmllbGQiPjwvZmllbGQ+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAibWVudSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5uYXZ0eXBlID09PSAic2lkZWJhciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzx1bCBjbGFzcz0id2VsbCBuYXYgbmF2LXBpbGxzIG5hdi1zdGFja2VkIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxsaSBuZy1yZXBlYXQ9ImZpZWxkIGluIGl0ZW0uZmllbGRzIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICA8ZmllbGQgaXRlbT0iZmllbGQiPjwvZmllbGQ+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8L2xpPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC91bD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnICAgPG5hdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1pbnZlcnNlIG5hdmJhci1maXhlZC10b3AiIHJvbGU9Im5hdmlnYXRpb24iPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciI+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJuYXZiYXItdG9nZ2xlIGNvbGxhcHNlZCIgZGF0YS10b2dnbGU9ImNvbGxhcHNlIiBkYXRhLXRhcmdldD0iI25hdmJhciIgYXJpYS1leHBhbmRlZD0iZmFsc2UiIGFyaWEtY29udHJvbHM9Im5hdmJhciI+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+e3tpdGVtLmJyYW5kdGl0bGV9fTwvc3Bhbj4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0ibmF2YmFyLWJyYW5kIiBocmVmPSJ7e2l0ZW0uYnJhbmRocmVmfX0iPnt7aXRlbS5icmFuZHRpdGxlfX08L2E+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJuYXZiYXIiIGNsYXNzPSJuYXZiYXItY29sbGFwc2UgY29sbGFwc2UiPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYiPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0iZmllbGQgaW4gaXRlbS5maWVsZHMiPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZCBpdGVtPSJmaWVsZCI+PC9maWVsZD4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25hdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJtZW51aXRlbSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgPGEgaHJlZj0ie3tpdGVtLnZhbHVlLmhyZWZ9fSI+e3tpdGVtLnZhbHVlLmxhYmVsfX08L2E+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAibWVudXJlZiI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGZpZWxkIG5nLWlmPSJtZW51Q29uZmlndXJhdGlvbiIgaXRlbT0ibWVudUNvbmZpZ3VyYXRpb24iPjwvZmllbGQ+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiY29tcG9zaXRlYmxvY2siOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgbmctcmVwZWF0PSJmaWVsZCBpbiBpdGVtLmZpZWxkcyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICA8ZmllbGQgaXRlbT0iZmllbGQiPjwvZmllbGQ+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIndpZGdldGhvc3QiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnPGRpdiBuZy1pbmNsdWRlPSJcJycgKyBpdGVtLnZhbHVlICsgJ1wnIiBjbGFzcz0iJyArIGl0ZW0uY3NzY2xhc3MgKyAnIj48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJpbmxpbmV3aWRnZXQiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBpdGVtLnZhbHVlLndpZGdldHRleHQgfHwgaXRlbS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9Gb3JtIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJpbnB1dCI6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInRleHQiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1pbmxlbmd0aFRhZyA9IGl0ZW0ubWlubGVuZ3RoID8gJyBuZy1taW5sZW5ndGg9Iml0ZW0ubWlubGVuZ3RoIiAnOicnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heGxlbmd0aFRhZyA9IGl0ZW0ubWF4bGVuZ3RoID8gJyBuZy1tYXhsZW5ndGg9Iml0ZW0ubWF4bGVuZ3RoIiAnOicnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkVGFnID0gaXRlbS5yZXF1aXJlZCA/ICcgcmVxdWlyZWQgJzonJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuVGFnID0gaXRlbS5wYXR0ZXJuID8gJyBuZy1wYXR0ZXJuPSJpdGVtLnBhdHRlcm4gIic6Jyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXJBdHRyID0gaXRlbS5wbGFjZWhvbGRlciA/ICgnIHBsYWNlaG9sZGVyPSInK2l0ZW0ucGxhY2Vob2xkZXIrJyIgJyk6Jyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGVBdHRyID0gaXRlbS50aXRsZT8gJyB0aXRsZT0iJytpdGVtLnRpdGxlKyciICc6Jyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFncyA9IG1pbmxlbmd0aFRhZyArIG1heGxlbmd0aFRhZyArIHBhdHRlcm5UYWcgKyByZXF1aXJlZFRhZyArIHBsYWNlaG9sZGVyQXR0ciArIHRpdGxlQXR0cjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICc8bGFiZWw+e3tpdGVtLmxhYmVsfX08c3BhbiBuZy1pZj0iaXRlbS5yZXF1aXJlZCI+Jm5ic3A7KiZuYnNwOzwvc3Bhbj48L2xhYmVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIgdHlwZT0ie3tpdGVtLmh0bWx0eXBlIHx8IFwndGV4dFwnfX0iIG5nLW1vZGVsPSJ2YWwiJyt0YWdzKycgIC8+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZmlsZWN0cmwiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9ICc8ZmlsZWN0cmwgbGFiZWw9Iml0ZW0ubGFiZWwiIHJlcXVpcmVkPSJpdGVtLnJlcXVpcmVkIiBvYmplY3QtbmFtZT0iaXRlbS5vYmplY3ROYW1lIiB2YWw9InZhbCIvPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInN0YXRpYyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICc8c3Bhbj48bGFiZWw+e3tpdGVtLmxhYmVsfX08L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0idmFsIiByZWFkb25seT0icmVhZG9ubHkiLz48L3NwYW4+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAidGV4dGFyZWEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnPHNwYW4+PGxhYmVsPnt7aXRlbS5sYWJlbH19PHNwYW4gbmctaWY9Iml0ZW0ucmVxdWlyZWQiPiZuYnNwOyombmJzcDs8L3NwYW4+PC9sYWJlbD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHRleHRhcmVhICcrKGl0ZW0ucmVxdWlyZWQ/J3JlcXVpcmVkJzonJykrJyBuZy1tb2RlbD0idmFsIiAvPjwvc3Bhbj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjb2RlZWRpdG9yIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJzxzcGFuPjxsYWJlbD57e2l0ZW0ubGFiZWx9fTxzcGFuIG5nLWlmPSJpdGVtLnJlcXVpcmVkIj4mbmJzcDsqJm5ic3A7PC9zcGFuPjwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgJysoaXRlbS5yZXF1aXJlZD8ncmVxdWlyZWQnOicnKSsnIHVpLWFjZSBuZy1tb2RlbD0idmFsIj48L2Rpdj48L3NwYW4+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0idmFsIj4gPGxhYmVsIGNsYXNzPSJjb250cm9sLWxhYmVsIj57e2l0ZW0ubGFiZWx9fTwvbGFiZWw+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAic2VsZWN0IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJycgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9ImNvbnRyb2wtbGFiZWwiPnt7aXRlbS5sYWJlbH19PC9sYWJlbD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNlbGVjdCBuZy1tb2RlbD0idmFsIiBuZy1vcHRpb25zPSJjaG9pY2UudmFsdWUgYXMgY2hvaWNlLmxhYmVsIGZvciBjaG9pY2UgaW4gaXRlbS5vcHRpb25zLmNob2ljZXMiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8b3B0aW9uIG5nLWlmPSJpdGVtLm51bGxhYmxlID09PSB0cnVlIj4gLS0tIFNlbGVjdCAtLS08L29wdGlvbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9zZWxlY3Q+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicmFkaW9ncm91cCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPSJjb250cm9sLWxhYmVsIj57e2l0ZW0ubGFiZWx9fTwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvbXBvc2l0ZSIgbmctcmVwZWF0PSJjaG9pY2UgaW4gaXRlbS5vcHRpb25zLmNob2ljZXMiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5nLXZhbHVlPSJjaG9pY2UudmFsdWUiIG5nLW1vZGVsPSIkcGFyZW50LnZhbCI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCI+e3tjaG9pY2UubGFiZWx9fTwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImxvb2t1cCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5vcHRpb25zLnNhdmVWYWx1ZU9ubHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCI+e3tpdGVtLmxhYmVsfX08L2xhYmVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1pZj0iIWl0ZW0ub3B0aW9ucy5oaWRlUmVmVHlwZSIgbmctbW9kZWw9InJlZiIgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZy1vcHRpb25zPSJsb29rdXAucmVmIGFzIGxvb2t1cC5sb29rdXBuYW1lIGZvciBsb29rdXAgaW4gaXRlbS5vcHRpb25zLmxvb2t1cHMiJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZy1jaGFuZ2U9InVwZGF0ZU9wdGlvbnMoaXRlbSkiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl0ZW0ub3B0aW9ucy5yZWZSZXF1aXJlZCk/Jyc6JyAgIDxvcHRpb24+LS0tPC9vcHRpb24+JykrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3NlbGVjdD4nICsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c2VsZWN0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5nLW1vZGVsPSJ2YWwiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl0ZW0ucmVxdWlyZWQpPycnOicgICA8b3B0aW9uPi0tLTwvb3B0aW9uPicpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIDxvcHRpb24gbmctdmFsdWU9Im9wdGlvbltnZXRMb29rdXAoaXRlbSwgcmVmKS52YWx1ZV0iJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgbmctc2VsZWN0ZWQ9Im9wdGlvbltnZXRMb29rdXAoaXRlbSwgcmVmKS52YWx1ZV0gPT09IHZhbCInICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgbmctcmVwZWF0PSJvcHRpb24gaW4gb3B0aW9uRGF0YSI+e3tvcHRpb25bZ2V0TG9va3VwKGl0ZW0sIHJlZikubGFiZWxdfX08L29wdGlvbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc2VsZWN0Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCI+e3tpdGVtLmxhYmVsfX08L2xhYmVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1tb2RlbD0idmFsLnJlZiIgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZy1vcHRpb25zPSJsb29rdXAucmVmIGFzIGxvb2t1cC5sb29rdXBuYW1lIGZvciBsb29rdXAgaW4gaXRlbS5vcHRpb25zLmxvb2t1cHMiJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZy1jaGFuZ2U9InVwZGF0ZU9wdGlvbnMoaXRlbSkiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl0ZW0ub3B0aW9ucy5yZWZSZXF1aXJlZCk/Jyc6JyAgIDxvcHRpb24+LS0tPC9vcHRpb24+JykrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3NlbGVjdD4nICsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c2VsZWN0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5nLW1vZGVsPSJ2YWwuZGF0YSI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXRlbS5yZXF1aXJlZCk/Jyc6JyAgIDxvcHRpb24+LS0tPC9vcHRpb24+JykrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgPG9wdGlvbiBuZy12YWx1ZT0ib3B0aW9uW2dldExvb2t1cChpdGVtLCB2YWwucmVmKS52YWx1ZV0iJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgbmctc2VsZWN0ZWQ9Im9wdGlvbltnZXRMb29rdXAoaXRlbSwgdmFsLnJlZikudmFsdWVdID09PSB2YWwuZGF0YSInICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgbmctcmVwZWF0PSJvcHRpb24gaW4gb3B0aW9uRGF0YSI+e3tvcHRpb25bZ2V0TG9va3VwKGl0ZW0sIHZhbC5yZWYpLmxhYmVsXX19PC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3NlbGVjdD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJwYWdlcmVmIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJycgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8cGFnZSBwYWdlaWQ9Iml0ZW0ucGFnZUlkIj48L3BhZ2U+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZm9ybXJlZiI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBuZy1zaG93PSJzdWJtaXREb25lIj57e2Zvcm0ub25zdWNjZXNzLnZhbHVlfX08L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGZvcm0gcm9sZT0iZm9ybSIgY2xhc3M9ImZvcm0taG9yaXpvbnRhbCIgbmFtZT0iZm9ybScraXRlbS52YWx1ZS5mb3JtSWQrJyIgbmctaGlkZT0ic3VibWl0RG9uZSIgbm92YWxpZGF0ZT4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIDxkaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgPGgxPnt7Zm9ybS50aXRsZX19PC9oMT4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgPHVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIDxsaSBuZy1yZXBlYXQ9ImZpZWxkIGluIGZvcm0uZmllbGRzIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgPGZpZWxkIGl0ZW09ImZpZWxkIiB2YWw9ImRhdGFbZmllbGQubmFtZV0iPjwvZmllbGQ+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgPC9saT4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICA8bGkgbmctaWY9ImZvcm0uZW5hYmxlUmVDYXBjaGEiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgIDxkaXYgaWQ9ImdfcmVjYXBjaGFfJyt1dGlscy5nZXROZXh0VmFsdWUoKSsnIiBjbGFzcz0iZy1yZWNhcHRjaGEiIGRhdGEtc2l0ZWtleT0iJyt1dGlscy5nZXRDYXBjaGFTaXRlS2V5KCkrJyI+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgPC9saT4nKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgPC91bD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIDxidXR0b24gbmctZGlzYWJsZWQ9IiEoZm9ybScraXRlbS52YWx1ZS5mb3JtSWQrJy4kdmFsaWQpIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBuZy1jbGljaz0ib25Gb3JtU3VibWl0KCkiPlN1Ym1pdDwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Zvcm0+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiY3NzcmVmIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJzxsaW5rIGRhdGEtbmctaHJlZj0ie3tpdGVtLmhyZWZ9fSIgcmVsPSJzdHlsZXNoZWV0IiAvPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImpzcmVmIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJzxzY3JpcHQgZGF0YS1uZy1zcmM9Iml0ZW0uc3JjIiAvPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImV4dGpzcmVmIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJzxzY3JpcHQgc3JjPSInK2l0ZW0uc3JjKyciIC8+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAibGlzdCI6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImxpc3RyZWYiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnPGRpdiBuZy1pZj0ibGlzdENvbmZpZ3VyYXRpb24uYWxsb3dVc2VyRmlsdGVyIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgPGZpbHRlciBjb2x1bW5zPSJsaXN0Q29uZmlndXJhdGlvbi5jb2x1bW5zIiBmaWx0ZXJzPSJ0b29sYmFyRmlsdGVycyI+PC9maWx0ZXI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxidXR0b24gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tcmVmcmVzaCIgbmctY2xpY2s9ImdldExpc3REYXRhRnJvbUNvbmZpZyhsaXN0Q29uZmlndXJhdGlvbikiPjwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBuZy1pZj0ibGlzdENvbmZpZ3VyYXRpb24gIT09IHVuZGVmaW5lZCI+PGRpdiBuZy1pbmNsdWRlPSJsaXN0Q29uZmlndXJhdGlvbi53aWRnZXROYW1lIiAvPjwvZGl2PjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImNoYXJ0cmVmIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJycgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IG5nLWlmPSJjaGFydENvbmZpZ3VyYXRpb24gIT09IHVuZGVmaW5lZCI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxkaXYgbmctY2xhc3M9ImNoYXJ0Q29uZmlndXJhdGlvbi5jaGFydEhvbGRlckNsYXNzIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxkaXYgaWQ9ImNoYXJ0JytpdGVtLnZhbHVlLmNoYXJ0SWQrJyIgbmctY2xhc3M9ImNoYXJ0Q29uZmlndXJhdGlvbi5jaGFydENsYXNzIj48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImZvcm0iOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAnJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxsYWJlbCBuZy1pZj0iaXRlbS5zaG93VGl0bGUiID57e2l0ZW0udGl0bGV9fTwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8dWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxsaSBuZy1yZXBlYXQ9ImZpZWxkIGluIGl0ZW0uZmllbGRzIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxmaWVsZCBpdGVtPSJmaWVsZCIgdmFsPSJ2YWxbZmllbGQubmFtZV0iPjwvZmllbGQ+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDwvbGk+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvdWw+JysKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiY29tcG9zaXRlIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJycgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8bGFiZWw+e3tpdGVtLmxhYmVsfX08L2xhYmVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8bGkgbmctcmVwZWF0PSJmaWVsZCBpbiBpdGVtLmZpZWxkcyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICA8ZmllbGQgaXRlbT0iZmllbGQiIHZhbD0idmFsW2ZpZWxkLm5hbWVdIj48L2ZpZWxkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8L2xpPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3VsPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImFycmF5IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLm9wdGlvbnMgJiYgaXRlbS5vcHRpb25zLnByaW1pdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8bGFiZWw+e3tpdGVtLmxhYmVsfX08L2xhYmVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgPGJ1dHRvbiBsYWJlbD0iYWRkIiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1wbHVzIiBuZy1jbGljaz0iYWRkX3ByaW1pdGl2ZV9pdGVtKC0xKSI+PC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzx1bD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxsaSBuZy1yZXBlYXQ9InYgaW4gdmFsIHRyYWNrIGJ5ICRpbmRleCI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPGZpZWxkIHZhbD0idmFsWyRpbmRleF0iIGl0ZW09Iml0ZW0uZmllbGRzWzBdIj48L2ZpZWxkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxidXR0b24gdGl0bGU9InJlbW92ZSIgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbWludXMiIG5nLWNsaWNrPSJyZW1vdmVJdGVtKCRpbmRleCkiPjwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxidXR0b24gbGFiZWw9ImFkZCIgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tcGx1cyIiIG5nLWNsaWNrPSJhZGRfcHJpbWl0aXZlX2l0ZW0oJGluZGV4KSI+PC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8L2xpPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC91bD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxsYWJlbD57e2l0ZW0ubGFiZWx9fTwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8YnV0dG9uIG5nLWNsaWNrPSJhZGRfaXRlbSgtMSkiPis8L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgPGxpIG5nLXJlcGVhdD0iZCBpbiB2YWwiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxmaWVsZCB2YWw9ImRbZmllbGQubmFtZV0iIGl0ZW09ImZpZWxkIiBuZy1yZXBlYXQ9ImZpZWxkIGluIGl0ZW0uZmllbGRzIj48L2ZpZWxkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxidXR0b24gbmctY2xpY2s9InJlbW92ZUl0ZW0oJGluZGV4KSI+LTwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxidXR0b24gbmctY2xpY2s9ImFkZF9pdGVtKCRpbmRleCkiPis8L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDwvbGk+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3VsPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImNvbmRpdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdj4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRyb2wtbGFiZWwiPnt7ZmllbGQubGFiZWx9fTwvbGFiZWw+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgbmctaWY9IicraXRlbS5leHByZXNzaW9uKyciPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9ImZpZWxkIGluIGl0ZW0uZmllbGRzIj4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkIGl0ZW09ImZpZWxkIiB2YWw9InZhbFtmaWVsZC5uYW1lXSI+PC9maWVsZD4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIG5nLWlmPSIhKCcraXRlbS5leHByZXNzaW9uKycpIj4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgbmctcmVwZWF0PSJmaWVsZCBpbiBpdGVtLmVsc2VmaWVsZHMiPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGQgaXRlbT0iZmllbGQiIHZhbD0idmFsW2ZpZWxkLm5hbWVdIj48L2ZpZWxkPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJpdGVtdmlldyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICc8ZGl2IG5nLWluY2x1ZGU9IlwnJyArIGl0ZW0udmFsdWUud2lkZ2V0ICsgJ1wnIiBjbGFzcz0iJyArIGl0ZW0uY3NzY2xhc3MgKyAnIj48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgoKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gbnVsbDsgLy8nPHNwYW4+PGxhYmVsPnt7aXRlbS5sYWJlbH19PC9sYWJlbD57e3ZhbH19PC9zcGFuPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfV0sCgogICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cmlidXRlcykgewogICAgICAgICAgICBjb25zb2xlLmxvZygiQ3JlYXRpbmcgZmllbGQgIiArIHNjb3BlLml0ZW0udHlwZSk7CiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHNjb3BlLmdldFRlbXBsYXRlKHNjb3BlLml0ZW0pOwogICAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzY29wZS5pdGVtLnR5cGUgPT09ICJzdGF0aWMiKSB7CiAgICAgICAgICAgICAgICBzY29wZS52YWwgPSBzY29wZS5pdGVtLm9wdGlvbnMudmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzY29wZS5pdGVtLnR5cGUgPT09ICJhcnJheSIpIHsKICAgICAgICAgICAgICAgIGlmICghc2NvcGUudmFsIHx8IHNjb3BlLnZhbC5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUudmFsID0gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzY29wZS5pdGVtLnR5cGUgPT09ICJjb21wb3NpdGUiIHx8IHNjb3BlLml0ZW0udHlwZSA9PT0gImZvcm0iIHx8IHNjb3BlLml0ZW0udHlwZSA9PT0gImNvbmRpdGlvbiIpIHsKICAgICAgICAgICAgICAgIGlmICghc2NvcGUudmFsKSB7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUudmFsID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzY29wZS5pdGVtLnR5cGUgPT09ICJsb29rdXAiKSB7CiAgICAgICAgICAgICAgICBzY29wZS5pdGVtLm9wdGlvbkRhdGEgPSB7fTsKICAgICAgICAgICAgICAgIGlmICghc2NvcGUudmFsICYmICFzY29wZS5pdGVtLm9wdGlvbnMuc2F2ZVZhbHVlT25seSkgewogICAgICAgICAgICAgICAgICAgIHNjb3BlLnZhbCA9IHsicmVmIjogbnVsbCwgImRhdGEiOiBudWxsfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzY29wZS52YWwgJiYgc2NvcGUudmFsLnJlZikgfHwgKHNjb3BlLml0ZW0ub3B0aW9ucy5zYXZlVmFsdWVPbmx5ICYmIHNjb3BlLnJlZikpIHsKICAgICAgICAgICAgICAgICAgICBzY29wZS51cGRhdGVPcHRpb25zKHNjb3BlLml0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcGUuaXRlbS5vcHRpb25zLnNhdmVWYWx1ZU9ubHkgJiYgc2NvcGUuaXRlbS5vcHRpb25zLmhpZGVSZWZUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUucmVmID0gc2NvcGUuaXRlbS5vcHRpb25zLmxvb2t1cHNbMF0ucmVmOwogICAgICAgICAgICAgICAgICAgIHNjb3BlLnVwZGF0ZU9wdGlvbnMoc2NvcGUuaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzY29wZS5pdGVtLnR5cGUgPT09ICJsaXN0IikgewogICAgICAgICAgICAgICAgc2NvcGUuZGF0YSA9IHt9OwogICAgICAgICAgICAgICAgc2NvcGUubGlzdENvbmZpZ3VyYXRpb24gPSBzY29wZS5pdGVtLmNvbmZpZzsKICAgICAgICAgICAgICAgIHNjb3BlLmdldExpc3REYXRhRnJvbUNvbmZpZyhzY29wZS5saXN0Q29uZmlndXJhdGlvbik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzY29wZS5pdGVtLnR5cGUgPT09ICJsaXN0cmVmIikgewogICAgICAgICAgICAgICAgc2NvcGUudG9vbGJhckZpbHRlcnMgPSBbXTsKICAgICAgICAgICAgICAgIHNjb3BlLmdldExpc3RDb25maWd1cmF0aW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzY29wZS5pdGVtLnR5cGUgPT09ICJjaGFydHJlZiIpIHsKICAgICAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgnZGF0YScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZihzY29wZS5jaGFydENvbmZpZ3VyYXRpb24gJiYgc2NvcGUuZGF0YSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJZCA9ICcjY2hhcnQnK3Njb3BlLml0ZW0udmFsdWUuY2hhcnRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2NvcGUuY2hhcnRDb25maWd1cmF0aW9uLmNoYXJ0VHlwZSA9PT0gImJhciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdCYXJDaGFydChjb250YWluZXJJZCwgc2NvcGUuY2hhcnRDb25maWd1cmF0aW9uLmNvbmZpZywgc2NvcGUuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihzY29wZS5jaGFydENvbmZpZ3VyYXRpb24uY2hhcnRUeXBlID09PSAibGluZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lQ2hhcnQoY29udGFpbmVySWQsIHNjb3BlLmNoYXJ0Q29uZmlndXJhdGlvbi5jb25maWcsIHNjb3BlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoc2NvcGUuY2hhcnRDb25maWd1cmF0aW9uLmNoYXJ0VHlwZSA9PT0gInBpZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdQaWVDaGFydChjb250YWluZXJJZCwgc2NvcGUuY2hhcnRDb25maWd1cmF0aW9uLmNvbmZpZywgc2NvcGUuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHNjb3BlLmdldENoYXJ0Q29uZmlndXJhdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2NvcGUuaXRlbS50eXBlID09PSAiZm9ybXJlZiIpIHsKICAgICAgICAgICAgICAgIHNjb3BlLmdldEZvcm1Db25maWd1cmF0aW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzY29wZS5pdGVtLnR5cGUgPT09ICJjc3NyZWYiKSB7CiAgICAgICAgICAgICAgICB2YXIgaGVhZEVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSk7CgogICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgaGVhZEVsZW1lbnQuYXBwZW5kKG5ld0VsZW1lbnQpOwogICAgICAgICAgICAgICAgJGNvbXBpbGUobmV3RWxlbWVudCkoc2NvcGUpOwoKICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gIjwhLS0gY3NzcmVmIGhhcyBiZWVuIHBsYWNlZCBpbnRvIGhlYWRlciAgLS0+IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNjb3BlLml0ZW0udHlwZSA9PT0gImpzcmVmIiB8fCBzY29wZS5pdGVtLnR5cGUgPT09ICJleHRqc3JlZiIpIHsKICAgICAgICAgICAgICAgIHZhciBoZWFkRWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdKTsKCiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICBoZWFkRWxlbWVudC5hcHBlbmQobmV3RWxlbWVudCk7CiAgICAgICAgICAgICAgICAkY29tcGlsZShuZXdFbGVtZW50KShzY29wZSk7CgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAiPCEtLSBqc3JlZiBoYXMgYmVlbiBwbGFjZWQgaW50byBoZWFkZXIgIC0tPiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzY29wZS5pdGVtLnR5cGUgPT09ICJtZW51cmVmIikgewogICAgICAgICAgICAgICAgc2NvcGUubWVudUNvbmZpZ3VyYXRpb24gPSB7ImJyYW5kdGl0bGUiOiAiIiwgInR5cGUiOiAibWVudSIsICJmaWVsZHMiOiBbXX07CiAgICAgICAgICAgICAgICBzY29wZS5nZXRNZW51Q29uZmlndXJhdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJGaWVsZCB0ZW1wbGF0ZSIgKyB0ZW1wbGF0ZSk7CgogICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCh0ZW1wbGF0ZSk7CiAgICAgICAgICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7CiAgICAgICAgICAgICRjb21waWxlKG5ld0VsZW1lbnQpKHNjb3BlKTsKICAgICAgICB9CiAgICB9Owp9KTsKCg==')
},
{
'name': '/app/lib/cosmos/js/directives/filter.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMS8xLzE1LgogKi8KCgpkaXJlY3RpdmVzLmRpcmVjdGl2ZSgnZmlsdGVyJywgZnVuY3Rpb24gKCRjb21waWxlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJywKICAgICAgICAgICAgc2NvcGU6IHsKICAgICAgICAgICAgICAgIGNvbHVtbnM6ICc9JywKICAgICAgICAgICAgICAgIGZpbHRlcnM6ICc9PycKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGNvbnRyb2xsZXI6IFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICckcm91dGVQYXJhbXMnLCAnbWVzc2FnZScsICdDb3Ntb3NTZXJ2aWNlJywgJ2Nvc21vcy5zZXR0aW5ncycsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoJHNjb3BlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcywgbWVzc2FnZSwgQ29zbW9zU2VydmljZSwgc2V0dGluZ3MpIHsKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJvdXRlUGFyYW1zID0gJHJvdXRlUGFyYW1zOwogICAgICAgICAgICAgICAgICAgICRzY29wZS5vcGVyYXRvcnMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsidGl0bGUiOiJFcXVhbHMiLCAibmFtZSI6ImVxIn0KICAgICAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWRkRmlsdGVyID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmZpbHRlcnMucHVzaCh7ImNvbHVtbiI6JHNjb3BlLmNvbHVtbk5hbWUsICJvcCI6ICRzY29wZS5vcGVyYXRvciwgImZpcnN0T3BlcmFuZCI6ICRzY29wZS5maXJzdE9wZXJhbmR9KQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5yZW1vdmVGaWx0ZXIgPSBmdW5jdGlvbiAoZmlsdGVycywgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5yZXF1aXJlU2Vjb25kT3BlcmFuZCA9IGZ1bmN0aW9uKG9wKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wID09PSAiYmV0d2VlbiI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldFRlbXBsYXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSAnJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0ic2hvdy1oaWRlLWZpbHRlciI+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0icm93Ij4nKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxkaXYgY2xhc3M9ImNvbC1sZy0yIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1tb2RlbD0iY29sdW1uTmFtZSIgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZy1vcHRpb25zPSJjb2x1bW4ubmFtZSBhcyBjb2x1bW4udGl0bGUgZm9yIGNvbHVtbiBpbiBjb2x1bW5zIiAvPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxkaXYgY2xhc3M9ImNvbC1sZy0yIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1tb2RlbD0ib3BlcmF0b3IiICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmctb3B0aW9ucz0ib3BlcmF0b3IubmFtZSBhcyBvcGVyYXRvci50aXRsZSBmb3Igb3BlcmF0b3IgaW4gb3BlcmF0b3JzIiAvPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxkaXYgY2xhc3M9ImNvbC1sZy0zIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5nLW1vZGVsPSJmaXJzdE9wZXJhbmQiIC8+JysKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA8ZGl2IG5nLWlmPSJyZXF1aXJlU2Vjb25kT3BlcmFuZChvcGVyYXRvcikiIGNsYXNzPSJjb2wtbGctMyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiBuZy1tb2RlbD0ic2Vjb25kT3BlcmFuZCIgLz4nKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDxkaXYgY2xhc3M9ImNvbC1sZy0xIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iYWRkRmlsdGVyKCkiIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXBsdXMiPjwvYnV0dG9uPicrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0icm93Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPHVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0iZmlsdGVyIGluIGZpbHRlcnMiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgIHt7ZmlsdGVyLmNvbHVtbn19IHt7ZmlsdGVyLm9wfX0ge3tmaWx0ZXIuZmlyc3RPcGVyYW5kfX0nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICA8c3BhbiBuZy1pZj0icmVxdWlyZVNlY29uZE9wZXJhbmQoZmlsdGVyLm9wKSI+IGFuZCB7e2ZpbHRlci5zZWNvbmRPcGVyYW5kfX08L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUiIG5nLWNsaWNrPSJyZW1vdmVGaWx0ZXIoZmlsdGVycywgJGluZGV4KSI+PC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICA8L2xpPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICA8L3VsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH1dLAoKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQ3JlYXRpbmcgZmlsdGVyIGVsZW1lbnQiKTsKICAgICAgICAgICAgICAgIHNjb3BlLmVsZW1lbnQgPSBlbGVtZW50OwoKICAgICAgICAgICAgICAgIGlmKCFzY29wZS5maWx0ZXJzKXsKICAgICAgICAgICAgICAgICAgICBzY29wZS5maWx0ZXJzID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gc2NvcGUuZ2V0VGVtcGxhdGUoKTsKCiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpOwogICAgICAgICAgICAgICAgJGNvbXBpbGUobmV3RWxlbWVudCkoc2NvcGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7')
},
{
'name': '/app/lib/cosmos/js/directives/directives.js', 'data': base64.b64decode(b'J3VzZSBzdHJpY3QnOwoKLyogRGlyZWN0aXZlcyAqLwoKCnZhciBkaXJlY3RpdmVzID0gYW5ndWxhci5tb2R1bGUoJ2Nvc21vc1VJLmRpcmVjdGl2ZXMnLCBbXSkuCiAgICBkaXJlY3RpdmUoJ2FwcFZlcnNpb24nLCBbJ3ZlcnNpb24nLCBmdW5jdGlvbiAodmVyc2lvbikgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUsIGVsbSwgYXR0cnMpIHsKICAgICAgICAgICAgZWxtLnRleHQodmVyc2lvbik7CiAgICAgICAgfTsKICAgIH1dKQoKICAgIC5kaXJlY3RpdmUoJ2Vycm9yQmFubmVyJywgZnVuY3Rpb24gKCRjb21waWxlKSB7CiAgICAgICAgLy9UT0RPOiBjcmVhdGUgc3ViLXNjb3BlIHdpdGggaXRzIG93biBkYXRhIGF0dHJpYnV0ZSBhbmQgY2xlYXJFcnJvcigpIG1ldGhvZAogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcmVzdHJpY3Q6ICJFIiwKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnPGRpdiBuZy1zaG93PSJoYXNFcnJvciIgY2xhc3M9ImJnLXdhcm5pbmciPicgKwogICAgICAgICAgICAgICAgICAgICcgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi14cyBidG4tZGFuZ2VyIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlIHB1bGwtcmlnaHQiIG5nLWNsaWNrPSJjbGVhckVycm9yKCk7Ij48L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAnICAgIDxkaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgPGxhYmVsPkVycm9yIGNvZGU6PC9sYWJlbD4nICsKICAgICAgICAgICAgICAgICAgICAnICAgICAgICA8c3BhbiBuZy1iaW5kPSJzdGF0dXMiIC8+JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnICAgPGRpdiBuZy1iaW5kPSJzdGF0dXNfZGF0YSI+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICAgICAgfQogICAgfSkKCiAgICAuZGlyZWN0aXZlKCdwYWdlJywgZnVuY3Rpb24gKCRjb21waWxlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJywKICAgICAgICAgICAgc2NvcGU6IHsKICAgICAgICAgICAgICAgIHBhZ2VJZDogJz1wYWdlaWQnICAvLyBiZWNhdXNlIHBhZ2VJZCB3aWxsIHRyYW5zbGF0ZSB0byBwYWdlLWlkCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBjb250cm9sbGVyOiBbJyRzY29wZScsICckbG9jYXRpb24nLCAnJHJvdXRlUGFyYW1zJywgJ21lc3NhZ2UnLCAnQ29zbW9zU2VydmljZScsICdjb3Ntb3Muc2V0dGluZ3MnLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKCRzY29wZSwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsIG1lc3NhZ2UsIENvc21vc1NlcnZpY2UsIHNldHRpbmdzKSB7CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5yb3V0ZVBhcmFtcyA9ICRyb3V0ZVBhcmFtczsKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb25CeVVybCA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29zbW9zU2VydmljZS5nZXQodXJsLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxvZ2luUmVxdWlyZWQgJiYgIWxvZ2dlZEluKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1clVybCA9ICRsb2NhdGlvbi51cmwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLnVybCgiL2xvZ2luLz9yZWRpcmVjdD0iICsgY3VyVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wYWdlZGVmID0gZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cyA9PSA0MDEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyVXJsID0gJGxvY2F0aW9uLnVybCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24udXJsKCIvbG9naW4vP3JlZGlyZWN0PSIgKyBjdXJVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkc2NvcGUucGFnZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBQYXRoID0gJHJvdXRlUGFyYW1zLmFwcFBhdGg7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBTZXR0aW5ncygkc2NvcGUuYXBwUGF0aCwgInBhZ2Vjb25maWdvYmplY3QiLCBmdW5jdGlvbiAob2JqZWN0TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLycgKyAkc2NvcGUucGFnZUlkICsgJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRDb25maWd1cmF0aW9uQnlVcmwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9ICcvc2VydmljZS9jb3Ntb3MucGFnZXMvJyArICRzY29wZS5wYWdlSWQgKyAnLyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb25CeVVybCh1cmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJycgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICA8ZGl2IG5nLXJlcGVhdD0iZmllbGQgaW4gcGFnZWRlZi5maWVsZHMiPlxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICA8ZmllbGQgaXRlbT0iZmllbGQiPjwvZmllbGQ+XG4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgPC9kaXY+XG4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7e3BhZ2V9fScgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9XSwKCiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkNyZWF0aW5nIHBhZ2UiKTsKICAgICAgICAgICAgICAgIHNjb3BlLnBhZ2VkZWYgPSB7fTsKICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHNjb3BlLmdldFRlbXBsYXRlKCk7CiAgICAgICAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNjb3BlLmdldENvbmZpZ3VyYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICAkY29tcGlsZShuZXdFbGVtZW50KShzY29wZSk7CiAgICAgICAgICAgICAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSkKCiAgICAuZGlyZWN0aXZlKCdvYmplY3R2aWV3JywgZnVuY3Rpb24gKCRjb21waWxlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJywKICAgICAgICAgICAgc2NvcGU6IHsKICAgICAgICAgICAgICAgIGl0ZW1JZDogJz0nLAogICAgICAgICAgICAgICAgY29uZmlnSWQ6ICc9JwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY29udHJvbGxlcjogWyckc2NvcGUnLCAnJGxvY2F0aW9uJywgJyRyb3V0ZVBhcmFtcycsICdtZXNzYWdlJywgJ0Nvc21vc1NlcnZpY2UnLCAnY29zbW9zLnNldHRpbmdzJywKICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgkc2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zLCBtZXNzYWdlLCBDb3Ntb3NTZXJ2aWNlLCBzZXR0aW5ncykgewoKICAgICAgICAgICAgICAgICAgICAkc2NvcGUucm91dGVQYXJhbXMgPSAkcm91dGVQYXJhbXM7CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRQYWdlQ29uZmlndXJhdGlvbkJ5VXJsID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCh1cmwsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubG9naW5SZXF1aXJlZCAmJiAhbG9nZ2VkSW4oKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyVXJsID0gJGxvY2F0aW9uLnVybCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24udXJsKCIvbG9naW4vP3JlZGlyZWN0PSIgKyBjdXJVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnBhZ2VkZWYgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzID09IDQwMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJVcmwgPSAkbG9jYXRpb24udXJsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi51cmwoIi9sb2dpbi8/cmVkaXJlY3Q9IiArIGN1clVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRQYWdlQ29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkc2NvcGUucGFnZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBQYXRoID0gJHJvdXRlUGFyYW1zLmFwcFBhdGg7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBTZXR0aW5ncygkc2NvcGUuYXBwUGF0aCwgInBhZ2Vjb25maWdvYmplY3QiLCBmdW5jdGlvbiAob2JqZWN0TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLycgKyAkc2NvcGUucGFnZUlkICsgJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRQYWdlQ29uZmlndXJhdGlvbkJ5VXJsKHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHN0YXR1cywgZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvY29zbW9zLnBhZ2VzLycgKyAkc2NvcGUucGFnZUlkICsgJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRQYWdlQ29uZmlndXJhdGlvbkJ5VXJsKHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb25CeVVybCA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29zbW9zU2VydmljZS5nZXQodXJsLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5jb25maWcgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRzY29wZS5jb25maWcucGFnZUlkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnBhZ2VJZCA9ICRzY29wZS5jb25maWcucGFnZUlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0UGFnZUNvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJHNjb3BlLmNvbmZpZy5wYWdlZGVmKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnBhZ2VkZWYgPSAkc2NvcGUuY29uZmlnLnBhZ2VkZWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5sb2FkU2luZ2xlSXRlbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBQYXRoID0gJHJvdXRlUGFyYW1zLmFwcFBhdGg7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBTZXR0aW5ncygkc2NvcGUuYXBwUGF0aCwgInNpbmdsZWl0ZW1jb25maWdvYmplY3QiLCBmdW5jdGlvbihvYmplY3ROYW1lKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9ICcvc2VydmljZS8nK29iamVjdE5hbWUrJy8nICsgJHNjb3BlLmNvbmZpZ0lkICsgJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRDb25maWd1cmF0aW9uQnlVcmwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihzdGF0dXMsIGRhdGEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvY29zbW9zLnNpbmdsZWl0ZW1jb25maWcvJyArICRzY29wZS5jb25maWdJZCArICcvJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbkJ5VXJsKHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmxvYWRTaW5nbGVJdGVtID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iamVjdE5hbWUgPSAkc2NvcGUuY29uZmlnLm9iamVjdE5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5zID0gJHNjb3BlLmNvbmZpZy5jb2x1bW5zOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbnNDc3YgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGNvbHVtbnMsIGZ1bmN0aW9uIChjb2x1bW4sIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zQ3N2ICs9IGNvbHVtbi5uYW1lICsgIiwiOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLycgKyAkc2NvcGUuaXRlbUlkICsgJy8/Y29sdW1ucz0nICsgY29sdW1uc0NzdjsKCiAgICAgICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJycgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICA8ZGl2IG5nLXJlcGVhdD0iZmllbGQgaW4gcGFnZWRlZi5maWVsZHMiPlxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICA8ZmllbGQgaXRlbT0iZmllbGQiIHZhbD0iJHBhcmVudC5kYXRhIj48L2ZpZWxkPlxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIDwvZGl2PlxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9XSwKCiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkNyZWF0aW5nIHBhZ2UiKTsKICAgICAgICAgICAgICAgIHNjb3BlLnBhZ2VkZWYgPSB7fTsKICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHNjb3BlLmdldFRlbXBsYXRlKCk7CiAgICAgICAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNjb3BlLmdldENvbmZpZ3VyYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpOwogICAgICAgICAgICAgICAgJGNvbXBpbGUobmV3RWxlbWVudCkoc2NvcGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSkKCiAgICAuZGlyZWN0aXZlKCdyYXdodG1sJywgZnVuY3Rpb24gKCRjb21waWxlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJywKICAgICAgICAgICAgc2NvcGU6IHsKICAgICAgICAgICAgICAgIGh0bWxVcmw6ICc9JwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY29udHJvbGxlcjogWyckc2NvcGUnLCAnJGxvY2F0aW9uJywgJyRyb3V0ZVBhcmFtcycsICdtZXNzYWdlJywgJ0Nvc21vc1NlcnZpY2UnLCAnY29zbW9zLnNldHRpbmdzJywKICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgkc2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zLCBtZXNzYWdlLCBDb3Ntb3NTZXJ2aWNlLCBzZXR0aW5ncykgewoKICAgICAgICAgICAgICAgICAgICAkc2NvcGUucm91dGVQYXJhbXMgPSAkcm91dGVQYXJhbXM7CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRIdG1sID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsPSAkc2NvcGUuaHRtbFVybDsKCiAgICAgICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaHRtbEJsb2NrID0gZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCgkc2NvcGUuaHRtbEJsb2NrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tcGlsZShuZXdFbGVtZW50KSgkc2NvcGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfV0sCgogICAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJDcmVhdGluZyByYXdodG1sIGVsZW1lbnQiKTsKICAgICAgICAgICAgICAgIHNjb3BlLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICAgICAgc2NvcGUuZ2V0SHRtbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSkKCiAgICAuZGlyZWN0aXZlKCdvYmplY3RwaWNrZXInLCBmdW5jdGlvbiAoJGNvbXBpbGUpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZXN0cmljdDogJ0UnLAogICAgICAgICAgICBzY29wZTogewogICAgICAgICAgICAgICAgZW5kcG9pbnQ6ICc9PycsCiAgICAgICAgICAgICAgICBpdGVtczogJz0/JywKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnPScsCiAgICAgICAgICAgICAgICBkZXRhaWx0ZW1wbGF0ZTonPScsCiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJz0nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlcXVpcmU6ICJuZ01vZGVsIiwKCiAgICAgICAgICAgIGNvbnRyb2xsZXI6IFsnJHNjb3BlJywgJyR0aW1lb3V0JywgJ0Nvc21vc1NlcnZpY2UnLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKCRzY29wZSwgJHRpbWVvdXQsIENvc21vc1NlcnZpY2UpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUucmVmcmVzaERhdGEgPSBmdW5jdGlvbiAocSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZigkc2NvcGUuZW5kcG9pbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7cTogcX07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLnNlYXJjaCgkc2NvcGUuZW5kcG9pbnQsIHtwYXJhbXM6IHBhcmFtc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLml0ZW1zID0gZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldFRlbXBsYXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9ICIiOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5lbmRwb2ludCAmJiAkc2NvcGUuZW5kcG9pbnQubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2g9ICdyZWZyZXNoPSJyZWZyZXNoRGF0YSgkc2VsZWN0LnNlYXJjaCkiIHJlZnJlc2gtZGVsYXk9IjEwMDAiJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSAnXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWktc2VsZWN0IG5nLW1vZGVsPSJzZWxlY3RlZERhdGEuc2VsZWN0ZWQiXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lPSJib290c3RyYXAiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1kaXNhYmxlZD0iZGlzYWJsZWQiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldC1zZWFyY2gtaW5wdXQ9ImZhbHNlIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAzMDBweDsiPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpLXNlbGVjdC1tYXRjaCBwbGFjZWhvbGRlcj0iJyArICRzY29wZS5wbGFjZWhvbGRlciArICciPicgKyAkc2NvcGUudGVtcGxhdGUgKyAnPC91aS1zZWxlY3QtbWF0Y2g+IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWktc2VsZWN0LWNob2ljZXMgcmVwZWF0PSJkYXRhIGluIGl0ZW1zIHRyYWNrIGJ5ICRpbmRleCIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcrcmVmcmVzaCsnID4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGV0YWlsdGVtcGxhdGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3VpLXNlbGVjdC1jaG9pY2VzPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWktc2VsZWN0Pic7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnN0YXJ0V2F0Y2ggPSBmdW5jdGlvbihuZ01vZGVsKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS4kd2F0Y2goInNlbGVjdGVkRGF0YS5zZWxlY3RlZCIsIGZ1bmN0aW9uKG5ld1ZhbCwgb2xkVmFsKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ld1ZhbCB8fCBvbGRWYWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGltZW91dCggZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kZWwuJHNldFZpZXdWYWx1ZShuZXdWYWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH1dLAoKICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRyaWJ1dGVzLCBuZ01vZGVsKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQ3JlYXRpbmcgb2JqZWN0cGlja2VyIGVsZW1lbnQiKTsKICAgICAgICAgICAgICAgIHNjb3BlLmVsZW1lbnQgPSBlbGVtZW50OwoKCiAgICAgICAgICAgICAgICBpZighc2NvcGUuaXRlbXMpewogICAgICAgICAgICAgICAgICAgIHNjb3BlLml0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWREYXRhID0ge307CgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gc2NvcGUuZ2V0VGVtcGxhdGUoKTsKICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgIHNjb3BlLmVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7CiAgICAgICAgICAgICAgICAkY29tcGlsZShuZXdFbGVtZW50KShzY29wZSk7CgogICAgICAgICAgICAgICAgc2NvcGUuc3RhcnRXYXRjaChuZ01vZGVsKTsKCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KQoKICAgIC5kaXJlY3RpdmUoJ2ZpbGVjdHJsJywgZnVuY3Rpb24gKCRjb21waWxlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJywKICAgICAgICAgICAgc2NvcGU6IHsKICAgICAgICAgICAgICAgIGxhYmVsOiAnPScsCiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnPScsCiAgICAgICAgICAgICAgICB2YWw6ICc9JywKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAnPScKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGNvbnRyb2xsZXI6IFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICckcm91dGVQYXJhbXMnLCAnJG1vZGFsJywgJ21lc3NhZ2UnLCAnQ29zbW9zU2VydmljZScsICdjb3Ntb3Muc2V0dGluZ3MnLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKCRzY29wZSwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsICRtb2RhbCwgbWVzc2FnZSwgQ29zbW9zU2VydmljZSwgc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUucm91dGVQYXJhbXMgPSAkcm91dGVQYXJhbXM7CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5icm93c2VGaWxlID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkbW9kYWwub3Blbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2xpYi9jb3Ntb3MvcGFydGlhbHMvYnJvd3NlZmlsZS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICJCcm93c2VGaWxlQ29udHJvbGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnbGcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzY29wZS5vYmplY3ROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBtb2RhbEluc3RhbmNlLnJlc3VsdC50aGVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkRmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5maWxlTmFtZSA9ICcvZ3JpZGZzLycrc2VsZWN0ZWRGaWxlLmNvbGxlY3Rpb25fbmFtZSArICcvJytzZWxlY3RlZEZpbGUuZmlsZV9pZCArJyBbJytzZWxlY3RlZEZpbGUuZmlsZW5hbWUrJ10nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZEZpbGUgPSBzZWxlY3RlZEZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnZhbCA9ICcvZ3JpZGZzLycrc2VsZWN0ZWRGaWxlLmNvbGxlY3Rpb25fbmFtZSArICcvJytzZWxlY3RlZEZpbGUuZmlsZV9pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kbG9nLmluZm8oJ01vZGFsIGRpc21pc3NlZCBhdDogJyArIG5ldyBEYXRlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9ICc8bGFiZWw+e3tsYWJlbH19PHNwYW4gbmctaWY9InJlcXVpcmVkIj4mbmJzcDsqJm5ic3A7PC9zcGFuPjwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCByZWFkb25seSBjbGFzcz0iZm9ybS1jb250cm9sIiB0eXBlPSJcJ3RleHRcJyIgbmctbW9kZWw9InZhbCIgdGl0bGU9Int7ZmlsZU5hbWV9fSIvPicrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gbmctY2xpY2s9ImJyb3dzZUZpbGUoKSIgY2xhc3M9ImJ0biBidG4tc20gYnRuLXByaW1hcnkiPkJyd29zZTwvYnV0dG9uPic7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKCiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gc2NvcGUuZ2V0VGVtcGxhdGUoKTsKCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiRmlsZSBjdHJsIHRlbXBsYXRlIiArIHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7CiAgICAgICAgICAgICAgICAkY29tcGlsZShuZXdFbGVtZW50KShzY29wZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgfSkKCiAgICAuZGlyZWN0aXZlKCdmaWxldmlldycsIGZ1bmN0aW9uICgkY29tcGlsZSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsCiAgICAgICAgICAgIHNjb3BlOiB7CiAgICAgICAgICAgICAgICBsYWJlbDogJz0nLAogICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJz0nLAogICAgICAgICAgICAgICAgbmdNb2RlbDogJz0nLAogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICc9JywKICAgICAgICAgICAgICAgIHJvb3RQYXRoOiAnPT8nCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBjb250cm9sbGVyOiBbJyRzY29wZScsICckbG9jYXRpb24nLCAnJHJvdXRlUGFyYW1zJywgJyRtb2RhbCcsICdtZXNzYWdlJywgJ0Nvc21vc1NlcnZpY2UnLCAnY29zbW9zLnNldHRpbmdzJywKICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgkc2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zLCAkbW9kYWwsIG1lc3NhZ2UsIENvc21vc1NlcnZpY2UsIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJvdXRlUGFyYW1zID0gJHJvdXRlUGFyYW1zOwoKCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmJyb3dzZUZpbGUgPSBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICRtb2RhbC5vcGVuKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnbGliL2Nvc21vcy9wYXJ0aWFscy9icm93c2VmaWxlLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogIkJyb3dzZUZpbGVDb250cm9sbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICdsZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLm9iamVjdE5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsSW5zdGFuY2UucmVzdWx0LnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoc2VsZWN0ZWRGaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmZpbGVOYW1lID0gJy9ncmlkZnMvJytzZWxlY3RlZEZpbGUuY29sbGVjdGlvbl9uYW1lICsgJy8nK3NlbGVjdGVkRmlsZS5maWxlX2lkICsnIFsnK3NlbGVjdGVkRmlsZS5maWxlbmFtZSsnXSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdGVkRmlsZSA9IHNlbGVjdGVkRmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubmdNb2RlbCA9ICcvZ3JpZGZzLycrc2VsZWN0ZWRGaWxlLmNvbGxlY3Rpb25fbmFtZSArICcvJytzZWxlY3RlZEZpbGUuZmlsZV9pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kbG9nLmluZm8oJ01vZGFsIGRpc21pc3NlZCBhdDogJyArIG5ldyBEYXRlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9ICc8bGFiZWw+e3tsYWJlbH19PHNwYW4gbmctaWY9InJlcXVpcmVkIj4mbmJzcDsqJm5ic3A7PC9zcGFuPjwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxpZnJhbWUgbmFtZT0nc3VibWl0LWlmcmFtZScgaWQ9J3N1Ym1pdC1pZnJhbWUnIHN0eWxlPSdkaXNwbGF5OiBub25lOyc+PC9pZnJhbWU+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCByZWFkb25seSBjbGFzcz0iZm9ybS1jb250cm9sIiB0eXBlPSJcJ3RleHRcJyIgbmctbW9kZWw9Im5nTW9kZWwiIHRpdGxlPSJ7e2ZpbGVOYW1lfX0iLz4nKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIG5nLWNsaWNrPSJicm93c2VGaWxlKCkiIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5Ij5Ccndvc2U8L2J1dHRvbj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCgogICAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHNjb3BlLmdldFRlbXBsYXRlKCk7CgogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkZpbGUgY3RybCB0ZW1wbGF0ZSIgKyB0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpOwogICAgICAgICAgICAgICAgJGNvbXBpbGUobmV3RWxlbWVudCkoc2NvcGUpOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0pOwoKCmNvbnRyb2xsZXJzLmNvbnRyb2xsZXIoJ0Jyb3dzZUZpbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJG1vZGFsSW5zdGFuY2UnLCAnQ29zbW9zU2VydmljZScsICdvYmplY3ROYW1lJywKICAgIGZ1bmN0aW9uICgkc2NvcGUsICRtb2RhbEluc3RhbmNlLCBDb3Ntb3NTZXJ2aWNlLCBvYmplY3ROYW1lKSB7CiAgICAkc2NvcGUuZmlsZU9iamVjdE5hbWUgPSBvYmplY3ROYW1lOwoKICAgICRzY29wZS51cGxvYWRlZF9maWxlcyA9IFtdOwoKICAgICRzY29wZS5zZXRBY3Rpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZG9jdW1lbnQudXBsb2FkRm9ybS5hY3Rpb24gPSAiL2dyaWRmcy8iICsgJHNjb3BlLmZpbGVPYmplY3ROYW1lICsgIi8iOwogICAgICAgICRzY29wZS5nZXRGaWxlcygpOwogICAgfTsKCiAgICAkc2NvcGUuc2VsZWN0RmlsZSA9IGZ1bmN0aW9uKGZpbGUpewogICAgICAgICRzY29wZS5zZWxlY3RlZEZpbGUgPSBmaWxlOwogICAgfTsKCiAgICAkc2NvcGUuZ2V0RmlsZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgQ29zbW9zU2VydmljZS5nZXQoJy9ncmlkZnMvJyArICRzY29wZS5maWxlT2JqZWN0TmFtZSArICcvJywgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICRzY29wZS51cGxvYWRlZF9maWxlcyA9IGRhdGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9OwoKICAgICRzY29wZS5vbkZpbGVVcGxvYWRMb2FkZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlVGV4dCA9IHRoaXMuY29udGVudERvY3VtZW50LmJvZHkuaW5uZXJUZXh0OwoKICAgICAgICBpZiAocmVzcG9uc2VUZXh0KSB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KS5fZCk7CiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCh2YWx1ZXMsIGZ1bmN0aW9uIChkYXRhLCBpbmRleCkgewogICAgICAgICAgICAgICAgJHNjb3BlLnVwbG9hZGVkX2ZpbGVzLnB1c2goZGF0YSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkc2NvcGUuJGFwcGx5KCk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIHRoZSBpZnJhbWUgY29udHJvbAogICAgICAgICQoJyNzdWJtaXQtaWZyYW1lJykucmVtb3ZlKCk7CiAgICAgICAgalF1ZXJ5KCIjZmlsZUxpc3QiKS5lbXB0eSgpOwogICAgICAgIGpRdWVyeSgiI2ZpbGVMaXN0IikuYXBwZW5kKGpRdWVyeSgnPGlucHV0IGNsYXNzPSJmaWxlLXNlbGVjdG9yIiBuYW1lPSJ1cGxvYWRlZGZpbGUiIHR5cGU9ImZpbGUiIG9uY2hhbmdlPSJhbmd1bGFyLmVsZW1lbnQodGhpcykuc2NvcGUoKS5maWxlTmFtZUNoYW5nZWQoKSIgLz4nKSk7CiAgICB9OwoKICAgICRzY29wZS51cGxvYWRGaWxlID0gZnVuY3Rpb24gKCkgewogICAgICAgIGpRdWVyeSgiI2lGcmFtZVBsYWNlaG9sZGVyIikuaHRtbCgiPGlmcmFtZSBuYW1lPSdzdWJtaXQtaWZyYW1lJyBpZD0nc3VibWl0LWlmcmFtZScgc3R5bGU9J2Rpc3BsYXk6IG5vbmU7Jz48L2lmcmFtZT4iKTsKCiAgICAgICAgalF1ZXJ5KCIjc3VibWl0LWlmcmFtZSIpLmxvYWQoJHNjb3BlLm9uRmlsZVVwbG9hZExvYWRlZCk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVwbG9hZEZvcm0iKS5zdWJtaXQoKTsKICAgIH07CgogICAgJHNjb3BlLmZpbGVOYW1lQ2hhbmdlZCA9IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICB2YXIgZW1wdHlGb3VuZCA9IGZhbHNlOwogICAgICAgIGFuZ3VsYXIuZm9yRWFjaChqUXVlcnkoIiNmaWxlTGlzdCIpLmNoaWxkcmVuKCksIGZ1bmN0aW9uIChkYXRhLCBpbmRleCkgewogICAgICAgICAgICBpZiAoIWRhdGEudmFsdWUpIHsKICAgICAgICAgICAgICAgIGVtcHR5Rm91bmQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGlmICghZW1wdHlGb3VuZCkgewogICAgICAgICAgICBqUXVlcnkoIiNmaWxlTGlzdCIpLmFwcGVuZChqUXVlcnkoJzxpbnB1dCBjbGFzcz0iZmlsZS1zZWxlY3RvciIgbmFtZT0idXBsb2FkZWRmaWxlIiB0eXBlPSJmaWxlIiBvbmNoYW5nZT0iYW5ndWxhci5lbGVtZW50KHRoaXMpLnNjb3BlKCkuZmlsZU5hbWVDaGFuZ2VkKCkiIC8+JykpOwogICAgICAgIH0KICAgIH07CgogICAgJHNjb3BlLnJlbW92ZUZpbGUgPSBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICB2YXIgZmlsZSA9ICRzY29wZS51cGxvYWRlZF9maWxlc1tpbmRleF07CiAgICAgICAgaWYgKGNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIGZpbGUgJyArIGZpbGUuZmlsZW5hbWUgKyAnPycpKSB7CiAgICAgICAgICAgIHZhciBmaWxlX2lkID0gZmlsZS5maWxlX2lkOwogICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmRlbGV0ZSgnL2dyaWRmcy8nICsgJHNjb3BlLmZpbGVPYmplY3ROYW1lICsgJy8nICsgZmlsZV9pZCArICcvJywgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUudXBsb2FkZWRfZmlsZXMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH07CgogICAgJHNjb3BlLm9rID0gZnVuY3Rpb24gKCkgewogICAgICAgICRtb2RhbEluc3RhbmNlLmNsb3NlKCRzY29wZS5zZWxlY3RlZEZpbGUpOwogICAgfTsKCiAgICAkc2NvcGUuY2FuY2VsID0gZnVuY3Rpb24gKCkgewogICAgICAgICRtb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpOwogICAgfTsKCn1dKTsKCgo=')
},
{
'name': '/app/lib/cosmos/js/controllers/ListCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKY29udHJvbGxlcnMuY29udHJvbGxlcignTGlzdEN0cmwnLCBbJyRzY29wZScsICckcm91dGVQYXJhbXMnLCAnJG1vZGFsJywgJ0Nvc21vc1NlcnZpY2UnLCBmdW5jdGlvbiAoJHNjb3BlLCAkcm91dGVQYXJhbXMsICRtb2RhbCwgQ29zbW9zU2VydmljZSkgewoKICAgICRzY29wZS5zZXJ2aWNlTmFtZSA9ICJsaXN0cyI7CgogICAgJHNjb3BlLmNsZWFyRXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgJHNjb3BlLmhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgJHNjb3BlLnN0YXR1cyA9ICIiOwogICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9ICIiOwogICAgfTsKCiAgICAkc2NvcGUucHJvY2Vzc0Vycm9yID0gZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICRzY29wZS5oYXNFcnJvciA9IHRydWU7CiAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAkc2NvcGUuc3RhdHVzX2RhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKICAgIH07CgogICAgJHNjb3BlLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHVybCA9ICcvc2VydmljZS9jb3Ntb3MubGlzdGNvbmZpZ3VyYXRpb25zLyc7CgogICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICRzY29wZS5saXN0cyA9IGRhdGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9OwoKICAgICRzY29wZS5nZXREYXRhKCk7Cn1dKTs=')
},
{
'name': '/app/lib/cosmos/js/controllers/IndexCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKCmNvbnRyb2xsZXJzLmNvbnRyb2xsZXIoJ0luZGV4Q3RybCcsIFsnJHNjb3BlJywgJyRyb3V0ZVBhcmFtcycsICckbG9jYXRpb24nLCAnQ29zbW9zU2VydmljZScsICdtZXNzYWdlJywKICAgICdjb3Ntb3MuY2FjaGVkbG9hZGVyJywnY29zbW9zLnV0aWxzJywKICAgIGZ1bmN0aW9uICgkc2NvcGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCBDb3Ntb3NTZXJ2aWNlLCBtZXNzYWdlLCBjYWNoZWRsb2FkZXIsIHV0aWxzKSB7CgogICAgICAgICRzY29wZS5wYWdlUmVmcyA9IFtdOwogICAgICAgICRzY29wZS5hcHBQYXRoID0gJHJvdXRlUGFyYW1zLmFwcFBhdGg7CgogICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IgPSBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCcvYXBwc3R1ZGlvLycpOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5nZXRDb25maWd1cmF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoJHNjb3BlLmFwcFBhdGggJiYgJHNjb3BlLmFwcFBhdGgubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgJHNjb3BlLmdldEFwcENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvY29zbW9zLmdsb2JhbHNldHRpbmdzLyc7CgogICAgICAgICAgICAgICAgQ29zbW9zU2VydmljZS5nZXQodXJsLCBmdW5jdGlvbiAocmV0dXJuZWREYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0dXJuZWREYXRhIHx8IHJldHVybmVkRGF0YS5sZW5ndGggIT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9hcHBzdHVkaW8vJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnbG9iYWxTZXR0aW5ncyA9IHJldHVybmVkRGF0YVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFwcElkID0gZ2xvYmFsU2V0dGluZ3MuZGVmYXVsdGFwcGlkOwogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0QXBwQ29uZmlndXJhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgICRzY29wZS5nZXRBcHBDb25maWd1cmF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdXJsOwogICAgICAgICAgICBpZiAoJHNjb3BlLmFwcElkKSB7CiAgICAgICAgICAgICAgICB1cmwgPSAnL3NlcnZpY2UvY29zbW9zLmFwcGxpY2F0aW9ucy8/ZmlsdGVyPXsiaWQiOiInICsgJHNjb3BlLmFwcElkICsgJyJ9JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkc2NvcGUuYXBwUGF0aCkgewogICAgICAgICAgICAgICAgdXJsID0gJy9zZXJ2aWNlL2Nvc21vcy5hcHBsaWNhdGlvbnMvP2ZpbHRlcj17InBhdGgiOiInICsgJHNjb3BlLmFwcFBhdGggKyAnIn0nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9hcHBsaXN0LycpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgYXBwQ2FjaGUgPSAiQXBwbGljYXRpb24uIiArICgkc2NvcGUuYXBwUGF0aCB8fCAkc2NvcGUuYXBwSWQpOwoKICAgICAgICAgICAgY2FjaGVkbG9hZGVyLmdldChhcHBDYWNoZSwgdXJsLCBmdW5jdGlvbiAocmV0dXJuZWREYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXR1cm5lZERhdGEgfHwgcmV0dXJuZWREYXRhLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyIG1zZyA9ICJFeGFjdGx5IG9uZSBhcHBsaWNhdGlvbiBpcyBleHBlY3RlZCBmb3IgcGF0aCA9ICIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKyAkc2NvcGUuYXBwUGF0aCArICIuIEZvdW5kID0gIiArICgoIXJldHVybmVkRGF0YSkgPyAwIDogcmV0dXJuZWREYXRhLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVzc2FnZS5wdXNoKHsibWVzc2FnZSI6IG1zZywgInRpdGxlIjogIkludmFsaWQgYXBwbGljYXRpb24gbmFtZSIsICJkYXRhIjogIiJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kbG9jYXRpb24ucGF0aCgnL21lc3NhZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9hcHBzdHVkaW8vJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBTZXR0aW5ncyA9IHJldHVybmVkRGF0YVswXTsKICAgICAgICAgICAgICAgICAgICBpZighJHNjb3BlLmFwcFBhdGgpewogICAgICAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgnL2EvJyskc2NvcGUuYXBwU2V0dGluZ3MucGF0aCsnLycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFwcGx5U2V0dGluZ3MoJHNjb3BlLmFwcFNldHRpbmdzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuYXBwbHlTZXR0aW5ncyA9IGZ1bmN0aW9uIChhcHApIHsKICAgICAgICAgICAgaWYoIWFwcCl7CiAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKDQwNCwgIkFwcGxpY2F0aW9uIG5vdCBmb3VuZCBhdCB0aGUgcGF0aCIpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChhcHAuc2V0dGluZ3MgJiYgYXBwLnNldHRpbmdzLmluZGV4UGFnZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnBhZ2VSZWZzID0gWwogICAgICAgICAgICAgICAgICAgICAgICB7InR5cGUiOiAicGFnZXJlZiIsICJuYW1lIjogIkluZGV4IiwgInBhZ2VJZCI6IGFwcC5zZXR0aW5ncy5pbmRleFBhZ2VJZH0KICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdXRpbHMuZ2V0QWxsUGFnZXMoYXBwLCBmdW5jdGlvbiAocGFnZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wYWdlcyA9IHBhZ2VzOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgICRzY29wZS5nZXRDb25maWd1cmF0aW9uKCk7CiAgICB9XSkKOw==')
},
{
'name': '/app/lib/cosmos/js/controllers/AppStudioCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTEvMjcvMTQuCiAqLwoKCmNvbnRyb2xsZXJzLmNvbnRyb2xsZXIoJ0FwcFN0dWRpb0N0cmwnLCBbJyRzY29wZScsICckcm91dGVQYXJhbXMnLCAnJHRlbXBsYXRlQ2FjaGUnLCAnJG1vZGFsJywgJ0Nvc21vc1NlcnZpY2UnLAogICAgJ2Nvc21vcy5zZXR0aW5ncycsICdnbG9iYWxoYXNodGFibGUnLCAnY29zbW9zLnV0aWxzJywKICAgIGZ1bmN0aW9uICgkc2NvcGUsICRyb3V0ZVBhcmFtcywgJHRlbXBsYXRlQ2FjaGUsICRtb2RhbCwgQ29zbW9zU2VydmljZSwgc2V0dGluZ3MsIGdsb2JhbGhhc2h0YWJsZSwgdXRpbHMpIHsKCiAgICAgICAgJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb24gPSB1bmRlZmluZWQ7CiAgICAgICAgJHNjb3BlLmFwcFBhdGggPSAkcm91dGVQYXJhbXMuYXBwUGF0aDsKCiAgICAgICAgJHNjb3BlLmhhc2h0YWJsZSA9IGdsb2JhbGhhc2h0YWJsZTsKICAgICAgICAkc2NvcGUuZ2xvYmFsU2V0dGluZ3MgPSB7fTsKCiAgICAgICAgJHNjb3BlLmNvc21vc0N1cnJlbnRBcHBsaWNhdGlvblJlZiA9ICJfQ29zbW9zX0N1cnJlbnRfQXBwbGljYXRpb25fIjsKCiAgICAgICAgJHNjb3BlLmFwcGxpY2F0aW9uQ2hhbmdlZCA9IGZ1bmN0aW9uKCl7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmdldEdsb2JhbFNldHRpbmdzID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgc2V0dGluZ3MuZ2V0R2xvYmFsU2V0dGluZ3MoZnVuY3Rpb24gKGdsb2JhbFNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdsb2JhbFNldHRpbmdzID0gZ2xvYmFsU2V0dGluZ3M7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcgogICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5nZXRBcHBsaWNhdGlvbnMgPSBmdW5jdGlvbigpewogICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBsaWNhdGlvbnMoZnVuY3Rpb24gKGFwcGxpY2F0aW9ucykgewogICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBsaWNhdGlvbnMgPSBhcHBsaWNhdGlvbnM7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcgogICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IgPSBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICRzY29wZS5oYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5jbGVhckVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkc2NvcGUuaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9ICIiOwogICAgICAgICAgICAkc2NvcGUuc3RhdHVzX2RhdGEgPSAiIjsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUucHJvY2Vzc0l0ZW0gPSBmdW5jdGlvbiAoaXRlbVR5cGUsIHZhbHVlcykgewogICAgICAgICAgICB2YXIgYXBwID0gJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb247CiAgICAgICAgICAgIGFwcFtpdGVtVHlwZV0gPSB2YWx1ZXM7CiAgICAgICAgICAgICRzY29wZS5oYXNodGFibGUuc2V0KCRzY29wZS5jb3Ntb3NDdXJyZW50QXBwbGljYXRpb25SZWYsIGFwcCk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmdldEl0ZW1zQnlVcmwgPSBmdW5jdGlvbihpdGVtVHlwZSwgdXJsKSB7CiAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0l0ZW0oaXRlbVR5cGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmdldEl0ZW1zID0gZnVuY3Rpb24gKGl0ZW1UeXBlLCAgaXRlbUNvbmZpZ05hbWUsIGFwcCkgewogICAgICAgICAgICBpZiAoYXBwICYmIGFwcC5wYXRoKSB7CgogICAgICAgICAgICAgICAgdmFyIGFwcFBhdGggPSBhcHAucGF0aDsKCiAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBTZXR0aW5ncyhhcHBQYXRoLCBpdGVtQ29uZmlnTmFtZSwgZnVuY3Rpb24gKG9iamVjdE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9ICcvc2VydmljZS8nICsgb2JqZWN0TmFtZSArICcvJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbUNvbmZpZ05hbWUgPT09ICJ3aWRnZXRvYmplY3QiIHx8IGl0ZW1Db25maWdOYW1lID09PSAic291cmNlY29sbmFtZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGl0ZW1Db25maWdOYW1lID09PSAiaW50ZXJjZXB0b3Jjb25pZ29iamVjdCIgfHwgaXRlbUNvbmZpZ05hbWUgPT09ICJhcHBlbmRwb2ludGNvbmlnb2JqZWN0IiApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJz9maWx0ZXI9eyJhcHBfaWQiOiInK2FwcC5pZCsnIn0nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRJdGVtc0J5VXJsKGl0ZW1UeXBlLCB1cmwpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHN0YXR1cywgZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKHN0YXR1cywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgICRzY29wZS5sb2FkQXBwSXRlbXMgPSBmdW5jdGlvbihhcHApewogICAgICAgICAgICBpZighYXBwKXsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNjb3BlLmdldEl0ZW1zKCJwYWdlcyIsICJwYWdlY29uZmlnb2JqZWN0IiAsYXBwKTsKICAgICAgICAgICAgJHNjb3BlLmdldEl0ZW1zKCJmb3JtcyIsICJmb3JtY29uZmlnb2JqZWN0IiAsYXBwKTsKICAgICAgICAgICAgJHNjb3BlLmdldEl0ZW1zKCJsaXN0cyIsICJsaXN0Y29uZmlnb2JqZWN0IiAsYXBwKTsKICAgICAgICAgICAgJHNjb3BlLmdldEl0ZW1zKCJjaGFydHMiLCAiY2hhcnRjb25maWdvYmplY3QiICxhcHApOwogICAgICAgICAgICAkc2NvcGUuZ2V0SXRlbXMoIndpZGdldHMiLCAid2lkZ2V0b2JqZWN0IiAsYXBwKTsKICAgICAgICAgICAgJHNjb3BlLmdldEl0ZW1zKCJtZW51cyIsICJtZW51Y29uZmlnb2JqZWN0IiAsYXBwKTsKICAgICAgICAgICAgJHNjb3BlLmdldEl0ZW1zKCJzaW5nbGVpdGVtdmlld3MiLCAic2luZ2xlaXRlbWNvbmZpZ29iamVjdCIsIGFwcCk7CiAgICAgICAgICAgICRzY29wZS5nZXRJdGVtcygic291cmNlZmlsZXMiLCAic291cmNlY29sbmFtZSIsIGFwcCk7CiAgICAgICAgICAgICRzY29wZS5nZXRJdGVtcygiaW50ZXJjZXB0b3JzIiwgImludGVyY2VwdG9yY29uaWdvYmplY3QiLCBhcHApOwogICAgICAgICAgICAkc2NvcGUuZ2V0SXRlbXMoImFwcGVuZHBvaW50cyIsICJhcHBlbmRwb2ludGNvbmlnb2JqZWN0IiwgYXBwKTsKCiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmxvYWRBcHBJdGVtc0ZvclNlbGVjdGVkQXBwID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgaWYoJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb24pIHsKICAgICAgICAgICAgICAgICRzY29wZS5sb2FkQXBwSXRlbXMoJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnNldEFzRGVmYXVsdCA9IGZ1bmN0aW9uKGFwcCl7CiAgICAgICAgICAgIGlmKGFwcCAmJiBhcHAuaWQpewogICAgICAgICAgICAgICAgdXRpbHMuc2V0QXBwQXNEZWZhdWx0KGFwcCwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2xvYmFsU2V0dGluZ3MuZGVmYXVsdGFwcGlkID0gYXBwLmlkOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuc2V0UGFnZUFzRGVmYXVsdCA9IGZ1bmN0aW9uKHBhZ2UpewogICAgICAgICAgICB2YXIgYXBwID0gJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb247CgogICAgICAgICAgICBpZihhcHAgJiYgYXBwLl9pZCAmJiBwYWdlICYmIHBhZ2UuX2lkKXsKICAgICAgICAgICAgICAgIHV0aWxzLnNldFBhZ2VBc0RlZmF1bHQoYXBwLCBwYWdlLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZEFwcGxpY2F0aW9uLnNldHRpbmdzLmluZGV4UGFnZUlkID0gcGFnZS5faWQ7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0l0ZW0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUub3BlbkFwcCA9IGZ1bmN0aW9uKGFwcCl7CiAgICAgICAgICAgIGlmKGFwcCkgewogICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb24gPSBhcHA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKCRzY29wZS5zZWxlY3RlZEFwcGxpY2F0aW9uKXsKICAgICAgICAgICAgICAgICRzY29wZS5sb2FkQXBwSXRlbXMoJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb24pOwogICAgICAgICAgICAgICAgJHNjb3BlLmhhc2h0YWJsZS5zZXQoJHNjb3BlLmNvc21vc0N1cnJlbnRBcHBsaWNhdGlvblJlZiwgJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAkc2NvcGUuaGFzaHRhYmxlLnNldCgkc2NvcGUuY29zbW9zQ3VycmVudEFwcGxpY2F0aW9uUmVmLCB1bmRlZmluZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmRlbGV0ZUl0ZW0gPSBmdW5jdGlvbiAoYXBwLCBpdGVtVHlwZUxhYmVsLCBsYWJlbCwgaXRlbUNvbmZpZ05hbWUsIF9pZCwgb25TdWNjZXNzKSB7CiAgICAgICAgICAgIGlmKCFhcHApewogICAgICAgICAgICAgICAgYXBwID0gJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSAnKyBpdGVtVHlwZUxhYmVsICsnICcgKyBsYWJlbCArICc/JykpIHsKCiAgICAgICAgICAgICAgICB2YXIgYXBwUGF0aCA9IGFwcC5wYXRoOwoKICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldEFwcFNldHRpbmdzKGFwcFBhdGgsIGl0ZW1Db25maWdOYW1lLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChvYmplY3ROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLycgKyBfaWQgKyAnLyc7CiAgICAgICAgICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZGVsZXRlKHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihvblN1Y2Nlc3MpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubG9hZEFwcEl0ZW1zRm9yU2VsZWN0ZWRBcHAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmRlbGV0ZUFwcCA9IGZ1bmN0aW9uKGFwcCl7CiAgICAgICAgICAgICRzY29wZS5kZWxldGVJdGVtKGFwcCwgImFwcCIsIGFwcC50aXRsZSwgImFwcGNvbmZpZ29iamVjdCIsIGFwcC5faWQsCiAgICAgICAgICAgICAgICBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY2xlYXJDYWNoZShzZXR0aW5ncy5nZXRBbGxBcHBDYWNoZU5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldEFwcGxpY2F0aW9ucygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5kZWxldGVTb3VyY2VGaWxlID0gZnVuY3Rpb24oc291cmNlZmlsZSkgewogICAgICAgICAgICB2YXIgZmlsZVVybCA9ICIvZ3JpZGZzL2Nvc21vcy5zb3VyY2VmaWxlcy8iICsgc291cmNlZmlsZS5maWxlX2lkICsgIi8iOwoKICAgICAgICAgICAgJHNjb3BlLmRlbGV0ZUl0ZW0oYXBwLCAic291cmNlIGZpbGUiLCBzb3VyY2VmaWxlLmZpbGVuYW1lLCAic291cmNlY29sbmFtZSIsIHNvdXJjZWZpbGUuX2lkLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5jbGVhckNhY2hlKHNldHRpbmdzLmdldEFsbEFwcENhY2hlTmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmRlbGV0ZShmaWxlVXJsLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRzY29wZS5sb2FkQXBwSXRlbXNGb3JTZWxlY3RlZEFwcCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5jbG9zZUFwcCA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICRzY29wZS5oYXNodGFibGUuc2V0KCRzY29wZS5jb3Ntb3NDdXJyZW50QXBwbGljYXRpb25SZWYsIHVuZGVmaW5lZCk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmdldEN1cnJlbnRBcHBsaWNhdGlvblRpdGxlID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgdmFyIGFwcCA9ICRzY29wZS5oYXNodGFibGUuZ2V0KCRzY29wZS5jb3Ntb3NDdXJyZW50QXBwbGljYXRpb25SZWYpOwogICAgICAgICAgICBpZihhcHApewogICAgICAgICAgICAgICAgcmV0dXJuIGFwcC50aXRsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5pc0FwcE9wZW5lZCA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHZhciBhcHAgPSAkc2NvcGUuaGFzaHRhYmxlLmdldCgkc2NvcGUuY29zbW9zQ3VycmVudEFwcGxpY2F0aW9uUmVmKTsKICAgICAgICAgICAgcmV0dXJuICEhYXBwOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5nZXRPcGVuZWRBcHAgPSBmdW5jdGlvbigpewogICAgICAgICAgICByZXR1cm4gJHNjb3BlLmhhc2h0YWJsZS5nZXQoJHNjb3BlLmNvc21vc0N1cnJlbnRBcHBsaWNhdGlvblJlZik7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmluaXQgPSBmdW5jdGlvbigpewogICAgICAgICAgICAkc2NvcGUuZ2V0R2xvYmFsU2V0dGluZ3MoKTsKICAgICAgICAgICAgJHNjb3BlLmdldEFwcGxpY2F0aW9ucygpOwogICAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRBcHBsaWNhdGlvbiA9ICRzY29wZS5nZXRPcGVuZWRBcHAoKTsKICAgICAgICAgICAgJHNjb3BlLmFwcGxpY2F0aW9uQ2hhbmdlZCgpOwogICAgICAgIH07CgogICAgfV0pCjs=')
},
{
'name': '/app/lib/cosmos/js/controllers/FormDesignCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKY29udHJvbGxlcnMuY29udHJvbGxlcignRm9ybURlc2lnbkNvbnRyb2xsZXInLCBbJyRzY29wZScsICckcm91dGVQYXJhbXMnLCAnJHRlbXBsYXRlQ2FjaGUnLCAnJG1vZGFsJywgJ0Nvc21vc1NlcnZpY2UnLCAnY29zbW9zLnNldHRpbmdzJywKICAgIGZ1bmN0aW9uICgkc2NvcGUsICRyb3V0ZVBhcmFtcywgJHRlbXBsYXRlQ2FjaGUsICRtb2RhbCwgQ29zbW9zU2VydmljZSwgc2V0dGluZ3MpIHsKCiAgICAgICAgJHNjb3BlLmRlc2lnbk1vZGUgPSB0cnVlOwogICAgICAgICRzY29wZS5hY3RpdmVUYWIgPSAidG9vbHMiOwogICAgICAgICRzY29wZS5vbnN1Y2Nlc3NfdHlwZXMgPSBbCiAgICAgICAgICAgIHsnbmFtZSc6ICdtZXNzYWdlJywgJ3RpdGxlJzogJ01lc3NhZ2UnfSwKICAgICAgICAgICAgeyduYW1lJzogJ3VybCcsICd0aXRsZSc6ICdSZWRpcmVjdCd9CiAgICAgICAgXTsKCiAgICAgICAgJHNjb3BlLnNlbGVjdEl0ZW0gPSBmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgICAgJHNjb3BlLmFjdGl2ZVRhYiA9ICJzZXR0aW5ncyI7CiAgICAgICAgICAgIHZhciBvcHRpb25Gb3JtID0gJHNjb3BlLm9wdGlvbkZvcm1CeVR5cGVbaXRlbS50eXBlXTsKICAgICAgICAgICAgaWYgKG9wdGlvbkZvcm0pIHsKICAgICAgICAgICAgICAgICRzY29wZS5vcHRpb25zZm9ybSA9IG9wdGlvbkZvcm07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkc2NvcGUub3B0aW9uc2Zvcm0gPSAkc2NvcGUub3B0aW9uRm9ybUJ5VHlwZVsiZGVmYXVsdCJdOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLm9wdGlvbnNmb3JtID0gewogICAgICAgIH07CgogICAgICAgICRzY29wZS5vcHRpb25Gb3JtQnlUeXBlID0gewogICAgICAgICAgICAiaW5wdXQiOiB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgIHsiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIkxhYmVsIiwgIm5hbWUiOiAibGFiZWwifSwKICAgICAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJOYW1lIiwgIm5hbWUiOiAibmFtZSJ9LAogICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJjaGVja2JveCIsICJsYWJlbCI6ICJSZXF1aXJlZCIsICJuYW1lIjogInJlcXVpcmVkIn0sCiAgICAgICAgICAgICAgICAgICAgeyJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiTWluIExlbmd0aCIsICJuYW1lIjogIm1pbmxlbmd0aCJ9LAogICAgICAgICAgICAgICAgICAgIHsiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIk1heCBMZW5ndGgiLCAibmFtZSI6ICJtYXhsZW5ndGgifSwKICAgICAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJQYXR0ZXJuIiwgIm5hbWUiOiAicGF0dGVybiJ9LAogICAgICAgICAgICAgICAgICAgIHsiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIlBsYWNlaG9sZGVyIiwgIm5hbWUiOiAicGxhY2Vob2xkZXIifSwKICAgICAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJUb29sdGlwIiwgIm5hbWUiOiAidGl0bGUifSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvaWNlcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIjogInRleHQiLCAibGFiZWwiOiAiVGV4dCJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOiAicGFzc3dvcmQiLCAibGFiZWwiOiAiUGFzc3dvcmQifSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIjogImJ1dHRvbiIsICJsYWJlbCI6ICJCdXR0b24iIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJjaGVja2JveCIsICJsYWJlbCI6ICJDaGVjayBib3giIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJjb2xvciIsICJsYWJlbCI6ICJDb2xvciIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIjogImRhdGUiLCAibGFiZWwiOiAiRGF0ZSIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIjogImRhdGV0aW1lIiwgImxhYmVsIjogIkRhdGUgdGltZSIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIjogImRhdGV0aW1lLWxvY2FsIiwgImxhYmVsIjogIkxvY2FsIGRhdGV0aW1lIiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOiAiZW1haWwiLCAibGFiZWwiOiAiRW1haWwiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJmaWxlIiwgImxhYmVsIjogIkZpbGUiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJoaWRkZW4iLCAibGFiZWwiOiAiSGlkZGVuIiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOiAiaW1hZ2UiLCAibGFiZWwiOiAiSW1hZ2UiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJtb250aCIsICJsYWJlbCI6ICJNb250aCIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIjogIm51bWJlciIsICJsYWJlbCI6ICJOdW1iZXIiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJyYWRpbyIsICJsYWJlbCI6ICJSYWRpbyIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIjogInJhbmdlIiwgImxhYmVsIjogIlJhbmdlIiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOiAicmVzZXQiLCAibGFiZWwiOiAiUmVzZXQiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJzZWFyY2giLCAibGFiZWwiOiAiU2VhcmNoIiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOiAic3VibWl0IiwgImxhYmVsIjogIlN1Ym1pdCIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIjogInRlbCIsICJsYWJlbCI6ICJUZWxlcGhvbmUiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJ0aW1lIiwgImxhYmVsIjogIlRpbWUiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJ1cmwiLCAibGFiZWwiOiAiVVJMIiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOiAid2VlayIsICJsYWJlbCI6ICJXZWVrIiB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImh0bWx0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm51bGxhYmxlIjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmb3JtIjogewogICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJUaXRsZSIsICJuYW1lIjogInRpdGxlIn0sCiAgICAgICAgICAgICAgICAgICAgeyJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiTmFtZSIsICJuYW1lIjogIm5hbWUifSwKICAgICAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJBY3Rpb24iLCAibmFtZSI6ICJhY3Rpb24ifSwKICAgICAgICAgICAgICAgICAgICB7InR5cGUiOiAiY2hlY2tib3giLCAibGFiZWwiOiAiRW5hYmxlIHJlQ2FwY2hhIiwgIm5hbWUiOiAiZW5hYmxlUmVDYXBjaGEifSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNvbXBvc2l0ZSIsICJsYWJlbCI6ICJPbiBzdWNjZXNzIiwgIm5hbWUiOiAib25zdWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNob2ljZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIm1lc3NhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJNZXNzYWdlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiaW5saW5lbWVzc2FnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkVtYmVkZWQgbWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogInVybCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlJlZGlyZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbGFibGUiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIlZhbHVlIiwgIm5hbWUiOiAidmFsdWUifQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAic2VsZWN0IjogeyJsYWJlbCI6ICJTZWxlY3QgT3B0aW9ucyIsICJ0eXBlIjogImNvbXBvc2l0ZSIsICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJMYWJlbCIsICJuYW1lIjogImxhYmVsIn0sCiAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJOYW1lIiwgIm5hbWUiOiAibmFtZSJ9LAogICAgICAgICAgICAgICAgeyJsYWJlbCI6ICJPcHRpb25zIiwgInR5cGUiOiAiY29tcG9zaXRlIiwgIm9wdGlvbnMiOiB7fSwgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7ImxhYmVsIjogIkNob2ljZXMiLCAidHlwZSI6ICJhcnJheSIsICJvcHRpb25zIjoge30sICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsibGFiZWwiOiAiTGFiZWwiLCAiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgIm5hbWUiOiAibGFiZWwifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyJsYWJlbCI6ICJWYWx1ZSIsICJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJ2YWx1ZSJ9CiAgICAgICAgICAgICAgICAgICAgXSwgIm5hbWUiOiAiY2hvaWNlcyJ9CiAgICAgICAgICAgICAgICBdLCAibmFtZSI6ICJvcHRpb25zIn0KICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAiYXJyYXkiOiB7ImxhYmVsIjogIlNlbGVjdCBPcHRpb25zIiwgInR5cGUiOiAiY29tcG9zaXRlIiwgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgIHsiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIkxhYmVsIiwgIm5hbWUiOiAibGFiZWwifSwKICAgICAgICAgICAgICAgIHsiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIk5hbWUiLCAibmFtZSI6ICJuYW1lIn0sCiAgICAgICAgICAgICAgICB7ImxhYmVsIjogIk9wdGlvbnMiLCAidHlwZSI6ICJjb21wb3NpdGUiLCAib3B0aW9ucyI6IHt9LCAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgIHsibGFiZWwiOiAiVmFsdWUgb25seSIsICJ0eXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAicHJpbWl0aXZlIn0KICAgICAgICAgICAgICAgIF0sICJuYW1lIjogIm9wdGlvbnMifQogICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAibG9va3VwIjogeyJsYWJlbCI6ICJTZWxlY3QgT3B0aW9ucyIsICJ0eXBlIjogImNvbXBvc2l0ZSIsICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJMYWJlbCIsICJuYW1lIjogImxhYmVsIn0sCiAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJOYW1lIiwgIm5hbWUiOiAibmFtZSJ9LAogICAgICAgICAgICAgICAgeyJsYWJlbCI6ICJPcHRpb25zIiwgInR5cGUiOiAiY29tcG9zaXRlIiwgIm9wdGlvbnMiOiB7fSwgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7ImxhYmVsIjogIlZhbHVlIG9ubHkiLCAidHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogInNhdmVWYWx1ZU9ubHkifSwKICAgICAgICAgICAgICAgICAgICB7ImxhYmVsIjogIkhpZGUgcmVmZXJlbmNlIiwgInR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJoaWRlUmVmVHlwZSJ9LAoKICAgICAgICAgICAgICAgICAgICB7ImxhYmVsIjogIlJlZmVyZW5jZXMiLCAidHlwZSI6ICJhcnJheSIsICJuYW1lIjogImxvb2t1cHMiLCAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgICAgICB7ImxhYmVsIjogIkRhdGEgZW5kcG9pbnQiLCAiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgIm5hbWUiOiAidXJsIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsibGFiZWwiOiAiUmVmZXJlbmNlIGxhYmVsIiwgImh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJuYW1lIjogImxvb2t1cG5hbWUifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyJsYWJlbCI6ICJSZWZlcmVuY2UgbmFtZSIsICJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJyZWYifSwKICAgICAgICAgICAgICAgICAgICAgICAgeyJsYWJlbCI6ICJWYWx1ZSBmaWVsZCIsICJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJ2YWx1ZSJ9LAogICAgICAgICAgICAgICAgICAgICAgICB7ImxhYmVsIjogIkxhYmVsIGZpZWxkIiwgImh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJuYW1lIjogImxhYmVsIn0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIF0sICJuYW1lIjogIm9wdGlvbnMifQogICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyYWRpb2dyb3VwIjogeyJsYWJlbCI6ICJTZWxlY3QgT3B0aW9ucyIsICJ0eXBlIjogImZvcm0iLCAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgeyJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiTGFiZWwiLCAibmFtZSI6ICJsYWJlbCJ9LAogICAgICAgICAgICAgICAgeyJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiTmFtZSIsICJuYW1lIjogIm5hbWUifSwKICAgICAgICAgICAgICAgIHsibGFiZWwiOiAiT3B0aW9ucyIsICJ0eXBlIjogImNvbXBvc2l0ZSIsICJvcHRpb25zIjoge30sICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgeyJsYWJlbCI6ICJDaG9pY2VzIiwgInR5cGUiOiAiYXJyYXkiLCAib3B0aW9ucyI6IHt9LCAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgICAgICB7ImxhYmVsIjogIkxhYmVsIiwgImh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJuYW1lIjogImxhYmVsIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsibGFiZWwiOiAiVmFsdWUiLCAiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgIm5hbWUiOiAidmFsdWUifQogICAgICAgICAgICAgICAgICAgIF0sICJuYW1lIjogImNob2ljZXMifQogICAgICAgICAgICAgICAgXSwgIm5hbWUiOiAib3B0aW9ucyJ9CiAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICJmaWxlY3RybCI6ewogICAgICAgICAgICAgICAgICJsYWJlbCI6ICJGaWxlIFNlbGVjdCBPcHRpb25zIiwgInR5cGUiOiAiZm9ybSIsCiAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJMYWJlbCIsICJuYW1lIjogImxhYmVsIn0sCiAgICAgICAgICAgICAgICAgICAgeyJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiTmFtZSIsICJuYW1lIjogIm5hbWUifSwKICAgICAgICAgICAgICAgICAgICB7Imh0bWx0eXBlIjogInRleHQiLCAidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJPYmplY3QgbmFtZSIsICJuYW1lIjogIm9iamVjdE5hbWUifQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgImNvbmRpdGlvbiI6IHsKICAgICAgICAgICAgICAgICJsYWJlbCI6ICJDb25kaXRpb24gb3B0aW9ucyIsICJ0eXBlIjogImNvbmRpdGlvbiIsICJuYW1lIjogImNvbmRpdGlvbiIsICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgeyJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiTGFiZWwiLCAibmFtZSI6ICJsYWJlbCJ9LAogICAgICAgICAgICAgICAgICAgIHsiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIk5hbWUiLCAibmFtZSI6ICJuYW1lIn0sCiAgICAgICAgICAgICAgICAgICAgeyJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiRXhwcmVzc2lvbiIsICJuYW1lIjogImV4cHJlc3Npb24ifQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgeyJodG1sdHlwZSI6ICJ0ZXh0IiwgInR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiTGFiZWwiLCAibmFtZSI6ICJsYWJlbCJ9LAogICAgICAgICAgICAgICAgICAgIHsiaHRtbHR5cGUiOiAidGV4dCIsICJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIk5hbWUiLCAibmFtZSI6ICJuYW1lIn0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgICRzY29wZS50b29sc0xpc3QgPSBbCiAgICAgICAgICAgIHtsYWJlbDogJ0lucHV0JywgdHlwZTogImlucHV0In0sCiAgICAgICAgICAgIHtsYWJlbDogJ1N0YXRpYycsIHR5cGU6ICJzdGF0aWMiLCBvcHRpb25zOiB7InZhbHVlIjogIiJ9fSwKICAgICAgICAgICAge2xhYmVsOiAnVGV4dCBBcmVhJywgdHlwZTogInRleHRhcmVhIiwgb3B0aW9uczoge319LAogICAgICAgICAgICB7bGFiZWw6ICdDb2RlIGVkaXRvcicsIHR5cGU6ICJjb2RlZWRpdG9yIiwgb3B0aW9uczoge319LAogICAgICAgICAgICB7IGxhYmVsOiAnU2VsZWN0JywgdHlwZTogJ3NlbGVjdCcsIG9wdGlvbnM6IHtjaG9pY2VzOiBbCiAgICAgICAgICAgICAgICB7J3ZhbHVlJzogJ29wdGlvbjEnLCAnbGFiZWwnOiAnb3B0aW9uMSd9LAogICAgICAgICAgICAgICAgeyd2YWx1ZSc6ICdvcHRpb24yJywgJ2xhYmVsJzogJ29wdGlvbjInfQogICAgICAgICAgICBdfX0sCiAgICAgICAgICAgIHsgbGFiZWw6ICdDaGVja2JveCcsIHR5cGU6ICdjaGVja2JveCcsIG9wdGlvbnM6IHt9fSwKICAgICAgICAgICAgeyBsYWJlbDogJ09wdGlvbnMnLCB0eXBlOiAncmFkaW9ncm91cCcsIG9wdGlvbnM6IHsgY2hvaWNlczogWwogICAgICAgICAgICAgICAgeyd2YWx1ZSc6ICdvcHRpb24xJywgJ2xhYmVsJzogJ29wdGlvbjEnfSwKICAgICAgICAgICAgICAgIHsndmFsdWUnOiAnb3B0aW9uMicsICdsYWJlbCc6ICdvcHRpb24yJ30KICAgICAgICAgICAgXX19LAogICAgICAgICAgICB7ImxhYmVsIjoiRmlsZSBzZWxlY3QiLCAidHlwZSI6ImZpbGVjdHJsIn0sCiAgICAgICAgICAgIHtsYWJlbDogJ0dyb3VwJywgdHlwZTogImNvbXBvc2l0ZSIsIG9wdGlvbnM6IHt9LCBmaWVsZHM6IFtdfSwKICAgICAgICAgICAge2xhYmVsOiAnQXJyYXknLCB0eXBlOiAiYXJyYXkiLCBvcHRpb25zOiB7fSwgZmllbGRzOiBbXX0sCiAgICAgICAgICAgIHtsYWJlbDogJ0xvb2t1cCcsIHR5cGU6ICJsb29rdXAiLCBvcHRpb25zOiB7fSwgZmllbGRzOiBbXX0sCiAgICAgICAgICAgIHsibGFiZWwiOiAiQ29uZGl0aW9uIiwgInR5cGUiOiAiY29uZGl0aW9uIiwgZmllbGRzOiBbXSwgZWxzZWZpZWxkczogW119CiAgICAgICAgXTsKCiAgICAgICAgJHNjb3BlLmNvbXBvbmVudHMgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIFtdLCAkc2NvcGUudG9vbHNMaXN0KTsKCiAgICAgICAgJHNjb3BlLmZvcm0gPSB7CiAgICAgICAgICAgICJ0aXRsZSI6ICJVbnRpdGxlZCBmb3JtIiwKICAgICAgICAgICAgInR5cGUiOiAiZm9ybSIsCiAgICAgICAgICAgICJvbnN1Y2Nlc3MiOiB7InR5cGUiOiAibWVzc2FnZSIsICJ2YWx1ZSI6ICJUaGFuayB5b3UifSwKICAgICAgICAgICAgImZpZWxkcyI6IFtdCiAgICAgICAgfTsKCgogICAgICAgICRzY29wZS5mb3JtSWQgPSAkcm91dGVQYXJhbXMuZm9ybUlkOwogICAgICAgICRzY29wZS5hcHBQYXRoID0gJHJvdXRlUGFyYW1zLmFwcFBhdGg7CiAgICAgICAgJHNjb3BlLml0ZW1Db25maWdOYW1lID0gImZvcm1jb25maWdvYmplY3QiOwoKICAgICAgICAkc2NvcGUuY2xlYXJFcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJHNjb3BlLmhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSAiIjsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1c19kYXRhID0gIiI7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvciA9IGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgJHNjb3BlLmhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1c19kYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnByb2Nlc3NGb3JtID0gZnVuY3Rpb24gKGZvcm0pIHsKICAgICAgICAgICAgaWYgKCFmb3JtLm9uc3VjY2VzcykgewogICAgICAgICAgICAgICAgZm9ybS5vbnN1Y2Nlc3MgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc2NvcGUuZm9ybSA9IGZvcm07CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICgkc2NvcGUuZm9ybUlkKSB7CiAgICAgICAgICAgICAgICB2YXIgYXBwUGF0aCA9ICRzY29wZS5hcHBQYXRoOwoKICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldEFwcFNldHRpbmdzKGFwcFBhdGgsICRzY29wZS5pdGVtQ29uZmlnTmFtZSwgZnVuY3Rpb24gKG9iamVjdE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9ICcvc2VydmljZS8nICsgb2JqZWN0TmFtZSArICcvJyArICRzY29wZS5mb3JtSWQgKyAnLyc7CgogICAgICAgICAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCh1cmwsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NGb3JtKGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3Ioc3RhdHVzLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJHNjb3BlLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRlc3QgZm9ybSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZm9ybSIsCiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFtdCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnNvcnRpbmdMb2cgPSBbXTsKCiAgICAgICAgJHNjb3BlLnNvcnRhYmxlT3B0aW9ucyA9IHsKICAgICAgICAgICAgY29ubmVjdFdpdGg6ICIuYXBwcy1jb250YWluZXIiLAogICAgICAgICAgICBwbGFjZWhvbGRlcjogImJlaW5nRHJhZ2dlZCIsCiAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uIChlLCB1aSkgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBmaXJzdCBjb250YWluZXIKICAgICAgICAgICAgICAgIGlmICgkKGUudGFyZ2V0KS5oYXNDbGFzcygnZmlyc3QnKSAmJgogICAgICAgICAgICAgICAgICAgIHVpLml0ZW0uc29ydGFibGUuZHJvcHRhcmdldCAmJgogICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0ICE9IHVpLml0ZW0uc29ydGFibGUuZHJvcHRhcmdldFswXSkgewogICAgICAgICAgICAgICAgICAgIC8vIGNsb25lIHRoZSBvcmlnaW5hbCBtb2RlbCB0byByZXN0b3JlIHRoZSByZW1vdmVkIGl0ZW0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY29tcG9uZW50cyA9IGpRdWVyeS5leHRlbmQodHJ1ZSwgW10sICRzY29wZS50b29sc0xpc3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKGUsIHVpKXsKICAgICAgICAgICAgICAgIHZhciBzY29wZSA9IHVpLml0ZW0uc2NvcGUoKTsKICAgICAgICAgICAgICAgIGlmKHNjb3BlKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdEl0ZW0oc2NvcGUuY29tcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuc29ydGFibGVUb29sc09wdGlvbnMgPSAkc2NvcGUuc29ydGFibGVPcHRpb25zOwoKICAgICAgICAkc2NvcGUuZ2V0VmlldyA9IGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlID09ICJmb3JtIikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29tcG9zaXRlLWZpZWxkLmh0bWwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgKyAiLWZpZWxkLmh0bWwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5yZW1vdmVJdGVtID0gZnVuY3Rpb24gKGZpZWxkcywgaW5kZXgpIHsKICAgICAgICAgICAgZmllbGRzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmluc2VydEl0ZW0gPSBmdW5jdGlvbiAoZmllbGRzLCBpbmRleCwgZGF0YSkgewogICAgICAgICAgICBmaWVsZHMuc3BsaWNlKGluZGV4LCAwLCBkYXRhKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuc2VsZWN0VGFiID0gZnVuY3Rpb24gKHRhYikgewogICAgICAgICAgICAkc2NvcGUuYWN0aXZlVGFiID0gdGFiOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5zYXZlRm9ybSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJHNjb3BlLmNsZWFyRXJyb3IoKTsKICAgICAgICAgICAgJHNjb3BlLnJlc3VsdCA9IG51bGw7CiAgICAgICAgICAgIHZhciBmb3JtX2lkID0gJHNjb3BlLmZvcm0uX2lkOwoKICAgICAgICAgICAgdmFyIGFwcFBhdGggPSAkc2NvcGUuYXBwUGF0aDsKICAgICAgICAgICAgc2V0dGluZ3MuZ2V0QXBwU2V0dGluZ3MoYXBwUGF0aCwgJHNjb3BlLml0ZW1Db25maWdOYW1lLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKG9iamVjdE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gJy9zZXJ2aWNlLycgKyBvYmplY3ROYW1lICsgJy8nOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybV9pZCkgewogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBmb3JtX2lkOwogICAgICAgICAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLnB1dCh1cmwsICRzY29wZS5mb3JtLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZXN1bHQgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQubm90aWZ5KCJGb3JtIHVwZGF0ZWQiLCAic3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLnBvc3QodXJsLCAkc2NvcGUuZm9ybSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucmVzdWx0ID0gZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZm9ybS5faWQgPSBKU09OLnBhcnNlKGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQubm90aWZ5KCJGb3JtIHNhdmVkIiwgInN1Y2Nlc3MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihzdGF0dXMsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5nZXRDb25maWd1cmF0aW9uKCk7CiAgICB9XSk7')
},
{
'name': '/app/lib/cosmos/js/controllers/FileUploadCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKY29udHJvbGxlcnMuY29udHJvbGxlcignRmlsZVVwbG9hZEN0cmwnLCBbJyRzY29wZScsICckbW9kYWwnLCAnJHJvdXRlUGFyYW1zJywgJ0Nvc21vc1NlcnZpY2UnLAogICAgZnVuY3Rpb24gKCRzY29wZSwgJG1vZGFsLCAkcm91dGVQYXJhbXMsIENvc21vc1NlcnZpY2UpIHsKCiAgICAgICAgJHNjb3BlLmZpbGVPYmplY3ROYW1lID0gJHJvdXRlUGFyYW1zLmZpbGVPYmplY3ROYW1lOwoKICAgICAgICAkc2NvcGUuc2V0QWN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGRvY3VtZW50LnVwbG9hZEZvcm0uYWN0aW9uID0gIi9ncmlkZnMvIiArICRzY29wZS5maWxlT2JqZWN0TmFtZSArICIvIjsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuY2xlYXJFcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJHNjb3BlLmhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSAiIjsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1c19kYXRhID0gIiI7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvciA9IGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgJHNjb3BlLmhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1c19kYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnVwbG9hZGVkX2ZpbGVzID0gWwogICAgICAgICAgICB7ImZpbGVfaWQiOiAidGVzdCJ9CiAgICAgICAgXTsKCiAgICAgICAgJHNjb3BlLm9uRmlsZVVwbG9hZExvYWRlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlVGV4dCA9IHRoaXMuY29udGVudERvY3VtZW50LmJvZHkuaW5uZXJUZXh0OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlVGV4dCkgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwb25zZVRleHQpLl9kKTsKICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCh2YWx1ZXMsIGZ1bmN0aW9uIChkYXRhLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICRzY29wZS51cGxvYWRlZF9maWxlcy5wdXNoKGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGlmcmFtZSBjb250cm9sCiAgICAgICAgICAgICQoJyNzdWJtaXQtaWZyYW1lJykucmVtb3ZlKCk7CiAgICAgICAgICAgIGpRdWVyeSgiI2ZpbGVMaXN0IikuZW1wdHkoKTsKICAgICAgICAgICAgalF1ZXJ5KCIjZmlsZUxpc3QiKS5hcHBlbmQoalF1ZXJ5KCc8aW5wdXQgY2xhc3M9ImZpbGUtc2VsZWN0b3IiIG5hbWU9InVwbG9hZGVkZmlsZSIgdHlwZT0iZmlsZSIgb25jaGFuZ2U9ImFuZ3VsYXIuZWxlbWVudCh0aGlzKS5zY29wZSgpLmZpbGVOYW1lQ2hhbmdlZCgpIiAvPicpKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUudXBsb2FkRmlsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgalF1ZXJ5KCIjaUZyYW1lUGxhY2Vob2xkZXIiKS5odG1sKCI8aWZyYW1lIG5hbWU9J3N1Ym1pdC1pZnJhbWUnIGlkPSdzdWJtaXQtaWZyYW1lJyBzdHlsZT0nZGlzcGxheTogbm9uZTsnPjwvaWZyYW1lPiIpOwoKICAgICAgICAgICAgalF1ZXJ5KCIjc3VibWl0LWlmcmFtZSIpLmxvYWQoJHNjb3BlLm9uRmlsZVVwbG9hZExvYWRlZCk7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1cGxvYWRGb3JtIikuc3VibWl0KCk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmZpbGVOYW1lQ2hhbmdlZCA9IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgdmFyIGVtcHR5Rm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGpRdWVyeSgiI2ZpbGVMaXN0IikuY2hpbGRyZW4oKSwgZnVuY3Rpb24gKGRhdGEsIGluZGV4KSB7CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEudmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eUZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoIWVtcHR5Rm91bmQpIHsKICAgICAgICAgICAgICAgIGpRdWVyeSgiI2ZpbGVMaXN0IikuYXBwZW5kKGpRdWVyeSgnPGlucHV0IGNsYXNzPSJmaWxlLXNlbGVjdG9yIiBuYW1lPSJ1cGxvYWRlZGZpbGUiIHR5cGU9ImZpbGUiIG9uY2hhbmdlPSJhbmd1bGFyLmVsZW1lbnQodGhpcykuc2NvcGUoKS5maWxlTmFtZUNoYW5nZWQoKSIgLz4nKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUucmVtb3ZlRmlsZSA9IGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICB2YXIgZmlsZSA9ICRzY29wZS51cGxvYWRlZF9maWxlc1tpbmRleF07CiAgICAgICAgICAgIGlmIChjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBmaWxlICcgKyBmaWxlLmZpbGVuYW1lICsgJz8nKSkgewogICAgICAgICAgICAgICAgdmFyIGZpbGVfaWQgPSBmaWxlLmZpbGVfaWQ7CiAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmRlbGV0ZSgnL2dyaWRmcy8nICsgJHNjb3BlLmZpbGVPYmplY3ROYW1lICsgJy8nICsgZmlsZV9pZCArICcvJywgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVwbG9hZGVkX2ZpbGVzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmdldEZpbGVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCgnL2dyaWRmcy8nICsgJHNjb3BlLmZpbGVPYmplY3ROYW1lICsgJy8nLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICRzY29wZS51cGxvYWRlZF9maWxlcyA9IGRhdGE7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuZ2V0RmlsZXMoKTsKICAgIH1dKTs=')
},
{
'name': '/app/lib/cosmos/js/controllers/TerminalCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKY29udHJvbGxlcnMuY29udHJvbGxlcignVGVybWluYWxDdHJsJywgWyckc2NvcGUnLCAnJG1vZGFsJywgJyRyb3V0ZVBhcmFtcycsICdDb3Ntb3NTZXJ2aWNlJywgZnVuY3Rpb24gKCRzY29wZSwgJG1vZGFsLCAkcm91dGVQYXJhbXMsIENvc21vc1NlcnZpY2UpIHsKICAgICRzY29wZS5zZXJ2aWNlID0gIi9zZXJ2aWNlLyI7CiAgICAkc2NvcGUuY29sdW1ucyA9ICIiOwogICAgJHNjb3BlLmZpbHRlciA9ICIiOwogICAgJHNjb3BlLmRhdGEgPSAiIjsKICAgICRzY29wZS5yZXN1bHQgPSAiIjsKICAgICRzY29wZS5zdGF0dXMgPSAiIjsKICAgICRzY29wZS5zdGF0dXNfZGF0YSA9ICIiOwoKICAgICRzY29wZS5jbGVhckVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICRzY29wZS5oYXNFcnJvciA9IGZhbHNlOwogICAgICAgICRzY29wZS5zdGF0dXMgPSAiIjsKICAgICAgICAkc2NvcGUuc3RhdHVzX2RhdGEgPSAiIjsKICAgIH07CgogICAgJHNjb3BlLnByb2Nlc3NSZXN1bHQgPSBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICRzY29wZS5yZXN1bHQgPSBKU09OLnN0cmluZ2lmeShkYXRhLCB1bmRlZmluZWQsIDQpCiAgICB9OwoKICAgICRzY29wZS5jbGVhclJlc3VsdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkc2NvcGUuaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICAkc2NvcGUucmVzdWx0ID0gIiI7CiAgICAgICAgJHNjb3BlLnN0YXR1cyA9ICIiOwogICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9ICIiOwogICAgfTsKCiAgICAkc2NvcGUucHJvY2Vzc0Vycm9yID0gZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICRzY29wZS5oYXNFcnJvciA9IHRydWU7CiAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAkc2NvcGUuc3RhdHVzX2RhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKICAgIH07CgogICAgJHNjb3BlLmdldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkc2NvcGUuY2xlYXJSZXN1bHQoKTsKICAgICAgICB2YXIgdXJsID0gJHNjb3BlLnNlcnZpY2U7CiAgICAgICAgdmFyIHF1ZXJ5U3RhcnRlZCA9IGZhbHNlOwogICAgICAgIGlmICgkc2NvcGUuY29sdW1ucyAmJiAkc2NvcGUuY29sdW1ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHVybCA9IHVybCArICI/Y29sdW1ucz0iICsgJHNjb3BlLmNvbHVtbnM7CiAgICAgICAgICAgIHF1ZXJ5U3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICgkc2NvcGUuZmlsdGVyICYmICRzY29wZS5maWx0ZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgICBpZiAocXVlcnlTdGFydGVkKSB7CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAiJmZpbHRlcj0iICsgJHNjb3BlLmZpbHRlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHVybCA9IHVybCArICI/ZmlsdGVyPSIgKyAkc2NvcGUuZmlsdGVyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCh1cmwsIGZ1bmN0aW9uIChyZXR1cm5lZERhdGEpIHsKICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzUmVzdWx0KHJldHVybmVkRGF0YSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9OwoKICAgICRzY29wZS5wb3N0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICRzY29wZS5jbGVhclJlc3VsdCgpOwogICAgICAgIHZhciB1cmwgPSAkc2NvcGUuc2VydmljZTsKICAgICAgICBDb3Ntb3NTZXJ2aWNlLnBvc3QodXJsLCAkc2NvcGUuZGF0YSwgZnVuY3Rpb24gKHJldHVybmVkRGF0YSkgewogICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NSZXN1bHQocmV0dXJuZWREYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH07CgogICAgJHNjb3BlLnB1dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkc2NvcGUuY2xlYXJSZXN1bHQoKTsKICAgICAgICB2YXIgdXJsID0gJHNjb3BlLnNlcnZpY2U7CiAgICAgICAgQ29zbW9zU2VydmljZS5wdXQodXJsLCAkc2NvcGUuZGF0YSwgZnVuY3Rpb24gKHJldHVybmVkRGF0YSkgewogICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NSZXN1bHQocmV0dXJuZWREYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH07CgogICAgJHNjb3BlLmRlbGV0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkc2NvcGUuY2xlYXJSZXN1bHQoKTsKICAgICAgICB2YXIgdXJsID0gJHNjb3BlLnNlcnZpY2U7CiAgICAgICAgQ29zbW9zU2VydmljZS5kZWxldGUodXJsLCBmdW5jdGlvbiAocmV0dXJuZWREYXRhKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc1Jlc3VsdChyZXR1cm5lZERhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfTsKfV0pCjs=')
},
{
'name': '/app/lib/cosmos/js/controllers/ItemDesignCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTEvMjgvMTQuCiAqLwoKY29udHJvbGxlcnMuY29udHJvbGxlcignSXRlbURlc2lnbkN0cmwnLCBbJyRzY29wZScsICckcm91dGVQYXJhbXMnLCAnJHRlbXBsYXRlQ2FjaGUnLCAnJG1vZGFsJywgJ0Nvc21vc1NlcnZpY2UnLCdjb3Ntb3Muc2V0dGluZ3MnLCAnZ2xvYmFsaGFzaHRhYmxlJywKICAgIGZ1bmN0aW9uICgkc2NvcGUsICRyb3V0ZVBhcmFtcywgJHRlbXBsYXRlQ2FjaGUsICRtb2RhbCwgQ29zbW9zU2VydmljZSwgc2V0dGluZ3MsIGdsb2JhbGhhc2h0YWJsZSkgewoKICAgICAgICAkc2NvcGUuaW5pdEZvcm1zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICRzY29wZS53aWRnZXRFZGl0b3JGb3JtID0gewogICAgICAgICAgICAgICAgIm5hbWUiOiAid2lkZ2V0RWRpdG9yIiwKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXaWRnZXQgZWRpdG9yIiwKICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiTmFtZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY29kZWVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInRlbXBsYXRlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidHlwZSI6ImZvcm0iCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgd2lkZ2V0SXRlbUNvbmZpZ05hbWUgPSAkc2NvcGUuZ2V0SXRlbUNvbmZpZ05hbWUoIndpZGdldCIpOwogICAgICAgICAgICB2YXIgd2lkZ2V0T2JqZWN0bmFtZSAgPSBzZXR0aW5ncy5nZXRBcHBTZXR0aW5nc0J5QXBwKCRzY29wZS5hcHAsIHdpZGdldEl0ZW1Db25maWdOYW1lKTsKICAgICAgICAgICAgdmFyIHdpZGdldHNMb2FkZXJVcmwgPSIvc2VydmljZS8iK3dpZGdldE9iamVjdG5hbWUrIj9jb2x1bW5zPW5hbWUiOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgdmFyIHBhZ2VJdGVtQ29uZmlnTmFtZSA9ICRzY29wZS5nZXRJdGVtQ29uZmlnTmFtZSgicGFnZSIpOwogICAgICAgICAgICB2YXIgcGFnZU9iamVjdG5hbWUgID0gc2V0dGluZ3MuZ2V0QXBwU2V0dGluZ3NCeUFwcCgkc2NvcGUuYXBwLCBwYWdlSXRlbUNvbmZpZ05hbWUpOwogICAgICAgICAgICB2YXIgcGFnZUxvYWRlclVybCA9Ii9zZXJ2aWNlLyIrcGFnZU9iamVjdG5hbWUrIj9jb2x1bW5zPXRpdGxlIjsgIC8vVE9ETzogcmVzb2x2ZSBjaGlja2VuIGVnZyBzY2VuYXJpbwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgJHNjb3BlLmxpc3RFZGl0b3JGb3JtID0gewogICAgICAgICAgICAgICAgIm5hbWUiOiAibGlzdGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgInRpdGxlIjogIkxpc3QgY29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAidHlwZSI6ImZvcm0iLAogICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAidGl0bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiVGl0bGUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAib2JqZWN0TmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJPYmplY3QgbmFtZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhbGxvd1VzZXJGaWx0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQWxsb3cgdXNlciBtb2RpZmlhYmxlIHNlcnZlciBmaWx0ZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiYWxsb3dDbGllbnRGaWx0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQWxsb3cgc2VhcmNoIG9uIGNsaWVudCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJmaWx0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiRmlsdGVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiJ1c2VRdWVyeUZpbHRlclBhcmFtIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOnt9LAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQWNjZXB0IHF1ZXJ5IHBhcmFtZXRlciBhcyBmaWx0ZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImxvb2t1cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmVWYWx1ZU9ubHkiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvb2t1cHMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJsIjogd2lkZ2V0c0xvYWRlclVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZiI6ICJ3aWRnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9va3VwbmFtZSI6ICJUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIm5hbWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWRlUmVmVHlwZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAid2lkZ2V0TmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJMaXN0IFdpZGdldCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAidGl0bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJUaXRsZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJOYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJsb29rdXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2F2ZVZhbHVlT25seSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb29rdXBzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmwiOiB3aWRnZXRzTG9hZGVyVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWYiOiAid2lkZ2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9va3VwbmFtZSI6ICJUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJuYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZVJlZlR5cGUiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ3aWRnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJXaWRnZXQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInNob3dJbkxpc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJTaG93IGluIGxpc3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29sdW1ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJDb2x1bW5zIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRzY29wZS5tZW51RWRpdG9yRm9ybSA9IHsKICAgICAgICAgICAgICAgICJuYW1lIjogIm1lbnVlZGl0b3IiLAogICAgICAgICAgICAgICAgInRpdGxlIjogIk1lbnUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQnJhbmQgdGl0bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImJyYW5kdGl0bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkJyYW5kIGxpbmsiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImJyYW5kaHJlZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm5hdnR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaG9pY2VzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogInRvcGZpeGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlRvcCBmaXhlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogInNpZGViYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiU2lkZSBiYXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaG9pY2VzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJtZW51aXRlbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkxpbmsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJpbmxpbmV3aWRnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJJbmxpbmUgd2lkZ2V0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ0eXBlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlNldCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIldpZGdldCB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNvZGVlZGl0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAid2lkZ2V0dGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbHNlZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAibGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJMaW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImhyZWYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cHJlc3Npb24iOiAiJHBhcmVudC5kLnR5cGUgPT09ICdpbmxpbmV3aWRnZXQnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQ1NTIENsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY3NzY2xhc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiTWVudSBpdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZmllbGRzIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidHlwZSI6ICJmb3JtIgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJHNjb3BlLnNpbmdsZWl0ZW1jb25maWdFZGl0b3JGb3JtID0gewogICAgICAgICAgICAgICAgIm5hbWUiOiAic2luZ2xlaXRlbXZpZXdmb3JtIiwKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaW5nbGUgaXRlbSB2aWV3IiwKICAgICAgICAgICAgICAgICJ0eXBlIjogImZvcm0iLAogICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJQYWdlIElkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJwYWdlSWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIk9iamVjdCBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJvYmplY3ROYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImNvbHVtbnMiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJHNjb3BlLmNoYXJ0Y29uZmlnRWRpdG9yRm9ybSA9IHsKICAgICAgICAgICAgICAgICJuYW1lIjogImNoYXJ0Q29uZmlnRm9ybSIsCiAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2hhcnQgRWRpdG9yIiwKICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInRpdGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlRpdGxlIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm9iamVjdE5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiT2JqZWN0IG5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOnRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJmaWx0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiRmlsdGVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInVzZVF1ZXJ5RmlsdGVyUGFyYW0iLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQWNjZXB0IHF1ZXJ5IHBhcmFtZXRlciBhcyBmaWx0ZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiTmFtZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJjb2x1bW5zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkNvbHVtbnMiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJDaGFydCB0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvaWNlcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJiYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQmFyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAibGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJMaW5lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAicGllIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlBpZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImNoYXJ0VHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInBpZWNvbXBvbmVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ2YWx1ZUZpZWxkTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJWYWx1ZSBmaWVsZCBuYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZ3JvdXBGaWVsZE5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiR3JvdXAgZmllbGQgbmFtZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlBpZSBDaGFydCBjb21wb25lbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVsc2VmaWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY29uZGl0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImV4cHJlc3Npb24iOiAiJHBhcmVudC4kcGFyZW50LnZhbC5jaGFydFR5cGUgPT09ICdwaWUnIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJiYXJsaW5lY2hhcnRjb21wIiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiWCBBeGlzIEZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAieEF4aXNGaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiWSBBeGlzIEZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAieUF4aXNGaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiWSBBeGlzIFRpdGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAieUF4aXNUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQmFyL0xpbmUgY2hhcnQgY29tcG9uZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbHNlZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJleHByZXNzaW9uIjogIiRwYXJlbnQuJHBhcmVudC52YWwuY2hhcnRUeXBlID09PSAnYmFyJyB8fCAkcGFyZW50LiRwYXJlbnQudmFsLmNoYXJ0VHlwZSA9PT0gJ2xpbmUnIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJiYXJjb21wIiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiVGljcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInRpY3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlRpY3MgbW9kaWZpZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ0aWNzX21vZGlmaWVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkJhciBzZXBhcmF0b3Igd2lkdGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJiYXJTZXBhcmF0b3JXaWR0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJCYXIgY2hhcnQgY29tcG9uZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbHNlZmllbGRzIjogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJleHByZXNzaW9uIjogIiRwYXJlbnQuJHBhcmVudC52YWwuY2hhcnRUeXBlID09PSAnYmFyJyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkNoYXJ0IHdpZHRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ3aWR0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJDaGFydCBoZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImhlaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlRvcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInRvcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJMZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJSaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNvbXBvc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm1hcmdpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJNYXJnaW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJvbnN1Y2Nlc3MiOiB7fSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImZvcm0iCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkc2NvcGUuaW50ZXJjZXB0b3JFZGl0b3JGb3JtID0gewogICAgICAgICAgICAgICAgInRpdGxlIjoiRWRpdCBpbnRlcmNlcHRvciIsCiAgICAgICAgICAgICAgICAibmFtZSI6ImludGVyY2VwdG9yRWRpdG9yIiwKICAgICAgICAgICAgICAgICJ0eXBlIjoiZm9ybSIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjpbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiT2JqZWN0IG5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm9iamVjdF9uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIk1vZHVsZSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJpbnRlcmNlcHRvcl9tb2R1bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiRnVuY3Rpb24gbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiaW50ZXJjZXB0b3JfbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IkludGVyY2VwdG9yIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6InJhZGlvZ3JvdXAiLAogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNob2ljZXMiOlsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIjowLCJsYWJlbCI6IlByZS1wcm9jZXNzb3IiLCAibmFtZSI6InByZXByb2Nlc3NvciJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOjEsImxhYmVsIjoiUG9zdC1wcm9jZXNzb3IiLCAibmFtZSI6InBvc3Rwcm9jZXNzb3IifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ImludGVyY2VwdG9yX3R5cGUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJGb3IgYWNjZXNzIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImFjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjp7InByaW1pdGl2ZSI6IHRydWV9LAogICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjpbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkFjY2VzcyB0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvaWNlcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOiAiSU5TRVJUIiwgImxhYmVsIjogIkluc2VydCJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJSRUFEIiwgImxhYmVsIjogIlJlYWQifSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOiAiV1JJVEUiLCAibGFiZWwiOiAiV3JpdGUifSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidmFsdWUiOiAiREVMRVRFIiwgImxhYmVsIjogIkRlbGV0ZSJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSI6ICJTRUFSQ0giLCAibGFiZWwiOiAiU2VhcmNoIn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImFjY2Vzc19uYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJHNjb3BlLmFwcGVuZHBvaW50RWRpdG9yRm9ybSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IkVkaXQgZW5kcG9pbnQiLAogICAgICAgICAgICAgICAgIm5hbWUiOiJhcHBlbmRwb2ludEVkaXRvciIsCiAgICAgICAgICAgICAgICAidHlwZSI6ImZvcm0iLAogICAgICAgICAgICAgICAgImZpZWxkcyI6WwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlVSSSBQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ1cmlfcGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJIYW5kbGVyIG1vZHVsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiaGFuZGxlcl9tb2R1bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiSGFuZGxlciBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJoYW5kbGVyX25hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJHNjb3BlLmFwcEVkaXRvckZvcm0gPSB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJhcHBsaWNhdGlvbiIsCiAgICAgICAgICAgICAgICAidGl0bGUiOiAiQXBwbGljYXRpb24iLAogICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlRpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInRpdGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJQYXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJwYXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJWZXJzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ2ZXJzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJDb250YWN0IGVtYWlsIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJjb250YWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogImVtYWlsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQXV0aG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhdXRob3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIldlYnNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIndlYnNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiaHRtbHR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkNvcHlyaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29weXJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJMaWNlbnNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJsaWNlbnNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiSW5kZXggcGFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibG9va3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmVWYWx1ZU9ubHkiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9va3VwcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJsIjogcGFnZUxvYWRlclVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVmIjogIklkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9va3VwbmFtZSI6ICJJbmRleCBwYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiX2lkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAibGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWRlUmVmVHlwZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImluZGV4UGFnZUlkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJJbmRleCBwYWdlIElkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiaW5kZXhQYWdlSWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJPYmplY3QgbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJvYmplY3ROYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiT2JqZWN0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpbWl0aXZlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAib2JqZWN0cyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkZpbGUgb2JqZWN0IG5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZmlsZU9iamVjdE5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJGaWxlIG9iamVjdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaW1pdGl2ZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImZpbGVfb2JqZWN0cyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIkZpbGUgbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJGaWxlIG5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJTb3VyY2UgZmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaW1pdGl2ZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInNvdXJjZV9jb2RlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiTGlzdCBjb25maWcgb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJsaXN0Y29uZmlnb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiRm9ybSBjb25maWcgb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJmb3JtY29uZmlnb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiTWVudSBjb25maWcgb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJtZW51Y29uZmlnb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiUGFnZSBjb25maWcgb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJwYWdlY29uZmlnb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiQ2hhcnQgY29uZmlnIG9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnB1dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY2hhcnRjb25maWdvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWx0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJTaW5nbGUgaXRlbSBjb25maWcgb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzaW5nbGVpdGVtY29uZmlnb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sdHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiT2JqZWN0IG1hcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY29tcG9zaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm9iamVjdG1hcCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogIlNldHRpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY29tcG9zaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAic2V0dGluZ3MiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJvbnN1Y2Nlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVzc2FnZSIsCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIkFwcGxpY2F0aW9uIGhhcyBiZWVuIHNhdmVkIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJvd25lciI6ICI1NDE1YjRiN2Q3MGFmM2UyMDc4ZGYxYzEiLAogICAgICAgICAgICAgICAgIm1vZGlmeXRpbWUiOiAiMjAxNC0xMC0yNiAxOToyMTo0OS43MDc3NDgiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICIvc2VydmljZS9jb3Ntb3MuYXBwbGljYXRpb25zIiwKICAgICAgICAgICAgICAgICJfaWQiOiAiNTQ0YmUzZWZlZGIwNTgzMWJlNzdlNTM0IiwKICAgICAgICAgICAgICAgICJ0eXBlIjogImZvcm0iLAogICAgICAgICAgICAgICAgImNyZWF0ZXRpbWUiOiAiMjAxNC0xMC0yNiAxODoxODoxNi42NzczOTQiCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLml0ZW1UeXBlID0gJHJvdXRlUGFyYW1zLml0ZW1UeXBlOwogICAgICAgICRzY29wZS5hcHBQYXRoID0gJHJvdXRlUGFyYW1zLmFwcFBhdGg7CiAgICAgICAgJHNjb3BlLml0ZW1JZCA9ICRyb3V0ZVBhcmFtcy5pdGVtSWQ7CgogICAgICAgICRzY29wZS53aWRnZXQgPSB7fTsKICAgICAgICAkc2NvcGUuc291cmNlID0ge307CgogICAgICAgICRzY29wZS5jbGVhckVycm9yID0gZnVuY3Rpb24oKXsKCiAgICAgICAgfTsKCgogICAgICAgICRzY29wZS5wcm9jZXNzSXRlbSA9IGZ1bmN0aW9uIChpdGVtVHlwZSwgdmFsdWUpIHsKICAgICAgICAgICAgJHNjb3BlW2l0ZW1UeXBlXSA9IHZhbHVlIHx8IHt9OwogICAgICAgICAgICAkc2NvcGUucmVhZHk9dHJ1ZTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yID0gZnVuY3Rpb24oZGF0YSwgc3RhdHVzKXsKICAgICAgICAgICAgJC5ub3RpZnkoIkVycm9yICIrIHN0YXR1cyArICI6IitkYXRhLCAiZXJyb3IiKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUucHJvY2Vzc1NvdXJjZUZpbGUgPSBmdW5jdGlvbihzb3VyY2VNb2R1bGVFbnRyeSl7CgogICAgICAgICAgICBpZihzb3VyY2VNb2R1bGVFbnRyeSAmJiBzb3VyY2VNb2R1bGVFbnRyeS50eXBlID09PSAiZ3JpZGZpbGUiKXsKICAgICAgICAgICAgICAgIHZhciB1cmwgPSAiL2dyaWRmcy9jb3Ntb3Muc291cmNlZmlsZXMvIitzb3VyY2VNb2R1bGVFbnRyeS5maWxlX2lkKyIvIjsKICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNvdXJjZS5jb2RlID0gZGF0YTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuZ2V0SXRlbUJ5VXJsID0gZnVuY3Rpb24oaXRlbVR5cGUsIHVybCkgewogICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCh1cmwsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NJdGVtKGl0ZW1UeXBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICBpZihpdGVtVHlwZSA9PT0gInNvdXJjZWZpbGVzIil7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzU291cmNlRmlsZShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuZ2V0SXRlbSA9IGZ1bmN0aW9uIChpdGVtVHlwZSwgIGl0ZW1Db25maWdOYW1lKSB7CiAgICAgICAgICAgIGlmICgkc2NvcGUuYXBwUGF0aCAmJiAkc2NvcGUuaXRlbUlkKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbUNvbmZpZ05hbWUgPSAkc2NvcGUuZ2V0SXRlbUNvbmZpZ05hbWUoJHNjb3BlLml0ZW1UeXBlKTsKCiAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBTZXR0aW5ncygkc2NvcGUuYXBwUGF0aCwgaXRlbUNvbmZpZ05hbWUsIGZ1bmN0aW9uIChvYmplY3ROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLycgKyAkc2NvcGUuaXRlbUlkKyIvIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoJHNjb3BlLml0ZW1UeXBlID09PSAid2lkZ2V0IiB8fCAkc2NvcGUuaXRlbVR5cGUgPT09ICJpbnRlcmNlcHRvciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRzY29wZS5pdGVtVHlwZSA9PT0gInNvdXJjZWZpbGVzIiB8fCAkc2NvcGUuaXRlbVR5cGUgPT09ICJhcHBlbmRwb2ludCIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJz9maWx0ZXI9eyJhcHBfaWQiOiInKyRzY29wZS5hcHAuaWQrJyJ9JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0SXRlbUJ5VXJsKGl0ZW1UeXBlLCB1cmwpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHN0YXR1cywgZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgJHNjb3BlLnJlYWR5PXRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuZ2V0SXRlbUNvbmZpZ05hbWUgPSBmdW5jdGlvbihpdGVtVHlwZSl7CiAgICAgICAgICAgIC8vVE9ETzogVXNlIHNldHRpbmdzIGZ1bmN0aW9uCiAgICAgICAgICAgIGlmKGl0ZW1UeXBlID09PSAid2lkZ2V0Iil7CiAgICAgICAgICAgICAgICByZXR1cm4gIndpZGdldG9iamVjdCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoaXRlbVR5cGUgPT09ICJsaXN0Iil7CiAgICAgICAgICAgICAgICByZXR1cm4gImxpc3Rjb25maWdvYmplY3QiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKGl0ZW1UeXBlID09PSAibWVudSIpewogICAgICAgICAgICAgICAgcmV0dXJuICJtZW51Y29uZmlnb2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihpdGVtVHlwZSA9PT0gImNoYXJ0Iil7CiAgICAgICAgICAgICAgICByZXR1cm4gImNoYXJ0Y29uZmlnb2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihpdGVtVHlwZSA9PT0gInNpbmdsZWl0ZW12aWV3Iil7CiAgICAgICAgICAgICAgICByZXR1cm4gInNpbmdsZWl0ZW1jb25maWdvYmplY3QiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihpdGVtVHlwZSA9PT0gImFwcCIpewogICAgICAgICAgICAgICAgcmV0dXJuICJhcHBjb25maWdvYmplY3QiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKGl0ZW1UeXBlID09PSAic291cmNlZmlsZXMiKXsKICAgICAgICAgICAgICAgIHJldHVybiAic291cmNlY29sbmFtZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGl0ZW1UeXBlID09PSAiaW50ZXJjZXB0b3IiKXsKICAgICAgICAgICAgICAgIHJldHVybiAiaW50ZXJjZXB0b3Jjb25pZ29iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGl0ZW1UeXBlID09PSAiYXBwZW5kcG9pbnQiKXsKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwZW5kcG9pbnRjb25pZ29iamVjdCI7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuc2F2ZUl0ZW1XaXRoVXJsID0gZnVuY3Rpb24odXJsKXsKICAgICAgICAgICAgJHNjb3BlLmNsZWFyRXJyb3IoKTsKICAgICAgICAgICAgJHNjb3BlLnJlc3VsdCA9IG51bGw7CgogICAgICAgICAgICBpZiAoJHNjb3BlLml0ZW1JZCkgewogICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJHNjb3BlLml0ZW1JZCArICcvJzsKICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UucHV0KHVybCwgJHNjb3BlWyRzY29wZS5pdGVtVHlwZV0sIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZXN1bHQgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAkLm5vdGlmeSgiVXBkYXRlZCAiICsgJHNjb3BlLml0ZW1UeXBlLCAic3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmKCRzY29wZS5pdGVtVHlwZSA9PT0gIndpZGdldCIgfHwgJHNjb3BlLml0ZW1UeXBlID09PSAiaW50ZXJjZXB0b3IiCiAgICAgICAgICAgICAgICAgICAgfHwgJHNjb3BlLml0ZW1UeXBlID09PSAic291cmNlZmlsZXMiIHx8ICRzY29wZS5pdGVtVHlwZSA9PT0gImFwcGVuZHBvaW50Iil7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlWyRzY29wZS5pdGVtVHlwZV1bImFwcF9pZCJdPSRzY29wZS5hcHAuaWQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgQ29zbW9zU2VydmljZS5wb3N0KHVybCwgJHNjb3BlWyRzY29wZS5pdGVtVHlwZV0sIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZXN1bHQgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaXRlbUlkID0gSlNPTi5wYXJzZShkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5ub3RpZnkoIlNhdmVkICIgKyAkc2NvcGUuaXRlbVR5cGUsICJzdWNjZXNzIik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnNhdmVDb3JlSXRlbSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaXRlbUNvbmZpZ05hbWUgPSAkc2NvcGUuZ2V0SXRlbUNvbmZpZ05hbWUoJHNjb3BlLml0ZW1UeXBlKTsKCiAgICAgICAgICAgIHNldHRpbmdzLmdldEFwcFNldHRpbmdzKCRzY29wZS5hcHBQYXRoLCBpdGVtQ29uZmlnTmFtZSwgZnVuY3Rpb24gKG9iamVjdE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gJy9zZXJ2aWNlLycgKyBvYmplY3ROYW1lICsgJy8nOwogICAgICAgICAgICAgICAgICAgICRzY29wZS5zYXZlSXRlbVdpdGhVcmwodXJsKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5zYXZlU291cmNlRmlsZSA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHZhciBzb3VyY2VNb2R1bGUgPSAkc2NvcGVbInNvdXJjZWZpbGVzIl07CiAgICAgICAgICAgIHZhciBjb2RlID0gJHNjb3BlLnNvdXJjZS5jb2RlOwogICAgICAgICAgICBpZihzb3VyY2VNb2R1bGUgJiYgc291cmNlTW9kdWxlLnR5cGUgPT09ICJncmlkZmlsZSIgJiYgc291cmNlTW9kdWxlLnR5cGUgPT09ICJncmlkZmlsZSIpewogICAgICAgICAgICAgICAgQ29zbW9zU2VydmljZS5zYXZlRmlsZSgiY29zbW9zLnNvdXJjZWZpbGVzIiwgY29kZSwgImNvc21vcy9zb3VyY2UiLCBzb3VyY2VNb2R1bGUuZmlsZW5hbWUsIHNvdXJjZU1vZHVsZS5maWxlX2lkLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc291cmNlZmlsZXMuZmlsZV9pZCA9IGRhdGEuZmlsZV9pZDsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNhdmVDb3JlSXRlbSgpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgJHNjb3BlLnNhdmVDb3JlSXRlbSgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnNhdmVJdGVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoJHNjb3BlLml0ZW1UeXBlID09PSAic291cmNlZmlsZXMiKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuc2F2ZVNvdXJjZUZpbGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRzY29wZS5zYXZlQ29yZUl0ZW0oKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgICRzY29wZS5pbml0QXBwbGljYXRpb24gPSBmdW5jdGlvbigpewogICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBsaWNhdGlvbigkc2NvcGUuYXBwUGF0aCwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChhcHApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbUNvbmZpZ05hbWUgPSAkc2NvcGUuZ2V0SXRlbUNvbmZpZ05hbWUoJHNjb3BlLml0ZW1UeXBlKTsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYXBwID0gYXBwOwogICAgICAgICAgICAgICAgICAgICRzY29wZS5pbml0Rm9ybXMoKTsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0SXRlbSgkc2NvcGUuaXRlbVR5cGUsIGl0ZW1Db25maWdOYW1lKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5pbml0ID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgdmFyIGl0ZW1Db25maWdOYW1lID0gJHNjb3BlLmdldEl0ZW1Db25maWdOYW1lKCRzY29wZS5pdGVtVHlwZSk7CgogICAgICAgICAgICAkc2NvcGUubGlzdCA9IHsiY29sdW1ucyI6W119OwogICAgICAgICAgICAkc2NvcGUubWVudSA9IHsiZmllbGRzIjpbXX07CiAgICAgICAgICAgICRzY29wZS5hcHAgPSB7InNldHRpbmdzIjogeyAic291cmNlX2NvZGUiOiBbXSwib2JqZWN0cyI6IFtdLCJvYmplY3RtYXAiOiB7fSwgImZpbGVfb2JqZWN0cyI6IFtdfX07CiAgICAgICAgICAgICRzY29wZS5zaW5nbGVpdGVtdmlldyA9IHsiY29sdW1ucyI6W119OwogICAgICAgICAgICAkc2NvcGUuc291cmNlZmlsZXMgPSB7InR5cGUiOiJncmlkZmlsZSJ9OwogICAgICAgICAgICAkc2NvcGUuY2hhcnQgPSB7ICJtYXJnaW4iOnt9LCAiY29sdW1ucyI6W119OwogICAgICAgICAgICAkc2NvcGUuaW50ZXJjZXB0b3IgPSB7fTsKICAgICAgICAgICAgJHNjb3BlLmFwcGVuZHBvaW50ID0ge307CgogICAgICAgICAgICBpZigkc2NvcGUuaXRlbVR5cGUgPT09ICJhcHAiKXsKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbUNvbmZpZ05hbWUgPSAkc2NvcGUuZ2V0SXRlbUNvbmZpZ05hbWUoJHNjb3BlLml0ZW1UeXBlKTsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaW5pdEZvcm1zKCk7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldEl0ZW0oJHNjb3BlLml0ZW1UeXBlLCBpdGVtQ29uZmlnTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuaW5pdEFwcGxpY2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfV0pCjs=')
},
{
'name': '/app/lib/cosmos/js/controllers/PageDesignCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTEvMTEvMTQuCiAqLwoKY29udHJvbGxlcnMuY29udHJvbGxlcignUGFnZURlc2lnbkN0cmwnLCBbJyRzY29wZScsICckcm91dGVQYXJhbXMnLCAnJHRlbXBsYXRlQ2FjaGUnLCAnJG1vZGFsJywgJ0Nvc21vc1NlcnZpY2UnLCdjb3Ntb3Muc2V0dGluZ3MnLCAnZ2xvYmFsaGFzaHRhYmxlJywKICAgIGZ1bmN0aW9uICgkc2NvcGUsICRyb3V0ZVBhcmFtcywgJHRlbXBsYXRlQ2FjaGUsICRtb2RhbCwgQ29zbW9zU2VydmljZSwgc2V0dGluZ3MsIGhhc2h0YWJsZSkgewoKICAgICAgICAkc2NvcGUuaGFzaHRhYmxlID0gaGFzaHRhYmxlOwogICAgICAgICRzY29wZS5jb3Ntb3NDdXJyZW50QXBwbGljYXRpb25SZWYgPSAiX0Nvc21vc19DdXJyZW50X0FwcGxpY2F0aW9uXyI7CgoKICAgICAgICAkc2NvcGUuZGVzaWduTW9kZSA9IHRydWU7CiAgICAgICAgJHNjb3BlLmFjdGl2ZVRhYiA9ICJ0b29scyI7CgogICAgICAgICRzY29wZS5zZWxlY3RlZEFwcGxpY2F0aW9uID0gdW5kZWZpbmVkOwoKICAgICAgICAkc2NvcGUub25zdWNjZXNzX3R5cGVzID0gWwogICAgICAgICAgICB7J25hbWUnOiAnbWVzc2FnZScsICd0aXRsZSc6ICdNZXNzYWdlJ30sCiAgICAgICAgICAgIHsnbmFtZSc6ICd1cmwnLCAnbGFiZWwnOiAnUmVkaXJlY3QnfQogICAgICAgIF07CgogICAgICAgICRzY29wZS5pbml0ID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgJCggIiN0b29sYmFyIiApLmRpYWxvZyh7IHBvc2l0aW9uOiB7IG15OiAibGVmdC0yMDAgdG9wIiwgYXQ6ImxlZnQtMjAwIHRvcCIsIG9mOiIifSwgY2xvc2VUZXh0OiAieCJ9KTsKCiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICQoICIjc2V0dGluZ3MiICkuZGlhbG9nKHsgcG9zaXRpb246IHsgbXk6ICJyaWdodC0yMDAgdG9wIiwgYXQ6InJpZ2h0LTIwMCB0b3AiLCBvZjoiIn0sIGNsb3NlVGV4dDogIngifSk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnNlbGVjdEl0ZW0gPSBmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgICAgJHNjb3BlLmFjdGl2ZVRhYiA9ICJzZXR0aW5ncyI7CiAgICAgICAgICAgIHZhciBvcHRpb25Gb3JtID0gJHNjb3BlLm9wdGlvbkZvcm1CeVR5cGVbaXRlbS50eXBlXTsKICAgICAgICAgICAgaWYgKG9wdGlvbkZvcm0pIHsKICAgICAgICAgICAgICAgICRzY29wZS5vcHRpb25zZm9ybSA9IG9wdGlvbkZvcm07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkc2NvcGUub3B0aW9uc2Zvcm0gPSAkc2NvcGUub3B0aW9uRm9ybUJ5VHlwZVsiZGVmYXVsdCJdOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnRvb2xzQWN0aXZlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gJHNjb3BlLmFjdGl2ZVRhYiA9PT0gInRvb2xzIjsKICAgICAgICB9OwogICAgICAgICRzY29wZS5zZXR0aW5nc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuICRzY29wZS5hY3RpdmVUYWIgPT09ICJzZXR0aW5ncyI7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLm9wdGlvbnNmb3JtID0gewogICAgICAgIH07CgogICAgICAgICRzY29wZS5vcHRpb25Gb3JtQnlUeXBlID0gewogICAgICAgICAgICAicGFnZSI6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogImlucHV0IiwgIm5hbWUiOiJ0aXRsZSIsICJsYWJlbCI6ICJUaXRsZSJ9LAogICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjoibG9naW5SZXF1aXJlZCIsICJsYWJlbCI6ICJMb2dpbiByZXF1aXJlZCJ9CgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibWVudXJlZiI6IHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogImNvbXBvc2l0ZSIsICJsYWJlbCI6ICJTZXR0aW5ncyIsICJuYW1lIjogInZhbHVlIiwgZmllbGRzOlsKICAgICAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIk1lbnUgSWQiLCAibmFtZSI6ICJtZW51SWQifQogICAgICAgICAgICAgICAgICAgIF19CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmb3JtcmVmIjogewogICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7InR5cGUiOiAiY29tcG9zaXRlIiwgImxhYmVsIjogIlNldHRpbmdzIiwgIm5hbWUiOiAidmFsdWUiLCBmaWVsZHM6WwogICAgICAgICAgICAgICAgICAgICAgICB7InR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiRm9ybSBJZCIsICJuYW1lIjogImZvcm1JZCJ9CiAgICAgICAgICAgICAgICAgICAgXX0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxpc3RyZWYiOiB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJjb21wb3NpdGUiLCAibGFiZWwiOiAiU2V0dGluZ3MiLCAibmFtZSI6ICJ2YWx1ZSIsIGZpZWxkczpbCiAgICAgICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJMaXN0IElkIiwgIm5hbWUiOiAibGlzdElkIn0KICAgICAgICAgICAgICAgICAgICBdfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAiY2hhcnRyZWYiOiB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJjb21wb3NpdGUiLCAibGFiZWwiOiAiU2V0dGluZ3MiLCAibmFtZSI6ICJ2YWx1ZSIsIGZpZWxkczpbCiAgICAgICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJDaGFydCBJZCIsICJuYW1lIjogImNoYXJ0SWQifQogICAgICAgICAgICAgICAgICAgIF19CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjc3NyZWYiOiB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJocmVmIiwgIm5hbWUiOiAiaHJlZiJ9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJqc3JlZiI6IHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogInNyYyIsICJuYW1lIjogInNyYyJ9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJleHRqc3JlZiI6IHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogInNyYyIsICJuYW1lIjogInNyYyJ9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ3aWRnZXRob3N0IjogewogICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIldpZGdldCBOYW1lIiwgIm5hbWUiOiAidmFsdWUifQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAiY29uZGl0aW9uIjp7CiAgICAgICAgICAgICAgICAibGFiZWwiOiAiQ29uZGl0aW9uIG9wdGlvbnMiLCAidHlwZSI6ImNvbmRpdGlvbiIsICJuYW1lIjoiY29uZGl0aW9uIiwgImZpZWxkcyI6WwogICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJMYWJlbCIsICJuYW1lIjogImxhYmVsIn0sCiAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIk5hbWUiLCAibmFtZSI6ICJuYW1lIn0sCiAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogImlucHV0IiwgImxhYmVsIjogIkV4cHJlc3Npb24iLCAibmFtZSI6ICJleHByZXNzaW9uIn0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImh0bWxibG9jayI6ewogICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIG5hbWU6ImJsb2NrdHlwZSIsIHR5cGU6ICdzZWxlY3QnLCBvcHRpb25zOiB7IGNob2ljZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgeyd2YWx1ZSc6ICdoMScsICdsYWJlbCc6ICdoMSd9LAogICAgICAgICAgICAgICAgICAgICAgICB7J3ZhbHVlJzogJ2gyJywgJ2xhYmVsJzogJ2gyJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIHsndmFsdWUnOiAnaDMnLCAnbGFiZWwnOiAnaDMnfSwKICAgICAgICAgICAgICAgICAgICAgICAgeyd2YWx1ZSc6ICdoNCcsICdsYWJlbCc6ICdoNCd9LAogICAgICAgICAgICAgICAgICAgICAgICB7J3ZhbHVlJzogJ2g1JywgJ2xhYmVsJzogJ2g1J30sCiAgICAgICAgICAgICAgICAgICAgICAgIHsndmFsdWUnOiAncCcsICdsYWJlbCc6ICdwJ30KICAgICAgICAgICAgICAgICAgICBdfX0sCgogICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJjb2RlZWRpdG9yIiwgImxhYmVsIjogIkh0bWwiLCAibmFtZSI6ICJ2YWx1ZSJ9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZWZhdWx0IjogewogICAgICAgICAgICAgICAgImZpZWxkcyI6IFsKICAgICAgICAgICAgICAgICAgICB7InR5cGUiOiAiaW5wdXQiLCAibGFiZWwiOiAiTGFiZWwiLCAibmFtZSI6ICJsYWJlbCJ9LAogICAgICAgICAgICAgICAgICAgIHsidHlwZSI6ICJpbnB1dCIsICJsYWJlbCI6ICJOYW1lIiwgIm5hbWUiOiAibmFtZSJ9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUudG9vbHNMaXN0ID0gWwogICAgICAgICAgICB7bGFiZWw6ICdNZW51JywgdHlwZTogIm1lbnVyZWYifSwKICAgICAgICAgICAge2xhYmVsOiAnRm9ybScsIHR5cGU6ICJmb3JtcmVmIiwgb3B0aW9uczogeyJ2YWx1ZSI6ICIifX0sCiAgICAgICAgICAgIHtsYWJlbDogJ1BhZ2UnLCB0eXBlOiAicGFnZXJlZiIsIG9wdGlvbnM6IHt9fSwKICAgICAgICAgICAge2xhYmVsOiAnTGlzdCcsIHR5cGU6ICJsaXN0cmVmIiwgb3B0aW9uczoge319LAogICAgICAgICAgICB7bGFiZWw6ICdIdG1sJywgdHlwZTogImh0bWxibG9jayIsIG9wdGlvbnM6IHt9fSwKICAgICAgICAgICAge2xhYmVsOiAnMiBDb2x1bW5zJywgdHlwZTogInR3b2NvbHVtbiJ9LAogICAgICAgICAgICB7bGFiZWw6ICczIENvbHVtbnMnLCB0eXBlOiAidGhyZWVjb2x1bW4ifSwKICAgICAgICAgICAge2xhYmVsOiAnQ2hhcnQnLCB0eXBlOiAiY2hhcnRyZWYifSwKICAgICAgICAgICAge2xhYmVsOiAiV2lkZ2V0IiwgdHlwZTogIndpZGdldGhvc3QifSwKICAgICAgICAgICAge2xhYmVsOiAiQ1NTIEZpbGUiLCB0eXBlOiAiY3NzcmVmIn0sCiAgICAgICAgICAgIHtsYWJlbDogIkpTIEZpbGUiLCB0eXBlOiAianNyZWYifSwKICAgICAgICAgICAge2xhYmVsOiAiRXh0ZXJuYWwgSlMgRmlsZSIsIHR5cGU6ICJleHRqc3JlZiJ9CiAgICAgICAgXTsKCiAgICAgICAgJHNjb3BlLmNvbXBvbmVudHMgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIFtdLCAkc2NvcGUudG9vbHNMaXN0KTsKCiAgICAgICAgJHNjb3BlLnBhZ2UgPSB7CiAgICAgICAgICAgICJ0aXRsZSI6ICJVbnRpdGxlZCBwYWdlIiwKICAgICAgICAgICAgInR5cGUiOiAicGFnZSIsCiAgICAgICAgICAgICJvbnN1Y2Nlc3MiOiB7InR5cGUiOiAibWVzc2FnZSIsICJ2YWx1ZSI6ICJUaGFuayB5b3UifSwKICAgICAgICAgICAgImZpZWxkcyI6IFtdCiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnBhZ2VJZCA9ICRyb3V0ZVBhcmFtcy5wYWdlSWQ7CiAgICAgICAgJHNjb3BlLmFwcFBhdGggPSAkcm91dGVQYXJhbXMuYXBwUGF0aDsKCiAgICAgICAgJHNjb3BlLmNsZWFyRXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRzY29wZS5oYXNFcnJvciA9IGZhbHNlOwogICAgICAgICAgICAkc2NvcGUuc3RhdHVzID0gIiI7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9ICIiOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IgPSBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICRzY29wZS5oYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5wcm9jZXNzUGFnZSA9IGZ1bmN0aW9uIChwYWdlKSB7CiAgICAgICAgICAgIGlmICghcGFnZS5vbnN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgIHBhZ2Uub25zdWNjZXNzID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIXBhZ2UudHlwZSl7CiAgICAgICAgICAgICAgICBwYWdlLnR5cGUgPSAicGFnZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNjb3BlLnBhZ2UgPSBwYWdlOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5nZXRDb25maWd1cmF0aW9uQnlVcmwgPSBmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgQ29zbW9zU2VydmljZS5nZXQodXJsLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzUGFnZShkYXRhKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5nZXRQYWdlQ29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCgkc2NvcGUuYXBwUGF0aCB8fCAkc2NvcGUuc2VsZWN0ZWRBcHBsaWNhdGlvbikgJiYgJHNjb3BlLnBhZ2VJZCkgewoKICAgICAgICAgICAgICAgIHZhciBhcHBQYXRoID0gJHNjb3BlLmFwcFBhdGggfHwgJHNjb3BlLnNlbGVjdGVkQXBwbGljYXRpb24ucGF0aDsKCiAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBTZXR0aW5ncyhhcHBQYXRoLCAicGFnZWNvbmZpZ29iamVjdCIsIGZ1bmN0aW9uIChvYmplY3ROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLycgKyAkc2NvcGUucGFnZUlkICsgJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbkJ5VXJsKHVybCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvY29zbW9zLnBhZ2VzLycgKyAkc2NvcGUucGFnZUlkICsgJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbkJ5VXJsKHVybCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKCEkc2NvcGUucGFnZSl7CiAgICAgICAgICAgICAgICAkc2NvcGUucGFnZSA9IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGVzdCBwYWdlIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJwYWdlIiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogW10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJHNjb3BlLmdldFBhZ2VDb25maWd1cmF0aW9uKCk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnNvcnRpbmdMb2cgPSBbXTsKCiAgICAgICAgJHNjb3BlLnNvcnRhYmxlT3B0aW9ucyA9IHsKICAgICAgICAgICAgY29ubmVjdFdpdGg6ICIuYXBwcy1jb250YWluZXIiLAogICAgICAgICAgICBwbGFjZWhvbGRlcjogImJlaW5nRHJhZ2dlZCIsCiAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uIChlLCB1aSkgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBmaXJzdCBjb250YWluZXIKICAgICAgICAgICAgICAgIGlmICgkKGUudGFyZ2V0KS5oYXNDbGFzcygnZmlyc3QnKSAmJgogICAgICAgICAgICAgICAgICAgIHVpLml0ZW0uc29ydGFibGUuZHJvcHRhcmdldCAmJgogICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0ICE9IHVpLml0ZW0uc29ydGFibGUuZHJvcHRhcmdldFswXSkgewogICAgICAgICAgICAgICAgICAgIC8vIGNsb25lIHRoZSBvcmlnaW5hbCBtb2RlbCB0byByZXN0b3JlIHRoZSByZW1vdmVkIGl0ZW0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY29tcG9uZW50cyA9IGpRdWVyeS5leHRlbmQodHJ1ZSwgW10sICRzY29wZS50b29sc0xpc3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKGUsIHVpKXsKICAgICAgICAgICAgICAgIHZhciBzY29wZSA9IHVpLml0ZW0uc2NvcGUoKTsKICAgICAgICAgICAgICAgIGlmKHNjb3BlKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdEl0ZW0oc2NvcGUuY29tcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuc29ydGFibGVUb29sc09wdGlvbnMgPSAkc2NvcGUuc29ydGFibGVPcHRpb25zOwoKICAgICAgICAkc2NvcGUucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChmaWVsZHMsIGluZGV4KSB7CiAgICAgICAgICAgIGZpZWxkcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5pbnNlcnRJdGVtID0gZnVuY3Rpb24gKGZpZWxkcywgaW5kZXgsIGRhdGEpIHsKICAgICAgICAgICAgZmllbGRzLnNwbGljZShpbmRleCwgMCwgZGF0YSk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnNlbGVjdFRhYiA9IGZ1bmN0aW9uICh0YWIpIHsKICAgICAgICAgICAgJHNjb3BlLmFjdGl2ZVRhYiA9IHRhYjsKICAgICAgICB9OwoKICAgICAgICAvL1RPRE86IGhhdmUgYSBzZXJ2aWNlIHRvIHJlbW92ZSBzaW1pbGFyIGZ1bmN0aW9ucwogICAgICAgICRzY29wZS5zYXZlUGFnZVdpdGhVcmwgPSBmdW5jdGlvbih1cmwpewogICAgICAgICAgICAkc2NvcGUuY2xlYXJFcnJvcigpOwogICAgICAgICAgICAkc2NvcGUucmVzdWx0ID0gbnVsbDsKICAgICAgICAgICAgdmFyIHBhZ2VfaWQgPSAkc2NvcGUucGFnZS5faWQ7CgogICAgICAgICAgICBpZiAocGFnZV9pZCkgewogICAgICAgICAgICAgICAgdXJsID0gdXJsICsgcGFnZV9pZCArICcvJzsKICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UucHV0KHVybCwgJHNjb3BlLnBhZ2UsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZXN1bHQgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAkLm5vdGlmeSgiUGFnZSB1cGRhdGVkIiwgInN1Y2Nlc3MiKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLnBvc3QodXJsLCAkc2NvcGUucGFnZSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlc3VsdCA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wYWdlLl9pZCA9IEpTT04ucGFyc2UoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQubm90aWZ5KCJQYWdlIHNhdmVkIiwgInN1Y2Nlc3MiKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuc2F2ZVBhZ2UgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBTZXR0aW5ncygkc2NvcGUuYXBwUGF0aCwgInBhZ2Vjb25maWdvYmplY3QiLCBmdW5jdGlvbiAob2JqZWN0TmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArIG9iamVjdE5hbWUgKyAnLyc7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNhdmVQYWdlV2l0aFVybCh1cmwpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChzdGF0dXMsIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gJy9zZXJ2aWNlL2Nvc21vcy5wYWdlcy8nOwogICAgICAgICAgICAgICAgICAgICRzY29wZS5zYXZlUGFnZVdpdGhVcmwodXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbigpOwogICAgICAgIH0KICAgIH1dKTsKCgo=')
},
{
'name': '/app/lib/cosmos/js/controllers/UsersCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKCmNvbnRyb2xsZXJzLmNvbnRyb2xsZXIoJ1VzZXJzQ3RybCcsIFsnJHNjb3BlJywgJyRtb2RhbCcsICdDb3Ntb3NTZXJ2aWNlJywgZnVuY3Rpb24gKCRzY29wZSwgJG1vZGFsLCBDb3Ntb3NTZXJ2aWNlKSB7CgogICAgJHNjb3BlLmNsZWFyRXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgJHNjb3BlLmhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgJHNjb3BlLnN0YXR1cyA9ICIiOwogICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9ICIiOwogICAgfTsKCiAgICAkc2NvcGUucHJvY2Vzc0Vycm9yID0gZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICRzY29wZS5oYXNFcnJvciA9IHRydWU7CiAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAkc2NvcGUuc3RhdHVzX2RhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKICAgIH07CgogICAgJHNjb3BlLmFkZFVzZXIgPSBmdW5jdGlvbiAoc2l6ZSwgY3VycmVudF91c2VyKSB7CiAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkbW9kYWwub3Blbih7CiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnbGliL2Nvc21vcy9wYXJ0aWFscy9hZGR1c2VyLmh0bWwnLAogICAgICAgICAgICBjb250cm9sbGVyOiAiVXNlck1vZGFsSW5zdGFuY2VDdHJsIiwKICAgICAgICAgICAgc2l6ZTogc2l6ZSwKICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAogICAgICAgICAgICByZXNvbHZlOiB7CiAgICAgICAgICAgICAgICB1c2VyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfdXNlcjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByb2xlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2NvcGUucm9sZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgbW9kYWxJbnN0YW5jZS5yZXN1bHQudGhlbihmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICBpZiAoIXVzZXIuX2lkKSB7CiAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLnBvc3QoJy9zZXJ2aWNlL2Nvc21vcy51c2Vycy8nLCB1c2VyLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0VXNlcnMoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgdXNlcl9pZCA9IHVzZXIuX2lkOwogICAgICAgICAgICAgICAgZGVsZXRlIHVzZXIuX2lkOwogICAgICAgICAgICAgICAgZGVsZXRlIHVzZXIub3duZXI7CiAgICAgICAgICAgICAgICBkZWxldGUgdXNlci51c2VybmFtZTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB1c2VyLmNyZWF0ZXRpbWU7CiAgICAgICAgICAgICAgICBpZiAoIXVzZXIucGFzc3dvcmQpIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgdXNlci5wYXNzd29yZDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLnB1dCgnL3NlcnZpY2UvY29zbW9zLnVzZXJzLycgKyB1c2VyX2lkICsgJy8nLCB1c2VyLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0VXNlcnMoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vJGxvZy5pbmZvKCdNb2RhbCBkaXNtaXNzZWQgYXQ6ICcgKyBuZXcgRGF0ZSgpKTsKICAgICAgICB9KTsKICAgIH07CgogICAgJHNjb3BlLmVkaXRVc2VyID0gZnVuY3Rpb24gKHVzZXJJbmRleCkgewogICAgICAgICRzY29wZS5hZGRVc2VyKCdsZycsICRzY29wZS51c2Vyc1t1c2VySW5kZXhdKTsKICAgIH07CgogICAgJHNjb3BlLnJlbW92ZVVzZXIgPSBmdW5jdGlvbiAodXNlckluZGV4KSB7CiAgICAgICAgdmFyIHVzZXIgPSAkc2NvcGUudXNlcnNbdXNlckluZGV4XTsKCiAgICAgICAgaWYgKGNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHVzZXIgJyArIHVzZXIudXNlcm5hbWUgKyAnPycpKSB7CiAgICAgICAgICAgIHZhciB1c2VyX2lkID0gdXNlci5faWQ7CiAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZGVsZXRlKCcvc2VydmljZS9jb3Ntb3MudXNlcnMvJyArIHVzZXJfaWQgKyAnLycsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdldFVzZXJzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9OwoKICAgICRzY29wZS5nZXRSb2xlcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCgnL3NlcnZpY2UvY29zbW9zLnJiYWMub2JqZWN0LnJvbGUvJywgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICRzY29wZS5yb2xlcyA9IGRhdGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgfSk7CiAgICB9OwoKICAgICRzY29wZS5nZXRSb2xlcygpOwoKICAgICRzY29wZS5nZXRVc2VycyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCgnL3NlcnZpY2UvY29zbW9zLnVzZXJzLycsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUudXNlcnMgPSBkYXRhOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfTsKCiAgICAkc2NvcGUuZ2V0VXNlcnMoKTsKfV0pOwoKY29udHJvbGxlcnMuY29udHJvbGxlcignVXNlck1vZGFsSW5zdGFuY2VDdHJsJywgWyckc2NvcGUnLCAnJG1vZGFsSW5zdGFuY2UnLCAncm9sZXMnLCAndXNlcicsIGZ1bmN0aW9uICgkc2NvcGUsICRtb2RhbEluc3RhbmNlLCByb2xlcywgdXNlcikgewogICAgJHNjb3BlLnVzZXIgPSB1c2VyIHx8IHsidXNlcm5hbWUiOiBudWxsLCAicGFzc3dvcmQiOiBudWxsLCAicGFzc3dvcmRfcmUiOiBudWxsLCAiZW1haWwiOiBudWxsLCAicm9sZXMiOiBbXX07CiAgICAkc2NvcGUudXNlci5wYXNzd29yZCA9IG51bGw7CiAgICAkc2NvcGUuaXNVcGRhdGluZyA9ICh1c2VyICYmIHVzZXIuX2lkICYmIHVzZXIuX2lkLmxlbmd0aCA+IDApOwogICAgJHNjb3BlLnJvbGVzID0gcm9sZXM7CgogICAgJHNjb3BlLmdldFJvbGVOYW1lID0gZnVuY3Rpb24gKHNpZCkgewogICAgICAgIHZhciBmb3VuZF9yb2xlID0gIltCdWlsdGluIFJvbGVdIjsKICAgICAgICBhbmd1bGFyLmZvckVhY2goJHNjb3BlLnJvbGVzLCBmdW5jdGlvbiAocm9sZSwga2V5KSB7CiAgICAgICAgICAgIGlmIChyb2xlLnNpZCA9PT0gc2lkKSB7CiAgICAgICAgICAgICAgICBmb3VuZF9yb2xlID0gcm9sZS5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBmb3VuZF9yb2xlOwogICAgfTsKCiAgICAkc2NvcGUub2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCRzY29wZS51c2VyLnVzZXJuYW1lICYmICgkc2NvcGUudXNlci5wYXNzd29yZCB8fCAkc2NvcGUuaXNVcGRhdGluZykpIHsKICAgICAgICAgICAgaWYgKCRzY29wZS51c2VyLnBhc3N3b3JkID09ICRzY29wZS51c2VyLnBhc3N3b3JkX3JlKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJHNjb3BlLnVzZXIucGFzc3dvcmRfcmU7CiAgICAgICAgICAgICAgICAkbW9kYWxJbnN0YW5jZS5jbG9zZSgkc2NvcGUudXNlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuaGFzZXJyb3IgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNjb3BlLmhhc2Vycm9yID0gdHJ1ZTsKICAgICAgICB9CgogICAgfTsKCiAgICAkc2NvcGUucmVtb3ZlUm9sZSA9IGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICRzY29wZS51c2VyLnJvbGVzLnNwbGljZShpbmRleCwgMSk7CiAgICB9OwoKICAgICRzY29wZS5hZGRSb2xlID0gZnVuY3Rpb24gKHNlbGVjdGVkX3JvbGUpIHsKICAgICAgICBpZiAoIXNlbGVjdGVkX3JvbGUgfHwgc2VsZWN0ZWRfcm9sZS5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCEkc2NvcGUudXNlci5yb2xlcykgewogICAgICAgICAgICAkc2NvcGUudXNlci5yb2xlcyA9IFtdOwogICAgICAgIH0KICAgICAgICB2YXIgZHVwID0gZmFsc2U7CiAgICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS51c2VyLnJvbGVzLCBmdW5jdGlvbiAocm9sZXNpZCwgaW5kZXgpIHsKICAgICAgICAgICAgaWYgKHJvbGVzaWQgPT09IHNlbGVjdGVkX3JvbGUpIHsKICAgICAgICAgICAgICAgIGR1cCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoIWR1cCkgewogICAgICAgICAgICAkc2NvcGUudXNlci5yb2xlcy5wdXNoKHNlbGVjdGVkX3JvbGUpOwogICAgICAgIH0KICAgIH07CgogICAgJHNjb3BlLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkbW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTsKICAgIH07Cn1dKQo7Cg==')
},
{
'name': '/app/lib/cosmos/js/controllers/controllers.js', 'data': base64.b64decode(b'J3VzZSBzdHJpY3QnOwoKLyogQ29udHJvbGxlcnMgKi8KdmFyIGNvbnRyb2xsZXJzID0gYW5ndWxhci5tb2R1bGUoJ2Nvc21vc1VJLmNvbnRyb2xsZXJzJywgW10pCiAgICAuY29udHJvbGxlcignQWRtaW5NYWluQ3RybCcsIFsnJHNjb3BlJywgJyRtb2RhbCcsICdDb3Ntb3NTZXJ2aWNlJywgZnVuY3Rpb24gKCRzY29wZSwgJG1vZGFsLCBDb3Ntb3NTZXJ2aWNlKSB7CiAgICAgICAgJHNjb3BlLnVzZXJOYW1lID0gZ2V0VXNlck5hbWUoIk5vIE5hbWUiKTsKICAgICAgICAkc2NvcGUubG9nZ2VkSW4gPSBsb2dnZWRJbjsKICAgIH1dKQoKICAgIC5jb250cm9sbGVyKCdNZXNzYWdlVmlld0N0cmwnLCBbJyRzY29wZScsICdDb3Ntb3NTZXJ2aWNlJywgJ21lc3NhZ2UnLCBmdW5jdGlvbiAoJHNjb3BlLCBDb3Ntb3NTZXJ2aWNlLCBtZXNzYWdlKSB7CiAgICAgICAgJHNjb3BlLm1lc3NhZ2UgPSBtZXNzYWdlLnBvcCgpOwogICAgfV0pCgogICAgLmNvbnRyb2xsZXIoJ1Nob3dKc29uRGF0YUN0cmwnLCBbJyRzY29wZScsICckbW9kYWxJbnN0YW5jZScsICdtb2RlbCcsIGZ1bmN0aW9uICgkc2NvcGUsICRtb2RhbEluc3RhbmNlLCBtb2RlbCkgewogICAgICAgICRzY29wZS5tb2RlbCA9IG1vZGVsOwogICAgICAgICRzY29wZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRtb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpOwogICAgICAgIH07CiAgICB9XSkKCiAgICAuY29udHJvbGxlcignU2luZ2xlSXRlbVZpZXdDdHJsJywgWyckc2NvcGUnLCAnJHJvdXRlUGFyYW1zJywgZnVuY3Rpb24gKCRzY29wZSwgJHJvdXRlUGFyYW1zKSB7CiAgICAgICAgJHNjb3BlLmNvbmZpZ0lkID0gJHJvdXRlUGFyYW1zLmNvbmZpZ0lkOwogICAgICAgICRzY29wZS5pdGVtSWQgPSAkcm91dGVQYXJhbXMuaXRlbUlkOwogICAgfV0pCgogICAgLmNvbnRyb2xsZXIoJ0FwcExpc3RDdHJsJywgWyckc2NvcGUnLCAnJHJvdXRlUGFyYW1zJywnQ29zbW9zU2VydmljZScsJ2Nvc21vcy5jYWNoZWRsb2FkZXInLCAnY29zbW9zLnNldHRpbmdzJywKICAgICAgICBmdW5jdGlvbiAoJHNjb3BlLCAkcm91dGVQYXJhbXMsIENvc21vc1NlcnZpY2UsIGNhY2hlZGxvYWRlciwgc2V0dGluZ3MpIHsKICAgICAgICAgICAgJHNjb3BlLmFwcHMgPSBbXTsKCiAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IgPSBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUuaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJHNjb3BlLmluaXQ9ZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRBcHBsaWNhdGlvbnMoZnVuY3Rpb24gKGFwcGxpY2F0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFwcGxpY2F0aW9ucyB8fCBhcHBsaWNhdGlvbnMubGVuZ3RoPT0wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgnL2FwcHN0dWRpby8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hcHBzID0gYXBwbGljYXRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICB9XSkKCgoKOwo=')
},
{
'name': '/app/lib/cosmos/js/controllers/PageViewCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKCmNvbnRyb2xsZXJzLmNvbnRyb2xsZXIoJ1BhZ2VWaWV3Q3RybCcsIFsnJHNjb3BlJywgJyRyb3V0ZVBhcmFtcycsICckbG9jYXRpb24nLCAnQ29zbW9zU2VydmljZScsICdjb3Ntb3Muc2V0dGluZ3MnLAogICAgZnVuY3Rpb24gKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sIENvc21vc1NlcnZpY2UsIHNldHRpbmdzKSB7CiAgICAgICAgJHNjb3BlLnBhZ2VJZCA9ICRyb3V0ZVBhcmFtcy5wYWdlSWQ7CiAgICAgICAgJHNjb3BlLmFwcFBhdGggPSAkcm91dGVQYXJhbXMuYXBwUGF0aDsKICAgICAgICAkc2NvcGUucm91dGVQYXJhbXMgPSAkcm91dGVQYXJhbXM7CgogICAgICAgICRzY29wZS5nZXRDb25maWd1cmF0aW9uQnlVcmwgPSBmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sb2dpblJlcXVpcmVkICYmICFsb2dnZWRJbigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJVcmwgPSAkbG9jYXRpb24udXJsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi51cmwoIi9sb2dpbi8/cmVkaXJlY3Q9IiArIGN1clVybCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucGFnZSA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAvLyRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgc2V0dGluZ3MuZ2V0QXBwU2V0dGluZ3MoJHNjb3BlLmFwcFBhdGgsICJwYWdlY29uZmlnb2JqZWN0IiwgZnVuY3Rpb24gKG9iamVjdE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gJy9zZXJ2aWNlLycgKyBvYmplY3ROYW1lICsgJy8nICsgJHNjb3BlLnBhZ2VJZCArICcvJzsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbkJ5VXJsKHVybCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKHN0YXR1cywgZGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvY29zbW9zLnBhZ2VzLycgKyAkc2NvcGUucGFnZUlkICsgJy8nOwogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRDb25maWd1cmF0aW9uQnlVcmwodXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuaW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgc2V0dGluZ3MuaW5pdFNldHRpbmdzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmluaXQoKTsKCgogICAgfV0pOwo=')
},
{
'name': '/app/lib/cosmos/js/controllers/RolesCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKY29udHJvbGxlcnMuY29udHJvbGxlcignUm9sZXNDdHJsJywgWyckc2NvcGUnLCAnJG1vZGFsJywgJ0Nvc21vc1NlcnZpY2UnLCBmdW5jdGlvbiAoJHNjb3BlLCAkbW9kYWwsIENvc21vc1NlcnZpY2UpIHsKCiAgICAkc2NvcGUuY2xlYXJFcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkc2NvcGUuaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICAkc2NvcGUuc3RhdHVzID0gIiI7CiAgICAgICAgJHNjb3BlLnN0YXR1c19kYXRhID0gIiI7CiAgICB9OwoKICAgICRzY29wZS5wcm9jZXNzRXJyb3IgPSBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgJHNjb3BlLmhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAkc2NvcGUuc3RhdHVzID0gc3RhdHVzOwogICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOwogICAgfTsKCiAgICAkc2NvcGUuYWRkUm9sZSA9IGZ1bmN0aW9uIChzaXplLCBjdXJyZW50X3JvbGUpIHsKICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICRtb2RhbC5vcGVuKHsKICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL2FkZHJvbGUuaHRtbCcsCiAgICAgICAgICAgIGNvbnRyb2xsZXI6ICJSb2xlTW9kYWxJbnN0YW5jZUN0cmwiLAogICAgICAgICAgICBzaXplOiBzaXplLAogICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCiAgICAgICAgICAgIHJlc29sdmU6IHsKICAgICAgICAgICAgICAgIHJvbGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudF9yb2xlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIG1vZGFsSW5zdGFuY2UucmVzdWx0LnRoZW4oZnVuY3Rpb24gKHJvbGUpIHsKICAgICAgICAgICAgJHNjb3BlLmN1cnJlbnRfcm9sZSA9IHJvbGU7CiAgICAgICAgICAgIGlmICghcm9sZS5faWQpIHsKICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UucG9zdCgnL3NlcnZpY2UvY29zbW9zLnJiYWMub2JqZWN0LnJvbGUvJywgcm9sZSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRSb2xlcygpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByb2xlX2lkID0gcm9sZS5faWQ7CiAgICAgICAgICAgICAgICBkZWxldGUgcm9sZS5faWQ7CiAgICAgICAgICAgICAgICBkZWxldGUgcm9sZS5zaWQ7CiAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLnB1dCgnL3NlcnZpY2UvY29zbW9zLnJiYWMub2JqZWN0LnJvbGUvJyArIHJvbGVfaWQgKyAnLycsIHJvbGUsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXRSb2xlcygpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8kbG9nLmluZm8oJ01vZGFsIGRpc21pc3NlZCBhdDogJyArIG5ldyBEYXRlKCkpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkc2NvcGUuZWRpdFJvbGUgPSBmdW5jdGlvbiAocm9sZUluZGV4KSB7CiAgICAgICAgJHNjb3BlLmFkZFJvbGUoJ2xnJywgJHNjb3BlLnJvbGVzW3JvbGVJbmRleF0pOwogICAgfTsKCiAgICAkc2NvcGUucmVtb3ZlUm9sZSA9IGZ1bmN0aW9uIChyb2xlSW5kZXgpIHsKICAgICAgICB2YXIgcm9sZSA9ICRzY29wZS5yb2xlc1tyb2xlSW5kZXhdOwogICAgICAgIGlmIChjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSByb2xlICcgKyByb2xlLm5hbWUgKyAnPycpKSB7CiAgICAgICAgICAgIHZhciByb2xlX2lkID0gcm9sZS5faWQ7CiAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZGVsZXRlKCcvc2VydmljZS9jb3Ntb3MucmJhYy5vYmplY3Qucm9sZS8nICsgcm9sZV9pZCArICcvJywgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ2V0Um9sZXMoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH07CgogICAgJHNjb3BlLmdldFJvbGVzID0gZnVuY3Rpb24gKCkgewogICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KCcvc2VydmljZS9jb3Ntb3MucmJhYy5vYmplY3Qucm9sZS8nLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgJHNjb3BlLnJvbGVzID0gZGF0YTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvcihkYXRhLCBzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH07CgogICAgJHNjb3BlLmdldFJvbGVzKCk7Cn1dKTsKCmNvbnRyb2xsZXJzLmNvbnRyb2xsZXIoJ1JvbGVNb2RhbEluc3RhbmNlQ3RybCcsIFsnJHNjb3BlJywgJyRtb2RhbEluc3RhbmNlJywgJ3JvbGUnLCBmdW5jdGlvbiAoJHNjb3BlLCAkbW9kYWxJbnN0YW5jZSwgcm9sZSkgewogICAgJHNjb3BlLnJvbGUgPSB7Im5hbWUiOiBudWxsLCAicm9sZV9pdGVtcyI6IFtdfTsKCiAgICAkc2NvcGUuYWNjZXNzX3R5cGVzID0gWwogICAgICAgIHtuYW1lOiAnYWNjZXNzJywgZGlzcGxheTogJ1JvbGUgYWNjZXNzJ30sCiAgICAgICAge25hbWU6ICdvd25lcl9hY2Nlc3MnLCBkaXNwbGF5OiAnT3duZXIgYWNjZXNzJ30KICAgIF07CgogICAgJHNjb3BlLnBvcHVsYXRlID0gZnVuY3Rpb24gKHJvbGUpIHsKICAgICAgICBpZiAoIXJvbGUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkc2NvcGUuaXNVcGRhdGluZyA9IChyb2xlLl9pZCAmJiByb2xlLl9pZC5sZW5ndGggPiAwKTsKICAgICAgICAkc2NvcGUucm9sZS5faWQgPSByb2xlLl9pZDsKICAgICAgICAkc2NvcGUucm9sZS5uYW1lID0gcm9sZS5uYW1lOwogICAgICAgICRzY29wZS5yb2xlLnNpZCA9IHJvbGUuc2lkOwogICAgICAgIGFuZ3VsYXIuZm9yRWFjaChyb2xlLnJvbGVfaXRlbXMsIGZ1bmN0aW9uIChyb2xlX2l0ZW0sIGtleSkgewogICAgICAgICAgICByb2xlX2l0ZW0uYWNjZXNzX2JpdHMgPSBbXTsKICAgICAgICAgICAgaWYgKHJvbGVfaXRlbS5hY2Nlc3MgJiYgcm9sZV9pdGVtLmFjY2Vzcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IGpRdWVyeS5pbkFycmF5KCJSRUFEIiwgcm9sZV9pdGVtLmFjY2VzcykgPiAtMTsKICAgICAgICAgICAgICAgIHZhciBpID0galF1ZXJ5LmluQXJyYXkoIklOU0VSVCIsIHJvbGVfaXRlbS5hY2Nlc3MpID4gLTE7CiAgICAgICAgICAgICAgICB2YXIgdyA9IGpRdWVyeS5pbkFycmF5KCJXUklURSIsIHJvbGVfaXRlbS5hY2Nlc3MpID4gLTE7CiAgICAgICAgICAgICAgICB2YXIgZCA9IGpRdWVyeS5pbkFycmF5KCJERUxFVEUiLCByb2xlX2l0ZW0uYWNjZXNzKSA+IC0xOwoKICAgICAgICAgICAgICAgIHJvbGVfaXRlbS5hY2Nlc3NfYml0cy5yZWFkID0gcjsKICAgICAgICAgICAgICAgIHJvbGVfaXRlbS5hY2Nlc3NfYml0cy5pbnNlcnQgPSBpOwogICAgICAgICAgICAgICAgcm9sZV9pdGVtLmFjY2Vzc19iaXRzLndyaXRlID0gdzsKICAgICAgICAgICAgICAgIHJvbGVfaXRlbS5hY2Nlc3NfYml0cy5kZWxldGUgPSBkOwogICAgICAgICAgICAgICAgcm9sZV9pdGVtLnR5cGUgPSAkc2NvcGUuYWNjZXNzX3R5cGVzWzBdLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocm9sZV9pdGVtLm93bmVyX2FjY2VzcyAmJiByb2xlX2l0ZW0ub3duZXJfYWNjZXNzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHZhciByID0galF1ZXJ5LmluQXJyYXkoIlJFQUQiLCByb2xlX2l0ZW0ub3duZXJfYWNjZXNzKSA+IC0xOwogICAgICAgICAgICAgICAgdmFyIGkgPSBqUXVlcnkuaW5BcnJheSgiSU5TRVJUIiwgcm9sZV9pdGVtLm93bmVyX2FjY2VzcykgPiAtMTsKICAgICAgICAgICAgICAgIHZhciB3ID0galF1ZXJ5LmluQXJyYXkoIldSSVRFIiwgcm9sZV9pdGVtLm93bmVyX2FjY2VzcykgPiAtMTsKICAgICAgICAgICAgICAgIHZhciBkID0galF1ZXJ5LmluQXJyYXkoIkRFTEVURSIsIHJvbGVfaXRlbS5vd25lcl9hY2Nlc3MpID4gLTE7CgogICAgICAgICAgICAgICAgcm9sZV9pdGVtLmFjY2Vzc19iaXRzLnJlYWQgPSByOwogICAgICAgICAgICAgICAgcm9sZV9pdGVtLmFjY2Vzc19iaXRzLmluc2VydCA9IGk7CiAgICAgICAgICAgICAgICByb2xlX2l0ZW0uYWNjZXNzX2JpdHMud3JpdGUgPSB3OwogICAgICAgICAgICAgICAgcm9sZV9pdGVtLmFjY2Vzc19iaXRzLmRlbGV0ZSA9IGQ7CiAgICAgICAgICAgICAgICByb2xlX2l0ZW0udHlwZSA9ICRzY29wZS5hY2Nlc3NfdHlwZXNbMV0ubmFtZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNjb3BlLnJvbGUucm9sZV9pdGVtcy5wdXNoKHJvbGVfaXRlbSk7CgogICAgICAgIH0pOwogICAgfTsKCiAgICAkc2NvcGUuYWRkUm9sZUl0ZW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgJHNjb3BlLnJvbGUucm9sZV9pdGVtcy5wdXNoKHt9KTsKICAgIH07CgogICAgJHNjb3BlLnJlbW92ZVJvbGVJdGVtID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgJHNjb3BlLnJvbGUucm9sZV9pdGVtcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgfTsKCiAgICAkc2NvcGUub2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCRzY29wZS5yb2xlLm5hbWUgJiYgJHNjb3BlLnJvbGUucm9sZV9pdGVtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHZhciBoYXNlcnJvciA9IGZhbHNlOwogICAgICAgICAgICB2YXIgcm9sZV9kYXRhID0gewogICAgICAgICAgICAgICAgIm5hbWUiOiAkc2NvcGUucm9sZS5uYW1lLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0LlJvbGUiCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoJHNjb3BlLnJvbGUuc2lkKSB7CiAgICAgICAgICAgICAgICByb2xlX2RhdGFbInNpZCJdID0gJHNjb3BlLnJvbGUuc2lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICByb2xlX2RhdGFbIl9pZCJdID0gJHNjb3BlLnJvbGUuX2lkOwoKICAgICAgICAgICAgcm9sZV9kYXRhWyJyb2xlX2l0ZW1zIl0gPSBbXTsKCiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUucm9sZS5yb2xlX2l0ZW1zLCBmdW5jdGlvbiAocm9sZV9pdGVtLCBrZXkpIHsKICAgICAgICAgICAgICAgIHZhciByb2xlX2l0ZW1fZGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAib2JqZWN0X25hbWUiOiByb2xlX2l0ZW0ub2JqZWN0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5X25hbWUiOiByb2xlX2l0ZW0ucHJvcGVydHlfbmFtZSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QuUm9sZUl0ZW0iCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJvbGVfaXRlbV9kYXRhW3JvbGVfaXRlbS50eXBlXSA9IFtdOwoKICAgICAgICAgICAgICAgIGlmIChyb2xlX2l0ZW0uYWNjZXNzX2JpdHMucmVhZCkgewogICAgICAgICAgICAgICAgICAgIHJvbGVfaXRlbV9kYXRhW3JvbGVfaXRlbS50eXBlXS5wdXNoKCJSRUFEIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJvbGVfaXRlbS5hY2Nlc3NfYml0cy5pbnNlcnQpIHsKICAgICAgICAgICAgICAgICAgICByb2xlX2l0ZW1fZGF0YVtyb2xlX2l0ZW0udHlwZV0ucHVzaCgiSU5TRVJUIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJvbGVfaXRlbS5hY2Nlc3NfYml0cy53cml0ZSkgewogICAgICAgICAgICAgICAgICAgIHJvbGVfaXRlbV9kYXRhW3JvbGVfaXRlbS50eXBlXS5wdXNoKCJXUklURSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChyb2xlX2l0ZW0uYWNjZXNzX2JpdHMuZGVsZXRlKSB7CiAgICAgICAgICAgICAgICAgICAgcm9sZV9pdGVtX2RhdGFbcm9sZV9pdGVtLnR5cGVdLnB1c2goIkRFTEVURSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJvbGVfZGF0YVsicm9sZV9pdGVtcyJdLnB1c2gocm9sZV9pdGVtX2RhdGEpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICghaGFzZXJyb3IpIHsKICAgICAgICAgICAgICAgICRtb2RhbEluc3RhbmNlLmNsb3NlKHJvbGVfZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc2NvcGUuaGFzZXJyb3IgPSB0cnVlOwogICAgICAgIH0KICAgIH07CgogICAgJHNjb3BlLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkbW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTsKICAgIH07CgogICAgJHNjb3BlLnBvcHVsYXRlKHJvbGUpOwp9XSk7Cgo=')
},
{
'name': '/app/lib/cosmos/js/controllers/ListDetailCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKY29udHJvbGxlcnMuY29udHJvbGxlcignTGlzdERldGFpbEN0cmwnLCBbJyRzY29wZScsICckcm91dGVQYXJhbXMnLCAnJHRlbXBsYXRlQ2FjaGUnLCAnJG1vZGFsJywgJ0Nvc21vc1NlcnZpY2UnLAogICAgZnVuY3Rpb24gKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkdGVtcGxhdGVDYWNoZSwgJG1vZGFsLCBDb3Ntb3NTZXJ2aWNlKSB7CgogICAgICAgICRzY29wZS5jbGVhckVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkc2NvcGUuaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9ICIiOwogICAgICAgICAgICAkc2NvcGUuc3RhdHVzX2RhdGEgPSAiIjsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUubGlzdElkID0gJHJvdXRlUGFyYW1zLmxpc3RJZDsKCiAgICAgICAgJHNjb3BlLnByb2Nlc3NFcnJvciA9IGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgJHNjb3BlLmhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgJHNjb3BlLnN0YXR1c19kYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmdldENvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvY29zbW9zLmxpc3Rjb25maWd1cmF0aW9ucy8nICsgJHNjb3BlLmxpc3RJZCArICcvJzsKCiAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUubGlzdENvbmZpZ3VyYXRpb24gPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICRzY29wZS5nZXREYXRhKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGNvbHVtbnMgPSAiIjsKICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS5saXN0Q29uZmlndXJhdGlvbi5jb2x1bW5zLCBmdW5jdGlvbiAoY29sdW1uLCBpbmRleCkgewogICAgICAgICAgICAgICAgY29sdW1ucyArPSBjb2x1bW4ubmFtZSArICIsIjsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciB1cmwgPSAnL3NlcnZpY2UvJyArICRzY29wZS5saXN0Q29uZmlndXJhdGlvbi5vYmplY3ROYW1lICsgJy8/Y29sdW1ucz0nICsgY29sdW1uczsKCiAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZ2V0KHVybCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuc2hvd0xpc3RJdGVtRGV0YWlscyA9IGZ1bmN0aW9uIChkYXRhLCBsaXN0Q29uZmlndXJhdGlvbikgewogICAgICAgICAgICAgJHNjb3BlLnNob3dEZXRhaWxzKCdsZycsIGRhdGEsIGxpc3RDb25maWd1cmF0aW9uKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuc2hvd0RldGFpbHMgPSBmdW5jdGlvbiAoc2l6ZSwgZGF0YSwgbGlzdENvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgICAgaWYgKGxpc3RDb25maWd1cmF0aW9uLmFsbG93RGV0YWlscykgewogICAgICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkbW9kYWwub3Blbih7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9zaG93X2pzb24uaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogIlNob3dKc29uRGF0YUN0cmwiLAogICAgICAgICAgICAgICAgICAgIHNpemU6IHNpemUsCiAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAogICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuZ2V0Q29uZmlndXJhdGlvbigpOwogICAgfV0pOw==')
},
{
'name': '/app/lib/cosmos/js/controllers/FileManagerCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gNC8zLzE2LgogKi8KCmNvbnRyb2xsZXJzLmNvbnRyb2xsZXIoJ0ZpbGVNYW5hZ2VyQ3RybCcsIFsnJHNjb3BlJywgJyRtb2RhbCcsICckcm91dGVQYXJhbXMnLCAnQ29zbW9zU2VydmljZScsCiAgICBmdW5jdGlvbiAoJHNjb3BlLCAkbW9kYWwsICRyb3V0ZVBhcmFtcywgQ29zbW9zU2VydmljZSkgewoKICAgICAgICAkc2NvcGUuZmlsZU9iamVjdE5hbWUgPSAkcm91dGVQYXJhbXMuZmlsZU9iamVjdE5hbWU7CiAgICAgICAgJHNjb3BlLnJvb3RQYXRoID0gIi9ncmlkZnMvIjsKCiAgICAgICAgJHNjb3BlLmluaXQgPSBmdW5jdGlvbihyb290UGF0aCl7CiAgICAgICAgICAgIGlmKHJvb3RQYXRoKXsKICAgICAgICAgICAgICAgICRzY29wZS5yb290UGF0aCA9IHJvb3RQYXRoLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmKCEkc2NvcGUucm9vdFBhdGguZW5kc1dpdGgoJy8nKSl7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJvb3RQYXRoID0gJHNjb3BlLnJvb3RQYXRoICsgJy8nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRzY29wZS5yZWZyZXNoKCk7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpewogICAgICAgICAgICAkc2NvcGUuc2V0QWN0aW9uKCk7CiAgICAgICAgICAgICRzY29wZS5nZXRGaWxlcygpOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5zZXRBY3Rpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZG9jdW1lbnQudXBsb2FkRm9ybS5hY3Rpb24gPSAkc2NvcGUucm9vdFBhdGggKyAkc2NvcGUuZmlsZU9iamVjdE5hbWUgKyAiLyI7CiAgICAgICAgfTsKCiAgICAgICAgJHNjb3BlLmNsZWFyRXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRzY29wZS5oYXNFcnJvciA9IGZhbHNlOwogICAgICAgICAgICAkc2NvcGUuc3RhdHVzID0gIiI7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9ICIiOwogICAgICAgIH07CgogICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IgPSBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICRzY29wZS5oYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgICAgICRzY29wZS5zdGF0dXNfZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOwogICAgICAgIH07CgogICAgICAgICRzY29wZS51cGxvYWRlZF9maWxlcyA9IFsKICAgICAgICBdOwoKICAgICAgICAkc2NvcGUub25GaWxlVXBsb2FkTG9hZGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgcmVzcG9uc2VUZXh0ID0gdGhpcy5jb250ZW50RG9jdW1lbnQuYm9keS5pbm5lclRleHQ7CgogICAgICAgICAgICBpZiAocmVzcG9uc2VUZXh0KSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCkuX2QpOwogICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHZhbHVlcywgZnVuY3Rpb24gKGRhdGEsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVwbG9hZGVkX2ZpbGVzLnB1c2goZGF0YSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDbGVhciB0aGUgaWZyYW1lIGNvbnRyb2wKICAgICAgICAgICAgJCgnI3N1Ym1pdC1pZnJhbWUnKS5yZW1vdmUoKTsKICAgICAgICAgICAgalF1ZXJ5KCIjZmlsZUxpc3QiKS5lbXB0eSgpOwogICAgICAgICAgICBqUXVlcnkoIiNmaWxlTGlzdCIpLmFwcGVuZChqUXVlcnkoJzxpbnB1dCBjbGFzcz0iZmlsZS1zZWxlY3RvciIgbmFtZT0idXBsb2FkZWRmaWxlIiB0eXBlPSJmaWxlIiBvbmNoYW5nZT0iYW5ndWxhci5lbGVtZW50KHRoaXMpLnNjb3BlKCkuZmlsZU5hbWVDaGFuZ2VkKCkiIC8+JykpOwogICAgICAgIH07CgogICAgICAgICRzY29wZS51cGxvYWRGaWxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBqUXVlcnkoIiNpRnJhbWVQbGFjZWhvbGRlciIpLmh0bWwoIjxpZnJhbWUgbmFtZT0nc3VibWl0LWlmcmFtZScgaWQ9J3N1Ym1pdC1pZnJhbWUnIHN0eWxlPSdkaXNwbGF5OiBub25lOyc+PC9pZnJhbWU+Iik7CgogICAgICAgICAgICBqUXVlcnkoIiNzdWJtaXQtaWZyYW1lIikubG9hZCgkc2NvcGUub25GaWxlVXBsb2FkTG9hZGVkKTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVwbG9hZEZvcm0iKS5zdWJtaXQoKTsKICAgICAgICB9OwoKICAgICAgICAkc2NvcGUuZmlsZU5hbWVDaGFuZ2VkID0gZnVuY3Rpb24gKGZpbGVJbnB1dCkgewogICAgICAgICAgICB2YXIgZW1wdHlGb3VuZCA9IGZhbHNlOwogICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goalF1ZXJ5KCIjZmlsZUxpc3QiKS5jaGlsZHJlbigpLCBmdW5jdGlvbiAoZGF0YSwgaW5kZXgpIHsKICAgICAgICAgICAgICAgIGlmICghZGF0YS52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5Rm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICghZW1wdHlGb3VuZCkgewogICAgICAgICAgICAgICAgalF1ZXJ5KCIjZmlsZUxpc3QiKS5hcHBlbmQoalF1ZXJ5KCc8aW5wdXQgY2xhc3M9ImZpbGUtc2VsZWN0b3IiIG5hbWU9InVwbG9hZGVkZmlsZSIgdHlwZT0iZmlsZSIgb25jaGFuZ2U9ImFuZ3VsYXIuZWxlbWVudCh0aGlzKS5zY29wZSgpLmZpbGVOYW1lQ2hhbmdlZCgpIiAvPicpKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgICRzY29wZS5yZW1vdmVGaWxlID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgIHZhciBmaWxlID0gJHNjb3BlLnVwbG9hZGVkX2ZpbGVzW2luZGV4XTsKICAgICAgICAgICAgaWYgKGNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIGZpbGUgJyArIGZpbGUuZmlsZW5hbWUgKyAnPycpKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZV9pZCA9IGZpbGUuZmlsZV9pZDsKICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UuZGVsZXRlKCRzY29wZS5yb290UGF0aCArICRzY29wZS5maWxlT2JqZWN0TmFtZSArICcvJyArIGZpbGVfaWQgKyAnLycsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS51cGxvYWRlZF9maWxlcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucHJvY2Vzc0Vycm9yKGRhdGEsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgICRzY29wZS5nZXRGaWxlcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYoJHNjb3BlLmZpbGVPYmplY3ROYW1lKSB7CiAgICAgICAgICAgICAgICBDb3Ntb3NTZXJ2aWNlLmdldCgkc2NvcGUucm9vdFBhdGggKyAkc2NvcGUuZmlsZU9iamVjdE5hbWUgKyAnLycsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS51cGxvYWRlZF9maWxlcyA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9jZXNzRXJyb3IoZGF0YSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICB9XSk7')
},
{
'name': '/app/lib/cosmos/js/controllers/FormViewCtrl.js', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgb24gMTAvMjgvMTQuCiAqLwoKCmNvbnRyb2xsZXJzLmNvbnRyb2xsZXIoJ0Zvcm1WaWV3Q3RybCcsIFsnJHNjb3BlJywgJyRyb3V0ZVBhcmFtcycsICckbG9jYXRpb24nLCAnJGluamVjdG9yJywgJ0Nvc21vc1NlcnZpY2UnLCAnbWVzc2FnZScsCiAgICBmdW5jdGlvbiAoJHNjb3BlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbiwgJGluamVjdG9yLCBDb3Ntb3NTZXJ2aWNlLCBtZXNzYWdlKSB7CiAgICAgICAgJHNjb3BlLmZvcm0gPSB7fTsKICAgICAgICAkc2NvcGUuZGF0YSA9IHt9OwoKICAgICAgICAkc2NvcGUuZm9ybXJlZiA9IHsgInR5cGUiOiJmb3JtcmVmIiwgInZhbHVlIjp7ImZvcm1JZCI6ICRyb3V0ZVBhcmFtcy5mb3JtSWR9fTsKICAgICAgICAkc2NvcGUuZGF0YUlkID0gJHJvdXRlUGFyYW1zLmRhdGFJZDsKICAgIH1dKTsKCi8vVE9ETzogTWVyZ2Ugd2l0aCBhYm92ZQpjb250cm9sbGVycy5jb250cm9sbGVyKCdGb3JtVmlld01vZGFsQ3RybCcsIFsnJHNjb3BlJywgJyRyb3V0ZVBhcmFtcycsICckbG9jYXRpb24nLCAnJGluamVjdG9yJywgJ0Nvc21vc1NlcnZpY2UnLCAnbWVzc2FnZScsJ21vZGVsJywgJ2Zvcm1JZCcsCiAgICBmdW5jdGlvbiAoJHNjb3BlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbiwgJGluamVjdG9yLCBDb3Ntb3NTZXJ2aWNlLCBtZXNzYWdlLCBtb2RlbCwgZm9ybUlkKSB7CiAgICAgICAgJHNjb3BlLmZvcm1yZWYgPSB7ICJ0eXBlIjoiZm9ybXJlZiIsICJ2YWx1ZSI6eyJmb3JtSWQiOiBmb3JtSWR8fCAkcm91dGVQYXJhbXMuZm9ybUlkfX07CiAgICAgICAgJHNjb3BlLmRhdGFJZCA9IG1vZGVsPyBtb2RlbC5faWQgOiAkcm91dGVQYXJhbXMuZGF0YUlkOwogICAgfV0pOw==')
},
{
'name': '/app/lib/cosmos/js/controllers/LoginCtrl.js', 'data': base64.b64decode(b'J3VzZSBzdHJpY3QnOwoKY29udHJvbGxlcnMuY29udHJvbGxlcignTG9naW5DdHJsJywgWyckc2NvcGUnLCAnJHJvdXRlUGFyYW1zJywgJyRsb2NhdGlvbicsICdDb3Ntb3NTZXJ2aWNlJywgJyRodHRwJywKICAgICAgICBmdW5jdGlvbiAoJHNjb3BlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbiwgQ29zbW9zU2VydmljZSwgJGh0dHApIHsKICAgICAgICAgICAgJHNjb3BlLnJlZGlyZWN0VXJsID0gJHJvdXRlUGFyYW1zLnJlZGlyZWN0OwogICAgICAgICAgICAkc2NvcGUuaGF2ZUFjY291bnQgPSB0cnVlOwoKICAgICAgICAgICAgJHNjb3BlLmxvZ2luID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGlmICghJHNjb3BlLnVzZXJuYW1lIHx8ICRzY29wZS51c2VybmFtZS5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVycm9yID0gIlVzZXJuYW1lIGlzIHJlcXVpcmVkLiI7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghJHNjb3BlLnBhc3N3b3JkIHx8ICRzY29wZS5wYXNzd29yZC5sZW5ndGggPCA0KSB7CiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVycm9yID0gIlBhc3N3b3JkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGF0IGxlYXN0IDQgY2hhcmFjdGVyIGxvbmcuIjsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGh0dHAucG9zdCgnL2xvZ2luLycsIHsidXNlcm5hbWUiOiRzY29wZS51c2VybmFtZSwgInBhc3N3b3JkIjokc2NvcGUucGFzc3dvcmQgfSkuCiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24udXJsKCRzY29wZS5yZWRpcmVjdFVybCB8fCAnLycpOwogICAgICAgICAgICAgICAgICB9KS4KICAgICAgICAgICAgICAgICAgZXJyb3IoZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzID09PSA0MDEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVycm9yID0gIlVzZXJuYW1lIG9yIHBhc3N3b3JkIGRpZCBub3QgbWF0Y2guIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lcnJvciA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkc2NvcGUuc2lnbnVwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy9UT0RPOmNyZWF0ZSBhIHNlcnZpY2UgZm9yIGdsb2JhbCBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKCEkc2NvcGUudXNlcm5hbWUgfHwgJHNjb3BlLnVzZXJuYW1lLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZXJyb3IgPSAiVXNlcm5hbWUgaXMgcmVxdWlyZWQuIjsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCEkc2NvcGUucGFzc3dvcmQgfHwgJHNjb3BlLnBhc3N3b3JkLmxlbmd0aCA8IDYpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZXJyb3IgPSAiUGFzc3dvcmQgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYXQgbGVhc3QgNiBjaGFyYWN0ZXIgbG9uZy4iOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLnBhc3N3b3JkICE9PSAkc2NvcGUucGFzc3dvcmRfcmUpIHsKICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZXJyb3IgPSAiUGFzc3dvcmQgZG9lcyBub3QgbWF0Y2guIjsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHVybCA9ICcvc2VydmljZS9jb3Ntb3MudXNlcnMvJzsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0geyAidXNlcm5hbWUiOiAkc2NvcGUudXNlcm5hbWUsICJwYXNzd29yZCI6ICRzY29wZS5wYXNzd29yZCB9OwoKICAgICAgICAgICAgICAgIENvc21vc1NlcnZpY2UucG9zdCh1cmwsIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHJldHVybmVkRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubG9naW4oKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzID09PSA0MDkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVycm9yID0gIlVzZXJuYW1lIGFscmVhZHkgdGFrZW4uIFBsZWFzZSB1c2UgYW5vdGhlciB1c2VybmFtZSBvciBsb2dpbiB1c2luZyB5b3VyIHBhc3N3b3JkLiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lcnJvciA9ICJDb3VsZCBub3QgY3JlYXRlIHVzZXIuIEVycm9yIGNvZGU6ICIrIHN0YXR1cyArICIgRXJyb3I6ICIgKyBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfTsKICAgIH1dKQo7')
},
{
'name': '/app/lib/js/d3.min.js', 'data': base64.b64decode(b'IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiB0KG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gZShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gcihuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiB1KG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBpKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBvKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGEoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBjKG4pe3JldHVybihuKz0iIik9PT1sYXx8blswXT09PXNhP3NhK246bn1mdW5jdGlvbiBsKG4pe3JldHVybihuKz0iIilbMF09PT1zYT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gcyhuKXtyZXR1cm4gYyhuKWluIHRoaXMuX31mdW5jdGlvbiBmKG4pe3JldHVybihuPWMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIGgoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChsKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiBnKCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBwKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB2KCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24gZChuLHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZS5hcHBseSh0LGFyZ3VtZW50cyk7cmV0dXJuIHI9PT10P246cn19ZnVuY3Rpb24gbShuLHQpe2lmKHQgaW4gbilyZXR1cm4gdDt0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtmb3IodmFyIGU9MCxyPWZhLmxlbmd0aDtyPmU7KytlKXt2YXIgdT1mYVtlXSt0O2lmKHUgaW4gbilyZXR1cm4gdX19ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB4KCl7fWZ1bmN0aW9uIE0obil7ZnVuY3Rpb24gdCgpe2Zvcih2YXIgdCxyPWUsdT0tMSxpPXIubGVuZ3RoOysrdTxpOykodD1yW3VdLm9uKSYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG59dmFyIGU9W10scj1uZXcgYTtyZXR1cm4gdC5vbj1mdW5jdGlvbih0LHUpe3ZhciBpLG89ci5nZXQodCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9vJiZvLm9uOihvJiYoby5vbj1udWxsLGU9ZS5zbGljZSgwLGk9ZS5pbmRleE9mKG8pKS5jb25jYXQoZS5zbGljZShpKzEpKSxyLnJlbW92ZSh0KSksdSYmZS5wdXNoKHIuc2V0KHQse29uOnV9KSksbil9LHR9ZnVuY3Rpb24gXygpe0JvLmV2ZW50LnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gYigpe2Zvcih2YXIgbix0PUJvLmV2ZW50O249dC5zb3VyY2VFdmVudDspdD1uO3JldHVybiB0fWZ1bmN0aW9uIHcobil7Zm9yKHZhciB0PW5ldyB4LGU9MCxyPWFyZ3VtZW50cy5sZW5ndGg7KytlPHI7KXRbYXJndW1lbnRzW2VdXT1NKHQpO3JldHVybiB0Lm9mPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKHUpe3RyeXt2YXIgaT11LnNvdXJjZUV2ZW50PUJvLmV2ZW50O3UudGFyZ2V0PW4sQm8uZXZlbnQ9dSx0W3UudHlwZV0uYXBwbHkoZSxyKX1maW5hbGx5e0JvLmV2ZW50PWl9fX0sdH1mdW5jdGlvbiBTKG4pe3JldHVybiBnYShuLHlhKSxufWZ1bmN0aW9uIGsobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBwYShuLHRoaXMpfX1mdW5jdGlvbiBFKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gdmEobix0aGlzKX19ZnVuY3Rpb24gQShuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShuKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpfWZ1bmN0aW9uIHUoKXt0aGlzLnNldEF0dHJpYnV0ZShuLHQpfWZ1bmN0aW9uIGkoKXt0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCx0KX1mdW5jdGlvbiBvKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZShuKTp0aGlzLnNldEF0dHJpYnV0ZShuLGUpfWZ1bmN0aW9uIGEoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCxlKX1yZXR1cm4gbj1Cby5ucy5xdWFsaWZ5KG4pLG51bGw9PXQ/bi5sb2NhbD9yOmU6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bi5sb2NhbD9hOm86bi5sb2NhbD9pOnV9ZnVuY3Rpb24gQyhuKXtyZXR1cm4gbi50cmltKCkucmVwbGFjZSgvXHMrL2csIiAiKX1mdW5jdGlvbiBOKG4pe3JldHVybiBuZXcgUmVnRXhwKCIoPzpefFxccyspIitCby5yZXF1b3RlKG4pKyIoPzpcXHMrfCQpIiwiZyIpfWZ1bmN0aW9uIHoobil7cmV0dXJuKG4rIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBMKG4sdCl7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgZT0tMTsrK2U8dTspbltlXSh0aGlzLHQpfWZ1bmN0aW9uIHIoKXtmb3IodmFyIGU9LTEscj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsrK2U8dTspbltlXSh0aGlzLHIpfW49eihuKS5tYXAoVCk7dmFyIHU9bi5sZW5ndGg7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/cjplfWZ1bmN0aW9uIFQobil7dmFyIHQ9TihuKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtpZih1PWUuY2xhc3NMaXN0KXJldHVybiByP3UuYWRkKG4pOnUucmVtb3ZlKG4pO3ZhciB1PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIjtyPyh0Lmxhc3RJbmRleD0wLHQudGVzdCh1KXx8ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixDKHUrIiAiK24pKSk6ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixDKHUucmVwbGFjZSh0LCIgIikpKX19ZnVuY3Rpb24gcShuLHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gdSgpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix0LGUpfWZ1bmN0aW9uIGkoKXt2YXIgcj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIsZSl9cmV0dXJuIG51bGw9PXQ/cjoiZnVuY3Rpb24iPT10eXBlb2YgdD9pOnV9ZnVuY3Rpb24gUihuLHQpe2Z1bmN0aW9uIGUoKXtkZWxldGUgdGhpc1tuXX1mdW5jdGlvbiByKCl7dGhpc1tuXT10fWZ1bmN0aW9uIHUoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP2RlbGV0ZSB0aGlzW25dOnRoaXNbbl09ZX1yZXR1cm4gbnVsbD09dD9lOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3U6cn1mdW5jdGlvbiBEKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49Qm8ubnMucXVhbGlmeShuKSkubG9jYWw/ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLG4pfX1mdW5jdGlvbiBQKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBVKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBtYSh0aGlzLG4pfX1mdW5jdGlvbiBqKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwodD1uKSxmdW5jdGlvbihuLGUpe3JldHVybiBuJiZlP3Qobi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX19ZnVuY3Rpb24gRihuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLG89MCxhPWkubGVuZ3RoO2E+bztvKyspKHU9aVtvXSkmJnQodSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIEgobil7cmV0dXJuIGdhKG4sTWEpLG59ZnVuY3Rpb24gTyhuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIG8sYT1uW2ldLnVwZGF0ZSxjPWEubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKG89YVt0XSkmJisrdDxjOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFkoKXt2YXIgbj10aGlzLl9fdHJhbnNpdGlvbl9fO24mJisrbi5hY3RpdmV9ZnVuY3Rpb24gSShuLHQsZSl7ZnVuY3Rpb24gcigpe3ZhciB0PXRoaXNbb107dCYmKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHQsdC4kKSxkZWxldGUgdGhpc1tvXSl9ZnVuY3Rpb24gdSgpe3ZhciB1PWModCxKbyhhcmd1bWVudHMpKTtyLmNhbGwodGhpcyksdGhpcy5hZGRFdmVudExpc3RlbmVyKG4sdGhpc1tvXT11LHUuJD1lKSx1Ll89dH1mdW5jdGlvbiBpKCl7dmFyIHQsZT1uZXcgUmVnRXhwKCJeX19vbihbXi5dKykiK0JvLnJlcXVvdGUobikrIiQiKTtmb3IodmFyIHIgaW4gdGhpcylpZih0PXIubWF0Y2goZSkpe3ZhciB1PXRoaXNbcl07dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHRbMV0sdSx1LiQpLGRlbGV0ZSB0aGlzW3JdfX12YXIgbz0iX19vbiIrbixhPW4uaW5kZXhPZigiLiIpLGM9WjthPjAmJihuPW4uc2xpY2UoMCxhKSk7dmFyIGw9YmEuZ2V0KG4pO3JldHVybiBsJiYobj1sLGM9ViksYT90P3U6cjp0P3k6aX1mdW5jdGlvbiBaKG4sdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPUJvLmV2ZW50O0JvLmV2ZW50PWUsdFswXT10aGlzLl9fZGF0YV9fO3RyeXtuLmFwcGx5KHRoaXMsdCl9ZmluYWxseXtCby5ldmVudD1yfX19ZnVuY3Rpb24gVihuLHQpe3ZhciBlPVoobix0KTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHQ9dGhpcyxyPW4ucmVsYXRlZFRhcmdldDtyJiYocj09PXR8fDgmci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSl8fGUuY2FsbCh0LG4pfX1mdW5jdGlvbiBYKCl7dmFyIG49Ii5kcmFnc3VwcHJlc3MtIisgKytTYSx0PSJjbGljayIrbixlPUJvLnNlbGVjdChRbykub24oInRvdWNobW92ZSIrbixfKS5vbigiZHJhZ3N0YXJ0IituLF8pLm9uKCJzZWxlY3RzdGFydCIrbixfKTtpZih3YSl7dmFyIHI9S28uc3R5bGUsdT1yW3dhXTtyW3dhXT0ibm9uZSJ9cmV0dXJuIGZ1bmN0aW9uKGkpe2Z1bmN0aW9uIG8oKXtlLm9uKHQsbnVsbCl9ZS5vbihuLG51bGwpLHdhJiYoclt3YV09dSksaSYmKGUub24odCxmdW5jdGlvbigpe18oKSxvKCl9LCEwKSxzZXRUaW1lb3V0KG8sMCkpfX1mdW5jdGlvbiAkKG4sdCl7dC5jaGFuZ2VkVG91Y2hlcyYmKHQ9dC5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIGU9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO2lmKDA+a2EmJihRby5zY3JvbGxYfHxRby5zY3JvbGxZKSl7ZT1Cby5zZWxlY3QoImJvZHkiKS5hcHBlbmQoInN2ZyIpLnN0eWxlKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxtYXJnaW46MCxwYWRkaW5nOjAsYm9yZGVyOiJub25lIn0sImltcG9ydGFudCIpO3ZhciB1PWVbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7a2E9ISh1LmZ8fHUuZSksZS5yZW1vdmUoKX1yZXR1cm4ga2E/KHIueD10LnBhZ2VYLHIueT10LnBhZ2VZKTooci54PXQuY2xpZW50WCxyLnk9dC5jbGllbnRZKSxyPXIubWF0cml4VHJhbnNmb3JtKG4uZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSxbci54LHIueV19dmFyIGk9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bdC5jbGllbnRYLWkubGVmdC1uLmNsaWVudExlZnQsdC5jbGllbnRZLWkudG9wLW4uY2xpZW50VG9wXX1mdW5jdGlvbiBCKCl7cmV0dXJuIEJvLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXJ9ZnVuY3Rpb24gVygpe3JldHVybiBCby5ldmVudC50YXJnZXR9ZnVuY3Rpb24gSigpe3JldHVybiBRb31mdW5jdGlvbiBHKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBLKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBRKG4pe3JldHVybiBuPjE/MDotMT5uP0VhOk1hdGguYWNvcyhuKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xP0NhOi0xPm4/LUNhOk1hdGguYXNpbihuKX1mdW5jdGlvbiB0dChuKXtyZXR1cm4oKG49TWF0aC5leHAobikpLTEvbikvMn1mdW5jdGlvbiBldChuKXtyZXR1cm4oKG49TWF0aC5leHAobikpKzEvbikvMn1mdW5jdGlvbiBydChuKXtyZXR1cm4oKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSl9ZnVuY3Rpb24gdXQobil7cmV0dXJuKG49TWF0aC5zaW4obi8yKSkqbn1mdW5jdGlvbiBpdCgpe31mdW5jdGlvbiBvdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBvdD8odGhpcy5oPStuLHRoaXMucz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2Ygb3Q/bmV3IG90KG4uaCxuLnMsbi5sKTpNdCgiIituLF90LG90KTpuZXcgb3Qobix0LGUpfWZ1bmN0aW9uIGF0KG4sdCxlKXtmdW5jdGlvbiByKG4pe3JldHVybiBuPjM2MD9uLT0zNjA6MD5uJiYobis9MzYwKSw2MD5uP2krKG8taSkqbi82MDoxODA+bj9vOjI0MD5uP2krKG8taSkqKDI0MC1uKS82MDppfWZ1bmN0aW9uIHUobil7cmV0dXJuIE1hdGgucm91bmQoMjU1KnIobikpfXZhciBpLG87cmV0dXJuIG49aXNOYU4obik/MDoobiU9MzYwKTwwP24rMzYwOm4sdD1pc05hTih0KT8wOjA+dD8wOnQ+MT8xOnQsZT0wPmU/MDplPjE/MTplLG89LjU+PWU/ZSooMSt0KTplK3QtZSp0LGk9MiplLW8sbmV3IGR0KHUobisxMjApLHUobiksdShuLTEyMCkpfWZ1bmN0aW9uIGN0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGN0Pyh0aGlzLmg9K24sdGhpcy5jPSt0LHZvaWQodGhpcy5sPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBjdD9uZXcgY3Qobi5oLG4uYyxuLmwpOm4gaW5zdGFuY2VvZiBzdD9odChuLmwsbi5hLG4uYik6aHQoKG49YnQoKG49Qm8ucmdiKG4pKS5yLG4uZyxuLmIpKS5sLG4uYSxuLmIpOm5ldyBjdChuLHQsZSl9ZnVuY3Rpb24gbHQobix0LGUpe3JldHVybiBpc05hTihuKSYmKG49MCksaXNOYU4odCkmJih0PTApLG5ldyBzdChlLE1hdGguY29zKG4qPUxhKSp0LE1hdGguc2luKG4pKnQpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHN0Pyh0aGlzLmw9K24sdGhpcy5hPSt0LHZvaWQodGhpcy5iPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBzdD9uZXcgc3Qobi5sLG4uYSxuLmIpOm4gaW5zdGFuY2VvZiBjdD9sdChuLmgsbi5jLG4ubCk6YnQoKG49ZHQobikpLnIsbi5nLG4uYik6bmV3IHN0KG4sdCxlKX1mdW5jdGlvbiBmdChuLHQsZSl7dmFyIHI9KG4rMTYpLzExNix1PXIrdC81MDAsaT1yLWUvMjAwO3JldHVybiB1PWd0KHUpKllhLHI9Z3QocikqSWEsaT1ndChpKSpaYSxuZXcgZHQodnQoMy4yNDA0NTQyKnUtMS41MzcxMzg1KnItLjQ5ODUzMTQqaSksdnQoLS45NjkyNjYqdSsxLjg3NjAxMDgqcisuMDQxNTU2KmkpLHZ0KC4wNTU2NDM0KnUtLjIwNDAyNTkqcisxLjA1NzIyNTIqaSkpfWZ1bmN0aW9uIGh0KG4sdCxlKXtyZXR1cm4gbj4wP25ldyBjdChNYXRoLmF0YW4yKGUsdCkqVGEsTWF0aC5zcXJ0KHQqdCtlKmUpLG4pOm5ldyBjdCgwLzAsMC8wLG4pfWZ1bmN0aW9uIGd0KG4pe3JldHVybiBuPi4yMDY4OTMwMzQ/bipuKm46KG4tNC8yOSkvNy43ODcwMzd9ZnVuY3Rpb24gcHQobil7cmV0dXJuIG4+LjAwODg1Nj9NYXRoLnBvdyhuLDEvMyk6Ny43ODcwMzcqbis0LzI5fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSooLjAwMzA0Pj1uPzEyLjkyKm46MS4wNTUqTWF0aC5wb3cobiwxLzIuNCktLjA1NSkpfWZ1bmN0aW9uIGR0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGR0Pyh0aGlzLnI9fn5uLHRoaXMuZz1+fnQsdm9pZCh0aGlzLmI9fn5lKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBkdD9uZXcgZHQobi5yLG4uZyxuLmIpOk10KCIiK24sZHQsYXQpOm5ldyBkdChuLHQsZSl9ZnVuY3Rpb24gbXQobil7cmV0dXJuIG5ldyBkdChuPj4xNiwyNTUmbj4+OCwyNTUmbil9ZnVuY3Rpb24geXQobil7cmV0dXJuIG10KG4pKyIifWZ1bmN0aW9uIHh0KG4pe3JldHVybiAxNj5uPyIwIitNYXRoLm1heCgwLG4pLnRvU3RyaW5nKDE2KTpNYXRoLm1pbigyNTUsbikudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIE10KG4sdCxlKXt2YXIgcix1LGksbz0wLGE9MCxjPTA7aWYocj0vKFthLXpdKylcKCguKilcKS9pLmV4ZWMobikpc3dpdGNoKHU9clsyXS5zcGxpdCgiLCIpLHJbMV0pe2Nhc2UiaHNsIjpyZXR1cm4gZShwYXJzZUZsb2F0KHVbMF0pLHBhcnNlRmxvYXQodVsxXSkvMTAwLHBhcnNlRmxvYXQodVsyXSkvMTAwKTtjYXNlInJnYiI6cmV0dXJuIHQoU3QodVswXSksU3QodVsxXSksU3QodVsyXSkpfXJldHVybihpPSRhLmdldChuKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gX3Qobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgb3Qocix1LGMpfWZ1bmN0aW9uIGJ0KG4sdCxlKXtuPXd0KG4pLHQ9d3QodCksZT13dChlKTt2YXIgcj1wdCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL1lhKSx1PXB0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS9JYSksaT1wdCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvWmEpO3JldHVybiBzdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiB3dChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBTdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIGt0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gRXQobil7cmV0dXJuIG59ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksQ3QodCxlLG4scil9fWZ1bmN0aW9uIEN0KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIG8uZXJyb3IuY2FsbChpLHIpLHZvaWQgMH1vLmxvYWQuY2FsbChpLG4pfWVsc2Ugby5lcnJvci5jYWxsKGksYyl9dmFyIGk9e30sbz1Cby5kaXNwYXRjaCgiYmVmb3Jlc2VuZCIsInByb2dyZXNzIiwibG9hZCIsImVycm9yIiksYT17fSxjPW5ldyBYTUxIdHRwUmVxdWVzdCxsPW51bGw7cmV0dXJuIVFvLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PUJvLmV2ZW50O0JvLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7Qm8uZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KEpvKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSxCby5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChOdChyKSl9ZnVuY3Rpb24gTnQobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gTHQoKXt2YXIgbj1UdCgpLHQ9cXQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KEdhKSxHYT1zZXRUaW1lb3V0KEx0LHQpKSxKYT0wKTooSmE9MSxRYShMdCkpfWZ1bmN0aW9uIFR0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3IoS2E9QmE7S2E7KW4+PUthLnQmJihLYS5mPUthLmMobi1LYS50KSksS2E9S2EubjtyZXR1cm4gbn1mdW5jdGlvbiBxdCgpe2Zvcih2YXIgbix0PUJhLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjpCYT10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIFdhPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypjYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTpFdDtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9dGMuZXhlYyhuKSxyPWVbMV18fCIgIixvPWVbMl18fCI+IixhPWVbM118fCItIixjPWVbNF18fCIiLGw9ZVs1XSxzPStlWzZdLGY9ZVs3XSxoPWVbOF0sZz1lWzldLHA9MSx2PSIiLGQ9IiIsbT0hMSx5PSEwO3N3aXRjaChoJiYoaD0raC5zdWJzdHJpbmcoMSkpLChsfHwiMCI9PT1yJiYiPSI9PT1vKSYmKGw9cj0iMCIsbz0iPSIpLGcpe2Nhc2UibiI6Zj0hMCxnPSJnIjticmVhaztjYXNlIiUiOnA9MTAwLGQ9IiUiLGc9ImYiO2JyZWFrO2Nhc2UicCI6cD0xMDAsZD0iJSIsZz0iciI7YnJlYWs7Y2FzZSJiIjpjYXNlIm8iOmNhc2UieCI6Y2FzZSJYIjoiIyI9PT1jJiYodj0iMCIrZy50b0xvd2VyQ2FzZSgpKTtjYXNlImMiOnk9ITE7Y2FzZSJkIjptPSEwLGg9MDticmVhaztjYXNlInMiOnA9LTEsZz0iciJ9IiQiPT09YyYmKHY9dVswXSxkPXVbMV0pLCJyIiE9Z3x8aHx8KGc9ImciKSxudWxsIT1oJiYoImciPT1nP2g9TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxoKSk6KCJlIj09Z3x8ImYiPT1nKSYmKGg9TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxoKSkpKSxnPWVjLmdldChnKXx8VXQ7dmFyIHg9bCYmZjtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9ZDtpZihtJiZuJTEpcmV0dXJuIiI7dmFyIHU9MD5ufHwwPT09biYmMD4xL24/KG49LW4sIi0iKToiLSI9PT1hPyIiOmE7aWYoMD5wKXt2YXIgYz1Cby5mb3JtYXRQcmVmaXgobixoKTtuPWMuc2NhbGUobiksZT1jLnN5bWJvbCtkfWVsc2Ugbio9cDtuPWcobixoKTt2YXIgTSxfLGI9bi5sYXN0SW5kZXhPZigiLiIpO2lmKDA+Yil7dmFyIHc9eT9uLmxhc3RJbmRleE9mKCJlIik6LTE7MD53PyhNPW4sXz0iIik6KE09bi5zdWJzdHJpbmcoMCx3KSxfPW4uc3Vic3RyaW5nKHcpKX1lbHNlIE09bi5zdWJzdHJpbmcoMCxiKSxfPXQrbi5zdWJzdHJpbmcoYisxKTshbCYmZiYmKE09aShNLDEvMCkpO3ZhciBTPXYubGVuZ3RoK00ubGVuZ3RoK18ubGVuZ3RoKyh4PzA6dS5sZW5ndGgpLGs9cz5TP25ldyBBcnJheShTPXMtUysxKS5qb2luKHIpOiIiO3JldHVybiB4JiYoTT1pKGsrTSxrLmxlbmd0aD9zLV8ubGVuZ3RoOjEvMCkpLHUrPXYsbj1NK18sKCI8Ij09PW8/dStuK2s6Ij4iPT09bz9rK3UrbjoiXiI9PT1vP2suc3Vic3RyaW5nKDAsUz4+PTEpK3UrbitrLnN1YnN0cmluZyhTKTp1Kyh4P246aytuKSkrZX19fWZ1bmN0aW9uIFV0KG4pe3JldHVybiBuKyIifWZ1bmN0aW9uIGp0KCl7dGhpcy5fPW5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGg+MT9EYXRlLlVUQy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzWzBdKX1mdW5jdGlvbiBGdChuLHQsZSl7ZnVuY3Rpb24gcih0KXt2YXIgZT1uKHQpLHI9aShlLDEpO3JldHVybiByLXQ+dC1lP2U6cn1mdW5jdGlvbiB1KGUpe3JldHVybiB0KGU9bihuZXcgdWMoZS0xKSksMSksZX1mdW5jdGlvbiBpKG4sZSl7cmV0dXJuIHQobj1uZXcgdWMoK24pLGUpLG59ZnVuY3Rpb24gbyhuLHIsaSl7dmFyIG89dShuKSxhPVtdO2lmKGk+MSlmb3IoO3I+bzspZShvKSVpfHxhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7ZWxzZSBmb3IoO3I+bzspYS5wdXNoKG5ldyBEYXRlKCtvKSksdChvLDEpO3JldHVybiBhfWZ1bmN0aW9uIGEobix0LGUpe3RyeXt1Yz1qdDt2YXIgcj1uZXcganQ7cmV0dXJuIHIuXz1uLG8ocix0LGUpfWZpbmFsbHl7dWM9RGF0ZX19bi5mbG9vcj1uLG4ucm91bmQ9cixuLmNlaWw9dSxuLm9mZnNldD1pLG4ucmFuZ2U9bzt2YXIgYz1uLnV0Yz1IdChuKTtyZXR1cm4gYy5mbG9vcj1jLGMucm91bmQ9SHQociksYy5jZWlsPUh0KHUpLGMub2Zmc2V0PUh0KGkpLGMucmFuZ2U9YSxufWZ1bmN0aW9uIEh0KG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3RyeXt1Yz1qdDt2YXIgcj1uZXcganQ7cmV0dXJuIHIuXz10LG4ocixlKS5ffWZpbmFsbHl7dWM9RGF0ZX19fWZ1bmN0aW9uIE90KG4pe2Z1bmN0aW9uIHQobil7ZnVuY3Rpb24gdCh0KXtmb3IodmFyIGUsdSxpLG89W10sYT0tMSxjPTA7KythPHI7KTM3PT09bi5jaGFyQ29kZUF0KGEpJiYoby5wdXNoKG4uc2xpY2UoYyxhKSksbnVsbCE9KHU9b2NbZT1uLmNoYXJBdCgrK2EpXSkmJihlPW4uY2hhckF0KCsrYSkpLChpPUNbZV0pJiYoZT1pKHQsbnVsbD09dT8iZSI9PT1lPyIgIjoiMCI6dSkpLG8ucHVzaChlKSxjPWErMSk7cmV0dXJuIG8ucHVzaChuLnNsaWNlKGMsYSkpLG8uam9pbigiIil9dmFyIHI9bi5sZW5ndGg7cmV0dXJuIHQucGFyc2U9ZnVuY3Rpb24odCl7dmFyIHI9e3k6MTkwMCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MCxaOm51bGx9LHU9ZShyLG4sdCwwKTtpZih1IT10Lmxlbmd0aClyZXR1cm4gbnVsbDsicCJpbiByJiYoci5IPXIuSCUxMisxMipyLnApO3ZhciBpPW51bGwhPXIuWiYmdWMhPT1qdCxvPW5ldyhpP2p0OnVjKTtyZXR1cm4iaiJpbiByP28uc2V0RnVsbFllYXIoci55LDAsci5qKToidyJpbiByJiYoIlciaW4gcnx8IlUiaW4gcik/KG8uc2V0RnVsbFllYXIoci55LDAsMSksby5zZXRGdWxsWWVhcihyLnksMCwiVyJpbiByPyhyLncrNiklNys3KnIuVy0oby5nZXREYXkoKSs1KSU3OnIudys3KnIuVS0oby5nZXREYXkoKSs2KSU3KSk6by5zZXRGdWxsWWVhcihyLnksci5tLHIuZCksby5zZXRIb3VycyhyLkgrKDB8ci5aLzEwMCksci5NK3IuWiUxMDAsci5TLHIuTCksaT9vLl86b30sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBufSx0fWZ1bmN0aW9uIGUobix0LGUscil7Zm9yKHZhciB1LGksbyxhPTAsYz10Lmxlbmd0aCxsPWUubGVuZ3RoO2M+YTspe2lmKHI+PWwpcmV0dXJuLTE7aWYodT10LmNoYXJDb2RlQXQoYSsrKSwzNz09PXUpe2lmKG89dC5jaGFyQXQoYSsrKSxpPU5bbyBpbiBvYz90LmNoYXJBdChhKyspOm9dLCFpfHwocj1pKG4sZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKHUhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIHIobix0LGUpe2IubGFzdEluZGV4PTA7dmFyIHI9Yi5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9dy5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1KG4sdCxlKXtNLmxhc3RJbmRleD0wO3ZhciByPU0uZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi53PV8uZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaShuLHQsZSl7RS5sYXN0SW5kZXg9MDt2YXIgcj1FLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1BLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG8obix0LGUpe1MubGFzdEluZGV4PTA7dmFyIHI9Uy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLm09ay5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhKG4sdCxyKXtyZXR1cm4gZShuLEMuYy50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gYyhuLHQscil7cmV0dXJuIGUobixDLngudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIGwobix0LHIpe3JldHVybiBlKG4sQy5YLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBzKG4sdCxlKXt2YXIgcj14LmdldCh0LnNsaWNlKGUsZSs9MikudG9Mb3dlckNhc2UoKSk7cmV0dXJuIG51bGw9PXI/LTE6KG4ucD1yLGUpfXZhciBmPW4uZGF0ZVRpbWUsaD1uLmRhdGUsZz1uLnRpbWUscD1uLnBlcmlvZHMsdj1uLmRheXMsZD1uLnNob3J0RGF5cyxtPW4ubW9udGhzLHk9bi5zaG9ydE1vbnRoczt0LnV0Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBlKG4pe3RyeXt1Yz1qdDt2YXIgdD1uZXcgdWM7cmV0dXJuIHQuXz1uLHIodCl9ZmluYWxseXt1Yz1EYXRlfX12YXIgcj10KG4pO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4pe3RyeXt1Yz1qdDt2YXIgdD1yLnBhcnNlKG4pO3JldHVybiB0JiZ0Ll99ZmluYWxseXt1Yz1EYXRlfX0sZS50b1N0cmluZz1yLnRvU3RyaW5nLGV9LHQubXVsdGk9dC51dGMubXVsdGk9YWU7dmFyIHg9Qm8ubWFwKCksTT1JdCh2KSxfPVp0KHYpLGI9SXQoZCksdz1adChkKSxTPUl0KG0pLGs9WnQobSksRT1JdCh5KSxBPVp0KHkpO3AuZm9yRWFjaChmdW5jdGlvbihuLHQpe3guc2V0KG4udG9Mb3dlckNhc2UoKSx0KX0pO3ZhciBDPXthOmZ1bmN0aW9uKG4pe3JldHVybiBkW24uZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKG4pe3JldHVybiB2W24uZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKG4pe3JldHVybiB5W24uZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24obil7cmV0dXJuIG1bbi5nZXRNb250aCgpXX0sYzp0KGYpLGQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gWXQobi5nZXREYXRlKCksdCwyKX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldERhdGUoKSx0LDIpfSxIOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0SG91cnMoKSx0LDIpfSxJOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0SG91cnMoKSUxMnx8MTIsdCwyKX0sajpmdW5jdGlvbihuLHQpe3JldHVybiBZdCgxK3JjLmRheU9mWWVhcihuKSx0LDMpfSxMOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0TWlsbGlzZWNvbmRzKCksdCwzKX0sbTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldE1vbnRoKCkrMSx0LDIpfSxNOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0TWludXRlcygpLHQsMil9LHA6ZnVuY3Rpb24obil7cmV0dXJuIHBbKyhuLmdldEhvdXJzKCk+PTEyKV19LFM6ZnVuY3Rpb24obix0KXtyZXR1cm4gWXQobi5nZXRTZWNvbmRzKCksdCwyKX0sVTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChyYy5zdW5kYXlPZlllYXIobiksdCwyKX0sdzpmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKX0sVzpmdW5jdGlvbihuLHQpe3JldHVybiBZdChyYy5tb25kYXlPZlllYXIobiksdCwyKX0seDp0KGgpLFg6dChnKSx5OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0RnVsbFllYXIoKSUxMDAsdCwyKX0sWTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldEZ1bGxZZWFyKCklMWU0LHQsNCl9LFo6aWUsIiUiOmZ1bmN0aW9uKCl7cmV0dXJuIiUifX0sTj17YTpyLEE6dSxiOmksQjpvLGM6YSxkOlF0LGU6UXQsSDp0ZSxJOnRlLGo6bmUsTDp1ZSxtOkt0LE06ZWUscDpzLFM6cmUsVTpYdCx3OlZ0LFc6JHQseDpjLFg6bCx5Old0LFk6QnQsWjpKdCwiJSI6b2V9O3JldHVybiB0fWZ1bmN0aW9uIFl0KG4sdCxlKXt2YXIgcj0wPm4/Ii0iOiIiLHU9KHI/LW46bikrIiIsaT11Lmxlbmd0aDtyZXR1cm4gcisoZT5pP25ldyBBcnJheShlLWkrMSkuam9pbih0KSt1OnUpfWZ1bmN0aW9uIEl0KG4pe3JldHVybiBuZXcgUmVnRXhwKCJeKD86IituLm1hcChCby5yZXF1b3RlKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gWnQobil7Zm9yKHZhciB0PW5ldyBhLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5zZXQobltlXS50b0xvd2VyQ2FzZSgpLGUpO3JldHVybiB0fWZ1bmN0aW9uIFZ0KG4sdCxlKXthYy5sYXN0SW5kZXg9MDt2YXIgcj1hYy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8obi53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFh0KG4sdCxlKXthYy5sYXN0SW5kZXg9MDt2YXIgcj1hYy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gJHQobix0LGUpe2FjLmxhc3RJbmRleD0wO3ZhciByPWFjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBCdChuLHQsZSl7YWMubGFzdEluZGV4PTA7dmFyIHI9YWMuZXhlYyh0LnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KG4ueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBXdChuLHQsZSl7YWMubGFzdEluZGV4PTA7dmFyIHI9YWMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4ueT1HdCgrclswXSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSnQobix0LGUpe3JldHVybi9eWystXVxkezR9JC8udGVzdCh0PXQuc2xpY2UoZSxlKzUpKT8obi5aPS10LGUrNSk6LTF9ZnVuY3Rpb24gR3Qobil7cmV0dXJuIG4rKG4+Njg/MTkwMDoyZTMpfWZ1bmN0aW9uIEt0KG4sdCxlKXthYy5sYXN0SW5kZXg9MDt2YXIgcj1hYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRdChuLHQsZSl7YWMubGFzdEluZGV4PTA7dmFyIHI9YWMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBuZShuLHQsZSl7YWMubGFzdEluZGV4PTA7dmFyIHI9YWMuZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uaj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0ZShuLHQsZSl7YWMubGFzdEluZGV4PTA7dmFyIHI9YWMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBlZShuLHQsZSl7YWMubGFzdEluZGV4PTA7dmFyIHI9YWMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiByZShuLHQsZSl7YWMubGFzdEluZGV4PTA7dmFyIHI9YWMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1ZShuLHQsZSl7YWMubGFzdEluZGV4PTA7dmFyIHI9YWMuZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpZShuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCksZT10PjA/Ii0iOiIrIixyPTB8Y2EodCkvNjAsdT1jYSh0KSU2MDtyZXR1cm4gZStZdChyLCIwIiwyKStZdCh1LCIwIiwyKX1mdW5jdGlvbiBvZShuLHQsZSl7Y2MubGFzdEluZGV4PTA7dmFyIHI9Y2MuZXhlYyh0LnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBhZShuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT0tMTsrK2U8dDspbltlXVswXT10aGlzKG5bZV1bMF0pO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPW5bZV07IXJbMV0odCk7KXI9blsrK2VdO3JldHVybiByWzBdKHQpfX1mdW5jdGlvbiBjZSgpe31mdW5jdGlvbiBsZShuLHQsZSl7dmFyIHI9ZS5zPW4rdCx1PXItbixpPXItdTtlLnQ9bi1pKyh0LXUpfWZ1bmN0aW9uIHNlKG4sdCl7biYmaGMuaGFzT3duUHJvcGVydHkobi50eXBlKSYmaGNbbi50eXBlXShuLHQpfWZ1bmN0aW9uIGZlKG4sdCxlKXt2YXIgcix1PS0xLGk9bi5sZW5ndGgtZTtmb3IodC5saW5lU3RhcnQoKTsrK3U8aTspcj1uW3VdLHQucG9pbnQoclswXSxyWzFdLHJbMl0pO3QubGluZUVuZCgpfWZ1bmN0aW9uIGhlKG4sdCl7dmFyIGU9LTEscj1uLmxlbmd0aDtmb3IodC5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZmUobltlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGdlKCl7ZnVuY3Rpb24gbihuLHQpe24qPUxhLHQ9dCpMYS8yK0VhLzQ7dmFyIGU9bi1yLG89ZT49MD8xOi0xLGE9byplLGM9TWF0aC5jb3ModCksbD1NYXRoLnNpbih0KSxzPWkqbCxmPXUqYytzKk1hdGguY29zKGEpLGg9cypvKk1hdGguc2luKGEpO3BjLmFkZChNYXRoLmF0YW4yKGgsZikpLHI9bix1PWMsaT1sfXZhciB0LGUscix1LGk7dmMucG9pbnQ9ZnVuY3Rpb24obyxhKXt2Yy5wb2ludD1uLHI9KHQ9bykqTGEsdT1NYXRoLmNvcyhhPShlPWEpKkxhLzIrRWEvNCksaT1NYXRoLnNpbihhKX0sdmMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gcGUobil7dmFyIHQ9blswXSxlPW5bMV0scj1NYXRoLmNvcyhlKTtyZXR1cm5bcipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpXX1mdW5jdGlvbiB2ZShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXX1mdW5jdGlvbiBkZShuLHQpe3JldHVybltuWzFdKnRbMl0tblsyXSp0WzFdLG5bMl0qdFswXS1uWzBdKnRbMl0sblswXSp0WzFdLW5bMV0qdFswXV19ZnVuY3Rpb24gbWUobix0KXtuWzBdKz10WzBdLG5bMV0rPXRbMV0sblsyXSs9dFsyXX1mdW5jdGlvbiB5ZShuLHQpe3JldHVybltuWzBdKnQsblsxXSp0LG5bMl0qdF19ZnVuY3Rpb24geGUobil7dmFyIHQ9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0rblsyXSpuWzJdKTtuWzBdLz10LG5bMV0vPXQsblsyXS89dH1mdW5jdGlvbiBNZShuKXtyZXR1cm5bTWF0aC5hdGFuMihuWzFdLG5bMF0pLG50KG5bMl0pXX1mdW5jdGlvbiBfZShuLHQpe3JldHVybiBjYShuWzBdLXRbMF0pPE5hJiZjYShuWzFdLXRbMV0pPE5hfWZ1bmN0aW9uIGJlKG4sdCl7bio9TGE7dmFyIGU9TWF0aC5jb3ModCo9TGEpO3dlKGUqTWF0aC5jb3MobiksZSpNYXRoLnNpbihuKSxNYXRoLnNpbih0KSl9ZnVuY3Rpb24gd2Uobix0LGUpeysrZGMseWMrPShuLXljKS9kYyx4Yys9KHQteGMpL2RjLE1jKz0oZS1NYykvZGN9ZnVuY3Rpb24gU2UoKXtmdW5jdGlvbiBuKG4sdSl7bio9TGE7dmFyIGk9TWF0aC5jb3ModSo9TGEpLG89aSpNYXRoLmNvcyhuKSxhPWkqTWF0aC5zaW4obiksYz1NYXRoLnNpbih1KSxsPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChsPWUqYy1yKmEpKmwrKGw9cipvLXQqYykqbCsobD10KmEtZSpvKSpsKSx0Km8rZSphK3IqYyk7bWMrPWwsX2MrPWwqKHQrKHQ9bykpLGJjKz1sKihlKyhlPWEpKSx3Yys9bCoocisocj1jKSksd2UodCxlLHIpfXZhciB0LGUscjtBYy5wb2ludD1mdW5jdGlvbih1LGkpe3UqPUxhO3ZhciBvPU1hdGguY29zKGkqPUxhKTt0PW8qTWF0aC5jb3ModSksZT1vKk1hdGguc2luKHUpLHI9TWF0aC5zaW4oaSksQWMucG9pbnQ9bix3ZSh0LGUscil9fWZ1bmN0aW9uIGtlKCl7QWMucG9pbnQ9YmV9ZnVuY3Rpb24gRWUoKXtmdW5jdGlvbiBuKG4sdCl7bio9TGE7dmFyIGU9TWF0aC5jb3ModCo9TGEpLG89ZSpNYXRoLmNvcyhuKSxhPWUqTWF0aC5zaW4obiksYz1NYXRoLnNpbih0KSxsPXUqYy1pKmEscz1pKm8tcipjLGY9ciphLXUqbyxoPU1hdGguc3FydChsKmwrcypzK2YqZiksZz1yKm8rdSphK2kqYyxwPWgmJi1RKGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7U2MrPXAqbCxrYys9cCpzLEVjKz1wKmYsbWMrPXYsX2MrPXYqKHIrKHI9bykpLGJjKz12Kih1Kyh1PWEpKSx3Yys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7QWMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLEFjLnBvaW50PW4sbyo9TGE7dmFyIGM9TWF0aC5jb3MoYSo9TGEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LEFjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSksQWMubGluZUVuZD1rZSxBYy5wb2ludD1iZX19ZnVuY3Rpb24gQWUoKXtyZXR1cm4hMH1mdW5jdGlvbiBDZShuLHQsZSxyLHUpe3ZhciBpPVtdLG89W107aWYobi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCEoKHQ9bi5sZW5ndGgtMSk8PTApKXt2YXIgdCxlPW5bMF0scj1uW3RdO2lmKF9lKGUscikpe3UubGluZVN0YXJ0KCk7Zm9yKHZhciBhPTA7dD5hOysrYSl1LnBvaW50KChlPW5bYV0pWzBdLGVbMV0pO3JldHVybiB1LmxpbmVFbmQoKSx2b2lkIDB9dmFyIGM9bmV3IHplKGUsbixudWxsLCEwKSxsPW5ldyB6ZShlLG51bGwsYywhMSk7Yy5vPWwsaS5wdXNoKGMpLG8ucHVzaChsKSxjPW5ldyB6ZShyLG4sbnVsbCwhMSksbD1uZXcgemUocixudWxsLGMsITApLGMubz1sLGkucHVzaChjKSxvLnB1c2gobCl9fSksby5zb3J0KHQpLE5lKGkpLE5lKG8pLGkubGVuZ3RoKXtmb3IodmFyIGE9MCxjPWUsbD1vLmxlbmd0aDtsPmE7KythKW9bYV0uZT1jPSFjO2Zvcih2YXIgcyxmLGg9aVswXTs7KXtmb3IodmFyIGc9aCxwPSEwO2cudjspaWYoKGc9Zy5uKT09PWgpcmV0dXJuO3M9Zy56LHUubGluZVN0YXJ0KCk7ZG97aWYoZy52PWcuby52PSEwLGcuZSl7aWYocClmb3IodmFyIGE9MCxsPXMubGVuZ3RoO2w+YTsrK2EpdS5wb2ludCgoZj1zW2FdKVswXSxmWzFdKTtlbHNlIHIoZy54LGcubi54LDEsdSk7Zz1nLm59ZWxzZXtpZihwKXtzPWcucC56O2Zvcih2YXIgYT1zLmxlbmd0aC0xO2E+PTA7LS1hKXUucG9pbnQoKGY9c1thXSlbMF0sZlsxXSl9ZWxzZSByKGcueCxnLnAueCwtMSx1KTtnPWcucH1nPWcubyxzPWcueixwPSFwfXdoaWxlKCFnLnYpO3UubGluZUVuZCgpfX19ZnVuY3Rpb24gTmUobil7aWYodD1uLmxlbmd0aCl7Zm9yKHZhciB0LGUscj0wLHU9blswXTsrK3I8dDspdS5uPWU9bltyXSxlLnA9dSx1PWU7dS5uPWU9blswXSxlLnA9dX19ZnVuY3Rpb24gemUobix0LGUscil7dGhpcy54PW4sdGhpcy56PXQsdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBMZShuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSxpKXtmdW5jdGlvbiBvKHQsZSl7dmFyIHI9dSh0LGUpO24odD1yWzBdLGU9clsxXSkmJmkucG9pbnQodCxlKX1mdW5jdGlvbiBhKG4sdCl7dmFyIGU9dShuLHQpO2QucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBjKCl7eS5wb2ludD1hLGQubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbCgpe3kucG9pbnQ9byxkLmxpbmVFbmQoKX1mdW5jdGlvbiBzKG4sdCl7di5wdXNoKFtuLHRdKTt2YXIgZT11KG4sdCk7TS5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGYoKXtNLmxpbmVTdGFydCgpLHY9W119ZnVuY3Rpb24gaCgpe3ModlswXVswXSx2WzBdWzFdKSxNLmxpbmVFbmQoKTt2YXIgbix0PU0uY2xlYW4oKSxlPXguYnVmZmVyKCkscj1lLmxlbmd0aDtpZih2LnBvcCgpLHAucHVzaCh2KSx2PW51bGwscilpZigxJnQpe249ZVswXTt2YXIgdSxyPW4ubGVuZ3RoLTEsbz0tMTtpZihyPjApe2ZvcihffHwoaS5wb2x5Z29uU3RhcnQoKSxfPSEwKSxpLmxpbmVTdGFydCgpOysrbzxyOylpLnBvaW50KCh1PW5bb10pWzBdLHVbMV0pO2kubGluZUVuZCgpfX1lbHNlIHI+MSYmMiZ0JiZlLnB1c2goZS5wb3AoKS5jb25jYXQoZS5zaGlmdCgpKSksZy5wdXNoKGUuZmlsdGVyKFRlKSl9dmFyIGcscCx2LGQ9dChpKSxtPXUuaW52ZXJ0KHJbMF0sclsxXSkseT17cG9pbnQ6byxsaW5lU3RhcnQ6YyxsaW5lRW5kOmwscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7eS5wb2ludD1zLHkubGluZVN0YXJ0PWYseS5saW5lRW5kPWgsZz1bXSxwPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7eS5wb2ludD1vLHkubGluZVN0YXJ0PWMseS5saW5lRW5kPWwsZz1Cby5tZXJnZShnKTt2YXIgbj1qZShtLHApO2cubGVuZ3RoPyhffHwoaS5wb2x5Z29uU3RhcnQoKSxfPSEwKSxDZShnLFJlLG4sZSxpKSk6biYmKF98fChpLnBvbHlnb25TdGFydCgpLF89ITApLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSksXyYmKGkucG9seWdvbkVuZCgpLF89ITEpLGc9cD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtpLnBvbHlnb25TdGFydCgpLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSxpLnBvbHlnb25FbmQoKX19LHg9cWUoKSxNPXQoeCksXz0hMTtyZXR1cm4geX19ZnVuY3Rpb24gVGUobil7cmV0dXJuIG4ubGVuZ3RoPjF9ZnVuY3Rpb24gcWUoKXt2YXIgbix0PVtdO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LnB1c2gobj1bXSl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7bi5wdXNoKFt0LGVdKX0sbGluZUVuZDp5LGJ1ZmZlcjpmdW5jdGlvbigpe3ZhciBlPXQ7cmV0dXJuIHQ9W10sbj1udWxsLGV9LHJlam9pbjpmdW5jdGlvbigpe3QubGVuZ3RoPjEmJnQucHVzaCh0LnBvcCgpLmNvbmNhdCh0LnNoaWZ0KCkpKX19fWZ1bmN0aW9uIFJlKG4sdCl7cmV0dXJuKChuPW4ueClbMF08MD9uWzFdLUNhLU5hOkNhLW5bMV0pLSgodD10LngpWzBdPDA/dFsxXS1DYS1OYTpDYS10WzFdKX1mdW5jdGlvbiBEZShuKXt2YXIgdCxlPTAvMCxyPTAvMCx1PTAvMDtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKSx0PTF9LHBvaW50OmZ1bmN0aW9uKGksbyl7dmFyIGE9aT4wP0VhOi1FYSxjPWNhKGktZSk7Y2EoYy1FYSk8TmE/KG4ucG9pbnQoZSxyPShyK28pLzI+MD9DYTotQ2EpLG4ucG9pbnQodSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQoYSxyKSxuLnBvaW50KGksciksdD0wKTp1IT09YSYmYz49RWEmJihjYShlLXUpPE5hJiYoZS09dSpOYSksY2EoaS1hKTxOYSYmKGktPWEqTmEpLHI9UGUoZSxyLGksbyksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChhLHIpLHQ9MCksbi5wb2ludChlPWkscj1vKSx1PWF9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKSxlPXI9MC8wfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLXR9fX1mdW5jdGlvbiBQZShuLHQsZSxyKXt2YXIgdSxpLG89TWF0aC5zaW4obi1lKTtyZXR1cm4gY2Eobyk+TmE/TWF0aC5hdGFuKChNYXRoLnNpbih0KSooaT1NYXRoLmNvcyhyKSkqTWF0aC5zaW4oZSktTWF0aC5zaW4ocikqKHU9TWF0aC5jb3ModCkpKk1hdGguc2luKG4pKS8odSppKm8pKToodCtyKS8yfWZ1bmN0aW9uIFVlKG4sdCxlLHIpe3ZhciB1O2lmKG51bGw9PW4pdT1lKkNhLHIucG9pbnQoLUVhLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KEVhLHUpLHIucG9pbnQoRWEsMCksci5wb2ludChFYSwtdSksci5wb2ludCgwLC11KSxyLnBvaW50KC1FYSwtdSksci5wb2ludCgtRWEsMCksci5wb2ludCgtRWEsdSk7ZWxzZSBpZihjYShuWzBdLXRbMF0pPk5hKXt2YXIgaT1uWzBdPHRbMF0/RWE6LUVhO3U9ZSppLzIsci5wb2ludCgtaSx1KSxyLnBvaW50KDAsdSksci5wb2ludChpLHUpfWVsc2Ugci5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIGplKG4sdCl7dmFyIGU9blswXSxyPW5bMV0sdT1bTWF0aC5zaW4oZSksLU1hdGguY29zKGUpLDBdLGk9MCxvPTA7cGMucmVzZXQoKTtmb3IodmFyIGE9MCxjPXQubGVuZ3RoO2M+YTsrK2Epe3ZhciBsPXRbYV0scz1sLmxlbmd0aDtpZihzKWZvcih2YXIgZj1sWzBdLGg9ZlswXSxnPWZbMV0vMitFYS80LHA9TWF0aC5zaW4oZyksdj1NYXRoLmNvcyhnKSxkPTE7Oyl7ZD09PXMmJihkPTApLG49bFtkXTt2YXIgbT1uWzBdLHk9blsxXS8yK0VhLzQseD1NYXRoLnNpbih5KSxNPU1hdGguY29zKHkpLF89bS1oLGI9Xz49MD8xOi0xLHc9YipfLFM9dz5FYSxrPXAqeDtpZihwYy5hZGQoTWF0aC5hdGFuMihrKmIqTWF0aC5zaW4odyksdipNK2sqTWF0aC5jb3ModykpKSxpKz1TP18rYipBYTpfLFNeaD49ZV5tPj1lKXt2YXIgRT1kZShwZShmKSxwZShuKSk7eGUoRSk7dmFyIEE9ZGUodSxFKTt4ZShBKTt2YXIgQz0oU15fPj0wPy0xOjEpKm50KEFbMl0pOyhyPkN8fHI9PT1DJiYoRVswXXx8RVsxXSkpJiYobys9U15fPj0wPzE6LTEpfWlmKCFkKyspYnJlYWs7aD1tLHA9eCx2PU0sZj1ufX1yZXR1cm4oLU5hPml8fE5hPmkmJjA+cGMpXjEmb31mdW5jdGlvbiBGZShuKXtmdW5jdGlvbiB0KG4sdCl7cmV0dXJuIE1hdGguY29zKG4pKk1hdGguY29zKHQpPml9ZnVuY3Rpb24gZShuKXt2YXIgZSxpLGMsbCxzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtsPWM9ITEscz0xfSxwb2ludDpmdW5jdGlvbihmLGgpe3ZhciBnLHA9W2YsaF0sdj10KGYsaCksZD1vP3Y/MDp1KGYsaCk6dj91KGYrKDA+Zj9FYTotRWEpLGgpOjA7aWYoIWUmJihsPWM9dikmJm4ubGluZVN0YXJ0KCksdiE9PWMmJihnPXIoZSxwKSwoX2UoZSxnKXx8X2UocCxnKSkmJihwWzBdKz1OYSxwWzFdKz1OYSx2PXQocFswXSxwWzFdKSkpLHYhPT1jKXM9MCx2PyhuLmxpbmVTdGFydCgpLGc9cihwLGUpLG4ucG9pbnQoZ1swXSxnWzFdKSk6KGc9cihlLHApLG4ucG9pbnQoZ1swXSxnWzFdKSxuLmxpbmVFbmQoKSksZT1nO2Vsc2UgaWYoYSYmZSYmb152KXt2YXIgbTtkJml8fCEobT1yKHAsZSwhMCkpfHwocz0wLG8/KG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pLG4ucG9pbnQobVsxXVswXSxtWzFdWzFdKSxuLmxpbmVFbmQoKSk6KG4ucG9pbnQobVsxXVswXSxtWzFdWzFdKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQobVswXVswXSxtWzBdWzFdKSkpfSF2fHxlJiZfZShlLHApfHxuLnBvaW50KHBbMF0scFsxXSksZT1wLGM9dixpPWR9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtjJiZuLmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHN8KGwmJmMpPDwxfX19ZnVuY3Rpb24gcihuLHQsZSl7dmFyIHI9cGUobiksdT1wZSh0KSxvPVsxLDAsMF0sYT1kZShyLHUpLGM9dmUoYSxhKSxsPWFbMF0scz1jLWwqbDtpZighcylyZXR1cm4hZSYmbjt2YXIgZj1pKmMvcyxoPS1pKmwvcyxnPWRlKG8sYSkscD15ZShvLGYpLHY9eWUoYSxoKTttZShwLHYpO3ZhciBkPWcsbT12ZShwLGQpLHk9dmUoZCxkKSx4PW0qbS15Kih2ZShwLHApLTEpO2lmKCEoMD54KSl7dmFyIE09TWF0aC5zcXJ0KHgpLF89eWUoZCwoLW0tTSkveSk7aWYobWUoXyxwKSxfPU1lKF8pLCFlKXJldHVybiBfO3ZhciBiLHc9blswXSxTPXRbMF0saz1uWzFdLEU9dFsxXTt3PlMmJihiPXcsdz1TLFM9Yik7dmFyIEE9Uy13LEM9Y2EoQS1FYSk8TmEsTj1DfHxOYT5BO2lmKCFDJiZrPkUmJihiPWssaz1FLEU9YiksTj9DP2srRT4wXl9bMV08KGNhKF9bMF0tdyk8TmE/azpFKTprPD1fWzFdJiZfWzFdPD1FOkE+RWFeKHc8PV9bMF0mJl9bMF08PVMpKXt2YXIgej15ZShkLCgtbStNKS95KTtyZXR1cm4gbWUoeixwKSxbXyxNZSh6KV19fX1mdW5jdGlvbiB1KHQsZSl7dmFyIHI9bz9uOkVhLW4sdT0wO3JldHVybi1yPnQ/dXw9MTp0PnImJih1fD0yKSwtcj5lP3V8PTQ6ZT5yJiYodXw9OCksdX12YXIgaT1NYXRoLmNvcyhuKSxvPWk+MCxhPWNhKGkpPk5hLGM9Z3Iobiw2KkxhKTtyZXR1cm4gTGUodCxlLGMsbz9bMCwtbl06Wy1FYSxuLUVhXSl9ZnVuY3Rpb24gSGUobix0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciBpLG89dS5hLGE9dS5iLGM9by54LGw9by55LHM9YS54LGY9YS55LGg9MCxnPTEscD1zLWMsdj1mLWw7aWYoaT1uLWMscHx8IShpPjApKXtpZihpLz1wLDA+cCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWVsc2UgaWYocD4wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9aWYoaT1lLWMscHx8ISgwPmkpKXtpZihpLz1wLDA+cCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWVsc2UgaWYocD4wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9aWYoaT10LWwsdnx8IShpPjApKXtpZihpLz12LDA+dil7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWVsc2UgaWYodj4wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9aWYoaT1yLWwsdnx8ISgwPmkpKXtpZihpLz12LDA+dil7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWVsc2UgaWYodj4wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9cmV0dXJuIGg+MCYmKHUuYT17eDpjK2gqcCx5OmwraCp2fSksMT5nJiYodS5iPXt4OmMrZypwLHk6bCtnKnZ9KSx1fX19fX19ZnVuY3Rpb24gT2Uobix0LGUscil7ZnVuY3Rpb24gdShyLHUpe3JldHVybiBjYShyWzBdLW4pPE5hP3U+MD8wOjM6Y2EoclswXS1lKTxOYT91PjA/MjoxOmNhKHJbMV0tdCk8TmE/dT4wPzE6MDp1PjA/MzoyfWZ1bmN0aW9uIGkobix0KXtyZXR1cm4gbyhuLngsdC54KX1mdW5jdGlvbiBvKG4sdCl7dmFyIGU9dShuLDEpLHI9dSh0LDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/dFsxXS1uWzFdOjE9PT1lP25bMF0tdFswXToyPT09ZT9uWzFdLXRbMV06dFswXS1uWzBdfXJldHVybiBmdW5jdGlvbihhKXtmdW5jdGlvbiBjKG4pe2Zvcih2YXIgdD0wLGU9ZC5sZW5ndGgscj1uWzFdLHU9MDtlPnU7Kyt1KWZvcih2YXIgaSxvPTEsYT1kW3VdLGM9YS5sZW5ndGgsbD1hWzBdO2M+bzsrK28paT1hW29dLGxbMV08PXI/aVsxXT5yJiZLKGwsaSxuKT4wJiYrK3Q6aVsxXTw9ciYmSyhsLGksbik8MCYmLS10LGw9aTtyZXR1cm4gMCE9PXR9ZnVuY3Rpb24gbChpLGEsYyxsKXt2YXIgcz0wLGY9MDtpZihudWxsPT1pfHwocz11KGksYykpIT09KGY9dShhLGMpKXx8byhpLGEpPDBeYz4wKXtkbyBsLnBvaW50KDA9PT1zfHwzPT09cz9uOmUscz4xP3I6dCk7d2hpbGUoKHM9KHMrYys0KSU0KSE9PWYpfWVsc2UgbC5wb2ludChhWzBdLGFbMV0pfWZ1bmN0aW9uIHModSxpKXtyZXR1cm4gdT49biYmZT49dSYmaT49dCYmcj49aX1mdW5jdGlvbiBmKG4sdCl7cyhuLHQpJiZhLnBvaW50KG4sdCl9ZnVuY3Rpb24gaCgpe04ucG9pbnQ9cCxkJiZkLnB1c2gobT1bXSksUz0hMCx3PSExLF89Yj0wLzB9ZnVuY3Rpb24gZygpe3YmJihwKHkseCksTSYmdyYmQS5yZWpvaW4oKSx2LnB1c2goQS5idWZmZXIoKSkpLE4ucG9pbnQ9Zix3JiZhLmxpbmVFbmQoKX1mdW5jdGlvbiBwKG4sdCl7bj1NYXRoLm1heCgtTmMsTWF0aC5taW4oTmMsbikpLHQ9TWF0aC5tYXgoLU5jLE1hdGgubWluKE5jLHQpKTt2YXIgZT1zKG4sdCk7aWYoZCYmbS5wdXNoKFtuLHRdKSxTKXk9bix4PXQsTT1lLFM9ITEsZSYmKGEubGluZVN0YXJ0KCksYS5wb2ludChuLHQpKTtlbHNlIGlmKGUmJncpYS5wb2ludChuLHQpO2Vsc2V7dmFyIHI9e2E6e3g6Xyx5OmJ9LGI6e3g6bix5OnR9fTtDKHIpPyh3fHwoYS5saW5lU3RhcnQoKSxhLnBvaW50KHIuYS54LHIuYS55KSksYS5wb2ludChyLmIueCxyLmIueSksZXx8YS5saW5lRW5kKCksaz0hMSk6ZSYmKGEubGluZVN0YXJ0KCksYS5wb2ludChuLHQpLGs9ITEpfV89bixiPXQsdz1lfXZhciB2LGQsbSx5LHgsTSxfLGIsdyxTLGssRT1hLEE9cWUoKSxDPUhlKG4sdCxlLHIpLE49e3BvaW50OmYsbGluZVN0YXJ0OmgsbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2E9QSx2PVtdLGQ9W10saz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2E9RSx2PUJvLm1lcmdlKHYpO3ZhciB0PWMoW24scl0pLGU9ayYmdCx1PXYubGVuZ3RoOyhlfHx1KSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksbChudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksdSYmQ2UodixpLHQsbCxhKSxhLnBvbHlnb25FbmQoKSksdj1kPW09bnVsbH19O3JldHVybiBOfX1mdW5jdGlvbiBZZShuLHQpe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT1uKGUsciksdChlWzBdLGVbMV0pfXJldHVybiBuLmludmVydCYmdC5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybiBlPXQuaW52ZXJ0KGUsciksZSYmbi5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24gSWUobil7dmFyIHQ9MCxlPUVhLzMscj1pcihuKSx1PXIodCxlKTtyZXR1cm4gdS5wYXJhbGxlbHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cih0PW5bMF0qRWEvMTgwLGU9blsxXSpFYS8xODApOlsxODAqKHQvRWEpLDE4MCooZS9FYSldfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsbnQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtMYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O1BjLnBvaW50PWZ1bmN0aW9uKGksbyl7UGMucG9pbnQ9bix0PXI9aSxlPXU9b30sUGMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtUYz5uJiYoVGM9biksbj5SYyYmKFJjPW4pLHFjPnQmJihxYz10KSx0PkRjJiYoRGM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe3ljKz1uLHhjKz10LCsrTWN9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO19jKz1vKih0K24pLzIsYmMrPW8qKGUrcikvMix3Yys9byxXZSh0PW4sZT1yKX12YXIgdCxlO2pjLnBvaW50PWZ1bmN0aW9uKHIsdSl7amMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtqYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7X2MrPW8qKHIrbikvMixiYys9byoodSt0KS8yLHdjKz1vLG89dSpuLXIqdCxTYys9byoocituKSxrYys9byoodSt0KSxFYys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O2pjLnBvaW50PWZ1bmN0aW9uKGksbyl7amMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LGpjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0LGUpLG4uYXJjKHQsZSxvLDAsQWEpfWZ1bmN0aW9uIGUodCxlKXtuLm1vdmVUbyh0LGUpLGEucG9pbnQ9cn1mdW5jdGlvbiByKHQsZSl7bi5saW5lVG8odCxlKX1mdW5jdGlvbiB1KCl7YS5wb2ludD10fWZ1bmN0aW9uIGkoKXtuLmNsb3NlUGF0aCgpfXZhciBvPTQuNSxhPXtwb2ludDp0LGxpbmVTdGFydDpmdW5jdGlvbigpe2EucG9pbnQ9ZX0sbGluZUVuZDp1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2EubGluZUVuZD1pfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YS5saW5lRW5kPXUsYS5wb2ludD10fSxwb2ludFJhZGl1czpmdW5jdGlvbihuKXtyZXR1cm4gbz1uLGF9LHJlc3VsdDp5fTtyZXR1cm4gYX1mdW5jdGlvbiBucihuKXtmdW5jdGlvbiB0KG4pe3JldHVybihhP3I6ZSkobil9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gcnIodCxmdW5jdGlvbihlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX0pfWZ1bmN0aW9uIHIodCl7ZnVuY3Rpb24gZShlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiByKCl7eD0wLzAsUy5wb2ludD1pLHQubGluZVN0YXJ0KCl9ZnVuY3Rpb24gaShlLHIpe3ZhciBpPXBlKFtlLHJdKSxvPW4oZSxyKTt1KHgsTSx5LF8sYix3LHg9b1swXSxNPW9bMV0seT1lLF89aVswXSxiPWlbMV0sdz1pWzJdLGEsdCksdC5wb2ludCh4LE0pfWZ1bmN0aW9uIG8oKXtTLnBvaW50PWUsdC5saW5lRW5kKCl9ZnVuY3Rpb24gYygpe3IoKSxTLnBvaW50PWwsUy5saW5lRW5kPXN9ZnVuY3Rpb24gbChuLHQpe2koZj1uLGg9dCksZz14LHA9TSx2PV8sZD1iLG09dyxTLnBvaW50PWl9ZnVuY3Rpb24gcygpe3UoeCxNLHksXyxiLHcsZyxwLGYsdixkLG0sYSx0KSxTLmxpbmVFbmQ9byxvKCl9dmFyIGYsaCxnLHAsdixkLG0seSx4LE0sXyxiLHcsUz17cG9pbnQ6ZSxsaW5lU3RhcnQ6cixsaW5lRW5kOm8scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dC5wb2x5Z29uU3RhcnQoKSxTLmxpbmVTdGFydD1jfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksUy5saW5lU3RhcnQ9cn19O3JldHVybiBTfWZ1bmN0aW9uIHUodCxlLHIsYSxjLGwscyxmLGgsZyxwLHYsZCxtKXt2YXIgeT1zLXQseD1mLWUsTT15KnkreCp4O2lmKE0+NCppJiZkLS0pe3ZhciBfPWErZyxiPWMrcCx3PWwrdixTPU1hdGguc3FydChfKl8rYipiK3cqdyksaz1NYXRoLmFzaW4ody89UyksRT1jYShjYSh3KS0xKTxOYXx8Y2Eoci1oKTxOYT8ocitoKS8yOk1hdGguYXRhbjIoYixfKSxBPW4oRSxrKSxDPUFbMF0sTj1BWzFdLHo9Qy10LEw9Ti1lLFQ9eCp6LXkqTDsKKFQqVC9NPml8fGNhKCh5KnoreCpMKS9NLS41KT4uM3x8bz5hKmcrYypwK2wqdikmJih1KHQsZSxyLGEsYyxsLEMsTixFLF8vPVMsYi89Uyx3LGQsbSksbS5wb2ludChDLE4pLHUoQyxOLEUsXyxiLHcscyxmLGgsZyxwLHYsZCxtKSl9fXZhciBpPS41LG89TWF0aC5jb3MoMzAqTGEpLGE9MTY7cmV0dXJuIHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPShpPW4qbik+MCYmMTYsdCk6TWF0aC5zcXJ0KGkpfSx0fWZ1bmN0aW9uIHRyKG4pe3ZhciB0PW5yKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oW3QqVGEsZSpUYV0pfSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBvcih0KG4pKX19ZnVuY3Rpb24gZXIobil7dGhpcy5zdHJlYW09bn1mdW5jdGlvbiBycihuLHQpe3JldHVybntwb2ludDp0LHNwaGVyZTpmdW5jdGlvbigpe24uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gdXIobil7cmV0dXJuIGlyKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSgpfWZ1bmN0aW9uIGlyKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuIG49YShuWzBdKkxhLG5bMV0qTGEpLFtuWzBdKmgrYyxsLW5bMV0qaF19ZnVuY3Rpb24gZShuKXtyZXR1cm4gbj1hLmludmVydCgoblswXS1jKS9oLChsLW5bMV0pL2gpLG4mJltuWzBdKlRhLG5bMV0qVGFdfWZ1bmN0aW9uIHIoKXthPVllKG89bHIobSx5LHgpLGkpO3ZhciBuPWkodixkKTtyZXR1cm4gYz1nLW5bMF0qaCxsPXArblsxXSpoLHUoKX1mdW5jdGlvbiB1KCl7cmV0dXJuIHMmJihzLnZhbGlkPSExLHM9bnVsbCksdH12YXIgaSxvLGEsYyxsLHMsZj1ucihmdW5jdGlvbihuLHQpe3JldHVybiBuPWkobix0KSxbblswXSpoK2MsbC1uWzFdKmhdfSksaD0xNTAsZz00ODAscD0yNTAsdj0wLGQ9MCxtPTAseT0wLHg9MCxNPUNjLF89RXQsYj1udWxsLHc9bnVsbDtyZXR1cm4gdC5zdHJlYW09ZnVuY3Rpb24obil7cmV0dXJuIHMmJihzLnZhbGlkPSExKSxzPW9yKE0obyxmKF8obikpKSkscy52YWxpZD0hMCxzfSx0LmNsaXBBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1udWxsPT1uPyhiPW4sQ2MpOkZlKChiPStuKSpMYSksdSgpKTpifSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9bixfPW4/T2UoblswXVswXSxuWzBdWzFdLG5bMV1bMF0sblsxXVsxXSk6RXQsdSgpKTp3fSx0LnNjYWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPStuLHIoKSk6aH0sdC50cmFuc2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K25bMF0scD0rblsxXSxyKCkpOltnLHBdfSx0LmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1uWzBdJTM2MCpMYSxkPW5bMV0lMzYwKkxhLHIoKSk6W3YqVGEsZCpUYV19LHQucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW5bMF0lMzYwKkxhLHk9blsxXSUzNjAqTGEseD1uLmxlbmd0aD4yP25bMl0lMzYwKkxhOjAscigpKTpbbSpUYSx5KlRhLHgqVGFdfSxCby5yZWJpbmQodCxmLCJwcmVjaXNpb24iKSxmdW5jdGlvbigpe3JldHVybiBpPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuaW52ZXJ0PWkuaW52ZXJ0JiZlLHIoKX19ZnVuY3Rpb24gb3Iobil7cmV0dXJuIHJyKG4sZnVuY3Rpb24odCxlKXtuLnBvaW50KHQqTGEsZSpMYSl9KX1mdW5jdGlvbiBhcihuLHQpe3JldHVybltuLHRdfWZ1bmN0aW9uIGNyKG4sdCl7cmV0dXJuW24+RWE/bi1BYTotRWE+bj9uK0FhOm4sdF19ZnVuY3Rpb24gbHIobix0LGUpe3JldHVybiBuP3R8fGU/WWUoZnIobiksaHIodCxlKSk6ZnIobik6dHx8ZT9ocih0LGUpOmNyfWZ1bmN0aW9uIHNyKG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1uLFt0PkVhP3QtQWE6LUVhPnQ/dCtBYTp0LGVdfX1mdW5jdGlvbiBmcihuKXt2YXIgdD1zcihuKTtyZXR1cm4gdC5pbnZlcnQ9c3IoLW4pLHR9ZnVuY3Rpb24gaHIobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGM9TWF0aC5zaW4obikqZSxsPU1hdGguc2luKHQpLHM9bCpyK2EqdTtyZXR1cm5bTWF0aC5hdGFuMihjKmktcypvLGEqci1sKnUpLG50KHMqaStjKm8pXX12YXIgcj1NYXRoLmNvcyhuKSx1PU1hdGguc2luKG4pLGk9TWF0aC5jb3ModCksbz1NYXRoLnNpbih0KTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1NYXRoLmNvcyh0KSxhPU1hdGguY29zKG4pKmUsYz1NYXRoLnNpbihuKSplLGw9TWF0aC5zaW4odCkscz1sKmktYypvO3JldHVybltNYXRoLmF0YW4yKGMqaStsKm8sYSpyK3MqdSksbnQocypyLWEqdSldfSxlfWZ1bmN0aW9uIGdyKG4sdCl7dmFyIGU9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKTtyZXR1cm4gZnVuY3Rpb24odSxpLG8sYSl7dmFyIGM9byp0O251bGwhPXU/KHU9cHIoZSx1KSxpPXByKGUsaSksKG8+MD9pPnU6dT5pKSYmKHUrPW8qQWEpKToodT1uK28qQWEsaT1uLS41KmMpO2Zvcih2YXIgbCxzPXU7bz4wP3M+aTppPnM7cy09YylhLnBvaW50KChsPU1lKFtlLC1yKk1hdGguY29zKHMpLC1yKk1hdGguc2luKHMpXSkpWzBdLGxbMV0pfX1mdW5jdGlvbiBwcihuLHQpe3ZhciBlPXBlKHQpO2VbMF0tPW4seGUoZSk7dmFyIHI9USgtZVsxXSk7cmV0dXJuKCgtZVsyXTwwPy1yOnIpKzIqTWF0aC5QSS1OYSklKDIqTWF0aC5QSSl9ZnVuY3Rpb24gdnIobix0LGUpe3ZhciByPUJvLnJhbmdlKG4sdC1OYSxlKS5jb25jYXQodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiByLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bbix0XX0pfX1mdW5jdGlvbiBkcihuLHQsZSl7dmFyIHI9Qm8ucmFuZ2Uobix0LU5hLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVyblt0LG5dfSl9fWZ1bmN0aW9uIG1yKG4pe3JldHVybiBuLnNvdXJjZX1mdW5jdGlvbiB5cihuKXtyZXR1cm4gbi50YXJnZXR9ZnVuY3Rpb24geHIobix0LGUscil7dmFyIHU9TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxvPU1hdGguY29zKHIpLGE9TWF0aC5zaW4ociksYz11Kk1hdGguY29zKG4pLGw9dSpNYXRoLnNpbihuKSxzPW8qTWF0aC5jb3MoZSksZj1vKk1hdGguc2luKGUpLGg9MipNYXRoLmFzaW4oTWF0aC5zcXJ0KHV0KHItdCkrdSpvKnV0KGUtbikpKSxnPTEvTWF0aC5zaW4oaCkscD1oP2Z1bmN0aW9uKG4pe3ZhciB0PU1hdGguc2luKG4qPWgpKmcsZT1NYXRoLnNpbihoLW4pKmcscj1lKmMrdCpzLHU9ZSpsK3QqZixvPWUqaSt0KmE7cmV0dXJuW01hdGguYXRhbjIodSxyKSpUYSxNYXRoLmF0YW4yKG8sTWF0aC5zcXJ0KHIqcit1KnUpKSpUYV19OmZ1bmN0aW9uKCl7cmV0dXJuW24qVGEsdCpUYV19O3JldHVybiBwLmRpc3RhbmNlPWgscH1mdW5jdGlvbiBNcigpe2Z1bmN0aW9uIG4obix1KXt2YXIgaT1NYXRoLnNpbih1Kj1MYSksbz1NYXRoLmNvcyh1KSxhPWNhKChuKj1MYSktdCksYz1NYXRoLmNvcyhhKTtGYys9TWF0aC5hdGFuMihNYXRoLnNxcnQoKGE9bypNYXRoLnNpbihhKSkqYSsoYT1yKmktZSpvKmMpKmEpLGUqaStyKm8qYyksdD1uLGU9aSxyPW99dmFyIHQsZSxyO0hjLnBvaW50PWZ1bmN0aW9uKHUsaSl7dD11KkxhLGU9TWF0aC5zaW4oaSo9TGEpLHI9TWF0aC5jb3MoaSksSGMucG9pbnQ9bn0sSGMubGluZUVuZD1mdW5jdGlvbigpe0hjLnBvaW50PUhjLmxpbmVFbmQ9eX19ZnVuY3Rpb24gX3Iobix0KXtmdW5jdGlvbiBlKHQsZSl7dmFyIHI9TWF0aC5jb3ModCksdT1NYXRoLmNvcyhlKSxpPW4ocip1KTtyZXR1cm5baSp1Kk1hdGguc2luKHQpLGkqTWF0aC5zaW4oZSldfXJldHVybiBlLmludmVydD1mdW5jdGlvbihuLGUpe3ZhciByPU1hdGguc3FydChuKm4rZSplKSx1PXQociksaT1NYXRoLnNpbih1KSxvPU1hdGguY29zKHUpO3JldHVybltNYXRoLmF0YW4yKG4qaSxyKm8pLE1hdGguYXNpbihyJiZlKmkvcildfSxlfWZ1bmN0aW9uIGJyKG4sdCl7ZnVuY3Rpb24gZShuLHQpe28+MD8tQ2ErTmE+dCYmKHQ9LUNhK05hKTp0PkNhLU5hJiYodD1DYS1OYSk7dmFyIGU9by9NYXRoLnBvdyh1KHQpLGkpO3JldHVybltlKk1hdGguc2luKGkqbiksby1lKk1hdGguY29zKGkqbildfXZhciByPU1hdGguY29zKG4pLHU9ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgudGFuKEVhLzQrbi8yKX0saT1uPT09dD9NYXRoLnNpbihuKTpNYXRoLmxvZyhyL01hdGguY29zKHQpKS9NYXRoLmxvZyh1KHQpL3UobikpLG89cipNYXRoLnBvdyh1KG4pLGkpL2k7cmV0dXJuIGk/KGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9by10LHI9RyhpKSpNYXRoLnNxcnQobipuK2UqZSk7cmV0dXJuW01hdGguYXRhbjIobixlKS9pLDIqTWF0aC5hdGFuKE1hdGgucG93KG8vciwxL2kpKS1DYV19LGUpOlNyfWZ1bmN0aW9uIHdyKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPWktdDtyZXR1cm5bZSpNYXRoLnNpbih1Km4pLGktZSpNYXRoLmNvcyh1Km4pXX12YXIgcj1NYXRoLmNvcyhuKSx1PW49PT10P01hdGguc2luKG4pOihyLU1hdGguY29zKHQpKS8odC1uKSxpPXIvdStuO3JldHVybiBjYSh1KTxOYT9hcjooZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1pLXQ7cmV0dXJuW01hdGguYXRhbjIobixlKS91LGktRyh1KSpNYXRoLnNxcnQobipuK2UqZSldfSxlKX1mdW5jdGlvbiBTcihuLHQpe3JldHVybltuLE1hdGgubG9nKE1hdGgudGFuKEVhLzQrdC8yKSldfWZ1bmN0aW9uIGtyKG4pe3ZhciB0LGU9dXIobikscj1lLnNjYWxlLHU9ZS50cmFuc2xhdGUsaT1lLmNsaXBFeHRlbnQ7cmV0dXJuIGUuc2NhbGU9ZnVuY3Rpb24oKXt2YXIgbj1yLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dD9lLmNsaXBFeHRlbnQobnVsbCk6ZTpufSxlLnRyYW5zbGF0ZT1mdW5jdGlvbigpe3ZhciBuPXUuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUuY2xpcEV4dGVudD1mdW5jdGlvbihuKXt2YXIgbz1pLmFwcGx5KGUsYXJndW1lbnRzKTtpZihvPT09ZSl7aWYodD1udWxsPT1uKXt2YXIgYT1FYSpyKCksYz11KCk7aShbW2NbMF0tYSxjWzFdLWFdLFtjWzBdK2EsY1sxXSthXV0pfX1lbHNlIHQmJihvPW51bGwpO3JldHVybiBvfSxlLmNsaXBFeHRlbnQobnVsbCl9ZnVuY3Rpb24gRXIobix0KXtyZXR1cm5bTWF0aC5sb2coTWF0aC50YW4oRWEvNCt0LzIpKSwtbl19ZnVuY3Rpb24gQXIobil7cmV0dXJuIG5bMF19ZnVuY3Rpb24gQ3Iobil7cmV0dXJuIG5bMV19ZnVuY3Rpb24gTnIobil7Zm9yKHZhciB0PW4ubGVuZ3RoLGU9WzAsMV0scj0yLHU9Mjt0PnU7dSsrKXtmb3IoO3I+MSYmSyhuW2Vbci0yXV0sbltlW3ItMV1dLG5bdV0pPD0wOyktLXI7ZVtyKytdPXV9cmV0dXJuIGUuc2xpY2UoMCxyKX1mdW5jdGlvbiB6cihuLHQpe3JldHVybiBuWzBdLXRbMF18fG5bMV0tdFsxXX1mdW5jdGlvbiBMcihuLHQsZSl7cmV0dXJuKGVbMF0tdFswXSkqKG5bMV0tdFsxXSk8KGVbMV0tdFsxXSkqKG5bMF0tdFswXSl9ZnVuY3Rpb24gVHIobix0LGUscil7dmFyIHU9blswXSxpPWVbMF0sbz10WzBdLXUsYT1yWzBdLWksYz1uWzFdLGw9ZVsxXSxzPXRbMV0tYyxmPXJbMV0tbCxoPShhKihjLWwpLWYqKHUtaSkpLyhmKm8tYSpzKTtyZXR1cm5bdStoKm8sYytoKnNdfWZ1bmN0aW9uIHFyKG4pe3ZhciB0PW5bMF0sZT1uW24ubGVuZ3RoLTFdO3JldHVybiEodFswXS1lWzBdfHx0WzFdLWVbMV0pfWZ1bmN0aW9uIFJyKCl7dHUodGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIERyKG4pe3ZhciB0PUtjLnBvcCgpfHxuZXcgUnI7cmV0dXJuIHQuc2l0ZT1uLHR9ZnVuY3Rpb24gUHIobil7WHIobiksV2MucmVtb3ZlKG4pLEtjLnB1c2gobiksdHUobil9ZnVuY3Rpb24gVXIobil7dmFyIHQ9bi5jaXJjbGUsZT10Lngscj10LmN5LHU9e3g6ZSx5OnJ9LGk9bi5QLG89bi5OLGE9W25dO1ByKG4pO2Zvcih2YXIgYz1pO2MuY2lyY2xlJiZjYShlLWMuY2lyY2xlLngpPE5hJiZjYShyLWMuY2lyY2xlLmN5KTxOYTspaT1jLlAsYS51bnNoaWZ0KGMpLFByKGMpLGM9aTthLnVuc2hpZnQoYyksWHIoYyk7Zm9yKHZhciBsPW87bC5jaXJjbGUmJmNhKGUtbC5jaXJjbGUueCk8TmEmJmNhKHItbC5jaXJjbGUuY3kpPE5hOylvPWwuTixhLnB1c2gobCksUHIobCksbD1vO2EucHVzaChsKSxYcihsKTt2YXIgcyxmPWEubGVuZ3RoO2ZvcihzPTE7Zj5zOysrcylsPWFbc10sYz1hW3MtMV0sS3IobC5lZGdlLGMuc2l0ZSxsLnNpdGUsdSk7Yz1hWzBdLGw9YVtmLTFdLGwuZWRnZT1KcihjLnNpdGUsbC5zaXRlLG51bGwsdSksVnIoYyksVnIobCl9ZnVuY3Rpb24ganIobil7Zm9yKHZhciB0LGUscix1LGk9bi54LG89bi55LGE9V2MuXzthOylpZihyPUZyKGEsbyktaSxyPk5hKWE9YS5MO2Vsc2V7aWYodT1pLUhyKGEsbyksISh1Pk5hKSl7cj4tTmE/KHQ9YS5QLGU9YSk6dT4tTmE/KHQ9YSxlPWEuTik6dD1lPWE7YnJlYWt9aWYoIWEuUil7dD1hO2JyZWFrfWE9YS5SfXZhciBjPURyKG4pO2lmKFdjLmluc2VydCh0LGMpLHR8fGUpe2lmKHQ9PT1lKXJldHVybiBYcih0KSxlPURyKHQuc2l0ZSksV2MuaW5zZXJ0KGMsZSksYy5lZGdlPWUuZWRnZT1Kcih0LnNpdGUsYy5zaXRlKSxWcih0KSxWcihlKSx2b2lkIDA7aWYoIWUpcmV0dXJuIGMuZWRnZT1Kcih0LnNpdGUsYy5zaXRlKSx2b2lkIDA7WHIodCksWHIoZSk7dmFyIGw9dC5zaXRlLHM9bC54LGY9bC55LGg9bi54LXMsZz1uLnktZixwPWUuc2l0ZSx2PXAueC1zLGQ9cC55LWYsbT0yKihoKmQtZyp2KSx5PWgqaCtnKmcseD12KnYrZCpkLE09e3g6KGQqeS1nKngpL20rcyx5OihoKngtdip5KS9tK2Z9O0tyKGUuZWRnZSxsLHAsTSksYy5lZGdlPUpyKGwsbixudWxsLE0pLGUuZWRnZT1KcihuLHAsbnVsbCxNKSxWcih0KSxWcihlKX19ZnVuY3Rpb24gRnIobix0KXt2YXIgZT1uLnNpdGUscj1lLngsdT1lLnksaT11LXQ7aWYoIWkpcmV0dXJuIHI7dmFyIG89bi5QO2lmKCFvKXJldHVybi0xLzA7ZT1vLnNpdGU7dmFyIGE9ZS54LGM9ZS55LGw9Yy10O2lmKCFsKXJldHVybiBhO3ZhciBzPWEtcixmPTEvaS0xL2wsaD1zL2w7cmV0dXJuIGY/KC1oK01hdGguc3FydChoKmgtMipmKihzKnMvKC0yKmwpLWMrbC8yK3UtaS8yKSkpL2YrcjoocithKS8yfWZ1bmN0aW9uIEhyKG4sdCl7dmFyIGU9bi5OO2lmKGUpcmV0dXJuIEZyKGUsdCk7dmFyIHI9bi5zaXRlO3JldHVybiByLnk9PT10P3IueDoxLzB9ZnVuY3Rpb24gT3Iobil7dGhpcy5zaXRlPW4sdGhpcy5lZGdlcz1bXX1mdW5jdGlvbiBZcihuKXtmb3IodmFyIHQsZSxyLHUsaSxvLGEsYyxsLHMsZj1uWzBdWzBdLGg9blsxXVswXSxnPW5bMF1bMV0scD1uWzFdWzFdLHY9QmMsZD12Lmxlbmd0aDtkLS07KWlmKGk9dltkXSxpJiZpLnByZXBhcmUoKSlmb3IoYT1pLmVkZ2VzLGM9YS5sZW5ndGgsbz0wO2M+bzspcz1hW29dLmVuZCgpLHI9cy54LHU9cy55LGw9YVsrK28lY10uc3RhcnQoKSx0PWwueCxlPWwueSwoY2Eoci10KT5OYXx8Y2EodS1lKT5OYSkmJihhLnNwbGljZShvLDAsbmV3IFFyKEdyKGkuc2l0ZSxzLGNhKHItZik8TmEmJnAtdT5OYT97eDpmLHk6Y2EodC1mKTxOYT9lOnB9OmNhKHUtcCk8TmEmJmgtcj5OYT97eDpjYShlLXApPE5hP3Q6aCx5OnB9OmNhKHItaCk8TmEmJnUtZz5OYT97eDpoLHk6Y2EodC1oKTxOYT9lOmd9OmNhKHUtZyk8TmEmJnItZj5OYT97eDpjYShlLWcpPE5hP3Q6Zix5Omd9Om51bGwpLGkuc2l0ZSxudWxsKSksKytjKX1mdW5jdGlvbiBJcihuLHQpe3JldHVybiB0LmFuZ2xlLW4uYW5nbGV9ZnVuY3Rpb24gWnIoKXt0dSh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gVnIobil7dmFyIHQ9bi5QLGU9bi5OO2lmKHQmJmUpe3ZhciByPXQuc2l0ZSx1PW4uc2l0ZSxpPWUuc2l0ZTtpZihyIT09aSl7dmFyIG89dS54LGE9dS55LGM9ci54LW8sbD1yLnktYSxzPWkueC1vLGY9aS55LWEsaD0yKihjKmYtbCpzKTtpZighKGg+PS16YSkpe3ZhciBnPWMqYytsKmwscD1zKnMrZipmLHY9KGYqZy1sKnApL2gsZD0oYypwLXMqZykvaCxmPWQrYSxtPVFjLnBvcCgpfHxuZXcgWnI7bS5hcmM9bixtLnNpdGU9dSxtLng9ditvLG0ueT1mK01hdGguc3FydCh2KnYrZCpkKSxtLmN5PWYsbi5jaXJjbGU9bTtmb3IodmFyIHk9bnVsbCx4PUdjLl87eDspaWYobS55PHgueXx8bS55PT09eC55JiZtLng8PXgueCl7aWYoIXguTCl7eT14LlA7YnJlYWt9eD14Lkx9ZWxzZXtpZigheC5SKXt5PXg7YnJlYWt9eD14LlJ9R2MuaW5zZXJ0KHksbSkseXx8KEpjPW0pfX19fWZ1bmN0aW9uIFhyKG4pe3ZhciB0PW4uY2lyY2xlO3QmJih0LlB8fChKYz10Lk4pLEdjLnJlbW92ZSh0KSxRYy5wdXNoKHQpLHR1KHQpLG4uY2lyY2xlPW51bGwpfWZ1bmN0aW9uICRyKG4pe2Zvcih2YXIgdCxlPSRjLHI9SGUoblswXVswXSxuWzBdWzFdLG5bMV1bMF0sblsxXVsxXSksdT1lLmxlbmd0aDt1LS07KXQ9ZVt1XSwoIUJyKHQsbil8fCFyKHQpfHxjYSh0LmEueC10LmIueCk8TmEmJmNhKHQuYS55LXQuYi55KTxOYSkmJih0LmE9dC5iPW51bGwsZS5zcGxpY2UodSwxKSl9ZnVuY3Rpb24gQnIobix0KXt2YXIgZT1uLmI7aWYoZSlyZXR1cm4hMDt2YXIgcix1LGk9bi5hLG89dFswXVswXSxhPXRbMV1bMF0sYz10WzBdWzFdLGw9dFsxXVsxXSxzPW4ubCxmPW4ucixoPXMueCxnPXMueSxwPWYueCx2PWYueSxkPShoK3ApLzIsbT0oZyt2KS8yO2lmKHY9PT1nKXtpZihvPmR8fGQ+PWEpcmV0dXJuO2lmKGg+cCl7aWYoaSl7aWYoaS55Pj1sKXJldHVybn1lbHNlIGk9e3g6ZCx5OmN9O2U9e3g6ZCx5Omx9fWVsc2V7aWYoaSl7aWYoaS55PGMpcmV0dXJufWVsc2UgaT17eDpkLHk6bH07ZT17eDpkLHk6Y319fWVsc2UgaWYocj0oaC1wKS8odi1nKSx1PW0tcipkLC0xPnJ8fHI+MSlpZihoPnApe2lmKGkpe2lmKGkueT49bClyZXR1cm59ZWxzZSBpPXt4OihjLXUpL3IseTpjfTtlPXt4OihsLXUpL3IseTpsfX1lbHNle2lmKGkpe2lmKGkueTxjKXJldHVybn1lbHNlIGk9e3g6KGwtdSkvcix5Omx9O2U9e3g6KGMtdSkvcix5OmN9fWVsc2UgaWYodj5nKXtpZihpKXtpZihpLng+PWEpcmV0dXJufWVsc2UgaT17eDpvLHk6cipvK3V9O2U9e3g6YSx5OnIqYSt1fX1lbHNle2lmKGkpe2lmKGkueDxvKXJldHVybn1lbHNlIGk9e3g6YSx5OnIqYSt1fTtlPXt4Om8seTpyKm8rdX19cmV0dXJuIG4uYT1pLG4uYj1lLCEwfWZ1bmN0aW9uIFdyKG4sdCl7dGhpcy5sPW4sdGhpcy5yPXQsdGhpcy5hPXRoaXMuYj1udWxsfWZ1bmN0aW9uIEpyKG4sdCxlLHIpe3ZhciB1PW5ldyBXcihuLHQpO3JldHVybiAkYy5wdXNoKHUpLGUmJktyKHUsbix0LGUpLHImJktyKHUsdCxuLHIpLEJjW24uaV0uZWRnZXMucHVzaChuZXcgUXIodSxuLHQpKSxCY1t0LmldLmVkZ2VzLnB1c2gobmV3IFFyKHUsdCxuKSksdX1mdW5jdGlvbiBHcihuLHQsZSl7dmFyIHI9bmV3IFdyKG4sbnVsbCk7cmV0dXJuIHIuYT10LHIuYj1lLCRjLnB1c2gocikscn1mdW5jdGlvbiBLcihuLHQsZSxyKXtuLmF8fG4uYj9uLmw9PT1lP24uYj1yOm4uYT1yOihuLmE9cixuLmw9dCxuLnI9ZSl9ZnVuY3Rpb24gUXIobix0LGUpe3ZhciByPW4uYSx1PW4uYjt0aGlzLmVkZ2U9bix0aGlzLnNpdGU9dCx0aGlzLmFuZ2xlPWU/TWF0aC5hdGFuMihlLnktdC55LGUueC10LngpOm4ubD09PXQ/TWF0aC5hdGFuMih1Lngtci54LHIueS11LnkpOk1hdGguYXRhbjIoci54LXUueCx1Lnktci55KX1mdW5jdGlvbiBudSgpe3RoaXMuXz1udWxsfWZ1bmN0aW9uIHR1KG4pe24uVT1uLkM9bi5MPW4uUj1uLlA9bi5OPW51bGx9ZnVuY3Rpb24gZXUobix0KXt2YXIgZT10LHI9dC5SLHU9ZS5VO3U/dS5MPT09ZT91Lkw9cjp1LlI9cjpuLl89cixyLlU9dSxlLlU9cixlLlI9ci5MLGUuUiYmKGUuUi5VPWUpLHIuTD1lfWZ1bmN0aW9uIHJ1KG4sdCl7dmFyIGU9dCxyPXQuTCx1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5MPXIuUixlLkwmJihlLkwuVT1lKSxyLlI9ZX1mdW5jdGlvbiB1dShuKXtmb3IoO24uTDspbj1uLkw7cmV0dXJuIG59ZnVuY3Rpb24gaXUobix0KXt2YXIgZSxyLHUsaT1uLnNvcnQob3UpLnBvcCgpO2ZvcigkYz1bXSxCYz1uZXcgQXJyYXkobi5sZW5ndGgpLFdjPW5ldyBudSxHYz1uZXcgbnU7OylpZih1PUpjLGkmJighdXx8aS55PHUueXx8aS55PT09dS55JiZpLng8dS54KSkoaS54IT09ZXx8aS55IT09cikmJihCY1tpLmldPW5ldyBPcihpKSxqcihpKSxlPWkueCxyPWkueSksaT1uLnBvcCgpO2Vsc2V7aWYoIXUpYnJlYWs7VXIodS5hcmMpfXQmJigkcih0KSxZcih0KSk7dmFyIG89e2NlbGxzOkJjLGVkZ2VzOiRjfTtyZXR1cm4gV2M9R2M9JGM9QmM9bnVsbCxvfWZ1bmN0aW9uIG91KG4sdCl7cmV0dXJuIHQueS1uLnl8fHQueC1uLnh9ZnVuY3Rpb24gYXUobix0LGUpe3JldHVybihuLngtZS54KSoodC55LW4ueSktKG4ueC10LngpKihlLnktbi55KX1mdW5jdGlvbiBjdShuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIGx1KG4pe3JldHVybiBuLnl9ZnVuY3Rpb24gc3UoKXtyZXR1cm57bGVhZjohMCxub2RlczpbXSxwb2ludDpudWxsLHg6bnVsbCx5Om51bGx9fWZ1bmN0aW9uIGZ1KG4sdCxlLHIsdSxpKXtpZighbih0LGUscix1LGkpKXt2YXIgbz0uNSooZSt1KSxhPS41KihyK2kpLGM9dC5ub2RlcztjWzBdJiZmdShuLGNbMF0sZSxyLG8sYSksY1sxXSYmZnUobixjWzFdLG8scix1LGEpLGNbMl0mJmZ1KG4sY1syXSxlLGEsbyxpKSxjWzNdJiZmdShuLGNbM10sbyxhLHUsaSl9fWZ1bmN0aW9uIGh1KG4sdCl7bj1Cby5yZ2IobiksdD1Cby5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsbz10LmctcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIreHQoTWF0aC5yb3VuZChlK2kqbikpK3h0KE1hdGgucm91bmQocitvKm4pKSt4dChNYXRoLnJvdW5kKHUrYSpuKSl9fWZ1bmN0aW9uIGd1KG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09ZHUobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gcHUobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24gdnUobix0KXt2YXIgZSxyLHUsaT10bC5sYXN0SW5kZXg9ZWwubGFzdEluZGV4PTAsbz0tMSxhPVtdLGM9W107Zm9yKG4rPSIiLHQrPSIiOyhlPXRsLmV4ZWMobikpJiYocj1lbC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLGFbb10/YVtvXSs9dTphWysrb109dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9hW29dP2Fbb10rPXI6YVsrK29dPXI6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6cHUoZSxyKX0pKSxpPWVsLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLGEubGVuZ3RoPDI/Y1swXT8odD1jWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1jLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3IpYVsoZT1jW3JdKS5pXT1lLngobik7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBkdShuLHQpe2Zvcih2YXIgZSxyPUJvLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPUJvLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiBtdShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLG89dC5sZW5ndGgsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDthPmU7KytlKXIucHVzaChkdShuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7bz5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7YT5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIHl1KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiB4dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiBNdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBfdShuKXtyZXR1cm4gbipufWZ1bmN0aW9uIGJ1KG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiB3dShuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24gU3Uobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBrdShuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKkNhKX1mdW5jdGlvbiBFdShuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24gQXUobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBDdShuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvQWEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpBYS90KX19ZnVuY3Rpb24gTnUobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIHp1KG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gTHUobix0KXtuPUJvLmhjbChuKSx0PUJvLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxvPXQuYy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGx0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gVHUobix0KXtuPUJvLmhzbChuKSx0PUJvLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxvPXQucy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGF0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gcXUobix0KXtuPUJvLmxhYihuKSx0PUJvLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxvPXQuYS1yLGE9dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBmdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIFJ1KG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBEdShuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1VdSh0KSx1PVB1KHQsZSksaT1VdShqdShlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpUYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqVGE6MH1mdW5jdGlvbiBQdShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIFV1KG4pe3ZhciB0PU1hdGguc3FydChQdShuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBqdShuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBGdShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPUJvLnRyYW5zZm9ybShuKSxvPUJvLnRyYW5zZm9ybSh0KSxhPWkudHJhbnNsYXRlLGM9by50cmFuc2xhdGUsbD1pLnJvdGF0ZSxzPW8ucm90YXRlLGY9aS5za2V3LGg9by5za2V3LGc9aS5zY2FsZSxwPW8uc2NhbGU7cmV0dXJuIGFbMF0hPWNbMF18fGFbMV0hPWNbMV0/KHIucHVzaCgidHJhbnNsYXRlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aToxLHg6cHUoYVswXSxjWzBdKX0se2k6Myx4OnB1KGFbMV0sY1sxXSl9KSk6Y1swXXx8Y1sxXT9yLnB1c2goInRyYW5zbGF0ZSgiK2MrIikiKTpyLnB1c2goIiIpLGwhPXM/KGwtcz4xODA/cys9MzYwOnMtbD4xODAmJihsKz0zNjApLHUucHVzaCh7aTpyLnB1c2goci5wb3AoKSsicm90YXRlKCIsbnVsbCwiKSIpLTIseDpwdShsLHMpfSkpOnMmJnIucHVzaChyLnBvcCgpKyJyb3RhdGUoIitzKyIpIiksZiE9aD91LnB1c2goe2k6ci5wdXNoKHIucG9wKCkrInNrZXdYKCIsbnVsbCwiKSIpLTIseDpwdShmLGgpfSk6aCYmci5wdXNoKHIucG9wKCkrInNrZXdYKCIraCsiKSIpLGdbMF0hPXBbMF18fGdbMV0hPXBbMV0/KGU9ci5wdXNoKHIucG9wKCkrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aTplLTQseDpwdShnWzBdLHBbMF0pfSx7aTplLTIseDpwdShnWzFdLHBbMV0pfSkpOigxIT1wWzBdfHwxIT1wWzFdKSYmci5wdXNoKHIucG9wKCkrInNjYWxlKCIrcCsiKSIpLGU9dS5sZW5ndGgsZnVuY3Rpb24obil7Zm9yKHZhciB0LGk9LTE7KytpPGU7KXJbKHQ9dVtpXSkuaV09dC54KG4pO3JldHVybiByLmpvaW4oIiIpfX1mdW5jdGlvbiBIdShuLHQpe3JldHVybiB0PSh0LT1uPStuKXx8MS90LGZ1bmN0aW9uKGUpe3JldHVybihlLW4pL3R9fWZ1bmN0aW9uIE91KG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSwoZS1uKS90KSl9fWZ1bmN0aW9uIFl1KG4pe2Zvcih2YXIgdD1uLnNvdXJjZSxlPW4udGFyZ2V0LHI9WnUodCxlKSx1PVt0XTt0IT09cjspdD10LnBhcmVudCx1LnB1c2godCk7Zm9yKHZhciBpPXUubGVuZ3RoO2UhPT1yOyl1LnNwbGljZShpLDAsZSksZT1lLnBhcmVudDtyZXR1cm4gdX1mdW5jdGlvbiBJdShuKXtmb3IodmFyIHQ9W10sZT1uLnBhcmVudDtudWxsIT1lOyl0LnB1c2gobiksbj1lLGU9ZS5wYXJlbnQ7cmV0dXJuIHQucHVzaChuKSx0fWZ1bmN0aW9uIFp1KG4sdCl7aWYobj09PXQpcmV0dXJuIG47Zm9yKHZhciBlPUl1KG4pLHI9SXUodCksdT1lLnBvcCgpLGk9ci5wb3AoKSxvPW51bGw7dT09PWk7KW89dSx1PWUucG9wKCksaT1yLnBvcCgpO3JldHVybiBvfWZ1bmN0aW9uIFZ1KG4pe24uZml4ZWR8PTJ9ZnVuY3Rpb24gWHUobil7bi5maXhlZCY9LTd9ZnVuY3Rpb24gJHUobil7bi5maXhlZHw9NCxuLnB4PW4ueCxuLnB5PW4ueX1mdW5jdGlvbiBCdShuKXtuLmZpeGVkJj0tNX1mdW5jdGlvbiBXdShuLHQsZSl7dmFyIHI9MCx1PTA7aWYobi5jaGFyZ2U9MCwhbi5sZWFmKWZvcih2YXIgaSxvPW4ubm9kZXMsYT1vLmxlbmd0aCxjPS0xOysrYzxhOylpPW9bY10sbnVsbCE9aSYmKFd1KGksdCxlKSxuLmNoYXJnZSs9aS5jaGFyZ2Uscis9aS5jaGFyZ2UqaS5jeCx1Kz1pLmNoYXJnZSppLmN5KTtpZihuLnBvaW50KXtuLmxlYWZ8fChuLnBvaW50LngrPU1hdGgucmFuZG9tKCktLjUsbi5wb2ludC55Kz1NYXRoLnJhbmRvbSgpLS41KTt2YXIgbD10KmVbbi5wb2ludC5pbmRleF07bi5jaGFyZ2UrPW4ucG9pbnRDaGFyZ2U9bCxyKz1sKm4ucG9pbnQueCx1Kz1sKm4ucG9pbnQueX1uLmN4PXIvbi5jaGFyZ2Usbi5jeT11L24uY2hhcmdlfWZ1bmN0aW9uIEp1KG4sdCl7cmV0dXJuIEJvLnJlYmluZChuLHQsInNvcnQiLCJjaGlsZHJlbiIsInZhbHVlIiksbi5ub2Rlcz1uLG4ubGlua3M9ZWksbn1mdW5jdGlvbiBHdShuLHQpe2Zvcih2YXIgZT1bbl07bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHQobiksKHU9bi5jaGlsZHJlbikmJihyPXUubGVuZ3RoKSlmb3IodmFyIHIsdTstLXI+PTA7KWUucHVzaCh1W3JdKX1mdW5jdGlvbiBLdShuLHQpe2Zvcih2YXIgZT1bbl0scj1bXTtudWxsIT0obj1lLnBvcCgpKTspaWYoci5wdXNoKG4pLChpPW4uY2hpbGRyZW4pJiYodT1pLmxlbmd0aCkpZm9yKHZhciB1LGksbz0tMTsrK288dTspZS5wdXNoKGlbb10pO2Zvcig7bnVsbCE9KG49ci5wb3AoKSk7KXQobil9ZnVuY3Rpb24gUXUobil7cmV0dXJuIG4uY2hpbGRyZW59ZnVuY3Rpb24gbmkobil7cmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gdGkobix0KXtyZXR1cm4gdC52YWx1ZS1uLnZhbHVlfWZ1bmN0aW9uIGVpKG4pe3JldHVybiBCby5tZXJnZShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi5jaGlsZHJlbnx8W10pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOm4sdGFyZ2V0OnR9fSl9KSl9ZnVuY3Rpb24gcmkobil7cmV0dXJuIG4ueH1mdW5jdGlvbiB1aShuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIGlpKG4sdCxlKXtuLnkwPXQsbi55PWV9ZnVuY3Rpb24gb2kobil7cmV0dXJuIEJvLnJhbmdlKG4ubGVuZ3RoKX1mdW5jdGlvbiBhaShuKXtmb3IodmFyIHQ9LTEsZT1uWzBdLmxlbmd0aCxyPVtdOysrdDxlOylyW3RdPTA7cmV0dXJuIHJ9ZnVuY3Rpb24gY2kobil7Zm9yKHZhciB0LGU9MSxyPTAsdT1uWzBdWzFdLGk9bi5sZW5ndGg7aT5lOysrZSkodD1uW2VdWzFdKT51JiYocj1lLHU9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gbGkobil7cmV0dXJuIG4ucmVkdWNlKHNpLDApfWZ1bmN0aW9uIHNpKG4sdCl7cmV0dXJuIG4rdFsxXX1mdW5jdGlvbiBmaShuLHQpe3JldHVybiBoaShuLE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIrMSkpfWZ1bmN0aW9uIGhpKG4sdCl7Zm9yKHZhciBlPS0xLHI9K25bMF0sdT0oblsxXS1yKS90LGk9W107KytlPD10OylpW2VdPXUqZStyO3JldHVybiBpfWZ1bmN0aW9uIGdpKG4pe3JldHVybltCby5taW4obiksQm8ubWF4KG4pXX1mdW5jdGlvbiBwaShuLHQpe3JldHVybiBuLnZhbHVlLXQudmFsdWV9ZnVuY3Rpb24gdmkobix0KXt2YXIgZT1uLl9wYWNrX25leHQ7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW4sdC5fcGFja19uZXh0PWUsZS5fcGFja19wcmV2PXR9ZnVuY3Rpb24gZGkobix0KXtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bn1mdW5jdGlvbiBtaShuLHQpe3ZhciBlPXQueC1uLngscj10Lnktbi55LHU9bi5yK3QucjtyZXR1cm4uOTk5KnUqdT5lKmUrcipyfWZ1bmN0aW9uIHlpKG4pe2Z1bmN0aW9uIHQobil7cz1NYXRoLm1pbihuLngtbi5yLHMpLGY9TWF0aC5tYXgobi54K24ucixmKSxoPU1hdGgubWluKG4ueS1uLnIsaCksZz1NYXRoLm1heChuLnkrbi5yLGcpfWlmKChlPW4uY2hpbGRyZW4pJiYobD1lLmxlbmd0aCkpe3ZhciBlLHIsdSxpLG8sYSxjLGwscz0xLzAsZj0tMS8wLGg9MS8wLGc9LTEvMDtpZihlLmZvckVhY2goeGkpLHI9ZVswXSxyLng9LXIucixyLnk9MCx0KHIpLGw+MSYmKHU9ZVsxXSx1Lng9dS5yLHUueT0wLHQodSksbD4yKSlmb3IoaT1lWzJdLGJpKHIsdSxpKSx0KGkpLHZpKHIsaSksci5fcGFja19wcmV2PWksdmkoaSx1KSx1PXIuX3BhY2tfbmV4dCxvPTM7bD5vO28rKyl7Ymkocix1LGk9ZVtvXSk7dmFyIHA9MCx2PTEsZD0xO2ZvcihhPXUuX3BhY2tfbmV4dDthIT09dTthPWEuX3BhY2tfbmV4dCx2KyspaWYobWkoYSxpKSl7cD0xO2JyZWFrfWlmKDE9PXApZm9yKGM9ci5fcGFja19wcmV2O2MhPT1hLl9wYWNrX3ByZXYmJiFtaShjLGkpO2M9Yy5fcGFja19wcmV2LGQrKyk7cD8oZD52fHx2PT1kJiZ1LnI8ci5yP2RpKHIsdT1hKTpkaShyPWMsdSksby0tKToodmkocixpKSx1PWksdChpKSl9dmFyIG09KHMrZikvMix5PShoK2cpLzIseD0wO2ZvcihvPTA7bD5vO28rKylpPWVbb10saS54LT1tLGkueS09eSx4PU1hdGgubWF4KHgsaS5yK01hdGguc3FydChpLngqaS54K2kueSppLnkpKTtuLnI9eCxlLmZvckVhY2goTWkpfX1mdW5jdGlvbiB4aShuKXtuLl9wYWNrX25leHQ9bi5fcGFja19wcmV2PW59ZnVuY3Rpb24gTWkobil7ZGVsZXRlIG4uX3BhY2tfbmV4dCxkZWxldGUgbi5fcGFja19wcmV2fWZ1bmN0aW9uIF9pKG4sdCxlLHIpe3ZhciB1PW4uY2hpbGRyZW47aWYobi54PXQrPXIqbi54LG4ueT1lKz1yKm4ueSxuLnIqPXIsdSlmb3IodmFyIGk9LTEsbz11Lmxlbmd0aDsrK2k8bzspX2kodVtpXSx0LGUscil9ZnVuY3Rpb24gYmkobix0LGUpe3ZhciByPW4ucitlLnIsdT10Lngtbi54LGk9dC55LW4ueTtpZihyJiYodXx8aSkpe3ZhciBvPXQucitlLnIsYT11KnUraSppO28qPW8scio9cjt2YXIgYz0uNSsoci1vKS8oMiphKSxsPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyoocithKS0oci09YSkqci1vKm8pKS8oMiphKTtlLng9bi54K2MqdStsKmksZS55PW4ueStjKmktbCp1fWVsc2UgZS54PW4ueCtyLGUueT1uLnl9ZnVuY3Rpb24gd2kobix0KXtyZXR1cm4gbi5wYXJlbnQ9PXQucGFyZW50PzE6Mn1mdW5jdGlvbiBTaShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0Lmxlbmd0aD90WzBdOm4udH1mdW5jdGlvbiBraShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuKHQ9ZS5sZW5ndGgpP2VbdC0xXTpuLnR9ZnVuY3Rpb24gRWkobix0LGUpe3ZhciByPWUvKHQuaS1uLmkpO3QuYy09cix0LnMrPWUsbi5jKz1yLHQueis9ZSx0Lm0rPWV9ZnVuY3Rpb24gQWkobil7Zm9yKHZhciB0LGU9MCxyPTAsdT1uLmNoaWxkcmVuLGk9dS5sZW5ndGg7LS1pPj0wOyl0PXVbaV0sdC56Kz1lLHQubSs9ZSxlKz10LnMrKHIrPXQuYyl9ZnVuY3Rpb24gQ2kobix0LGUpe3JldHVybiBuLmEucGFyZW50PT09dC5wYXJlbnQ/bi5hOmV9ZnVuY3Rpb24gTmkobil7cmV0dXJuIDErQm8ubWF4KG4sZnVuY3Rpb24obil7cmV0dXJuIG4ueX0pfWZ1bmN0aW9uIHppKG4pe3JldHVybiBuLnJlZHVjZShmdW5jdGlvbihuLHQpe3JldHVybiBuK3QueH0sMCkvbi5sZW5ndGh9ZnVuY3Rpb24gTGkobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdCYmdC5sZW5ndGg/TGkodFswXSk6bn1mdW5jdGlvbiBUaShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuIGUmJih0PWUubGVuZ3RoKT9UaShlW3QtMV0pOm59ZnVuY3Rpb24gcWkobil7cmV0dXJue3g6bi54LHk6bi55LGR4Om4uZHgsZHk6bi5keX19ZnVuY3Rpb24gUmkobix0KXt2YXIgZT1uLngrdFszXSxyPW4ueSt0WzBdLHU9bi5keC10WzFdLXRbM10saT1uLmR5LXRbMF0tdFsyXTtyZXR1cm4gMD51JiYoZSs9dS8yLHU9MCksMD5pJiYocis9aS8yLGk9MCkse3g6ZSx5OnIsZHg6dSxkeTppfX1mdW5jdGlvbiBEaShuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4gZT50P1t0LGVdOltlLHRdfWZ1bmN0aW9uIFBpKG4pe3JldHVybiBuLnJhbmdlRXh0ZW50P24ucmFuZ2VFeHRlbnQoKTpEaShuLnJhbmdlKCkpfWZ1bmN0aW9uIFVpKG4sdCxlLHIpe3ZhciB1PWUoblswXSxuWzFdKSxpPXIodFswXSx0WzFdKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGkodShuKSl9fWZ1bmN0aW9uIGppKG4sdCl7dmFyIGUscj0wLHU9bi5sZW5ndGgtMSxpPW5bcl0sbz1uW3VdO3JldHVybiBpPm8mJihlPXIscj11LHU9ZSxlPWksaT1vLG89ZSksbltyXT10LmZsb29yKGkpLG5bdV09dC5jZWlsKG8pLG59ZnVuY3Rpb24gRmkobil7cmV0dXJuIG4/e2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQvbikqbn0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5jZWlsKHQvbikqbn19OmdsfWZ1bmN0aW9uIEhpKG4sdCxlLHIpe3ZhciB1PVtdLGk9W10sbz0wLGE9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpLTE7Zm9yKG5bYV08blswXSYmKG49bi5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzw9YTspdS5wdXNoKGUobltvLTFdLG5bb10pKSxpLnB1c2gocih0W28tMV0sdFtvXSkpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1Cby5iaXNlY3Qobix0LDEsYSktMTtyZXR1cm4gaVtlXSh1W2VdKHQpKX19ZnVuY3Rpb24gT2kobix0LGUscil7ZnVuY3Rpb24gdSgpe3ZhciB1PU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKT4yP0hpOlVpLGM9cj9PdTpIdTtyZXR1cm4gbz11KG4sdCxjLGUpLGE9dSh0LG4sYyxkdSksaX1mdW5jdGlvbiBpKG4pe3JldHVybiBvKG4pfXZhciBvLGE7cmV0dXJuIGkuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBhKG4pfSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChOdW1iZXIpLHUoKSk6bn0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHUoKSk6dH0saS5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBpLnJhbmdlKG4pLmludGVycG9sYXRlKFJ1KX0saS5jbGFtcD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHUoKSk6cn0saS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0saS50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gVmkobix0KX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhpKG4sdCxlKX0saS5uaWNlPWZ1bmN0aW9uKHQpe3JldHVybiBJaShuLHQpLHUoKX0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIE9pKG4sdCxlLHIpfSx1KCl9ZnVuY3Rpb24gWWkobix0KXtyZXR1cm4gQm8ucmViaW5kKG4sdCwicmFuZ2UiLCJyYW5nZVJvdW5kIiwiaW50ZXJwb2xhdGUiLCJjbGFtcCIpfWZ1bmN0aW9uIElpKG4sdCl7cmV0dXJuIGppKG4sRmkoWmkobix0KVsyXSkpfWZ1bmN0aW9uIFppKG4sdCl7bnVsbD09dCYmKHQ9MTApO3ZhciBlPURpKG4pLHI9ZVsxXS1lWzBdLHU9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyL3QpL01hdGguTE4xMCkpLGk9dC9yKnU7cmV0dXJuLjE1Pj1pP3UqPTEwOi4zNT49aT91Kj01Oi43NT49aSYmKHUqPTIpLGVbMF09TWF0aC5jZWlsKGVbMF0vdSkqdSxlWzFdPU1hdGguZmxvb3IoZVsxXS91KSp1Ky41KnUsZVsyXT11LGV9ZnVuY3Rpb24gVmkobix0KXtyZXR1cm4gQm8ucmFuZ2UuYXBwbHkoQm8sWmkobix0KSl9ZnVuY3Rpb24gWGkobix0LGUpe3ZhciByPVppKG4sdCk7aWYoZSl7dmFyIHU9dGMuZXhlYyhlKTtpZih1LnNoaWZ0KCksInMiPT09dVs4XSl7dmFyIGk9Qm8uZm9ybWF0UHJlZml4KE1hdGgubWF4KGNhKHJbMF0pLGNhKHJbMV0pKSk7cmV0dXJuIHVbN118fCh1WzddPSIuIiskaShpLnNjYWxlKHJbMl0pKSksdVs4XT0iZiIsZT1Cby5mb3JtYXQodS5qb2luKCIiKSksZnVuY3Rpb24obil7cmV0dXJuIGUoaS5zY2FsZShuKSkraS5zeW1ib2x9fXVbN118fCh1WzddPSIuIitCaSh1WzhdLHIpKSxlPXUuam9pbigiIil9ZWxzZSBlPSIsLiIrJGkoclsyXSkrImYiO3JldHVybiBCby5mb3JtYXQoZSl9ZnVuY3Rpb24gJGkobil7cmV0dXJuLU1hdGguZmxvb3IoTWF0aC5sb2cobikvTWF0aC5MTjEwKy4wMSl9ZnVuY3Rpb24gQmkobix0KXt2YXIgZT0kaSh0WzJdKTtyZXR1cm4gbiBpbiBwbD9NYXRoLmFicyhlLSRpKE1hdGgubWF4KGNhKHRbMF0pLGNhKHRbMV0pKSkpKyArKCJlIiE9PW4pOmUtMiooIiUiPT09bil9ZnVuY3Rpb24gV2kobix0LGUscil7ZnVuY3Rpb24gdShuKXtyZXR1cm4oZT9NYXRoLmxvZygwPm4/MDpuKTotTWF0aC5sb2cobj4wPzA6LW4pKS9NYXRoLmxvZyh0KX1mdW5jdGlvbiBpKG4pe3JldHVybiBlP01hdGgucG93KHQsbik6LU1hdGgucG93KHQsLW4pfWZ1bmN0aW9uIG8odCl7cmV0dXJuIG4odSh0KSl9cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBpKG4uaW52ZXJ0KHQpKX0sby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dFswXT49MCxuLmRvbWFpbigocj10Lm1hcChOdW1iZXIpKS5tYXAodSkpLG8pOnJ9LG8uYmFzZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxuLmRvbWFpbihyLm1hcCh1KSksbyk6dH0sby5uaWNlPWZ1bmN0aW9uKCl7dmFyIHQ9amkoci5tYXAodSksZT9NYXRoOmRsKTtyZXR1cm4gbi5kb21haW4odCkscj10Lm1hcChpKSxvfSxvLnRpY2tzPWZ1bmN0aW9uKCl7dmFyIG49RGkociksbz1bXSxhPW5bMF0sYz1uWzFdLGw9TWF0aC5mbG9vcih1KGEpKSxzPU1hdGguY2VpbCh1KGMpKSxmPXQlMT8yOnQ7aWYoaXNGaW5pdGUocy1sKSl7aWYoZSl7Zm9yKDtzPmw7bCsrKWZvcih2YXIgaD0xO2Y+aDtoKyspby5wdXNoKGkobCkqaCk7by5wdXNoKGkobCkpfWVsc2UgZm9yKG8ucHVzaChpKGwpKTtsKys8czspZm9yKHZhciBoPWYtMTtoPjA7aC0tKW8ucHVzaChpKGwpKmgpO2ZvcihsPTA7b1tsXTxhO2wrKyk7Zm9yKHM9by5sZW5ndGg7b1tzLTFdPmM7cy0tKTtvPW8uc2xpY2UobCxzKX1yZXR1cm4gb30sby50aWNrRm9ybWF0PWZ1bmN0aW9uKG4sdCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZsO2FyZ3VtZW50cy5sZW5ndGg8Mj90PXZsOiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1Cby5mb3JtYXQodCkpO3ZhciByLGE9TWF0aC5tYXgoLjEsbi9vLnRpY2tzKCkubGVuZ3RoKSxjPWU/KHI9MWUtMTIsTWF0aC5jZWlsKToocj0tMWUtMTIsTWF0aC5mbG9vcik7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuL2koYyh1KG4pK3IpKTw9YT90KG4pOiIifX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFdpKG4uY29weSgpLHQsZSxyKX0sWWkobyxuKX1mdW5jdGlvbiBKaShuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih1KHQpKX12YXIgdT1HaSh0KSxpPUdpKDEvdCk7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBpKG4uaW52ZXJ0KHQpKX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4uZG9tYWluKChlPXQubWFwKE51bWJlcikpLm1hcCh1KSkscik6ZX0sci50aWNrcz1mdW5jdGlvbihuKXtyZXR1cm4gVmkoZSxuKX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFhpKGUsbix0KX0sci5uaWNlPWZ1bmN0aW9uKG4pe3JldHVybiByLmRvbWFpbihJaShlLG4pKX0sci5leHBvbmVudD1mdW5jdGlvbihvKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1HaSh0PW8pLGk9R2koMS90KSxuLmRvbWFpbihlLm1hcCh1KSkscik6dH0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEppKG4uY29weSgpLHQsZSl9LFlpKHIsbil9ZnVuY3Rpb24gR2kobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAwPnQ/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9fWZ1bmN0aW9uIEtpKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gaVsoKHUuZ2V0KGUpfHwoInJhbmdlIj09PXQudD91LnNldChlLG4ucHVzaChlKSk6MC8wKSktMSklaS5sZW5ndGhdfWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gQm8ucmFuZ2Uobi5sZW5ndGgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gdCtlKm59KX12YXIgdSxpLG87cmV0dXJuIGUuZG9tYWluPWZ1bmN0aW9uKHIpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuO249W10sdT1uZXcgYTtmb3IodmFyIGksbz0tMSxjPXIubGVuZ3RoOysrbzxjOyl1LmhhcyhpPXJbb10pfHx1LnNldChpLG4ucHVzaChpKSk7cmV0dXJuIGVbdC50XS5hcHBseShlLHQuYSl9LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bixvPTAsdD17dDoicmFuZ2UiLGE6YXJndW1lbnRzfSxlKTppfSxlLnJhbmdlUG9pbnRzPWZ1bmN0aW9uKHUsYSl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKTt2YXIgYz11WzBdLGw9dVsxXSxzPShsLWMpLyhNYXRoLm1heCgxLG4ubGVuZ3RoLTEpK2EpO3JldHVybiBpPXIobi5sZW5ndGg8Mj8oYytsKS8yOmMrcyphLzIscyksbz0wLHQ9e3Q6InJhbmdlUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmRzPWZ1bmN0aW9uKHUsYSxjKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGM9YSk7dmFyIGw9dVsxXTx1WzBdLHM9dVtsLTBdLGY9dVsxLWxdLGg9KGYtcykvKG4ubGVuZ3RoLWErMipjKTtyZXR1cm4gaT1yKHMraCpjLGgpLGwmJmkucmV2ZXJzZSgpLG89aCooMS1hKSx0PXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24odSxhLGMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYoYz1hKTt2YXIgbD11WzFdPHVbMF0scz11W2wtMF0sZj11WzEtbF0saD1NYXRoLmZsb29yKChmLXMpLyhuLmxlbmd0aC1hKzIqYykpLGc9Zi1zLShuLmxlbmd0aC1hKSpoO3JldHVybiBpPXIocytNYXRoLnJvdW5kKGcvMiksaCksbCYmaS5yZXZlcnNlKCksbz1NYXRoLnJvdW5kKGgqKDEtYSkpLHQ9e3Q6InJhbmdlUm91bmRCYW5kcyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIG99LGUucmFuZ2VFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gRGkodC5hWzBdKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEtpKG4sdCl9LGUuZG9tYWluKG4pfWZ1bmN0aW9uIFFpKHIsdSl7ZnVuY3Rpb24gaSgpe3ZhciBuPTAsdD11Lmxlbmd0aDtmb3IoYT1bXTsrK248dDspYVtuLTFdPUJvLnF1YW50aWxlKHIsbi90KTtyZXR1cm4gb31mdW5jdGlvbiBvKG4pe3JldHVybiBpc05hTihuPStuKT92b2lkIDA6dVtCby5iaXNlY3QoYSxuKV19dmFyIGE7cmV0dXJuIG8uZG9tYWluPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXUubWFwKHQpLmZpbHRlcihlKS5zb3J0KG4pLGkoKSk6cn0sby5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLGkoKSk6dX0sby5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYX0sby5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIG49dS5pbmRleE9mKG4pLDA+bj9bMC8wLDAvMF06W24+MD9hW24tMV06clswXSxuPGEubGVuZ3RoP2Fbbl06cltyLmxlbmd0aC0xXV19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBRaShyLHUpfSxpKCl9ZnVuY3Rpb24gbm8obix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIGVbTWF0aC5tYXgoMCxNYXRoLm1pbihvLE1hdGguZmxvb3IoaSoodC1uKSkpKV19ZnVuY3Rpb24gdSgpe3JldHVybiBpPWUubGVuZ3RoLyh0LW4pLG89ZS5sZW5ndGgtMSxyfXZhciBpLG87cmV0dXJuIHIuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdLHQ9K2VbZS5sZW5ndGgtMV0sdSgpKTpbbix0XX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0sci5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9ZS5pbmRleE9mKHQpLHQ9MD50PzAvMDp0L2krbixbdCx0KzEvaV19LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBubyhuLHQsZSl9LHUoKX1mdW5jdGlvbiB0byhuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGU+PWU/dFtCby5iaXNlY3QobixlKV06dm9pZCAwfXJldHVybiBlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixlKTp0fSxlLmludmVydEV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmluZGV4T2YoZSksW25bZS0xXSxuW2VdXX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKG4sdCl9LGV9ZnVuY3Rpb24gZW8obil7ZnVuY3Rpb24gdChuKXtyZXR1cm4rbn1yZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUubWFwKHQpLHQpOm59LHQudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIFZpKG4sdCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBYaShuLHQsZSl9LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBlbyhuKX0sdH1mdW5jdGlvbiBybyhuKXtyZXR1cm4gbi5pbm5lclJhZGl1c31mdW5jdGlvbiB1byhuKXtyZXR1cm4gbi5vdXRlclJhZGl1c31mdW5jdGlvbiBpbyhuKXtyZXR1cm4gbi5zdGFydEFuZ2xlfWZ1bmN0aW9uIG9vKG4pe3JldHVybiBuLmVuZEFuZ2xlfWZ1bmN0aW9uIGFvKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbygpe2wucHVzaCgiTSIsaShuKHMpLGEpKX1mb3IodmFyIGMsbD1bXSxzPVtdLGY9LTEsaD10Lmxlbmd0aCxnPWt0KGUpLHA9a3Qocik7KytmPGg7KXUuY2FsbCh0aGlzLGM9dFtmXSxmKT9zLnB1c2goWytnLmNhbGwodGhpcyxjLGYpLCtwLmNhbGwodGhpcyxjLGYpXSk6cy5sZW5ndGgmJihvKCkscz1bXSk7cmV0dXJuIHMubGVuZ3RoJiZvKCksbC5sZW5ndGg/bC5qb2luKCIiKTpudWxsfXZhciBlPUFyLHI9Q3IsdT1BZSxpPWNvLG89aS5rZXksYT0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9pPW46KGk9d2wuZ2V0KG4pfHxjbykua2V5LHQpOm99LHQudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1uLHQpOmF9LHR9ZnVuY3Rpb24gY28obil7cmV0dXJuIG4uam9pbigiTCIpfWZ1bmN0aW9uIGxvKG4pe3JldHVybiBjbyhuKSsiWiJ9ZnVuY3Rpb24gc28obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHJbMF0rKHI9blt0XSlbMF0pLzIsIlYiLHJbMV0pO3JldHVybiBlPjEmJnUucHVzaCgiSCIsclswXSksdS5qb2luKCIiKX1mdW5jdGlvbiBmbyhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJWIiwocj1uW3RdKVsxXSwiSCIsclswXSk7cmV0dXJuIHUuam9pbigiIil9ZnVuY3Rpb24gaG8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHI9blt0XSlbMF0sIlYiLHJbMV0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIGdvKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDQ/Y28obik6blsxXSttbyhuLnNsaWNlKDEsbi5sZW5ndGgtMSkseW8obix0KSl9ZnVuY3Rpb24gcG8obix0KXtyZXR1cm4gbi5sZW5ndGg8Mz9jbyhuKTpuWzBdK21vKChuLnB1c2goblswXSksbikseW8oW25bbi5sZW5ndGgtMl1dLmNvbmNhdChuLFtuWzFdXSksdCkpfWZ1bmN0aW9uIHZvKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDM/Y28obik6blswXSttbyhuLHlvKG4sdCkpfWZ1bmN0aW9uIG1vKG4sdCl7aWYodC5sZW5ndGg8MXx8bi5sZW5ndGghPXQubGVuZ3RoJiZuLmxlbmd0aCE9dC5sZW5ndGgrMilyZXR1cm4gY28obik7dmFyIGU9bi5sZW5ndGghPXQubGVuZ3RoLHI9IiIsdT1uWzBdLGk9blsxXSxvPXRbMF0sYT1vLGM9MTtpZihlJiYocis9IlEiKyhpWzBdLTIqb1swXS8zKSsiLCIrKGlbMV0tMipvWzFdLzMpKyIsIitpWzBdKyIsIitpWzFdLHU9blsxXSxjPTIpLHQubGVuZ3RoPjEpe2E9dFsxXSxpPW5bY10sYysrLHIrPSJDIisodVswXStvWzBdKSsiLCIrKHVbMV0rb1sxXSkrIiwiKyhpWzBdLWFbMF0pKyIsIisoaVsxXS1hWzFdKSsiLCIraVswXSsiLCIraVsxXTtmb3IodmFyIGw9MjtsPHQubGVuZ3RoO2wrKyxjKyspaT1uW2NdLGE9dFtsXSxyKz0iUyIrKGlbMF0tYVswXSkrIiwiKyhpWzFdLWFbMV0pKyIsIitpWzBdKyIsIitpWzFdfWlmKGUpe3ZhciBzPW5bY107cis9IlEiKyhpWzBdKzIqYVswXS8zKSsiLCIrKGlbMV0rMiphWzFdLzMpKyIsIitzWzBdKyIsIitzWzFdfXJldHVybiByfWZ1bmN0aW9uIHlvKG4sdCl7Zm9yKHZhciBlLHI9W10sdT0oMS10KS8yLGk9blswXSxvPW5bMV0sYT0xLGM9bi5sZW5ndGg7KythPGM7KWU9aSxpPW8sbz1uW2FdLHIucHVzaChbdSoob1swXS1lWzBdKSx1KihvWzFdLWVbMV0pXSk7cmV0dXJuIHJ9ZnVuY3Rpb24geG8obil7aWYobi5sZW5ndGg8MylyZXR1cm4gY28obik7dmFyIHQ9MSxlPW4ubGVuZ3RoLHI9blswXSx1PXJbMF0saT1yWzFdLG89W3UsdSx1LChyPW5bMV0pWzBdXSxhPVtpLGksaSxyWzFdXSxjPVt1LCIsIixpLCJMIix3byhFbCxvKSwiLCIsd28oRWwsYSldO2ZvcihuLnB1c2gobltlLTFdKTsrK3Q8PWU7KXI9blt0XSxvLnNoaWZ0KCksby5wdXNoKHJbMF0pLGEuc2hpZnQoKSxhLnB1c2goclsxXSksU28oYyxvLGEpO3JldHVybiBuLnBvcCgpLGMucHVzaCgiTCIsciksYy5qb2luKCIiKX1mdW5jdGlvbiBNbyhuKXtpZihuLmxlbmd0aDw0KXJldHVybiBjbyhuKTtmb3IodmFyIHQsZT1bXSxyPS0xLHU9bi5sZW5ndGgsaT1bMF0sbz1bMF07KytyPDM7KXQ9bltyXSxpLnB1c2godFswXSksby5wdXNoKHRbMV0pO2ZvcihlLnB1c2god28oRWwsaSkrIiwiK3dvKEVsLG8pKSwtLXI7KytyPHU7KXQ9bltyXSxpLnNoaWZ0KCksaS5wdXNoKHRbMF0pLG8uc2hpZnQoKSxvLnB1c2godFsxXSksU28oZSxpLG8pO3JldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIF9vKG4pe2Zvcih2YXIgdCxlLHI9LTEsdT1uLmxlbmd0aCxpPXUrNCxvPVtdLGE9W107KytyPDQ7KWU9bltyJXVdLG8ucHVzaChlWzBdKSxhLnB1c2goZVsxXSk7Zm9yKHQ9W3dvKEVsLG8pLCIsIix3byhFbCxhKV0sLS1yOysrcjxpOyllPW5bciV1XSxvLnNoaWZ0KCksby5wdXNoKGVbMF0pLGEuc2hpZnQoKSxhLnB1c2goZVsxXSksU28odCxvLGEpO3JldHVybiB0LmpvaW4oIiIpfWZ1bmN0aW9uIGJvKG4sdCl7dmFyIGU9bi5sZW5ndGgtMTtpZihlKWZvcih2YXIgcix1LGk9blswXVswXSxvPW5bMF1bMV0sYT1uW2VdWzBdLWksYz1uW2VdWzFdLW8sbD0tMTsrK2w8PWU7KXI9bltsXSx1PWwvZSxyWzBdPXQqclswXSsoMS10KSooaSt1KmEpLHJbMV09dCpyWzFdKygxLXQpKihvK3UqYyk7cmV0dXJuIHhvKG4pfWZ1bmN0aW9uIHdvKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdK25bM10qdFszXX1mdW5jdGlvbiBTbyhuLHQsZSl7bi5wdXNoKCJDIix3byhTbCx0KSwiLCIsd28oU2wsZSksIiwiLHdvKGtsLHQpLCIsIix3byhrbCxlKSwiLCIsd28oRWwsdCksIiwiLHdvKEVsLGUpKX1mdW5jdGlvbiBrbyhuLHQpe3JldHVybih0WzFdLW5bMV0pLyh0WzBdLW5bMF0pfWZ1bmN0aW9uIEVvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgtMSxyPVtdLHU9blswXSxpPW5bMV0sbz1yWzBdPWtvKHUsaSk7Kyt0PGU7KXJbdF09KG8rKG89a28odT1pLGk9blt0KzFdKSkpLzI7cmV0dXJuIHJbdF09byxyfWZ1bmN0aW9uIEFvKG4pe2Zvcih2YXIgdCxlLHIsdSxpPVtdLG89RW8obiksYT0tMSxjPW4ubGVuZ3RoLTE7KythPGM7KXQ9a28oblthXSxuW2ErMV0pLGNhKHQpPE5hP29bYV09b1thKzFdPTA6KGU9b1thXS90LHI9b1thKzFdL3QsdT1lKmUrcipyLHU+OSYmKHU9Myp0L01hdGguc3FydCh1KSxvW2FdPXUqZSxvW2ErMV09dSpyKSk7Zm9yKGE9LTE7KythPD1jOyl1PShuW01hdGgubWluKGMsYSsxKV1bMF0tbltNYXRoLm1heCgwLGEtMSldWzBdKS8oNiooMStvW2FdKm9bYV0pKSxpLnB1c2goW3V8fDAsb1thXSp1fHwwXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQ28obil7cmV0dXJuIG4ubGVuZ3RoPDM/Y28obik6blswXSttbyhuLEFvKG4pKX1mdW5jdGlvbiBObyhuKXtmb3IodmFyIHQsZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspdD1uW3VdLGU9dFswXSxyPXRbMV0rX2wsdFswXT1lKk1hdGguY29zKHIpLHRbMV09ZSpNYXRoLnNpbihyKTtyZXR1cm4gbn1mdW5jdGlvbiB6byhuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIGMoKXt2LnB1c2goIk0iLGEobihtKSxmKSxzLGwobihkLnJldmVyc2UoKSksZiksIloiKX1mb3IodmFyIGgsZyxwLHY9W10sZD1bXSxtPVtdLHk9LTEseD10Lmxlbmd0aCxNPWt0KGUpLF89a3QodSksYj1lPT09cj9mdW5jdGlvbigpe3JldHVybiBnfTprdChyKSx3PXU9PT1pP2Z1bmN0aW9uKCl7cmV0dXJuIHB9Omt0KGkpOysreTx4OylvLmNhbGwodGhpcyxoPXRbeV0seSk/KGQucHVzaChbZz0rTS5jYWxsKHRoaXMsaCx5KSxwPStfLmNhbGwodGhpcyxoLHkpXSksbS5wdXNoKFsrYi5jYWxsKHRoaXMsaCx5KSwrdy5jYWxsKHRoaXMsaCx5KV0pKTpkLmxlbmd0aCYmKGMoKSxkPVtdLG09W10pO3JldHVybiBkLmxlbmd0aCYmYygpLHYubGVuZ3RoP3Yuam9pbigiIik6bnVsbH12YXIgZT1BcixyPUFyLHU9MCxpPUNyLG89QWUsYT1jbyxjPWEua2V5LGw9YSxzPSJMIixmPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cj1uLHQpOnJ9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWk9bix0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLHQpOml9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/YT1uOihhPXdsLmdldChuKXx8Y28pLmtleSxsPWEucmV2ZXJzZXx8YSxzPWEuY2xvc2VkPyJNIjoiTCIsdCk6Y30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4sdCk6Zn0sdH1mdW5jdGlvbiBMbyhuKXtyZXR1cm4gbi5yYWRpdXN9ZnVuY3Rpb24gVG8obil7cmV0dXJuW24ueCxuLnldfWZ1bmN0aW9uIHFvKG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dFswXSxyPXRbMV0rX2w7cmV0dXJuW2UqTWF0aC5jb3MociksZSpNYXRoLnNpbihyKV19fWZ1bmN0aW9uIFJvKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIERvKCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gUG8obil7dmFyIHQ9TWF0aC5zcXJ0KG4vRWEpO3JldHVybiJNMCwiK3QrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLXQrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrdCsiWiJ9ZnVuY3Rpb24gVW8obix0KXtyZXR1cm4gZ2EobixUbCksbi5pZD10LG59ZnVuY3Rpb24gam8obix0LGUscil7dmFyIHU9bi5pZDtyZXR1cm4gRihuLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2Z1bmN0aW9uKG4saSxvKXtuLl9fdHJhbnNpdGlvbl9fW3VdLnR3ZWVuLnNldCh0LHIoZS5jYWxsKG4sbi5fX2RhdGFfXyxpLG8pKSl9OihlPXIoZSksZnVuY3Rpb24obil7bi5fX3RyYW5zaXRpb25fX1t1XS50d2Vlbi5zZXQodCxlKX0pKX1mdW5jdGlvbiBGbyhuKXtyZXR1cm4gbnVsbD09biYmKG49IiIpLGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufX1mdW5jdGlvbiBIbyhuLHQsZSxyKXt2YXIgdT1uLl9fdHJhbnNpdGlvbl9ffHwobi5fX3RyYW5zaXRpb25fXz17YWN0aXZlOjAsY291bnQ6MH0pLGk9dVtlXTtpZighaSl7dmFyIG89ci50aW1lO2k9dVtlXT17dHdlZW46bmV3IGEsdGltZTpvLGVhc2U6ci5lYXNlLGRlbGF5OnIuZGVsYXksZHVyYXRpb246ci5kdXJhdGlvbn0sKyt1LmNvdW50LEJvLnRpbWVyKGZ1bmN0aW9uKHIpe2Z1bmN0aW9uIGEocil7cmV0dXJuIHUuYWN0aXZlPmU/bCgpOih1LmFjdGl2ZT1lLGkuZXZlbnQmJmkuZXZlbnQuc3RhcnQuY2FsbChuLHMsdCksaS50d2Vlbi5mb3JFYWNoKGZ1bmN0aW9uKGUscil7KHI9ci5jYWxsKG4scyx0KSkmJnYucHVzaChyKQp9KSxCby50aW1lcihmdW5jdGlvbigpe3JldHVybiBwLmM9YyhyfHwxKT9BZTpjLDF9LDAsbyksdm9pZCAwKX1mdW5jdGlvbiBjKHIpe2lmKHUuYWN0aXZlIT09ZSlyZXR1cm4gbCgpO2Zvcih2YXIgbz1yL2csYT1mKG8pLGM9di5sZW5ndGg7Yz4wOyl2Wy0tY10uY2FsbChuLGEpO3JldHVybiBvPj0xPyhpLmV2ZW50JiZpLmV2ZW50LmVuZC5jYWxsKG4scyx0KSxsKCkpOnZvaWQgMH1mdW5jdGlvbiBsKCl7cmV0dXJuLS11LmNvdW50P2RlbGV0ZSB1W2VdOmRlbGV0ZSBuLl9fdHJhbnNpdGlvbl9fLDF9dmFyIHM9bi5fX2RhdGFfXyxmPWkuZWFzZSxoPWkuZGVsYXksZz1pLmR1cmF0aW9uLHA9S2Esdj1bXTtyZXR1cm4gcC50PWgrbyxyPj1oP2Eoci1oKToocC5jPWEsdm9pZCAwKX0sMCxvKX19ZnVuY3Rpb24gT28obix0LGUpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXt2YXIgcj10KG4pO3JldHVybiJ0cmFuc2xhdGUoIisoaXNGaW5pdGUocik/cjplKG4pKSsiLDApIn0pfWZ1bmN0aW9uIFlvKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKDAsIisoaXNGaW5pdGUocik/cjplKG4pKSsiKSJ9KX1mdW5jdGlvbiBJbyhuKXtyZXR1cm4gbi50b0lTT1N0cmluZygpfWZ1bmN0aW9uIFpvKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHQpfWZ1bmN0aW9uIHUobixlKXt2YXIgcj1uWzFdLW5bMF0sdT1yL2UsaT1Cby5iaXNlY3QoT2wsdSk7cmV0dXJuIGk9PU9sLmxlbmd0aD9bdC55ZWFyLFppKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLzMxNTM2ZTZ9KSxlKVsyXV06aT90W3UvT2xbaS0xXTxPbFtpXS91P2ktMTppXTpbWmwsWmkobixlKVsyXV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBWbyhuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbih0KSxyKTpuLmRvbWFpbigpLm1hcChWbyl9LHIubmljZT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIWlzTmFOKGUpJiYhbi5yYW5nZShlLFZvKCtlKzEpLHQpLmxlbmd0aH12YXIgaT1yLmRvbWFpbigpLG89RGkoaSksYT1udWxsPT1uP3UobywxMCk6Im51bWJlciI9PXR5cGVvZiBuJiZ1KG8sbik7cmV0dXJuIGEmJihuPWFbMF0sdD1hWzFdKSxyLmRvbWFpbihqaShpLHQ+MT97Zmxvb3I6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5mbG9vcih0KSk7KXQ9Vm8odC0xKTtyZXR1cm4gdH0sY2VpbDpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmNlaWwodCkpOyl0PVZvKCt0KzEpO3JldHVybiB0fX06bikpfSxyLnRpY2tzPWZ1bmN0aW9uKG4sdCl7dmFyIGU9RGkoci5kb21haW4oKSksaT1udWxsPT1uP3UoZSwxMCk6Im51bWJlciI9PXR5cGVvZiBuP3UoZSxuKTohbi5yYW5nZSYmW3tyYW5nZTpufSx0XTtyZXR1cm4gaSYmKG49aVswXSx0PWlbMV0pLG4ucmFuZ2UoZVswXSxWbygrZVsxXSsxKSwxPnQ/MTp0KX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBabyhuLmNvcHkoKSx0LGUpfSxZaShyLG4pfWZ1bmN0aW9uIFZvKG4pe3JldHVybiBuZXcgRGF0ZShuKX1mdW5jdGlvbiBYbyhuKXtyZXR1cm4gSlNPTi5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gJG8obil7dmFyIHQ9R28uY3JlYXRlUmFuZ2UoKTtyZXR1cm4gdC5zZWxlY3ROb2RlKEdvLmJvZHkpLHQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KG4ucmVzcG9uc2VUZXh0KX12YXIgQm89e3ZlcnNpb246IjMuNC4xMyJ9O0RhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KTt2YXIgV289W10uc2xpY2UsSm89ZnVuY3Rpb24obil7cmV0dXJuIFdvLmNhbGwobil9LEdvPWRvY3VtZW50LEtvPUdvLmRvY3VtZW50RWxlbWVudCxRbz13aW5kb3c7dHJ5e0pvKEtvLmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKG5hKXtKbz1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fXRyeXtHby5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsMCwiIil9Y2F0Y2godGEpe3ZhciBlYT1Rby5FbGVtZW50LnByb3RvdHlwZSxyYT1lYS5zZXRBdHRyaWJ1dGUsdWE9ZWEuc2V0QXR0cmlidXRlTlMsaWE9UW8uQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsb2E9aWEuc2V0UHJvcGVydHk7ZWEuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7cmEuY2FsbCh0aGlzLG4sdCsiIil9LGVhLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXt1YS5jYWxsKHRoaXMsbix0LGUrIiIpfSxpYS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7b2EuY2FsbCh0aGlzLG4sdCsiIixlKX19Qm8uYXNjZW5kaW5nPW4sQm8uZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOjAvMH0sQm8ubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGkmJiEobnVsbCE9KGU9blt1XSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmZT5yJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGkmJiEobnVsbCE9KGU9dC5jYWxsKG4sblt1XSx1KSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysrdTxpOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmZT5yJiYoZT1yKX1yZXR1cm4gZX0sQm8ubWF4PWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGkmJiEobnVsbCE9KGU9blt1XSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGkmJiEobnVsbCE9KGU9dC5jYWxsKG4sblt1XSx1KSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysrdTxpOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj5lJiYoZT1yKX1yZXR1cm4gZX0sQm8uZXh0ZW50PWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1LGk9LTEsbz1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8byYmIShudWxsIT0oZT11PW5baV0pJiZlPj1lKTspZT11PXZvaWQgMDtmb3IoOysraTxvOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxvJiYhKG51bGwhPShlPXU9dC5jYWxsKG4sbltpXSxpKSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysraTxvOyludWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9cmV0dXJuW2UsdV19LEJvLnN1bT1mdW5jdGlvbihuLHQpe3ZhciByLHU9MCxpPW4ubGVuZ3RoLG89LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK288aTspZShyPStuW29dKSYmKHUrPXIpO2Vsc2UgZm9yKDsrK288aTspZShyPSt0LmNhbGwobixuW29dLG8pKSYmKHUrPXIpO3JldHVybiB1fSxCby5tZWFuPWZ1bmN0aW9uKG4scil7dmFyIHUsaT0wLG89bi5sZW5ndGgsYT0tMSxjPW87aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2E8bzspZSh1PXQoblthXSkpP2krPXU6LS1jO2Vsc2UgZm9yKDsrK2E8bzspZSh1PXQoci5jYWxsKG4sblthXSxhKSkpP2krPXU6LS1jO3JldHVybiBjP2kvYzp2b2lkIDB9LEJvLnF1YW50aWxlPWZ1bmN0aW9uKG4sdCl7dmFyIGU9KG4ubGVuZ3RoLTEpKnQrMSxyPU1hdGguZmxvb3IoZSksdT0rbltyLTFdLGk9ZS1yO3JldHVybiBpP3UraSoobltyXS11KTp1fSxCby5tZWRpYW49ZnVuY3Rpb24ocix1KXt2YXIgaSxvPVtdLGE9ci5sZW5ndGgsYz0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrYzxhOyllKGk9dChyW2NdKSkmJm8ucHVzaChpKTtlbHNlIGZvcig7KytjPGE7KWUoaT10KHUuY2FsbChyLHJbY10sYykpKSYmby5wdXNoKGkpO3JldHVybiBvLmxlbmd0aD9Cby5xdWFudGlsZShvLnNvcnQobiksLjUpOnZvaWQgMH07dmFyIGFhPXIobik7Qm8uYmlzZWN0TGVmdD1hYS5sZWZ0LEJvLmJpc2VjdD1Cby5iaXNlY3RSaWdodD1hYS5yaWdodCxCby5iaXNlY3Rvcj1mdW5jdGlvbih0KXtyZXR1cm4gcigxPT09dC5sZW5ndGg/ZnVuY3Rpb24oZSxyKXtyZXR1cm4gbih0KGUpLHIpfTp0KX0sQm8uc2h1ZmZsZT1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyPW4ubGVuZ3RoO3I7KWU9MHxNYXRoLnJhbmRvbSgpKnItLSx0PW5bcl0sbltyXT1uW2VdLG5bZV09dDtyZXR1cm4gbn0sQm8ucGVybXV0ZT1mdW5jdGlvbihuLHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09blt0W2VdXTtyZXR1cm4gcn0sQm8ucGFpcnM9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGU9MCxyPW4ubGVuZ3RoLTEsdT1uWzBdLGk9bmV3IEFycmF5KDA+cj8wOnIpO3I+ZTspaVtlXT1bdD11LHU9blsrK2VdXTtyZXR1cm4gaX0sQm8uemlwPWZ1bmN0aW9uKCl7aWYoIShyPWFyZ3VtZW50cy5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgbj0tMSx0PUJvLm1pbihhcmd1bWVudHMsdSksZT1uZXcgQXJyYXkodCk7KytuPHQ7KWZvcih2YXIgcixpPS0xLG89ZVtuXT1uZXcgQXJyYXkocik7KytpPHI7KW9baV09YXJndW1lbnRzW2ldW25dO3JldHVybiBlfSxCby50cmFuc3Bvc2U9ZnVuY3Rpb24obil7cmV0dXJuIEJvLnppcC5hcHBseShCbyxuKX0sQm8ua2V5cz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goZSk7cmV0dXJuIHR9LEJvLnZhbHVlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2gobltlXSk7cmV0dXJuIHR9LEJvLmVudHJpZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKHtrZXk6ZSx2YWx1ZTpuW2VdfSk7cmV0dXJuIHR9LEJvLm1lcmdlPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPS0xLG89MDsrK2k8dTspbys9bltpXS5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KG8pOy0tdT49MDspZm9yKHI9blt1XSx0PXIubGVuZ3RoOy0tdD49MDspZVstLW9dPXJbdF07cmV0dXJuIGV9O3ZhciBjYT1NYXRoLmFicztCby5yYW5nZT1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT0xLGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9bixuPTApKSwxLzA9PT0odC1uKS9lKXRocm93IG5ldyBFcnJvcigiaW5maW5pdGUgcmFuZ2UiKTt2YXIgcix1PVtdLG89aShjYShlKSksYT0tMTtpZihuKj1vLHQqPW8sZSo9bywwPmUpZm9yKDsocj1uK2UqKythKT50Oyl1LnB1c2goci9vKTtlbHNlIGZvcig7KHI9bitlKisrYSk8dDspdS5wdXNoKHIvbyk7cmV0dXJuIHV9LEJvLm1hcD1mdW5jdGlvbihuKXt2YXIgdD1uZXcgYTtpZihuIGluc3RhbmNlb2YgYSluLmZvckVhY2goZnVuY3Rpb24obixlKXt0LnNldChuLGUpfSk7ZWxzZSBmb3IodmFyIGUgaW4gbil0LnNldChlLG5bZV0pO3JldHVybiB0fTt2YXIgbGE9Il9fcHJvdG9fXyIsc2E9Ilx4MDAiO28oYSx7aGFzOnMsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bYyhuKV19LHNldDpmdW5jdGlvbihuLHQpe3JldHVybiB0aGlzLl9bYyhuKV09dH0scmVtb3ZlOmYsa2V5czpoLHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHRoaXMuX1t0XSk7cmV0dXJuIG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh7a2V5OmwodCksdmFsdWU6dGhpcy5fW3RdfSk7cmV0dXJuIG59LHNpemU6ZyxlbXB0eTpwLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxsKHQpLHRoaXMuX1t0XSl9fSksQm8ubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxvLGMpe2lmKGM+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LG8pOmU/by5zb3J0KGUpOm87Zm9yKHZhciBsLHMsZixoLGc9LTEscD1vLmxlbmd0aCx2PWlbYysrXSxkPW5ldyBhOysrZzxwOykoaD1kLmdldChsPXYocz1vW2ddKSkpP2gucHVzaChzKTpkLnNldChsLFtzXSk7cmV0dXJuIHQ/KHM9dCgpLGY9ZnVuY3Rpb24oZSxyKXtzLnNldChlLG4odCxyLGMpKX0pOihzPXt9LGY9ZnVuY3Rpb24oZSxyKXtzW2VdPW4odCxyLGMpfSksZC5mb3JFYWNoKGYpLHN9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9b1tlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxvPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4oQm8ubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gb1tpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sQm8uc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyB2O2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxvKHYse2hhczpzLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW2Mobis9IiIpXT0hMCxufSxyZW1vdmU6Zix2YWx1ZXM6aCxzaXplOmcsZW1wdHk6cCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsbCh0KSl9fSksQm8uYmVoYXZpb3I9e30sQm8ucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPWQobix0LHRbZV0pO3JldHVybiBufTt2YXIgZmE9WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07Qm8uZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IHgsdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT1NKG4pO3JldHVybiBufSx4LnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zbGljZShlKzEpLG49bi5zbGljZSgwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSxCby5ldmVudD1udWxsLEJvLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZShoYSwiXFwkJiIpfTt2YXIgaGE9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLGdhPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxwYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LHZhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sZGE9S28ubWF0Y2hlc3x8S29bbShLbywibWF0Y2hlc1NlbGVjdG9yIildLG1hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGRhLmNhbGwobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKHBhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSx2YT1TaXp6bGUsbWE9U2l6emxlLm1hdGNoZXNTZWxlY3RvciksQm8uc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIF9hfTt2YXIgeWE9Qm8uc2VsZWN0aW9uLnByb3RvdHlwZT1bXTt5YS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaT1bXTtuPWsobik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShyPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLGw9ci5sZW5ndGg7KytjPGw7KSh1PXJbY10pPyh0LnB1c2goZT1uLmNhbGwodSx1Ll9fZGF0YV9fLGMsbykpLGUmJiJfX2RhdGFfXyJpbiB1JiYoZS5fX2RhdGFfXz11Ll9fZGF0YV9fKSk6dC5wdXNoKG51bGwpfXJldHVybiBTKGkpfSx5YS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyPVtdO249RShuKTtmb3IodmFyIHU9LTEsaT10aGlzLmxlbmd0aDsrK3U8aTspZm9yKHZhciBvPXRoaXNbdV0sYT0tMSxjPW8ubGVuZ3RoOysrYTxjOykoZT1vW2FdKSYmKHIucHVzaCh0PUpvKG4uY2FsbChlLGUuX19kYXRhX18sYSx1KSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gUyhyKX07dmFyIHhhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtCby5ucz17cHJlZml4OnhhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYoZT1uLnNsaWNlKDAsdCksbj1uLnNsaWNlKHQrMSkpLHhhLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTp4YVtlXSxsb2NhbDpufTpufX0seWEuYXR0cj1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKTtyZXR1cm4gbj1Cby5ucy5xdWFsaWZ5KG4pLG4ubG9jYWw/ZS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmUuZ2V0QXR0cmlidXRlKG4pfWZvcih0IGluIG4pdGhpcy5lYWNoKEEodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChBKG4sdCkpfSx5YS5jbGFzc2VkPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpLHI9KG49eihuKSkubGVuZ3RoLHU9LTE7aWYodD1lLmNsYXNzTGlzdCl7Zm9yKDsrK3U8cjspaWYoIXQuY29udGFpbnMoblt1XSkpcmV0dXJuITF9ZWxzZSBmb3IodD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsrK3U8cjspaWYoIU4oblt1XSkudGVzdCh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mb3IodCBpbiBuKXRoaXMuZWFjaChMKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goTChuLHQpKX0seWEuc3R5bGU9ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5yKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+ciYmKHQ9IiIpO2ZvcihlIGluIG4pdGhpcy5lYWNoKHEoZSxuW2VdLHQpKTtyZXR1cm4gdGhpc31pZigyPnIpcmV0dXJuIFFvLmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKCksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtlPSIifXJldHVybiB0aGlzLmVhY2gocShuLHQsZSkpfSx5YS5wcm9wZXJ0eT1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiB0aGlzLm5vZGUoKVtuXTtmb3IodCBpbiBuKXRoaXMuZWFjaChSKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goUihuLHQpKX0seWEudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9OmZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LHlhLmh0bWw9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9IiJ9OmZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9bn0pOnRoaXMubm9kZSgpLmlubmVySFRNTH0seWEuYXBwZW5kPWZ1bmN0aW9uKG4pe3JldHVybiBuPUQobiksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0seWEuaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49RChuKSx0PWsodCksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LHlhLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pfSx5YS5kYXRhPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByLHUsaSxvPW4ubGVuZ3RoLGY9ZS5sZW5ndGgsaD1NYXRoLm1pbihvLGYpLGc9bmV3IEFycmF5KGYpLHA9bmV3IEFycmF5KGYpLHY9bmV3IEFycmF5KG8pO2lmKHQpe3ZhciBkLG09bmV3IGEseT1uZXcgQXJyYXkobyk7Zm9yKHI9LTE7KytyPG87KW0uaGFzKGQ9dC5jYWxsKHU9bltyXSx1Ll9fZGF0YV9fLHIpKT92W3JdPXU6bS5zZXQoZCx1KSx5W3JdPWQ7Zm9yKHI9LTE7KytyPGY7KSh1PW0uZ2V0KGQ9dC5jYWxsKGUsaT1lW3JdLHIpKSk/dSE9PSEwJiYoZ1tyXT11LHUuX19kYXRhX189aSk6cFtyXT1QKGkpLG0uc2V0KGQsITApO2ZvcihyPS0xOysrcjxvOyltLmdldCh5W3JdKSE9PSEwJiYodltyXT1uW3JdKX1lbHNle2ZvcihyPS0xOysrcjxoOyl1PW5bcl0saT1lW3JdLHU/KHUuX19kYXRhX189aSxnW3JdPXUpOnBbcl09UChpKTtmb3IoO2Y+cjsrK3IpcFtyXT1QKGVbcl0pO2Zvcig7bz5yOysrcil2W3JdPW5bcl19cC51cGRhdGU9ZyxwLnBhcmVudE5vZGU9Zy5wYXJlbnROb2RlPXYucGFyZW50Tm9kZT1uLnBhcmVudE5vZGUsYy5wdXNoKHApLGwucHVzaChnKSxzLnB1c2godil9dmFyIHIsdSxpPS0xLG89dGhpcy5sZW5ndGg7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihuPW5ldyBBcnJheShvPShyPXRoaXNbMF0pLmxlbmd0aCk7KytpPG87KSh1PXJbaV0pJiYobltpXT11Ll9fZGF0YV9fKTtyZXR1cm4gbn12YXIgYz1IKFtdKSxsPVMoW10pLHM9UyhbXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pZm9yKDsrK2k8bzspZShyPXRoaXNbaV0sbi5jYWxsKHIsci5wYXJlbnROb2RlLl9fZGF0YV9fLGkpKTtlbHNlIGZvcig7KytpPG87KWUocj10aGlzW2ldLG4pO3JldHVybiBsLmVudGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGN9LGwuZXhpdD1mdW5jdGlvbigpe3JldHVybiBzfSxsfSx5YS5kYXR1bT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsbik6dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKX0seWEuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1VKG4pKTtmb3IodmFyIGk9MCxvPXRoaXMubGVuZ3RoO28+aTtpKyspe3UucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KGU9dGhpc1tpXSkucGFyZW50Tm9kZTtmb3IodmFyIGE9MCxjPWUubGVuZ3RoO2M+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSxpKSYmdC5wdXNoKHIpfXJldHVybiBTKHUpfSx5YS5vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgbj0tMSx0PXRoaXMubGVuZ3RoOysrbjx0Oylmb3IodmFyIGUscj10aGlzW25dLHU9ci5sZW5ndGgtMSxpPXJbdV07LS11Pj0wOykoZT1yW3VdKSYmKGkmJmkhPT1lLm5leHRTaWJsaW5nJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsaSksaT1lKTtyZXR1cm4gdGhpc30seWEuc29ydD1mdW5jdGlvbihuKXtuPWouYXBwbHkodGhpcyxhcmd1bWVudHMpO2Zvcih2YXIgdD0tMSxlPXRoaXMubGVuZ3RoOysrdDxlOyl0aGlzW3RdLnNvcnQobik7cmV0dXJuIHRoaXMub3JkZXIoKX0seWEuZWFjaD1mdW5jdGlvbihuKXtyZXR1cm4gRih0aGlzLGZ1bmN0aW9uKHQsZSxyKXtuLmNhbGwodCx0Ll9fZGF0YV9fLGUscil9KX0seWEuY2FsbD1mdW5jdGlvbihuKXt2YXIgdD1Kbyhhcmd1bWVudHMpO3JldHVybiBuLmFwcGx5KHRbMF09dGhpcyx0KSx0aGlzfSx5YS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiF0aGlzLm5vZGUoKX0seWEubm9kZT1mdW5jdGlvbigpe2Zvcih2YXIgbj0wLHQ9dGhpcy5sZW5ndGg7dD5uO24rKylmb3IodmFyIGU9dGhpc1tuXSxyPTAsdT1lLmxlbmd0aDt1PnI7cisrKXt2YXIgaT1lW3JdO2lmKGkpcmV0dXJuIGl9cmV0dXJuIG51bGx9LHlhLnNpemU9ZnVuY3Rpb24oKXt2YXIgbj0wO3JldHVybiBGKHRoaXMsZnVuY3Rpb24oKXsrK259KSxufTt2YXIgTWE9W107Qm8uc2VsZWN0aW9uLmVudGVyPUgsQm8uc2VsZWN0aW9uLmVudGVyLnByb3RvdHlwZT1NYSxNYS5hcHBlbmQ9eWEuYXBwZW5kLE1hLmVtcHR5PXlhLmVtcHR5LE1hLm5vZGU9eWEubm9kZSxNYS5jYWxsPXlhLmNhbGwsTWEuc2l6ZT15YS5zaXplLE1hLnNlbGVjdD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvPVtdLGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe3I9KHU9dGhpc1thXSkudXBkYXRlLG8ucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9dS5wYXJlbnROb2RlO2Zvcih2YXIgbD0tMSxzPXUubGVuZ3RoOysrbDxzOykoaT11W2xdKT8odC5wdXNoKHJbbF09ZT1uLmNhbGwodS5wYXJlbnROb2RlLGkuX19kYXRhX18sbCxhKSksZS5fX2RhdGFfXz1pLl9fZGF0YV9fKTp0LnB1c2gobnVsbCl9cmV0dXJuIFMobyl9LE1hLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PU8odGhpcykpLHlhLmluc2VydC5jYWxsKHRoaXMsbix0KX0seWEudHJhbnNpdGlvbj1mdW5jdGlvbigpe2Zvcih2YXIgbix0LGU9Q2x8fCsrcWwscj1bXSx1PU5sfHx7dGltZTpEYXRlLm5vdygpLGVhc2U6d3UsZGVsYXk6MCxkdXJhdGlvbjoyNTB9LGk9LTEsbz10aGlzLmxlbmd0aDsrK2k8bzspe3IucHVzaChuPVtdKTtmb3IodmFyIGE9dGhpc1tpXSxjPS0xLGw9YS5sZW5ndGg7KytjPGw7KSh0PWFbY10pJiZIbyh0LGMsZSx1KSxuLnB1c2godCl9cmV0dXJuIFVvKHIsZSl9LHlhLmludGVycnVwdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goWSl9LEJvLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdD1bInN0cmluZyI9PXR5cGVvZiBuP3BhKG4sR28pOm5dO3JldHVybiB0LnBhcmVudE5vZGU9S28sUyhbdF0pfSxCby5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQ9Sm8oInN0cmluZyI9PXR5cGVvZiBuP3ZhKG4sR28pOm4pO3JldHVybiB0LnBhcmVudE5vZGU9S28sUyhbdF0pfTt2YXIgX2E9Qm8uc2VsZWN0KEtvKTt5YS5vbj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtpZigzPnIpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5yJiYodD0hMSk7Zm9yKGUgaW4gbil0aGlzLmVhY2goSShlLG5bZV0sdCkpO3JldHVybiB0aGlzfWlmKDI+cilyZXR1cm4ocj10aGlzLm5vZGUoKVsiX19vbiIrbl0pJiZyLl87ZT0hMX1yZXR1cm4gdGhpcy5lYWNoKEkobix0LGUpKX07dmFyIGJhPUJvLm1hcCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KTtiYS5mb3JFYWNoKGZ1bmN0aW9uKG4peyJvbiIrbiBpbiBHbyYmYmEucmVtb3ZlKG4pfSk7dmFyIHdhPSJvbnNlbGVjdHN0YXJ0ImluIEdvP251bGw6bShLby5zdHlsZSwidXNlclNlbGVjdCIpLFNhPTA7Qm8ubW91c2U9ZnVuY3Rpb24obil7cmV0dXJuICQobixiKCkpfTt2YXIga2E9L1dlYktpdC8udGVzdChRby5uYXZpZ2F0b3IudXNlckFnZW50KT8tMTowO0JvLnRvdWNoPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPXQsdD1iKCkuY2hhbmdlZFRvdWNoZXMpLHQpZm9yKHZhciByLHU9MCxpPXQubGVuZ3RoO2k+dTsrK3UpaWYoKHI9dFt1XSkuaWRlbnRpZmllcj09PWUpcmV0dXJuICQobixyKX0sQm8uYmVoYXZpb3IuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt0aGlzLm9uKCJtb3VzZWRvd24uZHJhZyIsdSkub24oInRvdWNoc3RhcnQuZHJhZyIsaSl9ZnVuY3Rpb24gdChuLHQsdSxpLG8pe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt2YXIgbixlLHI9dChoLHYpO3ImJihuPXJbMF0teFswXSxlPXJbMV0teFsxXSxwfD1ufGUseD1yLGcoe3R5cGU6ImRyYWciLHg6clswXStsWzBdLHk6clsxXStsWzFdLGR4Om4sZHk6ZX0pKX1mdW5jdGlvbiBjKCl7dChoLHYpJiYobS5vbihpK2QsbnVsbCkub24obytkLG51bGwpLHkocCYmQm8uZXZlbnQudGFyZ2V0PT09ZiksZyh7dHlwZToiZHJhZ2VuZCJ9KSl9dmFyIGwscz10aGlzLGY9Qm8uZXZlbnQudGFyZ2V0LGg9cy5wYXJlbnROb2RlLGc9ZS5vZihzLGFyZ3VtZW50cykscD0wLHY9bigpLGQ9Ii5kcmFnIisobnVsbD09dj8iIjoiLSIrdiksbT1Cby5zZWxlY3QodSgpKS5vbihpK2QsYSkub24obytkLGMpLHk9WCgpLHg9dChoLHYpO3I/KGw9ci5hcHBseShzLGFyZ3VtZW50cyksbD1bbC54LXhbMF0sbC55LXhbMV1dKTpsPVswLDBdLGcoe3R5cGU6ImRyYWdzdGFydCJ9KX19dmFyIGU9dyhuLCJkcmFnIiwiZHJhZ3N0YXJ0IiwiZHJhZ2VuZCIpLHI9bnVsbCx1PXQoeSxCby5tb3VzZSxKLCJtb3VzZW1vdmUiLCJtb3VzZXVwIiksaT10KEIsQm8udG91Y2gsVywidG91Y2htb3ZlIiwidG91Y2hlbmQiKTtyZXR1cm4gbi5vcmlnaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxCby5yZWJpbmQobixlLCJvbiIpfSxCby50b3VjaGVzPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9YigpLnRvdWNoZXMpLHQ/Sm8odCkubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPSQobix0KTtyZXR1cm4gZS5pZGVudGlmaWVyPXQuaWRlbnRpZmllcixlfSk6W119O3ZhciBFYT1NYXRoLlBJLEFhPTIqRWEsQ2E9RWEvMixOYT0xZS02LHphPU5hKk5hLExhPUVhLzE4MCxUYT0xODAvRWEscWE9TWF0aC5TUVJUMixSYT0yLERhPTQ7Qm8uaW50ZXJwb2xhdGVab29tPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuKXt2YXIgdD1uKnk7aWYobSl7dmFyIGU9ZXQodiksbz1pLyhSYSpoKSooZSpydChxYSp0K3YpLXR0KHYpKTtyZXR1cm5bcitvKmwsdStvKnMsaSplL2V0KHFhKnQrdildfXJldHVybltyK24qbCx1K24qcyxpKk1hdGguZXhwKHFhKnQpXX12YXIgcj1uWzBdLHU9blsxXSxpPW5bMl0sbz10WzBdLGE9dFsxXSxjPXRbMl0sbD1vLXIscz1hLXUsZj1sKmwrcypzLGg9TWF0aC5zcXJ0KGYpLGc9KGMqYy1pKmkrRGEqZikvKDIqaSpSYSpoKSxwPShjKmMtaSppLURhKmYpLygyKmMqUmEqaCksdj1NYXRoLmxvZyhNYXRoLnNxcnQoZypnKzEpLWcpLGQ9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSxtPWQtdix5PShtfHxNYXRoLmxvZyhjL2kpKS9xYTtyZXR1cm4gZS5kdXJhdGlvbj0xZTMqeSxlfSxCby5iZWhhdmlvci56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLm9uKEEsbCkub24oamErIi56b29tIixmKS5vbigiZGJsY2xpY2suem9vbSIsaCkub24oeixzKX1mdW5jdGlvbiB0KG4pe3JldHVyblsoblswXS1TLngpL1MuaywoblsxXS1TLnkpL1Mua119ZnVuY3Rpb24gZShuKXtyZXR1cm5bblswXSpTLmsrUy54LG5bMV0qUy5rK1MueV19ZnVuY3Rpb24gcihuKXtTLms9TWF0aC5tYXgoRVswXSxNYXRoLm1pbihFWzFdLG4pKX1mdW5jdGlvbiB1KG4sdCl7dD1lKHQpLFMueCs9blswXS10WzBdLFMueSs9blsxXS10WzFdfWZ1bmN0aW9uIGkoKXt4JiZ4LmRvbWFpbih5LnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLVMueCkvUy5rfSkubWFwKHkuaW52ZXJ0KSksYiYmYi5kb21haW4oTS5yYW5nZSgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi1TLnkpL1Mua30pLm1hcChNLmludmVydCkpfWZ1bmN0aW9uIG8obil7bih7dHlwZToiem9vbXN0YXJ0In0pfWZ1bmN0aW9uIGEobil7aSgpLG4oe3R5cGU6Inpvb20iLHNjYWxlOlMuayx0cmFuc2xhdGU6W1MueCxTLnldfSl9ZnVuY3Rpb24gYyhuKXtuKHt0eXBlOiJ6b29tZW5kIn0pfWZ1bmN0aW9uIGwoKXtmdW5jdGlvbiBuKCl7cz0xLHUoQm8ubW91c2UociksaCksYShsKX1mdW5jdGlvbiBlKCl7Zi5vbihDLG51bGwpLm9uKE4sbnVsbCksZyhzJiZCby5ldmVudC50YXJnZXQ9PT1pKSxjKGwpfXZhciByPXRoaXMsaT1Cby5ldmVudC50YXJnZXQsbD1MLm9mKHIsYXJndW1lbnRzKSxzPTAsZj1Cby5zZWxlY3QoUW8pLm9uKEMsbikub24oTixlKSxoPXQoQm8ubW91c2UocikpLGc9WCgpO1kuY2FsbChyKSxvKGwpfWZ1bmN0aW9uIHMoKXtmdW5jdGlvbiBuKCl7dmFyIG49Qm8udG91Y2hlcyhnKTtyZXR1cm4gaD1TLmssbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uaWRlbnRpZmllciBpbiB2JiYodltuLmlkZW50aWZpZXJdPXQobikpfSksbn1mdW5jdGlvbiBlKCl7dmFyIHQ9Qm8uZXZlbnQudGFyZ2V0O0JvLnNlbGVjdCh0KS5vbih4LGkpLm9uKE0sZiksYi5wdXNoKHQpO2Zvcih2YXIgZT1Cby5ldmVudC5jaGFuZ2VkVG91Y2hlcyxvPTAsYz1lLmxlbmd0aDtjPm87KytvKXZbZVtvXS5pZGVudGlmaWVyXT1udWxsO3ZhciBsPW4oKSxzPURhdGUubm93KCk7aWYoMT09PWwubGVuZ3RoKXtpZig1MDA+cy1tKXt2YXIgaD1sWzBdLGc9dltoLmlkZW50aWZpZXJdO3IoMipTLmspLHUoaCxnKSxfKCksYShwKX1tPXN9ZWxzZSBpZihsLmxlbmd0aD4xKXt2YXIgaD1sWzBdLHk9bFsxXSx3PWhbMF0teVswXSxrPWhbMV0teVsxXTtkPXcqdytrKmt9fWZ1bmN0aW9uIGkoKXtmb3IodmFyIG4sdCxlLGksbz1Cby50b3VjaGVzKGcpLGM9MCxsPW8ubGVuZ3RoO2w+YzsrK2MsaT1udWxsKWlmKGU9b1tjXSxpPXZbZS5pZGVudGlmaWVyXSl7aWYodClicmVhaztuPWUsdD1pfWlmKGkpe3ZhciBzPShzPWVbMF0tblswXSkqcysocz1lWzFdLW5bMV0pKnMsZj1kJiZNYXRoLnNxcnQocy9kKTtuPVsoblswXStlWzBdKS8yLChuWzFdK2VbMV0pLzJdLHQ9Wyh0WzBdK2lbMF0pLzIsKHRbMV0raVsxXSkvMl0scihmKmgpfW09bnVsbCx1KG4sdCksYShwKX1mdW5jdGlvbiBmKCl7aWYoQm8uZXZlbnQudG91Y2hlcy5sZW5ndGgpe2Zvcih2YXIgdD1Cby5ldmVudC5jaGFuZ2VkVG91Y2hlcyxlPTAscj10Lmxlbmd0aDtyPmU7KytlKWRlbGV0ZSB2W3RbZV0uaWRlbnRpZmllcl07Zm9yKHZhciB1IGluIHYpcmV0dXJuIHZvaWQgbigpfUJvLnNlbGVjdEFsbChiKS5vbih5LG51bGwpLHcub24oQSxsKS5vbih6LHMpLGsoKSxjKHApfXZhciBoLGc9dGhpcyxwPUwub2YoZyxhcmd1bWVudHMpLHY9e30sZD0wLHk9Ii56b29tLSIrQm8uZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcix4PSJ0b3VjaG1vdmUiK3ksTT0idG91Y2hlbmQiK3ksYj1bXSx3PUJvLnNlbGVjdChnKSxrPVgoKTtZLmNhbGwoZyksZSgpLG8ocCksdy5vbihBLG51bGwpLm9uKHosZSl9ZnVuY3Rpb24gZigpe3ZhciBuPUwub2YodGhpcyxhcmd1bWVudHMpO2Q/Y2xlYXJUaW1lb3V0KGQpOihnPXQocD12fHxCby5tb3VzZSh0aGlzKSksWS5jYWxsKHRoaXMpLG8obikpLGQ9c2V0VGltZW91dChmdW5jdGlvbigpe2Q9bnVsbCxjKG4pfSw1MCksXygpLHIoTWF0aC5wb3coMiwuMDAyKlBhKCkpKlMuayksdShwLGcpLGEobil9ZnVuY3Rpb24gaCgpe3ZhciBuPUwub2YodGhpcyxhcmd1bWVudHMpLGU9Qm8ubW91c2UodGhpcyksaT10KGUpLGw9TWF0aC5sb2coUy5rKS9NYXRoLkxOMjtvKG4pLHIoTWF0aC5wb3coMixCby5ldmVudC5zaGlmdEtleT9NYXRoLmNlaWwobCktMTpNYXRoLmZsb29yKGwpKzEpKSx1KGUsaSksYShuKSxjKG4pfXZhciBnLHAsdixkLG0seSx4LE0sYixTPXt4OjAseTowLGs6MX0saz1bOTYwLDUwMF0sRT1VYSxBPSJtb3VzZWRvd24uem9vbSIsQz0ibW91c2Vtb3ZlLnpvb20iLE49Im1vdXNldXAuem9vbSIsej0idG91Y2hzdGFydC56b29tIixMPXcobiwiem9vbXN0YXJ0Iiwiem9vbSIsInpvb21lbmQiKTtyZXR1cm4gbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1MLm9mKHRoaXMsYXJndW1lbnRzKSx0PVM7Q2w/Qm8uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC56b29tIixmdW5jdGlvbigpe1M9dGhpcy5fX2NoYXJ0X198fHt4OjAseTowLGs6MX0sbyhuKX0pLnR3ZWVuKCJ6b29tOnpvb20iLGZ1bmN0aW9uKCl7dmFyIGU9a1swXSxyPWtbMV0sdT1lLzIsaT1yLzIsbz1Cby5pbnRlcnBvbGF0ZVpvb20oWyh1LVMueCkvUy5rLChpLVMueSkvUy5rLGUvUy5rXSxbKHUtdC54KS90LmssKGktdC55KS90LmssZS90LmtdKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI9byh0KSxjPWUvclsyXTt0aGlzLl9fY2hhcnRfXz1TPXt4OnUtclswXSpjLHk6aS1yWzFdKmMsazpjfSxhKG4pfX0pLmVhY2goImVuZC56b29tIixmdW5jdGlvbigpe2Mobil9KToodGhpcy5fX2NoYXJ0X189UyxvKG4pLGEobiksYyhuKSl9KX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9e3g6K3RbMF0seTordFsxXSxrOlMua30saSgpLG4pOltTLngsUy55XX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz17eDpTLngseTpTLnksazordH0saSgpLG4pOlMua30sbi5zY2FsZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT1udWxsPT10P1VhOlsrdFswXSwrdFsxXV0sbik6RX0sbi5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9dCYmWyt0WzBdLCt0WzFdXSxuKTp2fSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9dCYmWyt0WzBdLCt0WzFdXSxuKTprfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dCx5PXQuY29weSgpLFM9e3g6MCx5OjAsazoxfSxuKTp4fSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9dCxNPXQuY29weSgpLFM9e3g6MCx5OjAsazoxfSxuKTpifSxCby5yZWJpbmQobixMLCJvbiIpfTt2YXIgUGEsVWE9WzAsMS8wXSxqYT0ib253aGVlbCJpbiBHbz8oUGE9ZnVuY3Rpb24oKXtyZXR1cm4tQm8uZXZlbnQuZGVsdGFZKihCby5ldmVudC5kZWx0YU1vZGU/MTIwOjEpfSwid2hlZWwiKToib25tb3VzZXdoZWVsImluIEdvPyhQYT1mdW5jdGlvbigpe3JldHVybiBCby5ldmVudC53aGVlbERlbHRhfSwibW91c2V3aGVlbCIpOihQYT1mdW5jdGlvbigpe3JldHVybi1Cby5ldmVudC5kZXRhaWx9LCJNb3pNb3VzZVBpeGVsU2Nyb2xsIik7Qm8uY29sb3I9aXQsaXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LEJvLmhzbD1vdDt2YXIgRmE9b3QucHJvdG90eXBlPW5ldyBpdDtGYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IG90KHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxGYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBvdCh0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sRmEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGF0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sQm8uaGNsPWN0O3ZhciBIYT1jdC5wcm90b3R5cGU9bmV3IGl0O0hhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgY3QodGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK09hKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sSGEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgY3QodGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1PYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LEhhLnJnYj1mdW5jdGlvbigpe3JldHVybiBsdCh0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LEJvLmxhYj1zdDt2YXIgT2E9MTgsWWE9Ljk1MDQ3LElhPTEsWmE9MS4wODg4MyxWYT1zdC5wcm90b3R5cGU9bmV3IGl0O1ZhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgc3QoTWF0aC5taW4oMTAwLHRoaXMubCtPYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sVmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgc3QoTWF0aC5tYXgoMCx0aGlzLmwtT2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFZhLnJnYj1mdW5jdGlvbigpe3JldHVybiBmdCh0aGlzLmwsdGhpcy5hLHRoaXMuYil9LEJvLnJnYj1kdDt2YXIgWGE9ZHQucHJvdG90eXBlPW5ldyBpdDtYYS5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsdT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmdT50JiYodD11KSxlJiZ1PmUmJihlPXUpLHImJnU+ciYmKHI9dSksbmV3IGR0KE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IGR0KHUsdSx1KX0sWGEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgZHQobip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxYYS5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gX3QodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxYYS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIit4dCh0aGlzLnIpK3h0KHRoaXMuZykreHQodGhpcy5iKX07dmFyICRhPUJvLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9KTskYS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7JGEuc2V0KG4sbXQodCkpfSksQm8uZnVuY3Rvcj1rdCxCby54aHI9QXQoRXQpLEJvLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9ZSxlPW51bGwpO3ZhciBvPUN0KG4sdCxudWxsPT1lP3I6dShlKSxpKTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0oZT1uKT9yOnUobikpOmV9LG99ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4obil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gYS50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIGE9bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLGM9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgdT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQodShuKSxlKX06dX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihzPj1sKXJldHVybiBvO2lmKHUpcmV0dXJuIHU9ITEsaTt2YXIgdD1zO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8bDspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfXM9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KHU9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytzKToxMD09PXImJih1PSEwKSxuLnNsaWNlKHQrMSxlKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtsPnM7KXt2YXIgcj1uLmNoYXJDb2RlQXQocysrKSxhPTE7aWYoMTA9PT1yKXU9ITA7ZWxzZSBpZigxMz09PXIpdT0hMCwxMD09PW4uY2hhckNvZGVBdChzKSYmKCsrcywrK2EpO2Vsc2UgaWYociE9PWMpY29udGludWU7cmV0dXJuIG4uc2xpY2UodCxzLWEpfXJldHVybiBuLnNsaWNlKHQpfWZvcih2YXIgcix1LGk9e30sbz17fSxhPVtdLGw9bi5sZW5ndGgscz0wLGY9MDsocj1lKCkpIT09bzspe2Zvcih2YXIgaD1bXTtyIT09aSYmciE9PW87KWgucHVzaChyKSxyPWUoKTt0JiZudWxsPT0oaD10KGgsZisrKSl8fGEucHVzaChoKX1yZXR1cm4gYX0sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyB2LHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8dS5wdXNoKHIuYWRkKHQpKX0pLFt1Lm1hcChvKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGkpLmpvaW4oIlxuIil9LGV9LEJvLmNzdj1Cby5kc3YoIiwiLCJ0ZXh0L2NzdiIpLEJvLnRzdj1Cby5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIEJhLFdhLEphLEdhLEthLFFhPVFvW20oUW8sInJlcXVlc3RBbmltYXRpb25GcmFtZSIpXXx8ZnVuY3Rpb24obil7c2V0VGltZW91dChuLDE3KX07Qm8udGltZXI9ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7Mj5yJiYodD0wKSwzPnImJihlPURhdGUubm93KCkpO3ZhciB1PWUrdCxpPXtjOm4sdDp1LGY6ITEsbjpudWxsfTtXYT9XYS5uPWk6QmE9aSxXYT1pLEphfHwoR2E9Y2xlYXJUaW1lb3V0KEdhKSxKYT0xLFFhKEx0KSl9LEJvLnRpbWVyLmZsdXNoPWZ1bmN0aW9uKCl7VHQoKSxxdCgpfSxCby5yb3VuZD1mdW5jdGlvbihuLHQpe3JldHVybiB0P01hdGgucm91bmQobioodD1NYXRoLnBvdygxMCx0KSkpL3Q6TWF0aC5yb3VuZChuKX07dmFyIG5jPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiXHhiNSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdLm1hcChEdCk7Qm8uZm9ybWF0UHJlZml4PWZ1bmN0aW9uKG4sdCl7dmFyIGU9MDtyZXR1cm4gbiYmKDA+biYmKG4qPS0xKSx0JiYobj1Cby5yb3VuZChuLFJ0KG4sdCkpKSxlPTErTWF0aC5mbG9vcigxZS0xMitNYXRoLmxvZyhuKS9NYXRoLkxOMTApLGU9TWF0aC5tYXgoLTI0LE1hdGgubWluKDI0LDMqTWF0aC5mbG9vcigoZS0xKS8zKSkpKSxuY1s4K2UvM119O3ZhciB0Yz0vKD86KFtee10pPyhbPD49Xl0pKT8oWytcLSBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC4tP1xkKyk/KFthLXolXSk/L2ksZWM9Qm8ubWFwKHtiOmZ1bmN0aW9uKG4pe3JldHVybiBuLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKG4pe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG4pfSxvOmZ1bmN0aW9uKG4pe3JldHVybiBuLnRvU3RyaW5nKDgpfSx4OmZ1bmN0aW9uKG4pe3JldHVybiBuLnRvU3RyaW5nKDE2KX0sWDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0sZzpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvUHJlY2lzaW9uKHQpfSxlOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9FeHBvbmVudGlhbCh0KX0sZjpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRml4ZWQodCl9LHI6ZnVuY3Rpb24obix0KXtyZXR1cm4obj1Cby5yb3VuZChuLFJ0KG4sdCkpKS50b0ZpeGVkKE1hdGgubWF4KDAsTWF0aC5taW4oMjAsUnQobiooMSsxZS0xNSksdCkpKSl9fSkscmM9Qm8udGltZT17fSx1Yz1EYXRlO2p0LnByb3RvdHlwZT17Z2V0RGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF0ZSgpfSxnZXREYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RheSgpfSxnZXRGdWxsWWVhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRnVsbFllYXIoKX0sZ2V0SG91cnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0hvdXJzKCl9LGdldE1pbGxpc2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWlsbGlzZWNvbmRzKCl9LGdldE1pbnV0ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbnV0ZXMoKX0sZ2V0TW9udGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01vbnRoKCl9LGdldFNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ1NlY29uZHMoKX0sZ2V0VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VGltZSgpfSxnZXRUaW1lem9uZU9mZnNldDpmdW5jdGlvbigpe3JldHVybiAwfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy52YWx1ZU9mKCl9LHNldERhdGU6ZnVuY3Rpb24oKXtpYy5zZXRVVENEYXRlLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXREYXk6ZnVuY3Rpb24oKXtpYy5zZXRVVENEYXkuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7aWMuc2V0VVRDRnVsbFllYXIuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldEhvdXJzOmZ1bmN0aW9uKCl7aWMuc2V0VVRDSG91cnMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbGxpc2Vjb25kczpmdW5jdGlvbigpe2ljLnNldFVUQ01pbGxpc2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWludXRlczpmdW5jdGlvbigpe2ljLnNldFVUQ01pbnV0ZXMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1vbnRoOmZ1bmN0aW9uKCl7aWMuc2V0VVRDTW9udGguYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFNlY29uZHM6ZnVuY3Rpb24oKXtpYy5zZXRVVENTZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRUaW1lOmZ1bmN0aW9uKCl7aWMuc2V0VGltZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX19O3ZhciBpYz1EYXRlLnByb3RvdHlwZTtyYy55ZWFyPUZ0KGZ1bmN0aW9uKG4pe3JldHVybiBuPXJjLmRheShuKSxuLnNldE1vbnRoKDAsMSksbn0sZnVuY3Rpb24obix0KXtuLnNldEZ1bGxZZWFyKG4uZ2V0RnVsbFllYXIoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKX0pLHJjLnllYXJzPXJjLnllYXIucmFuZ2UscmMueWVhcnMudXRjPXJjLnllYXIudXRjLnJhbmdlLHJjLmRheT1GdChmdW5jdGlvbihuKXt2YXIgdD1uZXcgdWMoMmUzLDApO3JldHVybiB0LnNldEZ1bGxZZWFyKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCkpLHR9LGZ1bmN0aW9uKG4sdCl7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXRlKCktMX0pLHJjLmRheXM9cmMuZGF5LnJhbmdlLHJjLmRheXMudXRjPXJjLmRheS51dGMucmFuZ2UscmMuZGF5T2ZZZWFyPWZ1bmN0aW9uKG4pe3ZhciB0PXJjLnllYXIobik7cmV0dXJuIE1hdGguZmxvb3IoKG4tdC02ZTQqKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKS84NjRlNSl9LFsic3VuZGF5IiwibW9uZGF5IiwidHVlc2RheSIsIndlZG5lc2RheSIsInRodXJzZGF5IiwiZnJpZGF5Iiwic2F0dXJkYXkiXS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7dD03LXQ7dmFyIGU9cmNbbl09RnQoZnVuY3Rpb24obil7cmV0dXJuKG49cmMuZGF5KG4pKS5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpK3QpJTcpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpKzcqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3ZhciBlPXJjLnllYXIobikuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKHJjLmRheU9mWWVhcihuKSsoZSt0KSU3KS83KS0oZSE9PXQpfSk7cmNbbisicyJdPWUucmFuZ2UscmNbbisicyJdLnV0Yz1lLnV0Yy5yYW5nZSxyY1tuKyJPZlllYXIiXT1mdW5jdGlvbihuKXt2YXIgZT1yYy55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChyYy5kYXlPZlllYXIobikrKGUrdCklNykvNyl9fSkscmMud2Vlaz1yYy5zdW5kYXkscmMud2Vla3M9cmMuc3VuZGF5LnJhbmdlLHJjLndlZWtzLnV0Yz1yYy5zdW5kYXkudXRjLnJhbmdlLHJjLndlZWtPZlllYXI9cmMuc3VuZGF5T2ZZZWFyO3ZhciBvYz17Ii0iOiIiLF86IiAiLDA6IjAifSxhYz0vXlxzKlxkKy8sY2M9L14lLztCby5sb2NhbGU9ZnVuY3Rpb24obil7cmV0dXJue251bWJlckZvcm1hdDpQdChuKSx0aW1lRm9ybWF0Ok90KG4pfX07dmFyIGxjPUJvLmxvY2FsZSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl0sZGF0ZVRpbWU6IiVhICViICVlICVYICVZIixkYXRlOiIlbS8lZC8lWSIsdGltZToiJUg6JU06JVMiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7Qm8uZm9ybWF0PWxjLm51bWJlckZvcm1hdCxCby5nZW89e30sY2UucHJvdG90eXBlPXtzOjAsdDowLGFkZDpmdW5jdGlvbihuKXtsZShuLHRoaXMudCxzYyksbGUoc2Mucyx0aGlzLnMsdGhpcyksdGhpcy5zP3RoaXMudCs9c2MudDp0aGlzLnM9c2MudH0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIHNjPW5ldyBjZTtCby5nZW8uc3RyZWFtPWZ1bmN0aW9uKG4sdCl7biYmZmMuaGFzT3duUHJvcGVydHkobi50eXBlKT9mY1tuLnR5cGVdKG4sdCk6c2Uobix0KX07dmFyIGZjPXtGZWF0dXJlOmZ1bmN0aW9uKG4sdCl7c2Uobi5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5mZWF0dXJlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0uZ2VvbWV0cnksdCl9fSxoYz17U3BoZXJlOmZ1bmN0aW9uKG4sdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24obix0KXtuPW4uY29vcmRpbmF0ZXMsdC5wb2ludChuWzBdLG5bMV0sblsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KW49ZVtyXSx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe2ZlKG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylmZShlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXtoZShuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWhlKGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylzZShlW3JdLHQpfX07Qm8uZ2VvLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIGdjPTAsQm8uZ2VvLnN0cmVhbShuLHZjKSxnY307dmFyIGdjLHBjPW5ldyBjZSx2Yz17c3BoZXJlOmZ1bmN0aW9uKCl7Z2MrPTQqRWF9LHBvaW50OnksbGluZVN0YXJ0OnksbGluZUVuZDp5LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3BjLnJlc2V0KCksdmMubGluZVN0YXJ0PWdlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49MipwYztnYys9MD5uPzQqRWErbjpuLHZjLmxpbmVTdGFydD12Yy5saW5lRW5kPXZjLnBvaW50PXl9fTtCby5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe3gucHVzaChNPVtzPW4saD1uXSksZj50JiYoZj10KSx0PmcmJihnPXQpfWZ1bmN0aW9uIHQodCxlKXt2YXIgcj1wZShbdCpMYSxlKkxhXSk7aWYobSl7dmFyIHU9ZGUobSxyKSxpPVt1WzFdLC11WzBdLDBdLG89ZGUoaSx1KTt4ZShvKSxvPU1lKG8pO3ZhciBjPXQtcCxsPWM+MD8xOi0xLHY9b1swXSpUYSpsLGQ9Y2EoYyk+MTgwO2lmKGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PW9bMV0qVGE7eT5nJiYoZz15KX1lbHNlIGlmKHY9KHYrMzYwKSUzNjAtMTgwLGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PS1vWzFdKlRhO2Y+eSYmKGY9eSl9ZWxzZSBmPmUmJihmPWUpLGU+ZyYmKGc9ZSk7ZD9wPnQ/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCk6aD49cz8ocz50JiYocz10KSx0PmgmJihoPXQpKTp0PnA/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCl9ZWxzZSBuKHQsZSk7bT1yLHA9dH1mdW5jdGlvbiBlKCl7Xy5wb2ludD10fWZ1bmN0aW9uIHIoKXtNWzBdPXMsTVsxXT1oLF8ucG9pbnQ9bixtPW51bGx9ZnVuY3Rpb24gdShuLGUpe2lmKG0pe3ZhciByPW4tcDt5Kz1jYShyKT4xODA/cisocj4wPzM2MDotMzYwKTpyfWVsc2Ugdj1uLGQ9ZTt2Yy5wb2ludChuLGUpLHQobixlKX1mdW5jdGlvbiBpKCl7dmMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbygpe3UodixkKSx2Yy5saW5lRW5kKCksY2EoeSk+TmEmJihzPS0oaD0xODApKSxNWzBdPXMsTVsxXT1oLG09bnVsbH1mdW5jdGlvbiBhKG4sdCl7cmV0dXJuKHQtPW4pPDA/dCszNjA6dH1mdW5jdGlvbiBjKG4sdCl7cmV0dXJuIG5bMF0tdFswXX1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgcyxmLGgsZyxwLHYsZCxtLHkseCxNLF89e3BvaW50Om4sbGluZVN0YXJ0OmUsbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe18ucG9pbnQ9dSxfLmxpbmVTdGFydD1pLF8ubGluZUVuZD1vLHk9MCx2Yy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZjLnBvbHlnb25FbmQoKSxfLnBvaW50PW4sXy5saW5lU3RhcnQ9ZSxfLmxpbmVFbmQ9ciwwPnBjPyhzPS0oaD0xODApLGY9LShnPTkwKSk6eT5OYT9nPTkwOi1OYT55JiYoZj0tOTApLE1bMF09cyxNWzFdPWh9fTtyZXR1cm4gZnVuY3Rpb24obil7Zz1oPS0ocz1mPTEvMCkseD1bXSxCby5nZW8uc3RyZWFtKG4sXyk7CnZhciB0PXgubGVuZ3RoO2lmKHQpe3guc29ydChjKTtmb3IodmFyIGUscj0xLHU9eFswXSxpPVt1XTt0PnI7KytyKWU9eFtyXSxsKGVbMF0sdSl8fGwoZVsxXSx1KT8oYSh1WzBdLGVbMV0pPmEodVswXSx1WzFdKSYmKHVbMV09ZVsxXSksYShlWzBdLHVbMV0pPmEodVswXSx1WzFdKSYmKHVbMF09ZVswXSkpOmkucHVzaCh1PWUpO2Zvcih2YXIgbyxlLHA9LTEvMCx0PWkubGVuZ3RoLTEscj0wLHU9aVt0XTt0Pj1yO3U9ZSwrK3IpZT1pW3JdLChvPWEodVsxXSxlWzBdKSk+cCYmKHA9byxzPWVbMF0saD11WzFdKX1yZXR1cm4geD1NPW51bGwsMS8wPT09c3x8MS8wPT09Zj9bWzAvMCwwLzBdLFswLzAsMC8wXV06W1tzLGZdLFtoLGddXX19KCksQm8uZ2VvLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe2RjPW1jPXljPXhjPU1jPV9jPWJjPXdjPVNjPWtjPUVjPTAsQm8uZ2VvLnN0cmVhbShuLEFjKTt2YXIgdD1TYyxlPWtjLHI9RWMsdT10KnQrZSplK3IqcjtyZXR1cm4gemE+dSYmKHQ9X2MsZT1iYyxyPXdjLE5hPm1jJiYodD15YyxlPXhjLHI9TWMpLHU9dCp0K2UqZStyKnIsemE+dSk/WzAvMCwwLzBdOltNYXRoLmF0YW4yKGUsdCkqVGEsbnQoci9NYXRoLnNxcnQodSkpKlRhXX07dmFyIGRjLG1jLHljLHhjLE1jLF9jLGJjLHdjLFNjLGtjLEVjLEFjPXtzcGhlcmU6eSxwb2ludDpiZSxsaW5lU3RhcnQ6U2UsbGluZUVuZDprZSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtBYy5saW5lU3RhcnQ9RWV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtBYy5saW5lU3RhcnQ9U2V9fSxDYz1MZShBZSxEZSxVZSxbLUVhLC1FYS8yXSksTmM9MWU5O0JvLmdlby5jbGlwRXh0ZW50PWZ1bmN0aW9uKCl7dmFyIG4sdCxlLHIsdSxpLG89e3N0cmVhbTpmdW5jdGlvbihuKXtyZXR1cm4gdSYmKHUudmFsaWQ9ITEpLHU9aShuKSx1LnZhbGlkPSEwLHV9LGV4dGVudDpmdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1PZShuPSthWzBdWzBdLHQ9K2FbMF1bMV0sZT0rYVsxXVswXSxyPSthWzFdWzFdKSx1JiYodS52YWxpZD0hMSx1PW51bGwpLG8pOltbbix0XSxbZSxyXV19fTtyZXR1cm4gby5leHRlbnQoW1swLDBdLFs5NjAsNTAwXV0pfSwoQm8uZ2VvLmNvbmljRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIEllKFplKX0pLnJhdz1aZSxCby5nZW8uYWxiZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIEJvLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApfSxCby5nZW8uYWxiZXJzVXNhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXt2YXIgaT1uWzBdLG89blsxXTtyZXR1cm4gdD1udWxsLGUoaSxvKSx0fHwocihpLG8pLHQpfHx1KGksbyksdH12YXIgdCxlLHIsdSxpPUJvLmdlby5hbGJlcnMoKSxvPUJvLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksYT1Cby5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NywwXSkuY2VudGVyKFstMywxOS45XSkucGFyYWxsZWxzKFs4LDE4XSksYz17cG9pbnQ6ZnVuY3Rpb24obixlKXt0PVtuLGVdfX07cmV0dXJuIG4uaW52ZXJ0PWZ1bmN0aW9uKG4pe3ZhciB0PWkuc2NhbGUoKSxlPWkudHJhbnNsYXRlKCkscj0oblswXS1lWzBdKS90LHU9KG5bMV0tZVsxXSkvdDtyZXR1cm4odT49LjEyJiYuMjM0PnUmJnI+PS0uNDI1JiYtLjIxND5yP286dT49LjE2NiYmLjIzND51JiZyPj0tLjIxNCYmLS4xMTU+cj9hOmkpLmludmVydChuKX0sbi5zdHJlYW09ZnVuY3Rpb24obil7dmFyIHQ9aS5zdHJlYW0obiksZT1vLnN0cmVhbShuKSxyPWEuc3RyZWFtKG4pO3JldHVybntwb2ludDpmdW5jdGlvbihuLHUpe3QucG9pbnQobix1KSxlLnBvaW50KG4sdSksci5wb2ludChuLHUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0LnNwaGVyZSgpLGUuc3BoZXJlKCksci5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxlLmxpbmVTdGFydCgpLHIubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxlLmxpbmVFbmQoKSxyLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dC5wb2x5Z29uU3RhcnQoKSxlLnBvbHlnb25TdGFydCgpLHIucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25FbmQoKSxlLnBvbHlnb25FbmQoKSxyLnBvbHlnb25FbmQoKX19fSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaS5wcmVjaXNpb24odCksby5wcmVjaXNpb24odCksYS5wcmVjaXNpb24odCksbik6aS5wcmVjaXNpb24oKX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaS5zY2FsZSh0KSxvLnNjYWxlKC4zNSp0KSxhLnNjYWxlKHQpLG4udHJhbnNsYXRlKGkudHJhbnNsYXRlKCkpKTppLnNjYWxlKCl9LG4udHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBpLnRyYW5zbGF0ZSgpO3ZhciBsPWkuc2NhbGUoKSxzPSt0WzBdLGY9K3RbMV07cmV0dXJuIGU9aS50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW3MtLjQ1NSpsLGYtLjIzOCpsXSxbcysuNDU1KmwsZisuMjM4KmxdXSkuc3RyZWFtKGMpLnBvaW50LHI9by50cmFuc2xhdGUoW3MtLjMwNypsLGYrLjIwMSpsXSkuY2xpcEV4dGVudChbW3MtLjQyNSpsK05hLGYrLjEyKmwrTmFdLFtzLS4yMTQqbC1OYSxmKy4yMzQqbC1OYV1dKS5zdHJlYW0oYykucG9pbnQsdT1hLnRyYW5zbGF0ZShbcy0uMjA1KmwsZisuMjEyKmxdKS5jbGlwRXh0ZW50KFtbcy0uMjE0KmwrTmEsZisuMTY2KmwrTmFdLFtzLS4xMTUqbC1OYSxmKy4yMzQqbC1OYV1dKS5zdHJlYW0oYykucG9pbnQsbn0sbi5zY2FsZSgxMDcwKX07dmFyIHpjLExjLFRjLHFjLFJjLERjLFBjPXtwb2ludDp5LGxpbmVTdGFydDp5LGxpbmVFbmQ6eSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtMYz0wLFBjLmxpbmVTdGFydD1WZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe1BjLmxpbmVTdGFydD1QYy5saW5lRW5kPVBjLnBvaW50PXksemMrPWNhKExjLzIpfX0sVWM9e3BvaW50OlhlLGxpbmVTdGFydDp5LGxpbmVFbmQ6eSxwb2x5Z29uU3RhcnQ6eSxwb2x5Z29uRW5kOnl9LGpjPXtwb2ludDpXZSxsaW5lU3RhcnQ6SmUsbGluZUVuZDpHZSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtqYy5saW5lU3RhcnQ9S2V9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtqYy5wb2ludD1XZSxqYy5saW5lU3RhcnQ9SmUsamMubGluZUVuZD1HZX19O0JvLmdlby5wYXRoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBhJiZpLnBvaW50UmFkaXVzKCthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbyYmby52YWxpZHx8KG89dShpKSksQm8uZ2VvLnN0cmVhbShuLG8pKSxpLnJlc3VsdCgpfWZ1bmN0aW9uIHQoKXtyZXR1cm4gbz1udWxsLG59dmFyIGUscix1LGksbyxhPTQuNTtyZXR1cm4gbi5hcmVhPWZ1bmN0aW9uKG4pe3JldHVybiB6Yz0wLEJvLmdlby5zdHJlYW0obix1KFBjKSksemN9LG4uY2VudHJvaWQ9ZnVuY3Rpb24obil7cmV0dXJuIHljPXhjPU1jPV9jPWJjPXdjPVNjPWtjPUVjPTAsQm8uZ2VvLnN0cmVhbShuLHUoamMpKSxFYz9bU2MvRWMsa2MvRWNdOndjP1tfYy93YyxiYy93Y106TWM/W3ljL01jLHhjL01jXTpbMC8wLDAvMF19LG4uYm91bmRzPWZ1bmN0aW9uKG4pe3JldHVybiBSYz1EYz0tKFRjPXFjPTEvMCksQm8uZ2VvLnN0cmVhbShuLHUoVWMpKSxbW1RjLHFjXSxbUmMsRGNdXX0sbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PShlPW4pP24uc3RyZWFtfHx0cihuKTpFdCx0KCkpOmV9LG4uY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT0ocj1uKT9uZXcgJGU6bmV3IFFlKG4pLCJmdW5jdGlvbiIhPXR5cGVvZiBhJiZpLnBvaW50UmFkaXVzKGEpLHQoKSk6cn0sbi5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksbik6YX0sbi5wcm9qZWN0aW9uKEJvLmdlby5hbGJlcnNVc2EoKSkuY29udGV4dChudWxsKX0sQm8uZ2VvLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtyZXR1cm57c3RyZWFtOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBlcih0KTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9fX0sZXIucHJvdG90eXBlPXtwb2ludDpmdW5jdGlvbihuLHQpe3RoaXMuc3RyZWFtLnBvaW50KG4sdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSxCby5nZW8ucHJvamVjdGlvbj11cixCby5nZW8ucHJvamVjdGlvbk11dGF0b3I9aXIsKEJvLmdlby5lcXVpcmVjdGFuZ3VsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoYXIpfSkucmF3PWFyLmludmVydD1hcixCby5nZW8ucm90YXRpb249ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdD1uKHRbMF0qTGEsdFsxXSpMYSksdFswXSo9VGEsdFsxXSo9VGEsdH1yZXR1cm4gbj1scihuWzBdJTM2MCpMYSxuWzFdKkxhLG4ubGVuZ3RoPjI/blsyXSpMYTowKSx0LmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uLmludmVydCh0WzBdKkxhLHRbMV0qTGEpLHRbMF0qPVRhLHRbMV0qPVRhLHR9LHR9LGNyLmludmVydD1hcixCby5nZW8uY2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIsdD1scigtblswXSpMYSwtblsxXSpMYSwwKS5pbnZlcnQsdT1bXTtyZXR1cm4gZShudWxsLG51bGwsMSx7cG9pbnQ6ZnVuY3Rpb24obixlKXt1LnB1c2gobj10KG4sZSkpLG5bMF0qPVRhLG5bMV0qPVRhfX0pLHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdV19fXZhciB0LGUscj1bMCwwXSx1PTY7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5hbmdsZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1ncigodD0rcikqTGEsdSpMYSksbik6dH0sbi5wcmVjaXNpb249ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IodCpMYSwodT0rcikqTGEpLG4pOnV9LG4uYW5nbGUoOTApfSxCby5nZW8uZGlzdGFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxyPSh0WzBdLW5bMF0pKkxhLHU9blsxXSpMYSxpPXRbMV0qTGEsbz1NYXRoLnNpbihyKSxhPU1hdGguY29zKHIpLGM9TWF0aC5zaW4odSksbD1NYXRoLmNvcyh1KSxzPU1hdGguc2luKGkpLGY9TWF0aC5jb3MoaSk7cmV0dXJuIE1hdGguYXRhbjIoTWF0aC5zcXJ0KChlPWYqbykqZSsoZT1sKnMtYypmKmEpKmUpLGMqcytsKmYqYSl9LEJvLmdlby5ncmF0aWN1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dCgpfX1mdW5jdGlvbiB0KCl7cmV0dXJuIEJvLnJhbmdlKE1hdGguY2VpbChpL2QpKmQsdSxkKS5tYXAoaCkuY29uY2F0KEJvLnJhbmdlKE1hdGguY2VpbChsL20pKm0sYyxtKS5tYXAoZykpLmNvbmNhdChCby5yYW5nZShNYXRoLmNlaWwoci9wKSpwLGUscCkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBjYShuJWQpPk5hfSkubWFwKHMpKS5jb25jYXQoQm8ucmFuZ2UoTWF0aC5jZWlsKGEvdikqdixvLHYpLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gY2EobiVtKT5OYX0pLm1hcChmKSl9dmFyIGUscix1LGksbyxhLGMsbCxzLGYsaCxnLHA9MTAsdj1wLGQ9OTAsbT0zNjAseT0yLjU7cmV0dXJuIG4ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bn19KX0sbi5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltoKGkpLmNvbmNhdChnKGMpLnNsaWNlKDEpLGgodSkucmV2ZXJzZSgpLnNsaWNlKDEpLGcobCkucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yRXh0ZW50KHQpLm1pbm9yRXh0ZW50KHQpOm4ubWlub3JFeHRlbnQoKX0sbi5tYWpvckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdFswXVswXSx1PSt0WzFdWzBdLGw9K3RbMF1bMV0sYz0rdFsxXVsxXSxpPnUmJih0PWksaT11LHU9dCksbD5jJiYodD1sLGw9YyxjPXQpLG4ucHJlY2lzaW9uKHkpKTpbW2ksbF0sW3UsY11dfSxuLm1pbm9yRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sYT0rdFswXVsxXSxvPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSxhPm8mJih0PWEsYT1vLG89dCksbi5wcmVjaXNpb24oeSkpOltbcixhXSxbZSxvXV19LG4uc3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yU3RlcCh0KS5taW5vclN0ZXAodCk6bi5taW5vclN0ZXAoKX0sbi5tYWpvclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3RbMF0sbT0rdFsxXSxuKTpbZCxtXX0sbi5taW5vclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3RbMF0sdj0rdFsxXSxuKTpbcCx2XX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K3Qscz12cihhLG8sOTApLGY9ZHIocixlLHkpLGg9dnIobCxjLDkwKSxnPWRyKGksdSx5KSxuKTp5fSxuLm1ham9yRXh0ZW50KFtbLTE4MCwtOTArTmFdLFsxODAsOTAtTmFdXSkubWlub3JFeHRlbnQoW1stMTgwLC04MC1OYV0sWzE4MCw4MCtOYV1dKX0sQm8uZ2VvLmdyZWF0QXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbdHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8dS5hcHBseSh0aGlzLGFyZ3VtZW50cyldfX12YXIgdCxlLHI9bXIsdT15cjtyZXR1cm4gbi5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiBCby5nZW8uZGlzdGFuY2UodHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8dS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/bnVsbDplLG4pOnJ9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsZT0iZnVuY3Rpb24iPT10eXBlb2YgdD9udWxsOnQsbik6dX0sbi5wcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uOjB9LG59LEJvLmdlby5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuLHQpe3JldHVybiB4cihuWzBdKkxhLG5bMV0qTGEsdFswXSpMYSx0WzFdKkxhKX0sQm8uZ2VvLmxlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gRmM9MCxCby5nZW8uc3RyZWFtKG4sSGMpLEZjfTt2YXIgRmMsSGM9e3NwaGVyZTp5LHBvaW50OnksbGluZVN0YXJ0Ok1yLGxpbmVFbmQ6eSxwb2x5Z29uU3RhcnQ6eSxwb2x5Z29uRW5kOnl9LE9jPV9yKGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnNxcnQoMi8oMStuKSl9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXNpbihuLzIpfSk7KEJvLmdlby5hemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoT2MpfSkucmF3PU9jO3ZhciBZYz1fcihmdW5jdGlvbihuKXt2YXIgdD1NYXRoLmFjb3Mobik7cmV0dXJuIHQmJnQvTWF0aC5zaW4odCl9LEV0KTsoQm8uZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFljKX0pLnJhdz1ZYywoQm8uZ2VvLmNvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIEllKGJyKX0pLnJhdz1iciwoQm8uZ2VvLmNvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gSWUod3IpfSkucmF3PXdyO3ZhciBJYz1fcihmdW5jdGlvbihuKXtyZXR1cm4gMS9ufSxNYXRoLmF0YW4pOyhCby5nZW8uZ25vbW9uaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoSWMpfSkucmF3PUljLFNyLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVybltuLDIqTWF0aC5hdGFuKE1hdGguZXhwKHQpKS1DYV19LChCby5nZW8ubWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4ga3IoU3IpfSkucmF3PVNyO3ZhciBaYz1fcihmdW5jdGlvbigpe3JldHVybiAxfSxNYXRoLmFzaW4pOyhCby5nZW8ub3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFpjKX0pLnJhdz1aYzt2YXIgVmM9X3IoZnVuY3Rpb24obil7cmV0dXJuIDEvKDErbil9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXRhbihuKX0pOyhCby5nZW8uc3RlcmVvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB1cihWYyl9KS5yYXc9VmMsRXIuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuWy10LDIqTWF0aC5hdGFuKE1hdGguZXhwKG4pKS1DYV19LChCby5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yPWZ1bmN0aW9uKCl7dmFyIG49a3IoRXIpLHQ9bi5jZW50ZXIsZT1uLnJvdGF0ZTtyZXR1cm4gbi5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG4/dChbLW5bMV0sblswXV0pOihuPXQoKSxbblsxXSwtblswXV0pfSxuLnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbj9lKFtuWzBdLG5bMV0sbi5sZW5ndGg+Mj9uWzJdKzkwOjkwXSk6KG49ZSgpLFtuWzBdLG5bMV0sblsyXS05MF0pfSxlKFswLDAsOTBdKX0pLnJhdz1FcixCby5nZW9tPXt9LEJvLmdlb20uaHVsbD1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuW107dmFyIHQsdT1rdChlKSxpPWt0KHIpLG89bi5sZW5ndGgsYT1bXSxjPVtdO2Zvcih0PTA7bz50O3QrKylhLnB1c2goWyt1LmNhbGwodGhpcyxuW3RdLHQpLCtpLmNhbGwodGhpcyxuW3RdLHQpLHRdKTtmb3IoYS5zb3J0KHpyKSx0PTA7bz50O3QrKyljLnB1c2goW2FbdF1bMF0sLWFbdF1bMV1dKTt2YXIgbD1OcihhKSxzPU5yKGMpLGY9c1swXT09PWxbMF0saD1zW3MubGVuZ3RoLTFdPT09bFtsLmxlbmd0aC0xXSxnPVtdO2Zvcih0PWwubGVuZ3RoLTE7dD49MDstLXQpZy5wdXNoKG5bYVtsW3RdXVsyXV0pO2Zvcih0PStmO3Q8cy5sZW5ndGgtaDsrK3QpZy5wdXNoKG5bYVtzW3RdXVsyXV0pO3JldHVybiBnfXZhciBlPUFyLHI9Q3I7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChuKToodC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdCl9LEJvLmdlb20ucG9seWdvbj1mdW5jdGlvbihuKXtyZXR1cm4gZ2EobixYYyksbn07dmFyIFhjPUJvLmdlb20ucG9seWdvbi5wcm90b3R5cGU9W107WGMuYXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PS0xLGU9dGhpcy5sZW5ndGgscj10aGlzW2UtMV0sdT0wOysrdDxlOyluPXIscj10aGlzW3RdLHUrPW5bMV0qclswXS1uWzBdKnJbMV07cmV0dXJuLjUqdX0sWGMuY2VudHJvaWQ9ZnVuY3Rpb24obil7dmFyIHQsZSxyPS0xLHU9dGhpcy5sZW5ndGgsaT0wLG89MCxhPXRoaXNbdS0xXTtmb3IoYXJndW1lbnRzLmxlbmd0aHx8KG49LTEvKDYqdGhpcy5hcmVhKCkpKTsrK3I8dTspdD1hLGE9dGhpc1tyXSxlPXRbMF0qYVsxXS1hWzBdKnRbMV0saSs9KHRbMF0rYVswXSkqZSxvKz0odFsxXSthWzFdKSplO3JldHVybltpKm4sbypuXX0sWGMuY2xpcD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvLGE9cXIobiksYz0tMSxsPXRoaXMubGVuZ3RoLXFyKHRoaXMpLHM9dGhpc1tsLTFdOysrYzxsOyl7Zm9yKHQ9bi5zbGljZSgpLG4ubGVuZ3RoPTAsdT10aGlzW2NdLGk9dFsocj10Lmxlbmd0aC1hKS0xXSxlPS0xOysrZTxyOylvPXRbZV0sTHIobyxzLHUpPyhMcihpLHMsdSl8fG4ucHVzaChUcihpLG8scyx1KSksbi5wdXNoKG8pKTpMcihpLHMsdSkmJm4ucHVzaChUcihpLG8scyx1KSksaT1vO2EmJm4ucHVzaChuWzBdKSxzPXV9cmV0dXJuIG59O3ZhciAkYyxCYyxXYyxKYyxHYyxLYz1bXSxRYz1bXTtPci5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PXRoaXMuZWRnZXMsZT10Lmxlbmd0aDtlLS07KW49dFtlXS5lZGdlLG4uYiYmbi5hfHx0LnNwbGljZShlLDEpO3JldHVybiB0LnNvcnQoSXIpLHQubGVuZ3RofSxRci5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5hOnRoaXMuZWRnZS5ifSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmI6dGhpcy5lZGdlLmF9fSxudS5wcm90b3R5cGU9e2luc2VydDpmdW5jdGlvbihuLHQpe3ZhciBlLHIsdTtpZihuKXtpZih0LlA9bix0Lk49bi5OLG4uTiYmKG4uTi5QPXQpLG4uTj10LG4uUil7Zm9yKG49bi5SO24uTDspbj1uLkw7bi5MPXR9ZWxzZSBuLlI9dDtlPW59ZWxzZSB0aGlzLl8/KG49dXUodGhpcy5fKSx0LlA9bnVsbCx0Lk49bixuLlA9bi5MPXQsZT1uKToodC5QPXQuTj1udWxsLHRoaXMuXz10LGU9bnVsbCk7Zm9yKHQuTD10LlI9bnVsbCx0LlU9ZSx0LkM9ITAsbj10O2UmJmUuQzspcj1lLlUsZT09PXIuTD8odT1yLlIsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5SJiYoZXUodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAscnUodGhpcyxyKSkpOih1PXIuTCx1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLkwmJihydSh0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxldSh0aGlzLHIpKSksZT1uLlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbihuKXtuLk4mJihuLk4uUD1uLlApLG4uUCYmKG4uUC5OPW4uTiksbi5OPW4uUD1udWxsO3ZhciB0LGUscix1PW4uVSxpPW4uTCxvPW4uUjtpZihlPWk/bz91dShvKTppOm8sdT91Lkw9PT1uP3UuTD1lOnUuUj1lOnRoaXMuXz1lLGkmJm8/KHI9ZS5DLGUuQz1uLkMsZS5MPWksaS5VPWUsZSE9PW8/KHU9ZS5VLGUuVT1uLlUsbj1lLlIsdS5MPW4sZS5SPW8sby5VPWUpOihlLlU9dSx1PWUsbj1lLlIpKToocj1uLkMsbj1lKSxuJiYobi5VPXUpLCFyKXtpZihuJiZuLkMpcmV0dXJuIG4uQz0hMSx2b2lkIDA7ZG97aWYobj09PXRoaXMuXylicmVhaztpZihuPT09dS5MKXtpZih0PXUuUix0LkMmJih0LkM9ITEsdS5DPSEwLGV1KHRoaXMsdSksdD11LlIpLHQuTCYmdC5MLkN8fHQuUiYmdC5SLkMpe3QuUiYmdC5SLkN8fCh0LkwuQz0hMSx0LkM9ITAscnUodGhpcyx0KSx0PXUuUiksdC5DPXUuQyx1LkM9dC5SLkM9ITEsZXUodGhpcyx1KSxuPXRoaXMuXzticmVha319ZWxzZSBpZih0PXUuTCx0LkMmJih0LkM9ITEsdS5DPSEwLHJ1KHRoaXMsdSksdD11LkwpLHQuTCYmdC5MLkN8fHQuUiYmdC5SLkMpe3QuTCYmdC5MLkN8fCh0LlIuQz0hMSx0LkM9ITAsZXUodGhpcyx0KSx0PXUuTCksdC5DPXUuQyx1LkM9dC5MLkM9ITEscnUodGhpcyx1KSxuPXRoaXMuXzticmVha310LkM9ITAsbj11LHU9dS5VfXdoaWxlKCFuLkMpO24mJihuLkM9ITEpfX19LEJvLmdlb20udm9yb25vaT1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe3ZhciB0PW5ldyBBcnJheShuLmxlbmd0aCkscj1hWzBdWzBdLHU9YVswXVsxXSxpPWFbMV1bMF0sbz1hWzFdWzFdO3JldHVybiBpdShlKG4pLGEpLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxhKXt2YXIgYz1lLmVkZ2VzLGw9ZS5zaXRlLHM9dFthXT1jLmxlbmd0aD9jLm1hcChmdW5jdGlvbihuKXt2YXIgdD1uLnN0YXJ0KCk7cmV0dXJuW3QueCx0LnldfSk6bC54Pj1yJiZsLng8PWkmJmwueT49dSYmbC55PD1vP1tbcixvXSxbaSxvXSxbaSx1XSxbcix1XV06W107cy5wb2ludD1uW2FdfSksdH1mdW5jdGlvbiBlKG4pe3JldHVybiBuLm1hcChmdW5jdGlvbihuLHQpe3JldHVybnt4Ok1hdGgucm91bmQoaShuLHQpL05hKSpOYSx5Ok1hdGgucm91bmQobyhuLHQpL05hKSpOYSxpOnR9fSl9dmFyIHI9QXIsdT1DcixpPXIsbz11LGE9bmw7cmV0dXJuIG4/dChuKToodC5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gaXUoZShuKSkuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBuLmwmJm4ucn0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOm5bdC5sLmldLHRhcmdldDpuW3Quci5pXX19KX0sdC50cmlhbmdsZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107cmV0dXJuIGl1KGUobikpLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxyKXtmb3IodmFyIHUsaSxvPWUuc2l0ZSxhPWUuZWRnZXMuc29ydChJciksYz0tMSxsPWEubGVuZ3RoLHM9YVtsLTFdLmVkZ2UsZj1zLmw9PT1vP3MucjpzLmw7KytjPGw7KXU9cyxpPWYscz1hW2NdLmVkZ2UsZj1zLmw9PT1vP3MucjpzLmwscjxpLmkmJnI8Zi5pJiZhdShvLGksZik8MCYmdC5wdXNoKFtuW3JdLG5baS5pXSxuW2YuaV1dKX0pLHR9LHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1rdChyPW4pLHQpOnJ9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1rdCh1PW4pLHQpOnV9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1udWxsPT1uP25sOm4sdCk6YT09PW5sP251bGw6YX0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuY2xpcEV4dGVudChuJiZbWzAsMF0sbl0pOmE9PT1ubD9udWxsOmEmJmFbMV19LHQpfTt2YXIgbmw9W1stMWU2LC0xZTZdLFsxZTYsMWU2XV07Qm8uZ2VvbS5kZWxhdW5heT1mdW5jdGlvbihuKXtyZXR1cm4gQm8uZ2VvbS52b3Jvbm9pKCkudHJpYW5nbGVzKG4pfSxCby5nZW9tLnF1YWR0cmVlPWZ1bmN0aW9uKG4sdCxlLHIsdSl7ZnVuY3Rpb24gaShuKXtmdW5jdGlvbiBpKG4sdCxlLHIsdSxpLG8sYSl7aWYoIWlzTmFOKGUpJiYhaXNOYU4ocikpaWYobi5sZWFmKXt2YXIgYz1uLngscz1uLnk7aWYobnVsbCE9YylpZihjYShjLWUpK2NhKHMtcik8LjAxKWwobix0LGUscix1LGksbyxhKTtlbHNle3ZhciBmPW4ucG9pbnQ7bi54PW4ueT1uLnBvaW50PW51bGwsbChuLGYsYyxzLHUsaSxvLGEpLGwobix0LGUscix1LGksbyxhKX1lbHNlIG4ueD1lLG4ueT1yLG4ucG9pbnQ9dH1lbHNlIGwobix0LGUscix1LGksbyxhKX1mdW5jdGlvbiBsKG4sdCxlLHIsdSxvLGEsYyl7dmFyIGw9LjUqKHUrYSkscz0uNSoobytjKSxmPWU+PWwsaD1yPj1zLGc9KGg8PDEpK2Y7bi5sZWFmPSExLG49bi5ub2Rlc1tnXXx8KG4ubm9kZXNbZ109c3UoKSksZj91PWw6YT1sLGg/bz1zOmM9cyxpKG4sdCxlLHIsdSxvLGEsYyl9dmFyIHMsZixoLGcscCx2LGQsbSx5LHg9a3QoYSksTT1rdChjKTtpZihudWxsIT10KXY9dCxkPWUsbT1yLHk9dTtlbHNlIGlmKG09eT0tKHY9ZD0xLzApLGY9W10saD1bXSxwPW4ubGVuZ3RoLG8pZm9yKGc9MDtwPmc7KytnKXM9bltnXSxzLng8diYmKHY9cy54KSxzLnk8ZCYmKGQ9cy55KSxzLng+bSYmKG09cy54KSxzLnk+eSYmKHk9cy55KSxmLnB1c2gocy54KSxoLnB1c2gocy55KTtlbHNlIGZvcihnPTA7cD5nOysrZyl7dmFyIF89K3gocz1uW2ddLGcpLGI9K00ocyxnKTt2Pl8mJih2PV8pLGQ+YiYmKGQ9YiksXz5tJiYobT1fKSxiPnkmJih5PWIpLGYucHVzaChfKSxoLnB1c2goYil9dmFyIHc9bS12LFM9eS1kO3c+Uz95PWQrdzptPXYrUzt2YXIgaz1zdSgpO2lmKGsuYWRkPWZ1bmN0aW9uKG4pe2koayxuLCt4KG4sKytnKSwrTShuLGcpLHYsZCxtLHkpfSxrLnZpc2l0PWZ1bmN0aW9uKG4pe2Z1KG4sayx2LGQsbSx5KX0sZz0tMSxudWxsPT10KXtmb3IoOysrZzxwOylpKGssbltnXSxmW2ddLGhbZ10sdixkLG0seSk7LS1nfWVsc2Ugbi5mb3JFYWNoKGsuYWRkKTtyZXR1cm4gZj1oPW49cz1udWxsLGt9dmFyIG8sYT1BcixjPUNyO3JldHVybihvPWFyZ3VtZW50cy5sZW5ndGgpPyhhPWN1LGM9bHUsMz09PW8mJih1PWUscj10LGU9dD0wKSxpKG4pKTooaS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4saSk6YX0saS55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4saSk6Y30saS5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PStuWzBdWzBdLGU9K25bMF1bMV0scj0rblsxXVswXSx1PStuWzFdWzFdKSxpKTpudWxsPT10P251bGw6W1t0LGVdLFtyLHVdXX0saS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPXU9bnVsbDoodD1lPTAscj0rblswXSx1PStuWzFdKSxpKTpudWxsPT10P251bGw6W3ItdCx1LWVdfSxpKX0sQm8uaW50ZXJwb2xhdGVSZ2I9aHUsQm8uaW50ZXJwb2xhdGVPYmplY3Q9Z3UsQm8uaW50ZXJwb2xhdGVOdW1iZXI9cHUsQm8uaW50ZXJwb2xhdGVTdHJpbmc9dnU7dmFyIHRsPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxlbD1uZXcgUmVnRXhwKHRsLnNvdXJjZSwiZyIpO0JvLmludGVycG9sYXRlPWR1LEJvLmludGVycG9sYXRvcnM9W2Z1bmN0aW9uKG4sdCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuKCJzdHJpbmciPT09ZT8kYS5oYXModCl8fC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KHQpP2h1OnZ1OnQgaW5zdGFuY2VvZiBpdD9odTpBcnJheS5pc0FycmF5KHQpP211OiJvYmplY3QiPT09ZSYmaXNOYU4odCk/Z3U6cHUpKG4sdCl9XSxCby5pbnRlcnBvbGF0ZUFycmF5PW11O3ZhciBybD1mdW5jdGlvbigpe3JldHVybiBFdH0sdWw9Qm8ubWFwKHtsaW5lYXI6cmwscG9seTpTdSxxdWFkOmZ1bmN0aW9uKCl7cmV0dXJuIF91fSxjdWJpYzpmdW5jdGlvbigpe3JldHVybiBidX0sc2luOmZ1bmN0aW9uKCl7cmV0dXJuIGt1fSxleHA6ZnVuY3Rpb24oKXtyZXR1cm4gRXV9LGNpcmNsZTpmdW5jdGlvbigpe3JldHVybiBBdX0sZWxhc3RpYzpDdSxiYWNrOk51LGJvdW5jZTpmdW5jdGlvbigpe3JldHVybiB6dX19KSxpbD1Cby5tYXAoeyJpbiI6RXQsb3V0Onh1LCJpbi1vdXQiOk11LCJvdXQtaW4iOmZ1bmN0aW9uKG4pe3JldHVybiBNdSh4dShuKSl9fSk7Qm8uZWFzZT1mdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIi0iKSxlPXQ+PTA/bi5zbGljZSgwLHQpOm4scj10Pj0wP24uc2xpY2UodCsxKToiaW4iO3JldHVybiBlPXVsLmdldChlKXx8cmwscj1pbC5nZXQocil8fEV0LHl1KHIoZS5hcHBseShudWxsLFdvLmNhbGwoYXJndW1lbnRzLDEpKSkpfSxCby5pbnRlcnBvbGF0ZUhjbD1MdSxCby5pbnRlcnBvbGF0ZUhzbD1UdSxCby5pbnRlcnBvbGF0ZUxhYj1xdSxCby5pbnRlcnBvbGF0ZVJvdW5kPVJ1LEJvLnRyYW5zZm9ybT1mdW5jdGlvbihuKXt2YXIgdD1Hby5jcmVhdGVFbGVtZW50TlMoQm8ubnMucHJlZml4LnN2ZywiZyIpO3JldHVybihCby50cmFuc2Zvcm09ZnVuY3Rpb24obil7aWYobnVsbCE9bil7dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsbik7dmFyIGU9dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpfXJldHVybiBuZXcgRHUoZT9lLm1hdHJpeDpvbCl9KShuKX0sRHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMudHJhbnNsYXRlKyIpcm90YXRlKCIrdGhpcy5yb3RhdGUrIilza2V3WCgiK3RoaXMuc2tldysiKXNjYWxlKCIrdGhpcy5zY2FsZSsiKSJ9O3ZhciBvbD17YToxLGI6MCxjOjAsZDoxLGU6MCxmOjB9O0JvLmludGVycG9sYXRlVHJhbnNmb3JtPUZ1LEJvLmxheW91dD17fSxCby5sYXlvdXQuYnVuZGxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXSxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQucHVzaChZdShuW2VdKSk7cmV0dXJuIHR9fSxCby5sYXlvdXQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG4sbCxmLGgsZyxwPXt9LHY9W10sZD1Cby5yYW5nZShpKSxtPVtdO2ZvcihlPVtdLHI9W10sbj0wLGg9LTE7KytoPGk7KXtmb3IobD0wLGc9LTE7KytnPGk7KWwrPXVbaF1bZ107di5wdXNoKGwpLG0ucHVzaChCby5yYW5nZShpKSksbis9bH1mb3IobyYmZC5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG8odltuXSx2W3RdKX0pLGEmJm0uZm9yRWFjaChmdW5jdGlvbihuLHQpe24uc29ydChmdW5jdGlvbihuLGUpe3JldHVybiBhKHVbdF1bbl0sdVt0XVtlXSl9KX0pLG49KEFhLXMqaSkvbixsPTAsaD0tMTsrK2g8aTspe2ZvcihmPWwsZz0tMTsrK2c8aTspe3ZhciB5PWRbaF0seD1tW3ldW2ddLE09dVt5XVt4XSxfPWwsYj1sKz1NKm47cFt5KyItIit4XT17aW5kZXg6eSxzdWJpbmRleDp4LHN0YXJ0QW5nbGU6XyxlbmRBbmdsZTpiLHZhbHVlOk19fXJbeV09e2luZGV4Onksc3RhcnRBbmdsZTpmLGVuZEFuZ2xlOmwsdmFsdWU6KGwtZikvbn0sbCs9c31mb3IoaD0tMTsrK2g8aTspZm9yKGc9aC0xOysrZzxpOyl7dmFyIHc9cFtoKyItIitnXSxTPXBbZysiLSIraF07KHcudmFsdWV8fFMudmFsdWUpJiZlLnB1c2gody52YWx1ZTxTLnZhbHVlP3tzb3VyY2U6Uyx0YXJnZXQ6d306e3NvdXJjZTp3LHRhcmdldDpTfSl9YyYmdCgpfWZ1bmN0aW9uIHQoKXtlLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gYygobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpLzIsKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yKX0pfXZhciBlLHIsdSxpLG8sYSxjLGw9e30scz0wO3JldHVybiBsLm1hdHJpeD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1uKSYmdS5sZW5ndGgsZT1yPW51bGwsbCk6dX0sbC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4sZT1yPW51bGwsbCk6c30sbC5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sZT1yPW51bGwsbCk6b30sbC5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sZT1udWxsLGwpOmF9LGwuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLGUmJnQoKSxsKTpjfSxsLmNob3Jkcz1mdW5jdGlvbigpe3JldHVybiBlfHxuKCksZX0sbC5ncm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8bigpLHJ9LGx9LEJvLmxheW91dC5mb3JjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLHUpe2lmKHQucG9pbnQhPT1uKXt2YXIgaT10LmN4LW4ueCxvPXQuY3ktbi55LGE9dS1lLGM9aSppK28qbztpZihjPmEqYS9kKXtpZihwPmMpe3ZhciBsPXQuY2hhcmdlL2M7bi5weC09aSpsLG4ucHktPW8qbH1yZXR1cm4hMH1pZih0LnBvaW50JiZjJiZwPmMpe3ZhciBsPXQucG9pbnRDaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfX1yZXR1cm4hdC5jaGFyZ2V9fWZ1bmN0aW9uIHQobil7bi5weD1Cby5ldmVudC54LG4ucHk9Qm8uZXZlbnQueSxhLnJlc3VtZSgpfXZhciBlLHIsdSxpLG8sYT17fSxjPUJvLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxsPVsxLDFdLHM9LjksZj1hbCxoPWNsLGc9LTMwLHA9bGwsdj0uMSxkPS42NCxtPVtdLHk9W107cmV0dXJuIGEudGljaz1mdW5jdGlvbigpe2lmKChyKj0uOTkpPC4wMDUpcmV0dXJuIGMuZW5kKHt0eXBlOiJlbmQiLGFscGhhOnI9MH0pLCEwO3ZhciB0LGUsYSxmLGgscCxkLHgsTSxfPW0ubGVuZ3RoLGI9eS5sZW5ndGg7Zm9yKGU9MDtiPmU7KytlKWE9eVtlXSxmPWEuc291cmNlLGg9YS50YXJnZXQseD1oLngtZi54LE09aC55LWYueSwocD14KngrTSpNKSYmKHA9cippW2VdKigocD1NYXRoLnNxcnQocCkpLXVbZV0pL3AseCo9cCxNKj1wLGgueC09eCooZD1mLndlaWdodC8oaC53ZWlnaHQrZi53ZWlnaHQpKSxoLnktPU0qZCxmLngrPXgqKGQ9MS1kKSxmLnkrPU0qZCk7aWYoKGQ9cip2KSYmKHg9bFswXS8yLE09bFsxXS8yLGU9LTEsZCkpZm9yKDsrK2U8XzspYT1tW2VdLGEueCs9KHgtYS54KSpkLGEueSs9KE0tYS55KSpkO2lmKGcpZm9yKFd1KHQ9Qm8uZ2VvbS5xdWFkdHJlZShtKSxyLG8pLGU9LTE7KytlPF87KShhPW1bZV0pLmZpeGVkfHx0LnZpc2l0KG4oYSkpO2ZvcihlPS0xOysrZTxfOylhPW1bZV0sYS5maXhlZD8oYS54PWEucHgsYS55PWEucHkpOihhLngtPShhLnB4LShhLnB4PWEueCkpKnMsYS55LT0oYS5weS0oYS5weT1hLnkpKSpzKTtjLnRpY2soe3R5cGU6InRpY2siLGFscGhhOnJ9KX0sYS5ub2Rlcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uLGEpOm19LGEubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9bixhKTp5fSxhLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixhKTpsfSxhLmxpbmtEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmZ9LGEuZGlzdGFuY2U9YS5saW5rRGlzdGFuY2UsYS5saW5rU3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpofSxhLmZyaWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPStuLGEpOnN9LGEuY2hhcmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Z30sYS5jaGFyZ2VEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uKm4sYSk6TWF0aC5zcXJ0KHApfSxhLmdyYXZpdHk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K24sYSk6dn0sYS50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1uKm4sYSk6TWF0aC5zcXJ0KGQpfSxhLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStuLHI/cj1uPjA/bjowOm4+MCYmKGMuc3RhcnQoe3R5cGU6InN0YXJ0IixhbHBoYTpyPW59KSxCby50aW1lcihhLnRpY2spKSxhKTpyfSxhLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe2lmKCFlKXtmb3IoZT1uZXcgQXJyYXkoYyksYT0wO2M+YTsrK2EpZVthXT1bXTtmb3IoYT0wO2w+YTsrK2Epe3ZhciB1PXlbYV07ZVt1LnNvdXJjZS5pbmRleF0ucHVzaCh1LnRhcmdldCksZVt1LnRhcmdldC5pbmRleF0ucHVzaCh1LnNvdXJjZSl9fWZvcih2YXIgaSxvPWVbdF0sYT0tMSxsPW8ubGVuZ3RoOysrYTxsOylpZighaXNOYU4oaT1vW2FdW25dKSlyZXR1cm4gaTtyZXR1cm4gTWF0aC5yYW5kb20oKSpyfXZhciB0LGUscixjPW0ubGVuZ3RoLHM9eS5sZW5ndGgscD1sWzBdLHY9bFsxXTtmb3IodD0wO2M+dDsrK3QpKHI9bVt0XSkuaW5kZXg9dCxyLndlaWdodD0wO2Zvcih0PTA7cz50OysrdClyPXlbdF0sIm51bWJlciI9PXR5cGVvZiByLnNvdXJjZSYmKHIuc291cmNlPW1bci5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIHIudGFyZ2V0JiYoci50YXJnZXQ9bVtyLnRhcmdldF0pLCsrci5zb3VyY2Uud2VpZ2h0LCsrci50YXJnZXQud2VpZ2h0O2Zvcih0PTA7Yz50OysrdClyPW1bdF0saXNOYU4oci54KSYmKHIueD1uKCJ4IixwKSksaXNOYU4oci55KSYmKHIueT1uKCJ5Iix2KSksaXNOYU4oci5weCkmJihyLnB4PXIueCksaXNOYU4oci5weSkmJihyLnB5PXIueSk7aWYodT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZilmb3IodD0wO3M+dDsrK3QpdVt0XT0rZi5jYWxsKHRoaXMseVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdCl1W3RdPWY7aWYoaT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgaClmb3IodD0wO3M+dDsrK3QpaVt0XT0raC5jYWxsKHRoaXMseVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdClpW3RdPWg7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZylmb3IodD0wO2M+dDsrK3Qpb1t0XT0rZy5jYWxsKHRoaXMsbVt0XSx0KTtlbHNlIGZvcih0PTA7Yz50OysrdClvW3RdPWc7cmV0dXJuIGEucmVzdW1lKCl9LGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYWxwaGEoLjEpfSxhLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSgwKX0sYS5kcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fChlPUJvLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oRXQpLm9uKCJkcmFnc3RhcnQuZm9yY2UiLFZ1KS5vbigiZHJhZy5mb3JjZSIsdCkub24oImRyYWdlbmQuZm9yY2UiLFh1KSksYXJndW1lbnRzLmxlbmd0aD8odGhpcy5vbigibW91c2VvdmVyLmZvcmNlIiwkdSkub24oIm1vdXNlb3V0LmZvcmNlIixCdSkuY2FsbChlKSx2b2lkIDApOmV9LEJvLnJlYmluZChhLGMsIm9uIil9O3ZhciBhbD0yMCxjbD0xLGxsPTEvMDtCby5sYXlvdXQuaGllcmFyY2h5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih1KXt2YXIgaSxvPVt1XSxhPVtdO2Zvcih1LmRlcHRoPTA7bnVsbCE9KGk9by5wb3AoKSk7KWlmKGEucHVzaChpKSwobD1lLmNhbGwobixpLGkuZGVwdGgpKSYmKGM9bC5sZW5ndGgpKXtmb3IodmFyIGMsbCxzOy0tYz49MDspby5wdXNoKHM9bFtjXSkscy5wYXJlbnQ9aSxzLmRlcHRoPWkuZGVwdGgrMTtyJiYoaS52YWx1ZT0wKSxpLmNoaWxkcmVuPWx9ZWxzZSByJiYoaS52YWx1ZT0rci5jYWxsKG4saSxpLmRlcHRoKXx8MCksZGVsZXRlIGkuY2hpbGRyZW47cmV0dXJuIEt1KHUsZnVuY3Rpb24obil7dmFyIGUsdTt0JiYoZT1uLmNoaWxkcmVuKSYmZS5zb3J0KHQpLHImJih1PW4ucGFyZW50KSYmKHUudmFsdWUrPW4udmFsdWUpfSksYX12YXIgdD10aSxlPVF1LHI9bmk7cmV0dXJuIG4uc29ydD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uY2hpbGRyZW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5yZXZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiByJiYoR3UodCxmdW5jdGlvbihuKXtuLmNoaWxkcmVuJiYobi52YWx1ZT0wKX0pLEt1KHQsZnVuY3Rpb24odCl7dmFyIGU7dC5jaGlsZHJlbnx8KHQudmFsdWU9K3IuY2FsbChuLHQsdC5kZXB0aCl8fDApLChlPXQucGFyZW50KSYmKGUudmFsdWUrPXQudmFsdWUpfSkpLHR9LG59LEJvLmxheW91dC5wYXJ0aXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsZSxyLHUpe3ZhciBpPXQuY2hpbGRyZW47aWYodC54PWUsdC55PXQuZGVwdGgqdSx0LmR4PXIsdC5keT11LGkmJihvPWkubGVuZ3RoKSl7dmFyIG8sYSxjLGw9LTE7Zm9yKHI9dC52YWx1ZT9yL3QudmFsdWU6MDsrK2w8bzspbihhPWlbbF0sZSxjPWEudmFsdWUqcix1KSxlKz1jfX1mdW5jdGlvbiB0KG4pe3ZhciBlPW4uY2hpbGRyZW4scj0wO2lmKGUmJih1PWUubGVuZ3RoKSlmb3IodmFyIHUsaT0tMTsrK2k8dTspcj1NYXRoLm1heChyLHQoZVtpXSkpO3JldHVybiAxK3J9ZnVuY3Rpb24gZShlLGkpe3ZhciBvPXIuY2FsbCh0aGlzLGUsaSk7cmV0dXJuIG4ob1swXSwwLHVbMF0sdVsxXS90KG9bMF0pKSxvfXZhciByPUJvLmxheW91dC5oaWVyYXJjaHkoKSx1PVsxLDFdO3JldHVybiBlLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bixlKTp1fSxKdShlLHIpfSxCby5sYXlvdXQucGllPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihpKXt2YXIgbz1pLm1hcChmdW5jdGlvbihlLHIpe3JldHVybit0LmNhbGwobixlLHIpfSksYT0rKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIpLGM9KCgiZnVuY3Rpb24iPT10eXBlb2YgdT91LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp1KS1hKS9Cby5zdW0obyksbD1Cby5yYW5nZShpLmxlbmd0aCk7bnVsbCE9ZSYmbC5zb3J0KGU9PT1zbD9mdW5jdGlvbihuLHQpe3JldHVybiBvW3RdLW9bbl19OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUoaVtuXSxpW3RdKX0pO3ZhciBzPVtdO3JldHVybiBsLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHQ7c1tuXT17ZGF0YTppW25dLHZhbHVlOnQ9b1tuXSxzdGFydEFuZ2xlOmEsZW5kQW5nbGU6YSs9dCpjfX0pLHN9dmFyIHQ9TnVtYmVyLGU9c2wscj0wLHU9QWE7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sbn07dmFyIHNsPXt9O0JvLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oYSxjKXtpZighKGg9YS5sZW5ndGgpKXJldHVybiBhO3ZhciBsPWEubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQuY2FsbChuLGUscil9KSxzPWwubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybltpLmNhbGwobix0LGUpLG8uY2FsbChuLHQsZSldfSl9KSxmPWUuY2FsbChuLHMsYyk7bD1Cby5wZXJtdXRlKGwsZikscz1Cby5wZXJtdXRlKHMsZik7dmFyIGgsZyxwLHYsZD1yLmNhbGwobixzLGMpLG09bFswXS5sZW5ndGg7Zm9yKHA9MDttPnA7KytwKWZvcih1LmNhbGwobixsWzBdW3BdLHY9ZFtwXSxzWzBdW3BdWzFdKSxnPTE7aD5nOysrZyl1LmNhbGwobixsW2ddW3BdLHYrPXNbZy0xXVtwXVsxXSxzW2ddW3BdWzFdKTtyZXR1cm4gYX12YXIgdD1FdCxlPW9pLHI9YWksdT1paSxpPXJpLG89dWk7cmV0dXJuIG4udmFsdWVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZsLmdldCh0KXx8b2ksbik6ZX0sbi5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpobC5nZXQodCl8fGFpLG4pOnJ9LG4ueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG4pOml9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LG4pOm99LG4ub3V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sbn07dmFyIGZsPUJvLm1hcCh7Imluc2lkZS1vdXQiOmZ1bmN0aW9uKG4pe3ZhciB0LGUscj1uLmxlbmd0aCx1PW4ubWFwKGNpKSxpPW4ubWFwKGxpKSxvPUJvLnJhbmdlKHIpLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gdVtuXS11W3RdfSksYT0wLGM9MCxsPVtdLHM9W107Zm9yKHQ9MDtyPnQ7Kyt0KWU9b1t0XSxjPmE/KGErPWlbZV0sbC5wdXNoKGUpKTooYys9aVtlXSxzLnB1c2goZSkpO3JldHVybiBzLnJldmVyc2UoKS5jb25jYXQobCl9LHJldmVyc2U6ZnVuY3Rpb24obil7cmV0dXJuIEJvLnJhbmdlKG4ubGVuZ3RoKS5yZXZlcnNlKCl9LCJkZWZhdWx0IjpvaX0pLGhsPUJvLm1hcCh7c2lsaG91ZXR0ZTpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPW5bMF0ubGVuZ3RoLG89W10sYT0wLGM9W107Zm9yKGU9MDtpPmU7KytlKXtmb3IodD0wLHI9MDt1PnQ7dCsrKXIrPW5bdF1bZV1bMV07cj5hJiYoYT1yKSxvLnB1c2gocil9Zm9yKGU9MDtpPmU7KytlKWNbZV09KGEtb1tlXSkvMjtyZXR1cm4gY30sd2lnZ2xlOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1LGksbyxhLGMsbCxzPW4ubGVuZ3RoLGY9blswXSxoPWYubGVuZ3RoLGc9W107Zm9yKGdbMF09Yz1sPTAsZT0xO2g+ZTsrK2Upe2Zvcih0PTAsdT0wO3M+dDsrK3QpdSs9blt0XVtlXVsxXTtmb3IodD0wLGk9MCxhPWZbZV1bMF0tZltlLTFdWzBdO3M+dDsrK3Qpe2ZvcihyPTAsbz0oblt0XVtlXVsxXS1uW3RdW2UtMV1bMV0pLygyKmEpO3Q+cjsrK3Ipbys9KG5bcl1bZV1bMV0tbltyXVtlLTFdWzFdKS9hO2krPW8qblt0XVtlXVsxXX1nW2VdPWMtPXU/aS91KmE6MCxsPmMmJihsPWMpfWZvcihlPTA7aD5lOysrZSlnW2VdLT1sO3JldHVybiBnfSxleHBhbmQ6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9bi5sZW5ndGgsaT1uWzBdLmxlbmd0aCxvPTEvdSxhPVtdO2ZvcihlPTA7aT5lOysrZSl7Zm9yKHQ9MCxyPTA7dT50O3QrKylyKz1uW3RdW2VdWzFdO2lmKHIpZm9yKHQ9MDt1PnQ7dCsrKW5bdF1bZV1bMV0vPXI7ZWxzZSBmb3IodD0wO3U+dDt0Kyspblt0XVtlXVsxXT1vfWZvcihlPTA7aT5lOysrZSlhW2VdPTA7cmV0dXJuIGF9LHplcm86YWl9KTtCby5sYXlvdXQuaGlzdG9ncmFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe2Zvcih2YXIgbyxhLGM9W10sbD1uLm1hcChlLHRoaXMpLHM9ci5jYWxsKHRoaXMsbCxpKSxmPXUuY2FsbCh0aGlzLHMsbCxpKSxpPS0xLGg9bC5sZW5ndGgsZz1mLmxlbmd0aC0xLHA9dD8xOjEvaDsrK2k8Zzspbz1jW2ldPVtdLG8uZHg9ZltpKzFdLShvLng9ZltpXSksby55PTA7aWYoZz4wKWZvcihpPS0xOysraTxoOylhPWxbaV0sYT49c1swXSYmYTw9c1sxXSYmKG89Y1tCby5iaXNlY3QoZixhLDEsZyktMV0sby55Kz1wLG8ucHVzaChuW2ldKSk7cmV0dXJuIGN9dmFyIHQ9ITAsZT1OdW1iZXIscj1naSx1PWZpO3JldHVybiBuLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1rdCh0KSxuKTpyfSxuLmJpbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9Im51bWJlciI9PXR5cGVvZiB0P2Z1bmN0aW9uKG4pe3JldHVybiBoaShuLHQpfTprdCh0KSxuKTp1fSxuLmZyZXF1ZW5jeT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0hIWUsbik6dH0sbn0sQm8ubGF5b3V0LnBhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7dmFyIG89ZS5jYWxsKHRoaXMsbixpKSxhPW9bMF0sYz11WzBdLGw9dVsxXSxzPW51bGw9PXQ/TWF0aC5zcXJ0OiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdH07aWYoYS54PWEueT0wLEt1KGEsZnVuY3Rpb24obil7bi5yPStzKG4udmFsdWUpfSksS3UoYSx5aSkscil7dmFyIGY9cioodD8xOk1hdGgubWF4KDIqYS5yL2MsMiphLnIvbCkpLzI7S3UoYSxmdW5jdGlvbihuKXtuLnIrPWZ9KSxLdShhLHlpKSxLdShhLGZ1bmN0aW9uKG4pe24uci09Zn0pfXJldHVybiBfaShhLGMvMixsLzIsdD8xOjEvTWF0aC5tYXgoMiphLnIvYywyKmEuci9sKSksb312YXIgdCxlPUJvLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KHBpKSxyPTAsdT1bMSwxXTtyZXR1cm4gbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sbi5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bnVsbD09ZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTorZSxuKTp0fSxuLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbik6cn0sSnUobixlKX0sQm8ubGF5b3V0LnRyZWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdSl7dmFyIHM9by5jYWxsKHRoaXMsbix1KSxmPXNbMF0saD10KGYpO2lmKEt1KGgsZSksaC5wYXJlbnQubT0taC56LEd1KGgsciksbClHdShmLGkpO2Vsc2V7dmFyIGc9ZixwPWYsdj1mO0d1KGYsZnVuY3Rpb24obil7bi54PGcueCYmKGc9biksbi54PnAueCYmKHA9biksbi5kZXB0aD52LmRlcHRoJiYodj1uKX0pO3ZhciBkPWEoZyxwKS8yLWcueCxtPWNbMF0vKHAueCthKHAsZykvMitkKSx5PWNbMV0vKHYuZGVwdGh8fDEpO0d1KGYsZnVuY3Rpb24obil7bi54PShuLngrZCkqbSxuLnk9bi5kZXB0aCp5fSl9cmV0dXJuIHN9ZnVuY3Rpb24gdChuKXtmb3IodmFyIHQsZT17QTpudWxsLGNoaWxkcmVuOltuXX0scj1bZV07bnVsbCE9KHQ9ci5wb3AoKSk7KWZvcih2YXIgdSxpPXQuY2hpbGRyZW4sbz0wLGE9aS5sZW5ndGg7YT5vOysrbylyLnB1c2goKGlbb109dT17XzppW29dLHBhcmVudDp0LGNoaWxkcmVuOih1PWlbb10uY2hpbGRyZW4pJiZ1LnNsaWNlKCl8fFtdLEE6bnVsbCxhOm51bGwsejowLG06MCxjOjAsczowLHQ6bnVsbCxpOm99KS5hPXUpO3JldHVybiBlLmNoaWxkcmVuWzBdfWZ1bmN0aW9uIGUobil7dmFyIHQ9bi5jaGlsZHJlbixlPW4ucGFyZW50LmNoaWxkcmVuLHI9bi5pP2Vbbi5pLTFdOm51bGw7aWYodC5sZW5ndGgpe0FpKG4pO3ZhciBpPSh0WzBdLnordFt0Lmxlbmd0aC0xXS56KS8yO3I/KG4uej1yLnorYShuLl8sci5fKSxuLm09bi56LWkpOm4uej1pfWVsc2UgciYmKG4uej1yLnorYShuLl8sci5fKSk7bi5wYXJlbnQuQT11KG4scixuLnBhcmVudC5BfHxlWzBdKX1mdW5jdGlvbiByKG4pe24uXy54PW4ueituLnBhcmVudC5tLG4ubSs9bi5wYXJlbnQubX1mdW5jdGlvbiB1KG4sdCxlKXtpZih0KXtmb3IodmFyIHIsdT1uLGk9bixvPXQsYz11LnBhcmVudC5jaGlsZHJlblswXSxsPXUubSxzPWkubSxmPW8ubSxoPWMubTtvPWtpKG8pLHU9U2kodSksbyYmdTspYz1TaShjKSxpPWtpKGkpLGkuYT1uLHI9by56K2YtdS56LWwrYShvLl8sdS5fKSxyPjAmJihFaShDaShvLG4sZSksbixyKSxsKz1yLHMrPXIpLGYrPW8ubSxsKz11Lm0saCs9Yy5tLHMrPWkubTtvJiYha2koaSkmJihpLnQ9byxpLm0rPWYtcyksdSYmIVNpKGMpJiYoYy50PXUsYy5tKz1sLWgsZT1uKX1yZXR1cm4gZX1mdW5jdGlvbiBpKG4pe24ueCo9Y1swXSxuLnk9bi5kZXB0aCpjWzFdfXZhciBvPUJvLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLGE9d2ksYz1bMSwxXSxsPW51bGw7cmV0dXJuIG4uc2VwYXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LG4pOmF9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1udWxsPT0oYz10KT9pOm51bGwsbik6bD9udWxsOmN9LG4ubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bnVsbD09KGM9dCk/bnVsbDppLG4pOmw/YzpudWxsfSxKdShuLG8pfSxCby5sYXlvdXQuY2x1c3Rlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXt2YXIgbyxhPXQuY2FsbCh0aGlzLG4saSksYz1hWzBdLGw9MDtLdShjLGZ1bmN0aW9uKG4pe3ZhciB0PW4uY2hpbGRyZW47dCYmdC5sZW5ndGg/KG4ueD16aSh0KSxuLnk9TmkodCkpOihuLng9bz9sKz1lKG4sbyk6MCxuLnk9MCxvPW4pfSk7dmFyIHM9TGkoYyksZj1UaShjKSxoPXMueC1lKHMsZikvMixnPWYueCtlKGYscykvMjtyZXR1cm4gS3UoYyx1P2Z1bmN0aW9uKG4pe24ueD0obi54LWMueCkqclswXSxuLnk9KGMueS1uLnkpKnJbMV19OmZ1bmN0aW9uKG4pe24ueD0obi54LWgpLyhnLWgpKnJbMF0sbi55PSgxLShjLnk/bi55L2MueToxKSkqclsxXX0pLGF9dmFyIHQ9Qm8ubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksZT13aSxyPVsxLDFdLHU9ITE7cmV0dXJuIG4uc2VwYXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT0ocj10KSxuKTp1P251bGw6cn0sbi5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsIT0ocj10KSxuKTp1P3I6bnVsbH0sSnUobix0KX0sQm8ubGF5b3V0LnRyZWVtYXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdCl7Zm9yKHZhciBlLHIsdT0tMSxpPW4ubGVuZ3RoOysrdTxpOylyPShlPW5bdV0pLnZhbHVlKigwPnQ/MDp0KSxlLmFyZWE9aXNOYU4ocil8fDA+PXI/MDpyfWZ1bmN0aW9uIHQoZSl7dmFyIGk9ZS5jaGlsZHJlbjtpZihpJiZpLmxlbmd0aCl7dmFyIG8sYSxjLGw9ZihlKSxzPVtdLGg9aS5zbGljZSgpLHA9MS8wLHY9InNsaWNlIj09PWc/bC5keDoiZGljZSI9PT1nP2wuZHk6InNsaWNlLWRpY2UiPT09Zz8xJmUuZGVwdGg/bC5keTpsLmR4Ok1hdGgubWluKGwuZHgsbC5keSk7Zm9yKG4oaCxsLmR4KmwuZHkvZS52YWx1ZSkscy5hcmVhPTA7KGM9aC5sZW5ndGgpPjA7KXMucHVzaChvPWhbYy0xXSkscy5hcmVhKz1vLmFyZWEsInNxdWFyaWZ5IiE9PWd8fChhPXIocyx2KSk8PXA/KGgucG9wKCkscD1hKToocy5hcmVhLT1zLnBvcCgpLmFyZWEsdShzLHYsbCwhMSksdj1NYXRoLm1pbihsLmR4LGwuZHkpLHMubGVuZ3RoPXMuYXJlYT0wLHA9MS8wKTtzLmxlbmd0aCYmKHUocyx2LGwsITApLHMubGVuZ3RoPXMuYXJlYT0wKSxpLmZvckVhY2godCl9fWZ1bmN0aW9uIGUodCl7dmFyIHI9dC5jaGlsZHJlbjtpZihyJiZyLmxlbmd0aCl7dmFyIGksbz1mKHQpLGE9ci5zbGljZSgpLGM9W107Zm9yKG4oYSxvLmR4Km8uZHkvdC52YWx1ZSksYy5hcmVhPTA7aT1hLnBvcCgpOyljLnB1c2goaSksYy5hcmVhKz1pLmFyZWEsbnVsbCE9aS56JiYodShjLGkuej9vLmR4Om8uZHksbywhYS5sZW5ndGgpLGMubGVuZ3RoPWMuYXJlYT0wKTtyLmZvckVhY2goZSl9fWZ1bmN0aW9uIHIobix0KXtmb3IodmFyIGUscj1uLmFyZWEsdT0wLGk9MS8wLG89LTEsYT1uLmxlbmd0aDsrK288YTspKGU9bltvXS5hcmVhKSYmKGk+ZSYmKGk9ZSksZT51JiYodT1lKSk7cmV0dXJuIHIqPXIsdCo9dCxyP01hdGgubWF4KHQqdSpwL3Isci8odCppKnApKToxLzB9ZnVuY3Rpb24gdShuLHQsZSxyKXt2YXIgdSxpPS0xLG89bi5sZW5ndGgsYT1lLngsbD1lLnkscz10P2Mobi5hcmVhL3QpOjA7aWYodD09ZS5keCl7Zm9yKChyfHxzPmUuZHkpJiYocz1lLmR5KTsrK2k8bzspdT1uW2ldLHUueD1hLHUueT1sLHUuZHk9cyxhKz11LmR4PU1hdGgubWluKGUueCtlLmR4LWEscz9jKHUuYXJlYS9zKTowKTt1Lno9ITAsdS5keCs9ZS54K2UuZHgtYSxlLnkrPXMsZS5keS09c31lbHNle2Zvcigocnx8cz5lLmR4KSYmKHM9ZS5keCk7KytpPG87KXU9bltpXSx1Lng9YSx1Lnk9bCx1LmR4PXMsbCs9dS5keT1NYXRoLm1pbihlLnkrZS5keS1sLHM/Yyh1LmFyZWEvcyk6MCk7dS56PSExLHUuZHkrPWUueStlLmR5LWwsZS54Kz1zLGUuZHgtPXN9fWZ1bmN0aW9uIGkocil7dmFyIHU9b3x8YShyKSxpPXVbMF07cmV0dXJuIGkueD0wLGkueT0wLGkuZHg9bFswXSxpLmR5PWxbMV0sbyYmYS5yZXZhbHVlKGkpLG4oW2ldLGkuZHgqaS5keS9pLnZhbHVlKSwobz9lOnQpKGkpLGgmJihvPXUpLHV9dmFyIG8sYT1Cby5sYXlvdXQuaGllcmFyY2h5KCksYz1NYXRoLnJvdW5kLGw9WzEsMV0scz1udWxsLGY9cWksaD0hMSxnPSJzcXVhcmlmeSIscD0uNSooMStNYXRoLnNxcnQoNSkpO3JldHVybiBpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixpKTpsfSxpLnBhZGRpbmc9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXt2YXIgZT1uLmNhbGwoaSx0LHQuZGVwdGgpO3JldHVybiBudWxsPT1lP3FpKHQpOlJpKHQsIm51bWJlciI9PXR5cGVvZiBlP1tlLGUsZSxlXTplKX1mdW5jdGlvbiBlKHQpe3JldHVybiBSaSh0LG4pfWlmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBzO3ZhciByO3JldHVybiBmPW51bGw9PShzPW4pP3FpOiJmdW5jdGlvbiI9PShyPXR5cGVvZiBuKT90OiJudW1iZXIiPT09cj8obj1bbixuLG4sbl0sZSk6ZSxpfSxpLnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4/TWF0aC5yb3VuZDpOdW1iZXIsaSk6YyE9TnVtYmVyfSxpLnN0aWNreT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1uLG89bnVsbCxpKTpofSxpLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW4saSk6cH0saS5tb2RlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPW4rIiIsaSk6Z30sSnUoaSxhKX0sQm8ucmFuZG9tPXtub3JtYWw6ZnVuY3Rpb24obix0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiAyPmUmJih0PTEpLDE+ZSYmKG49MCksZnVuY3Rpb24oKXt2YXIgZSxyLHU7ZG8gZT0yKk1hdGgucmFuZG9tKCktMSxyPTIqTWF0aC5yYW5kb20oKS0xLHU9ZSplK3Iqcjt3aGlsZSghdXx8dT4xKTtyZXR1cm4gbit0KmUqTWF0aC5zcXJ0KC0yKk1hdGgubG9nKHUpL3UpfX0sbG9nTm9ybWFsOmZ1bmN0aW9uKCl7dmFyIG49Qm8ucmFuZG9tLm5vcm1hbC5hcHBseShCbyxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cChuKCkpfX0sYmF0ZXM6ZnVuY3Rpb24obil7dmFyIHQ9Qm8ucmFuZG9tLmlyd2luSGFsbChuKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCgpL259fSxpcndpbkhhbGw6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO24+ZTtlKyspdCs9TWF0aC5yYW5kb20oKTtyZXR1cm4gdH19fSxCby5zY2FsZT17fTt2YXIgZ2w9e2Zsb29yOkV0LGNlaWw6RXR9O0JvLnNjYWxlLmxpbmVhcj1mdW5jdGlvbigpe3JldHVybiBPaShbMCwxXSxbMCwxXSxkdSwhMSl9O3ZhciBwbD17czoxLGc6MSxwOjEscjoxLGU6MX07Qm8uc2NhbGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIFdpKEJvLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCwxXSksMTAsITAsWzEsMTBdKX07dmFyIHZsPUJvLmZvcm1hdCgiLjBlIiksZGw9e2Zsb29yOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmNlaWwoLW4pfSxjZWlsOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmZsb29yKC1uKX19O0JvLnNjYWxlLnBvdz1mdW5jdGlvbigpe3JldHVybiBKaShCby5zY2FsZS5saW5lYXIoKSwxLFswLDFdKX0sQm8uc2NhbGUuc3FydD1mdW5jdGlvbigpe3JldHVybiBCby5zY2FsZS5wb3coKS5leHBvbmVudCguNSl9LEJvLnNjYWxlLm9yZGluYWw9ZnVuY3Rpb24oKXtyZXR1cm4gS2koW10se3Q6InJhbmdlIixhOltbXV19KX0sQm8uc2NhbGUuY2F0ZWdvcnkxMD1mdW5jdGlvbigpe3JldHVybiBCby5zY2FsZS5vcmRpbmFsKCkucmFuZ2UobWwpfSxCby5zY2FsZS5jYXRlZ29yeTIwPWZ1bmN0aW9uKCl7cmV0dXJuIEJvLnNjYWxlLm9yZGluYWwoKS5yYW5nZSh5bCl9LEJvLnNjYWxlLmNhdGVnb3J5MjBiPWZ1bmN0aW9uKCl7cmV0dXJuIEJvLnNjYWxlLm9yZGluYWwoKS5yYW5nZSh4bCl9LEJvLnNjYWxlLmNhdGVnb3J5MjBjPWZ1bmN0aW9uKCl7cmV0dXJuIEJvLnNjYWxlLm9yZGluYWwoKS5yYW5nZShNbCl9O3ZhciBtbD1bMjA2MjI2MCwxNjc0NDIwNiwyOTI0NTg4LDE0MDM0NzI4LDk3MjU4ODUsOTE5NzEzMSwxNDkwNzMzMCw4MzU1NzExLDEyMzY5MTg2LDE1NTYxNzVdLm1hcCh5dCkseWw9WzIwNjIyNjAsMTE0NTQ0NDAsMTY3NDQyMDYsMTY3NTk2NzIsMjkyNDU4OCwxMDAxODY5OCwxNDAzNDcyOCwxNjc1MDc0Miw5NzI1ODg1LDEyOTU1ODYxLDkxOTcxMzEsMTI4ODUxNDAsMTQ5MDczMzAsMTYyMzQxOTQsODM1NTcxMSwxMzA5MjgwNywxMjM2OTE4NiwxNDQwODU4OSwxNTU2MTc1LDEwNDEwNzI1XS5tYXAoeXQpLHhsPVszNzUwNzc3LDUzOTU2MTksNzA0MDcxOSwxMDI2NDI4Niw2NTE5MDk3LDkyMTY1OTQsMTE5MTUxMTUsMTM1NTY2MzYsOTIwMjk5MywxMjQyNjgwOSwxNTE4NjUxNCwxNTE5MDkzMiw4NjY2MTY5LDExMzU2NDkwLDE0MDQ5NjQzLDE1MTc3MzcyLDgwNzc2ODMsMTA4MzQzMjQsMTM1Mjg1MDksMTQ1ODk2NTRdLm1hcCh5dCksTWw9WzMyNDQ3MzMsNzA1NzExMCwxMDQwNjYyNSwxMzAzMjQzMSwxNTA5NTA1MywxNjYxNjc2NCwxNjYyNTI1OSwxNjYzNDAxOCwzMjUzMDc2LDc2NTI0NzAsMTA2MDcwMDMsMTMxMDE1MDQsNzY5NTI4MSwxMDM5NDMxMiwxMjM2OTM3MiwxNDM0Mjg5MSw2NTEzNTA3LDk4Njg5NTAsMTI0MzQ4NzcsMTQyNzcwODFdLm1hcCh5dCk7Qm8uc2NhbGUucXVhbnRpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gUWkoW10sW10pCn0sQm8uc2NhbGUucXVhbnRpemU9ZnVuY3Rpb24oKXtyZXR1cm4gbm8oMCwxLFswLDFdKX0sQm8uc2NhbGUudGhyZXNob2xkPWZ1bmN0aW9uKCl7cmV0dXJuIHRvKFsuNV0sWzAsMV0pfSxCby5zY2FsZS5pZGVudGl0eT1mdW5jdGlvbigpe3JldHVybiBlbyhbMCwxXSl9LEJvLnN2Zz17fSxCby5zdmcuYXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKStfbCxhPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpK19sLGM9KG8+YSYmKGM9byxvPWEsYT1jKSxhLW8pLGw9RWE+Yz8iMCI6IjEiLHM9TWF0aC5jb3MobyksZj1NYXRoLnNpbihvKSxoPU1hdGguY29zKGEpLGc9TWF0aC5zaW4oYSk7cmV0dXJuIGM+PWJsP24/Ik0wLCIraSsiQSIraSsiLCIraSsiIDAgMSwxIDAsIistaSsiQSIraSsiLCIraSsiIDAgMSwxIDAsIitpKyJNMCwiK24rIkEiK24rIiwiK24rIiAwIDEsMCAwLCIrLW4rIkEiK24rIiwiK24rIiAwIDEsMCAwLCIrbisiWiI6Ik0wLCIraSsiQSIraSsiLCIraSsiIDAgMSwxIDAsIistaSsiQSIraSsiLCIraSsiIDAgMSwxIDAsIitpKyJaIjpuPyJNIitpKnMrIiwiK2kqZisiQSIraSsiLCIraSsiIDAgIitsKyIsMSAiK2kqaCsiLCIraSpnKyJMIituKmgrIiwiK24qZysiQSIrbisiLCIrbisiIDAgIitsKyIsMCAiK24qcysiLCIrbipmKyJaIjoiTSIraSpzKyIsIitpKmYrIkEiK2krIiwiK2krIiAwICIrbCsiLDEgIitpKmgrIiwiK2kqZysiTDAsMCIrIloifXZhciB0PXJvLGU9dW8scj1pbyx1PW9vO3JldHVybiBuLmlubmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWt0KGUpLG4pOnR9LG4ub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9a3QodCksbik6ZX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWt0KHQpLG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9a3QodCksbik6dX0sbi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBuPSh0LmFwcGx5KHRoaXMsYXJndW1lbnRzKStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixpPShyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMitfbDtyZXR1cm5bTWF0aC5jb3MoaSkqbixNYXRoLnNpbihpKSpuXX0sbn07dmFyIF9sPS1DYSxibD1BYS1OYTtCby5zdmcubGluZT1mdW5jdGlvbigpe3JldHVybiBhbyhFdCl9O3ZhciB3bD1Cby5tYXAoe2xpbmVhcjpjbywibGluZWFyLWNsb3NlZCI6bG8sc3RlcDpzbywic3RlcC1iZWZvcmUiOmZvLCJzdGVwLWFmdGVyIjpobyxiYXNpczp4bywiYmFzaXMtb3BlbiI6TW8sImJhc2lzLWNsb3NlZCI6X28sYnVuZGxlOmJvLGNhcmRpbmFsOnZvLCJjYXJkaW5hbC1vcGVuIjpnbywiY2FyZGluYWwtY2xvc2VkIjpwbyxtb25vdG9uZTpDb30pO3dsLmZvckVhY2goZnVuY3Rpb24obix0KXt0LmtleT1uLHQuY2xvc2VkPS8tY2xvc2VkJC8udGVzdChuKX0pO3ZhciBTbD1bMCwyLzMsMS8zLDBdLGtsPVswLDEvMywyLzMsMF0sRWw9WzAsMS82LDIvMywxLzZdO0JvLnN2Zy5saW5lLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPWFvKE5vKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxufSxmby5yZXZlcnNlPWhvLGhvLnJldmVyc2U9Zm8sQm8uc3ZnLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gem8oRXQpfSxCby5zdmcuYXJlYS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj16byhObyk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uaW5uZXJSYWRpdXM9bi54MCxkZWxldGUgbi54MCxuLm91dGVyUmFkaXVzPW4ueDEsZGVsZXRlIG4ueDEsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxuLnN0YXJ0QW5nbGU9bi55MCxkZWxldGUgbi55MCxuLmVuZEFuZ2xlPW4ueTEsZGVsZXRlIG4ueTEsbn0sQm8uc3ZnLmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGEpe3ZhciBjPXQodGhpcyxpLG4sYSksbD10KHRoaXMsbyxuLGEpO3JldHVybiJNIitjLnAwK3IoYy5yLGMucDEsYy5hMS1jLmEwKSsoZShjLGwpP3UoYy5yLGMucDEsYy5yLGMucDApOnUoYy5yLGMucDEsbC5yLGwucDApK3IobC5yLGwucDEsbC5hMS1sLmEwKSt1KGwucixsLnAxLGMucixjLnAwKSkrIloifWZ1bmN0aW9uIHQobix0LGUscil7dmFyIHU9dC5jYWxsKG4sZSxyKSxpPWEuY2FsbChuLHUsciksbz1jLmNhbGwobix1LHIpK19sLHM9bC5jYWxsKG4sdSxyKStfbDtyZXR1cm57cjppLGEwOm8sYTE6cyxwMDpbaSpNYXRoLmNvcyhvKSxpKk1hdGguc2luKG8pXSxwMTpbaSpNYXRoLmNvcyhzKSxpKk1hdGguc2luKHMpXX19ZnVuY3Rpb24gZShuLHQpe3JldHVybiBuLmEwPT10LmEwJiZuLmExPT10LmExfWZ1bmN0aW9uIHIobix0LGUpe3JldHVybiJBIituKyIsIituKyIgMCAiKyArKGU+RWEpKyIsMSAiK3R9ZnVuY3Rpb24gdShuLHQsZSxyKXtyZXR1cm4iUSAwLDAgIityfXZhciBpPW1yLG89eXIsYT1MbyxjPWlvLGw9b287cmV0dXJuIG4ucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWt0KHQpLG4pOmF9LG4uc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWt0KHQpLG4pOml9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWt0KHQpLG4pOm99LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1rdCh0KSxuKTpjfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWt0KHQpLG4pOmx9LG59LEJvLnN2Zy5kaWFnb25hbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgaT10LmNhbGwodGhpcyxuLHUpLG89ZS5jYWxsKHRoaXMsbix1KSxhPShpLnkrby55KS8yLGM9W2kse3g6aS54LHk6YX0se3g6by54LHk6YX0sb107cmV0dXJuIGM9Yy5tYXAociksIk0iK2NbMF0rIkMiK2NbMV0rIiAiK2NbMl0rIiAiK2NbM119dmFyIHQ9bXIsZT15cixyPVRvO3JldHVybiBuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1rdChlKSxuKTp0fSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1rdCh0KSxuKTplfSxuLnByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxufSxCby5zdmcuZGlhZ29uYWwucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49Qm8uc3ZnLmRpYWdvbmFsKCksdD1UbyxlPW4ucHJvamVjdGlvbjtyZXR1cm4gbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UocW8odD1uKSk6dH0sbn0sQm8uc3ZnLnN5bWJvbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixyKXtyZXR1cm4oQWwuZ2V0KHQuY2FsbCh0aGlzLG4scikpfHxQbykoZS5jYWxsKHRoaXMsbixyKSl9dmFyIHQ9RG8sZT1SbztyZXR1cm4gbi50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWt0KGUpLG4pOnR9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1rdCh0KSxuKTplfSxufTt2YXIgQWw9Qm8ubWFwKHtjaXJjbGU6UG8sY3Jvc3M6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vNSkvMjtyZXR1cm4iTSIrLTMqdCsiLCIrLXQrIkgiKy10KyJWIistMyp0KyJIIit0KyJWIistdCsiSCIrMyp0KyJWIit0KyJIIit0KyJWIiszKnQrIkgiKy10KyJWIit0KyJIIistMyp0KyJaIn0sZGlhbW9uZDpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi8oMipMbCkpLGU9dCpMbDtyZXR1cm4iTTAsIistdCsiTCIrZSsiLDAiKyIgMCwiK3QrIiAiKy1lKyIsMCIrIloifSxzcXVhcmU6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4pLzI7cmV0dXJuIk0iKy10KyIsIistdCsiTCIrdCsiLCIrLXQrIiAiK3QrIiwiK3QrIiAiKy10KyIsIit0KyJaIn0sInRyaWFuZ2xlLWRvd24iOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL3psKSxlPXQqemwvMjtyZXR1cm4iTTAsIitlKyJMIit0KyIsIistZSsiICIrLXQrIiwiKy1lKyJaIn0sInRyaWFuZ2xlLXVwIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi96bCksZT10KnpsLzI7cmV0dXJuIk0wLCIrLWUrIkwiK3QrIiwiK2UrIiAiKy10KyIsIitlKyJaIn19KTtCby5zdmcuc3ltYm9sVHlwZXM9QWwua2V5cygpO3ZhciBDbCxObCx6bD1NYXRoLnNxcnQoMyksTGw9TWF0aC50YW4oMzAqTGEpLFRsPVtdLHFsPTA7VGwuY2FsbD15YS5jYWxsLFRsLmVtcHR5PXlhLmVtcHR5LFRsLm5vZGU9eWEubm9kZSxUbC5zaXplPXlhLnNpemUsQm8udHJhbnNpdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9DbD9uLnRyYW5zaXRpb24oKTpuOl9hLnRyYW5zaXRpb24oKX0sQm8udHJhbnNpdGlvbi5wcm90b3R5cGU9VGwsVGwuc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PXRoaXMuaWQsaT1bXTtuPWsobik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSk7Zm9yKHZhciBjPXRoaXNbb10sbD0tMSxzPWMubGVuZ3RoOysrbDxzOykocj1jW2xdKSYmKGU9bi5jYWxsKHIsci5fX2RhdGFfXyxsLG8pKT8oIl9fZGF0YV9fImluIHImJihlLl9fZGF0YV9fPXIuX19kYXRhX18pLEhvKGUsbCx1LHIuX190cmFuc2l0aW9uX19bdV0pLHQucHVzaChlKSk6dC5wdXNoKG51bGwpfXJldHVybiBVbyhpLHUpfSxUbC5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxvPXRoaXMuaWQsYT1bXTtuPUUobik7Zm9yKHZhciBjPS0xLGw9dGhpcy5sZW5ndGg7KytjPGw7KWZvcih2YXIgcz10aGlzW2NdLGY9LTEsaD1zLmxlbmd0aDsrK2Y8aDspaWYocj1zW2ZdKXtpPXIuX190cmFuc2l0aW9uX19bb10sZT1uLmNhbGwocixyLl9fZGF0YV9fLGYsYyksYS5wdXNoKHQ9W10pO2Zvcih2YXIgZz0tMSxwPWUubGVuZ3RoOysrZzxwOykodT1lW2ddKSYmSG8odSxnLG8saSksdC5wdXNoKHUpfXJldHVybiBVbyhhLG8pfSxUbC5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPVUobikpO2Zvcih2YXIgaT0wLG89dGhpcy5sZW5ndGg7bz5pO2krKyl7dS5wdXNoKHQ9W10pO2Zvcih2YXIgZT10aGlzW2ldLGE9MCxjPWUubGVuZ3RoO2M+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSxpKSYmdC5wdXNoKHIpfXJldHVybiBVbyh1LHRoaXMuaWQpfSxUbC50d2Vlbj1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzLm5vZGUoKS5fX3RyYW5zaXRpb25fX1tlXS50d2Vlbi5nZXQobik6Rih0aGlzLG51bGw9PXQ/ZnVuY3Rpb24odCl7dC5fX3RyYW5zaXRpb25fX1tlXS50d2Vlbi5yZW1vdmUobil9OmZ1bmN0aW9uKHIpe3IuX190cmFuc2l0aW9uX19bZV0udHdlZW4uc2V0KG4sdCl9KX0sVGwuYXR0cj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShhKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpfWZ1bmN0aW9uIHUobil7cmV0dXJuIG51bGw9PW4/ZToobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlKGEpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKGEsdChuKSl9KX0pfWZ1bmN0aW9uIGkobil7cmV0dXJuIG51bGw9PW4/cjoobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCx0KG4pKX0pfSl9aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodCBpbiBuKXRoaXMuYXR0cih0LG5bdF0pO3JldHVybiB0aGlzfXZhciBvPSJ0cmFuc2Zvcm0iPT1uP0Z1OmR1LGE9Qm8ubnMucXVhbGlmeShuKTtyZXR1cm4gam8odGhpcywiYXR0ci4iK24sdCxhLmxvY2FsP2k6dSl9LFRsLmF0dHJUd2Vlbj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGUodSkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh1LHIobikpfX1mdW5jdGlvbiByKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsKSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsLHIobikpfX12YXIgdT1Cby5ucy5xdWFsaWZ5KG4pO3JldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIrbix1LmxvY2FsP3I6ZSl9LFRsLnN0eWxlPWZ1bmN0aW9uKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10P3I6KHQrPSIiLGZ1bmN0aW9uKCl7dmFyIHIsdT1Rby5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtyZXR1cm4gdSE9PXQmJihyPWR1KHUsdCksZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIodCksZSl9KX0pfXZhciBpPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5pKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+aSYmKHQ9IiIpO2ZvcihlIGluIG4pdGhpcy5zdHlsZShlLG5bZV0sdCk7cmV0dXJuIHRoaXN9ZT0iIn1yZXR1cm4gam8odGhpcywic3R5bGUuIituLHQsdSl9LFRsLnN0eWxlVHdlZW49ZnVuY3Rpb24obix0LGUpe2Z1bmN0aW9uIHIocix1KXt2YXIgaT10LmNhbGwodGhpcyxyLHUsUW8uZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobikpO3JldHVybiBpJiZmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4saSh0KSxlKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrbixyKX0sVGwudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gam8odGhpcywidGV4dCIsbixGbyl9LFRsLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciBuO3RoaXMuX190cmFuc2l0aW9uX18uY291bnQ8MiYmKG49dGhpcy5wYXJlbnROb2RlKSYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pfSxUbC5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKS5fX3RyYW5zaXRpb25fX1t0XS5lYXNlOigiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49Qm8uZWFzZS5hcHBseShCbyxhcmd1bWVudHMpKSxGKHRoaXMsZnVuY3Rpb24oZSl7ZS5fX3RyYW5zaXRpb25fX1t0XS5lYXNlPW59KSl9LFRsLmRlbGF5PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKS5fX3RyYW5zaXRpb25fX1t0XS5kZWxheTpGKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oZSxyLHUpe2UuX190cmFuc2l0aW9uX19bdF0uZGVsYXk9K24uY2FsbChlLGUuX19kYXRhX18scix1KX06KG49K24sZnVuY3Rpb24oZSl7ZS5fX3RyYW5zaXRpb25fX1t0XS5kZWxheT1ufSkpfSxUbC5kdXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKCkuX190cmFuc2l0aW9uX19bdF0uZHVyYXRpb246Rih0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKGUscix1KXtlLl9fdHJhbnNpdGlvbl9fW3RdLmR1cmF0aW9uPU1hdGgubWF4KDEsbi5jYWxsKGUsZS5fX2RhdGFfXyxyLHUpKX06KG49TWF0aC5tYXgoMSxuKSxmdW5jdGlvbihlKXtlLl9fdHJhbnNpdGlvbl9fW3RdLmR1cmF0aW9uPW59KSl9LFRsLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIHI9TmwsdT1DbDtDbD1lLEYodGhpcyxmdW5jdGlvbih0LHIsdSl7Tmw9dC5fX3RyYW5zaXRpb25fX1tlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLHIsdSl9KSxObD1yLENsPXV9ZWxzZSBGKHRoaXMsZnVuY3Rpb24ocil7dmFyIHU9ci5fX3RyYW5zaXRpb25fX1tlXTsodS5ldmVudHx8KHUuZXZlbnQ9Qm8uZGlzcGF0Y2goInN0YXJ0IiwiZW5kIikpKS5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LFRsLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsdT10aGlzLmlkLGk9KytxbCxvPVtdLGE9MCxjPXRoaXMubGVuZ3RoO2M+YTthKyspe28ucHVzaChuPVtdKTtmb3IodmFyIHQ9dGhpc1thXSxsPTAscz10Lmxlbmd0aDtzPmw7bCsrKShlPXRbbF0pJiYocj1PYmplY3QuY3JlYXRlKGUuX190cmFuc2l0aW9uX19bdV0pLHIuZGVsYXkrPXIuZHVyYXRpb24sSG8oZSxsLGkscikpLG4ucHVzaChlKX1yZXR1cm4gVW8obyxpKX0sQm8uc3ZnLmF4aXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuLGw9Qm8uc2VsZWN0KHRoaXMpLHM9dGhpcy5fX2NoYXJ0X198fGUsZj10aGlzLl9fY2hhcnRfXz1lLmNvcHkoKSxoPW51bGw9PWM/Zi50aWNrcz9mLnRpY2tzLmFwcGx5KGYsYSk6Zi5kb21haW4oKTpjLGc9bnVsbD09dD9mLnRpY2tGb3JtYXQ/Zi50aWNrRm9ybWF0LmFwcGx5KGYsYSk6RXQ6dCxwPWwuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoaCxmKSx2PXAuZW50ZXIoKS5pbnNlcnQoImciLCIuZG9tYWluIikuYXR0cigiY2xhc3MiLCJ0aWNrIikuc3R5bGUoIm9wYWNpdHkiLE5hKSxkPUJvLnRyYW5zaXRpb24ocC5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IixOYSkucmVtb3ZlKCksbT1Cby50cmFuc2l0aW9uKHAub3JkZXIoKSkuc3R5bGUoIm9wYWNpdHkiLDEpLHk9TWF0aC5tYXgodSwwKStvLHg9UGkoZiksTT1sLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoWzBdKSxfPShNLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJkb21haW4iKSxCby50cmFuc2l0aW9uKE0pKTt2LmFwcGVuZCgibGluZSIpLHYuYXBwZW5kKCJ0ZXh0Iik7dmFyIGIsdyxTLGssRT12LnNlbGVjdCgibGluZSIpLEE9bS5zZWxlY3QoImxpbmUiKSxDPXAuc2VsZWN0KCJ0ZXh0IikudGV4dChnKSxOPXYuc2VsZWN0KCJ0ZXh0Iiksej1tLnNlbGVjdCgidGV4dCIpLEw9InRvcCI9PT1yfHwibGVmdCI9PT1yPy0xOjE7aWYoImJvdHRvbSI9PT1yfHwidG9wIj09PXI/KG49T28sYj0ieCIsUz0ieSIsdz0ieDIiLGs9InkyIixDLmF0dHIoImR5IiwwPkw/IjBlbSI6Ii43MWVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksXy5hdHRyKCJkIiwiTSIreFswXSsiLCIrTCppKyJWMEgiK3hbMV0rIlYiK0wqaSkpOihuPVlvLGI9InkiLFM9IngiLHc9InkyIixrPSJ4MiIsQy5hdHRyKCJkeSIsIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwwPkw/ImVuZCI6InN0YXJ0IiksXy5hdHRyKCJkIiwiTSIrTCppKyIsIit4WzBdKyJIMFYiK3hbMV0rIkgiK0wqaSkpLEUuYXR0cihrLEwqdSksTi5hdHRyKFMsTCp5KSxBLmF0dHIodywwKS5hdHRyKGssTCp1KSx6LmF0dHIoYiwwKS5hdHRyKFMsTCp5KSxmLnJhbmdlQmFuZCl7dmFyIFQ9ZixxPVQucmFuZ2VCYW5kKCkvMjtzPWY9ZnVuY3Rpb24obil7cmV0dXJuIFQobikrcX19ZWxzZSBzLnJhbmdlQmFuZD9zPWY6ZC5jYWxsKG4sZixzKTt2LmNhbGwobixzLGYpLG0uY2FsbChuLGYsZil9KX12YXIgdCxlPUJvLnNjYWxlLmxpbmVhcigpLHI9UmwsdT02LGk9NixvPTMsYT1bMTBdLGM9bnVsbDtyZXR1cm4gbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ub3JpZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQgaW4gRGw/dCsiIjpSbCxuKTpyfSxuLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9YXJndW1lbnRzLG4pOmF9LG4udGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10LG4pOmN9LG4udGlja0Zvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4udGlja1NpemU9ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gZT8odT0rdCxpPSthcmd1bWVudHNbZS0xXSxuKTp1fSxuLmlubmVyVGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3Qsbik6dX0sbi5vdXRlclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOml9LG4udGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3Qsbik6b30sbi50aWNrU3ViZGl2aWRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgmJm59LG59O3ZhciBSbD0iYm90dG9tIixEbD17dG9wOjEscmlnaHQ6MSxib3R0b206MSxsZWZ0OjF9O0JvLnN2Zy5icnVzaD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oaSl7aS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9Qm8uc2VsZWN0KHRoaXMpLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIikub24oIm1vdXNlZG93bi5icnVzaCIsdSkub24oInRvdWNoc3RhcnQuYnJ1c2giLHUpLG89aS5zZWxlY3RBbGwoIi5iYWNrZ3JvdW5kIikuZGF0YShbMF0pO28uZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImJhY2tncm91bmQiKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLnN0eWxlKCJjdXJzb3IiLCJjcm9zc2hhaXIiKSxpLnNlbGVjdEFsbCgiLmV4dGVudCIpLmRhdGEoWzBdKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiZXh0ZW50Iikuc3R5bGUoImN1cnNvciIsIm1vdmUiKTt2YXIgYT1pLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmRhdGEocCxFdCk7YS5leGl0KCkucmVtb3ZlKCksYS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmdW5jdGlvbihuKXtyZXR1cm4icmVzaXplICIrbn0pLnN0eWxlKCJjdXJzb3IiLGZ1bmN0aW9uKG4pe3JldHVybiBQbFtuXX0pLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLGZ1bmN0aW9uKG4pe3JldHVybi9bZXddJC8udGVzdChuKT8tMzpudWxsfSkuYXR0cigieSIsZnVuY3Rpb24obil7cmV0dXJuL15bbnNdLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ3aWR0aCIsNikuYXR0cigiaGVpZ2h0Iiw2KS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLGEuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCk7dmFyIHMsZj1Cby50cmFuc2l0aW9uKGkpLGg9Qm8udHJhbnNpdGlvbihvKTtjJiYocz1QaShjKSxoLmF0dHIoIngiLHNbMF0pLmF0dHIoIndpZHRoIixzWzFdLXNbMF0pLGUoZikpLGwmJihzPVBpKGwpLGguYXR0cigieSIsc1swXSkuYXR0cigiaGVpZ2h0IixzWzFdLXNbMF0pLHIoZikpLHQoZil9KX1mdW5jdGlvbiB0KG4pe24uc2VsZWN0QWxsKCIucmVzaXplIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXtyZXR1cm4idHJhbnNsYXRlKCIrc1srL2UkLy50ZXN0KG4pXSsiLCIrZlsrL15zLy50ZXN0KG4pXSsiKSJ9KX1mdW5jdGlvbiBlKG4pe24uc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieCIsc1swXSksbi5zZWxlY3RBbGwoIi5leHRlbnQsLm4+cmVjdCwucz5yZWN0IikuYXR0cigid2lkdGgiLHNbMV0tc1swXSl9ZnVuY3Rpb24gcihuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoInkiLGZbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5lPnJlY3QsLnc+cmVjdCIpLmF0dHIoImhlaWdodCIsZlsxXS1mWzBdKX1mdW5jdGlvbiB1KCl7ZnVuY3Rpb24gdSgpezMyPT1Cby5ldmVudC5rZXlDb2RlJiYoQ3x8KHk9bnVsbCx6WzBdLT1zWzFdLHpbMV0tPWZbMV0sQz0yKSxfKCkpfWZ1bmN0aW9uIHAoKXszMj09Qm8uZXZlbnQua2V5Q29kZSYmMj09QyYmKHpbMF0rPXNbMV0selsxXSs9ZlsxXSxDPTAsXygpKX1mdW5jdGlvbiB2KCl7dmFyIG49Qm8ubW91c2UoTSksdT0hMTt4JiYoblswXSs9eFswXSxuWzFdKz14WzFdKSxDfHwoQm8uZXZlbnQuYWx0S2V5Pyh5fHwoeT1bKHNbMF0rc1sxXSkvMiwoZlswXStmWzFdKS8yXSkselswXT1zWysoblswXTx5WzBdKV0selsxXT1mWysoblsxXTx5WzFdKV0pOnk9bnVsbCksRSYmZChuLGMsMCkmJihlKFMpLHU9ITApLEEmJmQobixsLDEpJiYocihTKSx1PSEwKSx1JiYodChTKSx3KHt0eXBlOiJicnVzaCIsbW9kZTpDPyJtb3ZlIjoicmVzaXplIn0pKX1mdW5jdGlvbiBkKG4sdCxlKXt2YXIgcix1LGE9UGkodCksYz1hWzBdLGw9YVsxXSxwPXpbZV0sdj1lP2Y6cyxkPXZbMV0tdlswXTtyZXR1cm4gQyYmKGMtPXAsbC09ZCtwKSxyPShlP2c6aCk/TWF0aC5tYXgoYyxNYXRoLm1pbihsLG5bZV0pKTpuW2VdLEM/dT0ocis9cCkrZDooeSYmKHA9TWF0aC5tYXgoYyxNYXRoLm1pbihsLDIqeVtlXS1yKSkpLHI+cD8odT1yLHI9cCk6dT1wKSx2WzBdIT1yfHx2WzFdIT11PyhlP289bnVsbDppPW51bGwsdlswXT1yLHZbMV09dSwhMCk6dm9pZCAwfWZ1bmN0aW9uIG0oKXt2KCksUy5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbi5lbXB0eSgpPyJub25lIjpudWxsKSxCby5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIixudWxsKSxMLm9uKCJtb3VzZW1vdmUuYnJ1c2giLG51bGwpLm9uKCJtb3VzZXVwLmJydXNoIixudWxsKS5vbigidG91Y2htb3ZlLmJydXNoIixudWxsKS5vbigidG91Y2hlbmQuYnJ1c2giLG51bGwpLm9uKCJrZXlkb3duLmJydXNoIixudWxsKS5vbigia2V5dXAuYnJ1c2giLG51bGwpLE4oKSx3KHt0eXBlOiJicnVzaGVuZCJ9KX12YXIgeSx4LE09dGhpcyxiPUJvLnNlbGVjdChCby5ldmVudC50YXJnZXQpLHc9YS5vZihNLGFyZ3VtZW50cyksUz1Cby5zZWxlY3QoTSksaz1iLmRhdHVtKCksRT0hL14obnxzKSQvLnRlc3QoaykmJmMsQT0hL14oZXx3KSQvLnRlc3QoaykmJmwsQz1iLmNsYXNzZWQoImV4dGVudCIpLE49WCgpLHo9Qm8ubW91c2UoTSksTD1Cby5zZWxlY3QoUW8pLm9uKCJrZXlkb3duLmJydXNoIix1KS5vbigia2V5dXAuYnJ1c2giLHApO2lmKEJvLmV2ZW50LmNoYW5nZWRUb3VjaGVzP0wub24oInRvdWNobW92ZS5icnVzaCIsdikub24oInRvdWNoZW5kLmJydXNoIixtKTpMLm9uKCJtb3VzZW1vdmUuYnJ1c2giLHYpLm9uKCJtb3VzZXVwLmJydXNoIixtKSxTLmludGVycnVwdCgpLnNlbGVjdEFsbCgiKiIpLmludGVycnVwdCgpLEMpelswXT1zWzBdLXpbMF0selsxXT1mWzBdLXpbMV07ZWxzZSBpZihrKXt2YXIgVD0rL3ckLy50ZXN0KGspLHE9Ky9ebi8udGVzdChrKTt4PVtzWzEtVF0telswXSxmWzEtcV0telsxXV0selswXT1zW1RdLHpbMV09ZltxXX1lbHNlIEJvLmV2ZW50LmFsdEtleSYmKHk9ei5zbGljZSgpKTtTLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCksQm8uc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsYi5zdHlsZSgiY3Vyc29yIikpLHcoe3R5cGU6ImJydXNoc3RhcnQifSksdigpfXZhciBpLG8sYT13KG4sImJydXNoc3RhcnQiLCJicnVzaCIsImJydXNoZW5kIiksYz1udWxsLGw9bnVsbCxzPVswLDBdLGY9WzAsMF0saD0hMCxnPSEwLHA9VWxbMF07cmV0dXJuIG4uZXZlbnQ9ZnVuY3Rpb24obil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49YS5vZih0aGlzLGFyZ3VtZW50cyksdD17eDpzLHk6ZixpOmksajpvfSxlPXRoaXMuX19jaGFydF9ffHx0O3RoaXMuX19jaGFydF9fPXQsQ2w/Qm8uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC5icnVzaCIsZnVuY3Rpb24oKXtpPWUuaSxvPWUuaixzPWUueCxmPWUueSxuKHt0eXBlOiJicnVzaHN0YXJ0In0pfSkudHdlZW4oImJydXNoOmJydXNoIixmdW5jdGlvbigpe3ZhciBlPW11KHMsdC54KSxyPW11KGYsdC55KTtyZXR1cm4gaT1vPW51bGwsZnVuY3Rpb24odSl7cz10Lng9ZSh1KSxmPXQueT1yKHUpLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSl9fSkuZWFjaCgiZW5kLmJydXNoIixmdW5jdGlvbigpe2k9dC5pLG89dC5qLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksbih7dHlwZToiYnJ1c2hlbmQifSl9KToobih7dHlwZToiYnJ1c2hzdGFydCJ9KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pKX0pfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCxwPVVsWyFjPDwxfCFsXSxuKTpjfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCxwPVVsWyFjPDwxfCFsXSxuKTpsfSxuLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjJiZsPyhoPSEhdFswXSxnPSEhdFsxXSk6Yz9oPSEhdDpsJiYoZz0hIXQpLG4pOmMmJmw/W2gsZ106Yz9oOmw/ZzpudWxsfSxuLmV4dGVudD1mdW5jdGlvbih0KXt2YXIgZSxyLHUsYSxoO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjJiYoZT10WzBdLHI9dFsxXSxsJiYoZT1lWzBdLHI9clswXSksaT1bZSxyXSxjLmludmVydCYmKGU9YyhlKSxyPWMocikpLGU+ciYmKGg9ZSxlPXIscj1oKSwoZSE9c1swXXx8ciE9c1sxXSkmJihzPVtlLHJdKSksbCYmKHU9dFswXSxhPXRbMV0sYyYmKHU9dVsxXSxhPWFbMV0pLG89W3UsYV0sbC5pbnZlcnQmJih1PWwodSksYT1sKGEpKSx1PmEmJihoPXUsdT1hLGE9aCksKHUhPWZbMF18fGEhPWZbMV0pJiYoZj1bdSxhXSkpLG4pOihjJiYoaT8oZT1pWzBdLHI9aVsxXSk6KGU9c1swXSxyPXNbMV0sYy5pbnZlcnQmJihlPWMuaW52ZXJ0KGUpLHI9Yy5pbnZlcnQocikpLGU+ciYmKGg9ZSxlPXIscj1oKSkpLGwmJihvPyh1PW9bMF0sYT1vWzFdKToodT1mWzBdLGE9ZlsxXSxsLmludmVydCYmKHU9bC5pbnZlcnQodSksYT1sLmludmVydChhKSksdT5hJiYoaD11LHU9YSxhPWgpKSksYyYmbD9bW2UsdV0sW3IsYV1dOmM/W2Uscl06bCYmW3UsYV0pfSxuLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIG4uZW1wdHkoKXx8KHM9WzAsMF0sZj1bMCwwXSxpPW89bnVsbCksbn0sbi5lbXB0eT1mdW5jdGlvbigpe3JldHVybiEhYyYmc1swXT09c1sxXXx8ISFsJiZmWzBdPT1mWzFdfSxCby5yZWJpbmQobixhLCJvbiIpfTt2YXIgUGw9e246Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sVWw9W1sibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0sWyJlIiwidyJdLFsibiIsInMiXSxbXV0samw9cmMuZm9ybWF0PWxjLnRpbWVGb3JtYXQsRmw9amwudXRjLEhsPUZsKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTtqbC5pc289RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcmJituZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/SW86SGwsSW8ucGFyc2U9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IERhdGUobik7cmV0dXJuIGlzTmFOKHQpP251bGw6dH0sSW8udG9TdHJpbmc9SGwudG9TdHJpbmcscmMuc2Vjb25kPUZ0KGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgdWMoMWUzKk1hdGguZmxvb3Iobi8xZTMpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMWUzKk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTZWNvbmRzKCl9KSxyYy5zZWNvbmRzPXJjLnNlY29uZC5yYW5nZSxyYy5zZWNvbmRzLnV0Yz1yYy5zZWNvbmQudXRjLnJhbmdlLHJjLm1pbnV0ZT1GdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IHVjKDZlNCpNYXRoLmZsb29yKG4vNmU0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzZlNCpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfSkscmMubWludXRlcz1yYy5taW51dGUucmFuZ2UscmMubWludXRlcy51dGM9cmMubWludXRlLnV0Yy5yYW5nZSxyYy5ob3VyPUZ0KGZ1bmN0aW9uKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKS82MDtyZXR1cm4gbmV3IHVjKDM2ZTUqKE1hdGguZmxvb3Iobi8zNmU1LXQpK3QpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMzZlNSpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX0pLHJjLmhvdXJzPXJjLmhvdXIucmFuZ2UscmMuaG91cnMudXRjPXJjLmhvdXIudXRjLnJhbmdlLHJjLm1vbnRoPUZ0KGZ1bmN0aW9uKG4pe3JldHVybiBuPXJjLmRheShuKSxuLnNldERhdGUoMSksbn0sZnVuY3Rpb24obix0KXtuLnNldE1vbnRoKG4uZ2V0TW9udGgoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TW9udGgoKX0pLHJjLm1vbnRocz1yYy5tb250aC5yYW5nZSxyYy5tb250aHMudXRjPXJjLm1vbnRoLnV0Yy5yYW5nZTt2YXIgT2w9WzFlMyw1ZTMsMTVlMywzZTQsNmU0LDNlNSw5ZTUsMThlNSwzNmU1LDEwOGU1LDIxNmU1LDQzMmU1LDg2NGU1LDE3MjhlNSw2MDQ4ZTUsMjU5MmU2LDc3NzZlNiwzMTUzNmU2XSxZbD1bW3JjLnNlY29uZCwxXSxbcmMuc2Vjb25kLDVdLFtyYy5zZWNvbmQsMTVdLFtyYy5zZWNvbmQsMzBdLFtyYy5taW51dGUsMV0sW3JjLm1pbnV0ZSw1XSxbcmMubWludXRlLDE1XSxbcmMubWludXRlLDMwXSxbcmMuaG91ciwxXSxbcmMuaG91ciwzXSxbcmMuaG91ciw2XSxbcmMuaG91ciwxMl0sW3JjLmRheSwxXSxbcmMuZGF5LDJdLFtyYy53ZWVrLDFdLFtyYy5tb250aCwxXSxbcmMubW9udGgsM10sW3JjLnllYXIsMV1dLElsPWpsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpJiYxIT1uLmdldERhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldERhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9XSxbIiVZIixBZV1dKSxabD17cmFuZ2U6ZnVuY3Rpb24obix0LGUpe3JldHVybiBCby5yYW5nZShNYXRoLmNlaWwobi9lKSplLCt0LGUpLm1hcChWbyl9LGZsb29yOkV0LGNlaWw6RXR9O1lsLnllYXI9cmMueWVhcixyYy5zY2FsZT1mdW5jdGlvbigpe3JldHVybiBabyhCby5zY2FsZS5saW5lYXIoKSxZbCxJbCl9O3ZhciBWbD1ZbC5tYXAoZnVuY3Rpb24obil7cmV0dXJuW25bMF0udXRjLG5bMV1dfSksWGw9RmwubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDRGF5KCkmJjEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKX1dLFsiJVkiLEFlXV0pO1ZsLnllYXI9cmMueWVhci51dGMscmMuc2NhbGUudXRjPWZ1bmN0aW9uKCl7cmV0dXJuIFpvKEJvLnNjYWxlLmxpbmVhcigpLFZsLFhsKX0sQm8udGV4dD1BdChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVRleHR9KSxCby5qc29uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIEN0KG4sImFwcGxpY2F0aW9uL2pzb24iLFhvLHQpfSxCby5odG1sPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIEN0KG4sInRleHQvaHRtbCIsJG8sdCl9LEJvLnhtbD1BdChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVhNTH0pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKEJvKToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz1CbyksdGhpcy5kMz1Cb30oKTs=')
},
{
'name': '/app/lib/js/jquery.min.js', 'data': base64.b64decode(b'LyohIGpRdWVyeSB2MS4xMS4xIHwgKGMpIDIwMDUsIDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMSIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSk+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1tLnR5cGUoYSl8fGEubm9kZVR5cGV8fG0uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFqLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWouY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKGsub3duTGFzdClmb3IoYiBpbiBhKXJldHVybiBqLmNhbGwoYSxiKTtmb3IoYiBpbiBhKTtyZXR1cm4gdm9pZCAwPT09Ynx8ai5jYWxsKGEsYil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/YSsiIjoib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhP2hbaS5jYWxsKGEpXXx8Im9iamVjdCI6dHlwZW9mIGF9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmbS50cmltKGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKG8sIm1zLSIpLnJlcGxhY2UocCxxKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yi50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPTAsZj1hLmxlbmd0aCxnPXIoYSk7aWYoYyl7aWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5hcHBseShhW2VdLGMpLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgaWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWt9ZWxzZSBmb3IoZSBpbiBhKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6KGErIiIpLnJlcGxhY2UobiwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO3JldHVybiBudWxsIT1hJiYocihPYmplY3QoYSkpP20ubWVyZ2UoYywic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEpOmYuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihnKXJldHVybiBnLmNhbGwoYixhLGMpO2ZvcihkPWIubGVuZ3RoLGM9Yz8wPmM/TWF0aC5tYXgoMCxkK2MpOmM6MDtkPmM7YysrKWlmKGMgaW4gYiYmYltjXT09PWEpcmV0dXJuIGN9cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO3doaWxlKGM+ZClhW2UrK109YltkKytdO2lmKGMhPT1jKXdoaWxlKHZvaWQgMCE9PWJbZF0pYVtlKytdPWJbZCsrXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQsZT1bXSxmPTAsZz1hLmxlbmd0aCxoPSFjO2c+ZjtmKyspZD0hYihhW2ZdLGYpLGQhPT1oJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj0wLGc9YS5sZW5ndGgsaD1yKGEpLGk9W107aWYoaClmb3IoO2c+ZjtmKyspZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7ZWxzZSBmb3IoZiBpbiBhKWQ9YihhW2ZdLGYsYyksbnVsbCE9ZCYmaS5wdXNoKGQpO3JldHVybiBlLmFwcGx5KFtdLGkpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGY7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBiJiYoZj1hW2JdLGI9YSxhPWYpLG0uaXNGdW5jdGlvbihhKT8oYz1kLmNhbGwoYXJndW1lbnRzLDIpLGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShifHx0aGlzLGMuY29uY2F0KGQuY2FsbChhcmd1bWVudHMpKSl9LGUuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxtLmd1aWQrKyxlKTp2b2lkIDB9LG5vdzpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0sc3VwcG9ydDprfSksbS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aFsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiByKGEpe3ZhciBiPWEubGVuZ3RoLGM9bS50eXBlKGEpO3JldHVybiJmdW5jdGlvbiI9PT1jfHxtLmlzV2luZG93KGEpPyExOjE9PT1hLm5vZGVUeXBlJiZiPyEwOiJhcnJheSI9PT1jfHwwPT09Ynx8Im51bWJlciI9PXR5cGVvZiBiJiZiPjAmJmItMSBpbiBhfXZhciBzPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHU9InNpenpsZSIrLW5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9Z2IoKSx6PWdiKCksQT1nYigpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPSJ1bmRlZmluZWQiLEQ9MTw8MzEsRT17fS5oYXNPd25Qcm9wZXJ0eSxGPVtdLEc9Ri5wb3AsSD1GLnB1c2gsST1GLnB1c2gsSj1GLnNsaWNlLEs9Ri5pbmRleE9mfHxmdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPXRoaXMubGVuZ3RoO2M+YjtiKyspaWYodGhpc1tiXT09PWEpcmV0dXJuIGI7cmV0dXJuLTF9LEw9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixOPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTz1OLnJlcGxhY2UoInciLCJ3IyIpLFA9IlxcWyIrTSsiKigiK04rIikoPzoiK00rIiooWypeJHwhfl0/PSkiK00rIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitPKyIpKXwpIitNKyIqXFxdIixRPSI6KCIrTisiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrUCsiKSopfC4qKVxcKXwpIixSPW5ldyBSZWdFeHAoIl4iK00rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTSsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitNKyIqLCIrTSsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTSsiKihbPit+XXwiK00rIikiK00rIioiKSxVPW5ldyBSZWdFeHAoIj0iK00rIiooW15cXF0nXCJdKj8pIitNKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChRKSxXPW5ldyBSZWdFeHAoIl4iK08rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK04rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTisiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTi5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrUCksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1EpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0wrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYj0vWyt+XS8sYmI9Lyd8XFwvZyxjYj1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK00rIj98KCIrTSsiKXwuKSIsImlnIiksZGI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9O3RyeXtJLmFwcGx5KEY9Si5jYWxsKHYuY2hpbGROb2Rlcyksdi5jaGlsZE5vZGVzKSxGW3YuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGViKXtJPXthcHBseTpGLmxlbmd0aD9mdW5jdGlvbihhLGIpe0guYXBwbHkoYSxKLmNhbGwoYikpfTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGQ9MDt3aGlsZShhW2MrK109YltkKytdKTthLmxlbmd0aD1jLTF9fX1mdW5jdGlvbiBmYihhLGIsZCxlKXt2YXIgZixoLGosayxsLG8scixzLHcseDtpZigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dikhPT1uJiZtKGIpLGI9Ynx8bixkPWR8fFtdLCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGQ7aWYoMSE9PShrPWIubm9kZVR5cGUpJiY5IT09aylyZXR1cm5bXTtpZihwJiYhZSl7aWYoZj1fLmV4ZWMoYSkpaWYoaj1mWzFdKXtpZig5PT09ayl7aWYoaD1iLmdldEVsZW1lbnRCeUlkKGopLCFofHwhaC5wYXJlbnROb2RlKXJldHVybiBkO2lmKGguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGg9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGopKSYmdChiLGgpJiZoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBJLmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaj1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEkuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTk9PT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYiwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3FiKG9bbF0pO3c9YWIudGVzdChhKSYmb2IoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBJLmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGdiKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBoYihhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGliKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24gamIoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24ga2IoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEQpLSh+YS5zb3VyY2VJbmRleHx8RCk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIGxiKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG1iKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBuYihhKXtyZXR1cm4gaGIoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaGIoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBvYihhKXtyZXR1cm4gYSYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1DJiZhfWM9ZmIuc3VwcG9ydD17fSxmPWZiLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWZiLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGU9YT9hLm93bmVyRG9jdW1lbnR8fGE6dixnPWUuZGVmYXVsdFZpZXc7cmV0dXJuIGUhPT1uJiY5PT09ZS5ub2RlVHlwZSYmZS5kb2N1bWVudEVsZW1lbnQ/KG49ZSxvPWUuZG9jdW1lbnRFbGVtZW50LHA9IWYoZSksZyYmZyE9PWcudG9wJiYoZy5hZGRFdmVudExpc3RlbmVyP2cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe20oKX0sITEpOmcuYXR0YWNoRXZlbnQmJmcuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe20oKX0pKSxjLmF0dHJpYnV0ZXM9aWIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1pYihmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSYmaWIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiIsYS5maXJzdENoaWxkLmNsYXNzTmFtZT0iaSIsMj09PWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaSIpLmxlbmd0aH0pLGMuZ2V0QnlJZD1pYihmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFlLmdldEVsZW1lbnRzQnlOYW1lfHwhZS5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT09QyYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYyYmYy5wYXJlbnROb2RlP1tjXTpbXX19LGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYixkYik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9fSk6KGRlbGV0ZSBkLmZpbmQuSUQsZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNiLGRiKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9PUMmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSksZC5maW5kLlRBRz1jLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGEsYil7cmV0dXJuIHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Qz9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOnZvaWQgMH06ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9MCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoIioiPT09YSl7d2hpbGUoYz1mW2UrK10pMT09PWMubm9kZVR5cGUmJmQucHVzaChjKTtyZXR1cm4gZH1yZXR1cm4gZn0sZC5maW5kLkNMQVNTPWMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oYSxiKXtyZXR1cm4gdHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PUMmJnA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZS5xdWVyeVNlbGVjdG9yQWxsKSkmJihpYihmdW5jdGlvbihhKXthLmlubmVySFRNTD0iPHNlbGVjdCBtc2FsbG93Y2xpcD0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NsaXBePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK0wrIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIil9KSxpYihmdW5jdGlvbihhKXt2YXIgYj1lLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Yi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxhLmFwcGVuZENoaWxkKGIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoJiZxLnB1c2goIm5hbWUiK00rIipbKl4kfCF+XT89IiksYS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aHx8cS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGEucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLHEucHVzaCgiLC4qOiIpfSkpLChjLm1hdGNoZXNTZWxlY3Rvcj0kLnRlc3Qocz1vLm1hdGNoZXN8fG8ud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxvLm1vek1hdGNoZXNTZWxlY3Rvcnx8by5vTWF0Y2hlc1NlbGVjdG9yfHxvLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmliKGZ1bmN0aW9uKGEpe2MuZGlzY29ubmVjdGVkTWF0Y2g9cy5jYWxsKGEsImRpdiIpLHMuY2FsbChhLCJbcyE9JyddOngiKSxyLnB1c2goIiE9IixRKX0pLHE9cS5sZW5ndGgmJm5ldyBSZWdFeHAocS5qb2luKCJ8IikpLHI9ci5sZW5ndGgmJm5ldyBSZWdFeHAoci5qb2luKCJ8IikpLGI9JC50ZXN0KG8uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHQ9Ynx8JC50ZXN0KG8uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGM9OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YSxkPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWR8fCEoIWR8fDEhPT1kLm5vZGVUeXBlfHwhKGMuY29udGFpbnM/Yy5jb250YWlucyhkKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQpKSl9OmZ1bmN0aW9uKGEsYil7aWYoYil3aGlsZShiPWIucGFyZW50Tm9kZSlpZihiPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sQj1iP2Z1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgZD0hYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gZD9kOihkPShhLm93bmVyRG9jdW1lbnR8fGEpPT09KGIub3duZXJEb2N1bWVudHx8Yik/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKToxLDEmZHx8IWMuc29ydERldGFjaGVkJiZiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpPT09ZD9hPT09ZXx8YS5vd25lckRvY3VtZW50PT09diYmdCh2LGEpPy0xOmI9PT1lfHxiLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYik/MTprP0suY2FsbChrLGEpLUsuY2FsbChrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGY9YS5wYXJlbnROb2RlLGc9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFmfHwhZylyZXR1cm4gYT09PWU/LTE6Yj09PWU/MTpmPy0xOmc/MTprP0suY2FsbChrLGEpLUsuY2FsbChrLGIpOjA7aWYoZj09PWcpcmV0dXJuIGtiKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaS51bnNoaWZ0KGMpO3doaWxlKGhbZF09PT1pW2RdKWQrKztyZXR1cm4gZD9rYihoW2RdLGlbZF0pOmhbZF09PT12Py0xOmlbZF09PT12PzE6MH0sZSk6bn0sZmIubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBmYihhLG51bGwsbnVsbCxiKX0sZmIubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFUsIj0nJDEnXSIpLCEoIWMubWF0Y2hlc1NlbGVjdG9yfHwhcHx8ciYmci50ZXN0KGIpfHxxJiZxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBmYihiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxmYi5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGZiLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZFLmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxmYi5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGZiLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1mYi5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9ZmIuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aGIsbWF0Y2g6WCxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKGNiLGRiKSxhWzNdPShhWzNdfHxhWzRdfHxhWzVdfHwiIikucmVwbGFjZShjYixkYiksIn49Ij09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGZiLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKCJldmVuIj09PWFbM118fCJvZGQiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fCJvZGQiPT09YVszXSkpOmFbM10mJmZiLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBYLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fCIiOmMmJlYudGVzdChjKSYmKGI9ZyhjLCEwKSkmJihiPWMuaW5kZXhPZigiKSIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2IsZGIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK00rIikiK2ErIigiK00rInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fHR5cGVvZiBhLmdldEF0dHJpYnV0ZSE9PUMmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWZiLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjpiPyhlKz0iIiwiPSI9PT1iP2U9PT1jOiIhPSI9PT1iP2UhPT1jOiJePSI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6Iio9Ij09PWI/YyYmZS5pbmRleE9mKGMpPi0xOiIkPSI9PT1iP2MmJmUuc2xpY2UoLWMubGVuZ3RoKT09PWM6In49Ij09PWI/KCIgIitlKyIgIikuaW5kZXhPZihjKT4tMToifD0iPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YysiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0ibnRoIiE9PWEuc2xpY2UoMCwzKSxnPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGg9Im9mLXR5cGUiPT09YjtyZXR1cm4gMT09PWQmJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnROb2RlfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG0sbixvLHA9ZiE9PWc/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaDtpZihxKXtpZihmKXt3aGlsZShwKXtsPWI7d2hpbGUobD1sW3BdKWlmKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe2s9cVt1XXx8KHFbdV09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSxtPWpbMF09PT13JiZqWzJdLGw9biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKDE9PT1sLm5vZGVUeXBlJiYrK20mJmw9PT1iKXtrW2FdPVt3LG4sbV07YnJlYWt9fWVsc2UgaWYocyYmKGo9KGJbdV18fChiW3VdPXt9KSlbYV0pJiZqWzBdPT09dyltPWpbMV07ZWxzZSB3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKSYmKyttJiYocyYmKChsW3VdfHwobFt1XT17fSkpW2FdPVt3LG1dKSxsPT09YikpYnJlYWs7cmV0dXJuIG0tPWUsbT09PWR8fG0lZD09PTAmJm0vZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGZiLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aGIoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUsuY2FsbChhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDpoYihmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aGIoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksIWMucG9wKCl9fSksaGFzOmhiKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZmIoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczpoYihmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aGIoZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhfHwiIil8fGZiLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGNiLGRiKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWi50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpuYihmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6bmIoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm5iKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46bmIoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6bmIoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpuYihmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om5iKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1sYihiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1tYihiKTtmdW5jdGlvbiBwYigpe31wYi5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHBiLGc9ZmIudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1TLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9VC5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShSLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9WFtnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2ZiLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcWIoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiByYihhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaT1iW3VdfHwoYlt1XT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4galsyXT1oWzJdO2lmKGlbZF09aixqWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gc2IoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdGIoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylmYihhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdWIoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKCFjfHxjKGYsZCxlKSkmJihnLnB1c2goZiksaiYmYi5wdXNoKGgpKTtyZXR1cm4gZ31mdW5jdGlvbiB2YihhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD12YihkKSksZSYmIWVbdV0mJihlPXZiKGUsZikpLGhiKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHRiKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnViKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj11YihyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/Sy5jYWxsKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj11YihyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SS5hcHBseShnLHIpfSl9ZnVuY3Rpb24gd2IoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1yYihmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9cmIoZnVuY3Rpb24oYSl7cmV0dXJuIEsuY2FsbChiLGEpPi0xfSxoLCEwKSxtPVtmdW5jdGlvbihhLGMsZCl7cmV0dXJuIWcmJihkfHxjIT09ail8fCgoYj1jKS5ub2RlVHlwZT9rKGEsYyxkKTpsKGEsYyxkKSl9XTtmPmk7aSsrKWlmKGM9ZC5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W3JiKHNiKG0pLGMpXTtlbHNle2lmKGM9ZC5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyksY1t1XSl7Zm9yKGU9KytpO2Y+ZTtlKyspaWYoZC5yZWxhdGl2ZVthW2VdLnR5cGVdKWJyZWFrO3JldHVybiB2YihpPjEmJnNiKG0pLGk+MSYmcWIoYS5zbGljZSgwLGktMSkuY29uY2F0KHt2YWx1ZToiICI9PT1hW2ktMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShSLCIkMSIpLGMsZT5pJiZ3YihhLnNsaWNlKGksZSkpLGY+ZSYmd2IoYT1hLnNsaWNlKGUpKSxmPmUmJnFiKGEpKX1tLnB1c2goYyl9cmV0dXJuIHNiKG0pfWZ1bmN0aW9uIHhiKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG0sbyxwPTAscT0iMCIscj1mJiZbXSxzPVtdLHQ9aix1PWZ8fGUmJmQuZmluZC5UQUcoIioiLGspLHY9dys9bnVsbD09dD8xOk1hdGgucmFuZG9tKCl8fC4xLHg9dS5sZW5ndGg7Zm9yKGsmJihqPWchPT1uJiZnKTtxIT09eCYmbnVsbCE9KGw9dVtxXSk7cSsrKXtpZihlJiZsKXttPTA7d2hpbGUobz1hW20rK10paWYobyhsLGcsaCkpe2kucHVzaChsKTticmVha31rJiYodz12KX1jJiYoKGw9IW8mJmwpJiZwLS0sZiYmci5wdXNoKGwpKX1pZihwKz1xLGMmJnEhPT1wKXttPTA7d2hpbGUobz1iW20rK10pbyhyLHMsZyxoKTtpZihmKXtpZihwPjApd2hpbGUocS0tKXJbcV18fHNbcV18fChzW3FdPUcuY2FsbChpKSk7cz11YihzKX1JLmFwcGx5KGkscyksayYmIWYmJnMubGVuZ3RoPjAmJnArYi5sZW5ndGg+MSYmZmIudW5pcXVlU29ydChpKX1yZXR1cm4gayYmKHc9dixqPXQpLHJ9O3JldHVybiBjP2hiKGYpOmZ9cmV0dXJuIGg9ZmIuY29tcGlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1bXSxmPUFbYSsiICJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXdiKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx4YihlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9ZmIuc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj0iZnVuY3Rpb24iPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJiJJRCI9PT0oaz1qWzBdKS50eXBlJiZjLmdldEJ5SWQmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2pbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChrLm1hdGNoZXNbMF0ucmVwbGFjZShjYixkYiksYil8fFtdKVswXSwhYilyZXR1cm4gZTtuJiYoYj1iLnBhcmVudE5vZGUpLGE9YS5zbGljZShqLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPVgubmVlZHNDb250ZXh0LnRlc3QoYSk/MDpqLmxlbmd0aDt3aGlsZShpLS0pe2lmKGs9altpXSxkLnJlbGF0aXZlW2w9ay50eXBlXSlicmVhaztpZigobT1kLmZpbmRbbF0pJiYoZj1tKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNiLGRiKSxhYi50ZXN0KGpbMF0udHlwZSkmJm9iKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZxYihqKSwhYSlyZXR1cm4gSS5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSxhYi50ZXN0KGEpJiZvYihiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9aWIoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGliKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGpiKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmliKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGpiKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGliKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxqYihMLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxmYn0oYSk7bS5maW5kPXMsbS5leHByPXMuc2VsZWN0b3JzLG0uZXhwclsiOiJdPW0uZXhwci5wc2V1ZG9zLG0udW5pcXVlPXMudW5pcXVlU29ydCxtLnRleHQ9cy5nZXRUZXh0LG0uaXNYTUxEb2M9cy5pc1hNTCxtLmNvbnRhaW5zPXMuY29udGFpbnM7dmFyIHQ9bS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx1PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdj0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHcoYSxiLGMpe2lmKG0uaXNGdW5jdGlvbihiKSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYodi50ZXN0KGIpKXJldHVybiBtLmZpbHRlcihiLGEsYyk7Yj1tLmZpbHRlcihiLGEpfXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbS5pbkFycmF5KGEsYik+PTAhPT1jfSl9bS5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bS5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTptLmZpbmQubWF0Y2hlcyhhLG0uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbS5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG0oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG0uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbS5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bS51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXcodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnQudGVzdChhKT9tKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHgseT1hLmRvY3VtZW50LHo9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxBPW0uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWEuY2hhckF0KDApJiYiPiI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTp6LmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eCkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2YgbT9iWzBdOmIsbS5tZXJnZSh0aGlzLG0ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6eSwhMCkpLHUudGVzdChjWzFdKSYmbS5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbS5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9aWYoZD15LmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSl7aWYoZC5pZCE9PWNbMl0pcmV0dXJuIHguZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZH1yZXR1cm4gdGhpcy5jb250ZXh0PXksdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTptLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB4LnJlYWR5P3gucmVhZHkoYSk6YShtKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxtLm1ha2VBcnJheShhLHRoaXMpKX07QS5wcm90b3R5cGU9bS5mbix4PW0oeSk7dmFyIEI9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sQz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTttLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWFbYl07d2hpbGUoZSYmOSE9PWUubm9kZVR5cGUmJih2b2lkIDA9PT1jfHwxIT09ZS5ub2RlVHlwZXx8IW0oZSkuaXMoYykpKTE9PT1lLm5vZGVUeXBlJiZkLnB1c2goZSksZT1lW2JdO3JldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG0uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1tKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobS5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXQudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP20oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm0uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9tLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP20uaW5BcnJheSh0aGlzWzBdLG0oYSkpOm0uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS51bmlxdWUobS5tZXJnZSh0aGlzLmdldCgpLG0oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRChhLGIpe2RvIGE9YVtiXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBtLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDptLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1tLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW0uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihDW2FdfHwoZT1tLnVuaXF1ZShlKSksQi50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBFPS9cUysvZyxGPXt9O2Z1bmN0aW9uIEcoYSl7dmFyIGI9RlthXT17fTtyZXR1cm4gbS5lYWNoKGEubWF0Y2goRSl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bS5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/RlthXXx8RyhhKTptLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGM9YS5tZW1vcnkmJmwsZD0hMCxmPWd8fDAsZz0wLGU9aC5sZW5ndGgsYj0hMDtoJiZlPmY7ZisrKWlmKGhbZl0uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtjPSExO2JyZWFrfWI9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpjP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgZD1oLmxlbmd0aDshZnVuY3Rpb24gZihiKXttLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW0udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZmKGMpfSl9KGFyZ3VtZW50cyksYj9lPWgubGVuZ3RoOmMmJihnPWQsaihjKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZtLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYyl7dmFyIGQ7d2hpbGUoKGQ9bS5pbkFycmF5KGMsaCxkKSk+LTEpaC5zcGxpY2UoZCwxKSxiJiYoZT49ZCYmZS0tLGY+PWQmJmYtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bS5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxlPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yz12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxjfHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4haHx8ZCYmIWl8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sYj9pLnB1c2goYyk6aihjKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBrfSxtLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbS5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBtLkRlZmVycmVkKGZ1bmN0aW9uKGMpe20uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bS5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZtLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP20uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbS5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bS5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZtLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEg7bS5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbS5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxtLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9tLnJlYWR5V2FpdCsrOm0ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITA/IS0tbS5yZWFkeVdhaXQ6IW0uaXNSZWFkeSl7aWYoIXkuYm9keSlyZXR1cm4gc2V0VGltZW91dChtLnJlYWR5KTttLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW0ucmVhZHlXYWl0PjB8fChILnJlc29sdmVXaXRoKHksW21dKSxtLmZuLnRyaWdnZXJIYW5kbGVyJiYobSh5KS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxtKHkpLm9mZigicmVhZHkiKSkpfX19KTtmdW5jdGlvbiBJKCl7eS5hZGRFdmVudExpc3RlbmVyPyh5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSkpOih5LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSikpfWZ1bmN0aW9uIEooKXsoeS5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1ldmVudC50eXBlfHwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKSYmKEkoKSxtLnJlYWR5KCkpfW0ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighSClpZihIPW0uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKXNldFRpbWVvdXQobS5yZWFkeSk7ZWxzZSBpZih5LmFkZEV2ZW50TGlzdGVuZXIpeS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixKLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEosITEpO2Vsc2V7eS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixKKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEopO3ZhciBjPSExO3RyeXtjPW51bGw9PWEuZnJhbWVFbGVtZW50JiZ5LmRvY3VtZW50RWxlbWVudH1jYXRjaChkKXt9YyYmYy5kb1Njcm9sbCYmIWZ1bmN0aW9uIGUoKXtpZighbS5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGUsNTApfUkoKSxtLnJlYWR5KCl9fSgpfXJldHVybiBILnByb21pc2UoYil9O3ZhciBLPSJ1bmRlZmluZWQiLEw7Zm9yKEwgaW4gbShrKSlicmVhaztrLm93bkxhc3Q9IjAiIT09TCxrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbShmdW5jdGlvbigpe3ZhciBhLGIsYyxkO2M9eS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGMmJmMuc3R5bGUmJihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6aW5saW5lO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD1hPTM9PT1iLm9mZnNldFdpZHRoLGEmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoZCkpfSksZnVuY3Rpb24oKXt2YXIgYT15LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG51bGw9PWsuZGVsZXRlRXhwYW5kbyl7ay5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2suZGVsZXRlRXhwYW5kbz0hMX19YT1udWxsfSgpLG0uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXt2YXIgYj1tLm5vRGF0YVsoYS5ub2RlTmFtZSsiICIpLnRvTG93ZXJDYXNlKCldLGM9K2Eubm9kZVR5cGV8fDE7cmV0dXJuIDEhPT1jJiY5IT09Yz8hMTohYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn07dmFyIE09L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxOPS8oW0EtWl0pL2c7ZnVuY3Rpb24gTyhhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE4sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpNLnRlc3QoYyk/bS5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bS5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwfXJldHVybiBjfWZ1bmN0aW9uIFAoYSl7dmFyIGI7Zm9yKGIgaW4gYSlpZigoImRhdGEiIT09Ynx8IW0uaXNFbXB0eU9iamVjdChhW2JdKSkmJiJ0b0pTT04iIT09YilyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBRKGEsYixkLGUpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGYsZyxoPW0uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP20uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoOwppZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWIoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYigpe3JldHVybiExfWZ1bmN0aW9uIGNiKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2IoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYigpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWI6YmIpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJiLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJiLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJiLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFiLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWIsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWIsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmI7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRiKGEpe3ZhciBiPWViLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYj0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmI9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYj1uZXcgUmVnRXhwKCI8KD86IitlYisiKVtcXHMvPl0iLCJpIiksaGI9L15ccysvLGliPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamI9LzwoW1x3Ol0rKS8sa2I9Lzx0Ym9keS9pLGxiPS88fCYjP1x3KzsvLG1iPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmI9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2I9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBiPS9edHJ1ZVwvKC4qKS8scWI9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJiPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2I9ZGIoeSksdGI9c2IuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmIub3B0Z3JvdXA9cmIub3B0aW9uLHJiLnRib2R5PXJiLnRmb290PXJiLmNvbGdyb3VwPXJiLmNhcHRpb249cmIudGhlYWQscmIudGg9cmIudGQ7ZnVuY3Rpb24gdWIoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWIoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZiKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdiKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YihhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWIoYSl7dmFyIGI9cGIuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YihhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYihhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYihhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGIoYikudGV4dD1hLnRleHQseWIoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYi50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRiLmlubmVySFRNTD1hLm91dGVySFRNTCx0Yi5yZW1vdmVDaGlsZChmPXRiLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YihmKSxoPXViKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmIoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWIoYSksZD1kfHx1YihmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFiKGUsZFtnXSk7ZWxzZSBBYihhLGYpO3JldHVybiBkPXViKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnpiKGQsIWkmJnViKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYihiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYi50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamIuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJiW2ldfHxyYi5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYiwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhiLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhiLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2IudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYi50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHViKHAsImlucHV0IiksdmIpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXViKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnpiKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2IudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13Yih0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdiKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWIoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6Yih1YihjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHViKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmIsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWIudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2IudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhiLnRlc3QoYSl8fHJiWyhqYi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGliLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YihiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWIodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5iLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YihpLCJzY3JpcHQiKSx4YiksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWIoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWIpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYi50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWIsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENiLERiPXt9O2Z1bmN0aW9uIEViKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYihhKXt2YXIgYj15LGM9RGJbYV07cmV0dXJuIGN8fChjPUViKGEsYiksIm5vbmUiIT09YyYmY3x8KENiPShDYnx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2JbMF0uY29udGVudFdpbmRvd3x8Q2JbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWIoYSxiKSxDYi5kZXRhY2goKSksRGJbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYj0vXm1hcmdpbi8sSGI9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYixKYixLYj0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYSxudWxsKX0sSmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxJYihhKSxnPWM/Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdOnZvaWQgMCxjJiYoIiIhPT1nfHxtLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bS5zdHlsZShhLGIpKSxIYi50ZXN0KGcpJiZHYi50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDA9PT1nP2c6ZysiIn0pOnkuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKEliPWZ1bmN0aW9uKGEpe3JldHVybiBhLmN1cnJlbnRTdHlsZX0sSmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxJYihhKSxnPWM/Y1tiXTp2b2lkIDAsbnVsbD09ZyYmaCYmaFtiXSYmKGc9aFtiXSksSGIudGVzdChnKSYmIUtiLnRlc3QoYikmJihkPWgubGVmdCxlPWEucnVudGltZVN0eWxlLGY9ZSYmZS5sZWZ0LGYmJihlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksaC5sZWZ0PSJmb250U2l6ZSI9PT1iPyIxZW0iOmcsZz1oLnBpeGVsTGVmdCsicHgiLGgubGVmdD1kLGYmJihlLmxlZnQ9ZikpLHZvaWQgMD09PWc/ZzpnKyIifHwiYXV0byJ9KTtmdW5jdGlvbiBMYihhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXt2YXIgYz1hKCk7aWYobnVsbCE9YylyZXR1cm4gYz92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19IWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGUsZixnLGg7aWYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGIuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLGM9ZCYmZC5zdHlsZSl7Yy5jc3NUZXh0PSJmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLGsub3BhY2l0eT0iMC41Ij09PWMub3BhY2l0eSxrLmNzc0Zsb2F0PSEhYy5jc3NGbG9hdCxiLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsYi5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGsuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1iLnN0eWxlLmJhY2tncm91bmRDbGlwLGsuYm94U2l6aW5nPSIiPT09Yy5ib3hTaXppbmd8fCIiPT09Yy5Nb3pCb3hTaXppbmd8fCIiPT09Yy5XZWJraXRCb3hTaXppbmcsbS5leHRlbmQoayx7cmVsaWFibGVIaWRkZW5PZmZzZXRzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWcmJmkoKSxnfSxib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBudWxsPT1mJiZpKCksZn0scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBudWxsPT1lJiZpKCksZX0scmVsaWFibGVNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1oJiZpKCksaH19KTtmdW5jdGlvbiBpKCl7dmFyIGIsYyxkLGk7Yz15LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChkKS5hcHBlbmRDaGlsZChiKSxiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MSU7dG9wOjElO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NHB4O3Bvc2l0aW9uOmFic29sdXRlIixlPWY9ITEsaD0hMCxhLmdldENvbXB1dGVkU3R5bGUmJihlPSIxJSIhPT0oYS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCl8fHt9KS50b3AsZj0iNHB4Ij09PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e3dpZHRoOiI0cHgifSkud2lkdGgsaT1iLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgiZGl2IikpLGkuc3R5bGUuY3NzVGV4dD1iLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCIsaS5zdHlsZS5tYXJnaW5SaWdodD1pLnN0eWxlLndpZHRoPSIwIixiLnN0eWxlLndpZHRoPSIxcHgiLGg9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShpLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpKSxiLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsaT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGlbMF0uc3R5bGUuY3NzVGV4dD0ibWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowO2Rpc3BsYXk6bm9uZSIsZz0wPT09aVswXS5vZmZzZXRIZWlnaHQsZyYmKGlbMF0uc3R5bGUuZGlzcGxheT0iIixpWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0KSxjLnJlbW92ZUNoaWxkKGQpKX19fSgpLG0uc3dhcD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX07dmFyIE1iPS9hbHBoYVwoW14pXSpcKS9pLE5iPS9vcGFjaXR5XHMqPVxzKihbXildKikvLE9iPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxQYj1uZXcgUmVnRXhwKCJeKCIrUysiKSguKikkIiwiaSIpLFFiPW5ldyBSZWdFeHAoIl4oWystXSk9KCIrUysiKSIsImkiKSxSYj17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sU2I9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9LFRiPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl07ZnVuY3Rpb24gVWIoYSxiKXtpZihiIGluIGEpcmV0dXJuIGI7dmFyIGM9Yi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpLGQ9YixlPVRiLmxlbmd0aDt3aGlsZShlLS0paWYoYj1UYltlXStjLGIgaW4gYSlyZXR1cm4gYjtyZXR1cm4gZH1mdW5jdGlvbiBWYihhLGIpe2Zvcih2YXIgYyxkLGUsZj1bXSxnPTAsaD1hLmxlbmd0aDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoZltnXT1tLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSxjPWQuc3R5bGUuZGlzcGxheSxiPyhmW2ddfHwibm9uZSIhPT1jfHwoZC5zdHlsZS5kaXNwbGF5PSIiKSwiIj09PWQuc3R5bGUuZGlzcGxheSYmVShkKSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IixGYihkLm5vZGVOYW1lKSkpKTooZT1VKGQpLChjJiYibm9uZSIhPT1jfHwhZSkmJm0uX2RhdGEoZCwib2xkZGlzcGxheSIsZT9jOm0uY3NzKGQsImRpc3BsYXkiKSkpKTtmb3IoZz0wO2g+ZztnKyspZD1hW2ddLGQuc3R5bGUmJihiJiYibm9uZSIhPT1kLnN0eWxlLmRpc3BsYXkmJiIiIT09ZC5zdHlsZS5kaXNwbGF5fHwoZC5zdHlsZS5kaXNwbGF5PWI/ZltnXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGF9ZnVuY3Rpb24gV2IoYSxiLGMpe3ZhciBkPVBiLmV4ZWMoYik7cmV0dXJuIGQ/TWF0aC5tYXgoMCxkWzFdLShjfHwwKSkrKGRbMl18fCJweCIpOmJ9ZnVuY3Rpb24gWGIoYSxiLGMsZCxlKXtmb3IodmFyIGY9Yz09PShkPyJib3JkZXIiOiJjb250ZW50Iik/NDoid2lkdGgiPT09Yj8xOjAsZz0wOzQ+ZjtmKz0yKSJtYXJnaW4iPT09YyYmKGcrPW0uY3NzKGEsYytUW2ZdLCEwLGUpKSxkPygiY29udGVudCI9PT1jJiYoZy09bS5jc3MoYSwicGFkZGluZyIrVFtmXSwhMCxlKSksIm1hcmdpbiIhPT1jJiYoZy09bS5jc3MoYSwiYm9yZGVyIitUW2ZdKyJXaWR0aCIsITAsZSkpKTooZys9bS5jc3MoYSwicGFkZGluZyIrVFtmXSwhMCxlKSwicGFkZGluZyIhPT1jJiYoZys9bS5jc3MoYSwiYm9yZGVyIitUW2ZdKyJXaWR0aCIsITAsZSkpKTtyZXR1cm4gZ31mdW5jdGlvbiBZYihhLGIsYyl7dmFyIGQ9ITAsZT0id2lkdGgiPT09Yj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGY9SWIoYSksZz1rLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxmKTtpZigwPj1lfHxudWxsPT1lKXtpZihlPUpiKGEsYixmKSwoMD5lfHxudWxsPT1lKSYmKGU9YS5zdHlsZVtiXSksSGIudGVzdChlKSlyZXR1cm4gZTtkPWcmJihrLmJveFNpemluZ1JlbGlhYmxlKCl8fGU9PT1hLnN0eWxlW2JdKSxlPXBhcnNlRmxvYXQoZSl8fDB9cmV0dXJuIGUrWGIoYSxiLGN8fChnPyJib3JkZXIiOiJjb250ZW50IiksZCxmKSsicHgifW0uZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9SmIoYSwib3BhY2l0eSIpO3JldHVybiIiPT09Yz8iMSI6Y319fX0sY3NzTnVtYmVyOntjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjprLmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGIsYyxkKXtpZihhJiYzIT09YS5ub2RlVHlwZSYmOCE9PWEubm9kZVR5cGUmJmEuc3R5bGUpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpLGk9YS5zdHlsZTtpZihiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVViKGksaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSx2b2lkIDA9PT1jKXJldHVybiBnJiYiZ2V0ImluIGcmJnZvaWQgMCE9PShlPWcuZ2V0KGEsITEsZCkpP2U6aVtiXTtpZihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9UWIuZXhlYyhjKSkmJihjPShlWzFdKzEpKmVbMl0rcGFyc2VGbG9hdChtLmNzcyhhLGIpKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiIT09Znx8bS5jc3NOdW1iZXJbaF18fChjKz0icHgiKSxrLmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1jfHwwIT09Yi5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChpW2JdPSJpbmhlcml0IiksIShnJiYic2V0ImluIGcmJnZvaWQgMD09PShjPWcuc2V0KGEsYyxkKSkpKSl0cnl7aVtiXT1jfWNhdGNoKGope319fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9bS5jYW1lbENhc2UoYik7cmV0dXJuIGI9bS5jc3NQcm9wc1toXXx8KG0uY3NzUHJvcHNbaF09VWIoYS5zdHlsZSxoKSksZz1tLmNzc0hvb2tzW2JdfHxtLmNzc0hvb2tzW2hdLGcmJiJnZXQiaW4gZyYmKGY9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZiYmKGY9SmIoYSxiLGQpKSwibm9ybWFsIj09PWYmJmIgaW4gU2ImJihmPVNiW2JdKSwiIj09PWN8fGM/KGU9cGFyc2VGbG9hdChmKSxjPT09ITB8fG0uaXNOdW1lcmljKGUpP2V8fDA6Zik6Zn19KSxtLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7bS5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gYz9PYi50ZXN0KG0uY3NzKGEsImRpc3BsYXkiKSkmJjA9PT1hLm9mZnNldFdpZHRoP20uc3dhcChhLFJiLGZ1bmN0aW9uKCl7cmV0dXJuIFliKGEsYixkKX0pOlliKGEsYixkKTp2b2lkIDB9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9ZCYmSWIoYSk7cmV0dXJuIFdiKGEsYyxkP1hiKGEsYixkLGsuYm94U2l6aW5nJiYiYm9yZGVyLWJveCI9PT1tLmNzcyhhLCJib3hTaXppbmciLCExLGUpLGUpOjApfX19KSxrLm9wYWNpdHl8fChtLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBOYi50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9bS5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IisxMDAqYisiKSI6IiIsZj1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xLChiPj0xfHwiIj09PWIpJiYiIj09PW0udHJpbShmLnJlcGxhY2UoTWIsIiIpKSYmYy5yZW1vdmVBdHRyaWJ1dGUmJihjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIiksIiI9PT1ifHxkJiYhZC5maWx0ZXIpfHwoYy5maWx0ZXI9TWIudGVzdChmKT9mLnJlcGxhY2UoTWIsZSk6ZisiICIrZSl9fSksbS5jc3NIb29rcy5tYXJnaW5SaWdodD1MYihrLnJlbGlhYmxlTWFyZ2luUmlnaHQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9tLnN3YXAoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sSmIsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG0uZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGEsYil7bS5jc3NIb29rc1thK2JdPXtleHBhbmQ6ZnVuY3Rpb24oYyl7Zm9yKHZhciBkPTAsZT17fSxmPSJzdHJpbmciPT10eXBlb2YgYz9jLnNwbGl0KCIgIik6W2NdOzQ+ZDtkKyspZVthK1RbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sR2IudGVzdChhKXx8KG0uY3NzSG9va3NbYStiXS5zZXQ9V2IpfSksbS5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBWKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYobS5pc0FycmF5KGIpKXtmb3IoZD1JYihhKSxlPWIubGVuZ3RoO2U+ZztnKyspZltiW2ddXT1tLmNzcyhhLGJbZ10sITEsZCk7cmV0dXJuIGZ9cmV0dXJuIHZvaWQgMCE9PWM/bS5zdHlsZShhLGIsYyk6bS5jc3MoYSxiKX0sYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gVmIodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gVmIodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7VSh0aGlzKT9tKHRoaXMpLnNob3coKTptKHRoaXMpLmhpZGUoKX0pfX0pO2Z1bmN0aW9uIFpiKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBaYi5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW0uVHdlZW49WmIsWmIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpaYixpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobS5jc3NOdW1iZXJbY10/IiI6InB4IikKfSxjdXI6ZnVuY3Rpb24oKXt2YXIgYT1aYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gYSYmYS5nZXQ/YS5nZXQodGhpcyk6WmIucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiLGM9WmIucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMucG9zPWI9dGhpcy5vcHRpb25zLmR1cmF0aW9uP20uZWFzaW5nW3RoaXMuZWFzaW5nXShhLHRoaXMub3B0aW9ucy5kdXJhdGlvbiphLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOmEsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmIrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksYyYmYy5zZXQ/Yy5zZXQodGhpcyk6WmIucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWmIucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVpiLnByb3RvdHlwZSxaYi5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIG51bGw9PWEuZWxlbVthLnByb3BdfHxhLmVsZW0uc3R5bGUmJm51bGwhPWEuZWxlbS5zdHlsZVthLnByb3BdPyhiPW0uY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKTphLmVsZW1bYS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGEpe20uZnguc3RlcFthLnByb3BdP20uZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5zdHlsZSYmKG51bGwhPWEuZWxlbS5zdHlsZVttLmNzc1Byb3BzW2EucHJvcF1dfHxtLmNzc0hvb2tzW2EucHJvcF0pP20uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19LFpiLnByb3BIb29rcy5zY3JvbGxUb3A9WmIucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0sbS5meD1aYi5wcm90b3R5cGUuaW5pdCxtLmZ4LnN0ZXA9e307dmFyICRiLF9iLGFjPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxiYz1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrUysiKShbYS16JV0qKSQiLCJpIiksY2M9L3F1ZXVlSG9va3MkLyxkYz1baWNdLGVjPXsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGQ9Yy5jdXIoKSxlPWJjLmV4ZWMoYiksZj1lJiZlWzNdfHwobS5jc3NOdW1iZXJbYV0/IiI6InB4IiksZz0obS5jc3NOdW1iZXJbYV18fCJweCIhPT1mJiYrZCkmJmJjLmV4ZWMobS5jc3MoYy5lbGVtLGEpKSxoPTEsaT0yMDtpZihnJiZnWzNdIT09Zil7Zj1mfHxnWzNdLGU9ZXx8W10sZz0rZHx8MTtkbyBoPWh8fCIuNSIsZy89aCxtLnN0eWxlKGMuZWxlbSxhLGcrZik7d2hpbGUoaCE9PShoPWMuY3VyKCkvZCkmJjEhPT1oJiYtLWkpfXJldHVybiBlJiYoZz1jLnN0YXJ0PStnfHwrZHx8MCxjLnVuaXQ9ZixjLmVuZD1lWzFdP2crKGVbMV0rMSkqZVsyXTorZVsyXSksY31dfTtmdW5jdGlvbiBmYygpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGI9dm9pZCAwfSksJGI9bS5ub3coKX1mdW5jdGlvbiBnYyhhLGIpe3ZhciBjLGQ9e2hlaWdodDphfSxlPTA7Zm9yKGI9Yj8xOjA7ND5lO2UrPTItYiljPVRbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBoYyhhLGIsYyl7Zm9yKHZhciBkLGU9KGVjW2JdfHxbXSkuY29uY2F0KGVjWyIqIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIGljKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixsLG49dGhpcyxvPXt9LHA9YS5zdHlsZSxxPWEubm9kZVR5cGUmJlUoYSkscj1tLl9kYXRhKGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW0uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxuLmFsd2F5cyhmdW5jdGlvbigpe24uYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG0ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLGo9bS5jc3MoYSwiZGlzcGxheSIpLGw9Im5vbmUiPT09aj9tLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8RmIoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWwmJiJub25lIj09PW0uY3NzKGEsImZsb2F0IikmJihrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09RmIoYS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsay5zaHJpbmtXcmFwQmxvY2tzKCl8fG4uYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxhYy5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHE/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFyfHx2b2lkIDA9PT1yW2RdKWNvbnRpbnVlO3E9ITB9b1tkXT1yJiZyW2RdfHxtLnN0eWxlKGEsZCl9ZWxzZSBqPXZvaWQgMDtpZihtLmlzRW1wdHlPYmplY3QobykpImlubGluZSI9PT0oIm5vbmUiPT09aj9GYihhLm5vZGVOYW1lKTpqKSYmKHAuZGlzcGxheT1qKTtlbHNle3I/ImhpZGRlbiJpbiByJiYocT1yLmhpZGRlbik6cj1tLl9kYXRhKGEsImZ4c2hvdyIse30pLGYmJihyLmhpZGRlbj0hcSkscT9tKGEpLnNob3coKTpuLmRvbmUoZnVuY3Rpb24oKXttKGEpLmhpZGUoKX0pLG4uZG9uZShmdW5jdGlvbigpe3ZhciBiO20uX3JlbW92ZURhdGEoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbyltLnN0eWxlKGEsYixvW2JdKX0pO2ZvcihkIGluIG8pZz1oYyhxP3JbZF06MCxkLG4pLGQgaW4gcnx8KHJbZF09Zy5zdGFydCxxJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIGpjKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bS5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxtLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW0uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24ga2MoYSxiLGMpe3ZhciBkLGUsZj0wLGc9ZGMubGVuZ3RoLGg9bS5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9JGJ8fGZjKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm0uZXh0ZW5kKHt9LGIpLG9wdHM6bS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTokYnx8ZmMoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW0uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKGpjKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1kY1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG0ubWFwKGssaGMsaiksbS5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbS5meC50aW1lcihtLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1tLkFuaW1hdGlvbj1tLmV4dGVuZChrYyx7dHdlZW5lcjpmdW5jdGlvbihhLGIpe20uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxlY1tjXT1lY1tjXXx8W10sZWNbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9kYy51bnNoaWZ0KGEpOmRjLnB1c2goYSl9fSksbS5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP20uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bS5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFtLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW0uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBtLmZ4LnNwZWVkcz9tLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTptLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bS5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZtLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoVSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5pc0VtcHR5T2JqZWN0KGEpLGY9bS5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtjKHRoaXMsbS5leHRlbmQoe30sYSksZik7KGV8fG0uX2RhdGEodGhpcywiZmluaXNoIikpJiZiLnN0b3AoITApfTtyZXR1cm4gZy5maW5pc2g9ZyxlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihjKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29rcyIsZj1tLnRpbWVycyxnPW0uX2RhdGEodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmY2MudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZtLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1tLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1tLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbS5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxtLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bS5mbltiXTttLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoZ2MoYiwhMCksYSxkLGUpfX0pLG0uZWFjaCh7c2xpZGVEb3duOmdjKCJzaG93Iiksc2xpZGVVcDpnYygiaGlkZSIpLHNsaWRlVG9nZ2xlOmdjKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxtLnRpbWVycz1bXSxtLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW0udGltZXJzLGM9MDtmb3IoJGI9bS5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxtLmZ4LnN0b3AoKSwkYj12b2lkIDB9LG0uZngudGltZXI9ZnVuY3Rpb24oYSl7bS50aW1lcnMucHVzaChhKSxhKCk/bS5meC5zdGFydCgpOm0udGltZXJzLnBvcCgpfSxtLmZ4LmludGVydmFsPTEzLG0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtfYnx8KF9iPXNldEludGVydmFsKG0uZngudGljayxtLmZ4LmludGVydmFsKSl9LG0uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoX2IpLF9iPW51bGx9LG0uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG0uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1tLmZ4P20uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxjPXkuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZT1jLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxkLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGsuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWIuY2xhc3NOYW1lLGsuc3R5bGU9L3RvcC8udGVzdChkLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksay5ocmVmTm9ybWFsaXplZD0iL2EiPT09ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSxrLmNoZWNrT249ISFhLnZhbHVlLGsub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCxrLmVuY3R5cGU9ISF5LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGMuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hZS5kaXNhYmxlZCxhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxrLmlucHV0PSIiPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYS52YWx1ZT0idCIsYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBsYz0vXHIvZzttLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bS5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG0odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjptLmlzQXJyYXkoZSkmJihlPW0ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW0udmFsSG9va3NbdGhpcy50eXBlXXx8bS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW0udmFsSG9va3NbZS50eXBlXXx8bS52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UobGMsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG0uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bS5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm0udHJpbShtLnRleHQoYSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZtLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bShjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW0ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxtLmluQXJyYXkobS52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uaXNBcnJheShiKT9hLmNoZWNrZWQ9bS5pbkFycmF5KG0oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBtYyxuYyxvYz1tLmV4cHIuYXR0ckhhbmRsZSxwYz0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHFjPWsuZ2V0U2V0QXR0cmlidXRlLHJjPWsuaW5wdXQ7bS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxtLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09Sz9tLnByb3AoYSxiLGMpOigxPT09ZiYmbS5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bS5hdHRySG9va3NbYl18fChtLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP25jOm1jKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW0uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBtLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRSk7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1tLnByb3BGaXhbY118fGMsbS5leHByLm1hdGNoLmJvb2wudGVzdChjKT9yYyYmcWN8fCFwYy50ZXN0KGMpP2FbZF09ITE6YVttLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm0uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHFjP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm0ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksbmM9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9tLnJlbW92ZUF0dHIoYSxjKTpyYyYmcWN8fCFwYy50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFxYyYmbS5wcm9wRml4W2NdfHxjLGMpOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbS5lYWNoKG0uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9b2NbYl18fG0uZmluZC5hdHRyO29jW2JdPXJjJiZxY3x8IXBjLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPW9jW2JdLG9jW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxvY1tiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSkscmMmJnFjfHwobS5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm1jJiZtYy5zZXQoYSxiLGMpfX0pLHFjfHwobWM9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxvYy5pZD1vYy5uYW1lPW9jLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG0udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bWMuc2V0fSxtLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bWMuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxtLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bS5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGsuc3R5bGV8fChtLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciBzYz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx0Yz0vXig/OmF8YXJlYSkkL2k7bS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1tLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxtLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW0uaXNYTUxEb2MoYSksZiYmKGI9bS5wcm9wRml4W2JdfHxiLGU9bS5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6c2MudGVzdChhLm5vZGVOYW1lKXx8dGMudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxrLmhyZWZOb3JtYWxpemVkfHxtLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXttLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxrLm9wdFNlbGVjdGVkfHwobS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxtLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe20ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxrLmVuY3R5cGV8fChtLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdWM9L1tcdFxyXG5cZl0vZzttLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWMsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW0udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHVjLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP20udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXttKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1tKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09S3x8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjptLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWMsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG0uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG0uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHZjPW0ubm93KCksd2M9L1w/Lyx4Yz0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO20ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bS50cmltKGIrIiIpO3JldHVybiBlJiYhbS50cmltKGUucmVwbGFjZSh4YyxmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTptLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG0ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHljLHpjLEFjPS8jLiokLyxCYz0vKFs/Jl0pXz1bXiZdKi8sQ2M9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxEYz0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxFYz0vXig/OkdFVHxIRUFEKSQvLEZjPS9eXC9cLy8sR2M9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSGM9e30sSWM9e30sSmM9IiovIi5jb25jYXQoIioiKTt0cnl7emM9bG9jYXRpb24uaHJlZn1jYXRjaChLYyl7emM9eS5jcmVhdGVFbGVtZW50KCJhIiksemMuaHJlZj0iIix6Yz16Yy5ocmVmfXljPUdjLmV4ZWMoemMudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIExjKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihtLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTWMoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SWM7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxtLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBOYyhhLGIpe3ZhciBjLGQsZT1tLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZtLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gT2MoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUGMoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1tLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6emMsdHlwZToiR0VUIixpc0xvY2FsOkRjLnRlc3QoeWNbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SmMsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjptLnBhcnNlSlNPTiwidGV4dCB4bWwiOm0ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP05jKE5jKGEsbS5hamF4U2V0dGluZ3MpLGIpOk5jKG0uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOkxjKEhjKSxhamF4VHJhbnNwb3J0OkxjKEljKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1tLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxuPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9tKGwpOm0uZXZlbnQsbz1tLkRlZmVycmVkKCkscD1tLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPUNjLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fHpjKSsiIikucmVwbGFjZShBYywiIikucmVwbGFjZShGYyx5Y1sxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1tLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUdjLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09eWNbMV0mJmNbMl09PT15Y1syXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oeWNbM118fCgiaHR0cDoiPT09eWNbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1tLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTWMoSGMsayxiLHYpLDI9PT10KXJldHVybiB2O2g9ay5nbG9iYWwsaCYmMD09PW0uYWN0aXZlKysmJm0uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRWMudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHdjLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUJjLnRlc3QoZSk/ZS5yZXBsYWNlKEJjLCIkMV89Iit2YysrKTplKyh3Yy50ZXN0KGUpPyImIjoiPyIpKyJfPSIrdmMrKykpLGsuaWZNb2RpZmllZCYmKG0ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixtLmxhc3RNb2RpZmllZFtlXSksbS5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG0uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0pjKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1NYyhJYyxrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm4udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PU9jKGssdixjKSksdT1QYyhrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobS5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG0uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZuLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihuLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbS5hY3RpdmV8fG0uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG0uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe21bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG0uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG0uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG0uZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGEsYil7bS5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vbihiLGEpfX0pLG0uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW0oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXttKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bSh0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1tLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXttKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bS5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG0odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG0uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFrLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxtLmNzcyhhLCJkaXNwbGF5IikpfSxtLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFtLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBRYz0vJTIwL2csUmM9L1xbXF0kLyxTYz0vXHI/XG4vZyxUYz0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVWM9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFZjKGEsYixjLGQpe3ZhciBlO2lmKG0uaXNBcnJheShiKSltLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFJjLnRlc3QoYSk/ZChhLGUpOlZjKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1tLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilWYyhhKyJbIitlKyJdIixiW2VdLGMsZCl9bS5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bS5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW0uYWpheFNldHRpbmdzJiZtLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbS5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW0uaXNQbGFpbk9iamVjdChhKSltLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVZjKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFFjLCIrIil9LG0uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW0ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP20ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW0odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZVYy50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVGMudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVcudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1tKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bS5pc0FycmF5KGMpP20ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShTYywiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoU2MsIlxyXG4iKX19KS5nZXQoKX19KSxtLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmWmMoKXx8JGMoKX06WmM7dmFyIFdjPTAsWGM9e30sWWM9bS5hamF4U2V0dGluZ3MueGhyKCk7YS5BY3RpdmVYT2JqZWN0JiZtKGEpLm9uKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFhjKVhjW2FdKHZvaWQgMCwhMCl9KSxrLmNvcnM9ISFZYyYmIndpdGhDcmVkZW50aWFscyJpbiBZYyxZYz1rLmFqYXg9ISFZYyxZYyYmbS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxrLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytXYztpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFhjW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW0ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WGNbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gWmMoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gJGMoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1tLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBtLmdsb2JhbEV2YWwoYSksYX19fSksbS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG0uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXkuaGVhZHx8bSgiaGVhZCIpWzBdfHx5LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9eS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgX2M9W10sYWQ9Lyg9KVw/KD89JnwkKXxcP1w/LzttLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9X2MucG9wKCl8fG0uZXhwYW5kbysiXyIrdmMrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG0uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGFkLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYWQudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW0uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGFkLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh3Yy50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bS5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssX2MucHVzaChlKSksZyYmbS5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbS5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHk7dmFyIGQ9dS5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW0uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbShlKS5yZW1vdmUoKSxtLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgYmQ9bS5mbi5sb2FkO20uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZiZClyZXR1cm4gYmQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bS50cmltKGEuc2xpY2UoaCxhLmxlbmd0aCkpLGE9YS5zbGljZSgwLGgpKSxtLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZj0iUE9TVCIpLGcubGVuZ3RoPjAmJm0uYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2U9YXJndW1lbnRzLGcuaHRtbChkP20oIjxkaXY+IikuYXBwZW5kKG0ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxlfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxtLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbS5ncmVwKG0udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgY2Q9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gZGQoYSl7cmV0dXJuIG0uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1tLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW0uY3NzKGEsInBvc2l0aW9uIiksbD1tKGEpLG49e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1tLmNzcyhhLCJ0b3AiKSxpPW0uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZtLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbS5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGgpKSxudWxsIT1iLnRvcCYmKG4udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG4ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG4pOmwuY3NzKG4pfX0sbS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20ub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQ9e3RvcDowLGxlZnQ6MH0sZT10aGlzWzBdLGY9ZSYmZS5vd25lckRvY3VtZW50O2lmKGYpcmV0dXJuIGI9Zi5kb2N1bWVudEVsZW1lbnQsbS5jb250YWlucyhiLGUpPyh0eXBlb2YgZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1LJiYoZD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxjPWRkKGYpLHt0b3A6ZC50b3ArKGMucGFnZVlPZmZzZXR8fGIuc2Nyb2xsVG9wKS0oYi5jbGllbnRUb3B8fDApLGxlZnQ6ZC5sZWZ0KyhjLnBhZ2VYT2Zmc2V0fHxiLnNjcm9sbExlZnQpLShiLmNsaWVudExlZnR8fDApfSk6ZH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgYSxiLGM9e3RvcDowLGxlZnQ6MH0sZD10aGlzWzBdO3JldHVybiJmaXhlZCI9PT1tLmNzcyhkLCJwb3NpdGlvbiIpP2I9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTooYT10aGlzLm9mZnNldFBhcmVudCgpLGI9dGhpcy5vZmZzZXQoKSxtLm5vZGVOYW1lKGFbMF0sImh0bWwiKXx8KGM9YS5vZmZzZXQoKSksYy50b3ArPW0uY3NzKGFbMF0sImJvcmRlclRvcFdpZHRoIiwhMCksYy5sZWZ0Kz1tLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSkse3RvcDpiLnRvcC1jLnRvcC1tLmNzcyhkLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmIubGVmdC1jLmxlZnQtbS5jc3MoZCwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjZDt3aGlsZShhJiYhbS5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bS5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxjZH0pfX0pLG0uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO20uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9ZGQoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bShmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bShmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bS5jc3NIb29rc1tiXT1MYihrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1KYihhLGIpLEhiLnRlc3QoYyk/bShhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxtLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe20uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXttLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbS5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9tLmNzcyhiLGMsZyk6bS5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxtLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG0uZm4uYW5kU2VsZj1tLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgZWQ9YS5qUXVlcnksZmQ9YS4kO3JldHVybiBtLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW0mJihhLiQ9ZmQpLGImJmEualF1ZXJ5PT09bSYmKGEualF1ZXJ5PWVkKSxtfSx0eXBlb2YgYj09PUsmJihhLmpRdWVyeT1hLiQ9bSksbX0pOwo=')
},
{
'name': '/app/lib/js/bootstrap.min.js', 'data': base64.b64decode(b'LyohCiAqIEJvb3RzdHJhcCB2My4xLjEgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKQogKiBDb3B5cmlnaHQgMjAxMS0yMDE0IFR3aXR0ZXIsIEluYy4KICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSkKICovCmlmKCJ1bmRlZmluZWQiPT10eXBlb2YgalF1ZXJ5KXRocm93IG5ldyBFcnJvcigiQm9vdHN0cmFwJ3MgSmF2YVNjcmlwdCByZXF1aXJlcyBqUXVlcnkiKTsrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJib290c3RyYXAiKSxiPXtXZWJraXRUcmFuc2l0aW9uOiJ3ZWJraXRUcmFuc2l0aW9uRW5kIixNb3pUcmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIixPVHJhbnNpdGlvbjoib1RyYW5zaXRpb25FbmQgb3RyYW5zaXRpb25lbmQiLHRyYW5zaXRpb246InRyYW5zaXRpb25lbmQifTtmb3IodmFyIGMgaW4gYilpZih2b2lkIDAhPT1hLnN0eWxlW2NdKXJldHVybntlbmQ6YltjXX07cmV0dXJuITF9YS5mbi5lbXVsYXRlVHJhbnNpdGlvbkVuZD1mdW5jdGlvbihiKXt2YXIgYz0hMSxkPXRoaXM7YSh0aGlzKS5vbmUoYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGZ1bmN0aW9uKCl7Yz0hMH0pO3ZhciBlPWZ1bmN0aW9uKCl7Y3x8YShkKS50cmlnZ2VyKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCl9O3JldHVybiBzZXRUaW1lb3V0KGUsYiksdGhpc30sYShmdW5jdGlvbigpe2Euc3VwcG9ydC50cmFuc2l0aW9uPWIoKX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7dmFyIGI9J1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLGM9ZnVuY3Rpb24oYyl7YShjKS5vbigiY2xpY2siLGIsdGhpcy5jbG9zZSl9O2MucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoKXtmLnRyaWdnZXIoImNsb3NlZC5icy5hbGVydCIpLnJlbW92ZSgpfXZhciBkPWEodGhpcyksZT1kLmF0dHIoImRhdGEtdGFyZ2V0Iik7ZXx8KGU9ZC5hdHRyKCJocmVmIiksZT1lJiZlLnJlcGxhY2UoLy4qKD89I1teXHNdKiQpLywiIikpO3ZhciBmPWEoZSk7YiYmYi5wcmV2ZW50RGVmYXVsdCgpLGYubGVuZ3RofHwoZj1kLmhhc0NsYXNzKCJhbGVydCIpP2Q6ZC5wYXJlbnQoKSksZi50cmlnZ2VyKGI9YS5FdmVudCgiY2xvc2UuYnMuYWxlcnQiKSksYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8KGYucmVtb3ZlQ2xhc3MoImluIiksYS5zdXBwb3J0LnRyYW5zaXRpb24mJmYuaGFzQ2xhc3MoImZhZGUiKT9mLm9uZShhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsYykuZW11bGF0ZVRyYW5zaXRpb25FbmQoMTUwKTpjKCkpfTt2YXIgZD1hLmZuLmFsZXJ0O2EuZm4uYWxlcnQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLmFsZXJ0Iik7ZXx8ZC5kYXRhKCJicy5hbGVydCIsZT1uZXcgYyh0aGlzKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdLmNhbGwoZCl9KX0sYS5mbi5hbGVydC5Db25zdHJ1Y3Rvcj1jLGEuZm4uYWxlcnQubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmFsZXJ0PWQsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLmFsZXJ0LmRhdGEtYXBpIixiLGMucHJvdG90eXBlLmNsb3NlKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO3ZhciBiPWZ1bmN0aW9uKGMsZCl7dGhpcy4kZWxlbWVudD1hKGMpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxiLkRFRkFVTFRTLGQpLHRoaXMuaXNMb2FkaW5nPSExfTtiLkRFRkFVTFRTPXtsb2FkaW5nVGV4dDoibG9hZGluZy4uLiJ9LGIucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGIpe3ZhciBjPSJkaXNhYmxlZCIsZD10aGlzLiRlbGVtZW50LGU9ZC5pcygiaW5wdXQiKT8idmFsIjoiaHRtbCIsZj1kLmRhdGEoKTtiKz0iVGV4dCIsZi5yZXNldFRleHR8fGQuZGF0YSgicmVzZXRUZXh0IixkW2VdKCkpLGRbZV0oZltiXXx8dGhpcy5vcHRpb25zW2JdKSxzZXRUaW1lb3V0KGEucHJveHkoZnVuY3Rpb24oKXsibG9hZGluZ1RleHQiPT1iPyh0aGlzLmlzTG9hZGluZz0hMCxkLmFkZENsYXNzKGMpLmF0dHIoYyxjKSk6dGhpcy5pc0xvYWRpbmcmJih0aGlzLmlzTG9hZGluZz0hMSxkLnJlbW92ZUNsYXNzKGMpLnJlbW92ZUF0dHIoYykpfSx0aGlzKSwwKX0sYi5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIGE9ITAsYj10aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT0iYnV0dG9ucyJdJyk7aWYoYi5sZW5ndGgpe3ZhciBjPXRoaXMuJGVsZW1lbnQuZmluZCgiaW5wdXQiKTsicmFkaW8iPT1jLnByb3AoInR5cGUiKSYmKGMucHJvcCgiY2hlY2tlZCIpJiZ0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJhY3RpdmUiKT9hPSExOmIuZmluZCgiLmFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSksYSYmYy5wcm9wKCJjaGVja2VkIiwhdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiYWN0aXZlIikpLnRyaWdnZXIoImNoYW5nZSIpfWEmJnRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoImFjdGl2ZSIpfTt2YXIgYz1hLmZuLmJ1dHRvbjthLmZuLmJ1dHRvbj1mdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMuYnV0dG9uIiksZj0ib2JqZWN0Ij09dHlwZW9mIGMmJmM7ZXx8ZC5kYXRhKCJicy5idXR0b24iLGU9bmV3IGIodGhpcyxmKSksInRvZ2dsZSI9PWM/ZS50b2dnbGUoKTpjJiZlLnNldFN0YXRlKGMpfSl9LGEuZm4uYnV0dG9uLkNvbnN0cnVjdG9yPWIsYS5mbi5idXR0b24ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmJ1dHRvbj1jLHRoaXN9LGEoZG9jdW1lbnQpLm9uKCJjbGljay5icy5idXR0b24uZGF0YS1hcGkiLCJbZGF0YS10b2dnbGVePWJ1dHRvbl0iLGZ1bmN0aW9uKGIpe3ZhciBjPWEoYi50YXJnZXQpO2MuaGFzQ2xhc3MoImJ0biIpfHwoYz1jLmNsb3Nlc3QoIi5idG4iKSksYy5idXR0b24oInRvZ2dsZSIpLGIucHJldmVudERlZmF1bHQoKX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7dmFyIGI9ZnVuY3Rpb24oYixjKXt0aGlzLiRlbGVtZW50PWEoYiksdGhpcy4kaW5kaWNhdG9ycz10aGlzLiRlbGVtZW50LmZpbmQoIi5jYXJvdXNlbC1pbmRpY2F0b3JzIiksdGhpcy5vcHRpb25zPWMsdGhpcy5wYXVzZWQ9dGhpcy5zbGlkaW5nPXRoaXMuaW50ZXJ2YWw9dGhpcy4kYWN0aXZlPXRoaXMuJGl0ZW1zPW51bGwsImhvdmVyIj09dGhpcy5vcHRpb25zLnBhdXNlJiZ0aGlzLiRlbGVtZW50Lm9uKCJtb3VzZWVudGVyIixhLnByb3h5KHRoaXMucGF1c2UsdGhpcykpLm9uKCJtb3VzZWxlYXZlIixhLnByb3h5KHRoaXMuY3ljbGUsdGhpcykpfTtiLkRFRkFVTFRTPXtpbnRlcnZhbDo1ZTMscGF1c2U6ImhvdmVyIix3cmFwOiEwfSxiLnByb3RvdHlwZS5jeWNsZT1mdW5jdGlvbihiKXtyZXR1cm4gYnx8KHRoaXMucGF1c2VkPSExKSx0aGlzLmludGVydmFsJiZjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpLHRoaXMub3B0aW9ucy5pbnRlcnZhbCYmIXRoaXMucGF1c2VkJiYodGhpcy5pbnRlcnZhbD1zZXRJbnRlcnZhbChhLnByb3h5KHRoaXMubmV4dCx0aGlzKSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpKSx0aGlzfSxiLnByb3RvdHlwZS5nZXRBY3RpdmVJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRhY3RpdmU9dGhpcy4kZWxlbWVudC5maW5kKCIuaXRlbS5hY3RpdmUiKSx0aGlzLiRpdGVtcz10aGlzLiRhY3RpdmUucGFyZW50KCkuY2hpbGRyZW4oKSx0aGlzLiRpdGVtcy5pbmRleCh0aGlzLiRhY3RpdmUpfSxiLnByb3RvdHlwZS50bz1mdW5jdGlvbihiKXt2YXIgYz10aGlzLGQ9dGhpcy5nZXRBY3RpdmVJbmRleCgpO3JldHVybiBiPnRoaXMuJGl0ZW1zLmxlbmd0aC0xfHwwPmI/dm9pZCAwOnRoaXMuc2xpZGluZz90aGlzLiRlbGVtZW50Lm9uZSgic2xpZC5icy5jYXJvdXNlbCIsZnVuY3Rpb24oKXtjLnRvKGIpfSk6ZD09Yj90aGlzLnBhdXNlKCkuY3ljbGUoKTp0aGlzLnNsaWRlKGI+ZD8ibmV4dCI6InByZXYiLGEodGhpcy4kaXRlbXNbYl0pKX0sYi5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oYil7cmV0dXJuIGJ8fCh0aGlzLnBhdXNlZD0hMCksdGhpcy4kZWxlbWVudC5maW5kKCIubmV4dCwgLnByZXYiKS5sZW5ndGgmJmEuc3VwcG9ydC50cmFuc2l0aW9uJiYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCksdGhpcy5jeWNsZSghMCkpLHRoaXMuaW50ZXJ2YWw9Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKSx0aGlzfSxiLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpZGluZz92b2lkIDA6dGhpcy5zbGlkZSgibmV4dCIpfSxiLnByb3RvdHlwZS5wcmV2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpZGluZz92b2lkIDA6dGhpcy5zbGlkZSgicHJldiIpfSxiLnByb3RvdHlwZS5zbGlkZT1mdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMuJGVsZW1lbnQuZmluZCgiLml0ZW0uYWN0aXZlIiksZT1jfHxkW2JdKCksZj10aGlzLmludGVydmFsLGc9Im5leHQiPT1iPyJsZWZ0IjoicmlnaHQiLGg9Im5leHQiPT1iPyJmaXJzdCI6Imxhc3QiLGk9dGhpcztpZighZS5sZW5ndGgpe2lmKCF0aGlzLm9wdGlvbnMud3JhcClyZXR1cm47ZT10aGlzLiRlbGVtZW50LmZpbmQoIi5pdGVtIilbaF0oKX1pZihlLmhhc0NsYXNzKCJhY3RpdmUiKSlyZXR1cm4gdGhpcy5zbGlkaW5nPSExO3ZhciBqPWEuRXZlbnQoInNsaWRlLmJzLmNhcm91c2VsIix7cmVsYXRlZFRhcmdldDplWzBdLGRpcmVjdGlvbjpnfSk7cmV0dXJuIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihqKSxqLmlzRGVmYXVsdFByZXZlbnRlZCgpP3ZvaWQgMDoodGhpcy5zbGlkaW5nPSEwLGYmJnRoaXMucGF1c2UoKSx0aGlzLiRpbmRpY2F0b3JzLmxlbmd0aCYmKHRoaXMuJGluZGljYXRvcnMuZmluZCgiLmFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSx0aGlzLiRlbGVtZW50Lm9uZSgic2xpZC5icy5jYXJvdXNlbCIsZnVuY3Rpb24oKXt2YXIgYj1hKGkuJGluZGljYXRvcnMuY2hpbGRyZW4oKVtpLmdldEFjdGl2ZUluZGV4KCldKTtiJiZiLmFkZENsYXNzKCJhY3RpdmUiKX0pKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygic2xpZGUiKT8oZS5hZGRDbGFzcyhiKSxlWzBdLm9mZnNldFdpZHRoLGQuYWRkQ2xhc3MoZyksZS5hZGRDbGFzcyhnKSxkLm9uZShhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsZnVuY3Rpb24oKXtlLnJlbW92ZUNsYXNzKFtiLGddLmpvaW4oIiAiKSkuYWRkQ2xhc3MoImFjdGl2ZSIpLGQucmVtb3ZlQ2xhc3MoWyJhY3RpdmUiLGddLmpvaW4oIiAiKSksaS5zbGlkaW5nPSExLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLiRlbGVtZW50LnRyaWdnZXIoInNsaWQuYnMuY2Fyb3VzZWwiKX0sMCl9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZCgxZTMqZC5jc3MoInRyYW5zaXRpb24tZHVyYXRpb24iKS5zbGljZSgwLC0xKSkpOihkLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSxlLmFkZENsYXNzKCJhY3RpdmUiKSx0aGlzLnNsaWRpbmc9ITEsdGhpcy4kZWxlbWVudC50cmlnZ2VyKCJzbGlkLmJzLmNhcm91c2VsIikpLGYmJnRoaXMuY3ljbGUoKSx0aGlzKX07dmFyIGM9YS5mbi5jYXJvdXNlbDthLmZuLmNhcm91c2VsPWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGU9ZC5kYXRhKCJicy5jYXJvdXNlbCIpLGY9YS5leHRlbmQoe30sYi5ERUZBVUxUUyxkLmRhdGEoKSwib2JqZWN0Ij09dHlwZW9mIGMmJmMpLGc9InN0cmluZyI9PXR5cGVvZiBjP2M6Zi5zbGlkZTtlfHxkLmRhdGEoImJzLmNhcm91c2VsIixlPW5ldyBiKHRoaXMsZikpLCJudW1iZXIiPT10eXBlb2YgYz9lLnRvKGMpOmc/ZVtnXSgpOmYuaW50ZXJ2YWwmJmUucGF1c2UoKS5jeWNsZSgpfSl9LGEuZm4uY2Fyb3VzZWwuQ29uc3RydWN0b3I9YixhLmZuLmNhcm91c2VsLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5jYXJvdXNlbD1jLHRoaXN9LGEoZG9jdW1lbnQpLm9uKCJjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaSIsIltkYXRhLXNsaWRlXSwgW2RhdGEtc2xpZGUtdG9dIixmdW5jdGlvbihiKXt2YXIgYyxkPWEodGhpcyksZT1hKGQuYXR0cigiZGF0YS10YXJnZXQiKXx8KGM9ZC5hdHRyKCJocmVmIikpJiZjLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywiIikpLGY9YS5leHRlbmQoe30sZS5kYXRhKCksZC5kYXRhKCkpLGc9ZC5hdHRyKCJkYXRhLXNsaWRlLXRvIik7ZyYmKGYuaW50ZXJ2YWw9ITEpLGUuY2Fyb3VzZWwoZiksKGc9ZC5hdHRyKCJkYXRhLXNsaWRlLXRvIikpJiZlLmRhdGEoImJzLmNhcm91c2VsIikudG8oZyksYi5wcmV2ZW50RGVmYXVsdCgpfSksYSh3aW5kb3cpLm9uKCJsb2FkIixmdW5jdGlvbigpe2EoJ1tkYXRhLXJpZGU9ImNhcm91c2VsIl0nKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKTtiLmNhcm91c2VsKGIuZGF0YSgpKX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgYj1mdW5jdGlvbihjLGQpe3RoaXMuJGVsZW1lbnQ9YShjKSx0aGlzLm9wdGlvbnM9YS5leHRlbmQoe30sYi5ERUZBVUxUUyxkKSx0aGlzLnRyYW5zaXRpb25pbmc9bnVsbCx0aGlzLm9wdGlvbnMucGFyZW50JiYodGhpcy4kcGFyZW50PWEodGhpcy5vcHRpb25zLnBhcmVudCkpLHRoaXMub3B0aW9ucy50b2dnbGUmJnRoaXMudG9nZ2xlKCl9O2IuREVGQVVMVFM9e3RvZ2dsZTohMH0sYi5wcm90b3R5cGUuZGltZW5zaW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kZWxlbWVudC5oYXNDbGFzcygid2lkdGgiKTtyZXR1cm4gYT8id2lkdGgiOiJoZWlnaHQifSxiLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7aWYoIXRoaXMudHJhbnNpdGlvbmluZyYmIXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImluIikpe3ZhciBiPWEuRXZlbnQoInNob3cuYnMuY29sbGFwc2UiKTtpZih0aGlzLiRlbGVtZW50LnRyaWdnZXIoYiksIWIuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBjPXRoaXMuJHBhcmVudCYmdGhpcy4kcGFyZW50LmZpbmQoIj4gLnBhbmVsID4gLmluIik7aWYoYyYmYy5sZW5ndGgpe3ZhciBkPWMuZGF0YSgiYnMuY29sbGFwc2UiKTtpZihkJiZkLnRyYW5zaXRpb25pbmcpcmV0dXJuO2MuY29sbGFwc2UoImhpZGUiKSxkfHxjLmRhdGEoImJzLmNvbGxhcHNlIixudWxsKX12YXIgZT10aGlzLmRpbWVuc2lvbigpO3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImNvbGxhcHNlIikuYWRkQ2xhc3MoImNvbGxhcHNpbmciKVtlXSgwKSx0aGlzLnRyYW5zaXRpb25pbmc9MTt2YXIgZj1mdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImNvbGxhcHNpbmciKS5hZGRDbGFzcygiY29sbGFwc2UgaW4iKVtlXSgiYXV0byIpLHRoaXMudHJhbnNpdGlvbmluZz0wLHRoaXMuJGVsZW1lbnQudHJpZ2dlcigic2hvd24uYnMuY29sbGFwc2UiKX07aWYoIWEuc3VwcG9ydC50cmFuc2l0aW9uKXJldHVybiBmLmNhbGwodGhpcyk7dmFyIGc9YS5jYW1lbENhc2UoWyJzY3JvbGwiLGVdLmpvaW4oIi0iKSk7dGhpcy4kZWxlbWVudC5vbmUoYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGEucHJveHkoZix0aGlzKSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoMzUwKVtlXSh0aGlzLiRlbGVtZW50WzBdW2ddKX19fSxiLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7aWYoIXRoaXMudHJhbnNpdGlvbmluZyYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiaW4iKSl7dmFyIGI9YS5FdmVudCgiaGlkZS5icy5jb2xsYXBzZSIpO2lmKHRoaXMuJGVsZW1lbnQudHJpZ2dlcihiKSwhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIGM9dGhpcy5kaW1lbnNpb24oKTt0aGlzLiRlbGVtZW50W2NdKHRoaXMuJGVsZW1lbnRbY10oKSlbMF0ub2Zmc2V0SGVpZ2h0LHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoImNvbGxhcHNpbmciKS5yZW1vdmVDbGFzcygiY29sbGFwc2UiKS5yZW1vdmVDbGFzcygiaW4iKSx0aGlzLnRyYW5zaXRpb25pbmc9MTt2YXIgZD1mdW5jdGlvbigpe3RoaXMudHJhbnNpdGlvbmluZz0wLHRoaXMuJGVsZW1lbnQudHJpZ2dlcigiaGlkZGVuLmJzLmNvbGxhcHNlIikucmVtb3ZlQ2xhc3MoImNvbGxhcHNpbmciKS5hZGRDbGFzcygiY29sbGFwc2UiKX07cmV0dXJuIGEuc3VwcG9ydC50cmFuc2l0aW9uP3ZvaWQgdGhpcy4kZWxlbWVudFtjXSgwKS5vbmUoYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGEucHJveHkoZCx0aGlzKSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoMzUwKTpkLmNhbGwodGhpcyl9fX0sYi5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpc1t0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJpbiIpPyJoaWRlIjoic2hvdyJdKCl9O3ZhciBjPWEuZm4uY29sbGFwc2U7YS5mbi5jb2xsYXBzZT1mdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMuY29sbGFwc2UiKSxmPWEuZXh0ZW5kKHt9LGIuREVGQVVMVFMsZC5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBjJiZjKTshZSYmZi50b2dnbGUmJiJzaG93Ij09YyYmKGM9IWMpLGV8fGQuZGF0YSgiYnMuY29sbGFwc2UiLGU9bmV3IGIodGhpcyxmKSksInN0cmluZyI9PXR5cGVvZiBjJiZlW2NdKCl9KX0sYS5mbi5jb2xsYXBzZS5Db25zdHJ1Y3Rvcj1iLGEuZm4uY29sbGFwc2Uubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmNvbGxhcHNlPWMsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLmNvbGxhcHNlLmRhdGEtYXBpIiwiW2RhdGEtdG9nZ2xlPWNvbGxhcHNlXSIsZnVuY3Rpb24oYil7dmFyIGMsZD1hKHRoaXMpLGU9ZC5hdHRyKCJkYXRhLXRhcmdldCIpfHxiLnByZXZlbnREZWZhdWx0KCl8fChjPWQuYXR0cigiaHJlZiIpKSYmYy5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sIiIpLGY9YShlKSxnPWYuZGF0YSgiYnMuY29sbGFwc2UiKSxoPWc/InRvZ2dsZSI6ZC5kYXRhKCksaT1kLmF0dHIoImRhdGEtcGFyZW50Iiksaj1pJiZhKGkpO2cmJmcudHJhbnNpdGlvbmluZ3x8KGomJmouZmluZCgnW2RhdGEtdG9nZ2xlPWNvbGxhcHNlXVtkYXRhLXBhcmVudD0iJytpKyciXScpLm5vdChkKS5hZGRDbGFzcygiY29sbGFwc2VkIiksZFtmLmhhc0NsYXNzKCJpbiIpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oImNvbGxhcHNlZCIpKSxmLmNvbGxhcHNlKGgpfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe2EoZCkucmVtb3ZlKCksYShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YyhhKHRoaXMpKSxlPXtyZWxhdGVkVGFyZ2V0OnRoaXN9O2QuaGFzQ2xhc3MoIm9wZW4iKSYmKGQudHJpZ2dlcihiPWEuRXZlbnQoImhpZGUuYnMuZHJvcGRvd24iLGUpKSxiLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxkLnJlbW92ZUNsYXNzKCJvcGVuIikudHJpZ2dlcigiaGlkZGVuLmJzLmRyb3Bkb3duIixlKSl9KX1mdW5jdGlvbiBjKGIpe3ZhciBjPWIuYXR0cigiZGF0YS10YXJnZXQiKTtjfHwoYz1iLmF0dHIoImhyZWYiKSxjPWMmJi8jW0EtWmEtel0vLnRlc3QoYykmJmMucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSk7dmFyIGQ9YyYmYShjKTtyZXR1cm4gZCYmZC5sZW5ndGg/ZDpiLnBhcmVudCgpfXZhciBkPSIuZHJvcGRvd24tYmFja2Ryb3AiLGU9IltkYXRhLXRvZ2dsZT1kcm9wZG93bl0iLGY9ZnVuY3Rpb24oYil7YShiKS5vbigiY2xpY2suYnMuZHJvcGRvd24iLHRoaXMudG9nZ2xlKX07Zi5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKGQpe3ZhciBlPWEodGhpcyk7aWYoIWUuaXMoIi5kaXNhYmxlZCwgOmRpc2FibGVkIikpe3ZhciBmPWMoZSksZz1mLmhhc0NsYXNzKCJvcGVuIik7aWYoYigpLCFnKXsib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmIWYuY2xvc2VzdCgiLm5hdmJhci1uYXYiKS5sZW5ndGgmJmEoJzxkaXYgY2xhc3M9ImRyb3Bkb3duLWJhY2tkcm9wIi8+JykuaW5zZXJ0QWZ0ZXIoYSh0aGlzKSkub24oImNsaWNrIixiKTt2YXIgaD17cmVsYXRlZFRhcmdldDp0aGlzfTtpZihmLnRyaWdnZXIoZD1hLkV2ZW50KCJzaG93LmJzLmRyb3Bkb3duIixoKSksZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSlyZXR1cm47Zi50b2dnbGVDbGFzcygib3BlbiIpLnRyaWdnZXIoInNob3duLmJzLmRyb3Bkb3duIixoKSxlLmZvY3VzKCl9cmV0dXJuITF9fSxmLnByb3RvdHlwZS5rZXlkb3duPWZ1bmN0aW9uKGIpe2lmKC8oMzh8NDB8MjcpLy50ZXN0KGIua2V5Q29kZSkpe3ZhciBkPWEodGhpcyk7aWYoYi5wcmV2ZW50RGVmYXVsdCgpLGIuc3RvcFByb3BhZ2F0aW9uKCksIWQuaXMoIi5kaXNhYmxlZCwgOmRpc2FibGVkIikpe3ZhciBmPWMoZCksZz1mLmhhc0NsYXNzKCJvcGVuIik7aWYoIWd8fGcmJjI3PT1iLmtleUNvZGUpcmV0dXJuIDI3PT1iLndoaWNoJiZmLmZpbmQoZSkuZm9jdXMoKSxkLmNsaWNrKCk7dmFyIGg9IiBsaTpub3QoLmRpdmlkZXIpOnZpc2libGUgYSIsaT1mLmZpbmQoIltyb2xlPW1lbnVdIitoKyIsIFtyb2xlPWxpc3Rib3hdIitoKTtpZihpLmxlbmd0aCl7dmFyIGo9aS5pbmRleChpLmZpbHRlcigiOmZvY3VzIikpOzM4PT1iLmtleUNvZGUmJmo+MCYmai0tLDQwPT1iLmtleUNvZGUmJmo8aS5sZW5ndGgtMSYmaisrLH5qfHwoaj0wKSxpLmVxKGopLmZvY3VzKCl9fX19O3ZhciBnPWEuZm4uZHJvcGRvd247YS5mbi5kcm9wZG93bj1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWMuZGF0YSgiYnMuZHJvcGRvd24iKTtkfHxjLmRhdGEoImJzLmRyb3Bkb3duIixkPW5ldyBmKHRoaXMpKSwic3RyaW5nIj09dHlwZW9mIGImJmRbYl0uY2FsbChjKX0pfSxhLmZuLmRyb3Bkb3duLkNvbnN0cnVjdG9yPWYsYS5mbi5kcm9wZG93bi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uZHJvcGRvd249Zyx0aGlzfSxhKGRvY3VtZW50KS5vbigiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkiLGIpLm9uKCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaSIsIi5kcm9wZG93biBmb3JtIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSkub24oImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpIixlLGYucHJvdG90eXBlLnRvZ2dsZSkub24oImtleWRvd24uYnMuZHJvcGRvd24uZGF0YS1hcGkiLGUrIiwgW3JvbGU9bWVudV0sIFtyb2xlPWxpc3Rib3hdIixmLnByb3RvdHlwZS5rZXlkb3duKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO3ZhciBiPWZ1bmN0aW9uKGIsYyl7dGhpcy5vcHRpb25zPWMsdGhpcy4kZWxlbWVudD1hKGIpLHRoaXMuJGJhY2tkcm9wPXRoaXMuaXNTaG93bj1udWxsLHRoaXMub3B0aW9ucy5yZW1vdGUmJnRoaXMuJGVsZW1lbnQuZmluZCgiLm1vZGFsLWNvbnRlbnQiKS5sb2FkKHRoaXMub3B0aW9ucy5yZW1vdGUsYS5wcm94eShmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQudHJpZ2dlcigibG9hZGVkLmJzLm1vZGFsIil9LHRoaXMpKX07Yi5ERUZBVUxUUz17YmFja2Ryb3A6ITAsa2V5Ym9hcmQ6ITAsc2hvdzohMH0sYi5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW3RoaXMuaXNTaG93bj8iaGlkZSI6InNob3ciXShhKX0sYi5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihiKXt2YXIgYz10aGlzLGQ9YS5FdmVudCgic2hvdy5icy5tb2RhbCIse3JlbGF0ZWRUYXJnZXQ6Yn0pO3RoaXMuJGVsZW1lbnQudHJpZ2dlcihkKSx0aGlzLmlzU2hvd258fGQuaXNEZWZhdWx0UHJldmVudGVkKCl8fCh0aGlzLmlzU2hvd249ITAsdGhpcy5lc2NhcGUoKSx0aGlzLiRlbGVtZW50Lm9uKCJjbGljay5kaXNtaXNzLmJzLm1vZGFsIiwnW2RhdGEtZGlzbWlzcz0ibW9kYWwiXScsYS5wcm94eSh0aGlzLmhpZGUsdGhpcykpLHRoaXMuYmFja2Ryb3AoZnVuY3Rpb24oKXt2YXIgZD1hLnN1cHBvcnQudHJhbnNpdGlvbiYmYy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpO2MuJGVsZW1lbnQucGFyZW50KCkubGVuZ3RofHxjLiRlbGVtZW50LmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLGMuJGVsZW1lbnQuc2hvdygpLnNjcm9sbFRvcCgwKSxkJiZjLiRlbGVtZW50WzBdLm9mZnNldFdpZHRoLGMuJGVsZW1lbnQuYWRkQ2xhc3MoImluIikuYXR0cigiYXJpYS1oaWRkZW4iLCExKSxjLmVuZm9yY2VGb2N1cygpO3ZhciBlPWEuRXZlbnQoInNob3duLmJzLm1vZGFsIix7cmVsYXRlZFRhcmdldDpifSk7ZD9jLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1kaWFsb2ciKS5vbmUoYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGZ1bmN0aW9uKCl7Yy4kZWxlbWVudC5mb2N1cygpLnRyaWdnZXIoZSl9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZCgzMDApOmMuJGVsZW1lbnQuZm9jdXMoKS50cmlnZ2VyKGUpfSkpfSxiLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKGIpe2ImJmIucHJldmVudERlZmF1bHQoKSxiPWEuRXZlbnQoImhpZGUuYnMubW9kYWwiKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoYiksdGhpcy5pc1Nob3duJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKHRoaXMuaXNTaG93bj0hMSx0aGlzLmVzY2FwZSgpLGEoZG9jdW1lbnQpLm9mZigiZm9jdXNpbi5icy5tb2RhbCIpLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImluIikuYXR0cigiYXJpYS1oaWRkZW4iLCEwKS5vZmYoImNsaWNrLmRpc21pc3MuYnMubW9kYWwiKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpP3RoaXMuJGVsZW1lbnQub25lKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxhLnByb3h5KHRoaXMuaGlkZU1vZGFsLHRoaXMpKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCgzMDApOnRoaXMuaGlkZU1vZGFsKCkpfSxiLnByb3RvdHlwZS5lbmZvcmNlRm9jdXM9ZnVuY3Rpb24oKXthKGRvY3VtZW50KS5vZmYoImZvY3VzaW4uYnMubW9kYWwiKS5vbigiZm9jdXNpbi5icy5tb2RhbCIsYS5wcm94eShmdW5jdGlvbihhKXt0aGlzLiRlbGVtZW50WzBdPT09YS50YXJnZXR8fHRoaXMuJGVsZW1lbnQuaGFzKGEudGFyZ2V0KS5sZW5ndGh8fHRoaXMuJGVsZW1lbnQuZm9jdXMoKX0sdGhpcykpfSxiLnByb3RvdHlwZS5lc2NhcGU9ZnVuY3Rpb24oKXt0aGlzLmlzU2hvd24mJnRoaXMub3B0aW9ucy5rZXlib2FyZD90aGlzLiRlbGVtZW50Lm9uKCJrZXl1cC5kaXNtaXNzLmJzLm1vZGFsIixhLnByb3h5KGZ1bmN0aW9uKGEpezI3PT1hLndoaWNoJiZ0aGlzLmhpZGUoKX0sdGhpcykpOnRoaXMuaXNTaG93bnx8dGhpcy4kZWxlbWVudC5vZmYoImtleXVwLmRpc21pc3MuYnMubW9kYWwiKX0sYi5wcm90b3R5cGUuaGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7YS5yZW1vdmVCYWNrZHJvcCgpLGEuJGVsZW1lbnQudHJpZ2dlcigiaGlkZGVuLmJzLm1vZGFsIil9KX0sYi5wcm90b3R5cGUucmVtb3ZlQmFja2Ryb3A9ZnVuY3Rpb24oKXt0aGlzLiRiYWNrZHJvcCYmdGhpcy4kYmFja2Ryb3AucmVtb3ZlKCksdGhpcy4kYmFja2Ryb3A9bnVsbH0sYi5wcm90b3R5cGUuYmFja2Ryb3A9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpPyJmYWRlIjoiIjtpZih0aGlzLmlzU2hvd24mJnRoaXMub3B0aW9ucy5iYWNrZHJvcCl7dmFyIGQ9YS5zdXBwb3J0LnRyYW5zaXRpb24mJmM7aWYodGhpcy4kYmFja2Ryb3A9YSgnPGRpdiBjbGFzcz0ibW9kYWwtYmFja2Ryb3AgJytjKyciIC8+JykuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSksdGhpcy4kZWxlbWVudC5vbigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIsYS5wcm94eShmdW5jdGlvbihhKXthLnRhcmdldD09PWEuY3VycmVudFRhcmdldCYmKCJzdGF0aWMiPT10aGlzLm9wdGlvbnMuYmFja2Ryb3A/dGhpcy4kZWxlbWVudFswXS5mb2N1cy5jYWxsKHRoaXMuJGVsZW1lbnRbMF0pOnRoaXMuaGlkZS5jYWxsKHRoaXMpKX0sdGhpcykpLGQmJnRoaXMuJGJhY2tkcm9wWzBdLm9mZnNldFdpZHRoLHRoaXMuJGJhY2tkcm9wLmFkZENsYXNzKCJpbiIpLCFiKXJldHVybjtkP3RoaXMuJGJhY2tkcm9wLm9uZShhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsYikuZW11bGF0ZVRyYW5zaXRpb25FbmQoMTUwKTpiKCl9ZWxzZSF0aGlzLmlzU2hvd24mJnRoaXMuJGJhY2tkcm9wPyh0aGlzLiRiYWNrZHJvcC5yZW1vdmVDbGFzcygiaW4iKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpP3RoaXMuJGJhY2tkcm9wLm9uZShhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsYikuZW11bGF0ZVRyYW5zaXRpb25FbmQoMTUwKTpiKCkpOmImJmIoKX07dmFyIGM9YS5mbi5tb2RhbDthLmZuLm1vZGFsPWZ1bmN0aW9uKGMsZCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWEodGhpcyksZj1lLmRhdGEoImJzLm1vZGFsIiksZz1hLmV4dGVuZCh7fSxiLkRFRkFVTFRTLGUuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgYyYmYyk7Znx8ZS5kYXRhKCJicy5tb2RhbCIsZj1uZXcgYih0aGlzLGcpKSwic3RyaW5nIj09dHlwZW9mIGM/ZltjXShkKTpnLnNob3cmJmYuc2hvdyhkKX0pfSxhLmZuLm1vZGFsLkNvbnN0cnVjdG9yPWIsYS5mbi5tb2RhbC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4ubW9kYWw9Yyx0aGlzfSxhKGRvY3VtZW50KS5vbigiY2xpY2suYnMubW9kYWwuZGF0YS1hcGkiLCdbZGF0YS10b2dnbGU9Im1vZGFsIl0nLGZ1bmN0aW9uKGIpe3ZhciBjPWEodGhpcyksZD1jLmF0dHIoImhyZWYiKSxlPWEoYy5hdHRyKCJkYXRhLXRhcmdldCIpfHxkJiZkLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywiIikpLGY9ZS5kYXRhKCJicy5tb2RhbCIpPyJ0b2dnbGUiOmEuZXh0ZW5kKHtyZW1vdGU6IS8jLy50ZXN0KGQpJiZkfSxlLmRhdGEoKSxjLmRhdGEoKSk7Yy5pcygiYSIpJiZiLnByZXZlbnREZWZhdWx0KCksZS5tb2RhbChmLHRoaXMpLm9uZSgiaGlkZSIsZnVuY3Rpb24oKXtjLmlzKCI6dmlzaWJsZSIpJiZjLmZvY3VzKCl9KX0pLGEoZG9jdW1lbnQpLm9uKCJzaG93LmJzLm1vZGFsIiwiLm1vZGFsIixmdW5jdGlvbigpe2EoZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoIm1vZGFsLW9wZW4iKX0pLm9uKCJoaWRkZW4uYnMubW9kYWwiLCIubW9kYWwiLGZ1bmN0aW9uKCl7YShkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcygibW9kYWwtb3BlbiIpfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgYj1mdW5jdGlvbihhLGIpe3RoaXMudHlwZT10aGlzLm9wdGlvbnM9dGhpcy5lbmFibGVkPXRoaXMudGltZW91dD10aGlzLmhvdmVyU3RhdGU9dGhpcy4kZWxlbWVudD1udWxsLHRoaXMuaW5pdCgidG9vbHRpcCIsYSxiKX07Yi5ERUZBVUxUUz17YW5pbWF0aW9uOiEwLHBsYWNlbWVudDoidG9wIixzZWxlY3RvcjohMSx0ZW1wbGF0ZTonPGRpdiBjbGFzcz0idG9vbHRpcCI+PGRpdiBjbGFzcz0idG9vbHRpcC1hcnJvdyI+PC9kaXY+PGRpdiBjbGFzcz0idG9vbHRpcC1pbm5lciI+PC9kaXY+PC9kaXY+Jyx0cmlnZ2VyOiJob3ZlciBmb2N1cyIsdGl0bGU6IiIsZGVsYXk6MCxodG1sOiExLGNvbnRhaW5lcjohMX0sYi5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihiLGMsZCl7dGhpcy5lbmFibGVkPSEwLHRoaXMudHlwZT1iLHRoaXMuJGVsZW1lbnQ9YShjKSx0aGlzLm9wdGlvbnM9dGhpcy5nZXRPcHRpb25zKGQpO2Zvcih2YXIgZT10aGlzLm9wdGlvbnMudHJpZ2dlci5zcGxpdCgiICIpLGY9ZS5sZW5ndGg7Zi0tOyl7dmFyIGc9ZVtmXTtpZigiY2xpY2siPT1nKXRoaXMuJGVsZW1lbnQub24oImNsaWNrLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3RvcixhLnByb3h5KHRoaXMudG9nZ2xlLHRoaXMpKTtlbHNlIGlmKCJtYW51YWwiIT1nKXt2YXIgaD0iaG92ZXIiPT1nPyJtb3VzZWVudGVyIjoiZm9jdXNpbiIsaT0iaG92ZXIiPT1nPyJtb3VzZWxlYXZlIjoiZm9jdXNvdXQiO3RoaXMuJGVsZW1lbnQub24oaCsiLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3RvcixhLnByb3h5KHRoaXMuZW50ZXIsdGhpcykpLHRoaXMuJGVsZW1lbnQub24oaSsiLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3RvcixhLnByb3h5KHRoaXMubGVhdmUsdGhpcykpfX10aGlzLm9wdGlvbnMuc2VsZWN0b3I/dGhpcy5fb3B0aW9ucz1hLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMse3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLmZpeFRpdGxlKCl9LGIucHJvdG90eXBlLmdldERlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIGIuREVGQVVMVFN9LGIucHJvdG90eXBlLmdldE9wdGlvbnM9ZnVuY3Rpb24oYil7cmV0dXJuIGI9YS5leHRlbmQoe30sdGhpcy5nZXREZWZhdWx0cygpLHRoaXMuJGVsZW1lbnQuZGF0YSgpLGIpLGIuZGVsYXkmJiJudW1iZXIiPT10eXBlb2YgYi5kZWxheSYmKGIuZGVsYXk9e3Nob3c6Yi5kZWxheSxoaWRlOmIuZGVsYXl9KSxifSxiLnByb3RvdHlwZS5nZXREZWxlZ2F0ZU9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgYj17fSxjPXRoaXMuZ2V0RGVmYXVsdHMoKTtyZXR1cm4gdGhpcy5fb3B0aW9ucyYmYS5lYWNoKHRoaXMuX29wdGlvbnMsZnVuY3Rpb24oYSxkKXtjW2FdIT1kJiYoYlthXT1kKX0pLGJ9LGIucHJvdG90eXBlLmVudGVyPWZ1bmN0aW9uKGIpe3ZhciBjPWIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2I6YShiLmN1cnJlbnRUYXJnZXQpW3RoaXMudHlwZV0odGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSkuZGF0YSgiYnMuIit0aGlzLnR5cGUpO3JldHVybiBjbGVhclRpbWVvdXQoYy50aW1lb3V0KSxjLmhvdmVyU3RhdGU9ImluIixjLm9wdGlvbnMuZGVsYXkmJmMub3B0aW9ucy5kZWxheS5zaG93P3ZvaWQoYy50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsiaW4iPT1jLmhvdmVyU3RhdGUmJmMuc2hvdygpfSxjLm9wdGlvbnMuZGVsYXkuc2hvdykpOmMuc2hvdygpfSxiLnByb3RvdHlwZS5sZWF2ZT1mdW5jdGlvbihiKXt2YXIgYz1iIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9iOmEoYi5jdXJyZW50VGFyZ2V0KVt0aGlzLnR5cGVdKHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLmRhdGEoImJzLiIrdGhpcy50eXBlKTtyZXR1cm4gY2xlYXJUaW1lb3V0KGMudGltZW91dCksYy5ob3ZlclN0YXRlPSJvdXQiLGMub3B0aW9ucy5kZWxheSYmYy5vcHRpb25zLmRlbGF5LmhpZGU/dm9pZChjLnRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpeyJvdXQiPT1jLmhvdmVyU3RhdGUmJmMuaGlkZSgpfSxjLm9wdGlvbnMuZGVsYXkuaGlkZSkpOmMuaGlkZSgpfSxiLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGI9YS5FdmVudCgic2hvdy5icy4iK3RoaXMudHlwZSk7aWYodGhpcy5oYXNDb250ZW50KCkmJnRoaXMuZW5hYmxlZCl7aWYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGIpLGIuaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO3ZhciBjPXRoaXMsZD10aGlzLnRpcCgpO3RoaXMuc2V0Q29udGVudCgpLHRoaXMub3B0aW9ucy5hbmltYXRpb24mJmQuYWRkQ2xhc3MoImZhZGUiKTt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vcHRpb25zLnBsYWNlbWVudD90aGlzLm9wdGlvbnMucGxhY2VtZW50LmNhbGwodGhpcyxkWzBdLHRoaXMuJGVsZW1lbnRbMF0pOnRoaXMub3B0aW9ucy5wbGFjZW1lbnQsZj0vXHM/YXV0bz9ccz8vaSxnPWYudGVzdChlKTtnJiYoZT1lLnJlcGxhY2UoZiwiIil8fCJ0b3AiKSxkLmRldGFjaCgpLmNzcyh7dG9wOjAsbGVmdDowLGRpc3BsYXk6ImJsb2NrIn0pLmFkZENsYXNzKGUpLHRoaXMub3B0aW9ucy5jb250YWluZXI/ZC5hcHBlbmRUbyh0aGlzLm9wdGlvbnMuY29udGFpbmVyKTpkLmluc2VydEFmdGVyKHRoaXMuJGVsZW1lbnQpO3ZhciBoPXRoaXMuZ2V0UG9zaXRpb24oKSxpPWRbMF0ub2Zmc2V0V2lkdGgsaj1kWzBdLm9mZnNldEhlaWdodDtpZihnKXt2YXIgaz10aGlzLiRlbGVtZW50LnBhcmVudCgpLGw9ZSxtPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLG49ImJvZHkiPT10aGlzLm9wdGlvbnMuY29udGFpbmVyP3dpbmRvdy5pbm5lcldpZHRoOmsub3V0ZXJXaWR0aCgpLG89ImJvZHkiPT10aGlzLm9wdGlvbnMuY29udGFpbmVyP3dpbmRvdy5pbm5lckhlaWdodDprLm91dGVySGVpZ2h0KCkscD0iYm9keSI9PXRoaXMub3B0aW9ucy5jb250YWluZXI/MDprLm9mZnNldCgpLmxlZnQ7ZT0iYm90dG9tIj09ZSYmaC50b3AraC5oZWlnaHQrai1tPm8/InRvcCI6InRvcCI9PWUmJmgudG9wLW0tajwwPyJib3R0b20iOiJyaWdodCI9PWUmJmgucmlnaHQraT5uPyJsZWZ0IjoibGVmdCI9PWUmJmgubGVmdC1pPHA/InJpZ2h0IjplLGQucmVtb3ZlQ2xhc3MobCkuYWRkQ2xhc3MoZSl9dmFyIHE9dGhpcy5nZXRDYWxjdWxhdGVkT2Zmc2V0KGUsaCxpLGopO3RoaXMuYXBwbHlQbGFjZW1lbnQocSxlKSx0aGlzLmhvdmVyU3RhdGU9bnVsbDt2YXIgcj1mdW5jdGlvbigpe2MuJGVsZW1lbnQudHJpZ2dlcigic2hvd24uYnMuIitjLnR5cGUpfTthLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kdGlwLmhhc0NsYXNzKCJmYWRlIik/ZC5vbmUoYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLHIpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKDE1MCk6cigpfX0sYi5wcm90b3R5cGUuYXBwbHlQbGFjZW1lbnQ9ZnVuY3Rpb24oYixjKXt2YXIgZCxlPXRoaXMudGlwKCksZj1lWzBdLm9mZnNldFdpZHRoLGc9ZVswXS5vZmZzZXRIZWlnaHQsaD1wYXJzZUludChlLmNzcygibWFyZ2luLXRvcCIpLDEwKSxpPXBhcnNlSW50KGUuY3NzKCJtYXJnaW4tbGVmdCIpLDEwKTtpc05hTihoKSYmKGg9MCksaXNOYU4oaSkmJihpPTApLGIudG9wPWIudG9wK2gsYi5sZWZ0PWIubGVmdCtpLGEub2Zmc2V0LnNldE9mZnNldChlWzBdLGEuZXh0ZW5kKHt1c2luZzpmdW5jdGlvbihhKXtlLmNzcyh7dG9wOk1hdGgucm91bmQoYS50b3ApLGxlZnQ6TWF0aC5yb3VuZChhLmxlZnQpfSl9fSxiKSwwKSxlLmFkZENsYXNzKCJpbiIpO3ZhciBqPWVbMF0ub2Zmc2V0V2lkdGgsaz1lWzBdLm9mZnNldEhlaWdodDtpZigidG9wIj09YyYmayE9ZyYmKGQ9ITAsYi50b3A9Yi50b3ArZy1rKSwvYm90dG9tfHRvcC8udGVzdChjKSl7dmFyIGw9MDtiLmxlZnQ8MCYmKGw9LTIqYi5sZWZ0LGIubGVmdD0wLGUub2Zmc2V0KGIpLGo9ZVswXS5vZmZzZXRXaWR0aCxrPWVbMF0ub2Zmc2V0SGVpZ2h0KSx0aGlzLnJlcGxhY2VBcnJvdyhsLWYraixqLCJsZWZ0Iil9ZWxzZSB0aGlzLnJlcGxhY2VBcnJvdyhrLWcsaywidG9wIik7ZCYmZS5vZmZzZXQoYil9LGIucHJvdG90eXBlLnJlcGxhY2VBcnJvdz1mdW5jdGlvbihhLGIsYyl7dGhpcy5hcnJvdygpLmNzcyhjLGE/NTAqKDEtYS9iKSsiJSI6IiIpfSxiLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50aXAoKSxiPXRoaXMuZ2V0VGl0bGUoKTthLmZpbmQoIi50b29sdGlwLWlubmVyIilbdGhpcy5vcHRpb25zLmh0bWw/Imh0bWwiOiJ0ZXh0Il0oYiksYS5yZW1vdmVDbGFzcygiZmFkZSBpbiB0b3AgYm90dG9tIGxlZnQgcmlnaHQiKX0sYi5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXsiaW4iIT1jLmhvdmVyU3RhdGUmJmQuZGV0YWNoKCksYy4kZWxlbWVudC50cmlnZ2VyKCJoaWRkZW4uYnMuIitjLnR5cGUpfXZhciBjPXRoaXMsZD10aGlzLnRpcCgpLGU9YS5FdmVudCgiaGlkZS5icy4iK3RoaXMudHlwZSk7cmV0dXJuIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpP3ZvaWQgMDooZC5yZW1vdmVDbGFzcygiaW4iKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kdGlwLmhhc0NsYXNzKCJmYWRlIik/ZC5vbmUoYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGIpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKDE1MCk6YigpLHRoaXMuaG92ZXJTdGF0ZT1udWxsLHRoaXMpfSxiLnByb3RvdHlwZS5maXhUaXRsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQ7KGEuYXR0cigidGl0bGUiKXx8InN0cmluZyIhPXR5cGVvZiBhLmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiKSkmJmEuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIsYS5hdHRyKCJ0aXRsZSIpfHwiIikuYXR0cigidGl0bGUiLCIiKX0sYi5wcm90b3R5cGUuaGFzQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl9LGIucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy4kZWxlbWVudFswXTtyZXR1cm4gYS5leHRlbmQoe30sImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0P2IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6e3dpZHRoOmIub2Zmc2V0V2lkdGgsaGVpZ2h0OmIub2Zmc2V0SGVpZ2h0fSx0aGlzLiRlbGVtZW50Lm9mZnNldCgpKX0sYi5wcm90b3R5cGUuZ2V0Q2FsY3VsYXRlZE9mZnNldD1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4iYm90dG9tIj09YT97dG9wOmIudG9wK2IuaGVpZ2h0LGxlZnQ6Yi5sZWZ0K2Iud2lkdGgvMi1jLzJ9OiJ0b3AiPT1hP3t0b3A6Yi50b3AtZCxsZWZ0OmIubGVmdCtiLndpZHRoLzItYy8yfToibGVmdCI9PWE/e3RvcDpiLnRvcCtiLmhlaWdodC8yLWQvMixsZWZ0OmIubGVmdC1jfTp7dG9wOmIudG9wK2IuaGVpZ2h0LzItZC8yLGxlZnQ6Yi5sZWZ0K2Iud2lkdGh9fSxiLnByb3RvdHlwZS5nZXRUaXRsZT1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcy4kZWxlbWVudCxjPXRoaXMub3B0aW9ucztyZXR1cm4gYT1iLmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiKXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBjLnRpdGxlP2MudGl0bGUuY2FsbChiWzBdKTpjLnRpdGxlKX0sYi5wcm90b3R5cGUudGlwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRpcD10aGlzLiR0aXB8fGEodGhpcy5vcHRpb25zLnRlbXBsYXRlKX0sYi5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLnRvb2x0aXAtYXJyb3ciKX0sYi5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50WzBdLnBhcmVudE5vZGV8fCh0aGlzLmhpZGUoKSx0aGlzLiRlbGVtZW50PW51bGwsdGhpcy5vcHRpb25zPW51bGwpfSxiLnByb3RvdHlwZS5lbmFibGU9ZnVuY3Rpb24oKXt0aGlzLmVuYWJsZWQ9ITB9LGIucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLmVuYWJsZWQ9ITF9LGIucHJvdG90eXBlLnRvZ2dsZUVuYWJsZWQ9ZnVuY3Rpb24oKXt0aGlzLmVuYWJsZWQ9IXRoaXMuZW5hYmxlZH0sYi5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKGIpe3ZhciBjPWI/YShiLmN1cnJlbnRUYXJnZXQpW3RoaXMudHlwZV0odGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSkuZGF0YSgiYnMuIit0aGlzLnR5cGUpOnRoaXM7Yy50aXAoKS5oYXNDbGFzcygiaW4iKT9jLmxlYXZlKGMpOmMuZW50ZXIoYyl9LGIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KSx0aGlzLmhpZGUoKS4kZWxlbWVudC5vZmYoIi4iK3RoaXMudHlwZSkucmVtb3ZlRGF0YSgiYnMuIit0aGlzLnR5cGUpfTt2YXIgYz1hLmZuLnRvb2x0aXA7YS5mbi50b29sdGlwPWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGU9ZC5kYXRhKCJicy50b29sdGlwIiksZj0ib2JqZWN0Ij09dHlwZW9mIGMmJmM7KGV8fCJkZXN0cm95IiE9YykmJihlfHxkLmRhdGEoImJzLnRvb2x0aXAiLGU9bmV3IGIodGhpcyxmKSksInN0cmluZyI9PXR5cGVvZiBjJiZlW2NdKCkpfSl9LGEuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvcj1iLGEuZm4udG9vbHRpcC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4udG9vbHRpcD1jLHRoaXN9fShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7dmFyIGI9ZnVuY3Rpb24oYSxiKXt0aGlzLmluaXQoInBvcG92ZXIiLGEsYil9O2lmKCFhLmZuLnRvb2x0aXApdGhyb3cgbmV3IEVycm9yKCJQb3BvdmVyIHJlcXVpcmVzIHRvb2x0aXAuanMiKTtiLkRFRkFVTFRTPWEuZXh0ZW5kKHt9LGEuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5ERUZBVUxUUyx7cGxhY2VtZW50OiJyaWdodCIsdHJpZ2dlcjoiY2xpY2siLGNvbnRlbnQ6IiIsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InBvcG92ZXIiPjxkaXYgY2xhc3M9ImFycm93Ij48L2Rpdj48aDMgY2xhc3M9InBvcG92ZXItdGl0bGUiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1jb250ZW50Ij48L2Rpdj48L2Rpdj4nfSksYi5wcm90b3R5cGU9YS5leHRlbmQoe30sYS5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSksYi5wcm90b3R5cGUuY29uc3RydWN0b3I9YixiLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBiLkRFRkFVTFRTfSxiLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50aXAoKSxiPXRoaXMuZ2V0VGl0bGUoKSxjPXRoaXMuZ2V0Q29udGVudCgpO2EuZmluZCgiLnBvcG92ZXItdGl0bGUiKVt0aGlzLm9wdGlvbnMuaHRtbD8iaHRtbCI6InRleHQiXShiKSxhLmZpbmQoIi5wb3BvdmVyLWNvbnRlbnQiKVt0aGlzLm9wdGlvbnMuaHRtbD8ic3RyaW5nIj09dHlwZW9mIGM/Imh0bWwiOiJhcHBlbmQiOiJ0ZXh0Il0oYyksYS5yZW1vdmVDbGFzcygiZmFkZSB0b3AgYm90dG9tIGxlZnQgcmlnaHQgaW4iKSxhLmZpbmQoIi5wb3BvdmVyLXRpdGxlIikuaHRtbCgpfHxhLmZpbmQoIi5wb3BvdmVyLXRpdGxlIikuaGlkZSgpfSxiLnByb3RvdHlwZS5oYXNDb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VGl0bGUoKXx8dGhpcy5nZXRDb250ZW50KCl9LGIucHJvdG90eXBlLmdldENvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRlbGVtZW50LGI9dGhpcy5vcHRpb25zO3JldHVybiBhLmF0dHIoImRhdGEtY29udGVudCIpfHwoImZ1bmN0aW9uIj09dHlwZW9mIGIuY29udGVudD9iLmNvbnRlbnQuY2FsbChhWzBdKTpiLmNvbnRlbnQpfSxiLnByb3RvdHlwZS5hcnJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRhcnJvdz10aGlzLiRhcnJvd3x8dGhpcy50aXAoKS5maW5kKCIuYXJyb3ciKX0sYi5wcm90b3R5cGUudGlwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRpcHx8KHRoaXMuJHRpcD1hKHRoaXMub3B0aW9ucy50ZW1wbGF0ZSkpLHRoaXMuJHRpcH07dmFyIGM9YS5mbi5wb3BvdmVyO2EuZm4ucG9wb3Zlcj1mdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMucG9wb3ZlciIpLGY9Im9iamVjdCI9PXR5cGVvZiBjJiZjOyhlfHwiZGVzdHJveSIhPWMpJiYoZXx8ZC5kYXRhKCJicy5wb3BvdmVyIixlPW5ldyBiKHRoaXMsZikpLCJzdHJpbmciPT10eXBlb2YgYyYmZVtjXSgpKX0pfSxhLmZuLnBvcG92ZXIuQ29uc3RydWN0b3I9YixhLmZuLnBvcG92ZXIubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLnBvcG92ZXI9Yyx0aGlzfX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYyxkKXt2YXIgZSxmPWEucHJveHkodGhpcy5wcm9jZXNzLHRoaXMpO3RoaXMuJGVsZW1lbnQ9YShhKGMpLmlzKCJib2R5Iik/d2luZG93OmMpLHRoaXMuJGJvZHk9YSgiYm9keSIpLHRoaXMuJHNjcm9sbEVsZW1lbnQ9dGhpcy4kZWxlbWVudC5vbigic2Nyb2xsLmJzLnNjcm9sbC1zcHkuZGF0YS1hcGkiLGYpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxiLkRFRkFVTFRTLGQpLHRoaXMuc2VsZWN0b3I9KHRoaXMub3B0aW9ucy50YXJnZXR8fChlPWEoYykuYXR0cigiaHJlZiIpKSYmZS5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sIiIpfHwiIikrIiAubmF2IGxpID4gYSIsdGhpcy5vZmZzZXRzPWEoW10pLHRoaXMudGFyZ2V0cz1hKFtdKSx0aGlzLmFjdGl2ZVRhcmdldD1udWxsLHRoaXMucmVmcmVzaCgpLHRoaXMucHJvY2VzcygpfWIuREVGQVVMVFM9e29mZnNldDoxMH0sYi5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe3ZhciBiPXRoaXMuJGVsZW1lbnRbMF09PXdpbmRvdz8ib2Zmc2V0IjoicG9zaXRpb24iO3RoaXMub2Zmc2V0cz1hKFtdKSx0aGlzLnRhcmdldHM9YShbXSk7e3ZhciBjPXRoaXM7dGhpcy4kYm9keS5maW5kKHRoaXMuc2VsZWN0b3IpLm1hcChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoInRhcmdldCIpfHxkLmF0dHIoImhyZWYiKSxmPS9eIy4vLnRlc3QoZSkmJmEoZSk7cmV0dXJuIGYmJmYubGVuZ3RoJiZmLmlzKCI6dmlzaWJsZSIpJiZbW2ZbYl0oKS50b3ArKCFhLmlzV2luZG93KGMuJHNjcm9sbEVsZW1lbnQuZ2V0KDApKSYmYy4kc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3AoKSksZV1dfHxudWxsfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhWzBdLWJbMF19KS5lYWNoKGZ1bmN0aW9uKCl7Yy5vZmZzZXRzLnB1c2godGhpc1swXSksYy50YXJnZXRzLnB1c2godGhpc1sxXSl9KX19LGIucHJvdG90eXBlLnByb2Nlc3M9ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMuJHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wKCkrdGhpcy5vcHRpb25zLm9mZnNldCxjPXRoaXMuJHNjcm9sbEVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0fHx0aGlzLiRib2R5WzBdLnNjcm9sbEhlaWdodCxkPWMtdGhpcy4kc2Nyb2xsRWxlbWVudC5oZWlnaHQoKSxlPXRoaXMub2Zmc2V0cyxmPXRoaXMudGFyZ2V0cyxnPXRoaXMuYWN0aXZlVGFyZ2V0O2lmKGI+PWQpcmV0dXJuIGchPShhPWYubGFzdCgpWzBdKSYmdGhpcy5hY3RpdmF0ZShhKTtpZihnJiZiPD1lWzBdKXJldHVybiBnIT0oYT1mWzBdKSYmdGhpcy5hY3RpdmF0ZShhKTtmb3IoYT1lLmxlbmd0aDthLS07KWchPWZbYV0mJmI+PWVbYV0mJighZVthKzFdfHxiPD1lW2ErMV0pJiZ0aGlzLmFjdGl2YXRlKGZbYV0pfSxiLnByb3RvdHlwZS5hY3RpdmF0ZT1mdW5jdGlvbihiKXt0aGlzLmFjdGl2ZVRhcmdldD1iLGEodGhpcy5zZWxlY3RvcikucGFyZW50c1VudGlsKHRoaXMub3B0aW9ucy50YXJnZXQsIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7dmFyIGM9dGhpcy5zZWxlY3RvcisnW2RhdGEtdGFyZ2V0PSInK2IrJyJdLCcrdGhpcy5zZWxlY3RvcisnW2hyZWY9IicrYisnIl0nLGQ9YShjKS5wYXJlbnRzKCJsaSIpLmFkZENsYXNzKCJhY3RpdmUiKTtkLnBhcmVudCgiLmRyb3Bkb3duLW1lbnUiKS5sZW5ndGgmJihkPWQuY2xvc2VzdCgibGkuZHJvcGRvd24iKS5hZGRDbGFzcygiYWN0aXZlIikpLGQudHJpZ2dlcigiYWN0aXZhdGUuYnMuc2Nyb2xsc3B5Iil9O3ZhciBjPWEuZm4uc2Nyb2xsc3B5O2EuZm4uc2Nyb2xsc3B5PWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGU9ZC5kYXRhKCJicy5zY3JvbGxzcHkiKSxmPSJvYmplY3QiPT10eXBlb2YgYyYmYztlfHxkLmRhdGEoImJzLnNjcm9sbHNweSIsZT1uZXcgYih0aGlzLGYpKSwic3RyaW5nIj09dHlwZW9mIGMmJmVbY10oKX0pfSxhLmZuLnNjcm9sbHNweS5Db25zdHJ1Y3Rvcj1iLGEuZm4uc2Nyb2xsc3B5Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5zY3JvbGxzcHk9Yyx0aGlzfSxhKHdpbmRvdykub24oImxvYWQiLGZ1bmN0aW9uKCl7YSgnW2RhdGEtc3B5PSJzY3JvbGwiXScpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2Iuc2Nyb2xsc3B5KGIuZGF0YSgpKX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgYj1mdW5jdGlvbihiKXt0aGlzLmVsZW1lbnQ9YShiKX07Yi5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudCxjPWIuY2xvc2VzdCgidWw6bm90KC5kcm9wZG93bi1tZW51KSIpLGQ9Yi5kYXRhKCJ0YXJnZXQiKTtpZihkfHwoZD1iLmF0dHIoImhyZWYiKSxkPWQmJmQucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSksIWIucGFyZW50KCJsaSIpLmhhc0NsYXNzKCJhY3RpdmUiKSl7dmFyIGU9Yy5maW5kKCIuYWN0aXZlOmxhc3QgYSIpWzBdLGY9YS5FdmVudCgic2hvdy5icy50YWIiLHtyZWxhdGVkVGFyZ2V0OmV9KTtpZihiLnRyaWdnZXIoZiksIWYuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBnPWEoZCk7dGhpcy5hY3RpdmF0ZShiLnBhcmVudCgibGkiKSxjKSx0aGlzLmFjdGl2YXRlKGcsZy5wYXJlbnQoKSxmdW5jdGlvbigpe2IudHJpZ2dlcih7dHlwZToic2hvd24uYnMudGFiIixyZWxhdGVkVGFyZ2V0OmV9KX0pfX19LGIucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKGIsYyxkKXtmdW5jdGlvbiBlKCl7Zi5yZW1vdmVDbGFzcygiYWN0aXZlIikuZmluZCgiPiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksYi5hZGRDbGFzcygiYWN0aXZlIiksZz8oYlswXS5vZmZzZXRXaWR0aCxiLmFkZENsYXNzKCJpbiIpKTpiLnJlbW92ZUNsYXNzKCJmYWRlIiksYi5wYXJlbnQoIi5kcm9wZG93bi1tZW51IikmJmIuY2xvc2VzdCgibGkuZHJvcGRvd24iKS5hZGRDbGFzcygiYWN0aXZlIiksZCYmZCgpfXZhciBmPWMuZmluZCgiPiAuYWN0aXZlIiksZz1kJiZhLnN1cHBvcnQudHJhbnNpdGlvbiYmZi5oYXNDbGFzcygiZmFkZSIpO2c/Zi5vbmUoYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKDE1MCk6ZSgpLGYucmVtb3ZlQ2xhc3MoImluIil9O3ZhciBjPWEuZm4udGFiO2EuZm4udGFiPWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGU9ZC5kYXRhKCJicy50YWIiKTtlfHxkLmRhdGEoImJzLnRhYiIsZT1uZXcgYih0aGlzKSksInN0cmluZyI9PXR5cGVvZiBjJiZlW2NdKCl9KX0sYS5mbi50YWIuQ29uc3RydWN0b3I9YixhLmZuLnRhYi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4udGFiPWMsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLnRhYi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0idGFiIl0sIFtkYXRhLXRvZ2dsZT0icGlsbCJdJyxmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCksYSh0aGlzKS50YWIoInNob3ciKX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7dmFyIGI9ZnVuY3Rpb24oYyxkKXt0aGlzLm9wdGlvbnM9YS5leHRlbmQoe30sYi5ERUZBVUxUUyxkKSx0aGlzLiR3aW5kb3c9YSh3aW5kb3cpLm9uKCJzY3JvbGwuYnMuYWZmaXguZGF0YS1hcGkiLGEucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uLHRoaXMpKS5vbigiY2xpY2suYnMuYWZmaXguZGF0YS1hcGkiLGEucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uV2l0aEV2ZW50TG9vcCx0aGlzKSksdGhpcy4kZWxlbWVudD1hKGMpLHRoaXMuYWZmaXhlZD10aGlzLnVucGluPXRoaXMucGlubmVkT2Zmc2V0PW51bGwsdGhpcy5jaGVja1Bvc2l0aW9uKCl9O2IuUkVTRVQ9ImFmZml4IGFmZml4LXRvcCBhZmZpeC1ib3R0b20iLGIuREVGQVVMVFM9e29mZnNldDowfSxiLnByb3RvdHlwZS5nZXRQaW5uZWRPZmZzZXQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBpbm5lZE9mZnNldClyZXR1cm4gdGhpcy5waW5uZWRPZmZzZXQ7dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhiLlJFU0VUKS5hZGRDbGFzcygiYWZmaXgiKTt2YXIgYT10aGlzLiR3aW5kb3cuc2Nyb2xsVG9wKCksYz10aGlzLiRlbGVtZW50Lm9mZnNldCgpO3JldHVybiB0aGlzLnBpbm5lZE9mZnNldD1jLnRvcC1hfSxiLnByb3RvdHlwZS5jaGVja1Bvc2l0aW9uV2l0aEV2ZW50TG9vcD1mdW5jdGlvbigpe3NldFRpbWVvdXQoYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sdGhpcyksMSl9LGIucHJvdG90eXBlLmNoZWNrUG9zaXRpb249ZnVuY3Rpb24oKXtpZih0aGlzLiRlbGVtZW50LmlzKCI6dmlzaWJsZSIpKXt2YXIgYz1hKGRvY3VtZW50KS5oZWlnaHQoKSxkPXRoaXMuJHdpbmRvdy5zY3JvbGxUb3AoKSxlPXRoaXMuJGVsZW1lbnQub2Zmc2V0KCksZj10aGlzLm9wdGlvbnMub2Zmc2V0LGc9Zi50b3AsaD1mLmJvdHRvbTsidG9wIj09dGhpcy5hZmZpeGVkJiYoZS50b3ArPWQpLCJvYmplY3QiIT10eXBlb2YgZiYmKGg9Zz1mKSwiZnVuY3Rpb24iPT10eXBlb2YgZyYmKGc9Zi50b3AodGhpcy4kZWxlbWVudCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBoJiYoaD1mLmJvdHRvbSh0aGlzLiRlbGVtZW50KSk7dmFyIGk9bnVsbCE9dGhpcy51bnBpbiYmZCt0aGlzLnVucGluPD1lLnRvcD8hMTpudWxsIT1oJiZlLnRvcCt0aGlzLiRlbGVtZW50LmhlaWdodCgpPj1jLWg/ImJvdHRvbSI6bnVsbCE9ZyYmZz49ZD8idG9wIjohMTtpZih0aGlzLmFmZml4ZWQhPT1pKXt0aGlzLnVucGluJiZ0aGlzLiRlbGVtZW50LmNzcygidG9wIiwiIik7dmFyIGo9ImFmZml4IisoaT8iLSIraToiIiksaz1hLkV2ZW50KGorIi5icy5hZmZpeCIpO3RoaXMuJGVsZW1lbnQudHJpZ2dlcihrKSxrLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwodGhpcy5hZmZpeGVkPWksdGhpcy51bnBpbj0iYm90dG9tIj09aT90aGlzLmdldFBpbm5lZE9mZnNldCgpOm51bGwsdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhiLlJFU0VUKS5hZGRDbGFzcyhqKS50cmlnZ2VyKGEuRXZlbnQoai5yZXBsYWNlKCJhZmZpeCIsImFmZml4ZWQiKSkpLCJib3R0b20iPT1pJiZ0aGlzLiRlbGVtZW50Lm9mZnNldCh7dG9wOmMtaC10aGlzLiRlbGVtZW50LmhlaWdodCgpfSkpfX19O3ZhciBjPWEuZm4uYWZmaXg7YS5mbi5hZmZpeD1mdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMuYWZmaXgiKSxmPSJvYmplY3QiPT10eXBlb2YgYyYmYztlfHxkLmRhdGEoImJzLmFmZml4IixlPW5ldyBiKHRoaXMsZikpLCJzdHJpbmciPT10eXBlb2YgYyYmZVtjXSgpfSl9LGEuZm4uYWZmaXguQ29uc3RydWN0b3I9YixhLmZuLmFmZml4Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5hZmZpeD1jLHRoaXN9LGEod2luZG93KS5vbigibG9hZCIsZnVuY3Rpb24oKXthKCdbZGF0YS1zcHk9ImFmZml4Il0nKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxjPWIuZGF0YSgpO2Mub2Zmc2V0PWMub2Zmc2V0fHx7fSxjLm9mZnNldEJvdHRvbSYmKGMub2Zmc2V0LmJvdHRvbT1jLm9mZnNldEJvdHRvbSksYy5vZmZzZXRUb3AmJihjLm9mZnNldC50b3A9Yy5vZmZzZXRUb3ApLGIuYWZmaXgoYyl9KX0pfShqUXVlcnkpOw==')
},
{
'name': '/app/lib/js/lodash.js', 'data': base64.b64decode(b'LyoqCiAqIEBsaWNlbnNlCiAqIExvLURhc2ggMi40LjEgKEN1c3RvbSBCdWlsZCkgPGh0dHA6Ly9sb2Rhc2guY29tLz4KICogQnVpbGQ6IGBsb2Rhc2ggbW9kZXJuIC1vIC4vZGlzdC9sb2Rhc2guanNgCiAqIENvcHlyaWdodCAyMDEyLTIwMTMgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+CiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS41LjIgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+CiAqIENvcHlyaWdodCAyMDA5LTIwMTMgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnMKICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwOi8vbG9kYXNoLmNvbS9saWNlbnNlPgogKi8KOyhmdW5jdGlvbigpIHsKCiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlIEVTNSBlbnZpcm9ubWVudHMgKi8KICB2YXIgdW5kZWZpbmVkOwoKICAvKiogVXNlZCB0byBwb29sIGFycmF5cyBhbmQgb2JqZWN0cyB1c2VkIGludGVybmFsbHkgKi8KICB2YXIgYXJyYXlQb29sID0gW10sCiAgICAgIG9iamVjdFBvb2wgPSBbXTsKCiAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcyAqLwogIHZhciBpZENvdW50ZXIgPSAwOwoKICAvKiogVXNlZCB0byBwcmVmaXgga2V5cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBgX19wcm90b19fYCBhbmQgcHJvcGVydGllcyBvbiBgT2JqZWN0LnByb3RvdHlwZWAgKi8KICB2YXIga2V5UHJlZml4ID0gK25ldyBEYXRlICsgJyc7CgogIC8qKiBVc2VkIGFzIHRoZSBzaXplIHdoZW4gb3B0aW1pemF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgbGFyZ2UgYXJyYXlzICovCiAgdmFyIGxhcmdlQXJyYXlTaXplID0gNzU7CgogIC8qKiBVc2VkIGFzIHRoZSBtYXggc2l6ZSBvZiB0aGUgYGFycmF5UG9vbGAgYW5kIGBvYmplY3RQb29sYCAqLwogIHZhciBtYXhQb29sU2l6ZSA9IDQwOwoKICAvKiogVXNlZCB0byBkZXRlY3QgYW5kIHRlc3Qgd2hpdGVzcGFjZSAqLwogIHZhciB3aGl0ZXNwYWNlID0gKAogICAgLy8gd2hpdGVzcGFjZQogICAgJyBcdFx4MEJcZlx4QTBcdWZlZmYnICsKCiAgICAvLyBsaW5lIHRlcm1pbmF0b3JzCiAgICAnXG5cclx1MjAyOFx1MjAyOScgKwoKICAgIC8vIHVuaWNvZGUgY2F0ZWdvcnkgIlpzIiBzcGFjZSBzZXBhcmF0b3JzCiAgICAnXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwJwogICk7CgogIC8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UgKi8KICB2YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmcgPSAvXGJfX3AgXCs9ICcnOy9nLAogICAgICByZUVtcHR5U3RyaW5nTWlkZGxlID0gL1xiKF9fcCBcKz0pICcnIFwrL2csCiAgICAgIHJlRW1wdHlTdHJpbmdUcmFpbGluZyA9IC8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7CgogIC8qKgogICAqIFVzZWQgdG8gbWF0Y2ggRVM2IHRlbXBsYXRlIGRlbGltaXRlcnMKICAgKiBodHRwOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1saXRlcmFscy1zdHJpbmctbGl0ZXJhbHMKICAgKi8KICB2YXIgcmVFc1RlbXBsYXRlID0gL1wkXHsoW15cXH1dKig/OlxcLlteXFx9XSopKilcfS9nOwoKICAvKiogVXNlZCB0byBtYXRjaCByZWdleHAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMgKi8KICB2YXIgcmVGbGFncyA9IC9cdyokLzsKCiAgLyoqIFVzZWQgdG8gZGV0ZWN0ZWQgbmFtZWQgZnVuY3Rpb25zICovCiAgdmFyIHJlRnVuY05hbWUgPSAvXlxzKmZ1bmN0aW9uWyBcblxyXHRdK1x3LzsKCiAgLyoqIFVzZWQgdG8gbWF0Y2ggImludGVycG9sYXRlIiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzICovCiAgdmFyIHJlSW50ZXJwb2xhdGUgPSAvPCU9KFtcc1xTXSs/KSU+L2c7CgogIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgemVyb3MgdG8gYmUgcmVtb3ZlZCAqLwogIHZhciByZUxlYWRpbmdTcGFjZXNBbmRaZXJvcyA9IFJlZ0V4cCgnXlsnICsgd2hpdGVzcGFjZSArICddKjArKD89LiQpJyk7CgogIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycyAqLwogIHZhciByZU5vTWF0Y2ggPSAvKCReKS87CgogIC8qKiBVc2VkIHRvIGRldGVjdCBmdW5jdGlvbnMgY29udGFpbmluZyBhIGB0aGlzYCByZWZlcmVuY2UgKi8KICB2YXIgcmVUaGlzID0gL1xidGhpc1xiLzsKCiAgLyoqIFVzZWQgdG8gbWF0Y2ggdW5lc2NhcGVkIGNoYXJhY3RlcnMgaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzICovCiAgdmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXG5cclx0XHUyMDI4XHUyMDI5XFxdL2c7CgogIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcyAqLwogIHZhciBjb250ZXh0UHJvcHMgPSBbCiAgICAnQXJyYXknLCAnQm9vbGVhbicsICdEYXRlJywgJ0Z1bmN0aW9uJywgJ01hdGgnLCAnTnVtYmVyJywgJ09iamVjdCcsCiAgICAnUmVnRXhwJywgJ1N0cmluZycsICdfJywgJ2F0dGFjaEV2ZW50JywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdpc05hTicsCiAgICAncGFyc2VJbnQnLCAnc2V0VGltZW91dCcKICBdOwoKICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5ICovCiAgdmFyIHRlbXBsYXRlQ291bnRlciA9IDA7CgogIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgc2hvcnRjdXRzICovCiAgdmFyIGFyZ3NDbGFzcyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLAogICAgICBhcnJheUNsYXNzID0gJ1tvYmplY3QgQXJyYXldJywKICAgICAgYm9vbENsYXNzID0gJ1tvYmplY3QgQm9vbGVhbl0nLAogICAgICBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXScsCiAgICAgIGZ1bmNDbGFzcyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsCiAgICAgIG51bWJlckNsYXNzID0gJ1tvYmplY3QgTnVtYmVyXScsCiAgICAgIG9iamVjdENsYXNzID0gJ1tvYmplY3QgT2JqZWN0XScsCiAgICAgIHJlZ2V4cENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXScsCiAgICAgIHN0cmluZ0NsYXNzID0gJ1tvYmplY3QgU3RyaW5nXSc7CgogIC8qKiBVc2VkIHRvIGlkZW50aWZ5IG9iamVjdCBjbGFzc2lmaWNhdGlvbnMgdGhhdCBgXy5jbG9uZWAgc3VwcG9ydHMgKi8KICB2YXIgY2xvbmVhYmxlQ2xhc3NlcyA9IHt9OwogIGNsb25lYWJsZUNsYXNzZXNbZnVuY0NsYXNzXSA9IGZhbHNlOwogIGNsb25lYWJsZUNsYXNzZXNbYXJnc0NsYXNzXSA9IGNsb25lYWJsZUNsYXNzZXNbYXJyYXlDbGFzc10gPQogIGNsb25lYWJsZUNsYXNzZXNbYm9vbENsYXNzXSA9IGNsb25lYWJsZUNsYXNzZXNbZGF0ZUNsYXNzXSA9CiAgY2xvbmVhYmxlQ2xhc3Nlc1tudW1iZXJDbGFzc10gPSBjbG9uZWFibGVDbGFzc2VzW29iamVjdENsYXNzXSA9CiAgY2xvbmVhYmxlQ2xhc3Nlc1tyZWdleHBDbGFzc10gPSBjbG9uZWFibGVDbGFzc2VzW3N0cmluZ0NsYXNzXSA9IHRydWU7CgogIC8qKiBVc2VkIGFzIGFuIGludGVybmFsIGBfLmRlYm91bmNlYCBvcHRpb25zIG9iamVjdCAqLwogIHZhciBkZWJvdW5jZU9wdGlvbnMgPSB7CiAgICAnbGVhZGluZyc6IGZhbHNlLAogICAgJ21heFdhaXQnOiAwLAogICAgJ3RyYWlsaW5nJzogZmFsc2UKICB9OwoKICAvKiogVXNlZCBhcyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYF9fYmluZERhdGFfX2AgKi8KICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICdjb25maWd1cmFibGUnOiBmYWxzZSwKICAgICdlbnVtZXJhYmxlJzogZmFsc2UsCiAgICAndmFsdWUnOiBudWxsLAogICAgJ3dyaXRhYmxlJzogZmFsc2UKICB9OwoKICAvKiogVXNlZCB0byBkZXRlcm1pbmUgaWYgdmFsdWVzIGFyZSBvZiB0aGUgbGFuZ3VhZ2UgdHlwZSBPYmplY3QgKi8KICB2YXIgb2JqZWN0VHlwZXMgPSB7CiAgICAnYm9vbGVhbic6IGZhbHNlLAogICAgJ2Z1bmN0aW9uJzogdHJ1ZSwKICAgICdvYmplY3QnOiB0cnVlLAogICAgJ251bWJlcic6IGZhbHNlLAogICAgJ3N0cmluZyc6IGZhbHNlLAogICAgJ3VuZGVmaW5lZCc6IGZhbHNlCiAgfTsKCiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMgKi8KICB2YXIgc3RyaW5nRXNjYXBlcyA9IHsKICAgICdcXCc6ICdcXCcsCiAgICAiJyI6ICInIiwKICAgICdcbic6ICduJywKICAgICdccic6ICdyJywKICAgICdcdCc6ICd0JywKICAgICdcdTIwMjgnOiAndTIwMjgnLAogICAgJ1x1MjAyOSc6ICd1MjAyOScKICB9OwoKICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCAqLwogIHZhciByb290ID0gKG9iamVjdFR5cGVzW3R5cGVvZiB3aW5kb3ddICYmIHdpbmRvdykgfHwgdGhpczsKCiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYCAqLwogIHZhciBmcmVlRXhwb3J0cyA9IG9iamVjdFR5cGVzW3R5cGVvZiBleHBvcnRzXSAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7CgogIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYCAqLwogIHZhciBmcmVlTW9kdWxlID0gb2JqZWN0VHlwZXNbdHlwZW9mIG1vZHVsZV0gJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlOwoKICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgICovCiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHMgJiYgZnJlZUV4cG9ydHM7CgogIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMgb3IgQnJvd3NlcmlmaWVkIGNvZGUgYW5kIHVzZSBpdCBhcyBgcm9vdGAgKi8KICB2YXIgZnJlZUdsb2JhbCA9IG9iamVjdFR5cGVzW3R5cGVvZiBnbG9iYWxdICYmIGdsb2JhbDsKICBpZiAoZnJlZUdsb2JhbCAmJiAoZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHwgZnJlZUdsb2JhbC53aW5kb3cgPT09IGZyZWVHbG9iYWwpKSB7CiAgICByb290ID0gZnJlZUdsb2JhbDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAvKioKICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGJpbmFyeSBzZWFyY2hlcwogICAqIG9yIGBmcm9tSW5kZXhgIGNvbnN0cmFpbnRzLgogICAqCiAgICogQHByaXZhdGUKICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLgogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgogICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAtMWAuCiAgICovCiAgZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHsKICAgIHZhciBpbmRleCA9IChmcm9tSW5kZXggfHwgMCkgLSAxLAogICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKCiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkgewogICAgICAgIHJldHVybiBpbmRleDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgLyoqCiAgICogQW4gaW1wbGVtZW50YXRpb24gb2YgYF8uY29udGFpbnNgIGZvciBjYWNoZSBvYmplY3RzIHRoYXQgbWltaWNzIHRoZSByZXR1cm4KICAgKiBzaWduYXR1cmUgb2YgYF8uaW5kZXhPZmAgYnkgcmV0dXJuaW5nIGAwYCBpZiB0aGUgdmFsdWUgaXMgZm91bmQsIGVsc2UgYC0xYC4KICAgKgogICAqIEBwcml2YXRlCiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSBvYmplY3QgdG8gaW5zcGVjdC4KICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgogICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYDBgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYC0xYC4KICAgKi8KICBmdW5jdGlvbiBjYWNoZUluZGV4T2YoY2FjaGUsIHZhbHVlKSB7CiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKICAgIGNhY2hlID0gY2FjaGUuY2FjaGU7CgogICAgaWYgKHR5cGUgPT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09IG51bGwpIHsKICAgICAgcmV0dXJuIGNhY2hlW3ZhbHVlXSA/IDAgOiAtMTsKICAgIH0KICAgIGlmICh0eXBlICE9ICdudW1iZXInICYmIHR5cGUgIT0gJ3N0cmluZycpIHsKICAgICAgdHlwZSA9ICdvYmplY3QnOwogICAgfQogICAgdmFyIGtleSA9IHR5cGUgPT0gJ251bWJlcicgPyB2YWx1ZSA6IGtleVByZWZpeCArIHZhbHVlOwogICAgY2FjaGUgPSAoY2FjaGUgPSBjYWNoZVt0eXBlXSkgJiYgY2FjaGVba2V5XTsKCiAgICByZXR1cm4gdHlwZSA9PSAnb2JqZWN0JwogICAgICA/IChjYWNoZSAmJiBiYXNlSW5kZXhPZihjYWNoZSwgdmFsdWUpID4gLTEgPyAwIDogLTEpCiAgICAgIDogKGNhY2hlID8gMCA6IC0xKTsKICB9CgogIC8qKgogICAqIEFkZHMgYSBnaXZlbiB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSBvYmplY3QuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgY2FjaGUuCiAgICovCiAgZnVuY3Rpb24gY2FjaGVQdXNoKHZhbHVlKSB7CiAgICB2YXIgY2FjaGUgPSB0aGlzLmNhY2hlLAogICAgICAgIHR5cGUgPSB0eXBlb2YgdmFsdWU7CgogICAgaWYgKHR5cGUgPT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09IG51bGwpIHsKICAgICAgY2FjaGVbdmFsdWVdID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0eXBlICE9ICdudW1iZXInICYmIHR5cGUgIT0gJ3N0cmluZycpIHsKICAgICAgICB0eXBlID0gJ29iamVjdCc7CiAgICAgIH0KICAgICAgdmFyIGtleSA9IHR5cGUgPT0gJ251bWJlcicgPyB2YWx1ZSA6IGtleVByZWZpeCArIHZhbHVlLAogICAgICAgICAgdHlwZUNhY2hlID0gY2FjaGVbdHlwZV0gfHwgKGNhY2hlW3R5cGVdID0ge30pOwoKICAgICAgaWYgKHR5cGUgPT0gJ29iamVjdCcpIHsKICAgICAgICAodHlwZUNhY2hlW2tleV0gfHwgKHR5cGVDYWNoZVtrZXldID0gW10pKS5wdXNoKHZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0eXBlQ2FjaGVba2V5XSA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIFVzZWQgYnkgYF8ubWF4YCBhbmQgYF8ubWluYCBhcyB0aGUgZGVmYXVsdCBjYWxsYmFjayB3aGVuIGEgZ2l2ZW4KICAgKiBjb2xsZWN0aW9uIGlzIGEgc3RyaW5nIHZhbHVlLgogICAqCiAgICogQHByaXZhdGUKICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVGhlIGNoYXJhY3RlciB0byBpbnNwZWN0LgogICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvZGUgdW5pdCBvZiBnaXZlbiBjaGFyYWN0ZXIuCiAgICovCiAgZnVuY3Rpb24gY2hhckF0Q2FsbGJhY2sodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZS5jaGFyQ29kZUF0KDApOwogIH0KCiAgLyoqCiAgICogVXNlZCBieSBgc29ydEJ5YCB0byBjb21wYXJlIHRyYW5zZm9ybWVkIGBjb2xsZWN0aW9uYCBlbGVtZW50cywgc3RhYmxlIHNvcnRpbmcKICAgKiB0aGVtIGluIGFzY2VuZGluZyBvcmRlci4KICAgKgogICAqIEBwcml2YXRlCiAgICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBjb21wYXJlIHRvIGBiYC4KICAgKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8gYGFgLgogICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIG9mIGAxYCBvciBgLTFgLgogICAqLwogIGZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcoYSwgYikgewogICAgdmFyIGFjID0gYS5jcml0ZXJpYSwKICAgICAgICBiYyA9IGIuY3JpdGVyaWEsCiAgICAgICAgaW5kZXggPSAtMSwKICAgICAgICBsZW5ndGggPSBhYy5sZW5ndGg7CgogICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgdmFyIHZhbHVlID0gYWNbaW5kZXhdLAogICAgICAgICAgb3RoZXIgPSBiY1tpbmRleF07CgogICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7CiAgICAgICAgaWYgKHZhbHVlID4gb3RoZXIgfHwgdHlwZW9mIHZhbHVlID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlIDwgb3RoZXIgfHwgdHlwZW9mIG90aGVyID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zCiAgICAvLyB0aGF0IGNhdXNlcyBpdCwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0byByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yCiAgICAvLyBgYWAgYW5kIGBiYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDcKICAgIC8vCiAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLgogICAgLy8gU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwCiAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgY2FjaGUgb2JqZWN0IHRvIG9wdGltaXplIGxpbmVhciBzZWFyY2hlcyBvZiBsYXJnZSBhcnJheXMuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIHNlYXJjaC4KICAgKiBAcmV0dXJucyB7bnVsbHxPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIG9iamVjdCBvciBgbnVsbGAgaWYgY2FjaGluZyBzaG91bGQgbm90IGJlIHVzZWQuCiAgICovCiAgZnVuY3Rpb24gY3JlYXRlQ2FjaGUoYXJyYXkpIHsKICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCwKICAgICAgICBmaXJzdCA9IGFycmF5WzBdLAogICAgICAgIG1pZCA9IGFycmF5WyhsZW5ndGggLyAyKSB8IDBdLAogICAgICAgIGxhc3QgPSBhcnJheVtsZW5ndGggLSAxXTsKCiAgICBpZiAoZmlyc3QgJiYgdHlwZW9mIGZpcnN0ID09ICdvYmplY3QnICYmCiAgICAgICAgbWlkICYmIHR5cGVvZiBtaWQgPT0gJ29iamVjdCcgJiYgbGFzdCAmJiB0eXBlb2YgbGFzdCA9PSAnb2JqZWN0JykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB2YXIgY2FjaGUgPSBnZXRPYmplY3QoKTsKICAgIGNhY2hlWydmYWxzZSddID0gY2FjaGVbJ251bGwnXSA9IGNhY2hlWyd0cnVlJ10gPSBjYWNoZVsndW5kZWZpbmVkJ10gPSBmYWxzZTsKCiAgICB2YXIgcmVzdWx0ID0gZ2V0T2JqZWN0KCk7CiAgICByZXN1bHQuYXJyYXkgPSBhcnJheTsKICAgIHJlc3VsdC5jYWNoZSA9IGNhY2hlOwogICAgcmVzdWx0LnB1c2ggPSBjYWNoZVB1c2g7CgogICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaW5kZXhdKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBVc2VkIGJ5IGB0ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZAogICAqIHN0cmluZyBsaXRlcmFscy4KICAgKgogICAqIEBwcml2YXRlCiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuCiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuCiAgICovCiAgZnVuY3Rpb24gZXNjYXBlU3RyaW5nQ2hhcihtYXRjaCkgewogICAgcmV0dXJuICdcXCcgKyBzdHJpbmdFc2NhcGVzW21hdGNoXTsKICB9CgogIC8qKgogICAqIEdldHMgYW4gYXJyYXkgZnJvbSB0aGUgYXJyYXkgcG9vbCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiB0aGUgcG9vbCBpcyBlbXB0eS4KICAgKgogICAqIEBwcml2YXRlCiAgICogQHJldHVybnMge0FycmF5fSBUaGUgYXJyYXkgZnJvbSB0aGUgcG9vbC4KICAgKi8KICBmdW5jdGlvbiBnZXRBcnJheSgpIHsKICAgIHJldHVybiBhcnJheVBvb2wucG9wKCkgfHwgW107CiAgfQoKICAvKioKICAgKiBHZXRzIGFuIG9iamVjdCBmcm9tIHRoZSBvYmplY3QgcG9vbCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiB0aGUgcG9vbCBpcyBlbXB0eS4KICAgKgogICAqIEBwcml2YXRlCiAgICogQHJldHVybnMge09iamVjdH0gVGhlIG9iamVjdCBmcm9tIHRoZSBwb29sLgogICAqLwogIGZ1bmN0aW9uIGdldE9iamVjdCgpIHsKICAgIHJldHVybiBvYmplY3RQb29sLnBvcCgpIHx8IHsKICAgICAgJ2FycmF5JzogbnVsbCwKICAgICAgJ2NhY2hlJzogbnVsbCwKICAgICAgJ2NyaXRlcmlhJzogbnVsbCwKICAgICAgJ2ZhbHNlJzogZmFsc2UsCiAgICAgICdpbmRleCc6IDAsCiAgICAgICdudWxsJzogZmFsc2UsCiAgICAgICdudW1iZXInOiBudWxsLAogICAgICAnb2JqZWN0JzogbnVsbCwKICAgICAgJ3B1c2gnOiBudWxsLAogICAgICAnc3RyaW5nJzogbnVsbCwKICAgICAgJ3RydWUnOiBmYWxzZSwKICAgICAgJ3VuZGVmaW5lZCc6IGZhbHNlLAogICAgICAndmFsdWUnOiBudWxsCiAgICB9OwogIH0KCiAgLyoqCiAgICogUmVsZWFzZXMgdGhlIGdpdmVuIGFycmF5IGJhY2sgdG8gdGhlIGFycmF5IHBvb2wuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIHJlbGVhc2UuCiAgICovCiAgZnVuY3Rpb24gcmVsZWFzZUFycmF5KGFycmF5KSB7CiAgICBhcnJheS5sZW5ndGggPSAwOwogICAgaWYgKGFycmF5UG9vbC5sZW5ndGggPCBtYXhQb29sU2l6ZSkgewogICAgICBhcnJheVBvb2wucHVzaChhcnJheSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZWxlYXNlcyB0aGUgZ2l2ZW4gb2JqZWN0IGJhY2sgdG8gdGhlIG9iamVjdCBwb29sLgogICAqCiAgICogQHByaXZhdGUKICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byByZWxlYXNlLgogICAqLwogIGZ1bmN0aW9uIHJlbGVhc2VPYmplY3Qob2JqZWN0KSB7CiAgICB2YXIgY2FjaGUgPSBvYmplY3QuY2FjaGU7CiAgICBpZiAoY2FjaGUpIHsKICAgICAgcmVsZWFzZU9iamVjdChjYWNoZSk7CiAgICB9CiAgICBvYmplY3QuYXJyYXkgPSBvYmplY3QuY2FjaGUgPSBvYmplY3QuY3JpdGVyaWEgPSBvYmplY3Qub2JqZWN0ID0gb2JqZWN0Lm51bWJlciA9IG9iamVjdC5zdHJpbmcgPSBvYmplY3QudmFsdWUgPSBudWxsOwogICAgaWYgKG9iamVjdFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHsKICAgICAgb2JqZWN0UG9vbC5wdXNoKG9iamVjdCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBTbGljZXMgdGhlIGBjb2xsZWN0aW9uYCBmcm9tIHRoZSBgc3RhcnRgIGluZGV4IHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywKICAgKiB0aGUgYGVuZGAgaW5kZXguCiAgICoKICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBgQXJyYXkjc2xpY2VgIHRvIHN1cHBvcnQgbm9kZSBsaXN0cwogICAqIGluIElFIDwgOSBhbmQgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmUgcmV0dXJuZWQuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzbGljZS4KICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IGluZGV4LgogICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBpbmRleC4KICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheS4KICAgKi8KICBmdW5jdGlvbiBzbGljZShhcnJheSwgc3RhcnQsIGVuZCkgewogICAgc3RhcnQgfHwgKHN0YXJ0ID0gMCk7CiAgICBpZiAodHlwZW9mIGVuZCA9PSAndW5kZWZpbmVkJykgewogICAgICBlbmQgPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CiAgICB9CiAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydCB8fCAwLAogICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCA8IDAgPyAwIDogbGVuZ3RoKTsKCiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICByZXN1bHRbaW5kZXhdID0gYXJyYXlbc3RhcnQgKyBpbmRleF07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogIC8qKgogICAqIENyZWF0ZSBhIG5ldyBgbG9kYXNoYCBmdW5jdGlvbiB1c2luZyB0aGUgZ2l2ZW4gY29udGV4dCBvYmplY3QuCiAgICoKICAgKiBAc3RhdGljCiAgICogQG1lbWJlck9mIF8KICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCiAgICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0PXJvb3RdIFRoZSBjb250ZXh0IG9iamVjdC4KICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLgogICAqLwogIGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7CiAgICAvLyBBdm9pZCBpc3N1ZXMgd2l0aCBzb21lIEVTMyBlbnZpcm9ubWVudHMgdGhhdCBhdHRlbXB0IHRvIHVzZSB2YWx1ZXMsIG5hbWVkCiAgICAvLyBhZnRlciBidWlsdC1pbiBjb25zdHJ1Y3RvcnMgbGlrZSBgT2JqZWN0YCwgZm9yIHRoZSBjcmVhdGlvbiBvZiBsaXRlcmFscy4KICAgIC8vIEVTNSBjbGVhcnMgdGhpcyB1cCBieSBzdGF0aW5nIHRoYXQgbGl0ZXJhbHMgbXVzdCB1c2UgYnVpbHQtaW4gY29uc3RydWN0b3JzLgogICAgLy8gU2VlIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTEuMS41LgogICAgY29udGV4dCA9IGNvbnRleHQgPyBfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksIGNvbnRleHQsIF8ucGljayhyb290LCBjb250ZXh0UHJvcHMpKSA6IHJvb3Q7CgogICAgLyoqIE5hdGl2ZSBjb25zdHJ1Y3RvciByZWZlcmVuY2VzICovCiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LAogICAgICAgIEJvb2xlYW4gPSBjb250ZXh0LkJvb2xlYW4sCiAgICAgICAgRGF0ZSA9IGNvbnRleHQuRGF0ZSwKICAgICAgICBGdW5jdGlvbiA9IGNvbnRleHQuRnVuY3Rpb24sCiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCwKICAgICAgICBOdW1iZXIgPSBjb250ZXh0Lk51bWJlciwKICAgICAgICBPYmplY3QgPSBjb250ZXh0Lk9iamVjdCwKICAgICAgICBSZWdFeHAgPSBjb250ZXh0LlJlZ0V4cCwKICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZywKICAgICAgICBUeXBlRXJyb3IgPSBjb250ZXh0LlR5cGVFcnJvcjsKCiAgICAvKioKICAgICAqIFVzZWQgZm9yIGBBcnJheWAgbWV0aG9kIHJlZmVyZW5jZXMuCiAgICAgKgogICAgICogTm9ybWFsbHkgYEFycmF5LnByb3RvdHlwZWAgd291bGQgc3VmZmljZSwgaG93ZXZlciwgdXNpbmcgYW4gYXJyYXkgbGl0ZXJhbAogICAgICogYXZvaWRzIGlzc3VlcyBpbiBOYXJ3aGFsLgogICAgICovCiAgICB2YXIgYXJyYXlSZWYgPSBbXTsKCiAgICAvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzICovCiAgICB2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOwoKICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYG5vQ29uZmxpY3RgICovCiAgICB2YXIgb2xkRGFzaCA9IGNvbnRleHQuXzsKCiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBpbnRlcm5hbCBbW0NsYXNzXV0gb2YgdmFsdWVzICovCiAgICB2YXIgdG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZzsKCiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlICovCiAgICB2YXIgcmVOYXRpdmUgPSBSZWdFeHAoJ14nICsKICAgICAgU3RyaW5nKHRvU3RyaW5nKQogICAgICAgIC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKQogICAgICAgIC5yZXBsYWNlKC90b1N0cmluZ3wgZm9yIFteXF1dKy9nLCAnLio/JykgKyAnJCcKICAgICk7CgogICAgLyoqIE5hdGl2ZSBtZXRob2Qgc2hvcnRjdXRzICovCiAgICB2YXIgY2VpbCA9IE1hdGguY2VpbCwKICAgICAgICBjbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCwKICAgICAgICBmbG9vciA9IE1hdGguZmxvb3IsCiAgICAgICAgZm5Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICBnZXRQcm90b3R5cGVPZiA9IGlzTmF0aXZlKGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKSAmJiBnZXRQcm90b3R5cGVPZiwKICAgICAgICBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5LAogICAgICAgIHB1c2ggPSBhcnJheVJlZi5wdXNoLAogICAgICAgIHNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQsCiAgICAgICAgc3BsaWNlID0gYXJyYXlSZWYuc3BsaWNlLAogICAgICAgIHVuc2hpZnQgPSBhcnJheVJlZi51bnNoaWZ0OwoKICAgIC8qKiBVc2VkIHRvIHNldCBtZXRhIGRhdGEgb24gZnVuY3Rpb25zICovCiAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7CiAgICAgIC8vIElFIDggb25seSBhY2NlcHRzIERPTSBlbGVtZW50cwogICAgICB0cnkgewogICAgICAgIHZhciBvID0ge30sCiAgICAgICAgICAgIGZ1bmMgPSBpc05hdGl2ZShmdW5jID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KSAmJiBmdW5jLAogICAgICAgICAgICByZXN1bHQgPSBmdW5jKG8sIG8sIG8pICYmIGZ1bmM7CiAgICAgIH0gY2F0Y2goZSkgeyB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9KCkpOwoKICAgIC8qIE5hdGl2ZSBtZXRob2Qgc2hvcnRjdXRzIGZvciBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzICovCiAgICB2YXIgbmF0aXZlQ3JlYXRlID0gaXNOYXRpdmUobmF0aXZlQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSkgJiYgbmF0aXZlQ3JlYXRlLAogICAgICAgIG5hdGl2ZUlzQXJyYXkgPSBpc05hdGl2ZShuYXRpdmVJc0FycmF5ID0gQXJyYXkuaXNBcnJheSkgJiYgbmF0aXZlSXNBcnJheSwKICAgICAgICBuYXRpdmVJc0Zpbml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsCiAgICAgICAgbmF0aXZlSXNOYU4gPSBjb250ZXh0LmlzTmFOLAogICAgICAgIG5hdGl2ZUtleXMgPSBpc05hdGl2ZShuYXRpdmVLZXlzID0gT2JqZWN0LmtleXMpICYmIG5hdGl2ZUtleXMsCiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsCiAgICAgICAgbmF0aXZlTWluID0gTWF0aC5taW4sCiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LAogICAgICAgIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tOwoKICAgIC8qKiBVc2VkIHRvIGxvb2t1cCBhIGJ1aWx0LWluIGNvbnN0cnVjdG9yIGJ5IFtbQ2xhc3NdXSAqLwogICAgdmFyIGN0b3JCeUNsYXNzID0ge307CiAgICBjdG9yQnlDbGFzc1thcnJheUNsYXNzXSA9IEFycmF5OwogICAgY3RvckJ5Q2xhc3NbYm9vbENsYXNzXSA9IEJvb2xlYW47CiAgICBjdG9yQnlDbGFzc1tkYXRlQ2xhc3NdID0gRGF0ZTsKICAgIGN0b3JCeUNsYXNzW2Z1bmNDbGFzc10gPSBGdW5jdGlvbjsKICAgIGN0b3JCeUNsYXNzW29iamVjdENsYXNzXSA9IE9iamVjdDsKICAgIGN0b3JCeUNsYXNzW251bWJlckNsYXNzXSA9IE51bWJlcjsKICAgIGN0b3JCeUNsYXNzW3JlZ2V4cENsYXNzXSA9IFJlZ0V4cDsKICAgIGN0b3JCeUNsYXNzW3N0cmluZ0NsYXNzXSA9IFN0cmluZzsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgdGhlIGdpdmVuIHZhbHVlIHRvIGVuYWJsZSBpbnR1aXRpdmUKICAgICAqIG1ldGhvZCBjaGFpbmluZy4KICAgICAqCiAgICAgKiBJbiBhZGRpdGlvbiB0byBMby1EYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGFsc28gaGF2ZSB0aGUgZm9sbG93aW5nIGBBcnJheWAgbWV0aG9kczoKICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGByZXZlcnNlYCwgYHNoaWZ0YCwgYHNsaWNlYCwgYHNvcnRgLCBgc3BsaWNlYCwKICAgICAqIGFuZCBgdW5zaGlmdGAKICAgICAqCiAgICAgKiBDaGFpbmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VzdG9tIGJ1aWxkcyBhcyBsb25nIGFzIHRoZSBgdmFsdWVgIG1ldGhvZCBpcwogICAgICogaW1wbGljaXRseSBvciBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC4KICAgICAqCiAgICAgKiBUaGUgY2hhaW5hYmxlIHdyYXBwZXIgZnVuY3Rpb25zIGFyZToKICAgICAqIGBhZnRlcmAsIGBhc3NpZ25gLCBgYmluZGAsIGBiaW5kQWxsYCwgYGJpbmRLZXlgLCBgY2hhaW5gLCBgY29tcGFjdGAsCiAgICAgKiBgY29tcG9zZWAsIGBjb25jYXRgLCBgY291bnRCeWAsIGBjcmVhdGVgLCBgY3JlYXRlQ2FsbGJhY2tgLCBgY3VycnlgLAogICAgICogYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmVyYCwgYGRlbGF5YCwgYGRpZmZlcmVuY2VgLCBgZmlsdGVyYCwgYGZsYXR0ZW5gLAogICAgICogYGZvckVhY2hgLCBgZm9yRWFjaFJpZ2h0YCwgYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwKICAgICAqIGBmdW5jdGlvbnNgLCBgZ3JvdXBCeWAsIGBpbmRleEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludmVydGAsCiAgICAgKiBgaW52b2tlYCwgYGtleXNgLCBgbWFwYCwgYG1heGAsIGBtZW1vaXplYCwgYG1lcmdlYCwgYG1pbmAsIGBvYmplY3RgLCBgb21pdGAsCiAgICAgKiBgb25jZWAsIGBwYWlyc2AsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwaWNrYCwgYHBsdWNrYCwgYHB1bGxgLCBgcHVzaGAsCiAgICAgKiBgcmFuZ2VgLCBgcmVqZWN0YCwgYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2h1ZmZsZWAsIGBzbGljZWAsIGBzb3J0YCwKICAgICAqIGBzb3J0QnlgLCBgc3BsaWNlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aW1lc2AsIGB0b0FycmF5YCwgYHRyYW5zZm9ybWAsCiAgICAgKiBgdW5pb25gLCBgdW5pcWAsIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHZhbHVlc2AsIGB3aGVyZWAsIGB3aXRob3V0YCwgYHdyYXBgLAogICAgICogYW5kIGB6aXBgCiAgICAgKgogICAgICogVGhlIG5vbi1jaGFpbmFibGUgd3JhcHBlciBmdW5jdGlvbnMgYXJlOgogICAgICogYGNsb25lYCwgYGNsb25lRGVlcGAsIGBjb250YWluc2AsIGBlc2NhcGVgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLAogICAgICogYGZpbmRLZXlgLCBgZmluZExhc3RgLCBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBoYXNgLCBgaWRlbnRpdHlgLAogICAgICogYGluZGV4T2ZgLCBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0Jvb2xlYW5gLCBgaXNEYXRlYCwgYGlzRWxlbWVudGAsCiAgICAgKiBgaXNFbXB0eWAsIGBpc0VxdWFsYCwgYGlzRmluaXRlYCwgYGlzRnVuY3Rpb25gLCBgaXNOYU5gLCBgaXNOdWxsYCwgYGlzTnVtYmVyYCwKICAgICAqIGBpc09iamVjdGAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwgYGpvaW5gLAogICAgICogYGxhc3RJbmRleE9mYCwgYG1peGluYCwgYG5vQ29uZmxpY3RgLCBgcGFyc2VJbnRgLCBgcG9wYCwgYHJhbmRvbWAsIGByZWR1Y2VgLAogICAgICogYHJlZHVjZVJpZ2h0YCwgYHJlc3VsdGAsIGBzaGlmdGAsIGBzaXplYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgcnVuSW5Db250ZXh0YCwKICAgICAqIGB0ZW1wbGF0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGFuZCBgdmFsdWVgCiAgICAgKgogICAgICogVGhlIHdyYXBwZXIgZnVuY3Rpb25zIGBmaXJzdGAgYW5kIGBsYXN0YCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgd2hlbiBgbmAgaXMKICAgICAqIHByb3ZpZGVkLCBvdGhlcndpc2UgdGhleSByZXR1cm4gdW53cmFwcGVkIHZhbHVlcy4KICAgICAqCiAgICAgKiBFeHBsaWNpdCBjaGFpbmluZyBjYW4gYmUgZW5hYmxlZCBieSB1c2luZyB0aGUgYF8uY2hhaW5gIG1ldGhvZC4KICAgICAqCiAgICAgKiBAbmFtZSBfCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhIGBsb2Rhc2hgIGluc3RhbmNlLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTsKICAgICAqCiAgICAgKiAvLyByZXR1cm5zIGFuIHVud3JhcHBlZCB2YWx1ZQogICAgICogd3JhcHBlZC5yZWR1Y2UoZnVuY3Rpb24oc3VtLCBudW0pIHsKICAgICAqICAgcmV0dXJuIHN1bSArIG51bTsKICAgICAqIH0pOwogICAgICogLy8gPT4gNgogICAgICoKICAgICAqIC8vIHJldHVybnMgYSB3cmFwcGVkIHZhbHVlCiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKGZ1bmN0aW9uKG51bSkgewogICAgICogICByZXR1cm4gbnVtICogbnVtOwogICAgICogfSk7CiAgICAgKgogICAgICogXy5pc0FycmF5KHNxdWFyZXMpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqCiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcy52YWx1ZSgpKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqLwogICAgZnVuY3Rpb24gbG9kYXNoKHZhbHVlKSB7CiAgICAgIC8vIGRvbid0IHdyYXAgaWYgYWxyZWFkeSB3cmFwcGVkLCBldmVuIGlmIHdyYXBwZWQgYnkgYSBkaWZmZXJlbnQgYGxvZGFzaGAgY29uc3RydWN0b3IKICAgICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgIWlzQXJyYXkodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKQogICAgICAgPyB2YWx1ZQogICAgICAgOiBuZXcgbG9kYXNoV3JhcHBlcih2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBIGZhc3QgcGF0aCBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoYWluQWxsIEEgZmxhZyB0byBlbmFibGUgY2hhaW5pbmcgZm9yIGFsbCBtZXRob2RzCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGEgYGxvZGFzaGAgaW5zdGFuY2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWluQWxsKSB7CiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDsKICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlOwogICAgfQogICAgLy8gZW5zdXJlIGBuZXcgbG9kYXNoV3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGxvZGFzaGAKICAgIGxvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gbG9kYXNoLnByb3RvdHlwZTsKCiAgICAvKioKICAgICAqIEFuIG9iamVjdCB1c2VkIHRvIGZsYWcgZW52aXJvbm1lbnRzIGZlYXR1cmVzLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAdHlwZSBPYmplY3QKICAgICAqLwogICAgdmFyIHN1cHBvcnQgPSBsb2Rhc2guc3VwcG9ydCA9IHt9OwoKICAgIC8qKgogICAgICogRGV0ZWN0IGlmIGZ1bmN0aW9ucyBjYW4gYmUgZGVjb21waWxlZCBieSBgRnVuY3Rpb24jdG9TdHJpbmdgCiAgICAgKiAoYWxsIGJ1dCBQUzMgYW5kIG9sZGVyIE9wZXJhIG1vYmlsZSBicm93c2VycyAmIGF2b2lkZWQgaW4gV2luZG93cyA4IGFwcHMpLgogICAgICoKICAgICAqIEBtZW1iZXJPZiBfLnN1cHBvcnQKICAgICAqIEB0eXBlIGJvb2xlYW4KICAgICAqLwogICAgc3VwcG9ydC5mdW5jRGVjb21wID0gIWlzTmF0aXZlKGNvbnRleHQuV2luUlRFcnJvcikgJiYgcmVUaGlzLnRlc3QocnVuSW5Db250ZXh0KTsKCiAgICAvKioKICAgICAqIERldGVjdCBpZiBgRnVuY3Rpb24jbmFtZWAgaXMgc3VwcG9ydGVkIChhbGwgYnV0IElFKS4KICAgICAqCiAgICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0CiAgICAgKiBAdHlwZSBib29sZWFuCiAgICAgKi8KICAgIHN1cHBvcnQuZnVuY05hbWVzID0gdHlwZW9mIEZ1bmN0aW9uLm5hbWUgPT0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IExvLURhc2ggYXJlIHNpbWlsYXIgdG8gdGhvc2UgaW4KICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikuIENoYW5nZSB0aGUgZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZQogICAgICogZGVsaW1pdGVycy4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHR5cGUgT2JqZWN0CiAgICAgKi8KICAgIGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzID0gewoKICAgICAgLyoqCiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gYmUgSFRNTC1lc2NhcGVkLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzCiAgICAgICAqIEB0eXBlIFJlZ0V4cAogICAgICAgKi8KICAgICAgJ2VzY2FwZSc6IC88JS0oW1xzXFNdKz8pJT4vZywKCiAgICAgIC8qKgogICAgICAgKiBVc2VkIHRvIGRldGVjdCBjb2RlIHRvIGJlIGV2YWx1YXRlZC4KICAgICAgICoKICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncwogICAgICAgKiBAdHlwZSBSZWdFeHAKICAgICAgICovCiAgICAgICdldmFsdWF0ZSc6IC88JShbXHNcU10rPyklPi9nLAoKICAgICAgLyoqCiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gaW5qZWN0LgogICAgICAgKgogICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzCiAgICAgICAqIEB0eXBlIFJlZ0V4cAogICAgICAgKi8KICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSwKCiAgICAgIC8qKgogICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MKICAgICAgICogQHR5cGUgc3RyaW5nCiAgICAgICAqLwogICAgICAndmFyaWFibGUnOiAnJywKCiAgICAgIC8qKgogICAgICAgKiBVc2VkIHRvIGltcG9ydCB2YXJpYWJsZXMgaW50byB0aGUgY29tcGlsZWQgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MKICAgICAgICogQHR5cGUgT2JqZWN0CiAgICAgICAqLwogICAgICAnaW1wb3J0cyc6IHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzCiAgICAgICAgICogQHR5cGUgRnVuY3Rpb24KICAgICAgICAgKi8KICAgICAgICAnXyc6IGxvZGFzaAogICAgICB9CiAgICB9OwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYmluZGAgdGhhdCBjcmVhdGVzIHRoZSBib3VuZCBmdW5jdGlvbiBhbmQKICAgICAqIHNldHMgaXRzIG1ldGEgZGF0YS4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheX0gYmluZERhdGEgVGhlIGJpbmQgZGF0YSBhcnJheS4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlQmluZChiaW5kRGF0YSkgewogICAgICB2YXIgZnVuYyA9IGJpbmREYXRhWzBdLAogICAgICAgICAgcGFydGlhbEFyZ3MgPSBiaW5kRGF0YVsyXSwKICAgICAgICAgIHRoaXNBcmcgPSBiaW5kRGF0YVs0XTsKCiAgICAgIGZ1bmN0aW9uIGJvdW5kKCkgewogICAgICAgIC8vIGBGdW5jdGlvbiNiaW5kYCBzcGVjCiAgICAgICAgLy8gaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4zLjQuNQogICAgICAgIGlmIChwYXJ0aWFsQXJncykgewogICAgICAgICAgLy8gYXZvaWQgYGFyZ3VtZW50c2Agb2JqZWN0IGRlb3B0aW1pemF0aW9ucyBieSB1c2luZyBgc2xpY2VgIGluc3RlYWQKICAgICAgICAgIC8vIG9mIGBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbGAgYW5kIG5vdCBhc3NpZ25pbmcgYGFyZ3VtZW50c2AgdG8gYQogICAgICAgICAgLy8gdmFyaWFibGUgYXMgYSB0ZXJuYXJ5IGV4cHJlc3Npb24KICAgICAgICAgIHZhciBhcmdzID0gc2xpY2UocGFydGlhbEFyZ3MpOwogICAgICAgICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICAvLyBtaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvcgogICAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTMuMi4yCiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkgewogICAgICAgICAgLy8gZW5zdXJlIGBuZXcgYm91bmRgIGlzIGFuIGluc3RhbmNlIG9mIGBmdW5jYAogICAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShmdW5jLnByb3RvdHlwZSksCiAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQmluZGluZywgYXJncyB8fCBhcmd1bWVudHMpOwogICAgICAgICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiB0aGlzQmluZGluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyB8fCBhcmd1bWVudHMpOwogICAgICB9CiAgICAgIHNldEJpbmREYXRhKGJvdW5kLCBiaW5kRGF0YSk7CiAgICAgIHJldHVybiBib3VuZDsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCB3aXRob3V0IGFyZ3VtZW50IGp1Z2dsaW5nIG9yIHN1cHBvcnQKICAgICAqIGZvciBgdGhpc0FyZ2AgYmluZGluZy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXA9ZmFsc2VdIFNwZWNpZnkgYSBkZWVwIGNsb25lLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcgdmFsdWVzLgogICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQT1bXV0gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2Ugb2JqZWN0cy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgY2xvbmVzIHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgaXNEZWVwLCBjYWxsYmFjaywgc3RhY2tBLCBzdGFja0IpIHsKICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlKTsKICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gaW5zcGVjdCBbW0NsYXNzXV0KICAgICAgdmFyIGlzT2JqID0gaXNPYmplY3QodmFsdWUpOwogICAgICBpZiAoaXNPYmopIHsKICAgICAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbCh2YWx1ZSk7CiAgICAgICAgaWYgKCFjbG9uZWFibGVDbGFzc2VzW2NsYXNzTmFtZV0pIHsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgdmFyIGN0b3IgPSBjdG9yQnlDbGFzc1tjbGFzc05hbWVdOwogICAgICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7CiAgICAgICAgICBjYXNlIGJvb2xDbGFzczoKICAgICAgICAgIGNhc2UgZGF0ZUNsYXNzOgogICAgICAgICAgICByZXR1cm4gbmV3IGN0b3IoK3ZhbHVlKTsKCiAgICAgICAgICBjYXNlIG51bWJlckNsYXNzOgogICAgICAgICAgY2FzZSBzdHJpbmdDbGFzczoKICAgICAgICAgICAgcmV0dXJuIG5ldyBjdG9yKHZhbHVlKTsKCiAgICAgICAgICBjYXNlIHJlZ2V4cENsYXNzOgogICAgICAgICAgICByZXN1bHQgPSBjdG9yKHZhbHVlLnNvdXJjZSwgcmVGbGFncy5leGVjKHZhbHVlKSk7CiAgICAgICAgICAgIHJlc3VsdC5sYXN0SW5kZXggPSB2YWx1ZS5sYXN0SW5kZXg7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTsKICAgICAgaWYgKGlzRGVlcCkgewogICAgICAgIC8vIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gY29ycmVzcG9uZGluZyBjbG9uZQogICAgICAgIHZhciBpbml0ZWRTdGFjayA9ICFzdGFja0E7CiAgICAgICAgc3RhY2tBIHx8IChzdGFja0EgPSBnZXRBcnJheSgpKTsKICAgICAgICBzdGFja0IgfHwgKHN0YWNrQiA9IGdldEFycmF5KCkpOwoKICAgICAgICB2YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDsKICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICAgIGlmIChzdGFja0FbbGVuZ3RoXSA9PSB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gc3RhY2tCW2xlbmd0aF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGlzQXJyID8gY3Rvcih2YWx1ZS5sZW5ndGgpIDoge307CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gaXNBcnIgPyBzbGljZSh2YWx1ZSkgOiBhc3NpZ24oe30sIHZhbHVlKTsKICAgICAgfQogICAgICAvLyBhZGQgYXJyYXkgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgCiAgICAgIGlmIChpc0FycikgewogICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnaW5kZXgnKSkgewogICAgICAgICAgcmVzdWx0LmluZGV4ID0gdmFsdWUuaW5kZXg7CiAgICAgICAgfQogICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnaW5wdXQnKSkgewogICAgICAgICAgcmVzdWx0LmlucHV0ID0gdmFsdWUuaW5wdXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGV4aXQgZm9yIHNoYWxsb3cgY2xvbmUKICAgICAgaWYgKCFpc0RlZXApIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIC8vIGFkZCB0aGUgc291cmNlIHZhbHVlIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cwogICAgICAvLyBhbmQgYXNzb2NpYXRlIGl0IHdpdGggaXRzIGNsb25lCiAgICAgIHN0YWNrQS5wdXNoKHZhbHVlKTsKICAgICAgc3RhY2tCLnB1c2gocmVzdWx0KTsKCiAgICAgIC8vIHJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykKICAgICAgKGlzQXJyID8gZm9yRWFjaCA6IGZvck93bikodmFsdWUsIGZ1bmN0aW9uKG9ialZhbHVlLCBrZXkpIHsKICAgICAgICByZXN1bHRba2V5XSA9IGJhc2VDbG9uZShvYmpWYWx1ZSwgaXNEZWVwLCBjYWxsYmFjaywgc3RhY2tBLCBzdGFja0IpOwogICAgICB9KTsKCiAgICAgIGlmIChpbml0ZWRTdGFjaykgewogICAgICAgIHJlbGVhc2VBcnJheShzdGFja0EpOwogICAgICAgIHJlbGVhc2VBcnJheShzdGFja0IpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nCiAgICAgKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VDcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7CiAgICAgIHJldHVybiBpc09iamVjdChwcm90b3R5cGUpID8gbmF0aXZlQ3JlYXRlKHByb3RvdHlwZSkgOiB7fTsKICAgIH0KICAgIC8vIGZhbGxiYWNrIGZvciBicm93c2VycyB3aXRob3V0IGBPYmplY3QuY3JlYXRlYAogICAgaWYgKCFuYXRpdmVDcmVhdGUpIHsKICAgICAgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBPYmplY3QoKSB7fQogICAgICAgIHJldHVybiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgICAgIGlmIChpc09iamVjdChwcm90b3R5cGUpKSB7CiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUgPSBwcm90b3R5cGU7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgT2JqZWN0OwogICAgICAgICAgICBPYmplY3QucHJvdG90eXBlID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQgfHwgY29udGV4dC5PYmplY3QoKTsKICAgICAgICB9OwogICAgICB9KCkpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlQ2FsbGJhY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY3JlYXRpbmcKICAgICAqICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2tzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IFtmdW5jPWlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGNhbGxiYWNrLgogICAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdDb3VudF0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIGNhbGxiYWNrIGFjY2VwdHMuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZUNyZWF0ZUNhbGxiYWNrKGZ1bmMsIHRoaXNBcmcsIGFyZ0NvdW50KSB7CiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aXR5OwogICAgICB9CiAgICAgIC8vIGV4aXQgZWFybHkgZm9yIG5vIGB0aGlzQXJnYCBvciBhbHJlYWR5IGJvdW5kIGJ5IGBGdW5jdGlvbiNiaW5kYAogICAgICBpZiAodHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcgfHwgISgncHJvdG90eXBlJyBpbiBmdW5jKSkgewogICAgICAgIHJldHVybiBmdW5jOwogICAgICB9CiAgICAgIHZhciBiaW5kRGF0YSA9IGZ1bmMuX19iaW5kRGF0YV9fOwogICAgICBpZiAodHlwZW9mIGJpbmREYXRhID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgaWYgKHN1cHBvcnQuZnVuY05hbWVzKSB7CiAgICAgICAgICBiaW5kRGF0YSA9ICFmdW5jLm5hbWU7CiAgICAgICAgfQogICAgICAgIGJpbmREYXRhID0gYmluZERhdGEgfHwgIXN1cHBvcnQuZnVuY0RlY29tcDsKICAgICAgICBpZiAoIWJpbmREYXRhKSB7CiAgICAgICAgICB2YXIgc291cmNlID0gZm5Ub1N0cmluZy5jYWxsKGZ1bmMpOwogICAgICAgICAgaWYgKCFzdXBwb3J0LmZ1bmNOYW1lcykgewogICAgICAgICAgICBiaW5kRGF0YSA9ICFyZUZ1bmNOYW1lLnRlc3Qoc291cmNlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghYmluZERhdGEpIHsKICAgICAgICAgICAgLy8gY2hlY2tzIGlmIGBmdW5jYCByZWZlcmVuY2VzIHRoZSBgdGhpc2Aga2V5d29yZCBhbmQgc3RvcmVzIHRoZSByZXN1bHQKICAgICAgICAgICAgYmluZERhdGEgPSByZVRoaXMudGVzdChzb3VyY2UpOwogICAgICAgICAgICBzZXRCaW5kRGF0YShmdW5jLCBiaW5kRGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGV4aXQgZWFybHkgaWYgdGhlcmUgYXJlIG5vIGB0aGlzYCByZWZlcmVuY2VzIG9yIGBmdW5jYCBpcyBib3VuZAogICAgICBpZiAoYmluZERhdGEgPT09IGZhbHNlIHx8IChiaW5kRGF0YSAhPT0gdHJ1ZSAmJiBiaW5kRGF0YVsxXSAmIDEpKSB7CiAgICAgICAgcmV0dXJuIGZ1bmM7CiAgICAgIH0KICAgICAgc3dpdGNoIChhcmdDb3VudCkgewogICAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlKTsKICAgICAgICB9OwogICAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYSwgYik7CiAgICAgICAgfTsKICAgICAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTsKICAgICAgICB9OwogICAgICAgIGNhc2UgNDogcmV0dXJuIGZ1bmN0aW9uKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gYmluZChmdW5jLCB0aGlzQXJnKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBjcmVhdGVXcmFwcGVyYCB0aGF0IGNyZWF0ZXMgdGhlIHdyYXBwZXIgYW5kCiAgICAgKiBzZXRzIGl0cyBtZXRhIGRhdGEuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IGJpbmREYXRhIFRoZSBiaW5kIGRhdGEgYXJyYXkuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZUNyZWF0ZVdyYXBwZXIoYmluZERhdGEpIHsKICAgICAgdmFyIGZ1bmMgPSBiaW5kRGF0YVswXSwKICAgICAgICAgIGJpdG1hc2sgPSBiaW5kRGF0YVsxXSwKICAgICAgICAgIHBhcnRpYWxBcmdzID0gYmluZERhdGFbMl0sCiAgICAgICAgICBwYXJ0aWFsUmlnaHRBcmdzID0gYmluZERhdGFbM10sCiAgICAgICAgICB0aGlzQXJnID0gYmluZERhdGFbNF0sCiAgICAgICAgICBhcml0eSA9IGJpbmREYXRhWzVdOwoKICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiAxLAogICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIDIsCiAgICAgICAgICBpc0N1cnJ5ID0gYml0bWFzayAmIDQsCiAgICAgICAgICBpc0N1cnJ5Qm91bmQgPSBiaXRtYXNrICYgOCwKICAgICAgICAgIGtleSA9IGZ1bmM7CgogICAgICBmdW5jdGlvbiBib3VuZCgpIHsKICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpczsKICAgICAgICBpZiAocGFydGlhbEFyZ3MpIHsKICAgICAgICAgIHZhciBhcmdzID0gc2xpY2UocGFydGlhbEFyZ3MpOwogICAgICAgICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICBpZiAocGFydGlhbFJpZ2h0QXJncyB8fCBpc0N1cnJ5KSB7CiAgICAgICAgICBhcmdzIHx8IChhcmdzID0gc2xpY2UoYXJndW1lbnRzKSk7CiAgICAgICAgICBpZiAocGFydGlhbFJpZ2h0QXJncykgewogICAgICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIHBhcnRpYWxSaWdodEFyZ3MpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzQ3VycnkgJiYgYXJncy5sZW5ndGggPCBhcml0eSkgewogICAgICAgICAgICBiaXRtYXNrIHw9IDE2ICYgfjMyOwogICAgICAgICAgICByZXR1cm4gYmFzZUNyZWF0ZVdyYXBwZXIoW2Z1bmMsIChpc0N1cnJ5Qm91bmQgPyBiaXRtYXNrIDogYml0bWFzayAmIH4zKSwgYXJncywgbnVsbCwgdGhpc0FyZywgYXJpdHldKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXJncyB8fCAoYXJncyA9IGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGlzQmluZEtleSkgewogICAgICAgICAgZnVuYyA9IHRoaXNCaW5kaW5nW2tleV07CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsKICAgICAgICAgIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShmdW5jLnByb3RvdHlwZSk7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQmluZGluZywgYXJncyk7CiAgICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQmluZGluZywgYXJncyk7CiAgICAgIH0KICAgICAgc2V0QmluZERhdGEoYm91bmQsIGJpbmREYXRhKTsKICAgICAgcmV0dXJuIGJvdW5kOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZGlmZmVyZW5jZWAgdGhhdCBhY2NlcHRzIGEgc2luZ2xlIGFycmF5CiAgICAgKiBvZiB2YWx1ZXMgdG8gZXhjbHVkZS4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgYXJyYXkgb2YgdmFsdWVzIHRvIGV4Y2x1ZGUuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzKSB7CiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSwKICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCwKICAgICAgICAgIGlzTGFyZ2UgPSBsZW5ndGggPj0gbGFyZ2VBcnJheVNpemUgJiYgaW5kZXhPZiA9PT0gYmFzZUluZGV4T2YsCiAgICAgICAgICByZXN1bHQgPSBbXTsKCiAgICAgIGlmIChpc0xhcmdlKSB7CiAgICAgICAgdmFyIGNhY2hlID0gY3JlYXRlQ2FjaGUodmFsdWVzKTsKICAgICAgICBpZiAoY2FjaGUpIHsKICAgICAgICAgIGluZGV4T2YgPSBjYWNoZUluZGV4T2Y7CiAgICAgICAgICB2YWx1ZXMgPSBjYWNoZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXNMYXJnZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTsKICAgICAgICBpZiAoaW5kZXhPZih2YWx1ZXMsIHZhbHVlKSA8IDApIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzTGFyZ2UpIHsKICAgICAgICByZWxlYXNlT2JqZWN0KHZhbHVlcyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2sKICAgICAqIHNob3J0aGFuZHMgb3IgYHRoaXNBcmdgIGJpbmRpbmcuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLgogICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTaGFsbG93PWZhbHNlXSBBIGZsYWcgdG8gcmVzdHJpY3QgZmxhdHRlbmluZyB0byBhIHNpbmdsZSBsZXZlbC4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0PWZhbHNlXSBBIGZsYWcgdG8gcmVzdHJpY3QgZmxhdHRlbmluZyB0byBhcnJheXMgYW5kIGBhcmd1bWVudHNgIG9iamVjdHMuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc3RhcnQgZnJvbS4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBmbGF0dGVuZWQgYXJyYXkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBpc1NoYWxsb3csIGlzU3RyaWN0LCBmcm9tSW5kZXgpIHsKICAgICAgdmFyIGluZGV4ID0gKGZyb21JbmRleCB8fCAwKSAtIDEsCiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsCiAgICAgICAgICByZXN1bHQgPSBbXTsKCiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdOwoKICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT0gJ251bWJlcicKICAgICAgICAgICAgJiYgKGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHsKICAgICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykKICAgICAgICAgIGlmICghaXNTaGFsbG93KSB7CiAgICAgICAgICAgIHZhbHVlID0gYmFzZUZsYXR0ZW4odmFsdWUsIGlzU2hhbGxvdywgaXNTdHJpY3QpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHZhbEluZGV4ID0gLTEsCiAgICAgICAgICAgICAgdmFsTGVuZ3RoID0gdmFsdWUubGVuZ3RoLAogICAgICAgICAgICAgIHJlc0luZGV4ID0gcmVzdWx0Lmxlbmd0aDsKCiAgICAgICAgICByZXN1bHQubGVuZ3RoICs9IHZhbExlbmd0aDsKICAgICAgICAgIHdoaWxlICgrK3ZhbEluZGV4IDwgdmFsTGVuZ3RoKSB7CiAgICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlW3ZhbEluZGV4XTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkgewogICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAsIHdpdGhvdXQgc3VwcG9ydCBmb3IgYHRoaXNBcmdgIGJpbmRpbmcsCiAgICAgKiB0aGF0IGFsbG93cyBwYXJ0aWFsICJfLndoZXJlIiBzdHlsZSBjb21wYXJpc29ucy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSBhIFRoZSB2YWx1ZSB0byBjb21wYXJlLgogICAgICogQHBhcmFtIHsqfSBiIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyB2YWx1ZXMuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXNXaGVyZT1mYWxzZV0gQSBmbGFnIHRvIGluZGljYXRlIHBlcmZvcm1pbmcgcGFydGlhbCBjb21wYXJpc29ucy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0E9W11dIFRyYWNrcyB0cmF2ZXJzZWQgYGFgIG9iamVjdHMuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tCPVtdXSBUcmFja3MgdHJhdmVyc2VkIGBiYCBvYmplY3RzLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZUlzRXF1YWwoYSwgYiwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNrQSwgc3RhY2tCKSB7CiAgICAgIC8vIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB3aGVuIGNvbXBhcmluZyBvYmplY3RzLCBgYWAgaGFzIGF0IGxlYXN0IHRoZSBwcm9wZXJ0aWVzIG9mIGBiYAogICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soYSwgYik7CiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIHJldHVybiAhIXJlc3VsdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZXhpdCBlYXJseSBmb3IgaWRlbnRpY2FsIHZhbHVlcwogICAgICBpZiAoYSA9PT0gYikgewogICAgICAgIC8vIHRyZWF0IGArMGAgdnMuIGAtMGAgYXMgbm90IGVxdWFsCiAgICAgICAgcmV0dXJuIGEgIT09IDAgfHwgKDEgLyBhID09IDEgLyBiKTsKICAgICAgfQogICAgICB2YXIgdHlwZSA9IHR5cGVvZiBhLAogICAgICAgICAgb3RoZXJUeXBlID0gdHlwZW9mIGI7CgogICAgICAvLyBleGl0IGVhcmx5IGZvciB1bmxpa2UgcHJpbWl0aXZlIHZhbHVlcwogICAgICBpZiAoYSA9PT0gYSAmJgogICAgICAgICAgIShhICYmIG9iamVjdFR5cGVzW3R5cGVdKSAmJgogICAgICAgICAgIShiICYmIG9iamVjdFR5cGVzW290aGVyVHlwZV0pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIC8vIGV4aXQgZWFybHkgZm9yIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgYXZvaWRpbmcgRVMzJ3MgRnVuY3Rpb24jY2FsbCBiZWhhdmlvcgogICAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjMuNC40CiAgICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgIH0KICAgICAgLy8gY29tcGFyZSBbW0NsYXNzXV0gbmFtZXMKICAgICAgdmFyIGNsYXNzTmFtZSA9IHRvU3RyaW5nLmNhbGwoYSksCiAgICAgICAgICBvdGhlckNsYXNzID0gdG9TdHJpbmcuY2FsbChiKTsKCiAgICAgIGlmIChjbGFzc05hbWUgPT0gYXJnc0NsYXNzKSB7CiAgICAgICAgY2xhc3NOYW1lID0gb2JqZWN0Q2xhc3M7CiAgICAgIH0KICAgICAgaWYgKG90aGVyQ2xhc3MgPT0gYXJnc0NsYXNzKSB7CiAgICAgICAgb3RoZXJDbGFzcyA9IG9iamVjdENsYXNzOwogICAgICB9CiAgICAgIGlmIChjbGFzc05hbWUgIT0gb3RoZXJDbGFzcykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkgewogICAgICAgIGNhc2UgYm9vbENsYXNzOgogICAgICAgIGNhc2UgZGF0ZUNsYXNzOgogICAgICAgICAgLy8gY29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1iZXJzLCBkYXRlcyB0byBtaWxsaXNlY29uZHMgYW5kIGJvb2xlYW5zCiAgICAgICAgICAvLyB0byBgMWAgb3IgYDBgIHRyZWF0aW5nIGludmFsaWQgZGF0ZXMgY29lcmNlZCB0byBgTmFOYCBhcyBub3QgZXF1YWwKICAgICAgICAgIHJldHVybiArYSA9PSArYjsKCiAgICAgICAgY2FzZSBudW1iZXJDbGFzczoKICAgICAgICAgIC8vIHRyZWF0IGBOYU5gIHZzLiBgTmFOYCBhcyBlcXVhbAogICAgICAgICAgcmV0dXJuIChhICE9ICthKQogICAgICAgICAgICA/IGIgIT0gK2IKICAgICAgICAgICAgLy8gYnV0IHRyZWF0IGArMGAgdnMuIGAtMGAgYXMgbm90IGVxdWFsCiAgICAgICAgICAgIDogKGEgPT0gMCA/ICgxIC8gYSA9PSAxIC8gYikgOiBhID09ICtiKTsKCiAgICAgICAgY2FzZSByZWdleHBDbGFzczoKICAgICAgICBjYXNlIHN0cmluZ0NsYXNzOgogICAgICAgICAgLy8gY29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMC42LjQpCiAgICAgICAgICAvLyB0cmVhdCBzdHJpbmcgcHJpbWl0aXZlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvYmplY3QgaW5zdGFuY2VzIGFzIGVxdWFsCiAgICAgICAgICByZXR1cm4gYSA9PSBTdHJpbmcoYik7CiAgICAgIH0KICAgICAgdmFyIGlzQXJyID0gY2xhc3NOYW1lID09IGFycmF5Q2xhc3M7CiAgICAgIGlmICghaXNBcnIpIHsKICAgICAgICAvLyB1bndyYXAgYW55IGBsb2Rhc2hgIHdyYXBwZWQgdmFsdWVzCiAgICAgICAgdmFyIGFXcmFwcGVkID0gaGFzT3duUHJvcGVydHkuY2FsbChhLCAnX193cmFwcGVkX18nKSwKICAgICAgICAgICAgYldyYXBwZWQgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGIsICdfX3dyYXBwZWRfXycpOwoKICAgICAgICBpZiAoYVdyYXBwZWQgfHwgYldyYXBwZWQpIHsKICAgICAgICAgIHJldHVybiBiYXNlSXNFcXVhbChhV3JhcHBlZCA/IGEuX193cmFwcGVkX18gOiBhLCBiV3JhcHBlZCA/IGIuX193cmFwcGVkX18gOiBiLCBjYWxsYmFjaywgaXNXaGVyZSwgc3RhY2tBLCBzdGFja0IpOwogICAgICAgIH0KICAgICAgICAvLyBleGl0IGZvciBmdW5jdGlvbnMgYW5kIERPTSBub2RlcwogICAgICAgIGlmIChjbGFzc05hbWUgIT0gb2JqZWN0Q2xhc3MpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLy8gaW4gb2xkZXIgdmVyc2lvbnMgb2YgT3BlcmEsIGBhcmd1bWVudHNgIG9iamVjdHMgaGF2ZSBgQXJyYXlgIGNvbnN0cnVjdG9ycwogICAgICAgIHZhciBjdG9yQSA9IGEuY29uc3RydWN0b3IsCiAgICAgICAgICAgIGN0b3JCID0gYi5jb25zdHJ1Y3RvcjsKCiAgICAgICAgLy8gbm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwKICAgICAgICBpZiAoY3RvckEgIT0gY3RvckIgJiYKICAgICAgICAgICAgICAhKGlzRnVuY3Rpb24oY3RvckEpICYmIGN0b3JBIGluc3RhbmNlb2YgY3RvckEgJiYgaXNGdW5jdGlvbihjdG9yQikgJiYgY3RvckIgaW5zdGFuY2VvZiBjdG9yQikgJiYKICAgICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBhICYmICdjb25zdHJ1Y3RvcicgaW4gYikKICAgICAgICAgICAgKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGFzc3VtZSBjeWNsaWMgc3RydWN0dXJlcyBhcmUgZXF1YWwKICAgICAgLy8gdGhlIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGN5Y2xpYyBzdHJ1Y3R1cmVzIGlzIGFkYXB0ZWQgZnJvbSBFUyA1LjEKICAgICAgLy8gc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBvcGVyYXRpb24gYEpPYCAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMi4zKQogICAgICB2YXIgaW5pdGVkU3RhY2sgPSAhc3RhY2tBOwogICAgICBzdGFja0EgfHwgKHN0YWNrQSA9IGdldEFycmF5KCkpOwogICAgICBzdGFja0IgfHwgKHN0YWNrQiA9IGdldEFycmF5KCkpOwoKICAgICAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7CiAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgIGlmIChzdGFja0FbbGVuZ3RoXSA9PSBhKSB7CiAgICAgICAgICByZXR1cm4gc3RhY2tCW2xlbmd0aF0gPT0gYjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHNpemUgPSAwOwogICAgICByZXN1bHQgPSB0cnVlOwoKICAgICAgLy8gYWRkIGBhYCBhbmQgYGJgIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cwogICAgICBzdGFja0EucHVzaChhKTsKICAgICAgc3RhY2tCLnB1c2goYik7CgogICAgICAvLyByZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpCiAgICAgIGlmIChpc0FycikgewogICAgICAgIC8vIGNvbXBhcmUgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5CiAgICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7CiAgICAgICAgc2l6ZSA9IGIubGVuZ3RoOwogICAgICAgIHJlc3VsdCA9IHNpemUgPT0gbGVuZ3RoOwoKICAgICAgICBpZiAocmVzdWx0IHx8IGlzV2hlcmUpIHsKICAgICAgICAgIC8vIGRlZXAgY29tcGFyZSB0aGUgY29udGVudHMsIGlnbm9yaW5nIG5vbi1udW1lcmljIHByb3BlcnRpZXMKICAgICAgICAgIHdoaWxlIChzaXplLS0pIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoLAogICAgICAgICAgICAgICAgdmFsdWUgPSBiW3NpemVdOwoKICAgICAgICAgICAgaWYgKGlzV2hlcmUpIHsKICAgICAgICAgICAgICB3aGlsZSAoaW5kZXgtLSkgewogICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSBiYXNlSXNFcXVhbChhW2luZGV4XSwgdmFsdWUsIGNhbGxiYWNrLCBpc1doZXJlLCBzdGFja0EsIHN0YWNrQikpKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghKHJlc3VsdCA9IGJhc2VJc0VxdWFsKGFbc2l6ZV0sIHZhbHVlLCBjYWxsYmFjaywgaXNXaGVyZSwgc3RhY2tBLCBzdGFja0IpKSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8vIGRlZXAgY29tcGFyZSBvYmplY3RzIHVzaW5nIGBmb3JJbmAsIGluc3RlYWQgb2YgYGZvck93bmAsIHRvIGF2b2lkIGBPYmplY3Qua2V5c2AKICAgICAgICAvLyB3aGljaCwgaW4gdGhpcyBjYXNlLCBpcyBtb3JlIGNvc3RseQogICAgICAgIGZvckluKGIsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGIpIHsKICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleSkpIHsKICAgICAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzLgogICAgICAgICAgICBzaXplKys7CiAgICAgICAgICAgIC8vIGRlZXAgY29tcGFyZSBlYWNoIHByb3BlcnR5IHZhbHVlLgogICAgICAgICAgICByZXR1cm4gKHJlc3VsdCA9IGhhc093blByb3BlcnR5LmNhbGwoYSwga2V5KSAmJiBiYXNlSXNFcXVhbChhW2tleV0sIHZhbHVlLCBjYWxsYmFjaywgaXNXaGVyZSwgc3RhY2tBLCBzdGFja0IpKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNXaGVyZSkgewogICAgICAgICAgLy8gZW5zdXJlIGJvdGggb2JqZWN0cyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzCiAgICAgICAgICBmb3JJbihhLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBhKSB7CiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGtleSkpIHsKICAgICAgICAgICAgICAvLyBgc2l6ZWAgd2lsbCBiZSBgLTFgIGlmIGBhYCBoYXMgbW9yZSBwcm9wZXJ0aWVzIHRoYW4gYGJgCiAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSAtLXNpemUgPiAtMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGFja0EucG9wKCk7CiAgICAgIHN0YWNrQi5wb3AoKTsKCiAgICAgIGlmIChpbml0ZWRTdGFjaykgewogICAgICAgIHJlbGVhc2VBcnJheShzdGFja0EpOwogICAgICAgIHJlbGVhc2VBcnJheShzdGFja0IpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBhcmd1bWVudCBqdWdnbGluZyBvciBzdXBwb3J0CiAgICAgKiBmb3IgYHRoaXNBcmdgIGJpbmRpbmcuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2luZyBwcm9wZXJ0aWVzLgogICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQT1bXV0gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2Ugb2JqZWN0cy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgdmFsdWVzIHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBjYWxsYmFjaywgc3RhY2tBLCBzdGFja0IpIHsKICAgICAgKGlzQXJyYXkoc291cmNlKSA/IGZvckVhY2ggOiBmb3JPd24pKHNvdXJjZSwgZnVuY3Rpb24oc291cmNlLCBrZXkpIHsKICAgICAgICB2YXIgZm91bmQsCiAgICAgICAgICAgIGlzQXJyLAogICAgICAgICAgICByZXN1bHQgPSBzb3VyY2UsCiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07CgogICAgICAgIGlmIChzb3VyY2UgJiYgKChpc0FyciA9IGlzQXJyYXkoc291cmNlKSkgfHwgaXNQbGFpbk9iamVjdChzb3VyY2UpKSkgewogICAgICAgICAgLy8gYXZvaWQgbWVyZ2luZyBwcmV2aW91c2x5IG1lcmdlZCBjeWNsaWMgc291cmNlcwogICAgICAgICAgdmFyIHN0YWNrTGVuZ3RoID0gc3RhY2tBLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChzdGFja0xlbmd0aC0tKSB7CiAgICAgICAgICAgIGlmICgoZm91bmQgPSBzdGFja0Fbc3RhY2tMZW5ndGhdID09IHNvdXJjZSkpIHsKICAgICAgICAgICAgICB2YWx1ZSA9IHN0YWNrQltzdGFja0xlbmd0aF07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgdmFyIGlzU2hhbGxvdzsKICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUsIHNvdXJjZSk7CiAgICAgICAgICAgICAgaWYgKChpc1NoYWxsb3cgPSB0eXBlb2YgcmVzdWx0ICE9ICd1bmRlZmluZWQnKSkgewogICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXNTaGFsbG93KSB7CiAgICAgICAgICAgICAgdmFsdWUgPSBpc0FycgogICAgICAgICAgICAgICAgPyAoaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdKQogICAgICAgICAgICAgICAgOiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB2YWx1ZSA6IHt9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBhZGQgYHNvdXJjZWAgYW5kIGFzc29jaWF0ZWQgYHZhbHVlYCB0byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMKICAgICAgICAgICAgc3RhY2tBLnB1c2goc291cmNlKTsKICAgICAgICAgICAgc3RhY2tCLnB1c2godmFsdWUpOwoKICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykKICAgICAgICAgICAgaWYgKCFpc1NoYWxsb3cpIHsKICAgICAgICAgICAgICBiYXNlTWVyZ2UodmFsdWUsIHNvdXJjZSwgY2FsbGJhY2ssIHN0YWNrQSwgc3RhY2tCKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICByZXN1bHQgPSBjYWxsYmFjayh2YWx1ZSwgc291cmNlKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlOwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmRvbWAgd2l0aG91dCBhcmd1bWVudCBqdWdnbGluZyBvciBzdXBwb3J0CiAgICAgKiBmb3IgcmV0dXJuaW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gVGhlIG1pbmltdW0gcG9zc2libGUgdmFsdWUuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IFRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlLgogICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBhIHJhbmRvbSBudW1iZXIuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obWluLCBtYXgpIHsKICAgICAgcmV0dXJuIG1pbiArIGZsb29yKG5hdGl2ZVJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2sgc2hvcnRoYW5kcwogICAgICogb3IgYHRoaXNBcmdgIGJpbmRpbmcuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLgogICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTb3J0ZWQ9ZmFsc2VdIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGBhcnJheWAgaXMgc29ydGVkLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBkdXBsaWNhdGUtdmFsdWUtZnJlZSBhcnJheS4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGlzU29ydGVkLCBjYWxsYmFjaykgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGluZGV4T2YgPSBnZXRJbmRleE9mKCksCiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsCiAgICAgICAgICByZXN1bHQgPSBbXTsKCiAgICAgIHZhciBpc0xhcmdlID0gIWlzU29ydGVkICYmIGxlbmd0aCA+PSBsYXJnZUFycmF5U2l6ZSAmJiBpbmRleE9mID09PSBiYXNlSW5kZXhPZiwKICAgICAgICAgIHNlZW4gPSAoY2FsbGJhY2sgfHwgaXNMYXJnZSkgPyBnZXRBcnJheSgpIDogcmVzdWx0OwoKICAgICAgaWYgKGlzTGFyZ2UpIHsKICAgICAgICB2YXIgY2FjaGUgPSBjcmVhdGVDYWNoZShzZWVuKTsKICAgICAgICBpbmRleE9mID0gY2FjaGVJbmRleE9mOwogICAgICAgIHNlZW4gPSBjYWNoZTsKICAgICAgfQogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSwKICAgICAgICAgICAgY29tcHV0ZWQgPSBjYWxsYmFjayA/IGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgYXJyYXkpIDogdmFsdWU7CgogICAgICAgIGlmIChpc1NvcnRlZAogICAgICAgICAgICAgID8gIWluZGV4IHx8IHNlZW5bc2Vlbi5sZW5ndGggLSAxXSAhPT0gY29tcHV0ZWQKICAgICAgICAgICAgICA6IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQpIDwgMAogICAgICAgICAgICApIHsKICAgICAgICAgIGlmIChjYWxsYmFjayB8fCBpc0xhcmdlKSB7CiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0xhcmdlKSB7CiAgICAgICAgcmVsZWFzZUFycmF5KHNlZW4uYXJyYXkpOwogICAgICAgIHJlbGVhc2VPYmplY3Qoc2Vlbik7CiAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHsKICAgICAgICByZWxlYXNlQXJyYXkoc2Vlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFnZ3JlZ2F0ZXMgYSBjb2xsZWN0aW9uLCBjcmVhdGluZyBhbiBvYmplY3QgY29tcG9zZWQKICAgICAqIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24KICAgICAqIHRocm91Z2ggYSBjYWxsYmFjay4gVGhlIGdpdmVuIGBzZXR0ZXJgIGZ1bmN0aW9uIHNldHMgdGhlIGtleXMgYW5kIHZhbHVlcwogICAgICogb2YgdGhlIGNvbXBvc2VkIG9iamVjdC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBzZXR0ZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhZ2dyZWdhdG9yIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcikgewogICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwoKICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDsKCiAgICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHsKICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbGxlY3Rpb25baW5kZXhdOwogICAgICAgICAgICBzZXR0ZXIocmVzdWx0LCB2YWx1ZSwgY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSwgY29sbGVjdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7CiAgICAgICAgICAgIHNldHRlcihyZXN1bHQsIHZhbHVlLCBjYWxsYmFjayh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSwgY29sbGVjdGlvbik7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2AKICAgICAqIHdpdGggYW4gb3B0aW9uYWwgYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHJlZmVyZW5jZS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIG9mIG1ldGhvZCBmbGFncyB0byBjb21wb3NlLgogICAgICogIFRoZSBiaXRtYXNrIG1heSBiZSBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgogICAgICogIDEgLSBgXy5iaW5kYAogICAgICogIDIgLSBgXy5iaW5kS2V5YAogICAgICogIDQgLSBgXy5jdXJyeWAKICAgICAqICA4IC0gYF8uY3VycnlgIChib3VuZCkKICAgICAqICAxNiAtIGBfLnBhcnRpYWxgCiAgICAgKiAgMzIgLSBgXy5wYXJ0aWFsUmlnaHRgCiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbEFyZ3NdIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlCiAgICAgKiAgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsUmlnaHRBcmdzXSBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlCiAgICAgKiAgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIoZnVuYywgYml0bWFzaywgcGFydGlhbEFyZ3MsIHBhcnRpYWxSaWdodEFyZ3MsIHRoaXNBcmcsIGFyaXR5KSB7CiAgICAgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgMSwKICAgICAgICAgIGlzQmluZEtleSA9IGJpdG1hc2sgJiAyLAogICAgICAgICAgaXNDdXJyeSA9IGJpdG1hc2sgJiA0LAogICAgICAgICAgaXNDdXJyeUJvdW5kID0gYml0bWFzayAmIDgsCiAgICAgICAgICBpc1BhcnRpYWwgPSBiaXRtYXNrICYgMTYsCiAgICAgICAgICBpc1BhcnRpYWxSaWdodCA9IGJpdG1hc2sgJiAzMjsKCiAgICAgIGlmICghaXNCaW5kS2V5ICYmICFpc0Z1bmN0aW9uKGZ1bmMpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjsKICAgICAgfQogICAgICBpZiAoaXNQYXJ0aWFsICYmICFwYXJ0aWFsQXJncy5sZW5ndGgpIHsKICAgICAgICBiaXRtYXNrICY9IH4xNjsKICAgICAgICBpc1BhcnRpYWwgPSBwYXJ0aWFsQXJncyA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChpc1BhcnRpYWxSaWdodCAmJiAhcGFydGlhbFJpZ2h0QXJncy5sZW5ndGgpIHsKICAgICAgICBiaXRtYXNrICY9IH4zMjsKICAgICAgICBpc1BhcnRpYWxSaWdodCA9IHBhcnRpYWxSaWdodEFyZ3MgPSBmYWxzZTsKICAgICAgfQogICAgICB2YXIgYmluZERhdGEgPSBmdW5jICYmIGZ1bmMuX19iaW5kRGF0YV9fOwogICAgICBpZiAoYmluZERhdGEgJiYgYmluZERhdGEgIT09IHRydWUpIHsKICAgICAgICAvLyBjbG9uZSBgYmluZERhdGFgCiAgICAgICAgYmluZERhdGEgPSBzbGljZShiaW5kRGF0YSk7CiAgICAgICAgaWYgKGJpbmREYXRhWzJdKSB7CiAgICAgICAgICBiaW5kRGF0YVsyXSA9IHNsaWNlKGJpbmREYXRhWzJdKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJpbmREYXRhWzNdKSB7CiAgICAgICAgICBiaW5kRGF0YVszXSA9IHNsaWNlKGJpbmREYXRhWzNdKTsKICAgICAgICB9CiAgICAgICAgLy8gc2V0IGB0aGlzQmluZGluZ2AgaXMgbm90IHByZXZpb3VzbHkgYm91bmQKICAgICAgICBpZiAoaXNCaW5kICYmICEoYmluZERhdGFbMV0gJiAxKSkgewogICAgICAgICAgYmluZERhdGFbNF0gPSB0aGlzQXJnOwogICAgICAgIH0KICAgICAgICAvLyBzZXQgaWYgcHJldmlvdXNseSBib3VuZCBidXQgbm90IGN1cnJlbnRseSAoc3Vic2VxdWVudCBjdXJyaWVkIGZ1bmN0aW9ucykKICAgICAgICBpZiAoIWlzQmluZCAmJiBiaW5kRGF0YVsxXSAmIDEpIHsKICAgICAgICAgIGJpdG1hc2sgfD0gODsKICAgICAgICB9CiAgICAgICAgLy8gc2V0IGN1cnJpZWQgYXJpdHkgaWYgbm90IHlldCBzZXQKICAgICAgICBpZiAoaXNDdXJyeSAmJiAhKGJpbmREYXRhWzFdICYgNCkpIHsKICAgICAgICAgIGJpbmREYXRhWzVdID0gYXJpdHk7CiAgICAgICAgfQogICAgICAgIC8vIGFwcGVuZCBwYXJ0aWFsIGxlZnQgYXJndW1lbnRzCiAgICAgICAgaWYgKGlzUGFydGlhbCkgewogICAgICAgICAgcHVzaC5hcHBseShiaW5kRGF0YVsyXSB8fCAoYmluZERhdGFbMl0gPSBbXSksIHBhcnRpYWxBcmdzKTsKICAgICAgICB9CiAgICAgICAgLy8gYXBwZW5kIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzCiAgICAgICAgaWYgKGlzUGFydGlhbFJpZ2h0KSB7CiAgICAgICAgICB1bnNoaWZ0LmFwcGx5KGJpbmREYXRhWzNdIHx8IChiaW5kRGF0YVszXSA9IFtdKSwgcGFydGlhbFJpZ2h0QXJncyk7CiAgICAgICAgfQogICAgICAgIC8vIG1lcmdlIGZsYWdzCiAgICAgICAgYmluZERhdGFbMV0gfD0gYml0bWFzazsKICAgICAgICByZXR1cm4gY3JlYXRlV3JhcHBlci5hcHBseShudWxsLCBiaW5kRGF0YSk7CiAgICAgIH0KICAgICAgLy8gZmFzdCBwYXRoIGZvciBgXy5iaW5kYAogICAgICB2YXIgY3JlYXRlciA9IChiaXRtYXNrID09IDEgfHwgYml0bWFzayA9PT0gMTcpID8gYmFzZUJpbmQgOiBiYXNlQ3JlYXRlV3JhcHBlcjsKICAgICAgcmV0dXJuIGNyZWF0ZXIoW2Z1bmMsIGJpdG1hc2ssIHBhcnRpYWxBcmdzLCBwYXJ0aWFsUmlnaHRBcmdzLCB0aGlzQXJnLCBhcml0eV0pOwogICAgfQoKICAgIC8qKgogICAgICogVXNlZCBieSBgZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuCiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4KICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlSHRtbENoYXIobWF0Y2gpIHsKICAgICAgcmV0dXJuIGh0bWxFc2NhcGVzW21hdGNoXTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlICJpbmRleE9mIiBmdW5jdGlvbi4gSWYgdGhlIGBfLmluZGV4T2ZgIG1ldGhvZCBpcwogICAgICogY3VzdG9taXplZCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY3VzdG9tIG1ldGhvZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMKICAgICAqIHRoZSBgYmFzZUluZGV4T2ZgIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlICJpbmRleE9mIiBmdW5jdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0SW5kZXhPZigpIHsKICAgICAgdmFyIHJlc3VsdCA9IChyZXN1bHQgPSBsb2Rhc2guaW5kZXhPZikgPT09IGluZGV4T2YgPyBiYXNlSW5kZXhPZiA6IHJlc3VsdDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkgewogICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgJiYgcmVOYXRpdmUudGVzdCh2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIGB0aGlzYCBiaW5kaW5nIGRhdGEgb24gYSBnaXZlbiBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc2V0IGRhdGEgb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZSBUaGUgZGF0YSBhcnJheSB0byBzZXQuCiAgICAgKi8KICAgIHZhciBzZXRCaW5kRGF0YSA9ICFkZWZpbmVQcm9wZXJ0eSA/IG5vb3AgOiBmdW5jdGlvbihmdW5jLCB2YWx1ZSkgewogICAgICBkZXNjcmlwdG9yLnZhbHVlID0gdmFsdWU7CiAgICAgIGRlZmluZVByb3BlcnR5KGZ1bmMsICdfX2JpbmREYXRhX18nLCBkZXNjcmlwdG9yKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIGBpc1BsYWluT2JqZWN0YCB3aGljaCBjaGVja3MgaWYgYSBnaXZlbiB2YWx1ZQogICAgICogaXMgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLCBhc3N1bWluZyBvYmplY3RzIGNyZWF0ZWQKICAgICAqIGJ5IHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3RvciBoYXZlIG5vIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMgYW5kIHRoYXQKICAgICAqIHRoZXJlIGFyZSBubyBgT2JqZWN0LnByb3RvdHlwZWAgZXh0ZW5zaW9ucy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBzaGltSXNQbGFpbk9iamVjdCh2YWx1ZSkgewogICAgICB2YXIgY3RvciwKICAgICAgICAgIHJlc3VsdDsKCiAgICAgIC8vIGF2b2lkIG5vbiBPYmplY3Qgb2JqZWN0cywgYGFyZ3VtZW50c2Agb2JqZWN0cywgYW5kIERPTSBlbGVtZW50cwogICAgICBpZiAoISh2YWx1ZSAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBvYmplY3RDbGFzcykgfHwKICAgICAgICAgIChjdG9yID0gdmFsdWUuY29uc3RydWN0b3IsIGlzRnVuY3Rpb24oY3RvcikgJiYgIShjdG9yIGluc3RhbmNlb2YgY3RvcikpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIC8vIEluIG1vc3QgZW52aXJvbm1lbnRzIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzIGFyZSBpdGVyYXRlZCBiZWZvcmUKICAgICAgLy8gaXRzIGluaGVyaXRlZCBwcm9wZXJ0aWVzLiBJZiB0aGUgbGFzdCBpdGVyYXRlZCBwcm9wZXJ0eSBpcyBhbiBvYmplY3QncwogICAgICAvLyBvd24gcHJvcGVydHkgdGhlbiB0aGVyZSBhcmUgbm8gaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy4KICAgICAgZm9ySW4odmFsdWUsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgICAgICByZXN1bHQgPSBrZXk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHlwZW9mIHJlc3VsdCA9PSAndW5kZWZpbmVkJyB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCByZXN1bHQpOwogICAgfQoKICAgIC8qKgogICAgICogVXNlZCBieSBgdW5lc2NhcGVgIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2ggVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIHVuZXNjYXBlLgogICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci4KICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sQ2hhcihtYXRjaCkgewogICAgICByZXR1cm4gaHRtbFVuZXNjYXBlc1ttYXRjaF07CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogKGZ1bmN0aW9uKCkgeyByZXR1cm4gXy5pc0FyZ3VtZW50cyhhcmd1bWVudHMpOyB9KSgxLCAyLCAzKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT0gJ251bWJlcicgJiYKICAgICAgICB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzQ2xhc3MgfHwgZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHR5cGUgRnVuY3Rpb24KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiAoZnVuY3Rpb24oKSB7IHJldHVybiBfLmlzQXJyYXkoYXJndW1lbnRzKTsgfSkoKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKgogICAgICogXy5pc0FycmF5KFsxLCAyLCAzXSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKi8KICAgIHZhciBpc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT0gJ251bWJlcicgJiYKICAgICAgICB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcnJheUNsYXNzIHx8IGZhbHNlOwogICAgfTsKCiAgICAvKioKICAgICAqIEEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5rZXlzYCB3aGljaCBwcm9kdWNlcyBhbiBhcnJheSBvZiB0aGUKICAgICAqIGdpdmVuIG9iamVjdCdzIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuCiAgICAgKi8KICAgIHZhciBzaGltS2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gb2JqZWN0LCByZXN1bHQgPSBbXTsKICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJlc3VsdDsKICAgICAgaWYgKCEob2JqZWN0VHlwZXNbdHlwZW9mIG9iamVjdF0pKSByZXR1cm4gcmVzdWx0OwogICAgICAgIGZvciAoaW5kZXggaW4gaXRlcmFibGUpIHsKICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0ZXJhYmxlLCBpbmRleCkpIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdAogICAgfTsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY29tcG9zZWQgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmtleXMoeyAnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMgfSk7CiAgICAgKiAvLyA9PiBbJ29uZScsICd0d28nLCAndGhyZWUnXSAocHJvcGVydHkgb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKICAgICAqLwogICAgdmFyIGtleXMgPSAhbmF0aXZlS2V5cyA/IHNoaW1LZXlzIDogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkgewogICAgICAgIHJldHVybiBbXTsKICAgICAgfQogICAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpOwogICAgfTsKCiAgICAvKioKICAgICAqIFVzZWQgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXM6CiAgICAgKgogICAgICogVGhvdWdoIHRoZSBgPmAgY2hhcmFjdGVyIGlzIGVzY2FwZWQgZm9yIHN5bW1ldHJ5LCBjaGFyYWN0ZXJzIGxpa2UgYD5gIGFuZCBgL2AKICAgICAqIGRvbid0IHJlcXVpcmUgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmcgdW5sZXNzIHRoZXkncmUgcGFydAogICAgICogb2YgYSB0YWcgb3IgYW4gdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLgogICAgICogaHR0cDovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvYW1iaWd1b3VzLWFtcGVyc2FuZHMgKHVuZGVyICJzZW1pLXJlbGF0ZWQgZnVuIGZhY3QiKQogICAgICovCiAgICB2YXIgaHRtbEVzY2FwZXMgPSB7CiAgICAgICcmJzogJyZhbXA7JywKICAgICAgJzwnOiAnJmx0OycsCiAgICAgICc+JzogJyZndDsnLAogICAgICAnIic6ICcmcXVvdDsnLAogICAgICAiJyI6ICcmIzM5OycKICAgIH07CgogICAgLyoqIFVzZWQgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMgKi8KICAgIHZhciBodG1sVW5lc2NhcGVzID0gaW52ZXJ0KGh0bWxFc2NhcGVzKTsKCiAgICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMgKi8KICAgIHZhciByZUVzY2FwZWRIdG1sID0gUmVnRXhwKCcoJyArIGtleXMoaHRtbFVuZXNjYXBlcykuam9pbignfCcpICsgJyknLCAnZycpLAogICAgICAgIHJlVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cCgnWycgKyBrZXlzKGh0bWxFc2NhcGVzKS5qb2luKCcnKSArICddJywgJ2cnKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAvKioKICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0KHMpIHRvIHRoZSBkZXN0aW5hdGlvbgogICAgICogb2JqZWN0LiBTdWJzZXF1ZW50IHNvdXJjZXMgd2lsbCBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMKICAgICAqIHNvdXJjZXMuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZCB0byBwcm9kdWNlIHRoZQogICAgICogYXNzaWduZWQgdmFsdWVzLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdHdvCiAgICAgKiBhcmd1bWVudHM7IChvYmplY3RWYWx1ZSwgc291cmNlVmFsdWUpLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQGFsaWFzIGV4dGVuZAogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduaW5nIHZhbHVlcy4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmFzc2lnbih7ICduYW1lJzogJ2ZyZWQnIH0sIHsgJ2VtcGxveWVyJzogJ3NsYXRlJyB9KTsKICAgICAqIC8vID0+IHsgJ25hbWUnOiAnZnJlZCcsICdlbXBsb3llcic6ICdzbGF0ZScgfQogICAgICoKICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduLCBmdW5jdGlvbihhLCBiKSB7CiAgICAgKiAgIHJldHVybiB0eXBlb2YgYSA9PSAndW5kZWZpbmVkJyA/IGIgOiBhOwogICAgICogfSk7CiAgICAgKgogICAgICogdmFyIG9iamVjdCA9IHsgJ25hbWUnOiAnYmFybmV5JyB9OwogICAgICogZGVmYXVsdHMob2JqZWN0LCB7ICduYW1lJzogJ2ZyZWQnLCAnZW1wbG95ZXInOiAnc2xhdGUnIH0pOwogICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAnZW1wbG95ZXInOiAnc2xhdGUnIH0KICAgICAqLwogICAgdmFyIGFzc2lnbiA9IGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBndWFyZCkgewogICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gb2JqZWN0LCByZXN1bHQgPSBpdGVyYWJsZTsKICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJlc3VsdDsKICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICBhcmdzSW5kZXggPSAwLAogICAgICAgICAgYXJnc0xlbmd0aCA9IHR5cGVvZiBndWFyZCA9PSAnbnVtYmVyJyA/IDIgOiBhcmdzLmxlbmd0aDsKICAgICAgaWYgKGFyZ3NMZW5ndGggPiAzICYmIHR5cGVvZiBhcmdzW2FyZ3NMZW5ndGggLSAyXSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIGNhbGxiYWNrID0gYmFzZUNyZWF0ZUNhbGxiYWNrKGFyZ3NbLS1hcmdzTGVuZ3RoIC0gMV0sIGFyZ3NbYXJnc0xlbmd0aC0tXSwgMik7CiAgICAgIH0gZWxzZSBpZiAoYXJnc0xlbmd0aCA+IDIgJiYgdHlwZW9mIGFyZ3NbYXJnc0xlbmd0aCAtIDFdID09ICdmdW5jdGlvbicpIHsKICAgICAgICBjYWxsYmFjayA9IGFyZ3NbLS1hcmdzTGVuZ3RoXTsKICAgICAgfQogICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7CiAgICAgICAgaXRlcmFibGUgPSBhcmdzW2FyZ3NJbmRleF07CiAgICAgICAgaWYgKGl0ZXJhYmxlICYmIG9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHsKICAgICAgICB2YXIgb3duSW5kZXggPSAtMSwKICAgICAgICAgICAgb3duUHJvcHMgPSBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdICYmIGtleXMoaXRlcmFibGUpLAogICAgICAgICAgICBsZW5ndGggPSBvd25Qcm9wcyA/IG93blByb3BzLmxlbmd0aCA6IDA7CgogICAgICAgIHdoaWxlICgrK293bkluZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICBpbmRleCA9IG93blByb3BzW293bkluZGV4XTsKICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBjYWxsYmFjayA/IGNhbGxiYWNrKHJlc3VsdFtpbmRleF0sIGl0ZXJhYmxlW2luZGV4XSkgOiBpdGVyYWJsZVtpbmRleF07CiAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0CiAgICB9OwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB2YWx1ZWAuIElmIGBpc0RlZXBgIGlzIGB0cnVlYCBuZXN0ZWQgb2JqZWN0cyB3aWxsIGFsc28KICAgICAqIGJlIGNsb25lZCwgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBhc3NpZ25lZCBieSByZWZlcmVuY2UuIElmIGEgY2FsbGJhY2sKICAgICAqIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlcy4gSWYgdGhlCiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRgIGNsb25pbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4KICAgICAqIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcD1mYWxzZV0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZyB2YWx1ZXMuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwogICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LAogICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9CiAgICAgKiBdOwogICAgICoKICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShjaGFyYWN0ZXJzKTsKICAgICAqIHNoYWxsb3dbMF0gPT09IGNoYXJhY3RlcnNbMF07CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogdmFyIGRlZXAgPSBfLmNsb25lKGNoYXJhY3RlcnMsIHRydWUpOwogICAgICogZGVlcFswXSA9PT0gY2hhcmFjdGVyc1swXTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKgogICAgICogXy5taXhpbih7CiAgICAgKiAgICdjbG9uZSc6IF8ucGFydGlhbFJpZ2h0KF8uY2xvbmUsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgKiAgICAgcmV0dXJuIF8uaXNFbGVtZW50KHZhbHVlKSA/IHZhbHVlLmNsb25lTm9kZShmYWxzZSkgOiB1bmRlZmluZWQ7CiAgICAgKiAgIH0pCiAgICAgKiB9KTsKICAgICAqCiAgICAgKiB2YXIgY2xvbmUgPSBfLmNsb25lKGRvY3VtZW50LmJvZHkpOwogICAgICogY2xvbmUuY2hpbGROb2Rlcy5sZW5ndGg7CiAgICAgKiAvLyA9PiAwCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsb25lKHZhbHVlLCBpc0RlZXAsIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgIC8vIGFsbG93cyB3b3JraW5nIHdpdGggIkNvbGxlY3Rpb25zIiBtZXRob2RzIHdpdGhvdXQgdXNpbmcgdGhlaXIgYGluZGV4YAogICAgICAvLyBhbmQgYGNvbGxlY3Rpb25gIGFyZ3VtZW50cyBmb3IgYGlzRGVlcGAgYW5kIGBjYWxsYmFja2AKICAgICAgaWYgKHR5cGVvZiBpc0RlZXAgIT0gJ2Jvb2xlYW4nICYmIGlzRGVlcCAhPSBudWxsKSB7CiAgICAgICAgdGhpc0FyZyA9IGNhbGxiYWNrOwogICAgICAgIGNhbGxiYWNrID0gaXNEZWVwOwogICAgICAgIGlzRGVlcCA9IGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIGlzRGVlcCwgdHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicgJiYgYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGVlcCBjbG9uZSBvZiBgdmFsdWVgLiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUKICAgICAqIGV4ZWN1dGVkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZXMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRgCiAgICAgKiBjbG9uaW5nIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0bwogICAgICogYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLgogICAgICoKICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlIHN0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtLiBGdW5jdGlvbnMKICAgICAqIGFuZCBET00gbm9kZXMgYXJlICoqbm90KiogY2xvbmVkLiBUaGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYW5kCiAgICAgKiBvYmplY3RzIGNyZWF0ZWQgYnkgY29uc3RydWN0b3JzIG90aGVyIHRoYW4gYE9iamVjdGAgYXJlIGNsb25lZCB0byBwbGFpbiBgT2JqZWN0YCBvYmplY3RzLgogICAgICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2luZnJhc3RydWN0dXJlLmh0bWwjaW50ZXJuYWwtc3RydWN0dXJlZC1jbG9uaW5nLWFsZ29yaXRobS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGRlZXAgY2xvbmUuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZyB2YWx1ZXMuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KICAgICAqIF07CiAgICAgKgogICAgICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChjaGFyYWN0ZXJzKTsKICAgICAqIGRlZXBbMF0gPT09IGNoYXJhY3RlcnNbMF07CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICoKICAgICAqIHZhciB2aWV3ID0gewogICAgICogICAnbGFiZWwnOiAnZG9jcycsCiAgICAgKiAgICdub2RlJzogZWxlbWVudAogICAgICogfTsKICAgICAqCiAgICAgKiB2YXIgY2xvbmUgPSBfLmNsb25lRGVlcCh2aWV3LCBmdW5jdGlvbih2YWx1ZSkgewogICAgICogICByZXR1cm4gXy5pc0VsZW1lbnQodmFsdWUpID8gdmFsdWUuY2xvbmVOb2RlKHRydWUpIDogdW5kZWZpbmVkOwogICAgICogfSk7CiAgICAgKgogICAgICogY2xvbmUubm9kZSA9PSB2aWV3Lm5vZGU7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUsIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIHRydWUsIHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nICYmIGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMSkpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBnaXZlbiBgcHJvdG90eXBlYCBvYmplY3QuIElmIGEKICAgICAqIGBwcm9wZXJ0aWVzYCBvYmplY3QgaXMgcHJvdmlkZWQgaXRzIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgYXJlIGFzc2lnbmVkCiAgICAgKiB0byB0aGUgY3JlYXRlZCBvYmplY3QuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLgogICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkgewogICAgICogICB0aGlzLnggPSAwOwogICAgICogICB0aGlzLnkgPSAwOwogICAgICogfQogICAgICoKICAgICAqIGZ1bmN0aW9uIENpcmNsZSgpIHsKICAgICAqICAgU2hhcGUuY2FsbCh0aGlzKTsKICAgICAqIH0KICAgICAqCiAgICAgKiBDaXJjbGUucHJvdG90eXBlID0gXy5jcmVhdGUoU2hhcGUucHJvdG90eXBlLCB7ICdjb25zdHJ1Y3Rvcic6IENpcmNsZSB9KTsKICAgICAqCiAgICAgKiB2YXIgY2lyY2xlID0gbmV3IENpcmNsZTsKICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIENpcmNsZTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBTaGFwZTsKICAgICAqIC8vID0+IHRydWUKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgewogICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpOwogICAgICByZXR1cm4gcHJvcGVydGllcyA/IGFzc2lnbihyZXN1bHQsIHByb3BlcnRpZXMpIDogcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3QocykgdG8gdGhlIGRlc3RpbmF0aW9uCiAgICAgKiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gT25jZSBhCiAgICAgKiBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgZGVmYXVsdHMgb2YgdGhlIHNhbWUgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuCiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gQWxsb3dzIHdvcmtpbmcgd2l0aCBgXy5yZWR1Y2VgIHdpdGhvdXQgdXNpbmcgaXRzCiAgICAgKiAgYGtleWAgYW5kIGBvYmplY3RgIGFyZ3VtZW50cyBhcyBzb3VyY2VzLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgb2JqZWN0ID0geyAnbmFtZSc6ICdiYXJuZXknIH07CiAgICAgKiBfLmRlZmF1bHRzKG9iamVjdCwgeyAnbmFtZSc6ICdmcmVkJywgJ2VtcGxveWVyJzogJ3NsYXRlJyB9KTsKICAgICAqIC8vID0+IHsgJ25hbWUnOiAnYmFybmV5JywgJ2VtcGxveWVyJzogJ3NsYXRlJyB9CiAgICAgKi8KICAgIHZhciBkZWZhdWx0cyA9IGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBndWFyZCkgewogICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gb2JqZWN0LCByZXN1bHQgPSBpdGVyYWJsZTsKICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJlc3VsdDsKICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICBhcmdzSW5kZXggPSAwLAogICAgICAgICAgYXJnc0xlbmd0aCA9IHR5cGVvZiBndWFyZCA9PSAnbnVtYmVyJyA/IDIgOiBhcmdzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkgewogICAgICAgIGl0ZXJhYmxlID0gYXJnc1thcmdzSW5kZXhdOwogICAgICAgIGlmIChpdGVyYWJsZSAmJiBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdKSB7CiAgICAgICAgdmFyIG93bkluZGV4ID0gLTEsCiAgICAgICAgICAgIG93blByb3BzID0gb2JqZWN0VHlwZXNbdHlwZW9mIGl0ZXJhYmxlXSAmJiBrZXlzKGl0ZXJhYmxlKSwKICAgICAgICAgICAgbGVuZ3RoID0gb3duUHJvcHMgPyBvd25Qcm9wcy5sZW5ndGggOiAwOwoKICAgICAgICB3aGlsZSAoKytvd25JbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgaW5kZXggPSBvd25Qcm9wc1tvd25JbmRleF07CiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdFtpbmRleF0gPT0gJ3VuZGVmaW5lZCcpIHJlc3VsdFtpbmRleF0gPSBpdGVyYWJsZVtpbmRleF07CiAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0CiAgICB9OwoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGtleSBvZiB0aGUKICAgICAqIGZpcnN0IGVsZW1lbnQgdGhhdCBwYXNzZXMgdGhlIGNhbGxiYWNrIGNoZWNrLCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi4KICAgICAqCiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgKgogICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawogICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKICAgICAqIGVsc2UgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIKICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvCiAgICAgKiAgY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IHsKICAgICAqICAgJ2Jhcm5leSc6IHsgICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxzZSB9LAogICAgICogICAnZnJlZCc6IHsgICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfSwKICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiBmYWxzZSB9CiAgICAgKiB9OwogICAgICoKICAgICAqIF8uZmluZEtleShjaGFyYWN0ZXJzLCBmdW5jdGlvbihjaHIpIHsKICAgICAqICAgcmV0dXJuIGNoci5hZ2UgPCA0MDsKICAgICAqIH0pOwogICAgICogLy8gPT4gJ2Jhcm5leScgKHByb3BlcnR5IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5maW5kS2V5KGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDEgfSk7CiAgICAgKiAvLyA9PiAncGViYmxlcycKICAgICAqCiAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCiAgICAgKiBfLmZpbmRLZXkoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTsKICAgICAqIC8vID0+ICdmcmVkJwogICAgICovCiAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIHJlc3VsdDsKICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICBmb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHsKICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGtleSwgb2JqZWN0KSkgewogICAgICAgICAgcmVzdWx0ID0ga2V5OwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKICAgICAqIG9mIGEgYGNvbGxlY3Rpb25gIGluIHRoZSBvcHBvc2l0ZSBvcmRlci4KICAgICAqCiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgKgogICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawogICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKICAgICAqIGVsc2UgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIKICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvCiAgICAgKiAgY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IHsKICAgICAqICAgJ2Jhcm5leSc6IHsgICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiB0cnVlIH0sCiAgICAgKiAgICdmcmVkJzogeyAgICAnYWdlJzogNDAsICdibG9ja2VkJzogZmFsc2UgfSwKICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiB0cnVlIH0KICAgICAqIH07CiAgICAgKgogICAgICogXy5maW5kTGFzdEtleShjaGFyYWN0ZXJzLCBmdW5jdGlvbihjaHIpIHsKICAgICAqICAgcmV0dXJuIGNoci5hZ2UgPCA0MDsKICAgICAqIH0pOwogICAgICogLy8gPT4gcmV0dXJucyBgcGViYmxlc2AsIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgYGJhcm5leWAKICAgICAqCiAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIgY2FsbGJhY2sgc2hvcnRoYW5kCiAgICAgKiBfLmZpbmRMYXN0S2V5KGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDQwIH0pOwogICAgICogLy8gPT4gJ2ZyZWQnCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5maW5kTGFzdEtleShjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwogICAgICogLy8gPT4gJ3BlYmJsZXMnCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbmRMYXN0S2V5KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIHJlc3VsdDsKICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICBmb3JPd25SaWdodChvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkgewogICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwga2V5LCBvYmplY3QpKSB7CiAgICAgICAgICByZXN1bHQgPSBrZXk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCwKICAgICAqIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2sgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AKICAgICAqIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGtleSwgb2JqZWN0KS4gQ2FsbGJhY2tzIG1heSBleGl0CiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHR5cGUgRnVuY3Rpb24KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkgewogICAgICogICB0aGlzLnggPSAwOwogICAgICogICB0aGlzLnkgPSAwOwogICAgICogfQogICAgICoKICAgICAqIFNoYXBlLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24oeCwgeSkgewogICAgICogICB0aGlzLnggKz0geDsKICAgICAqICAgdGhpcy55ICs9IHk7CiAgICAgKiB9OwogICAgICoKICAgICAqIF8uZm9ySW4obmV3IFNoYXBlLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7CiAgICAgKiB9KTsKICAgICAqIC8vID0+IGxvZ3MgJ3gnLCAneScsIGFuZCAnbW92ZScgKHByb3BlcnR5IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCiAgICAgKi8KICAgIHZhciBmb3JJbiA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgIHZhciBpbmRleCwgaXRlcmFibGUgPSBjb2xsZWN0aW9uLCByZXN1bHQgPSBpdGVyYWJsZTsKICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJlc3VsdDsKICAgICAgaWYgKCFvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdKSByZXR1cm4gcmVzdWx0OwogICAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQnID8gY2FsbGJhY2sgOiBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICAgIGZvciAoaW5kZXggaW4gaXRlcmFibGUpIHsKICAgICAgICAgIGlmIChjYWxsYmFjayhpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSA9PT0gZmFsc2UpIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0CiAgICB9OwoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JJbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwogICAgICogb2YgYSBgY29sbGVjdGlvbmAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cwogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHsKICAgICAqICAgdGhpcy54ID0gMDsKICAgICAqICAgdGhpcy55ID0gMDsKICAgICAqIH0KICAgICAqCiAgICAgKiBTaGFwZS5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAqICAgdGhpcy54ICs9IHg7CiAgICAgKiAgIHRoaXMueSArPSB5OwogICAgICogfTsKICAgICAqCiAgICAgKiBfLmZvckluUmlnaHQobmV3IFNoYXBlLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7CiAgICAgKiB9KTsKICAgICAqIC8vID0+IGxvZ3MgJ21vdmUnLCAneScsIGFuZCAneCcgYXNzdW1pbmcgYF8uZm9ySW4gYCBsb2dzICd4JywgJ3knLCBhbmQgJ21vdmUnCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZvckluUmlnaHQob2JqZWN0LCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgcGFpcnMgPSBbXTsKCiAgICAgIGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgIHBhaXJzLnB1c2goa2V5LCB2YWx1ZSk7CiAgICAgIH0pOwoKICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzLmxlbmd0aDsKICAgICAgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICBpZiAoY2FsbGJhY2socGFpcnNbbGVuZ3RoLS1dLCBwYWlyc1tsZW5ndGhdLCBvYmplY3QpID09PSBmYWxzZSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LCBleGVjdXRpbmcgdGhlIGNhbGxiYWNrCiAgICAgKiBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlCiAgICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBDYWxsYmFja3MgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5CiAgICAgKiBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5mb3JPd24oeyAnMCc6ICd6ZXJvJywgJzEnOiAnb25lJywgJ2xlbmd0aCc6IDIgfSwgZnVuY3Rpb24obnVtLCBrZXkpIHsKICAgICAqICAgY29uc29sZS5sb2coa2V5KTsKICAgICAqIH0pOwogICAgICogLy8gPT4gbG9ncyAnMCcsICcxJywgYW5kICdsZW5ndGgnIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZW52aXJvbm1lbnRzKQogICAgICovCiAgICB2YXIgZm9yT3duID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIGluZGV4LCBpdGVyYWJsZSA9IGNvbGxlY3Rpb24sIHJlc3VsdCA9IGl0ZXJhYmxlOwogICAgICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gcmVzdWx0OwogICAgICBpZiAoIW9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHJldHVybiByZXN1bHQ7CiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgdHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcgPyBjYWxsYmFjayA6IGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CiAgICAgICAgdmFyIG93bkluZGV4ID0gLTEsCiAgICAgICAgICAgIG93blByb3BzID0gb2JqZWN0VHlwZXNbdHlwZW9mIGl0ZXJhYmxlXSAmJiBrZXlzKGl0ZXJhYmxlKSwKICAgICAgICAgICAgbGVuZ3RoID0gb3duUHJvcHMgPyBvd25Qcm9wcy5sZW5ndGggOiAwOwoKICAgICAgICB3aGlsZSAoKytvd25JbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgaW5kZXggPSBvd25Qcm9wc1tvd25JbmRleF07CiAgICAgICAgICBpZiAoY2FsbGJhY2soaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgY29sbGVjdGlvbikgPT09IGZhbHNlKSByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdAogICAgfTsKCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yT3duYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCiAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uZm9yT3duUmlnaHQoeyAnMCc6ICd6ZXJvJywgJzEnOiAnb25lJywgJ2xlbmd0aCc6IDIgfSwgZnVuY3Rpb24obnVtLCBrZXkpIHsKICAgICAqICAgY29uc29sZS5sb2coa2V5KTsKICAgICAqIH0pOwogICAgICogLy8gPT4gbG9ncyAnbGVuZ3RoJywgJzEnLCBhbmQgJzAnIGFzc3VtaW5nIGBfLmZvck93bmAgbG9ncyAnMCcsICcxJywgYW5kICdsZW5ndGgnCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIHByb3BzID0ga2V5cyhvYmplY3QpLAogICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOwoKICAgICAgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXTsKICAgICAgICBpZiAoY2FsbGJhY2sob2JqZWN0W2tleV0sIGtleSwgb2JqZWN0KSA9PT0gZmFsc2UpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2JqZWN0OwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIHNvcnRlZCBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLAogICAgICogb3duIGFuZCBpbmhlcml0ZWQsIG9mIGBvYmplY3RgIHRoYXQgaGF2ZSBmdW5jdGlvbiB2YWx1ZXMuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBhbGlhcyBtZXRob2RzCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cwogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdGhhdCBoYXZlIGZ1bmN0aW9uIHZhbHVlcy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5mdW5jdGlvbnMoXyk7CiAgICAgKiAvLyA9PiBbJ2FsbCcsICdhbnknLCAnYmluZCcsICdiaW5kQWxsJywgJ2Nsb25lJywgJ2NvbXBhY3QnLCAnY29tcG9zZScsIC4uLl0KICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkgewogICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgIGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkgewogICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUgZXhpc3RzIGFzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLAogICAgICogaW5zdGVhZCBvZiBhbiBpbmhlcml0ZWQgcHJvcGVydHkuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGtleSBpcyBhIGRpcmVjdCBwcm9wZXJ0eSwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmhhcyh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgJ2InKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqLwogICAgZnVuY3Rpb24gaGFzKG9iamVjdCwga2V5KSB7CiAgICAgIHJldHVybiBvYmplY3QgPyBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSA6IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGludmVydGVkIGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cwogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNyZWF0ZWQgaW52ZXJ0ZWQgb2JqZWN0LgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmludmVydCh7ICdmaXJzdCc6ICdmcmVkJywgJ3NlY29uZCc6ICdiYXJuZXknIH0pOwogICAgICogLy8gPT4geyAnZnJlZCc6ICdmaXJzdCcsICdiYXJuZXknOiAnc2Vjb25kJyB9CiAgICAgKi8KICAgIGZ1bmN0aW9uIGludmVydChvYmplY3QpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBwcm9wcyA9IGtleXMob2JqZWN0KSwKICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKICAgICAgICAgIHJlc3VsdCA9IHt9OwoKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdOwogICAgICAgIHJlc3VsdFtvYmplY3Rba2V5XV0gPSBrZXk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiB2YWx1ZS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgYm9vbGVhbiB2YWx1ZSwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8CiAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IGJvb2xDbGFzcyB8fCBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZGF0ZS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgZGF0ZSwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmlzRGF0ZShuZXcgRGF0ZSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IGRhdGVDbGFzcyB8fCBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLm5vZGVUeXBlID09PSAxIHx8IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZW1wdHkuIEFycmF5cywgc3RyaW5ncywgb3IgYGFyZ3VtZW50c2Agb2JqZWN0cyB3aXRoIGEKICAgICAqIGxlbmd0aCBvZiBgMGAgYW5kIG9iamVjdHMgd2l0aCBubyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFyZSBjb25zaWRlcmVkCiAgICAgKiAiZW1wdHkiLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKgogICAgICogXy5pc0VtcHR5KHt9KTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzRW1wdHkoJycpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7CiAgICAgIHZhciByZXN1bHQgPSB0cnVlOwogICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbCh2YWx1ZSksCiAgICAgICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7CgogICAgICBpZiAoKGNsYXNzTmFtZSA9PSBhcnJheUNsYXNzIHx8IGNsYXNzTmFtZSA9PSBzdHJpbmdDbGFzcyB8fCBjbGFzc05hbWUgPT0gYXJnc0NsYXNzICkgfHwKICAgICAgICAgIChjbGFzc05hbWUgPT0gb2JqZWN0Q2xhc3MgJiYgdHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyAmJiBpc0Z1bmN0aW9uKHZhbHVlLnNwbGljZSkpKSB7CiAgICAgICAgcmV0dXJuICFsZW5ndGg7CiAgICAgIH0KICAgICAgZm9yT3duKHZhbHVlLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHJlc3VsdCA9IGZhbHNlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlCiAgICAgKiBlcXVpdmFsZW50IHRvIGVhY2ggb3RoZXIuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZAogICAgICogdG8gY29tcGFyZSB2YWx1ZXMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRgIGNvbXBhcmlzb25zIHdpbGwKICAgICAqIGJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZAogICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM7IChhLCBiKS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7Kn0gYSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KICAgICAqIEBwYXJhbSB7Kn0gYiBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgdmFsdWVzLgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgb2JqZWN0ID0geyAnbmFtZSc6ICdmcmVkJyB9OwogICAgICogdmFyIGNvcHkgPSB7ICduYW1lJzogJ2ZyZWQnIH07CiAgICAgKgogICAgICogb2JqZWN0ID09IGNvcHk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICoKICAgICAqIF8uaXNFcXVhbChvYmplY3QsIGNvcHkpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIHZhciB3b3JkcyA9IFsnaGVsbG8nLCAnZ29vZGJ5ZSddOwogICAgICogdmFyIG90aGVyV29yZHMgPSBbJ2hpJywgJ2dvb2RieWUnXTsKICAgICAqCiAgICAgKiBfLmlzRXF1YWwod29yZHMsIG90aGVyV29yZHMsIGZ1bmN0aW9uKGEsIGIpIHsKICAgICAqICAgdmFyIHJlR3JlZXQgPSAvXig/OmhlbGxvfGhpKSQvaSwKICAgICAqICAgICAgIGFHcmVldCA9IF8uaXNTdHJpbmcoYSkgJiYgcmVHcmVldC50ZXN0KGEpLAogICAgICogICAgICAgYkdyZWV0ID0gXy5pc1N0cmluZyhiKSAmJiByZUdyZWV0LnRlc3QoYik7CiAgICAgKgogICAgICogICByZXR1cm4gKGFHcmVldCB8fCBiR3JlZXQpID8gKGFHcmVldCA9PSBiR3JlZXQpIDogdW5kZWZpbmVkOwogICAgICogfSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzRXF1YWwoYSwgYiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKGEsIGIsIHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nICYmIGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMikpOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMsIG9yIGNhbiBiZSBjb2VyY2VkIHRvLCBhIGZpbml0ZSBudW1iZXIuCiAgICAgKgogICAgICogTm90ZTogVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgbmF0aXZlIGBpc0Zpbml0ZWAgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBmb3IKICAgICAqIGJvb2xlYW5zIGFuZCBlbXB0eSBzdHJpbmdzLiBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xLjIuNS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGZpbml0ZSwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmlzRmluaXRlKC0xMDEpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNGaW5pdGUoJzEwJyk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc0Zpbml0ZSh0cnVlKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKgogICAgICogXy5pc0Zpbml0ZSgnJyk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICoKICAgICAqIF8uaXNGaW5pdGUoSW5maW5pdHkpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHsKICAgICAgcmV0dXJuIG5hdGl2ZUlzRmluaXRlKHZhbHVlKSAmJiAhbmF0aXZlSXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc0Z1bmN0aW9uKF8pOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJzsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZSBsYW5ndWFnZSB0eXBlIG9mIE9iamVjdC4KICAgICAqIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKQogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNPYmplY3Qoe30pOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzT2JqZWN0KDEpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHsKICAgICAgLy8gY2hlY2sgaWYgdGhlIHZhbHVlIGlzIHRoZSBFQ01BU2NyaXB0IGxhbmd1YWdlIHR5cGUgb2YgT2JqZWN0CiAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4OAogICAgICAvLyBhbmQgYXZvaWQgYSBWOCBidWcKICAgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjI5MQogICAgICByZXR1cm4gISEodmFsdWUgJiYgb2JqZWN0VHlwZXNbdHlwZW9mIHZhbHVlXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC4KICAgICAqCiAgICAgKiBOb3RlOiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBuYXRpdmUgYGlzTmFOYCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yCiAgICAgKiBgdW5kZWZpbmVkYCBhbmQgb3RoZXIgbm9uLW51bWVyaWMgdmFsdWVzLiBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xLjIuNC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNOYU4oTmFOKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogaXNOYU4odW5kZWZpbmVkKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzTmFOKHVuZGVmaW5lZCk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBpc05hTih2YWx1ZSkgewogICAgICAvLyBgTmFOYCBhcyBhIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYKICAgICAgLy8gKHBlcmZvcm0gdGhlIFtbQ2xhc3NdXSBjaGVjayBmaXJzdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBzb21lIGhvc3Qgb2JqZWN0cyBpbiBJRSkKICAgICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc051bGwobnVsbCk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc051bGwodW5kZWZpbmVkKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIG51bWJlci4KICAgICAqCiAgICAgKiBOb3RlOiBgTmFOYCBpcyBjb25zaWRlcmVkIGEgbnVtYmVyLiBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8vI3g4LjUuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmlzTnVtYmVyKDguNCAqIDUpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkgewogICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8CiAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IG51bWJlckNsYXNzIHx8IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHsKICAgICAqICAgdGhpcy54ID0gMDsKICAgICAqICAgdGhpcy55ID0gMDsKICAgICAqIH0KICAgICAqCiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IFNoYXBlKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKgogICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICoKICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICB2YXIgaXNQbGFpbk9iamVjdCA9ICFnZXRQcm90b3R5cGVPZiA/IHNoaW1Jc1BsYWluT2JqZWN0IDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYgKCEodmFsdWUgJiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gb2JqZWN0Q2xhc3MpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiwKICAgICAgICAgIG9ialByb3RvID0gaXNOYXRpdmUodmFsdWVPZikgJiYgKG9ialByb3RvID0gZ2V0UHJvdG90eXBlT2YodmFsdWVPZikpICYmIGdldFByb3RvdHlwZU9mKG9ialByb3RvKTsKCiAgICAgIHJldHVybiBvYmpQcm90bwogICAgICAgID8gKHZhbHVlID09IG9ialByb3RvIHx8IGdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBvYmpQcm90bykKICAgICAgICA6IHNoaW1Jc1BsYWluT2JqZWN0KHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgcmVndWxhciBleHByZXNzaW9uLCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNSZWdFeHAoL2ZyZWQvKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqLwogICAgZnVuY3Rpb24gaXNSZWdFeHAodmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSByZWdleHBDbGFzcyB8fCBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc1N0cmluZygnZnJlZCcpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkgewogICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8CiAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN0cmluZ0NsYXNzIHx8IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7CiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3VuZGVmaW5lZCc7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWQgYnkKICAgICAqIHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJvdWdoIHRoZSBjYWxsYmFjay4KICAgICAqIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7CiAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS4KICAgICAqCiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgKgogICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawogICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKICAgICAqIGVsc2UgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCiAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGggdmFsdWVzIG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggYGNhbGxiYWNrYCBleGVjdXRpb24uCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8ubWFwVmFsdWVzKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogM30gLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIG51bSAqIDM7IH0pOwogICAgICogLy8gPT4geyAnYSc6IDMsICdiJzogNiwgJ2MnOiA5IH0KICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IHsKICAgICAqICAgJ2ZyZWQnOiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfSwKICAgICAqICAgJ3BlYmJsZXMnOiB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9CiAgICAgKiB9OwogICAgICoKICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKICAgICAqIF8ubWFwVmFsdWVzKGNoYXJhY3RlcnMsICdhZ2UnKTsKICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0KICAgICAqLwogICAgZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CgogICAgICBmb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHsKICAgICAgICByZXN1bHRba2V5XSA9IGNhbGxiYWNrKHZhbHVlLCBrZXksIG9iamVjdCk7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmVjdXJzaXZlbHkgbWVyZ2VzIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSBvYmplY3QocyksIHRoYXQKICAgICAqIGRvbid0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgaW50byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LiBTdWJzZXF1ZW50IHNvdXJjZXMKICAgICAqIHdpbGwgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuIElmIGEgY2FsbGJhY2sgaXMKICAgICAqIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24KICAgICAqIGFuZCBzb3VyY2UgcHJvcGVydGllcy4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYHVuZGVmaW5lZGAgbWVyZ2luZyB3aWxsCiAgICAgKiBiZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQKICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOyAob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlKS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2luZyBwcm9wZXJ0aWVzLgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBuYW1lcyA9IHsKICAgICAqICAgJ2NoYXJhY3RlcnMnOiBbCiAgICAgKiAgICAgeyAnbmFtZSc6ICdiYXJuZXknIH0sCiAgICAgKiAgICAgeyAnbmFtZSc6ICdmcmVkJyB9CiAgICAgKiAgIF0KICAgICAqIH07CiAgICAgKgogICAgICogdmFyIGFnZXMgPSB7CiAgICAgKiAgICdjaGFyYWN0ZXJzJzogWwogICAgICogICAgIHsgJ2FnZSc6IDM2IH0sCiAgICAgKiAgICAgeyAnYWdlJzogNDAgfQogICAgICogICBdCiAgICAgKiB9OwogICAgICoKICAgICAqIF8ubWVyZ2UobmFtZXMsIGFnZXMpOwogICAgICogLy8gPT4geyAnY2hhcmFjdGVycyc6IFt7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LCB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV0gfQogICAgICoKICAgICAqIHZhciBmb29kID0gewogICAgICogICAnZnJ1aXRzJzogWydhcHBsZSddLAogICAgICogICAndmVnZXRhYmxlcyc6IFsnYmVldCddCiAgICAgKiB9OwogICAgICoKICAgICAqIHZhciBvdGhlckZvb2QgPSB7CiAgICAgKiAgICdmcnVpdHMnOiBbJ2JhbmFuYSddLAogICAgICogICAndmVnZXRhYmxlcyc6IFsnY2Fycm90J10KICAgICAqIH07CiAgICAgKgogICAgICogXy5tZXJnZShmb29kLCBvdGhlckZvb2QsIGZ1bmN0aW9uKGEsIGIpIHsKICAgICAqICAgcmV0dXJuIF8uaXNBcnJheShhKSA/IGEuY29uY2F0KGIpIDogdW5kZWZpbmVkOwogICAgICogfSk7CiAgICAgKiAvLyA9PiB7ICdmcnVpdHMnOiBbJ2FwcGxlJywgJ2JhbmFuYSddLCAndmVnZXRhYmxlcyc6IFsnYmVldCcsICdjYXJyb3RdIH0KICAgICAqLwogICAgZnVuY3Rpb24gbWVyZ2Uob2JqZWN0KSB7CiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLAogICAgICAgICAgbGVuZ3RoID0gMjsKCiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkgewogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KICAgICAgLy8gYWxsb3dzIHdvcmtpbmcgd2l0aCBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAgd2l0aG91dCB1c2luZwogICAgICAvLyB0aGVpciBgaW5kZXhgIGFuZCBgY29sbGVjdGlvbmAgYXJndW1lbnRzCiAgICAgIGlmICh0eXBlb2YgYXJnc1syXSAhPSAnbnVtYmVyJykgewogICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoOwogICAgICB9CiAgICAgIGlmIChsZW5ndGggPiAzICYmIHR5cGVvZiBhcmdzW2xlbmd0aCAtIDJdID09ICdmdW5jdGlvbicpIHsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soYXJnc1stLWxlbmd0aCAtIDFdLCBhcmdzW2xlbmd0aC0tXSwgMik7CiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiB0eXBlb2YgYXJnc1tsZW5ndGggLSAxXSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgY2FsbGJhY2sgPSBhcmdzWy0tbGVuZ3RoXTsKICAgICAgfQogICAgICB2YXIgc291cmNlcyA9IHNsaWNlKGFyZ3VtZW50cywgMSwgbGVuZ3RoKSwKICAgICAgICAgIGluZGV4ID0gLTEsCiAgICAgICAgICBzdGFja0EgPSBnZXRBcnJheSgpLAogICAgICAgICAgc3RhY2tCID0gZ2V0QXJyYXkoKTsKCiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlc1tpbmRleF0sIGNhbGxiYWNrLCBzdGFja0EsIHN0YWNrQik7CiAgICAgIH0KICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQSk7CiAgICAgIHJlbGVhc2VBcnJheShzdGFja0IpOwogICAgICByZXR1cm4gb2JqZWN0OwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYG9iamVjdGAgZXhjbHVkaW5nIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4KICAgICAqIFByb3BlcnR5IG5hbWVzIG1heSBiZSBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3IgYXMgYXJyYXlzIG9mCiAgICAgKiBwcm9wZXJ0eSBuYW1lcy4gSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkIGZvciBlYWNoCiAgICAgKiBwcm9wZXJ0eSBvZiBgb2JqZWN0YCBvbWl0dGluZyB0aGUgcHJvcGVydGllcyB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleQogICAgICogZm9yLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOwogICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgogICAgICogQHBhcmFtIHtGdW5jdGlvbnwuLi5zdHJpbmd8c3RyaW5nW119IFtjYWxsYmFja10gVGhlIHByb3BlcnRpZXMgdG8gb21pdCBvciB0aGUKICAgICAqICBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aG91dCB0aGUgb21pdHRlZCBwcm9wZXJ0aWVzLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLm9taXQoeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH0sICdhZ2UnKTsKICAgICAqIC8vID0+IHsgJ25hbWUnOiAnZnJlZCcgfQogICAgICoKICAgICAqIF8ub21pdCh7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfSwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAqICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJzsKICAgICAqIH0pOwogICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVkJyB9CiAgICAgKi8KICAgIGZ1bmN0aW9uIG9taXQob2JqZWN0LCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBwcm9wcyA9IFtdOwogICAgICAgIGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAgcHJvcHMucHVzaChrZXkpOwogICAgICAgIH0pOwogICAgICAgIHByb3BzID0gYmFzZURpZmZlcmVuY2UocHJvcHMsIGJhc2VGbGF0dGVuKGFyZ3VtZW50cywgdHJ1ZSwgZmFsc2UsIDEpKTsKCiAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07CiAgICAgICAgICByZXN1bHRba2V5XSA9IG9iamVjdFtrZXldOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CiAgICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHsKICAgICAgICAgIGlmICghY2FsbGJhY2sodmFsdWUsIGtleSwgb2JqZWN0KSkgewogICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5IG9mIGFuIG9iamVjdCdzIGtleS12YWx1ZSBwYWlycywKICAgICAqIGkuZS4gYFtba2V5MSwgdmFsdWUxXSwgW2tleTIsIHZhbHVlMl1dYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIG5ldyBhcnJheSBvZiBrZXktdmFsdWUgcGFpcnMuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8ucGFpcnMoeyAnYmFybmV5JzogMzYsICdmcmVkJzogNDAgfSk7CiAgICAgKiAvLyA9PiBbWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDQwXV0gKHByb3BlcnR5IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhaXJzKG9iamVjdCkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIHByb3BzID0ga2V5cyhvYmplY3QpLAogICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLAogICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKCiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTsKICAgICAgICByZXN1bHRbaW5kZXhdID0gW2tleSwgb2JqZWN0W2tleV1dOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgb2JqZWN0YCBjb21wb3NlZCBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuCiAgICAgKiBQcm9wZXJ0eSBuYW1lcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5cyBvZgogICAgICogcHJvcGVydHkgbmFtZXMuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZCBmb3IgZWFjaAogICAgICogcHJvcGVydHkgb2YgYG9iamVjdGAgcGlja2luZyB0aGUgcHJvcGVydGllcyB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleQogICAgICogZm9yLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOwogICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgogICAgICogQHBhcmFtIHtGdW5jdGlvbnwuLi5zdHJpbmd8c3RyaW5nW119IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIKICAgICAqICBpdGVyYXRpb24gb3IgcHJvcGVydHkgbmFtZXMgdG8gcGljaywgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgcHJvcGVydHkKICAgICAqICBuYW1lcyBvciBhcnJheXMgb2YgcHJvcGVydHkgbmFtZXMuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgcHJvcGVydGllcy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5waWNrKHsgJ25hbWUnOiAnZnJlZCcsICdfdXNlcmlkJzogJ2ZyZWQxJyB9LCAnbmFtZScpOwogICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVkJyB9CiAgICAgKgogICAgICogXy5waWNrKHsgJ25hbWUnOiAnZnJlZCcsICdfdXNlcmlkJzogJ2ZyZWQxJyB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgKiAgIHJldHVybiBrZXkuY2hhckF0KDApICE9ICdfJzsKICAgICAqIH0pOwogICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVkJyB9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHBpY2sob2JqZWN0LCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICBwcm9wcyA9IGJhc2VGbGF0dGVuKGFyZ3VtZW50cywgdHJ1ZSwgZmFsc2UsIDEpLAogICAgICAgICAgICBsZW5ndGggPSBpc09iamVjdChvYmplY3QpID8gcHJvcHMubGVuZ3RoIDogMDsKCiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07CiAgICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkgewogICAgICAgICAgICByZXN1bHRba2V5XSA9IG9iamVjdFtrZXldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CiAgICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHsKICAgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwga2V5LCBvYmplY3QpKSB7CiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWAgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ldwogICAgICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93bgogICAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzIHRocm91Z2ggYSBjYWxsYmFjaywgd2l0aCBlYWNoIGNhbGxiYWNrIGV4ZWN1dGlvbgogICAgICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8KICAgICAqIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOyAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuCiAgICAgKiBDYWxsYmFja3MgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgc3F1YXJlcyA9IF8udHJhbnNmb3JtKFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0sIGZ1bmN0aW9uKHJlc3VsdCwgbnVtKSB7CiAgICAgKiAgIG51bSAqPSBudW07CiAgICAgKiAgIGlmIChudW0gJSAyKSB7CiAgICAgKiAgICAgcmV0dXJuIHJlc3VsdC5wdXNoKG51bSkgPCAzOwogICAgICogICB9CiAgICAgKiB9KTsKICAgICAqIC8vID0+IFsxLCA5LCAyNV0KICAgICAqCiAgICAgKiB2YXIgbWFwcGVkID0gXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sIGZ1bmN0aW9uKHJlc3VsdCwgbnVtLCBrZXkpIHsKICAgICAqICAgcmVzdWx0W2tleV0gPSBudW0gKiAzOwogICAgICogfSk7CiAgICAgKiAvLyA9PiB7ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfQogICAgICovCiAgICBmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBjYWxsYmFjaywgYWNjdW11bGF0b3IsIHRoaXNBcmcpIHsKICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpOwogICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkgewogICAgICAgIGlmIChpc0FycikgewogICAgICAgICAgYWNjdW11bGF0b3IgPSBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yLAogICAgICAgICAgICAgIHByb3RvID0gY3RvciAmJiBjdG9yLnByb3RvdHlwZTsKCiAgICAgICAgICBhY2N1bXVsYXRvciA9IGJhc2VDcmVhdGUocHJvdG8pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgNCk7CiAgICAgICAgKGlzQXJyID8gZm9yRWFjaCA6IGZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSBjb21wb3NlZCBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cwogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLnZhbHVlcyh7ICdvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMyB9KTsKICAgICAqIC8vID0+IFsxLCAyLCAzXSAocHJvcGVydHkgb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKICAgICAqLwogICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIHByb3BzID0ga2V5cyhvYmplY3QpLAogICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLAogICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKCiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgcmVzdWx0W2luZGV4XSA9IG9iamVjdFtwcm9wc1tpbmRleF1dOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBpbmRleGVzLCBvciBrZXlzLCBvZiB0aGUKICAgICAqIGBjb2xsZWN0aW9uYC4gSW5kZXhlcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5cwogICAgICogb2YgaW5kZXhlcy4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdfHN0cmluZ3xzdHJpbmdbXSl9IFtpbmRleF0gVGhlIGluZGV4ZXMgb2YgYGNvbGxlY3Rpb25gCiAgICAgKiAgIHRvIHJldHJpZXZlLCBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBpbmRleGVzIG9yIGFycmF5cyBvZiBpbmRleGVzLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCiAgICAgKiAgcHJvdmlkZWQgaW5kZXhlcy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5hdChbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddLCBbMCwgMiwgNF0pOwogICAgICogLy8gPT4gWydhJywgJ2MnLCAnZSddCiAgICAgKgogICAgICogXy5hdChbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXSwgMCwgMik7CiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAncGViYmxlcyddCiAgICAgKi8KICAgIGZ1bmN0aW9uIGF0KGNvbGxlY3Rpb24pIHsKICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICBpbmRleCA9IC0xLAogICAgICAgICAgcHJvcHMgPSBiYXNlRmxhdHRlbihhcmdzLCB0cnVlLCBmYWxzZSwgMSksCiAgICAgICAgICBsZW5ndGggPSAoYXJnc1syXSAmJiBhcmdzWzJdW2FyZ3NbMV1dID09PSBjb2xsZWN0aW9uKSA/IDEgOiBwcm9wcy5sZW5ndGgsCiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpOwoKICAgICAgd2hpbGUoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHJlc3VsdFtpbmRleF0gPSBjb2xsZWN0aW9uW3Byb3BzW2luZGV4XV07CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIHZhbHVlIGlzIHByZXNlbnQgaW4gYSBjb2xsZWN0aW9uIHVzaW5nIHN0cmljdCBlcXVhbGl0eQogICAgICogZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQgaXMgdXNlZCBhcyB0aGUKICAgICAqIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBhbGlhcyBpbmNsdWRlCiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gY2hlY2sgZm9yLgogICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdGFyZ2V0YCBlbGVtZW50IGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uY29udGFpbnMoWzEsIDIsIDNdLCAxKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmNvbnRhaW5zKFsxLCAyLCAzXSwgMSwgMik7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICoKICAgICAqIF8uY29udGFpbnMoeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH0sICdmcmVkJyk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5jb250YWlucygncGViYmxlcycsICdlYicpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBjb250YWlucyhjb2xsZWN0aW9uLCB0YXJnZXQsIGZyb21JbmRleCkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGluZGV4T2YgPSBnZXRJbmRleE9mKCksCiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLAogICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CgogICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4IDwgMCA/IG5hdGl2ZU1heCgwLCBsZW5ndGggKyBmcm9tSW5kZXgpIDogZnJvbUluZGV4KSB8fCAwOwogICAgICBpZiAoaXNBcnJheShjb2xsZWN0aW9uKSkgewogICAgICAgIHJlc3VsdCA9IGluZGV4T2YoY29sbGVjdGlvbiwgdGFyZ2V0LCBmcm9tSW5kZXgpID4gLTE7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgewogICAgICAgIHJlc3VsdCA9IChpc1N0cmluZyhjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24uaW5kZXhPZih0YXJnZXQsIGZyb21JbmRleCkgOiBpbmRleE9mKGNvbGxlY3Rpb24sIHRhcmdldCwgZnJvbUluZGV4KSkgPiAtMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGlmICgrK2luZGV4ID49IGZyb21JbmRleCkgewogICAgICAgICAgICByZXR1cm4gIShyZXN1bHQgPSB2YWx1ZSA9PT0gdGFyZ2V0KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nCiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocm91Z2ggdGhlIGNhbGxiYWNrLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZQogICAgICogb2YgZWFjaCBrZXkgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5IHdhcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2suCiAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOwogICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgogICAgICoKICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KICAgICAqCiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAogICAgICogZWxzZSBgZmFsc2VgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCiAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmNvdW50QnkoWzQuMywgNi4xLCA2LjRdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIE1hdGguZmxvb3IobnVtKTsgfSk7CiAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH0KICAgICAqCiAgICAgKiBfLmNvdW50QnkoWzQuMywgNi4xLCA2LjRdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIHRoaXMuZmxvb3IobnVtKTsgfSwgTWF0aCk7CiAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH0KICAgICAqCiAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTsKICAgICAqIC8vID0+IHsgJzMnOiAyLCAnNSc6IDEgfQogICAgICovCiAgICB2YXIgY291bnRCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7CiAgICAgIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSA/IHJlc3VsdFtrZXldKysgOiByZXN1bHRba2V5XSA9IDEpOwogICAgfSk7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkgdmFsdWUgZm9yICoqYWxsKiogZWxlbWVudHMgb2YKICAgICAqIGEgY29sbGVjdGlvbi4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlCiAgICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KICAgICAqCiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgKgogICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawogICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKICAgICAqIGVsc2UgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGFsaWFzIGFsbAogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAogICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzZWQgdGhlIGNhbGxiYWNrIGNoZWNrLAogICAgICogIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKgogICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KICAgICAqIF07CiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5ldmVyeShjaGFyYWN0ZXJzLCAnYWdlJyk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5ldmVyeShjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAzNiB9KTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgIHZhciByZXN1bHQgPSB0cnVlOwogICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CgogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CgogICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgewogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICBpZiAoIShyZXN1bHQgPSAhIWNhbGxiYWNrKGNvbGxlY3Rpb25baW5kZXhdLCBpbmRleCwgY29sbGVjdGlvbikpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CiAgICAgICAgICByZXR1cm4gKHJlc3VsdCA9ICEhY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzCiAgICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleSBmb3IuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kCiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBhbGlhcyBzZWxlY3QKICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHBhc3NlZCB0aGUgY2FsbGJhY2sgY2hlY2suCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBldmVucyA9IF8uZmlsdGVyKFsxLCAyLCAzLCA0LCA1LCA2XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gJSAyID09IDA7IH0pOwogICAgICogLy8gPT4gWzIsIDQsIDZdCiAgICAgKgogICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH0sCiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfQogICAgICogXTsKICAgICAqCiAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCiAgICAgKiBfLmZpbHRlcihjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwogICAgICogLy8gPT4gW3sgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiB0cnVlIH1dCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5maWx0ZXIoY2hhcmFjdGVycywgeyAnYWdlJzogMzYgfSk7CiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfV0KICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwoKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOwoKICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHsKICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07CiAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkgewogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKICAgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBhIGNvbGxlY3Rpb24sIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0CiAgICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleSBmb3IuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kCiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBhbGlhcyBkZXRlY3QsIGZpbmRXaGVyZQogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAogICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwogICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfSwKICAgICAqICAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYmxvY2tlZCc6IGZhbHNlIH0KICAgICAqIF07CiAgICAgKgogICAgICogXy5maW5kKGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikgewogICAgICogICByZXR1cm4gY2hyLmFnZSA8IDQwOwogICAgICogfSk7CiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxzZSB9CiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5maW5kKGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDEgfSk7CiAgICAgKiAvLyA9PiAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2FnZSc6IDEsICdibG9ja2VkJzogZmFsc2UgfQogICAgICoKICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKICAgICAqIF8uZmluZChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwogICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfQogICAgICovCiAgICBmdW5jdGlvbiBmaW5kKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKCiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDsKCiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7CiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbGxlY3Rpb25baW5kZXhdOwogICAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKICAgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCiAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obnVtKSB7CiAgICAgKiAgIHJldHVybiBudW0gJSAyID09IDE7CiAgICAgKiB9KTsKICAgICAqIC8vID0+IDMKICAgICAqLwogICAgZnVuY3Rpb24gZmluZExhc3QoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIHJlc3VsdDsKICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CiAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHsKICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGEgY29sbGVjdGlvbiwgZXhlY3V0aW5nIHRoZSBjYWxsYmFjayBmb3IgZWFjaAogICAgICogZWxlbWVudC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsKICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4gQ2FsbGJhY2tzIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieQogICAgICogZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KICAgICAqCiAgICAgKiBOb3RlOiBBcyB3aXRoIG90aGVyICJDb2xsZWN0aW9ucyIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgYGxlbmd0aGAgcHJvcGVydHkKICAgICAqIGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciBgXy5mb3JJbmAgb3IgYF8uZm9yT3duYAogICAgICogbWF5IGJlIHVzZWQgZm9yIG9iamVjdCBpdGVyYXRpb24uCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBhbGlhcyBlYWNoCiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMge0FycmF5fE9iamVjdHxzdHJpbmd9IFJldHVybnMgYGNvbGxlY3Rpb25gLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfKFsxLCAyLCAzXSkuZm9yRWFjaChmdW5jdGlvbihudW0pIHsgY29uc29sZS5sb2cobnVtKTsgfSkuam9pbignLCcpOwogICAgICogLy8gPT4gbG9ncyBlYWNoIG51bWJlciBhbmQgcmV0dXJucyAnMSwyLDMnCiAgICAgKgogICAgICogXy5mb3JFYWNoKHsgJ29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzIH0sIGZ1bmN0aW9uKG51bSkgeyBjb25zb2xlLmxvZyhudW0pOyB9KTsKICAgICAqIC8vID0+IGxvZ3MgZWFjaCBudW1iZXIgYW5kIHJldHVybnMgdGhlIG9iamVjdCAocHJvcGVydHkgb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKICAgICAqLwogICAgZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CgogICAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQnID8gY2FsbGJhY2sgOiBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgewogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICBpZiAoY2FsbGJhY2soY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBjYWxsYmFjayk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbGxlY3Rpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKICAgICAqIG9mIGEgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGFsaWFzIGVhY2hSaWdodAogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R8c3RyaW5nfSBSZXR1cm5zIGBjb2xsZWN0aW9uYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXyhbMSwgMiwgM10pLmZvckVhY2hSaWdodChmdW5jdGlvbihudW0pIHsgY29uc29sZS5sb2cobnVtKTsgfSkuam9pbignLCcpOwogICAgICogLy8gPT4gbG9ncyBlYWNoIG51bWJlciBmcm9tIHJpZ2h0IHRvIGxlZnQgYW5kIHJldHVybnMgJzMsMiwxJwogICAgICovCiAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgdHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcgPyBjYWxsYmFjayA6IGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7CiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgICBpZiAoY2FsbGJhY2soY29sbGVjdGlvbltsZW5ndGhdLCBsZW5ndGgsIGNvbGxlY3Rpb24pID09PSBmYWxzZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHByb3BzID0ga2V5cyhjb2xsZWN0aW9uKTsKICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7CiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHsKICAgICAgICAgIGtleSA9IHByb3BzID8gcHJvcHNbLS1sZW5ndGhdIDogLS1sZW5ndGg7CiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY29sbGVjdGlvbltrZXldLCBrZXksIGNvbGxlY3Rpb24pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBjb2xsZWN0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nCiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYSBjb2xsZWN0aW9uIHRocm91Z2ggdGhlIGNhbGxiYWNrLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZQogICAgICogb2YgZWFjaCBrZXkgaXMgYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuCiAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOwogICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgogICAgICoKICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KICAgICAqCiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAogICAgICogZWxzZSBgZmFsc2VgCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uZ3JvdXBCeShbNC4yLCA2LjEsIDYuNF0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gTWF0aC5mbG9vcihudW0pOyB9KTsKICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjRdIH0KICAgICAqCiAgICAgKiBfLmdyb3VwQnkoWzQuMiwgNi4xLCA2LjRdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIHRoaXMuZmxvb3IobnVtKTsgfSwgTWF0aCk7CiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi40XSB9CiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5ncm91cEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7CiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH0KICAgICAqLwogICAgdmFyIGdyb3VwQnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkgewogICAgICAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkgPyByZXN1bHRba2V5XSA6IHJlc3VsdFtrZXldID0gW10pLnB1c2godmFsdWUpOwogICAgfSk7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcKICAgICAqIGVhY2ggZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbiB0aHJvdWdoIHRoZSBnaXZlbiBjYWxsYmFjay4gVGhlIGNvcnJlc3BvbmRpbmcKICAgICAqIHZhbHVlIG9mIGVhY2gga2V5IGlzIHRoZSBsYXN0IGVsZW1lbnQgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGtleS4KICAgICAqIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7CiAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBrZXlzID0gWwogICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwKICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfQogICAgICogXTsKICAgICAqCiAgICAgKiBfLmluZGV4Qnkoa2V5cywgJ2RpcicpOwogICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH0KICAgICAqCiAgICAgKiBfLmluZGV4Qnkoa2V5cywgZnVuY3Rpb24oa2V5KSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGtleS5jb2RlKTsgfSk7CiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9CiAgICAgKgogICAgICogXy5pbmRleEJ5KGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGtleSkgeyB0aGlzLmZyb21DaGFyQ29kZShrZXkuY29kZSk7IH0sIFN0cmluZyk7CiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9CiAgICAgKi8KICAgIHZhciBpbmRleEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHsKICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTsKICAgIH0pOwoKICAgIC8qKgogICAgICogSW52b2tlcyB0aGUgbWV0aG9kIG5hbWVkIGJ5IGBtZXRob2ROYW1lYCBvbiBlYWNoIGVsZW1lbnQgaW4gdGhlIGBjb2xsZWN0aW9uYAogICAgICogcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFkZGl0aW9uYWwgYXJndW1lbnRzCiAgICAgKiB3aWxsIGJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBtZXRob2ROYW1lYCBpcyBhIGZ1bmN0aW9uIGl0CiAgICAgKiB3aWxsIGJlIGludm9rZWQgZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gdGhlIGBjb2xsZWN0aW9uYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3IKICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGludm9rZWQgbWV0aG9kLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmludm9rZShbWzUsIDEsIDddLCBbMywgMiwgMV1dLCAnc29ydCcpOwogICAgICogLy8gPT4gW1sxLCA1LCA3XSwgWzEsIDIsIDNdXQogICAgICoKICAgICAqIF8uaW52b2tlKFsxMjMsIDQ1Nl0sIFN0cmluZy5wcm90b3R5cGUuc3BsaXQsICcnKTsKICAgICAqIC8vID0+IFtbJzEnLCAnMicsICczJ10sIFsnNCcsICc1JywgJzYnXV0KICAgICAqLwogICAgZnVuY3Rpb24gaW52b2tlKGNvbGxlY3Rpb24sIG1ldGhvZE5hbWUpIHsKICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMsIDIpLAogICAgICAgICAgaW5kZXggPSAtMSwKICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBtZXRob2ROYW1lID09ICdmdW5jdGlvbicsCiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLAogICAgICAgICAgcmVzdWx0ID0gQXJyYXkodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyA/IGxlbmd0aCA6IDApOwoKICAgICAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IChpc0Z1bmMgPyBtZXRob2ROYW1lIDogdmFsdWVbbWV0aG9kTmFtZV0pLmFwcGx5KHZhbHVlLCBhcmdzKTsKICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbgogICAgICogdGhyb3VnaCB0aGUgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aAogICAgICogdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBhbGlhcyBjb2xsZWN0CiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCiAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBgY2FsbGJhY2tgIGV4ZWN1dGlvbi4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5tYXAoWzEsIDIsIDNdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIG51bSAqIDM7IH0pOwogICAgICogLy8gPT4gWzMsIDYsIDldCiAgICAgKgogICAgICogXy5tYXAoeyAnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMgfSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gKiAzOyB9KTsKICAgICAqIC8vID0+IFszLCA2LCA5XSAocHJvcGVydHkgb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfQogICAgICogXTsKICAgICAqCiAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCiAgICAgKiBfLm1hcChjaGFyYWN0ZXJzLCAnbmFtZScpOwogICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CgogICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7CiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBjYWxsYmFjayhjb2xsZWN0aW9uW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rpb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSBbXTsKICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikgewogICAgICAgICAgcmVzdWx0WysraW5kZXhdID0gY2FsbGJhY2sodmFsdWUsIGtleSwgY29sbGVjdGlvbik7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhIGNvbGxlY3Rpb24uIElmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5IG9yCiAgICAgKiBmYWxzZXkgYC1JbmZpbml0eWAgaXMgcmV0dXJuZWQuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZAogICAgICogZm9yIGVhY2ggdmFsdWUgaW4gdGhlIGNvbGxlY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaCB0aGUgdmFsdWUKICAgICAqIGlzIHJhbmtlZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlCiAgICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pLgogICAgICoKICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KICAgICAqCiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAogICAgICogZWxzZSBgZmFsc2VgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCiAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5tYXgoWzQsIDIsIDgsIDZdKTsKICAgICAqIC8vID0+IDgKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfQogICAgICogXTsKICAgICAqCiAgICAgKiBfLm1heChjaGFyYWN0ZXJzLCBmdW5jdGlvbihjaHIpIHsgcmV0dXJuIGNoci5hZ2U7IH0pOwogICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH07CiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5tYXgoY2hhcmFjdGVycywgJ2FnZScpOwogICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH07CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1heChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgY29tcHV0ZWQgPSAtSW5maW5pdHksCiAgICAgICAgICByZXN1bHQgPSBjb21wdXRlZDsKCiAgICAgIC8vIGFsbG93cyB3b3JraW5nIHdpdGggZnVuY3Rpb25zIGxpa2UgYF8ubWFwYCB3aXRob3V0IHVzaW5nCiAgICAgIC8vIHRoZWlyIGBpbmRleGAgYXJndW1lbnQgYXMgYSBjYWxsYmFjawogICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicgJiYgdGhpc0FyZyAmJiB0aGlzQXJnW2NhbGxiYWNrXSA9PT0gY29sbGVjdGlvbikgewogICAgICAgIGNhbGxiYWNrID0gbnVsbDsKICAgICAgfQogICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCAmJiBpc0FycmF5KGNvbGxlY3Rpb24pKSB7CiAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoOwoKICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07CiAgICAgICAgICBpZiAodmFsdWUgPiByZXN1bHQpIHsKICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNhbGxiYWNrID0gKGNhbGxiYWNrID09IG51bGwgJiYgaXNTdHJpbmcoY29sbGVjdGlvbikpCiAgICAgICAgICA/IGNoYXJBdENhbGxiYWNrCiAgICAgICAgICA6IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CgogICAgICAgIGZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CiAgICAgICAgICB2YXIgY3VycmVudCA9IGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7CiAgICAgICAgICBpZiAoY3VycmVudCA+IGNvbXB1dGVkKSB7CiAgICAgICAgICAgIGNvbXB1dGVkID0gY3VycmVudDsKICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHJpZXZlcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBhIGNvbGxlY3Rpb24uIElmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5IG9yCiAgICAgKiBmYWxzZXkgYEluZmluaXR5YCBpcyByZXR1cm5lZC4gSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkCiAgICAgKiBmb3IgZWFjaCB2YWx1ZSBpbiB0aGUgY29sbGVjdGlvbiB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoIHRoZSB2YWx1ZQogICAgICogaXMgcmFua2VkLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUKICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pOwogICAgICogLy8gPT4gMgogICAgICoKICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwogICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LAogICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9CiAgICAgKiBdOwogICAgICoKICAgICAqIF8ubWluKGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikgeyByZXR1cm4gY2hyLmFnZTsgfSk7CiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9OwogICAgICoKICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKICAgICAqIF8ubWluKGNoYXJhY3RlcnMsICdhZ2UnKTsKICAgICAqIC8vID0+IHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH07CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1pbihjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgY29tcHV0ZWQgPSBJbmZpbml0eSwKICAgICAgICAgIHJlc3VsdCA9IGNvbXB1dGVkOwoKICAgICAgLy8gYWxsb3dzIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgIHdpdGhvdXQgdXNpbmcKICAgICAgLy8gdGhlaXIgYGluZGV4YCBhcmd1bWVudCBhcyBhIGNhbGxiYWNrCiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJyAmJiB0aGlzQXJnICYmIHRoaXNBcmdbY2FsbGJhY2tdID09PSBjb2xsZWN0aW9uKSB7CiAgICAgICAgY2FsbGJhY2sgPSBudWxsOwogICAgICB9CiAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsICYmIGlzQXJyYXkoY29sbGVjdGlvbikpIHsKICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7CgogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xsZWN0aW9uW2luZGV4XTsKICAgICAgICAgIGlmICh2YWx1ZSA8IHJlc3VsdCkgewogICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2FsbGJhY2sgPSAoY2FsbGJhY2sgPT0gbnVsbCAmJiBpc1N0cmluZyhjb2xsZWN0aW9uKSkKICAgICAgICAgID8gY2hhckF0Q2FsbGJhY2sKICAgICAgICAgIDogbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKCiAgICAgICAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKICAgICAgICAgIHZhciBjdXJyZW50ID0gY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTsKICAgICAgICAgIGlmIChjdXJyZW50IDwgY29tcHV0ZWQpIHsKICAgICAgICAgICAgY29tcHV0ZWQgPSBjdXJyZW50OwogICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwcm9wZXJ0eSBmcm9tIGFsbCBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHR5cGUgRnVuY3Rpb24KICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGx1Y2suCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfQogICAgICogXTsKICAgICAqCiAgICAgKiBfLnBsdWNrKGNoYXJhY3RlcnMsICduYW1lJyk7CiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ10KICAgICAqLwogICAgdmFyIHBsdWNrID0gbWFwOwoKICAgIC8qKgogICAgICogUmVkdWNlcyBhIGNvbGxlY3Rpb24gdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmcKICAgICAqIGVhY2ggZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbiB0aHJvdWdoIHRoZSBjYWxsYmFjaywgd2hlcmUgZWFjaCBzdWNjZXNzaXZlCiAgICAgKiBjYWxsYmFjayBleGVjdXRpb24gY29uc3VtZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMgZXhlY3V0aW9uLiBJZgogICAgICogYGFjY3VtdWxhdG9yYCBpcyBub3QgcHJvdmlkZWQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24gd2lsbCBiZQogICAgICogdXNlZCBhcyB0aGUgaW5pdGlhbCBgYWNjdW11bGF0b3JgIHZhbHVlLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgCiAgICAgKiBhbmQgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOyAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAYWxpYXMgZm9sZGwsIGluamVjdAogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gSW5pdGlhbCB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0b3IuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIHN1bSA9IF8ucmVkdWNlKFsxLCAyLCAzXSwgZnVuY3Rpb24oc3VtLCBudW0pIHsKICAgICAqICAgcmV0dXJuIHN1bSArIG51bTsKICAgICAqIH0pOwogICAgICogLy8gPT4gNgogICAgICoKICAgICAqIHZhciBtYXBwZWQgPSBfLnJlZHVjZSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgZnVuY3Rpb24ocmVzdWx0LCBudW0sIGtleSkgewogICAgICogICByZXN1bHRba2V5XSA9IG51bSAqIDM7CiAgICAgKiAgIHJldHVybiByZXN1bHQ7CiAgICAgKiB9LCB7fSk7CiAgICAgKiAvLyA9PiB7ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfQogICAgICovCiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgY2FsbGJhY2ssIGFjY3VtdWxhdG9yLCB0aGlzQXJnKSB7CiAgICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICB2YXIgbm9hY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzOwogICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgNCk7CgogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoOwoKICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHsKICAgICAgICBpZiAobm9hY2N1bSkgewogICAgICAgICAgYWNjdW11bGF0b3IgPSBjb2xsZWN0aW9uWysraW5kZXhdOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikgewogICAgICAgICAgYWNjdW11bGF0b3IgPSBub2FjY3VtCiAgICAgICAgICAgID8gKG5vYWNjdW0gPSBmYWxzZSwgdmFsdWUpCiAgICAgICAgICAgIDogY2FsbGJhY2soYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwogICAgICogb2YgYSBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAYWxpYXMgZm9sZHIKICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIEluaXRpYWwgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBsaXN0ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dOwogICAgICogdmFyIGZsYXQgPSBfLnJlZHVjZVJpZ2h0KGxpc3QsIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEuY29uY2F0KGIpOyB9LCBbXSk7CiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV0KICAgICAqLwogICAgZnVuY3Rpb24gcmVkdWNlUmlnaHQoY29sbGVjdGlvbiwgY2FsbGJhY2ssIGFjY3VtdWxhdG9yLCB0aGlzQXJnKSB7CiAgICAgIHZhciBub2FjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7CiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCA0KTsKICAgICAgZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikgewogICAgICAgIGFjY3VtdWxhdG9yID0gbm9hY2N1bQogICAgICAgICAgPyAobm9hY2N1bSA9IGZhbHNlLCB2YWx1ZSkKICAgICAgICAgIDogY2FsbGJhY2soYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7CiAgICAgIH0pOwogICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uZmlsdGVyYCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBhCiAgICAgKiBjb2xsZWN0aW9uIHRoYXQgdGhlIGNhbGxiYWNrIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1ZXkgZm9yLgogICAgICoKICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KICAgICAqCiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAogICAgICogZWxzZSBgZmFsc2VgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCiAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBmYWlsZWQgdGhlIGNhbGxiYWNrIGNoZWNrLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgb2RkcyA9IF8ucmVqZWN0KFsxLCAyLCAzLCA0LCA1LCA2XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gJSAyID09IDA7IH0pOwogICAgICogLy8gPT4gWzEsIDMsIDVdCiAgICAgKgogICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH0sCiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfQogICAgICogXTsKICAgICAqCiAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCiAgICAgKiBfLnJlamVjdChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwogICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH1dCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5yZWplY3QoY2hhcmFjdGVycywgeyAnYWdlJzogMzYgfSk7CiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfV0KICAgICAqLwogICAgZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKICAgICAgcmV0dXJuIGZpbHRlcihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKICAgICAgICByZXR1cm4gIWNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7CiAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogUmV0cmlldmVzIGEgcmFuZG9tIGVsZW1lbnQgb3IgYG5gIHJhbmRvbSBlbGVtZW50cyBmcm9tIGEgY29sbGVjdGlvbi4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLgogICAgICogQHBhcmFtIHtudW1iZXJ9IFtuXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS4KICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBBbGxvd3Mgd29ya2luZyB3aXRoIGZ1bmN0aW9ucyBsaWtlIGBfLm1hcGAKICAgICAqICB3aXRob3V0IHVzaW5nIHRoZWlyIGBpbmRleGAgYXJndW1lbnRzIGFzIGBuYC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIHNhbXBsZShzKSBvZiBgY29sbGVjdGlvbmAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7CiAgICAgKiAvLyA9PiAyCiAgICAgKgogICAgICogXy5zYW1wbGUoWzEsIDIsIDMsIDRdLCAyKTsKICAgICAqIC8vID0+IFszLCAxXQogICAgICovCiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIHsKICAgICAgaWYgKGNvbGxlY3Rpb24gJiYgdHlwZW9mIGNvbGxlY3Rpb24ubGVuZ3RoICE9ICdudW1iZXInKSB7CiAgICAgICAgY29sbGVjdGlvbiA9IHZhbHVlcyhjb2xsZWN0aW9uKTsKICAgICAgfQogICAgICBpZiAobiA9PSBudWxsIHx8IGd1YXJkKSB7CiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uW2Jhc2VSYW5kb20oMCwgY29sbGVjdGlvbi5sZW5ndGggLSAxKV0gOiB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdCA9IHNodWZmbGUoY29sbGVjdGlvbik7CiAgICAgIHJlc3VsdC5sZW5ndGggPSBuYXRpdmVNaW4obmF0aXZlTWF4KDAsIG4pLCByZXN1bHQubGVuZ3RoKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygc2h1ZmZsZWQgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlIEZpc2hlci1ZYXRlcwogICAgICogc2h1ZmZsZS4gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgc2h1ZmZsZWQgY29sbGVjdGlvbi4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5zaHVmZmxlKFsxLCAyLCAzLCA0LCA1LCA2XSk7CiAgICAgKiAvLyA9PiBbNCwgMSwgNiwgMywgNSwgMl0KICAgICAqLwogICAgZnVuY3Rpb24gc2h1ZmZsZShjb2xsZWN0aW9uKSB7CiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMCwKICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgPyBsZW5ndGggOiAwKTsKCiAgICAgIGZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB2YXIgcmFuZCA9IGJhc2VSYW5kb20oMCwgKytpbmRleCk7CiAgICAgICAgcmVzdWx0W2luZGV4XSA9IHJlc3VsdFtyYW5kXTsKICAgICAgICByZXN1bHRbcmFuZF0gPSB2YWx1ZTsKICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGBjb2xsZWN0aW9uLmxlbmd0aGAgZm9yIGFycmF5cwogICAgICogYW5kIGFycmF5LWxpa2Ugb2JqZWN0cyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGBjb2xsZWN0aW9uLmxlbmd0aGAgb3IgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uc2l6ZShbMSwgMl0pOwogICAgICogLy8gPT4gMgogICAgICoKICAgICAqIF8uc2l6ZSh7ICdvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMyB9KTsKICAgICAqIC8vID0+IDMKICAgICAqCiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTsKICAgICAqIC8vID0+IDcKICAgICAqLwogICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7CiAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOwogICAgICByZXR1cm4gdHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyA/IGxlbmd0aCA6IGtleXMoY29sbGVjdGlvbikubGVuZ3RoOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgdHJ1ZXkgdmFsdWUgZm9yICoqYW55KiogZWxlbWVudCBvZiBhCiAgICAgKiBjb2xsZWN0aW9uLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhcyBzb29uIGFzIGl0IGZpbmRzIGEgcGFzc2luZyB2YWx1ZSBhbmQKICAgICAqIGRvZXMgbm90IGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGNvbGxlY3Rpb24uIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0bwogICAgICogYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBhbGlhcyBhbnkKICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZWQgdGhlIGNhbGxiYWNrIGNoZWNrLAogICAgICogIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9CiAgICAgKiBdOwogICAgICoKICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKICAgICAqIF8uc29tZShjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKICAgICAqIF8uc29tZShjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAxIH0pOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgcmVzdWx0OwogICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CgogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CgogICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgewogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICBpZiAoKHJlc3VsdCA9IGNhbGxiYWNrKGNvbGxlY3Rpb25baW5kZXhdLCBpbmRleCwgY29sbGVjdGlvbikpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CiAgICAgICAgICByZXR1cm4gIShyZXN1bHQgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gISFyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mCiAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhyb3VnaCB0aGUgY2FsbGJhY2suIFRoaXMgbWV0aG9kCiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCB3aWxsIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyCiAgICAgKiBvZiBlcXVhbCBlbGVtZW50cy4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoCiAgICAgKiB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KICAgICAqCiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgKgogICAgICogSWYgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNvbGxlY3Rpb24KICAgICAqIHdpbGwgYmUgc29ydGVkIGJ5IGVhY2ggcHJvcGVydHkgdmFsdWUuCiAgICAgKgogICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawogICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKICAgICAqIGVsc2UgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAogICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHNvcnRlZCBlbGVtZW50cy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5zb3J0QnkoWzEsIDIsIDNdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIE1hdGguc2luKG51bSk7IH0pOwogICAgICogLy8gPT4gWzMsIDEsIDJdCiAgICAgKgogICAgICogXy5zb3J0QnkoWzEsIDIsIDNdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIHRoaXMuc2luKG51bSk7IH0sIE1hdGgpOwogICAgICogLy8gPT4gWzMsIDEsIDJdCiAgICAgKgogICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LAogICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSwKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2FnZSc6IDI2IH0sCiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdhZ2UnOiAzMCB9CiAgICAgKiBdOwogICAgICoKICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKICAgICAqIF8ubWFwKF8uc29ydEJ5KGNoYXJhY3RlcnMsICdhZ2UnKSwgXy52YWx1ZXMpOwogICAgICogLy8gPT4gW1snYmFybmV5JywgMjZdLCBbJ2ZyZWQnLCAzMF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCA0MF1dCiAgICAgKgogICAgICogLy8gc29ydGluZyBieSBtdWx0aXBsZSBwcm9wZXJ0aWVzCiAgICAgKiBfLm1hcChfLnNvcnRCeShjaGFyYWN0ZXJzLCBbJ25hbWUnLCAnYWdlJ10pLCBfLnZhbHVlcyk7CiAgICAgKiAvLyA9ID4gW1snYmFybmV5JywgMjZdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0MF1dCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNvcnRCeShjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGlzQXJyID0gaXNBcnJheShjYWxsYmFjayksCiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLAogICAgICAgICAgcmVzdWx0ID0gQXJyYXkodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyA/IGxlbmd0aCA6IDApOwoKICAgICAgaWYgKCFpc0FycikgewogICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKICAgICAgfQogICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHsKICAgICAgICB2YXIgb2JqZWN0ID0gcmVzdWx0WysraW5kZXhdID0gZ2V0T2JqZWN0KCk7CiAgICAgICAgaWYgKGlzQXJyKSB7CiAgICAgICAgICBvYmplY3QuY3JpdGVyaWEgPSBtYXAoY2FsbGJhY2ssIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIChvYmplY3QuY3JpdGVyaWEgPSBnZXRBcnJheSgpKVswXSA9IGNhbGxiYWNrKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pOwogICAgICAgIH0KICAgICAgICBvYmplY3QuaW5kZXggPSBpbmRleDsKICAgICAgICBvYmplY3QudmFsdWUgPSB2YWx1ZTsKICAgICAgfSk7CgogICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOwogICAgICByZXN1bHQuc29ydChjb21wYXJlQXNjZW5kaW5nKTsKICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgdmFyIG9iamVjdCA9IHJlc3VsdFtsZW5ndGhdOwogICAgICAgIHJlc3VsdFtsZW5ndGhdID0gb2JqZWN0LnZhbHVlOwogICAgICAgIGlmICghaXNBcnIpIHsKICAgICAgICAgIHJlbGVhc2VBcnJheShvYmplY3QuY3JpdGVyaWEpOwogICAgICAgIH0KICAgICAgICByZWxlYXNlT2JqZWN0KG9iamVjdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnRzIHRoZSBgY29sbGVjdGlvbmAgdG8gYW4gYXJyYXkuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGNvbnZlcnQuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBjb252ZXJ0ZWQgYXJyYXkuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIChmdW5jdGlvbigpIHsgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpLnNsaWNlKDEpOyB9KSgxLCAyLCAzLCA0KTsKICAgICAqIC8vID0+IFsyLCAzLCA0XQogICAgICovCiAgICBmdW5jdGlvbiB0b0FycmF5KGNvbGxlY3Rpb24pIHsKICAgICAgaWYgKGNvbGxlY3Rpb24gJiYgdHlwZW9mIGNvbGxlY3Rpb24ubGVuZ3RoID09ICdudW1iZXInKSB7CiAgICAgICAgcmV0dXJuIHNsaWNlKGNvbGxlY3Rpb24pOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZXMoY29sbGVjdGlvbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBvZiBlYWNoIGVsZW1lbnQgaW4gYSBgY29sbGVjdGlvbmAgdG8gdGhlIGdpdmVuCiAgICAgKiBgcHJvcGVydGllc2Agb2JqZWN0LCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBlcXVpdmFsZW50CiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEB0eXBlIEZ1bmN0aW9uCiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gZmlsdGVyIGJ5LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gcHJvcGVydGllcy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAncGV0cyc6IFsnaG9wcHknXSB9LAogICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ3BldHMnOiBbJ2JhYnkgcHVzcycsICdkaW5vJ10gfQogICAgICogXTsKICAgICAqCiAgICAgKiBfLndoZXJlKGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDM2IH0pOwogICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAncGV0cyc6IFsnaG9wcHknXSB9XQogICAgICoKICAgICAqIF8ud2hlcmUoY2hhcmFjdGVycywgeyAncGV0cyc6IFsnZGlubyddIH0pOwogICAgICogLy8gPT4gW3sgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCwgJ3BldHMnOiBbJ2JhYnkgcHVzcycsICdkaW5vJ10gfV0KICAgICAqLwogICAgdmFyIHdoZXJlID0gZmlsdGVyOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLAogICAgICogYDBgLCBgIiJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBhbGwgZmFsc2V5LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7CiAgICAgKiAvLyA9PiBbMSwgMiwgM10KICAgICAqLwogICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCwKICAgICAgICAgIHJlc3VsdCA9IFtdOwoKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGV4Y2x1ZGluZyBhbGwgdmFsdWVzIG9mIHRoZSBwcm92aWRlZCBhcnJheXMgdXNpbmcgc3RyaWN0CiAgICAgKiBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLgogICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIGFycmF5cyBvZiB2YWx1ZXMgdG8gZXhjbHVkZS4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uZGlmZmVyZW5jZShbMSwgMiwgMywgNCwgNV0sIFs1LCAyLCAxMF0pOwogICAgICogLy8gPT4gWzEsIDMsIDRdCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpZmZlcmVuY2UoYXJyYXkpIHsKICAgICAgcmV0dXJuIGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUsIHRydWUsIDEpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0CiAgICAgKiBlbGVtZW50IHRoYXQgcGFzc2VzIHRoZSBjYWxsYmFjayBjaGVjaywgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCiAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH0sCiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiB0cnVlIH0sCiAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiBmYWxzZSB9CiAgICAgKiBdOwogICAgICoKICAgICAqIF8uZmluZEluZGV4KGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikgewogICAgICogICByZXR1cm4gY2hyLmFnZSA8IDIwOwogICAgICogfSk7CiAgICAgKiAvLyA9PiAyCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5maW5kSW5kZXgoY2hhcmFjdGVycywgeyAnYWdlJzogMzYgfSk7CiAgICAgKiAvLyA9PiAwCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5maW5kSW5kZXgoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTsKICAgICAqIC8vID0+IDEKICAgICAqLwogICAgZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKCiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICBpZiAoY2FsbGJhY2soYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7CiAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCiAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCiAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IHRydWUgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IGZhbHNlIH0sCiAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiB0cnVlIH0KICAgICAqIF07CiAgICAgKgogICAgICogXy5maW5kTGFzdEluZGV4KGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikgewogICAgICogICByZXR1cm4gY2hyLmFnZSA+IDMwOwogICAgICogfSk7CiAgICAgKiAvLyA9PiAxCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5maW5kTGFzdEluZGV4KGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDM2IH0pOwogICAgICogLy8gPT4gMAogICAgICoKICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKICAgICAqIF8uZmluZExhc3RJbmRleChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwogICAgICogLy8gPT4gMgogICAgICovCiAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOwogICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CiAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgIGlmIChjYWxsYmFjayhhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSkgewogICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvciBmaXJzdCBgbmAgZWxlbWVudHMgb2YgYW4gYXJyYXkuIElmIGEgY2FsbGJhY2sKICAgICAqIGlzIHByb3ZpZGVkIGVsZW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGFyZSByZXR1cm5lZCBhcyBsb25nCiAgICAgKiBhcyB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQKICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS4KICAgICAqCiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgKgogICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawogICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKICAgICAqIGVsc2UgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGFsaWFzIGhlYWQsIHRha2UKICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fG51bWJlcnxzdHJpbmd9IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBlbGVtZW50IG9yIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLiBJZiBhIHByb3BlcnR5IG5hbWUgb3IKICAgICAqICBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIKICAgICAqICBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudChzKSBvZiBgYXJyYXlgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmZpcnN0KFsxLCAyLCAzXSk7CiAgICAgKiAvLyA9PiAxCiAgICAgKgogICAgICogXy5maXJzdChbMSwgMiwgM10sIDIpOwogICAgICogLy8gPT4gWzEsIDJdCiAgICAgKgogICAgICogXy5maXJzdChbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkgewogICAgICogICByZXR1cm4gbnVtIDwgMzsKICAgICAqIH0pOwogICAgICogLy8gPT4gWzEsIDJdCiAgICAgKgogICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdibG9ja2VkJzogdHJ1ZSwgICdlbXBsb3llcic6ICdzbGF0ZScgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAogICAgICogICB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYmxvY2tlZCc6IHRydWUsICAnZW1wbG95ZXInOiAnbmEnIH0KICAgICAqIF07CiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5maXJzdChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwogICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2Jsb2NrZWQnOiB0cnVlLCAnZW1wbG95ZXInOiAnc2xhdGUnIH1dCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5wbHVjayhfLmZpcnN0KGNoYXJhY3RlcnMsIHsgJ2VtcGxveWVyJzogJ3NsYXRlJyB9KSwgJ25hbWUnKTsKICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXQogICAgICovCiAgICBmdW5jdGlvbiBmaXJzdChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIG4gPSAwLAogICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOwoKICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgdmFyIGluZGV4ID0gLTE7CiAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGNhbGxiYWNrKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkgewogICAgICAgICAgbisrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBuID0gY2FsbGJhY2s7CiAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCB0aGlzQXJnKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkgPyBhcnJheVswXSA6IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHNsaWNlKGFycmF5LCAwLCBuYXRpdmVNaW4obmF0aXZlTWF4KDAsIG4pLCBsZW5ndGgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEZsYXR0ZW5zIGEgbmVzdGVkIGFycmF5ICh0aGUgbmVzdGluZyBjYW4gYmUgdG8gYW55IGRlcHRoKS4gSWYgYGlzU2hhbGxvd2AKICAgICAqIGlzIHRydWV5LCB0aGUgYXJyYXkgd2lsbCBvbmx5IGJlIGZsYXR0ZW5lZCBhIHNpbmdsZSBsZXZlbC4gSWYgYSBjYWxsYmFjawogICAgICogaXMgcHJvdmlkZWQgZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgY2FsbGJhY2sgYmVmb3JlCiAgICAgKiBmbGF0dGVuaW5nLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUKICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkpLgogICAgICoKICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KICAgICAqCiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAogICAgICogZWxzZSBgZmFsc2VgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU2hhbGxvdz1mYWxzZV0gQSBmbGFnIHRvIHJlc3RyaWN0IGZsYXR0ZW5pbmcgdG8gYSBzaW5nbGUgbGV2ZWwuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCiAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgZmxhdHRlbmVkIGFycmF5LgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyXSwgWzMsIFtbNF1dXV0pOwogICAgICogLy8gPT4gWzEsIDIsIDMsIDRdOwogICAgICoKICAgICAqIF8uZmxhdHRlbihbMSwgWzJdLCBbMywgW1s0XV1dXSwgdHJ1ZSk7CiAgICAgKiAvLyA9PiBbMSwgMiwgMywgW1s0XV1dOwogICAgICoKICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwogICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzMCwgJ3BldHMnOiBbJ2hvcHB5J10gfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAsICdwZXRzJzogWydiYWJ5IHB1c3MnLCAnZGlubyddIH0KICAgICAqIF07CiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5mbGF0dGVuKGNoYXJhY3RlcnMsICdwZXRzJyk7CiAgICAgKiAvLyA9PiBbJ2hvcHB5JywgJ2JhYnkgcHVzcycsICdkaW5vJ10KICAgICAqLwogICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSwgaXNTaGFsbG93LCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICAvLyBqdWdnbGUgYXJndW1lbnRzCiAgICAgIGlmICh0eXBlb2YgaXNTaGFsbG93ICE9ICdib29sZWFuJyAmJiBpc1NoYWxsb3cgIT0gbnVsbCkgewogICAgICAgIHRoaXNBcmcgPSBjYWxsYmFjazsKICAgICAgICBjYWxsYmFjayA9ICh0eXBlb2YgaXNTaGFsbG93ICE9ICdmdW5jdGlvbicgJiYgdGhpc0FyZyAmJiB0aGlzQXJnW2lzU2hhbGxvd10gPT09IGFycmF5KSA/IG51bGwgOiBpc1NoYWxsb3c7CiAgICAgICAgaXNTaGFsbG93ID0gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICBhcnJheSA9IG1hcChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpOwogICAgICB9CiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgaXNTaGFsbG93KTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgdXNpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuIElmIHRoZSBhcnJheSBpcyBhbHJlYWR5IHNvcnRlZAogICAgICogcHJvdmlkaW5nIGB0cnVlYCBmb3IgYGZyb21JbmRleGAgd2lsbCBydW4gYSBmYXN0ZXIgYmluYXJ5IHNlYXJjaC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEFycmF5cwogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC4KICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbSBvciBgdHJ1ZWAKICAgICAqICB0byBwZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBvbiBhIHNvcnRlZCBhcnJheS4KICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAtMWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMywgMSwgMiwgM10sIDIpOwogICAgICogLy8gPT4gMQogICAgICoKICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMywgMSwgMiwgM10sIDIsIDMpOwogICAgICogLy8gPT4gNAogICAgICoKICAgICAqIF8uaW5kZXhPZihbMSwgMSwgMiwgMiwgMywgM10sIDIsIHRydWUpOwogICAgICogLy8gPT4gMgogICAgICovCiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7CiAgICAgIGlmICh0eXBlb2YgZnJvbUluZGV4ID09ICdudW1iZXInKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKICAgICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4IDwgMCA/IG5hdGl2ZU1heCgwLCBsZW5ndGggKyBmcm9tSW5kZXgpIDogZnJvbUluZGV4IHx8IDApOwogICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCkgewogICAgICAgIHZhciBpbmRleCA9IHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7CiAgICAgICAgcmV0dXJuIGFycmF5W2luZGV4XSA9PT0gdmFsdWUgPyBpbmRleCA6IC0xOwogICAgICB9CiAgICAgIHJldHVybiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGxhc3QgZWxlbWVudCBvciBsYXN0IGBuYCBlbGVtZW50cyBvZiBhbiBhcnJheS4gSWYgYQogICAgICogY2FsbGJhY2sgaXMgcHJvdmlkZWQgZWxlbWVudHMgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXJlIGV4Y2x1ZGVkIGZyb20KICAgICAqIHRoZSByZXN1bHQgYXMgbG9uZyBhcyB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kCiAgICAgKiB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS4KICAgICAqCiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgKgogICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawogICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKICAgICAqIGVsc2UgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEFycmF5cwogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgogICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8bnVtYmVyfHN0cmluZ30gW2NhbGxiYWNrPTFdIFRoZSBmdW5jdGlvbiBjYWxsZWQKICAgICAqICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGV4Y2x1ZGUuIElmIGEgcHJvcGVydHkgbmFtZSBvcgogICAgICogIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIgogICAgICogIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIHNsaWNlIG9mIGBhcnJheWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10pOwogICAgICogLy8gPT4gWzEsIDJdCiAgICAgKgogICAgICogXy5pbml0aWFsKFsxLCAyLCAzXSwgMik7CiAgICAgKiAvLyA9PiBbMV0KICAgICAqCiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdLCBmdW5jdGlvbihudW0pIHsKICAgICAqICAgcmV0dXJuIG51bSA+IDE7CiAgICAgKiB9KTsKICAgICAqIC8vID0+IFsxXQogICAgICoKICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwogICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYmxvY2tlZCc6IGZhbHNlLCAnZW1wbG95ZXInOiAnc2xhdGUnIH0sCiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdibG9ja2VkJzogdHJ1ZSwgICdlbXBsb3llcic6ICdzbGF0ZScgfSwKICAgICAqICAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ25hJyB9CiAgICAgKiBdOwogICAgICoKICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKICAgICAqIF8uaW5pdGlhbChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwogICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgICdibG9ja2VkJzogZmFsc2UsICdlbXBsb3llcic6ICdzbGF0ZScgfV0KICAgICAqCiAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIgY2FsbGJhY2sgc2hvcnRoYW5kCiAgICAgKiBfLnBsdWNrKF8uaW5pdGlhbChjaGFyYWN0ZXJzLCB7ICdlbXBsb3llcic6ICduYScgfSksICduYW1lJyk7CiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ10KICAgICAqLwogICAgZnVuY3Rpb24gaW5pdGlhbChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIG4gPSAwLAogICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOwoKICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoOwogICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKICAgICAgICB3aGlsZSAoaW5kZXgtLSAmJiBjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHsKICAgICAgICAgIG4rKzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbiA9IChjYWxsYmFjayA9PSBudWxsIHx8IHRoaXNBcmcpID8gMSA6IGNhbGxiYWNrIHx8IG47CiAgICAgIH0KICAgICAgcmV0dXJuIHNsaWNlKGFycmF5LCAwLCBuYXRpdmVNaW4obmF0aXZlTWF4KDAsIGxlbmd0aCAtIG4pLCBsZW5ndGgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyBwcmVzZW50IGluIGFsbCBwcm92aWRlZCBhcnJheXMgdXNpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheV0gVGhlIGFycmF5cyB0byBpbnNwZWN0LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaW50ZXJzZWN0aW9uKFsxLCAyLCAzXSwgWzUsIDIsIDEsIDRdLCBbMiwgMV0pOwogICAgICogLy8gPT4gWzEsIDJdCiAgICAgKi8KICAgIGZ1bmN0aW9uIGludGVyc2VjdGlvbigpIHsKICAgICAgdmFyIGFyZ3MgPSBbXSwKICAgICAgICAgIGFyZ3NJbmRleCA9IC0xLAogICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCiAgICAgICAgICBjYWNoZXMgPSBnZXRBcnJheSgpLAogICAgICAgICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSwKICAgICAgICAgIHRydXN0SW5kZXhPZiA9IGluZGV4T2YgPT09IGJhc2VJbmRleE9mLAogICAgICAgICAgc2VlbiA9IGdldEFycmF5KCk7CgogICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzW2FyZ3NJbmRleF07CiAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkgewogICAgICAgICAgYXJncy5wdXNoKHZhbHVlKTsKICAgICAgICAgIGNhY2hlcy5wdXNoKHRydXN0SW5kZXhPZiAmJiB2YWx1ZS5sZW5ndGggPj0gbGFyZ2VBcnJheVNpemUgJiYKICAgICAgICAgICAgY3JlYXRlQ2FjaGUoYXJnc0luZGV4ID8gYXJnc1thcmdzSW5kZXhdIDogc2VlbikpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgYXJyYXkgPSBhcmdzWzBdLAogICAgICAgICAgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCwKICAgICAgICAgIHJlc3VsdCA9IFtdOwoKICAgICAgb3V0ZXI6CiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzWzBdOwogICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdOwoKICAgICAgICBpZiAoKGNhY2hlID8gY2FjaGVJbmRleE9mKGNhY2hlLCB2YWx1ZSkgOiBpbmRleE9mKHNlZW4sIHZhbHVlKSkgPCAwKSB7CiAgICAgICAgICBhcmdzSW5kZXggPSBhcmdzTGVuZ3RoOwogICAgICAgICAgKGNhY2hlIHx8IHNlZW4pLnB1c2godmFsdWUpOwogICAgICAgICAgd2hpbGUgKC0tYXJnc0luZGV4KSB7CiAgICAgICAgICAgIGNhY2hlID0gY2FjaGVzW2FyZ3NJbmRleF07CiAgICAgICAgICAgIGlmICgoY2FjaGUgPyBjYWNoZUluZGV4T2YoY2FjaGUsIHZhbHVlKSA6IGluZGV4T2YoYXJnc1thcmdzSW5kZXhdLCB2YWx1ZSkpIDwgMCkgewogICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHsKICAgICAgICBjYWNoZSA9IGNhY2hlc1thcmdzTGVuZ3RoXTsKICAgICAgICBpZiAoY2FjaGUpIHsKICAgICAgICAgIHJlbGVhc2VPYmplY3QoY2FjaGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZWxlYXNlQXJyYXkoY2FjaGVzKTsKICAgICAgcmVsZWFzZUFycmF5KHNlZW4pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9yIGxhc3QgYG5gIGVsZW1lbnRzIG9mIGFuIGFycmF5LiBJZiBhIGNhbGxiYWNrIGlzCiAgICAgKiBwcm92aWRlZCBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSBhcmUgcmV0dXJuZWQgYXMgbG9uZyBhcyB0aGUKICAgICAqIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQKICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fG51bWJlcnxzdHJpbmd9IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBlbGVtZW50IG9yIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLiBJZiBhIHByb3BlcnR5IG5hbWUgb3IKICAgICAqICBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIKICAgICAqICBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50KHMpIG9mIGBhcnJheWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8ubGFzdChbMSwgMiwgM10pOwogICAgICogLy8gPT4gMwogICAgICoKICAgICAqIF8ubGFzdChbMSwgMiwgM10sIDIpOwogICAgICogLy8gPT4gWzIsIDNdCiAgICAgKgogICAgICogXy5sYXN0KFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7CiAgICAgKiAgIHJldHVybiBudW0gPiAxOwogICAgICogfSk7CiAgICAgKiAvLyA9PiBbMiwgM10KICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAogICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYmxvY2tlZCc6IHRydWUsICAnZW1wbG95ZXInOiAnc2xhdGUnIH0sCiAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdibG9ja2VkJzogdHJ1ZSwgICdlbXBsb3llcic6ICduYScgfQogICAgICogXTsKICAgICAqCiAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCiAgICAgKiBfLnBsdWNrKF8ubGFzdChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpLCAnbmFtZScpOwogICAgICogLy8gPT4gWydmcmVkJywgJ3BlYmJsZXMnXQogICAgICoKICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKICAgICAqIF8ubGFzdChjaGFyYWN0ZXJzLCB7ICdlbXBsb3llcic6ICduYScgfSk7CiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAnZW1wbG95ZXInOiAnbmEnIH1dCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxhc3QoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgIHZhciBuID0gMCwKICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKCiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ251bWJlcicgJiYgY2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgIHZhciBpbmRleCA9IGxlbmd0aDsKICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CiAgICAgICAgd2hpbGUgKGluZGV4LS0gJiYgY2FsbGJhY2soYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7CiAgICAgICAgICBuKys7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG4gPSBjYWxsYmFjazsKICAgICAgICBpZiAobiA9PSBudWxsIHx8IHRoaXNBcmcpIHsKICAgICAgICAgIHJldHVybiBhcnJheSA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc2xpY2UoYXJyYXksIG5hdGl2ZU1heCgwLCBsZW5ndGggLSBuKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgdXNpbmcgc3RyaWN0CiAgICAgKiBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCBpcyB1c2VkCiAgICAgKiBhcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi4KICAgICAqCiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgKgogICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawogICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKICAgICAqIGVsc2UgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEFycmF5cwogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC4KICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgogICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUgb3IgYC0xYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMywgMSwgMiwgM10sIDIpOwogICAgICogLy8gPT4gNAogICAgICoKICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNdLCAyLCAzKTsKICAgICAqIC8vID0+IDEKICAgICAqLwogICAgZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHsKICAgICAgdmFyIGluZGV4ID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOwogICAgICBpZiAodHlwZW9mIGZyb21JbmRleCA9PSAnbnVtYmVyJykgewogICAgICAgIGluZGV4ID0gKGZyb21JbmRleCA8IDAgPyBuYXRpdmVNYXgoMCwgaW5kZXggKyBmcm9tSW5kZXgpIDogbmF0aXZlTWluKGZyb21JbmRleCwgaW5kZXggLSAxKSkgKyAxOwogICAgICB9CiAgICAgIHdoaWxlIChpbmRleC0tKSB7CiAgICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qKgogICAgICogUmVtb3ZlcyBhbGwgcHJvdmlkZWQgdmFsdWVzIGZyb20gdGhlIGdpdmVuIGFycmF5IHVzaW5nIHN0cmljdCBlcXVhbGl0eSBmb3IKICAgICAqIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LgogICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVdIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCAxLCAyLCAzXTsKICAgICAqIF8ucHVsbChhcnJheSwgMiwgMyk7CiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7CiAgICAgKiAvLyA9PiBbMSwgMV0KICAgICAqLwogICAgZnVuY3Rpb24gcHVsbChhcnJheSkgewogICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgIGFyZ3NJbmRleCA9IDAsCiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsCiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CgogICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7CiAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgIHZhbHVlID0gYXJnc1thcmdzSW5kZXhdOwogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkgewogICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgtLSwgMSk7CiAgICAgICAgICAgIGxlbmd0aC0tOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXJyYXk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkgcHJvZ3Jlc3NpbmcgZnJvbQogICAgICogYHN0YXJ0YCB1cCB0byBidXQgbm90IGluY2x1ZGluZyBgZW5kYC4gSWYgYHN0YXJ0YCBpcyBsZXNzIHRoYW4gYHN0b3BgIGEKICAgICAqIHplcm8tbGVuZ3RoIHJhbmdlIGlzIGNyZWF0ZWQgdW5sZXNzIGEgbmVnYXRpdmUgYHN0ZXBgIGlzIHNwZWNpZmllZC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEFycmF5cwogICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLgogICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyByYW5nZSBhcnJheS4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5yYW5nZSg0KTsKICAgICAqIC8vID0+IFswLCAxLCAyLCAzXQogICAgICoKICAgICAqIF8ucmFuZ2UoMSwgNSk7CiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF0KICAgICAqCiAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTsKICAgICAqIC8vID0+IFswLCA1LCAxMCwgMTVdCiAgICAgKgogICAgICogXy5yYW5nZSgwLCAtNCwgLTEpOwogICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdCiAgICAgKgogICAgICogXy5yYW5nZSgxLCA0LCAwKTsKICAgICAqIC8vID0+IFsxLCAxLCAxXQogICAgICoKICAgICAqIF8ucmFuZ2UoMCk7CiAgICAgKiAvLyA9PiBbXQogICAgICovCiAgICBmdW5jdGlvbiByYW5nZShzdGFydCwgZW5kLCBzdGVwKSB7CiAgICAgIHN0YXJ0ID0gK3N0YXJ0IHx8IDA7CiAgICAgIHN0ZXAgPSB0eXBlb2Ygc3RlcCA9PSAnbnVtYmVyJyA/IHN0ZXAgOiAoK3N0ZXAgfHwgMSk7CgogICAgICBpZiAoZW5kID09IG51bGwpIHsKICAgICAgICBlbmQgPSBzdGFydDsKICAgICAgICBzdGFydCA9IDA7CiAgICAgIH0KICAgICAgLy8gdXNlIGBBcnJheShsZW5ndGgpYCBzbyBlbmdpbmVzIGxpa2UgQ2hha3JhIGFuZCBWOCBhdm9pZCBzbG93ZXIgbW9kZXMKICAgICAgLy8gaHR0cDovL3lvdXR1LmJlL1hBcUlwR1U4WlprI3Q9MTdtMjVzCiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KDAsIGNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSksCiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpOwoKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICByZXN1bHRbaW5kZXhdID0gc3RhcnQ7CiAgICAgICAgc3RhcnQgKz0gc3RlcDsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSB0aGF0IHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWV5IGZvcgogICAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYAogICAgICogYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS4KICAgICAqCiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgKgogICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawogICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKICAgICAqIGVsc2UgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEFycmF5cwogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNCwgNSwgNl07CiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gJSAyID09IDA7IH0pOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTsKICAgICAqIC8vID0+IFsxLCAzLCA1XQogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGV2ZW5zKTsKICAgICAqIC8vID0+IFsyLCA0LCA2XQogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmUoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLAogICAgICAgICAgcmVzdWx0ID0gW107CgogICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdOwogICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGFycmF5KSkgewogICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOwogICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LS0sIDEpOwogICAgICAgICAgbGVuZ3RoLS07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uaW5pdGlhbGAgdGhpcyBtZXRob2QgZ2V0cyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9yCiAgICAgKiBmaXJzdCBgbmAgZWxlbWVudHMgb2YgYW4gYXJyYXkuIElmIGEgY2FsbGJhY2sgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZWxlbWVudHMKICAgICAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGFyZSBleGNsdWRlZCBmcm9tIHRoZSByZXN1bHQgYXMgbG9uZyBhcyB0aGUKICAgICAqIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQKICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBhbGlhcyBkcm9wLCB0YWlsCiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxudW1iZXJ8c3RyaW5nfSBbY2FsbGJhY2s9MV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBlbGVtZW50IG9yIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZXhjbHVkZS4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yCiAgICAgKiAgb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiCiAgICAgKiAgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgc2xpY2Ugb2YgYGFycmF5YC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5yZXN0KFsxLCAyLCAzXSk7CiAgICAgKiAvLyA9PiBbMiwgM10KICAgICAqCiAgICAgKiBfLnJlc3QoWzEsIDIsIDNdLCAyKTsKICAgICAqIC8vID0+IFszXQogICAgICoKICAgICAqIF8ucmVzdChbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkgewogICAgICogICByZXR1cm4gbnVtIDwgMzsKICAgICAqIH0pOwogICAgICogLy8gPT4gWzNdCiAgICAgKgogICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdibG9ja2VkJzogdHJ1ZSwgICdlbXBsb3llcic6ICdzbGF0ZScgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2Jsb2NrZWQnOiBmYWxzZSwgICdlbXBsb3llcic6ICdzbGF0ZScgfSwKICAgICAqICAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAnZW1wbG95ZXInOiAnbmEnIH0KICAgICAqIF07CiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy5wbHVjayhfLnJlc3QoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKSwgJ25hbWUnKTsKICAgICAqIC8vID0+IFsnZnJlZCcsICdwZWJibGVzJ10KICAgICAqCiAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIgY2FsbGJhY2sgc2hvcnRoYW5kCiAgICAgKiBfLnJlc3QoY2hhcmFjdGVycywgeyAnZW1wbG95ZXInOiAnc2xhdGUnIH0pOwogICAgICogLy8gPT4gW3sgJ25hbWUnOiAncGViYmxlcycsICdibG9ja2VkJzogdHJ1ZSwgJ2VtcGxveWVyJzogJ25hJyB9XQogICAgICovCiAgICBmdW5jdGlvbiByZXN0KGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdudW1iZXInICYmIGNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICB2YXIgbiA9IDAsCiAgICAgICAgICAgIGluZGV4ID0gLTEsCiAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKCiAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGNhbGxiYWNrKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkgewogICAgICAgICAgbisrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBuID0gKGNhbGxiYWNrID09IG51bGwgfHwgdGhpc0FyZykgPyAxIDogbmF0aXZlTWF4KDAsIGNhbGxiYWNrKTsKICAgICAgfQogICAgICByZXR1cm4gc2xpY2UoYXJyYXksIG4pOwogICAgfQoKICAgIC8qKgogICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBzbWFsbGVzdCBpbmRleCBhdCB3aGljaCBhIHZhbHVlCiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBhIGdpdmVuIHNvcnRlZCBhcnJheSBpbiBvcmRlciB0byBtYWludGFpbiB0aGUgc29ydAogICAgICogb3JkZXIgb2YgdGhlIGFycmF5LiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yCiAgICAgKiBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlCiAgICAgKiBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAogICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCiAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgogICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZAogICAgICogIGludG8gYGFycmF5YC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5zb3J0ZWRJbmRleChbMjAsIDMwLCA1MF0sIDQwKTsKICAgICAqIC8vID0+IDIKICAgICAqCiAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCiAgICAgKiBfLnNvcnRlZEluZGV4KFt7ICd4JzogMjAgfSwgeyAneCc6IDMwIH0sIHsgJ3gnOiA1MCB9XSwgeyAneCc6IDQwIH0sICd4Jyk7CiAgICAgKiAvLyA9PiAyCiAgICAgKgogICAgICogdmFyIGRpY3QgPSB7CiAgICAgKiAgICd3b3JkVG9OdW1iZXInOiB7ICd0d2VudHknOiAyMCwgJ3RoaXJ0eSc6IDMwLCAnZm91cnR5JzogNDAsICdmaWZ0eSc6IDUwIH0KICAgICAqIH07CiAgICAgKgogICAgICogXy5zb3J0ZWRJbmRleChbJ3R3ZW50eScsICd0aGlydHknLCAnZmlmdHknXSwgJ2ZvdXJ0eScsIGZ1bmN0aW9uKHdvcmQpIHsKICAgICAqICAgcmV0dXJuIGRpY3Qud29yZFRvTnVtYmVyW3dvcmRdOwogICAgICogfSk7CiAgICAgKiAvLyA9PiAyCiAgICAgKgogICAgICogXy5zb3J0ZWRJbmRleChbJ3R3ZW50eScsICd0aGlydHknLCAnZmlmdHknXSwgJ2ZvdXJ0eScsIGZ1bmN0aW9uKHdvcmQpIHsKICAgICAqICAgcmV0dXJuIHRoaXMud29yZFRvTnVtYmVyW3dvcmRdOwogICAgICogfSwgZGljdCk7CiAgICAgKiAvLyA9PiAyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgdmFyIGxvdyA9IDAsCiAgICAgICAgICBoaWdoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiBsb3c7CgogICAgICAvLyBleHBsaWNpdGx5IHJlZmVyZW5jZSBgaWRlbnRpdHlgIGZvciBiZXR0ZXIgaW5saW5pbmcgaW4gRmlyZWZveAogICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKSA6IGlkZW50aXR5OwogICAgICB2YWx1ZSA9IGNhbGxiYWNrKHZhbHVlKTsKCiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7CiAgICAgICAgdmFyIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMTsKICAgICAgICAoY2FsbGJhY2soYXJyYXlbbWlkXSkgPCB2YWx1ZSkKICAgICAgICAgID8gbG93ID0gbWlkICsgMQogICAgICAgICAgOiBoaWdoID0gbWlkOwogICAgICB9CiAgICAgIHJldHVybiBsb3c7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBvZiB0aGUgcHJvdmlkZWQgYXJyYXlzIHVzaW5nCiAgICAgKiBzdHJpY3QgZXF1YWxpdHkgZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXldIFRoZSBhcnJheXMgdG8gaW5zcGVjdC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8udW5pb24oWzEsIDIsIDNdLCBbNSwgMiwgMSwgNF0sIFsyLCAxXSk7CiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNSwgNF0KICAgICAqLwogICAgZnVuY3Rpb24gdW5pb24oKSB7CiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUsIHRydWUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtdmFsdWUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5IHVzaW5nIHN0cmljdCBlcXVhbGl0eQogICAgICogZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLiBJZiB0aGUgYXJyYXkgaXMgc29ydGVkLCBwcm92aWRpbmcKICAgICAqIGB0cnVlYCBmb3IgYGlzU29ydGVkYCB3aWxsIHVzZSBhIGZhc3RlciBhbGdvcml0aG0uIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQKICAgICAqIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBjYWxsYmFjayBiZWZvcmUgdW5pcXVlbmVzcwogICAgICogaXMgY29tcHV0ZWQuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZQogICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuCiAgICAgKgogICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQogICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCiAgICAgKiBlbHNlIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBhbGlhcyB1bmlxdWUKICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLgogICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTb3J0ZWQ9ZmFsc2VdIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGBhcnJheWAgaXMgc29ydGVkLgogICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAogICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgZHVwbGljYXRlLXZhbHVlLWZyZWUgYXJyYXkuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8udW5pcShbMSwgMiwgMSwgMywgMV0pOwogICAgICogLy8gPT4gWzEsIDIsIDNdCiAgICAgKgogICAgICogXy51bmlxKFsxLCAxLCAyLCAyLCAzXSwgdHJ1ZSk7CiAgICAgKiAvLyA9PiBbMSwgMiwgM10KICAgICAqCiAgICAgKiBfLnVuaXEoWydBJywgJ2InLCAnQycsICdhJywgJ0InLCAnYyddLCBmdW5jdGlvbihsZXR0ZXIpIHsgcmV0dXJuIGxldHRlci50b0xvd2VyQ2FzZSgpOyB9KTsKICAgICAqIC8vID0+IFsnQScsICdiJywgJ0MnXQogICAgICoKICAgICAqIF8udW5pcShbMSwgMi41LCAzLCAxLjUsIDIsIDMuNV0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gdGhpcy5mbG9vcihudW0pOyB9LCBNYXRoKTsKICAgICAqIC8vID0+IFsxLCAyLjUsIDNdCiAgICAgKgogICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAogICAgICogXy51bmlxKFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTsKICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XQogICAgICovCiAgICBmdW5jdGlvbiB1bmlxKGFycmF5LCBpc1NvcnRlZCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgLy8ganVnZ2xlIGFyZ3VtZW50cwogICAgICBpZiAodHlwZW9mIGlzU29ydGVkICE9ICdib29sZWFuJyAmJiBpc1NvcnRlZCAhPSBudWxsKSB7CiAgICAgICAgdGhpc0FyZyA9IGNhbGxiYWNrOwogICAgICAgIGNhbGxiYWNrID0gKHR5cGVvZiBpc1NvcnRlZCAhPSAnZnVuY3Rpb24nICYmIHRoaXNBcmcgJiYgdGhpc0FyZ1tpc1NvcnRlZF0gPT09IGFycmF5KSA/IG51bGwgOiBpc1NvcnRlZDsKICAgICAgICBpc1NvcnRlZCA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwogICAgICB9CiAgICAgIHJldHVybiBiYXNlVW5pcShhcnJheSwgaXNTb3J0ZWQsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBwcm92aWRlZCB2YWx1ZXMgdXNpbmcgc3RyaWN0IGVxdWFsaXR5IGZvcgogICAgICogY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWx0ZXIuCiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZV0gVGhlIHZhbHVlcyB0byBleGNsdWRlLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy53aXRob3V0KFsxLCAyLCAxLCAwLCAzLCAxLCA0XSwgMCwgMSk7CiAgICAgKiAvLyA9PiBbMiwgMywgNF0KICAgICAqLwogICAgZnVuY3Rpb24gd2l0aG91dChhcnJheSkgewogICAgICByZXR1cm4gYmFzZURpZmZlcmVuY2UoYXJyYXksIHNsaWNlKGFyZ3VtZW50cywgMSkpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0aGUgcHJvdmlkZWQgYXJyYXlzLgogICAgICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheV0gVGhlIGFycmF5cyB0byBpbnNwZWN0LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbHVlcy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy54b3IoWzEsIDIsIDNdLCBbNSwgMiwgMSwgNF0pOwogICAgICogLy8gPT4gWzMsIDUsIDRdCiAgICAgKgogICAgICogXy54b3IoWzEsIDIsIDVdLCBbMiwgMywgNV0sIFszLCA0LCA1XSk7CiAgICAgKiAvLyA9PiBbMSwgNCwgNV0KICAgICAqLwogICAgZnVuY3Rpb24geG9yKCkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CgogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHZhciBhcnJheSA9IGFyZ3VtZW50c1tpbmRleF07CiAgICAgICAgaWYgKGlzQXJyYXkoYXJyYXkpIHx8IGlzQXJndW1lbnRzKGFycmF5KSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdAogICAgICAgICAgICA/IGJhc2VVbmlxKGJhc2VEaWZmZXJlbmNlKHJlc3VsdCwgYXJyYXkpLmNvbmNhdChiYXNlRGlmZmVyZW5jZShhcnJheSwgcmVzdWx0KSkpCiAgICAgICAgICAgIDogYXJyYXk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQgfHwgW107CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMsIHRoZSBmaXJzdCBvZiB3aGljaCBjb250YWlucyB0aGUgZmlyc3QKICAgICAqIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlIHNlY29uZAogICAgICogZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAYWxpYXMgdW56aXAKICAgICAqIEBjYXRlZ29yeSBBcnJheXMKICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheV0gQXJyYXlzIHRvIHByb2Nlc3MuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy56aXAoWydmcmVkJywgJ2Jhcm5leSddLCBbMzAsIDQwXSwgW3RydWUsIGZhbHNlXSk7CiAgICAgKiAvLyA9PiBbWydmcmVkJywgMzAsIHRydWVdLCBbJ2Jhcm5leScsIDQwLCBmYWxzZV1dCiAgICAgKi8KICAgIGZ1bmN0aW9uIHppcCgpIHsKICAgICAgdmFyIGFycmF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHMgOiBhcmd1bWVudHNbMF0sCiAgICAgICAgICBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBtYXgocGx1Y2soYXJyYXksICdsZW5ndGgnKSkgOiAwLAogICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoIDwgMCA/IDAgOiBsZW5ndGgpOwoKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICByZXN1bHRbaW5kZXhdID0gcGx1Y2soYXJyYXksIGluZGV4KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgZnJvbSBhcnJheXMgb2YgYGtleXNgIGFuZCBgdmFsdWVzYC4gUHJvdmlkZQogICAgICogZWl0aGVyIGEgc2luZ2xlIHR3byBkaW1lbnNpb25hbCBhcnJheSwgaS5lLiBgW1trZXkxLCB2YWx1ZTFdLCBba2V5MiwgdmFsdWUyXV1gCiAgICAgKiBvciB0d28gYXJyYXlzLCBvbmUgb2YgYGtleXNgIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyBgdmFsdWVzYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGFsaWFzIG9iamVjdAogICAgICogQGNhdGVnb3J5IEFycmF5cwogICAgICogQHBhcmFtIHtBcnJheX0ga2V5cyBUaGUgYXJyYXkgb2Yga2V5cy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBhcnJheSBvZiB2YWx1ZXMuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgZ2l2ZW4ga2V5cyBhbmQKICAgICAqICBjb3JyZXNwb25kaW5nIHZhbHVlcy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy56aXBPYmplY3QoWydmcmVkJywgJ2Jhcm5leSddLCBbMzAsIDQwXSk7CiAgICAgKiAvLyA9PiB7ICdmcmVkJzogMzAsICdiYXJuZXknOiA0MCB9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHppcE9iamVjdChrZXlzLCB2YWx1ZXMpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSBrZXlzID8ga2V5cy5sZW5ndGggOiAwLAogICAgICAgICAgcmVzdWx0ID0ge307CgogICAgICBpZiAoIXZhbHVlcyAmJiBsZW5ndGggJiYgIWlzQXJyYXkoa2V5c1swXSkpIHsKICAgICAgICB2YWx1ZXMgPSBbXTsKICAgICAgfQogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHZhciBrZXkgPSBrZXlzW2luZGV4XTsKICAgICAgICBpZiAodmFsdWVzKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlc1tpbmRleF07CiAgICAgICAgfSBlbHNlIGlmIChrZXkpIHsKICAgICAgICAgIHJlc3VsdFtrZXlbMF1dID0ga2V5WzFdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYGZ1bmNgLCB3aXRoICB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kCiAgICAgKiBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIG9ubHkgYWZ0ZXIgYmVpbmcgY2FsbGVkIGBuYCB0aW1lcy4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucwogICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlCiAgICAgKiAgYGZ1bmNgIGlzIGV4ZWN1dGVkLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTsKICAgICAqCiAgICAgKiB2YXIgZG9uZSA9IF8uYWZ0ZXIoc2F2ZXMubGVuZ3RoLCBmdW5jdGlvbigpIHsKICAgICAqICAgY29uc29sZS5sb2coJ0RvbmUgc2F2aW5nIScpOwogICAgICogfSk7CiAgICAgKgogICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTsKICAgICAqIH0pOwogICAgICogLy8gPT4gbG9ncyAnRG9uZSBzYXZpbmchJywgYWZ0ZXIgYWxsIHNhdmVzIGhhdmUgY29tcGxldGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHsKICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKC0tbiA8IDEpIHsKICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AKICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCBwcmVwZW5kcyBhbnkgYWRkaXRpb25hbCBgYmluZGAgYXJndW1lbnRzIHRvIHRob3NlCiAgICAgKiBwcm92aWRlZCB0byB0aGUgYm91bmQgZnVuY3Rpb24uCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgogICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIGZ1bmMgPSBmdW5jdGlvbihncmVldGluZykgewogICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLm5hbWU7CiAgICAgKiB9OwogICAgICoKICAgICAqIGZ1bmMgPSBfLmJpbmQoZnVuYywgeyAnbmFtZSc6ICdmcmVkJyB9LCAnaGknKTsKICAgICAqIGZ1bmMoKTsKICAgICAqIC8vID0+ICdoaSBmcmVkJwogICAgICovCiAgICBmdW5jdGlvbiBiaW5kKGZ1bmMsIHRoaXNBcmcpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAyCiAgICAgICAgPyBjcmVhdGVXcmFwcGVyKGZ1bmMsIDE3LCBzbGljZShhcmd1bWVudHMsIDIpLCBudWxsLCB0aGlzQXJnKQogICAgICAgIDogY3JlYXRlV3JhcHBlcihmdW5jLCAxLCBudWxsLCBudWxsLCB0aGlzQXJnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmcKICAgICAqIG1ldGhvZC4gTWV0aG9kIG5hbWVzIG1heSBiZSBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3IgYXMgYXJyYXlzCiAgICAgKiBvZiBtZXRob2QgbmFtZXMuIElmIG5vIG1ldGhvZCBuYW1lcyBhcmUgcHJvdmlkZWQgYWxsIHRoZSBmdW5jdGlvbiBwcm9wZXJ0aWVzCiAgICAgKiBvZiBgb2JqZWN0YCB3aWxsIGJlIGJvdW5kLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLgogICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IFttZXRob2ROYW1lXSBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0bwogICAgICogIGJpbmQsIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIG1ldGhvZCBuYW1lcyBvciBhcnJheXMgb2YgbWV0aG9kIG5hbWVzLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIHZpZXcgPSB7CiAgICAgKiAgICdsYWJlbCc6ICdkb2NzJywKICAgICAqICAgJ29uQ2xpY2snOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpOyB9CiAgICAgKiB9OwogICAgICoKICAgICAqIF8uYmluZEFsbCh2aWV3KTsKICAgICAqIGpRdWVyeSgnI2RvY3MnKS5vbignY2xpY2snLCB2aWV3Lm9uQ2xpY2spOwogICAgICogLy8gPT4gbG9ncyAnY2xpY2tlZCBkb2NzJywgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQKICAgICAqLwogICAgZnVuY3Rpb24gYmluZEFsbChvYmplY3QpIHsKICAgICAgdmFyIGZ1bmNzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUsIGZhbHNlLCAxKSA6IGZ1bmN0aW9ucyhvYmplY3QpLAogICAgICAgICAgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aDsKCiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGtleSA9IGZ1bmNzW2luZGV4XTsKICAgICAgICBvYmplY3Rba2V5XSA9IGNyZWF0ZVdyYXBwZXIob2JqZWN0W2tleV0sIDEsIG51bGwsIG51bGwsIG9iamVjdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBvYmplY3Rba2V5XWAKICAgICAqIGFuZCBwcmVwZW5kcyBhbnkgYWRkaXRpb25hbCBgYmluZEtleWAgYXJndW1lbnRzIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBib3VuZAogICAgICogZnVuY3Rpb24uIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8KICAgICAqIHJlZmVyZW5jZSBtZXRob2RzIHRoYXQgd2lsbCBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LgogICAgICogU2VlIGh0dHA6Ly9taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdGhlIG1ldGhvZCBiZWxvbmdzIHRvLgogICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuCiAgICAgKiBAcGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgb2JqZWN0ID0gewogICAgICogICAnbmFtZSc6ICdmcmVkJywKICAgICAqICAgJ2dyZWV0JzogZnVuY3Rpb24oZ3JlZXRpbmcpIHsKICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLm5hbWU7CiAgICAgKiAgIH0KICAgICAqIH07CiAgICAgKgogICAgICogdmFyIGZ1bmMgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCAnaGknKTsKICAgICAqIGZ1bmMoKTsKICAgICAqIC8vID0+ICdoaSBmcmVkJwogICAgICoKICAgICAqIG9iamVjdC5ncmVldCA9IGZ1bmN0aW9uKGdyZWV0aW5nKSB7CiAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy5uYW1lICsgJyEnOwogICAgICogfTsKICAgICAqCiAgICAgKiBmdW5jKCk7CiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkIScKICAgICAqLwogICAgZnVuY3Rpb24gYmluZEtleShvYmplY3QsIGtleSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDIKICAgICAgICA/IGNyZWF0ZVdyYXBwZXIoa2V5LCAxOSwgc2xpY2UoYXJndW1lbnRzLCAyKSwgbnVsbCwgb2JqZWN0KQogICAgICAgIDogY3JlYXRlV3JhcHBlcihrZXksIDMsIG51bGwsIG51bGwsIG9iamVjdCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9ucywKICAgICAqIHdoZXJlIGVhY2ggZnVuY3Rpb24gY29uc3VtZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCBmb2xsb3dzLgogICAgICogRm9yIGV4YW1wbGUsIGNvbXBvc2luZyB0aGUgZnVuY3Rpb25zIGBmKClgLCBgZygpYCwgYW5kIGBoKClgIHByb2R1Y2VzIGBmKGcoaCgpKSlgLgogICAgICogRWFjaCBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY29tcG9zZWQgZnVuY3Rpb24uCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKICAgICAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IFtmdW5jXSBGdW5jdGlvbnMgdG8gY29tcG9zZS4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2VkIGZ1bmN0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgcmVhbE5hbWVNYXAgPSB7CiAgICAgKiAgICdwZWJibGVzJzogJ3BlbmVsb3BlJwogICAgICogfTsKICAgICAqCiAgICAgKiB2YXIgZm9ybWF0ID0gZnVuY3Rpb24obmFtZSkgewogICAgICogICBuYW1lID0gcmVhbE5hbWVNYXBbbmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBuYW1lOwogICAgICogICByZXR1cm4gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTsKICAgICAqIH07CiAgICAgKgogICAgICogdmFyIGdyZWV0ID0gZnVuY3Rpb24oZm9ybWF0dGVkKSB7CiAgICAgKiAgIHJldHVybiAnSGl5YSAnICsgZm9ybWF0dGVkICsgJyEnOwogICAgICogfTsKICAgICAqCiAgICAgKiB2YXIgd2VsY29tZSA9IF8uY29tcG9zZShncmVldCwgZm9ybWF0KTsKICAgICAqIHdlbGNvbWUoJ3BlYmJsZXMnKTsKICAgICAqIC8vID0+ICdIaXlhIFBlbmVsb3BlIScKICAgICAqLwogICAgZnVuY3Rpb24gY29tcG9zZSgpIHsKICAgICAgdmFyIGZ1bmNzID0gYXJndW1lbnRzLAogICAgICAgICAgbGVuZ3RoID0gZnVuY3MubGVuZ3RoOwoKICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmNzW2xlbmd0aF0pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICAgIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aDsKCiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgICBhcmdzID0gW2Z1bmNzW2xlbmd0aF0uYXBwbHkodGhpcywgYXJncyldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJnc1swXTsKICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB3aGljaCBhY2NlcHRzIG9uZSBvciBtb3JlIGFyZ3VtZW50cyBvZiBgZnVuY2AgdGhhdCB3aGVuCiAgICAgKiBpbnZva2VkIGVpdGhlciBleGVjdXRlcyBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGFsbCBgZnVuY2AgYXJndW1lbnRzCiAgICAgKiBoYXZlIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIG9yIG1vcmUgb2YgdGhlCiAgICAgKiByZW1haW5pbmcgYGZ1bmNgIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIGNhbiBiZSBzcGVjaWZpZWQKICAgICAqIGlmIGBmdW5jLmxlbmd0aGAgaXMgbm90IHN1ZmZpY2llbnQuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LgogICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShmdW5jdGlvbihhLCBiLCBjKSB7CiAgICAgKiAgIGNvbnNvbGUubG9nKGEgKyBiICsgYyk7CiAgICAgKiB9KTsKICAgICAqCiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpOwogICAgICogLy8gPT4gNgogICAgICoKICAgICAqIGN1cnJpZWQoMSwgMikoMyk7CiAgICAgKiAvLyA9PiA2CiAgICAgKgogICAgICogY3VycmllZCgxLCAyLCAzKTsKICAgICAqIC8vID0+IDYKICAgICAqLwogICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHkpIHsKICAgICAgYXJpdHkgPSB0eXBlb2YgYXJpdHkgPT0gJ251bWJlcicgPyBhcml0eSA6ICgrYXJpdHkgfHwgZnVuYy5sZW5ndGgpOwogICAgICByZXR1cm4gY3JlYXRlV3JhcHBlcihmdW5jLCA0LCBudWxsLCBudWxsLCBudWxsLCBhcml0eSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGRlbGF5IHRoZSBleGVjdXRpb24gb2YgYGZ1bmNgIHVudGlsIGFmdGVyCiAgICAgKiBgd2FpdGAgbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIGl0IHdhcyBpbnZva2VkLgogICAgICogUHJvdmlkZSBhbiBvcHRpb25zIG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbgogICAgICogdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBTdWJzZXF1ZW50IGNhbGxzCiAgICAgKiB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGNhbGwuCiAgICAgKgogICAgICogTm90ZTogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCBgZnVuY2Agd2lsbCBiZSBjYWxsZWQKICAgICAqIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gaXMKICAgICAqIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0LgogICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXSBTcGVjaWZ5IGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgogICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBjYWxsZWQuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdIFNwZWNpZnkgZXhlY3V0aW9uIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiAvLyBhdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4CiAgICAgKiB2YXIgbGF6eUxheW91dCA9IF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApOwogICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIGxhenlMYXlvdXQpOwogICAgICoKICAgICAqIC8vIGV4ZWN1dGUgYHNlbmRNYWlsYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzCiAgICAgKiBqUXVlcnkoJyNwb3N0Ym94Jykub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7CiAgICAgKiAgICdsZWFkaW5nJzogdHJ1ZSwKICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2UKICAgICAqIH0pOwogICAgICoKICAgICAqIC8vIGVuc3VyZSBgYmF0Y2hMb2dgIGlzIGV4ZWN1dGVkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzCiAgICAgKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7CiAgICAgKiBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgewogICAgICogICAnbWF4V2FpdCc6IDEwMDAKICAgICAqIH0sIGZhbHNlKTsKICAgICAqLwogICAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykgewogICAgICB2YXIgYXJncywKICAgICAgICAgIG1heFRpbWVvdXRJZCwKICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgIHN0YW1wLAogICAgICAgICAgdGhpc0FyZywKICAgICAgICAgIHRpbWVvdXRJZCwKICAgICAgICAgIHRyYWlsaW5nQ2FsbCwKICAgICAgICAgIGxhc3RDYWxsZWQgPSAwLAogICAgICAgICAgbWF4V2FpdCA9IGZhbHNlLAogICAgICAgICAgdHJhaWxpbmcgPSB0cnVlOwoKICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjsKICAgICAgfQogICAgICB3YWl0ID0gbmF0aXZlTWF4KDAsIHdhaXQpIHx8IDA7CiAgICAgIGlmIChvcHRpb25zID09PSB0cnVlKSB7CiAgICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlOwogICAgICAgIHRyYWlsaW5nID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHsKICAgICAgICBsZWFkaW5nID0gb3B0aW9ucy5sZWFkaW5nOwogICAgICAgIG1heFdhaXQgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucyAmJiAobmF0aXZlTWF4KHdhaXQsIG9wdGlvbnMubWF4V2FpdCkgfHwgMCk7CiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyBvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7CiAgICAgIH0KICAgICAgdmFyIGRlbGF5ZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3coKSAtIHN0YW1wKTsKICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHsKICAgICAgICAgIGlmIChtYXhUaW1lb3V0SWQpIHsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG1heFRpbWVvdXRJZCk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgaXNDYWxsZWQgPSB0cmFpbGluZ0NhbGw7CiAgICAgICAgICBtYXhUaW1lb3V0SWQgPSB0aW1lb3V0SWQgPSB0cmFpbGluZ0NhbGwgPSB1bmRlZmluZWQ7CiAgICAgICAgICBpZiAoaXNDYWxsZWQpIHsKICAgICAgICAgICAgbGFzdENhbGxlZCA9IG5vdygpOwogICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpOwogICAgICAgICAgICBpZiAoIXRpbWVvdXRJZCAmJiAhbWF4VGltZW91dElkKSB7CiAgICAgICAgICAgICAgYXJncyA9IHRoaXNBcmcgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZGVsYXllZCwgcmVtYWluaW5nKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICB2YXIgbWF4RGVsYXllZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aW1lb3V0SWQpIHsKICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgIH0KICAgICAgICBtYXhUaW1lb3V0SWQgPSB0aW1lb3V0SWQgPSB0cmFpbGluZ0NhbGwgPSB1bmRlZmluZWQ7CiAgICAgICAgaWYgKHRyYWlsaW5nIHx8IChtYXhXYWl0ICE9PSB3YWl0KSkgewogICAgICAgICAgbGFzdENhbGxlZCA9IG5vdygpOwogICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTsKICAgICAgICAgIGlmICghdGltZW91dElkICYmICFtYXhUaW1lb3V0SWQpIHsKICAgICAgICAgICAgYXJncyA9IHRoaXNBcmcgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKCiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBhcmdzID0gYXJndW1lbnRzOwogICAgICAgIHN0YW1wID0gbm93KCk7CiAgICAgICAgdGhpc0FyZyA9IHRoaXM7CiAgICAgICAgdHJhaWxpbmdDYWxsID0gdHJhaWxpbmcgJiYgKHRpbWVvdXRJZCB8fCAhbGVhZGluZyk7CgogICAgICAgIGlmIChtYXhXYWl0ID09PSBmYWxzZSkgewogICAgICAgICAgdmFyIGxlYWRpbmdDYWxsID0gbGVhZGluZyAmJiAhdGltZW91dElkOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIW1heFRpbWVvdXRJZCAmJiAhbGVhZGluZykgewogICAgICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcmVtYWluaW5nID0gbWF4V2FpdCAtIChzdGFtcCAtIGxhc3RDYWxsZWQpLAogICAgICAgICAgICAgIGlzQ2FsbGVkID0gcmVtYWluaW5nIDw9IDA7CgogICAgICAgICAgaWYgKGlzQ2FsbGVkKSB7CiAgICAgICAgICAgIGlmIChtYXhUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICBtYXhUaW1lb3V0SWQgPSBjbGVhclRpbWVvdXQobWF4VGltZW91dElkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7CiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICghbWF4VGltZW91dElkKSB7CiAgICAgICAgICAgIG1heFRpbWVvdXRJZCA9IHNldFRpbWVvdXQobWF4RGVsYXllZCwgcmVtYWluaW5nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzQ2FsbGVkICYmIHRpbWVvdXRJZCkgewogICAgICAgICAgdGltZW91dElkID0gY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCF0aW1lb3V0SWQgJiYgd2FpdCAhPT0gbWF4V2FpdCkgewogICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChkZWxheWVkLCB3YWl0KTsKICAgICAgICB9CiAgICAgICAgaWYgKGxlYWRpbmdDYWxsKSB7CiAgICAgICAgICBpc0NhbGxlZCA9IHRydWU7CiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNDYWxsZWQgJiYgIXRpbWVvdXRJZCAmJiAhbWF4VGltZW91dElkKSB7CiAgICAgICAgICBhcmdzID0gdGhpc0FyZyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBEZWZlcnMgZXhlY3V0aW5nIHRoZSBgZnVuY2AgZnVuY3Rpb24gdW50aWwgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXMgY2xlYXJlZC4KICAgICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQgaXMgaW52b2tlZC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuCiAgICAgKiBAcGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGguCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5kZWZlcihmdW5jdGlvbih0ZXh0KSB7IGNvbnNvbGUubG9nKHRleHQpOyB9LCAnZGVmZXJyZWQnKTsKICAgICAqIC8vIGxvZ3MgJ2RlZmVycmVkJyBhZnRlciBvbmUgb3IgbW9yZSBtaWxsaXNlY29uZHMKICAgICAqLwogICAgZnVuY3Rpb24gZGVmZXIoZnVuYykgewogICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOwogICAgICB9CiAgICAgIHZhciBhcmdzID0gc2xpY2UoYXJndW1lbnRzLCAxKTsKICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFeGVjdXRlcyB0aGUgYGZ1bmNgIGZ1bmN0aW9uIGFmdGVyIGB3YWl0YCBtaWxsaXNlY29uZHMuIEFkZGl0aW9uYWwgYXJndW1lbnRzCiAgICAgKiB3aWxsIGJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0IGlzIGludm9rZWQuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LgogICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgZXhlY3V0aW9uLgogICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1bWVudHMgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoLgogICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkgeyBjb25zb2xlLmxvZyh0ZXh0KTsgfSwgMTAwMCwgJ2xhdGVyJyk7CiAgICAgKiAvLyA9PiBsb2dzICdsYXRlcicgYWZ0ZXIgb25lIHNlY29uZAogICAgICovCiAgICBmdW5jdGlvbiBkZWxheShmdW5jLCB3YWl0KSB7CiAgICAgIGlmICghaXNGdW5jdGlvbihmdW5jKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3I7CiAgICAgIH0KICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMsIDIpOwogICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCB3YWl0KTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzCiAgICAgKiBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdAogICAgICogYmFzZWQgb24gdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZQogICAgICogZmlyc3QgYXJndW1lbnQgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIGNhY2hlIGtleS4KICAgICAqIFRoZSBgZnVuY2AgaXMgZXhlY3V0ZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLgogICAgICogVGhlIHJlc3VsdCBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6aW5nIGZ1bmN0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgZmlib25hY2NpID0gXy5tZW1vaXplKGZ1bmN0aW9uKG4pIHsKICAgICAqICAgcmV0dXJuIG4gPCAyID8gbiA6IGZpYm9uYWNjaShuIC0gMSkgKyBmaWJvbmFjY2kobiAtIDIpOwogICAgICogfSk7CiAgICAgKgogICAgICogZmlib25hY2NpKDkpCiAgICAgKiAvLyA9PiAzNAogICAgICoKICAgICAqIHZhciBkYXRhID0gewogICAgICogICAnZnJlZCc6IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9LAogICAgICogICAncGViYmxlcyc6IHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxIH0KICAgICAqIH07CiAgICAgKgogICAgICogLy8gbW9kaWZ5aW5nIHRoZSByZXN1bHQgY2FjaGUKICAgICAqIHZhciBnZXQgPSBfLm1lbW9pemUoZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gZGF0YVtuYW1lXTsgfSwgXy5pZGVudGl0eSk7CiAgICAgKiBnZXQoJ3BlYmJsZXMnKTsKICAgICAqIC8vID0+IHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxIH0KICAgICAqCiAgICAgKiBnZXQuY2FjaGUucGViYmxlcy5uYW1lID0gJ3BlbmVsb3BlJzsKICAgICAqIGdldCgncGViYmxlcycpOwogICAgICogLy8gPT4geyAnbmFtZSc6ICdwZW5lbG9wZScsICdhZ2UnOiAxIH0KICAgICAqLwogICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikgewogICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOwogICAgICB9CiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjYWNoZSA9IG1lbW9pemVkLmNhY2hlLAogICAgICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrZXlQcmVmaXggKyBhcmd1bWVudHNbMF07CgogICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGNhY2hlLCBrZXkpCiAgICAgICAgICA/IGNhY2hlW2tleV0KICAgICAgICAgIDogKGNhY2hlW2tleV0gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgICB9CiAgICAgIG1lbW9pemVkLmNhY2hlID0ge307CiAgICAgIHJldHVybiBtZW1vaXplZDsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gZXhlY3V0ZSBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzIHRvCiAgICAgKiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBjYWxsLiBUaGUgYGZ1bmNgIGlzIGV4ZWN1dGVkCiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7CiAgICAgKiBpbml0aWFsaXplKCk7CiAgICAgKiBpbml0aWFsaXplKCk7CiAgICAgKiAvLyBgaW5pdGlhbGl6ZWAgZXhlY3V0ZXMgYGNyZWF0ZUFwcGxpY2F0aW9uYCBvbmNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykgewogICAgICB2YXIgcmFuLAogICAgICAgICAgcmVzdWx0OwoKICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHJhbikgewogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgICAgIC8vIGNsZWFyIHRoZSBgZnVuY2AgdmFyaWFibGUgc28gdGhlIGZ1bmN0aW9uIG1heSBiZSBnYXJiYWdlIGNvbGxlY3RlZAogICAgICAgIGZ1bmMgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIGludm9rZXMgYGZ1bmNgIHdpdGggYW55IGFkZGl0aW9uYWwKICAgICAqIGBwYXJ0aWFsYCBhcmd1bWVudHMgcHJlcGVuZGVkIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBuZXcgZnVuY3Rpb24uIFRoaXMKICAgICAqIG1ldGhvZCBpcyBzaW1pbGFyIHRvIGBfLmJpbmRgIGV4Y2VwdCBpdCBkb2VzICoqbm90KiogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5nLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLgogICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIGdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIG5hbWUpIHsgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTsgfTsKICAgICAqIHZhciBoaSA9IF8ucGFydGlhbChncmVldCwgJ2hpJyk7CiAgICAgKiBoaSgnZnJlZCcpOwogICAgICogLy8gPT4gJ2hpIGZyZWQnCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnRpYWwoZnVuYykgewogICAgICByZXR1cm4gY3JlYXRlV3JhcHBlcihmdW5jLCAxNiwgc2xpY2UoYXJndW1lbnRzLCAxKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnBhcnRpYWxgIGV4Y2VwdCB0aGF0IGBwYXJ0aWFsYCBhcmd1bWVudHMgYXJlCiAgICAgKiBhcHBlbmRlZCB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLgogICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIGRlZmF1bHRzRGVlcCA9IF8ucGFydGlhbFJpZ2h0KF8ubWVyZ2UsIF8uZGVmYXVsdHMpOwogICAgICoKICAgICAqIHZhciBvcHRpb25zID0gewogICAgICogICAndmFyaWFibGUnOiAnZGF0YScsCiAgICAgKiAgICdpbXBvcnRzJzogeyAnanEnOiAkIH0KICAgICAqIH07CiAgICAgKgogICAgICogZGVmYXVsdHNEZWVwKG9wdGlvbnMsIF8udGVtcGxhdGVTZXR0aW5ncyk7CiAgICAgKgogICAgICogb3B0aW9ucy52YXJpYWJsZQogICAgICogLy8gPT4gJ2RhdGEnCiAgICAgKgogICAgICogb3B0aW9ucy5pbXBvcnRzCiAgICAgKiAvLyA9PiB7ICdfJzogXywgJ2pxJzogJCB9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnRpYWxSaWdodChmdW5jKSB7CiAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKGZ1bmMsIDMyLCBudWxsLCBzbGljZShhcmd1bWVudHMsIDEpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGV4ZWN1dGVkLCB3aWxsIG9ubHkgY2FsbCB0aGUgYGZ1bmNgIGZ1bmN0aW9uCiAgICAgKiBhdCBtb3N0IG9uY2UgcGVyIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFByb3ZpZGUgYW4gb3B0aW9ucyBvYmplY3QgdG8KICAgICAqIGluZGljYXRlIHRoYXQgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlCiAgICAgKiBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiB3aWxsCiAgICAgKiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgY2FsbC4KICAgICAqCiAgICAgKiBOb3RlOiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgIGBmdW5jYCB3aWxsIGJlIGNhbGxlZAogICAgICogb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhlIHRocm90dGxlZCBmdW5jdGlvbiBpcwogICAgICogaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIGV4ZWN1dGlvbnMgdG8uCiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFRoZSBvcHRpb25zIG9iamVjdC4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXSBTcGVjaWZ5IGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgogICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXSBTcGVjaWZ5IGV4ZWN1dGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogLy8gYXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxlIHNjcm9sbGluZwogICAgICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCk7CiAgICAgKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgdGhyb3R0bGVkKTsKICAgICAqCiAgICAgKiAvLyBleGVjdXRlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMKICAgICAqIGpRdWVyeSgnLmludGVyYWN0aXZlJykub24oJ2NsaWNrJywgXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsKICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2UKICAgICAqIH0pKTsKICAgICAqLwogICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykgewogICAgICB2YXIgbGVhZGluZyA9IHRydWUsCiAgICAgICAgICB0cmFpbGluZyA9IHRydWU7CgogICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkgewogICAgICAgIGxlYWRpbmcgPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChpc09iamVjdChvcHRpb25zKSkgewogICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/IG9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7CiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyBvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7CiAgICAgIH0KICAgICAgZGVib3VuY2VPcHRpb25zLmxlYWRpbmcgPSBsZWFkaW5nOwogICAgICBkZWJvdW5jZU9wdGlvbnMubWF4V2FpdCA9IHdhaXQ7CiAgICAgIGRlYm91bmNlT3B0aW9ucy50cmFpbGluZyA9IHRyYWlsaW5nOwoKICAgICAgcmV0dXJuIGRlYm91bmNlKGZ1bmMsIHdhaXQsIGRlYm91bmNlT3B0aW9ucyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBgdmFsdWVgIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIGFzIGl0cwogICAgICogZmlyc3QgYXJndW1lbnQuIEFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWQKICAgICAqIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uLiBUaGUgd3JhcHBlciBpcyBleGVjdXRlZCB3aXRoCiAgICAgKiB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7CiAgICAgKiAgIHJldHVybiAnPHA+JyArIGZ1bmModGV4dCkgKyAnPC9wPic7CiAgICAgKiB9KTsKICAgICAqCiAgICAgKiBwKCdGcmVkLCBXaWxtYSwgJiBQZWJibGVzJyk7CiAgICAgKiAvLyA9PiAnPHA+RnJlZCwgV2lsbWEsICZhbXA7IFBlYmJsZXM8L3A+JwogICAgICovCiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7CiAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHdyYXBwZXIsIDE2LCBbdmFsdWVdKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IFV0aWxpdGllcwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgb2JqZWN0ID0geyAnbmFtZSc6ICdmcmVkJyB9OwogICAgICogdmFyIGdldHRlciA9IF8uY29uc3RhbnQob2JqZWN0KTsKICAgICAqIGdldHRlcigpID09PSBvYmplY3Q7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm9kdWNlcyBhIGNhbGxiYWNrIGJvdW5kIHRvIGFuIG9wdGlvbmFsIGB0aGlzQXJnYC4gSWYgYGZ1bmNgIGlzIGEgcHJvcGVydHkKICAgICAqIG5hbWUgdGhlIGNyZWF0ZWQgY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuCiAgICAgKiBJZiBgZnVuY2AgaXMgYW4gb2JqZWN0IHRoZSBjcmVhdGVkIGNhbGxiYWNrIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMKICAgICAqIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudCBvYmplY3QgcHJvcGVydGllcywgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGBmYWxzZWAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKICAgICAqIEBwYXJhbSB7Kn0gW2Z1bmM9aWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ0NvdW50XSBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGUgY2FsbGJhY2sgYWNjZXB0cy4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfQogICAgICogXTsKICAgICAqCiAgICAgKiAvLyB3cmFwIHRvIGNyZWF0ZSBjdXN0b20gY2FsbGJhY2sgc2hvcnRoYW5kcwogICAgICogXy5jcmVhdGVDYWxsYmFjayA9IF8ud3JhcChfLmNyZWF0ZUNhbGxiYWNrLCBmdW5jdGlvbihmdW5jLCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICogICB2YXIgbWF0Y2ggPSAvXiguKz8pX18oW2dsXXQpKC4rKSQvLmV4ZWMoY2FsbGJhY2spOwogICAgICogICByZXR1cm4gIW1hdGNoID8gZnVuYyhjYWxsYmFjaywgdGhpc0FyZykgOiBmdW5jdGlvbihvYmplY3QpIHsKICAgICAqICAgICByZXR1cm4gbWF0Y2hbMl0gPT0gJ2d0JyA/IG9iamVjdFttYXRjaFsxXV0gPiBtYXRjaFszXSA6IG9iamVjdFttYXRjaFsxXV0gPCBtYXRjaFszXTsKICAgICAqICAgfTsKICAgICAqIH0pOwogICAgICoKICAgICAqIF8uZmlsdGVyKGNoYXJhY3RlcnMsICdhZ2VfX2d0MzgnKTsKICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV0KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlQ2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIHsKICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgZnVuYzsKICAgICAgaWYgKGZ1bmMgPT0gbnVsbCB8fCB0eXBlID09ICdmdW5jdGlvbicpIHsKICAgICAgICByZXR1cm4gYmFzZUNyZWF0ZUNhbGxiYWNrKGZ1bmMsIHRoaXNBcmcsIGFyZ0NvdW50KTsKICAgICAgfQogICAgICAvLyBoYW5kbGUgIl8ucGx1Y2siIHN0eWxlIGNhbGxiYWNrIHNob3J0aGFuZHMKICAgICAgaWYgKHR5cGUgIT0gJ29iamVjdCcpIHsKICAgICAgICByZXR1cm4gcHJvcGVydHkoZnVuYyk7CiAgICAgIH0KICAgICAgdmFyIHByb3BzID0ga2V5cyhmdW5jKSwKICAgICAgICAgIGtleSA9IHByb3BzWzBdLAogICAgICAgICAgYSA9IGZ1bmNba2V5XTsKCiAgICAgIC8vIGhhbmRsZSAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sgc2hvcnRoYW5kcwogICAgICBpZiAocHJvcHMubGVuZ3RoID09IDEgJiYgYSA9PT0gYSAmJiAhaXNPYmplY3QoYSkpIHsKICAgICAgICAvLyBmYXN0IHBhdGggdGhlIGNvbW1vbiBjYXNlIG9mIHByb3ZpZGluZyBhbiBvYmplY3Qgd2l0aCBhIHNpbmdsZQogICAgICAgIC8vIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBwcmltaXRpdmUgdmFsdWUKICAgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICB2YXIgYiA9IG9iamVjdFtrZXldOwogICAgICAgICAgcmV0dXJuIGEgPT09IGIgJiYgKGEgIT09IDAgfHwgKDEgLyBhID09IDEgLyBiKSk7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CgogICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgaWYgKCEocmVzdWx0ID0gYmFzZUlzRXF1YWwob2JqZWN0W3Byb3BzW2xlbmd0aF1dLCBmdW5jW3Byb3BzW2xlbmd0aF1dLCBudWxsLCB0cnVlKSkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0aGUgY2hhcmFjdGVycyBgJmAsIGA8YCwgYD5gLCBgImAsIGFuZCBgJ2AgaW4gYHN0cmluZ2AgdG8gdGhlaXIKICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IFV0aWxpdGllcwogICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZS4KICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmVzY2FwZSgnRnJlZCwgV2lsbWEsICYgUGViYmxlcycpOwogICAgICogLy8gPT4gJ0ZyZWQsIFdpbG1hLCAmYW1wOyBQZWJibGVzJwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7CiAgICAgIHJldHVybiBzdHJpbmcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHN0cmluZykucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IHByb3ZpZGVkIHRvIGl0LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzogJ2ZyZWQnIH07CiAgICAgKiBfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdDsKICAgICAqIC8vID0+IHRydWUKICAgICAqLwogICAgZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkcyBmdW5jdGlvbiBwcm9wZXJ0aWVzIG9mIGEgc291cmNlIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICogSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiBtZXRob2RzIHdpbGwgYmUgYWRkZWQgdG8gaXRzIHByb3RvdHlwZSBhcyB3ZWxsLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gW29iamVjdD1sb2Rhc2hdIG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFRoZSBvcHRpb25zIG9iamVjdC4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIHRoZSBmdW5jdGlvbnMgYWRkZWQgYXJlIGNoYWluYWJsZS4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHsKICAgICAqICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKS50b0xvd2VyQ2FzZSgpOwogICAgICogfQogICAgICoKICAgICAqIF8ubWl4aW4oeyAnY2FwaXRhbGl6ZSc6IGNhcGl0YWxpemUgfSk7CiAgICAgKiBfLmNhcGl0YWxpemUoJ2ZyZWQnKTsKICAgICAqIC8vID0+ICdGcmVkJwogICAgICoKICAgICAqIF8oJ2ZyZWQnKS5jYXBpdGFsaXplKCkudmFsdWUoKTsKICAgICAqIC8vID0+ICdGcmVkJwogICAgICoKICAgICAqIF8ubWl4aW4oeyAnY2FwaXRhbGl6ZSc6IGNhcGl0YWxpemUgfSwgeyAnY2hhaW4nOiBmYWxzZSB9KTsKICAgICAqIF8oJ2ZyZWQnKS5jYXBpdGFsaXplKCk7CiAgICAgKiAvLyA9PiAnRnJlZCcKICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW4ob2JqZWN0LCBzb3VyY2UsIG9wdGlvbnMpIHsKICAgICAgdmFyIGNoYWluID0gdHJ1ZSwKICAgICAgICAgIG1ldGhvZE5hbWVzID0gc291cmNlICYmIGZ1bmN0aW9ucyhzb3VyY2UpOwoKICAgICAgaWYgKCFzb3VyY2UgfHwgKCFvcHRpb25zICYmICFtZXRob2ROYW1lcy5sZW5ndGgpKSB7CiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgICAgb3B0aW9ucyA9IHNvdXJjZTsKICAgICAgICB9CiAgICAgICAgY3RvciA9IGxvZGFzaFdyYXBwZXI7CiAgICAgICAgc291cmNlID0gb2JqZWN0OwogICAgICAgIG9iamVjdCA9IGxvZGFzaDsKICAgICAgICBtZXRob2ROYW1lcyA9IGZ1bmN0aW9ucyhzb3VyY2UpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkgewogICAgICAgIGNoYWluID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB7CiAgICAgICAgY2hhaW4gPSBvcHRpb25zLmNoYWluOwogICAgICB9CiAgICAgIHZhciBjdG9yID0gb2JqZWN0LAogICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihjdG9yKTsKCiAgICAgIGZvckVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKICAgICAgICB2YXIgZnVuYyA9IG9iamVjdFttZXRob2ROYW1lXSA9IHNvdXJjZVttZXRob2ROYW1lXTsKICAgICAgICBpZiAoaXNGdW5jKSB7CiAgICAgICAgICBjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXywKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXywKICAgICAgICAgICAgICAgIGFyZ3MgPSBbdmFsdWVdOwoKICAgICAgICAgICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseShvYmplY3QsIGFyZ3MpOwogICAgICAgICAgICBpZiAoY2hhaW4gfHwgY2hhaW5BbGwpIHsKICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHJlc3VsdCAmJiBpc09iamVjdChyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IGN0b3IocmVzdWx0KTsKICAgICAgICAgICAgICByZXN1bHQuX19jaGFpbl9fID0gY2hhaW5BbGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldmVydHMgdGhlICdfJyB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8KICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IFV0aWxpdGllcwogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIGxvZGFzaCA9IF8ubm9Db25mbGljdCgpOwogICAgICovCiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkgewogICAgICBjb250ZXh0Ll8gPSBvbGREYXNoOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEEgbm8tb3BlcmF0aW9uIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzogJ2ZyZWQnIH07CiAgICAgKiBfLm5vb3Aob2JqZWN0KSA9PT0gdW5kZWZpbmVkOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBub29wKCkgewogICAgICAvLyBubyBvcGVyYXRpb24gcGVyZm9ybWVkCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBVbml4IGVwb2NoCiAgICAgKiAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IFV0aWxpdGllcwogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgc3RhbXAgPSBfLm5vdygpOwogICAgICogXy5kZWZlcihmdW5jdGlvbigpIHsgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTsgfSk7CiAgICAgKiAvLyA9PiBsb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBmdW5jdGlvbiB0byBiZSBjYWxsZWQKICAgICAqLwogICAgdmFyIG5vdyA9IGlzTmF0aXZlKG5vdyA9IERhdGUubm93KSAmJiBub3cgfHwgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguCiAgICAgKiBJZiBgcmFkaXhgIGlzIGB1bmRlZmluZWRgIG9yIGAwYCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyB0aGUKICAgICAqIGB2YWx1ZWAgaXMgYSBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLgogICAgICoKICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGF2b2lkcyBkaWZmZXJlbmNlcyBpbiBuYXRpdmUgRVMzIGFuZCBFUzUgYHBhcnNlSW50YAogICAgICogaW1wbGVtZW50YXRpb25zLiBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8vI0UuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFyc2UuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl4XSBUaGUgcmFkaXggdXNlZCB0byBpbnRlcnByZXQgdGhlIHZhbHVlIHRvIHBhcnNlLgogICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbmV3IGludGVnZXIgdmFsdWUuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8ucGFyc2VJbnQoJzA4Jyk7CiAgICAgKiAvLyA9PiA4CiAgICAgKi8KICAgIHZhciBwYXJzZUludCA9IG5hdGl2ZVBhcnNlSW50KHdoaXRlc3BhY2UgKyAnMDgnKSA9PSA4ID8gbmF0aXZlUGFyc2VJbnQgOiBmdW5jdGlvbih2YWx1ZSwgcmFkaXgpIHsKICAgICAgLy8gRmlyZWZveCA8IDIxIGFuZCBPcGVyYSA8IDE1IGZvbGxvdyB0aGUgRVMzIHNwZWNpZmllZCBpbXBsZW1lbnRhdGlvbiBvZiBgcGFyc2VJbnRgCiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludChpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZS5yZXBsYWNlKHJlTGVhZGluZ1NwYWNlc0FuZFplcm9zLCAnJykgOiB2YWx1ZSwgcmFkaXggfHwgMCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhICJfLnBsdWNrIiBzdHlsZSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyB0aGUgYGtleWAgdmFsdWUgb2YgYQogICAgICogZ2l2ZW4gb2JqZWN0LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZS4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfSwKICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfQogICAgICogXTsKICAgICAqCiAgICAgKiB2YXIgZ2V0TmFtZSA9IF8ucHJvcGVydHkoJ25hbWUnKTsKICAgICAqCiAgICAgKiBfLm1hcChjaGFyYWN0ZXJzLCBnZXROYW1lKTsKICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXQogICAgICoKICAgICAqIF8uc29ydEJ5KGNoYXJhY3RlcnMsIGdldE5hbWUpOwogICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1dCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BlcnR5KGtleSkgewogICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldOwogICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgIChpbmNsdXNpdmUpLiBJZiBvbmx5IG9uZQogICAgICogYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBudW1iZXIgd2lsbCBiZQogICAgICogcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgdHJ1ZXkgb3IgZWl0aGVyIGBtaW5gIG9yIGBtYXhgIGFyZSBmbG9hdHMgYQogICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW21pbj0wXSBUaGUgbWluaW11bSBwb3NzaWJsZSB2YWx1ZS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4PTFdIFRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlLgogICAgICogQHBhcmFtIHtib29sZWFufSBbZmxvYXRpbmc9ZmFsc2VdIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgogICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBhIHJhbmRvbSBudW1iZXIuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8ucmFuZG9tKDAsIDUpOwogICAgICogLy8gPT4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDUKICAgICAqCiAgICAgKiBfLnJhbmRvbSg1KTsKICAgICAqIC8vID0+IGFsc28gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDUKICAgICAqCiAgICAgKiBfLnJhbmRvbSg1LCB0cnVlKTsKICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgNQogICAgICoKICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTsKICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMS4yIGFuZCA1LjIKICAgICAqLwogICAgZnVuY3Rpb24gcmFuZG9tKG1pbiwgbWF4LCBmbG9hdGluZykgewogICAgICB2YXIgbm9NaW4gPSBtaW4gPT0gbnVsbCwKICAgICAgICAgIG5vTWF4ID0gbWF4ID09IG51bGw7CgogICAgICBpZiAoZmxvYXRpbmcgPT0gbnVsbCkgewogICAgICAgIGlmICh0eXBlb2YgbWluID09ICdib29sZWFuJyAmJiBub01heCkgewogICAgICAgICAgZmxvYXRpbmcgPSBtaW47CiAgICAgICAgICBtaW4gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghbm9NYXggJiYgdHlwZW9mIG1heCA9PSAnYm9vbGVhbicpIHsKICAgICAgICAgIGZsb2F0aW5nID0gbWF4OwogICAgICAgICAgbm9NYXggPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobm9NaW4gJiYgbm9NYXgpIHsKICAgICAgICBtYXggPSAxOwogICAgICB9CiAgICAgIG1pbiA9ICttaW4gfHwgMDsKICAgICAgaWYgKG5vTWF4KSB7CiAgICAgICAgbWF4ID0gbWluOwogICAgICAgIG1pbiA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWF4ID0gK21heCB8fCAwOwogICAgICB9CiAgICAgIGlmIChmbG9hdGluZyB8fCBtaW4gJSAxIHx8IG1heCAlIDEpIHsKICAgICAgICB2YXIgcmFuZCA9IG5hdGl2ZVJhbmRvbSgpOwogICAgICAgIHJldHVybiBuYXRpdmVNaW4obWluICsgKHJhbmQgKiAobWF4IC0gbWluICsgcGFyc2VGbG9hdCgnMWUtJyArICgocmFuZCArJycpLmxlbmd0aCAtIDEpKSkpLCBtYXgpOwogICAgICB9CiAgICAgIHJldHVybiBiYXNlUmFuZG9tKG1pbiwgbWF4KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlc29sdmVzIHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eSBga2V5YCBvbiBgb2JqZWN0YC4gSWYgYGtleWAgaXMgYSBmdW5jdGlvbgogICAgICogaXQgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBvYmplY3RgIGFuZCBpdHMgcmVzdWx0IHJldHVybmVkLAogICAgICogZWxzZSB0aGUgcHJvcGVydHkgdmFsdWUgaXMgcmV0dXJuZWQuIElmIGBvYmplY3RgIGlzIGZhbHNleSB0aGVuIGB1bmRlZmluZWRgCiAgICAgKiBpcyByZXR1cm5lZC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IFV0aWxpdGllcwogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlLgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgb2JqZWN0ID0gewogICAgICogICAnY2hlZXNlJzogJ2NydW1wZXRzJywKICAgICAqICAgJ3N0dWZmJzogZnVuY3Rpb24oKSB7CiAgICAgKiAgICAgcmV0dXJuICdub25zZW5zZSc7CiAgICAgKiAgIH0KICAgICAqIH07CiAgICAgKgogICAgICogXy5yZXN1bHQob2JqZWN0LCAnY2hlZXNlJyk7CiAgICAgKiAvLyA9PiAnY3J1bXBldHMnCiAgICAgKgogICAgICogXy5yZXN1bHQob2JqZWN0LCAnc3R1ZmYnKTsKICAgICAqIC8vID0+ICdub25zZW5zZScKICAgICAqLwogICAgZnVuY3Rpb24gcmVzdWx0KG9iamVjdCwga2V5KSB7CiAgICAgIGlmIChvYmplY3QpIHsKICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTsKICAgICAgICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSkgPyBvYmplY3Rba2V5XSgpIDogdmFsdWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEEgbWljcm8tdGVtcGxhdGluZyBtZXRob2QgdGhhdCBoYW5kbGVzIGFyYml0cmFyeSBkZWxpbWl0ZXJzLCBwcmVzZXJ2ZXMKICAgICAqIHdoaXRlc3BhY2UsIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLgogICAgICoKICAgICAqIE5vdGU6IEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCwgYF8udGVtcGxhdGVgIHV0aWxpemVzIHNvdXJjZVVSTHMgZm9yIGVhc2llcgogICAgICogZGVidWdnaW5nLiBTZWUgaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybAogICAgICoKICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2VlOgogICAgICogaHR0cDovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcwogICAgICoKICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIENocm9tZSBleHRlbnNpb24gc2FuZGJveGVzIHNlZToKICAgICAqIGh0dHA6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9zdGFibGUvZXh0ZW5zaW9ucy9zYW5kYm94aW5nRXZhbC5odG1sCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRoZSB0ZW1wbGF0ZSB0ZXh0LgogICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgVGhlIGRhdGEgb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgdGhlIHRleHQuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFRoZSBvcHRpb25zIG9iamVjdC4KICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGVdIFRoZSAiZXNjYXBlIiBkZWxpbWl0ZXIuCiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXZhbHVhdGVdIFRoZSAiZXZhbHVhdGUiIGRlbGltaXRlci4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5pbXBvcnRzXSBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGxvY2FsIHZhcmlhYmxlcy4KICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZV0gVGhlICJpbnRlcnBvbGF0ZSIgZGVsaW1pdGVyLgogICAgICogQHBhcmFtIHtzdHJpbmd9IFtzb3VyY2VVUkxdIFRoZSBzb3VyY2VVUkwgb2YgdGhlIHRlbXBsYXRlJ3MgY29tcGlsZWQgc291cmNlLgogICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YXJpYWJsZV0gVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb258c3RyaW5nfSBSZXR1cm5zIGEgY29tcGlsZWQgZnVuY3Rpb24gd2hlbiBubyBgZGF0YWAgb2JqZWN0CiAgICAgKiAgaXMgZ2l2ZW4sIGVsc2UgaXQgcmV0dXJucyB0aGUgaW50ZXJwb2xhdGVkIHRleHQuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIC8vIHVzaW5nIHRoZSAiaW50ZXJwb2xhdGUiIGRlbGltaXRlciB0byBjcmVhdGUgYSBjb21waWxlZCB0ZW1wbGF0ZQogICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IG5hbWUgJT4nKTsKICAgICAqIGNvbXBpbGVkKHsgJ25hbWUnOiAnZnJlZCcgfSk7CiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCcKICAgICAqCiAgICAgKiAvLyB1c2luZyB0aGUgImVzY2FwZSIgZGVsaW1pdGVyIHRvIGVzY2FwZSBIVE1MIGluIGRhdGEgcHJvcGVydHkgdmFsdWVzCiAgICAgKiBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+JywgeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pOwogICAgICogLy8gPT4gJzxiPiZsdDtzY3JpcHQmZ3Q7PC9iPicKICAgICAqCiAgICAgKiAvLyB1c2luZyB0aGUgImV2YWx1YXRlIiBkZWxpbWl0ZXIgdG8gZ2VuZXJhdGUgSFRNTAogICAgICogdmFyIGxpc3QgPSAnPCUgXy5mb3JFYWNoKHBlb3BsZSwgZnVuY3Rpb24obmFtZSkgeyAlPjxsaT48JS0gbmFtZSAlPjwvbGk+PCUgfSk7ICU+JzsKICAgICAqIF8udGVtcGxhdGUobGlzdCwgeyAncGVvcGxlJzogWydmcmVkJywgJ2Jhcm5leSddIH0pOwogICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nCiAgICAgKgogICAgICogLy8gdXNpbmcgdGhlIEVTNiBkZWxpbWl0ZXIgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIGRlZmF1bHQgImludGVycG9sYXRlIiBkZWxpbWl0ZXIKICAgICAqIF8udGVtcGxhdGUoJ2hlbGxvICR7IG5hbWUgfScsIHsgJ25hbWUnOiAncGViYmxlcycgfSk7CiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcycKICAgICAqCiAgICAgKiAvLyB1c2luZyB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiAiZXZhbHVhdGUiIGRlbGltaXRlcnMKICAgICAqIF8udGVtcGxhdGUoJzwlIHByaW50KCJoZWxsbyAiICsgbmFtZSk7ICU+IScsIHsgJ25hbWUnOiAnYmFybmV5JyB9KTsKICAgICAqIC8vID0+ICdoZWxsbyBiYXJuZXkhJwogICAgICoKICAgICAqIC8vIHVzaW5nIGEgY3VzdG9tIHRlbXBsYXRlIGRlbGltaXRlcnMKICAgICAqIF8udGVtcGxhdGVTZXR0aW5ncyA9IHsKICAgICAqICAgJ2ludGVycG9sYXRlJzogL3t7KFtcc1xTXSs/KX19L2cKICAgICAqIH07CiAgICAgKgogICAgICogXy50ZW1wbGF0ZSgnaGVsbG8ge3sgbmFtZSB9fSEnLCB7ICduYW1lJzogJ211c3RhY2hlJyB9KTsKICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnCiAgICAgKgogICAgICogLy8gdXNpbmcgdGhlIGBpbXBvcnRzYCBvcHRpb24gdG8gaW1wb3J0IGpRdWVyeQogICAgICogdmFyIGxpc3QgPSAnPCUganEuZWFjaChwZW9wbGUsIGZ1bmN0aW9uKG5hbWUpIHsgJT48bGk+PCUtIG5hbWUgJT48L2xpPjwlIH0pOyAlPic7CiAgICAgKiBfLnRlbXBsYXRlKGxpc3QsIHsgJ3Blb3BsZSc6IFsnZnJlZCcsICdiYXJuZXknXSB9LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTsKICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+JwogICAgICoKICAgICAqIC8vIHVzaW5nIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZQogICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IG5hbWUgJT4nLCBudWxsLCB7ICdzb3VyY2VVUkwnOiAnL2Jhc2ljL2dyZWV0aW5nLmpzdCcgfSk7CiAgICAgKiBjb21waWxlZChkYXRhKTsKICAgICAqIC8vID0+IGZpbmQgdGhlIHNvdXJjZSBvZiAiZ3JlZXRpbmcuanN0IiB1bmRlciB0aGUgU291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yCiAgICAgKgogICAgICogLy8gdXNpbmcgdGhlIGB2YXJpYWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlCiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS5uYW1lICU+IScsIG51bGwsIHsgJ3ZhcmlhYmxlJzogJ2RhdGEnIH0pOwogICAgICogY29tcGlsZWQuc291cmNlOwogICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkgewogICAgICogICB2YXIgX190LCBfX3AgPSAnJywgX19lID0gXy5lc2NhcGU7CiAgICAgKiAgIF9fcCArPSAnaGkgJyArICgoX190ID0gKCBkYXRhLm5hbWUgKSkgPT0gbnVsbCA/ICcnIDogX190KSArICchJzsKICAgICAqICAgcmV0dXJuIF9fcDsKICAgICAqIH0KICAgICAqCiAgICAgKiAvLyB1c2luZyB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bAogICAgICogLy8gbGluZSBudW1iZXJzIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBhIHN0YWNrIHRyYWNlCiAgICAgKiBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihjd2QsICdqc3QuanMnKSwgJ1wKICAgICAqICAgdmFyIEpTVCA9IHtcCiAgICAgKiAgICAgIm1haW4iOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1wKICAgICAqICAgfTtcCiAgICAgKiAnKTsKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGUodGV4dCwgZGF0YSwgb3B0aW9ucykgewogICAgICAvLyBiYXNlZCBvbiBKb2huIFJlc2lnJ3MgYHRtcGxgIGltcGxlbWVudGF0aW9uCiAgICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvCiAgICAgIC8vIGFuZCBMYXVyYSBEb2t0b3JvdmEncyBkb1QuanMKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVAogICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5nczsKICAgICAgdGV4dCA9IFN0cmluZyh0ZXh0IHx8ICcnKTsKCiAgICAgIC8vIGF2b2lkIG1pc3NpbmcgZGVwZW5kZW5jaWVzIHdoZW4gYGl0ZXJhdG9yVGVtcGxhdGVgIGlzIG5vdCBkZWZpbmVkCiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0cyh7fSwgb3B0aW9ucywgc2V0dGluZ3MpOwoKICAgICAgdmFyIGltcG9ydHMgPSBkZWZhdWx0cyh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzKSwKICAgICAgICAgIGltcG9ydHNLZXlzID0ga2V5cyhpbXBvcnRzKSwKICAgICAgICAgIGltcG9ydHNWYWx1ZXMgPSB2YWx1ZXMoaW1wb3J0cyk7CgogICAgICB2YXIgaXNFdmFsdWF0aW5nLAogICAgICAgICAgaW5kZXggPSAwLAogICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJlTm9NYXRjaCwKICAgICAgICAgIHNvdXJjZSA9ICJfX3AgKz0gJyI7CgogICAgICAvLyBjb21waWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIKICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cCgKICAgICAgICAob3B0aW9ucy5lc2NhcGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgKwogICAgICAgIGludGVycG9sYXRlLnNvdXJjZSArICd8JyArCiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgKwogICAgICAgIChvcHRpb25zLmV2YWx1YXRlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wkJwogICAgICAsICdnJyk7CgogICAgICB0ZXh0LnJlcGxhY2UocmVEZWxpbWl0ZXJzLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlVmFsdWUsIGludGVycG9sYXRlVmFsdWUsIGVzVGVtcGxhdGVWYWx1ZSwgZXZhbHVhdGVWYWx1ZSwgb2Zmc2V0KSB7CiAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7CgogICAgICAgIC8vIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2Fubm90IGJlIGluY2x1ZGVkIGluIHN0cmluZyBsaXRlcmFscwogICAgICAgIHNvdXJjZSArPSB0ZXh0LnNsaWNlKGluZGV4LCBvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsIGVzY2FwZVN0cmluZ0NoYXIpOwoKICAgICAgICAvLyByZXBsYWNlIGRlbGltaXRlcnMgd2l0aCBzbmlwcGV0cwogICAgICAgIGlmIChlc2NhcGVWYWx1ZSkgewogICAgICAgICAgc291cmNlICs9ICInICtcbl9fZSgiICsgZXNjYXBlVmFsdWUgKyAiKSArXG4nIjsKICAgICAgICB9CiAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHsKICAgICAgICAgIGlzRXZhbHVhdGluZyA9IHRydWU7CiAgICAgICAgICBzb3VyY2UgKz0gIic7XG4iICsgZXZhbHVhdGVWYWx1ZSArICI7XG5fX3AgKz0gJyI7CiAgICAgICAgfQogICAgICAgIGlmIChpbnRlcnBvbGF0ZVZhbHVlKSB7CiAgICAgICAgICBzb3VyY2UgKz0gIicgK1xuKChfX3QgPSAoIiArIGludGVycG9sYXRlVmFsdWUgKyAiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXG4nIjsKICAgICAgICB9CiAgICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7CgogICAgICAgIC8vIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgcmVxdWlyZXMgcmV0dXJuaW5nIHRoZSBgbWF0Y2hgCiAgICAgICAgLy8gc3RyaW5nIGluIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWUKICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgIH0pOwoKICAgICAgc291cmNlICs9ICInO1xuIjsKCiAgICAgIC8vIGlmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCwgd3JhcCBhIHdpdGgtc3RhdGVtZW50IGFyb3VuZCB0aGUgZ2VuZXJhdGVkCiAgICAgIC8vIGNvZGUgdG8gYWRkIHRoZSBkYXRhIG9iamVjdCB0byB0aGUgdG9wIG9mIHRoZSBzY29wZSBjaGFpbgogICAgICB2YXIgdmFyaWFibGUgPSBvcHRpb25zLnZhcmlhYmxlLAogICAgICAgICAgaGFzVmFyaWFibGUgPSB2YXJpYWJsZTsKCiAgICAgIGlmICghaGFzVmFyaWFibGUpIHsKICAgICAgICB2YXJpYWJsZSA9ICdvYmonOwogICAgICAgIHNvdXJjZSA9ICd3aXRoICgnICsgdmFyaWFibGUgKyAnKSB7XG4nICsgc291cmNlICsgJ1xufVxuJzsKICAgICAgfQogICAgICAvLyBjbGVhbnVwIGNvZGUgYnkgc3RyaXBwaW5nIGVtcHR5IHN0cmluZ3MKICAgICAgc291cmNlID0gKGlzRXZhbHVhdGluZyA/IHNvdXJjZS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCAnJykgOiBzb3VyY2UpCiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwgJyQxJykKICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTsKCiAgICAgIC8vIGZyYW1lIGNvZGUgYXMgdGhlIGZ1bmN0aW9uIGJvZHkKICAgICAgc291cmNlID0gJ2Z1bmN0aW9uKCcgKyB2YXJpYWJsZSArICcpIHtcbicgKwogICAgICAgIChoYXNWYXJpYWJsZSA/ICcnIDogdmFyaWFibGUgKyAnIHx8ICgnICsgdmFyaWFibGUgKyAnID0ge30pO1xuJykgKwogICAgICAgICJ2YXIgX190LCBfX3AgPSAnJywgX19lID0gXy5lc2NhcGUiICsKICAgICAgICAoaXNFdmFsdWF0aW5nCiAgICAgICAgICA/ICcsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xuJyArCiAgICAgICAgICAgICJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cbiIKICAgICAgICAgIDogJztcbicKICAgICAgICApICsKICAgICAgICBzb3VyY2UgKwogICAgICAgICdyZXR1cm4gX19wXG59JzsKCiAgICAgIC8vIFVzZSBhIHNvdXJjZVVSTCBmb3IgZWFzaWVyIGRlYnVnZ2luZy4KICAgICAgLy8gaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybAogICAgICB2YXIgc291cmNlVVJMID0gJ1xuLypcbi8vIyBzb3VyY2VVUkw9JyArIChvcHRpb25zLnNvdXJjZVVSTCB8fCAnL2xvZGFzaC90ZW1wbGF0ZS9zb3VyY2VbJyArICh0ZW1wbGF0ZUNvdW50ZXIrKykgKyAnXScpICsgJ1xuKi8nOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmVzdWx0ID0gRnVuY3Rpb24oaW1wb3J0c0tleXMsICdyZXR1cm4gJyArIHNvdXJjZSArIHNvdXJjZVVSTCkuYXBwbHkodW5kZWZpbmVkLCBpbXBvcnRzVmFsdWVzKTsKICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgZS5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgdGhyb3cgZTsKICAgICAgfQogICAgICBpZiAoZGF0YSkgewogICAgICAgIHJldHVybiByZXN1bHQoZGF0YSk7CiAgICAgIH0KICAgICAgLy8gcHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24ncyBzb3VyY2UgYnkgaXRzIGB0b1N0cmluZ2AgbWV0aG9kLCBpbgogICAgICAvLyBzdXBwb3J0ZWQgZW52aXJvbm1lbnRzLCBvciB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5jZSBmb3IKICAgICAgLy8gaW5saW5pbmcgY29tcGlsZWQgdGVtcGxhdGVzIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcwogICAgICByZXN1bHQuc291cmNlID0gc291cmNlOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogRXhlY3V0ZXMgdGhlIGNhbGxiYWNrIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzCiAgICAgKiBvZiBlYWNoIGNhbGxiYWNrIGV4ZWN1dGlvbi4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZAogICAgICogd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gZXhlY3V0ZSB0aGUgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGBjYWxsYmFja2AgZXhlY3V0aW9uLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgZGljZVJvbGxzID0gXy50aW1lcygzLCBfLnBhcnRpYWwoXy5yYW5kb20sIDEsIDYpKTsKICAgICAqIC8vID0+IFszLCA2LCA0XQogICAgICoKICAgICAqIF8udGltZXMoMywgZnVuY3Rpb24obikgeyBtYWdlLmNhc3RTcGVsbChuKTsgfSk7CiAgICAgKiAvLyA9PiBjYWxscyBgbWFnZS5jYXN0U3BlbGwobilgIHRocmVlIHRpbWVzLCBwYXNzaW5nIGBuYCBvZiBgMGAsIGAxYCwgYW5kIGAyYCByZXNwZWN0aXZlbHkKICAgICAqCiAgICAgKiBfLnRpbWVzKDMsIGZ1bmN0aW9uKG4pIHsgdGhpcy5jYXN0KG4pOyB9LCBtYWdlKTsKICAgICAqIC8vID0+IGFsc28gY2FsbHMgYG1hZ2UuY2FzdFNwZWxsKG4pYCB0aHJlZSB0aW1lcwogICAgICovCiAgICBmdW5jdGlvbiB0aW1lcyhuLCBjYWxsYmFjaywgdGhpc0FyZykgewogICAgICBuID0gKG4gPSArbikgPiAtMSA/IG4gOiAwOwogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG4pOwoKICAgICAgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDEpOwogICAgICB3aGlsZSAoKytpbmRleCA8IG4pIHsKICAgICAgICByZXN1bHRbaW5kZXhdID0gY2FsbGJhY2soaW5kZXgpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgIHRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBIVE1MIGVudGl0aWVzCiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvIHRoZWlyCiAgICAgKiBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB1bmVzY2FwZS4KICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8udW5lc2NhcGUoJ0ZyZWQsIEJhcm5leSAmYW1wOyBQZWJibGVzJyk7CiAgICAgKiAvLyA9PiAnRnJlZCwgQmFybmV5ICYgUGViYmxlcycKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKSB7CiAgICAgIHJldHVybiBzdHJpbmcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHN0cmluZykucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgcHJvdmlkZWQgdGhlIElEIHdpbGwgYmUgYXBwZW5kZWQgdG8gaXQuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4XSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLgogICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpOwogICAgICogLy8gPT4gJ2NvbnRhY3RfMTA0JwogICAgICoKICAgICAqIF8udW5pcXVlSWQoKTsKICAgICAqIC8vID0+ICcxMDUnCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkgewogICAgICB2YXIgaWQgPSArK2lkQ291bnRlcjsKICAgICAgcmV0dXJuIFN0cmluZyhwcmVmaXggPT0gbnVsbCA/ICcnIDogcHJlZml4KSArIGlkOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB0aGF0IHdyYXBzIHRoZSBnaXZlbiB2YWx1ZSB3aXRoIGV4cGxpY2l0CiAgICAgKiBtZXRob2QgY2hhaW5pbmcgZW5hYmxlZC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IENoYWluaW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwogICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdlJzogMzYgfSwKICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sCiAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxIH0KICAgICAqIF07CiAgICAgKgogICAgICogdmFyIHlvdW5nZXN0ID0gXy5jaGFpbihjaGFyYWN0ZXJzKQogICAgICogICAgIC5zb3J0QnkoJ2FnZScpCiAgICAgKiAgICAgLm1hcChmdW5jdGlvbihjaHIpIHsgcmV0dXJuIGNoci5uYW1lICsgJyBpcyAnICsgY2hyLmFnZTsgfSkKICAgICAqICAgICAuZmlyc3QoKQogICAgICogICAgIC52YWx1ZSgpOwogICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMScKICAgICAqLwogICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHsKICAgICAgdmFsdWUgPSBuZXcgbG9kYXNoV3JhcHBlcih2YWx1ZSk7CiAgICAgIHZhbHVlLl9fY2hhaW5fXyA9IHRydWU7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEludm9rZXMgYGludGVyY2VwdG9yYCB3aXRoIHRoZSBgdmFsdWVgIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgdGhlbgogICAgICogcmV0dXJucyBgdmFsdWVgLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byAidGFwIGludG8iIGEgbWV0aG9kCiAgICAgKiBjaGFpbiBpbiBvcmRlciB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gaW50ZXJtZWRpYXRlIHJlc3VsdHMgd2l0aGluCiAgICAgKiB0aGUgY2hhaW4uCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8oWzEsIDIsIDMsIDRdKQogICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHsgYXJyYXkucG9wKCk7IH0pCiAgICAgKiAgLnJldmVyc2UoKQogICAgICogIC52YWx1ZSgpOwogICAgICogLy8gPT4gWzMsIDIsIDFdCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRhcCh2YWx1ZSwgaW50ZXJjZXB0b3IpIHsKICAgICAgaW50ZXJjZXB0b3IodmFsdWUpOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmFibGVzIGV4cGxpY2l0IG1ldGhvZCBjaGFpbmluZyBvbiB0aGUgd3JhcHBlciBvYmplY3QuCiAgICAgKgogICAgICogQG5hbWUgY2hhaW4KICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5pbmcKICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB3cmFwcGVyIG9iamVjdC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KICAgICAqIF07CiAgICAgKgogICAgICogLy8gd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZwogICAgICogXyhjaGFyYWN0ZXJzKS5maXJzdCgpOwogICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfQogICAgICoKICAgICAqIC8vIHdpdGggZXhwbGljaXQgY2hhaW5pbmcKICAgICAqIF8oY2hhcmFjdGVycykuY2hhaW4oKQogICAgICogICAuZmlyc3QoKQogICAgICogICAucGljaygnYWdlJykKICAgICAqICAgLnZhbHVlKCk7CiAgICAgKiAvLyA9PiB7ICdhZ2UnOiAzNiB9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdyYXBwZXJDaGFpbigpIHsKICAgICAgdGhpcy5fX2NoYWluX18gPSB0cnVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFByb2R1Y2VzIHRoZSBgdG9TdHJpbmdgIHJlc3VsdCBvZiB0aGUgd3JhcHBlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBAbmFtZSB0b1N0cmluZwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZwogICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nIHJlc3VsdC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXyhbMSwgMiwgM10pLnRvU3RyaW5nKCk7CiAgICAgKiAvLyA9PiAnMSwyLDMnCiAgICAgKi8KICAgIGZ1bmN0aW9uIHdyYXBwZXJUb1N0cmluZygpIHsKICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLl9fd3JhcHBlZF9fKTsKICAgIH0KCiAgICAvKioKICAgICAqIEV4dHJhY3RzIHRoZSB3cmFwcGVkIHZhbHVlLgogICAgICoKICAgICAqIEBuYW1lIHZhbHVlT2YKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAYWxpYXMgdmFsdWUKICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZwogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHdyYXBwZWQgdmFsdWUuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZU9mKCk7CiAgICAgKiAvLyA9PiBbMSwgMiwgM10KICAgICAqLwogICAgZnVuY3Rpb24gd3JhcHBlclZhbHVlT2YoKSB7CiAgICAgIHJldHVybiB0aGlzLl9fd3JhcHBlZF9fOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIC8vIGFkZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgd2hlbiBjaGFpbmluZwogICAgbG9kYXNoLmFmdGVyID0gYWZ0ZXI7CiAgICBsb2Rhc2guYXNzaWduID0gYXNzaWduOwogICAgbG9kYXNoLmF0ID0gYXQ7CiAgICBsb2Rhc2guYmluZCA9IGJpbmQ7CiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7CiAgICBsb2Rhc2guYmluZEtleSA9IGJpbmRLZXk7CiAgICBsb2Rhc2guY2hhaW4gPSBjaGFpbjsKICAgIGxvZGFzaC5jb21wYWN0ID0gY29tcGFjdDsKICAgIGxvZGFzaC5jb21wb3NlID0gY29tcG9zZTsKICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50OwogICAgbG9kYXNoLmNvdW50QnkgPSBjb3VudEJ5OwogICAgbG9kYXNoLmNyZWF0ZSA9IGNyZWF0ZTsKICAgIGxvZGFzaC5jcmVhdGVDYWxsYmFjayA9IGNyZWF0ZUNhbGxiYWNrOwogICAgbG9kYXNoLmN1cnJ5ID0gY3Vycnk7CiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTsKICAgIGxvZGFzaC5kZWZhdWx0cyA9IGRlZmF1bHRzOwogICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7CiAgICBsb2Rhc2guZGVsYXkgPSBkZWxheTsKICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTsKICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7CiAgICBsb2Rhc2guZmxhdHRlbiA9IGZsYXR0ZW47CiAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7CiAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0OwogICAgbG9kYXNoLmZvckluID0gZm9ySW47CiAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7CiAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duOwogICAgbG9kYXNoLmZvck93blJpZ2h0ID0gZm9yT3duUmlnaHQ7CiAgICBsb2Rhc2guZnVuY3Rpb25zID0gZnVuY3Rpb25zOwogICAgbG9kYXNoLmdyb3VwQnkgPSBncm91cEJ5OwogICAgbG9kYXNoLmluZGV4QnkgPSBpbmRleEJ5OwogICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsOwogICAgbG9kYXNoLmludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbjsKICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7CiAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlOwogICAgbG9kYXNoLmtleXMgPSBrZXlzOwogICAgbG9kYXNoLm1hcCA9IG1hcDsKICAgIGxvZGFzaC5tYXBWYWx1ZXMgPSBtYXBWYWx1ZXM7CiAgICBsb2Rhc2gubWF4ID0gbWF4OwogICAgbG9kYXNoLm1lbW9pemUgPSBtZW1vaXplOwogICAgbG9kYXNoLm1lcmdlID0gbWVyZ2U7CiAgICBsb2Rhc2gubWluID0gbWluOwogICAgbG9kYXNoLm9taXQgPSBvbWl0OwogICAgbG9kYXNoLm9uY2UgPSBvbmNlOwogICAgbG9kYXNoLnBhaXJzID0gcGFpcnM7CiAgICBsb2Rhc2gucGFydGlhbCA9IHBhcnRpYWw7CiAgICBsb2Rhc2gucGFydGlhbFJpZ2h0ID0gcGFydGlhbFJpZ2h0OwogICAgbG9kYXNoLnBpY2sgPSBwaWNrOwogICAgbG9kYXNoLnBsdWNrID0gcGx1Y2s7CiAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTsKICAgIGxvZGFzaC5wdWxsID0gcHVsbDsKICAgIGxvZGFzaC5yYW5nZSA9IHJhbmdlOwogICAgbG9kYXNoLnJlamVjdCA9IHJlamVjdDsKICAgIGxvZGFzaC5yZW1vdmUgPSByZW1vdmU7CiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7CiAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7CiAgICBsb2Rhc2guc29ydEJ5ID0gc29ydEJ5OwogICAgbG9kYXNoLnRhcCA9IHRhcDsKICAgIGxvZGFzaC50aHJvdHRsZSA9IHRocm90dGxlOwogICAgbG9kYXNoLnRpbWVzID0gdGltZXM7CiAgICBsb2Rhc2gudG9BcnJheSA9IHRvQXJyYXk7CiAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtOwogICAgbG9kYXNoLnVuaW9uID0gdW5pb247CiAgICBsb2Rhc2gudW5pcSA9IHVuaXE7CiAgICBsb2Rhc2gudmFsdWVzID0gdmFsdWVzOwogICAgbG9kYXNoLndoZXJlID0gd2hlcmU7CiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7CiAgICBsb2Rhc2gud3JhcCA9IHdyYXA7CiAgICBsb2Rhc2gueG9yID0geG9yOwogICAgbG9kYXNoLnppcCA9IHppcDsKICAgIGxvZGFzaC56aXBPYmplY3QgPSB6aXBPYmplY3Q7CgogICAgLy8gYWRkIGFsaWFzZXMKICAgIGxvZGFzaC5jb2xsZWN0ID0gbWFwOwogICAgbG9kYXNoLmRyb3AgPSByZXN0OwogICAgbG9kYXNoLmVhY2ggPSBmb3JFYWNoOwogICAgbG9kYXNoLmVhY2hSaWdodCA9IGZvckVhY2hSaWdodDsKICAgIGxvZGFzaC5leHRlbmQgPSBhc3NpZ247CiAgICBsb2Rhc2gubWV0aG9kcyA9IGZ1bmN0aW9uczsKICAgIGxvZGFzaC5vYmplY3QgPSB6aXBPYmplY3Q7CiAgICBsb2Rhc2guc2VsZWN0ID0gZmlsdGVyOwogICAgbG9kYXNoLnRhaWwgPSByZXN0OwogICAgbG9kYXNoLnVuaXF1ZSA9IHVuaXE7CiAgICBsb2Rhc2gudW56aXAgPSB6aXA7CgogICAgLy8gYWRkIGZ1bmN0aW9ucyB0byBgbG9kYXNoLnByb3RvdHlwZWAKICAgIG1peGluKGxvZGFzaCk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgLy8gYWRkIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB1bndyYXBwZWQgdmFsdWVzIHdoZW4gY2hhaW5pbmcKICAgIGxvZGFzaC5jbG9uZSA9IGNsb25lOwogICAgbG9kYXNoLmNsb25lRGVlcCA9IGNsb25lRGVlcDsKICAgIGxvZGFzaC5jb250YWlucyA9IGNvbnRhaW5zOwogICAgbG9kYXNoLmVzY2FwZSA9IGVzY2FwZTsKICAgIGxvZGFzaC5ldmVyeSA9IGV2ZXJ5OwogICAgbG9kYXNoLmZpbmQgPSBmaW5kOwogICAgbG9kYXNoLmZpbmRJbmRleCA9IGZpbmRJbmRleDsKICAgIGxvZGFzaC5maW5kS2V5ID0gZmluZEtleTsKICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0OwogICAgbG9kYXNoLmZpbmRMYXN0SW5kZXggPSBmaW5kTGFzdEluZGV4OwogICAgbG9kYXNoLmZpbmRMYXN0S2V5ID0gZmluZExhc3RLZXk7CiAgICBsb2Rhc2guaGFzID0gaGFzOwogICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7CiAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7CiAgICBsb2Rhc2guaXNBcmd1bWVudHMgPSBpc0FyZ3VtZW50czsKICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTsKICAgIGxvZGFzaC5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47CiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlOwogICAgbG9kYXNoLmlzRWxlbWVudCA9IGlzRWxlbWVudDsKICAgIGxvZGFzaC5pc0VtcHR5ID0gaXNFbXB0eTsKICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDsKICAgIGxvZGFzaC5pc0Zpbml0ZSA9IGlzRmluaXRlOwogICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uOwogICAgbG9kYXNoLmlzTmFOID0gaXNOYU47CiAgICBsb2Rhc2guaXNOdWxsID0gaXNOdWxsOwogICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7CiAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDsKICAgIGxvZGFzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDsKICAgIGxvZGFzaC5pc1JlZ0V4cCA9IGlzUmVnRXhwOwogICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7CiAgICBsb2Rhc2guaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDsKICAgIGxvZGFzaC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mOwogICAgbG9kYXNoLm1peGluID0gbWl4aW47CiAgICBsb2Rhc2gubm9Db25mbGljdCA9IG5vQ29uZmxpY3Q7CiAgICBsb2Rhc2gubm9vcCA9IG5vb3A7CiAgICBsb2Rhc2gubm93ID0gbm93OwogICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7CiAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tOwogICAgbG9kYXNoLnJlZHVjZSA9IHJlZHVjZTsKICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9IHJlZHVjZVJpZ2h0OwogICAgbG9kYXNoLnJlc3VsdCA9IHJlc3VsdDsKICAgIGxvZGFzaC5ydW5JbkNvbnRleHQgPSBydW5JbkNvbnRleHQ7CiAgICBsb2Rhc2guc2l6ZSA9IHNpemU7CiAgICBsb2Rhc2guc29tZSA9IHNvbWU7CiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDsKICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgbG9kYXNoLnVuZXNjYXBlID0gdW5lc2NhcGU7CiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDsKCiAgICAvLyBhZGQgYWxpYXNlcwogICAgbG9kYXNoLmFsbCA9IGV2ZXJ5OwogICAgbG9kYXNoLmFueSA9IHNvbWU7CiAgICBsb2Rhc2guZGV0ZWN0ID0gZmluZDsKICAgIGxvZGFzaC5maW5kV2hlcmUgPSBmaW5kOwogICAgbG9kYXNoLmZvbGRsID0gcmVkdWNlOwogICAgbG9kYXNoLmZvbGRyID0gcmVkdWNlUmlnaHQ7CiAgICBsb2Rhc2guaW5jbHVkZSA9IGNvbnRhaW5zOwogICAgbG9kYXNoLmluamVjdCA9IHJlZHVjZTsKCiAgICBtaXhpbihmdW5jdGlvbigpIHsKICAgICAgdmFyIHNvdXJjZSA9IHt9CiAgICAgIGZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHsKICAgICAgICBpZiAoIWxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHsKICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIHNvdXJjZTsKICAgIH0oKSwgZmFsc2UpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIC8vIGFkZCBmdW5jdGlvbnMgY2FwYWJsZSBvZiByZXR1cm5pbmcgd3JhcHBlZCBhbmQgdW53cmFwcGVkIHZhbHVlcyB3aGVuIGNoYWluaW5nCiAgICBsb2Rhc2guZmlyc3QgPSBmaXJzdDsKICAgIGxvZGFzaC5sYXN0ID0gbGFzdDsKICAgIGxvZGFzaC5zYW1wbGUgPSBzYW1wbGU7CgogICAgLy8gYWRkIGFsaWFzZXMKICAgIGxvZGFzaC50YWtlID0gZmlyc3Q7CiAgICBsb2Rhc2guaGVhZCA9IGZpcnN0OwoKICAgIGZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHsKICAgICAgdmFyIGNhbGxiYWNrYWJsZSA9IG1ldGhvZE5hbWUgIT09ICdzYW1wbGUnOwogICAgICBpZiAoIWxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHsKICAgICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdPSBmdW5jdGlvbihuLCBndWFyZCkgewogICAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sCiAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYyh0aGlzLl9fd3JhcHBlZF9fLCBuLCBndWFyZCk7CgogICAgICAgICAgcmV0dXJuICFjaGFpbkFsbCAmJiAobiA9PSBudWxsIHx8IChndWFyZCAmJiAhKGNhbGxiYWNrYWJsZSAmJiB0eXBlb2YgbiA9PSAnZnVuY3Rpb24nKSkpCiAgICAgICAgICAgID8gcmVzdWx0CiAgICAgICAgICAgIDogbmV3IGxvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7CiAgICAgICAgfTsKICAgICAgfQogICAgfSk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgLyoqCiAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEB0eXBlIHN0cmluZwogICAgICovCiAgICBsb2Rhc2guVkVSU0lPTiA9ICcyLjQuMSc7CgogICAgLy8gYWRkICJDaGFpbmluZyIgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyCiAgICBsb2Rhc2gucHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluOwogICAgbG9kYXNoLnByb3RvdHlwZS50b1N0cmluZyA9IHdyYXBwZXJUb1N0cmluZzsKICAgIGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWVPZjsKICAgIGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IHdyYXBwZXJWYWx1ZU9mOwoKICAgIC8vIGFkZCBgQXJyYXlgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB1bndyYXBwZWQgdmFsdWVzCiAgICBmb3JFYWNoKFsnam9pbicsICdwb3AnLCAnc2hpZnQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkgewogICAgICB2YXIgZnVuYyA9IGFycmF5UmVmW21ldGhvZE5hbWVdOwogICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sCiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcy5fX3dyYXBwZWRfXywgYXJndW1lbnRzKTsKCiAgICAgICAgcmV0dXJuIGNoYWluQWxsCiAgICAgICAgICA/IG5ldyBsb2Rhc2hXcmFwcGVyKHJlc3VsdCwgY2hhaW5BbGwpCiAgICAgICAgICA6IHJlc3VsdDsKICAgICAgfTsKICAgIH0pOwoKICAgIC8vIGFkZCBgQXJyYXlgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB0aGUgZXhpc3Rpbmcgd3JhcHBlZCB2YWx1ZQogICAgZm9yRWFjaChbJ3B1c2gnLCAncmV2ZXJzZScsICdzb3J0JywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkgewogICAgICB2YXIgZnVuYyA9IGFycmF5UmVmW21ldGhvZE5hbWVdOwogICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuYy5hcHBseSh0aGlzLl9fd3JhcHBlZF9fLCBhcmd1bWVudHMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9OwogICAgfSk7CgogICAgLy8gYWRkIGBBcnJheWAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG5ldyB3cmFwcGVkIHZhbHVlcwogICAgZm9yRWFjaChbJ2NvbmNhdCcsICdzbGljZScsICdzcGxpY2UnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkgewogICAgICB2YXIgZnVuYyA9IGFycmF5UmVmW21ldGhvZE5hbWVdOwogICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG5ldyBsb2Rhc2hXcmFwcGVyKGZ1bmMuYXBwbHkodGhpcy5fX3dyYXBwZWRfXywgYXJndW1lbnRzKSwgdGhpcy5fX2NoYWluX18pOwogICAgICB9OwogICAgfSk7CgogICAgcmV0dXJuIGxvZGFzaDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAvLyBleHBvc2UgTG8tRGFzaAogIHZhciBfID0gcnVuSW5Db250ZXh0KCk7CgogIC8vIHNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMgbGlrZSByLmpzIGNoZWNrIGZvciBjb25kaXRpb24gcGF0dGVybnMgbGlrZSB0aGUgZm9sbG93aW5nOgogIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkgewogICAgLy8gRXhwb3NlIExvLURhc2ggdG8gdGhlIGdsb2JhbCBvYmplY3QgZXZlbiB3aGVuIGFuIEFNRCBsb2FkZXIgaXMgcHJlc2VudCBpbgogICAgLy8gY2FzZSBMby1EYXNoIGlzIGxvYWRlZCB3aXRoIGEgUmVxdWlyZUpTIHNoaW0gY29uZmlnLgogICAgLy8gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvYXBpLmh0bWwjY29uZmlnLXNoaW0KICAgIHJvb3QuXyA9IF87CgogICAgLy8gZGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmUKICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlICJ1bmRlcnNjb3JlIiBtb2R1bGUKICAgIGRlZmluZShmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIF87CiAgICB9KTsKICB9CiAgLy8gY2hlY2sgZm9yIGBleHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgYW4gYGV4cG9ydHNgIG9iamVjdAogIGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHsKICAgIC8vIGluIE5vZGUuanMgb3IgUmluZ29KUwogICAgaWYgKG1vZHVsZUV4cG9ydHMpIHsKICAgICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfOwogICAgfQogICAgLy8gaW4gTmFyd2hhbCBvciBSaGlubyAtcmVxdWlyZQogICAgZWxzZSB7CiAgICAgIGZyZWVFeHBvcnRzLl8gPSBfOwogICAgfQogIH0KICBlbHNlIHsKICAgIC8vIGluIGEgYnJvd3NlciBvciBSaGlubwogICAgcm9vdC5fID0gXzsKICB9Cn0uY2FsbCh0aGlzKSk7Cg==')
},
{
'name': '/app/lib/js/notify.min.js', 'data': base64.b64decode(b'LyoqIE5vdGlmeS5qcyAtIHYwLjMuMSAtIDIwMTQvMDYvMjkKICogaHR0cDovL25vdGlmeWpzLmNvbS8KICogQ29weXJpZ2h0IChjKSAyMDE0IEphaW1lIFBpbGxvcmEgLSBNSVQKICovCihmdW5jdGlvbih0LGksbixlKXsidXNlIHN0cmljdCI7dmFyIHIsbyxzLGEsbCxoLGMscCx1LGQsZixBLG0sdyxnLHksYix2LHgsQyxTLEUsTSxrLEgsRCxGLFQ9W10uaW5kZXhPZnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBpPTAsbj10aGlzLmxlbmd0aDtuPmk7aSsrKWlmKGkgaW4gdGhpcyYmdGhpc1tpXT09PXQpcmV0dXJuIGk7cmV0dXJuLTF9O1M9Im5vdGlmeSIsQz1TKyJqcyIscz1TKyIhYmxhbmsiLE09e3Q6InRvcCIsbToibWlkZGxlIixiOiJib3R0b20iLGw6ImxlZnQiLGM6ImNlbnRlciIscjoicmlnaHQifSxtPVsibCIsImMiLCJyIl0sRj1bInQiLCJtIiwiYiJdLGI9WyJ0IiwiYiIsImwiLCJyIl0sdj17dDoiYiIsbTpudWxsLGI6InQiLGw6InIiLGM6bnVsbCxyOiJsIn0seD1mdW5jdGlvbih0KXt2YXIgaTtyZXR1cm4gaT1bXSxuLmVhY2godC5zcGxpdCgvXFcrLyksZnVuY3Rpb24odCxuKXt2YXIgcjtyZXR1cm4gcj1uLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApLE1bcl0/aS5wdXNoKHIpOmV9KSxpfSxEPXt9LGE9e25hbWU6ImNvcmUiLGh0bWw6JzxkaXYgY2xhc3M9IicrQysnLXdyYXBwZXIiPlxuICA8ZGl2IGNsYXNzPSInK0MrJy1hcnJvdyI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9IicrQysnLWNvbnRhaW5lciI+PC9kaXY+XG48L2Rpdj4nLGNzczoiLiIrQysiLWNvcm5lciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbWFyZ2luOiA1cHg7XG4gIHotaW5kZXg6IDEwNTA7XG59XG5cbi4iK0MrIi1jb3JuZXIgLiIrQysiLXdyYXBwZXIsXG4uIitDKyItY29ybmVyIC4iK0MrIi1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG4gIHdpZHRoOiBpbmhlcml0O1xuICBtYXJnaW46IDNweDtcbn1cblxuLiIrQysiLXdyYXBwZXIge1xuICB6LWluZGV4OiAxO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAwO1xuICB3aWR0aDogMDtcbn1cblxuLiIrQysiLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHotaW5kZXg6IDE7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLiIrQysiLWhpZGFibGUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbltkYXRhLW5vdGlmeS10ZXh0XSxbZGF0YS1ub3RpZnktaHRtbF0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi4iK0MrIi1hcnJvdyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgd2lkdGg6IDA7XG4gIGhlaWdodDogMDtcbn0ifSxIPXsiYm9yZGVyLXJhZGl1cyI6WyItd2Via2l0LSIsIi1tb3otIl19LGY9ZnVuY3Rpb24odCl7cmV0dXJuIERbdF19LG89ZnVuY3Rpb24oaSxlKXt2YXIgcixvLHMsYTtpZighaSl0aHJvdyJNaXNzaW5nIFN0eWxlIG5hbWUiO2lmKCFlKXRocm93Ik1pc3NpbmcgU3R5bGUgZGVmaW5pdGlvbiI7aWYoIWUuaHRtbCl0aHJvdyJNaXNzaW5nIFN0eWxlIEhUTUwiO3JldHVybihudWxsIT0oYT1EW2ldKT9hLmNzc0VsZW06dm9pZCAwKSYmKHQuY29uc29sZSYmY29uc29sZS53YXJuKCIiK1MrIjogb3ZlcndyaXRpbmcgc3R5bGUgJyIraSsiJyIpLERbaV0uY3NzRWxlbS5yZW1vdmUoKSksZS5uYW1lPWksRFtpXT1lLHI9IiIsZS5jbGFzc2VzJiZuLmVhY2goZS5jbGFzc2VzLGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHIrPSIuIitDKyItIitlLm5hbWUrIi0iK3QrIiB7XG4iLG4uZWFjaChpLGZ1bmN0aW9uKHQsaSl7cmV0dXJuIEhbdF0mJm4uZWFjaChIW3RdLGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHIrPSIgICIrZSt0KyI6ICIraSsiO1xuIn0pLHIrPSIgICIrdCsiOiAiK2krIjtcbiJ9KSxyKz0ifVxuIn0pLGUuY3NzJiYocis9Ii8qIHN0eWxlcyBmb3IgIitlLm5hbWUrIiAqL1xuIitlLmNzcyksciYmKGUuY3NzRWxlbT15KHIpLGUuY3NzRWxlbS5hdHRyKCJpZCIsIm5vdGlmeS0iK2UubmFtZSkpLHM9e30sbz1uKGUuaHRtbCksdSgiaHRtbCIsbyxzKSx1KCJ0ZXh0IixvLHMpLGUuZmllbGRzPXN9LHk9ZnVuY3Rpb24odCl7dmFyIGk7aT1sKCJzdHlsZSIpLGkuYXR0cigidHlwZSIsInRleHQvY3NzIiksbigiaGVhZCIpLmFwcGVuZChpKTt0cnl7aS5odG1sKHQpfWNhdGNoKGUpe2lbMF0uc3R5bGVTaGVldC5jc3NUZXh0PXR9cmV0dXJuIGl9LHU9ZnVuY3Rpb24odCxpLGUpe3ZhciByO3JldHVybiJodG1sIiE9PXQmJih0PSJ0ZXh0Iikscj0iZGF0YS1ub3RpZnktIit0LHAoaSwiWyIrcisiXSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgaTtyZXR1cm4gaT1uKHRoaXMpLmF0dHIociksaXx8KGk9cyksZVtpXT10fSl9LHA9ZnVuY3Rpb24odCxpKXtyZXR1cm4gdC5pcyhpKT90OnQuZmluZChpKX0sRT17Y2xpY2tUb0hpZGU6ITAsYXV0b0hpZGU6ITAsYXV0b0hpZGVEZWxheTo1ZTMsYXJyb3dTaG93OiEwLGFycm93U2l6ZTo1LGJyZWFrTmV3TGluZXM6ITAsZWxlbWVudFBvc2l0aW9uOiJib3R0b20iLGdsb2JhbFBvc2l0aW9uOiJ0b3AgcmlnaHQiLHN0eWxlOiJib290c3RyYXAiLGNsYXNzTmFtZToiZXJyb3IiLHNob3dBbmltYXRpb246InNsaWRlRG93biIsc2hvd0R1cmF0aW9uOjQwMCxoaWRlQW5pbWF0aW9uOiJzbGlkZVVwIixoaWRlRHVyYXRpb246MjAwLGdhcDo1fSxnPWZ1bmN0aW9uKHQsaSl7dmFyIGU7cmV0dXJuIGU9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlPXQsbi5leHRlbmQoITAsbmV3IGUsaSl9LGg9ZnVuY3Rpb24odCl7cmV0dXJuIG4uZXh0ZW5kKEUsdCl9LGw9ZnVuY3Rpb24odCl7cmV0dXJuIG4oIjwiK3QrIj48LyIrdCsiPiIpfSxBPXt9LGQ9ZnVuY3Rpb24odCl7dmFyIGk7cmV0dXJuIHQuaXMoIlt0eXBlPXJhZGlvXSIpJiYoaT10LnBhcmVudHMoImZvcm06Zmlyc3QiKS5maW5kKCJbdHlwZT1yYWRpb10iKS5maWx0ZXIoZnVuY3Rpb24oaSxlKXtyZXR1cm4gbihlKS5hdHRyKCJuYW1lIik9PT10LmF0dHIoIm5hbWUiKX0pLHQ9aS5maXJzdCgpKSx0fSx3PWZ1bmN0aW9uKHQsaSxuKXt2YXIgcixvO2lmKCJzdHJpbmciPT10eXBlb2YgbiluPXBhcnNlSW50KG4sMTApO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiBuKXJldHVybjtpZighaXNOYU4obikpcmV0dXJuIHI9TVt2W2kuY2hhckF0KDApXV0sbz1pLHRbcl0hPT1lJiYoaT1NW3IuY2hhckF0KDApXSxuPS1uKSx0W2ldPT09ZT90W2ldPW46dFtpXSs9bixudWxsfSxrPWZ1bmN0aW9uKHQsaSxuKXtpZigibCI9PT10fHwidCI9PT10KXJldHVybiAwO2lmKCJjIj09PXR8fCJtIj09PXQpcmV0dXJuIG4vMi1pLzI7aWYoInIiPT09dHx8ImIiPT09dClyZXR1cm4gbi1pO3Rocm93IkludmFsaWQgYWxpZ25tZW50In0sYz1mdW5jdGlvbih0KXtyZXR1cm4gYy5lPWMuZXx8bCgiZGl2IiksYy5lLnRleHQodCkuaHRtbCgpfSxyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGksZSl7InN0cmluZyI9PXR5cGVvZiBlJiYoZT17Y2xhc3NOYW1lOmV9KSx0aGlzLm9wdGlvbnM9ZyhFLG4uaXNQbGFpbk9iamVjdChlKT9lOnt9KSx0aGlzLmxvYWRIVE1MKCksdGhpcy53cmFwcGVyPW4oYS5odG1sKSx0aGlzLm9wdGlvbnMuY2xpY2tUb0hpZGUmJnRoaXMud3JhcHBlci5hZGRDbGFzcygiIitDKyItaGlkYWJsZSIpLHRoaXMud3JhcHBlci5kYXRhKEMsdGhpcyksdGhpcy5hcnJvdz10aGlzLndyYXBwZXIuZmluZCgiLiIrQysiLWFycm93IiksdGhpcy5jb250YWluZXI9dGhpcy53cmFwcGVyLmZpbmQoIi4iK0MrIi1jb250YWluZXIiKSx0aGlzLmNvbnRhaW5lci5hcHBlbmQodGhpcy51c2VyQ29udGFpbmVyKSx0JiZ0Lmxlbmd0aCYmKHRoaXMuZWxlbWVudFR5cGU9dC5hdHRyKCJ0eXBlIiksdGhpcy5vcmlnaW5hbEVsZW1lbnQ9dCx0aGlzLmVsZW09ZCh0KSx0aGlzLmVsZW0uZGF0YShDLHRoaXMpLHRoaXMuZWxlbS5iZWZvcmUodGhpcy53cmFwcGVyKSksdGhpcy5jb250YWluZXIuaGlkZSgpLHRoaXMucnVuKGkpfXJldHVybiB0LnByb3RvdHlwZS5sb2FkSFRNTD1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PXRoaXMuZ2V0U3R5bGUoKSx0aGlzLnVzZXJDb250YWluZXI9bih0Lmh0bWwpLHRoaXMudXNlckZpZWxkcz10LmZpZWxkc30sdC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbih0LGkpe3ZhciBuLHIsbyxzLGEsbD10aGlzO2lmKHI9ZnVuY3Rpb24oKXtyZXR1cm4gdHx8bC5lbGVtfHxsLmRlc3Ryb3koKSxpP2koKTplfSxhPXRoaXMuY29udGFpbmVyLnBhcmVudCgpLnBhcmVudHMoIjpoaWRkZW4iKS5sZW5ndGg+MCxvPXRoaXMuY29udGFpbmVyLmFkZCh0aGlzLmFycm93KSxuPVtdLGEmJnQpcz0ic2hvdyI7ZWxzZSBpZihhJiYhdClzPSJoaWRlIjtlbHNlIGlmKCFhJiZ0KXM9dGhpcy5vcHRpb25zLnNob3dBbmltYXRpb24sbi5wdXNoKHRoaXMub3B0aW9ucy5zaG93RHVyYXRpb24pO2Vsc2V7aWYoYXx8dClyZXR1cm4gcigpO3M9dGhpcy5vcHRpb25zLmhpZGVBbmltYXRpb24sbi5wdXNoKHRoaXMub3B0aW9ucy5oaWRlRHVyYXRpb24pfXJldHVybiBuLnB1c2gociksb1tzXS5hcHBseShvLG4pfSx0LnByb3RvdHlwZS5zZXRHbG9iYWxQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciB0LGksZSxyLG8scyxhLGg7cmV0dXJuIGg9dGhpcy5nZXRQb3NpdGlvbigpLGE9aFswXSxzPWhbMV0sbz1NW2FdLHQ9TVtzXSxyPWErInwiK3MsaT1BW3JdLGl8fChpPUFbcl09bCgiZGl2IiksZT17fSxlW29dPTAsIm1pZGRsZSI9PT10P2UudG9wPSI0NSUiOiJjZW50ZXIiPT09dD9lLmxlZnQ9IjQ1JSI6ZVt0XT0wLGkuY3NzKGUpLmFkZENsYXNzKCIiK0MrIi1jb3JuZXIiKSxuKCJib2R5IikuYXBwZW5kKGkpKSxpLnByZXBlbmQodGhpcy53cmFwcGVyKX0sdC5wcm90b3R5cGUuc2V0RWxlbWVudFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHQsaSxyLG8scyxhLGwsaCxjLHAsdSxkLGYsQSxnLHkseCxDLFMsRSxILEQseixRLEIsUixOLFAsVTtmb3Ioej10aGlzLmdldFBvc2l0aW9uKCksRT16WzBdLEM9elsxXSxTPXpbMl0sdT10aGlzLmVsZW0ucG9zaXRpb24oKSxoPXRoaXMuZWxlbS5vdXRlckhlaWdodCgpLGQ9dGhpcy5lbGVtLm91dGVyV2lkdGgoKSxjPXRoaXMuZWxlbS5pbm5lckhlaWdodCgpLHA9dGhpcy5lbGVtLmlubmVyV2lkdGgoKSxRPXRoaXMud3JhcHBlci5wb3NpdGlvbigpLHM9dGhpcy5jb250YWluZXIuaGVpZ2h0KCksYT10aGlzLmNvbnRhaW5lci53aWR0aCgpLEE9TVtFXSx5PXZbRV0seD1NW3ldLGw9e30sbFt4XT0iYiI9PT1FP2g6InIiPT09RT9kOjAsdyhsLCJ0b3AiLHUudG9wLVEudG9wKSx3KGwsImxlZnQiLHUubGVmdC1RLmxlZnQpLFU9WyJ0b3AiLCJsZWZ0Il0sQj0wLE49VS5sZW5ndGg7Tj5CO0IrKylIPVVbQl0sZz1wYXJzZUludCh0aGlzLmVsZW0uY3NzKCJtYXJnaW4tIitIKSwxMCksZyYmdyhsLEgsZyk7aWYoZj1NYXRoLm1heCgwLHRoaXMub3B0aW9ucy5nYXAtKHRoaXMub3B0aW9ucy5hcnJvd1Nob3c/cjowKSksdyhsLHgsZiksdGhpcy5vcHRpb25zLmFycm93U2hvdyl7Zm9yKHI9dGhpcy5vcHRpb25zLmFycm93U2l6ZSxpPW4uZXh0ZW5kKHt9LGwpLHQ9dGhpcy51c2VyQ29udGFpbmVyLmNzcygiYm9yZGVyLWNvbG9yIil8fHRoaXMudXNlckNvbnRhaW5lci5jc3MoImJhY2tncm91bmQtY29sb3IiKXx8IndoaXRlIixSPTAsUD1iLmxlbmd0aDtQPlI7UisrKUg9YltSXSxEPU1bSF0sSCE9PXkmJihvPUQ9PT1BP3Q6InRyYW5zcGFyZW50IixpWyJib3JkZXItIitEXT0iIityKyJweCBzb2xpZCAiK28pO3cobCxNW3ldLHIpLFQuY2FsbChiLEMpPj0wJiZ3KGksTVtDXSwyKnIpfWVsc2UgdGhpcy5hcnJvdy5oaWRlKCk7cmV0dXJuIFQuY2FsbChGLEUpPj0wPyh3KGwsImxlZnQiLGsoQyxhLGQpKSxpJiZ3KGksImxlZnQiLGsoQyxyLHApKSk6VC5jYWxsKG0sRSk+PTAmJih3KGwsInRvcCIsayhDLHMsaCkpLGkmJncoaSwidG9wIixrKEMscixjKSkpLHRoaXMuY29udGFpbmVyLmlzKCI6dmlzaWJsZSIpJiYobC5kaXNwbGF5PSJibG9jayIpLHRoaXMuY29udGFpbmVyLnJlbW92ZUF0dHIoInN0eWxlIikuY3NzKGwpLGk/dGhpcy5hcnJvdy5yZW1vdmVBdHRyKCJzdHlsZSIpLmNzcyhpKTplfSx0LnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciB0LGksbixlLHIsbyxzLGE7aWYoaT10aGlzLm9wdGlvbnMucG9zaXRpb258fCh0aGlzLmVsZW0/dGhpcy5vcHRpb25zLmVsZW1lbnRQb3NpdGlvbjp0aGlzLm9wdGlvbnMuZ2xvYmFsUG9zaXRpb24pLHQ9eChpKSwwPT09dC5sZW5ndGgmJih0WzBdPSJiIiksbj10WzBdLDA+VC5jYWxsKGIsbikpdGhyb3ciTXVzdCBiZSBvbmUgb2YgWyIrYisiXSI7cmV0dXJuKDE9PT10Lmxlbmd0aHx8KGU9dFswXSxULmNhbGwoRixlKT49MCYmKHI9dFsxXSwwPlQuY2FsbChtLHIpKSl8fChvPXRbMF0sVC5jYWxsKG0sbyk+PTAmJihzPXRbMV0sMD5ULmNhbGwoRixzKSkpKSYmKHRbMV09KGE9dFswXSxULmNhbGwobSxhKT49MD8ibSI6ImwiKSksMj09PXQubGVuZ3RoJiYodFsyXT10WzFdKSx0fSx0LnByb3RvdHlwZS5nZXRTdHlsZT1mdW5jdGlvbih0KXt2YXIgaTtpZih0fHwodD10aGlzLm9wdGlvbnMuc3R5bGUpLHR8fCh0PSJkZWZhdWx0IiksaT1EW3RdLCFpKXRocm93Ik1pc3Npbmcgc3R5bGU6ICIrdDtyZXR1cm4gaX0sdC5wcm90b3R5cGUudXBkYXRlQ2xhc3Nlcz1mdW5jdGlvbigpe3ZhciB0LGk7cmV0dXJuIHQ9WyJiYXNlIl0sbi5pc0FycmF5KHRoaXMub3B0aW9ucy5jbGFzc05hbWUpP3Q9dC5jb25jYXQodGhpcy5vcHRpb25zLmNsYXNzTmFtZSk6dGhpcy5vcHRpb25zLmNsYXNzTmFtZSYmdC5wdXNoKHRoaXMub3B0aW9ucy5jbGFzc05hbWUpLGk9dGhpcy5nZXRTdHlsZSgpLHQ9bi5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4iIitDKyItIitpLm5hbWUrIi0iK3R9KS5qb2luKCIgIiksdGhpcy51c2VyQ29udGFpbmVyLmF0dHIoImNsYXNzIix0KX0sdC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQsaSl7dmFyIHIsbyxhLGwsaCx1PXRoaXM7aWYobi5pc1BsYWluT2JqZWN0KGkpP24uZXh0ZW5kKHRoaXMub3B0aW9ucyxpKToic3RyaW5nIj09PW4udHlwZShpKSYmKHRoaXMub3B0aW9ucy5jbGFzc05hbWU9aSksdGhpcy5jb250YWluZXImJiF0KXJldHVybiB0aGlzLnNob3coITEpLGU7aWYodGhpcy5jb250YWluZXJ8fHQpe289e30sbi5pc1BsYWluT2JqZWN0KHQpP289dDpvW3NdPXQ7Zm9yKGEgaW4gbylyPW9bYV0sbD10aGlzLnVzZXJGaWVsZHNbYV0sbCYmKCJ0ZXh0Ij09PWwmJihyPWMociksdGhpcy5vcHRpb25zLmJyZWFrTmV3TGluZXMmJihyPXIucmVwbGFjZSgvXG4vZywiPGJyLz4iKSkpLGg9YT09PXM/IiI6Ij0iK2EscCh0aGlzLnVzZXJDb250YWluZXIsIltkYXRhLW5vdGlmeS0iK2wraCsiXSIpLmh0bWwocikpO3JldHVybiB0aGlzLnVwZGF0ZUNsYXNzZXMoKSx0aGlzLmVsZW0/dGhpcy5zZXRFbGVtZW50UG9zaXRpb24oKTp0aGlzLnNldEdsb2JhbFBvc2l0aW9uKCksdGhpcy5zaG93KCEwKSx0aGlzLm9wdGlvbnMuYXV0b0hpZGU/KGNsZWFyVGltZW91dCh0aGlzLmF1dG9oaWRlVGltZXIpLHRoaXMuYXV0b2hpZGVUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHUuc2hvdyghMSl9LHRoaXMub3B0aW9ucy5hdXRvSGlkZURlbGF5KSk6ZX19LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53cmFwcGVyLnJlbW92ZSgpfSx0fSgpLG5bU109ZnVuY3Rpb24odCxpLGUpe3JldHVybiB0JiZ0Lm5vZGVOYW1lfHx0LmpxdWVyeT9uKHQpW1NdKGksZSk6KGU9aSxpPXQsbmV3IHIobnVsbCxpLGUpKSx0fSxuLmZuW1NdPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG4odGhpcykuZWFjaChmdW5jdGlvbigpe3ZhciBlO3JldHVybiBlPWQobih0aGlzKSkuZGF0YShDKSxlP2UucnVuKHQsaSk6bmV3IHIobih0aGlzKSx0LGkpfSksdGhpc30sbi5leHRlbmQobltTXSx7ZGVmYXVsdHM6aCxhZGRTdHlsZTpvLHBsdWdpbk9wdGlvbnM6RSxnZXRTdHlsZTpmLGluc2VydENTUzp5fSksbihmdW5jdGlvbigpe3JldHVybiB5KGEuY3NzKS5hdHRyKCJpZCIsImNvcmUtbm90aWZ5IiksbihpKS5vbigiY2xpY2siLCIuIitDKyItaGlkYWJsZSIsZnVuY3Rpb24oKXtyZXR1cm4gbih0aGlzKS50cmlnZ2VyKCJub3RpZnktaGlkZSIpfSksbihpKS5vbigibm90aWZ5LWhpZGUiLCIuIitDKyItd3JhcHBlciIsZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gbnVsbCE9KHQ9bih0aGlzKS5kYXRhKEMpKT90LnNob3coITEpOnZvaWQgMH0pfSl9KSh3aW5kb3csZG9jdW1lbnQsalF1ZXJ5KSwkLm5vdGlmeS5hZGRTdHlsZSgiYm9vdHN0cmFwIix7aHRtbDoiPGRpdj5cbjxzcGFuIGRhdGEtbm90aWZ5LXRleHQ+PC9zcGFuPlxuPC9kaXY+IixjbGFzc2VzOntiYXNlOnsiZm9udC13ZWlnaHQiOiJib2xkIixwYWRkaW5nOiI4cHggMTVweCA4cHggMTRweCIsInRleHQtc2hhZG93IjoiMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkiLCJiYWNrZ3JvdW5kLWNvbG9yIjoiI2ZjZjhlMyIsYm9yZGVyOiIxcHggc29saWQgI2ZiZWVkNSIsImJvcmRlci1yYWRpdXMiOiI0cHgiLCJ3aGl0ZS1zcGFjZSI6Im5vd3JhcCIsInBhZGRpbmctbGVmdCI6IjI1cHgiLCJiYWNrZ3JvdW5kLXJlcGVhdCI6Im5vLXJlcGVhdCIsImJhY2tncm91bmQtcG9zaXRpb24iOiIzcHggN3B4In0sZXJyb3I6e2NvbG9yOiIjQjk0QTQ4IiwiYmFja2dyb3VuZC1jb2xvciI6IiNGMkRFREUiLCJib3JkZXItY29sb3IiOiIjRUVEM0Q3IiwiYmFja2dyb3VuZC1pbWFnZSI6InVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJRQUFBQVVDQVlBQUFDTmlSME5BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXRSSlJFRlVlTnFrVmMxdTAwQVFIcStkT0QrMHBvSVFma0lqYWxXMFNFR3FSTXVSbkhvczNEandBSDBBcmx5UWVBTk9PU01lQUE1Vmp5QnhLQlFoZ1NwVlVLS1FOR2xvRmR3NGNXdzJqdGZNT25hNkpPVUFyRFRhelhpL2IzZG01NXNvY1BxUWhGa2ErK2FIQnNJOEdzb3BSSkVSTkZsWTg4RkNFazlZaXdmOFJoZ1J5YUhGUXBQSENEbVpHNW9YMnVpMnlpbGtjVFQxQWNEc2JZQzFOTUF5T2k3elRYMkFneDdBOWx1QWw4OEJhdWlpUS9jSmFaUWZJcEFsbmdEY3ZaWk1ybDh2RlBLNStYa3RyV2x4My9laFo1cjkrdDZlK1dWbnAxcHhuTklqZ0JlNC82ZEF5c1FjOGRzbUh3UGNXOUMwaDNmVzFoYW5zMWx0d0poeTBHeEs3WFpiVWxNcDVXdzJleWFuNitmdC9mMkZBcVhHSzRDdlFrNUh1ZUZ6N0Q2R09adElySytzcnVwZHgxR1JCQnFOQnR6YzJBaU1yN25QcGxSZEtoYjFxNnE2empGaHJrbEVGT1V1dG9RNTB4Y1g4NlpscWFacFFyZmJCZHUyUjYvRzE5elg2WFNnaDZSWDV1YnlIQ004bnFTSUQ2SUNyR2laakdZWXhvakVzaXc0UER3TVNMNVZLc0M4WWY0VlJZRnpNek1heHdqbEpTbEN5QVE5bDBDVzQ0UEJBRHpYaGU3eE1kaTlIdFRyZFlqRllrRFFMMGNuNFhkcTIvRUFFK0luQ252QURUZjJlYWg0U3g5dkV4UWprcVhUNmFBRVJJQ01ld2QvVUFwL0llWUFOTTJqb3h0K3E1VkkraWVxMmkwV2czbDZETnpId1RFUlBnbzFrbzdYQlhqM3ZkbHNUMkYrVXVoSWhZa3A3dTdDYXJrY3JGT0N0UjNINUppd2JBSWVJbWpUL1lRS0tCdEdqUkZDVTVJVWdGUmU3ZkY0Y0NOVklQTVlvM1ZLcXh3anlOQVhOZXB1b3B5cW5sZDYwMnFWc2ZScEVra3orR0ZMMXdQajZ5U1hCcEp0V1ZhNXhsaHBjeWhCTndwWkhtdFg4QUdnZklFeG8wWnB6a1dWVEJHaVhDU0VhSGg2Mi9Qb1IwcC92SGFjenhYR25qNGJTbytHNzhsRUxVODBoMXVvZ0J3V0xmNVlsc1BtZ0RFZDRNMjM2eGptKzhubTRJdUUvOXUrL1BIMkpYWmZid3o0encxV2JPK1NRUHBYZndHL0JCZ0FoQ05aaVNiL3BPUUFBQUFBU1VWT1JLNUNZSUk9KSJ9LHN1Y2Nlc3M6e2NvbG9yOiIjNDY4ODQ3IiwiYmFja2dyb3VuZC1jb2xvciI6IiNERkYwRDgiLCJib3JkZXItY29sb3IiOiIjRDZFOUM2IiwiYmFja2dyb3VuZC1pbWFnZSI6InVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJRQUFBQVVDQVlBQUFDTmlSME5BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXV0SlJFRlVlTnEwbGN0UEUwRWN4Mzh6dS9SRlMxRXJ5cXRnSkZBMDhZQ2lNWklBUVE0ZVJHOGVER2RQSmlZZVRJd0hUZndQaUFjdlhJd1hMd29YUGFEeGtXZ1E2aXNsS2xKTFNRV0xVcmFQTFR2N0dtZTMyem9GOUtTVGZMTzd2NTN2WjNkL003L2ZJdGgrSU82SU50Mmpqb0E3YmpIQ0pvQWx6Q1J3NTlZd0hZakJuZk1QcUFLV1FZS2pHa2ZDSnFBRjB4d1pqaXBRdEEzTXhlU0c4N1ZoT09ZZWdWclVDeTdVWk05UzZUTElkQWFteVNUY2xaZFloRmhSSGxvR1lnN21nWnYxWnp6dHZndWQ3VjF0YlEydHdZQTM0TEptRjRwNWRYRjFLVHVmbkUrU3hlSnR1Q1pOc0xEQ1FVMCtSeUtURjI3VW53MTAxbDhlNmhuczN1MFBCYWxPUlZWVmtjYUVLQkpEZ1YzK2NHTTR0S0ttSStvaGxJR255Z0tYMDByU0Jmc3p6L24ydVh2ODF3ZDYrcnQxb3JzWkNIUmRyMUltazJGMktvYjNodXRTeFc4dGhzZDhBWE5hbG45RDdDVGZBNk8rMFVna011d1Z2RUZGVWJiQWNya2NUQTgrQXRPazhFNktpUWlEbU1GU0RxWkl0QXpFVlF2aVJrZERkYUZnUHA4SFNaS0FFQUw1UWg3U3EybElKQkp3djJzY1Vxa1VuS29aZ05oY0RLaEtnNWFIKzFJa2NvdUNBZEZHQVFzdVdaWWhPandGSFE5Nm9hZ1dnUm9Vb3YxVDlrUkJFT0RBd3hNMlF0RVVsK1dwK0xuOVZSbzZCY013NEVySFJZakg0L0IyNkFsUW9RUVRSZEhXd2NkOUFINTcrVUFYZGR2REQzN0RtckJCVjM0V2ZxaVhQbDYxZyt2cjZ4QTl6c0dlTTlnT2RzTlhrZ3BFdFR3VnZ3T2tsWExLbTYrL3A1ZXp3azRCK2o2ZHJvQnMyQ3NHYS9nTnM2Ukl4YXpsNFRjMjVtcFRndy9hcFBSMUxZbE5SRkF6Z3NPeGt5WFlMSU0xVjhOTXd5QWtKU2N0RDFlR1ZLaXE1d1dqU1Bkam1lVGtpS3ZWVzRmMllQSFdsM0dBVnE2eW1jeUNUZ292TTNGenlSaURlMlRhS2NFS3NMcEp2TkhqWmdQTnFFdHlpNm1aSW00U1JGeUxNVXNPTlNTZGtQZUZ0WTFuMG1jem9ZM0JIVExod1BSeTkvbHpjemlDdzlBQ0kreXFsMFZMemNHQVpiWVNNNUNDU1pnMS85b2Mvbm43K2k4TjlwLzhBbjRKTUFEeGhIK3hIZnVpS3dBQUFBQkpSVTVFcmtKZ2dnPT0pIn0saW5mbzp7Y29sb3I6IiMzQTg3QUQiLCJiYWNrZ3JvdW5kLWNvbG9yIjoiI0Q5RURGNyIsImJvcmRlci1jb2xvciI6IiNCQ0U4RjEiLCJiYWNrZ3JvdW5kLWltYWdlIjoidXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQlFBQUFBVUNBWUFBQUNOaVIwTkFBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUgzUVlGQWhrU3NkZXMvUUFBQThkSlJFRlVPTXZWbEd0TVcyVVl4Ly9QT2FXSFhnNmxMYVcweXBBdHcxVUNnYm5pTk9MY1ZPTG1Bakhab2xPWWx4bVRHWFZaZEFuUmZYUW0rN1NvVTRtWGFPYWlac0VwQzlGa2lRczZaNmJkQ25OWXJ1TTZLTkJ3NllXZXd6bDl6K3NISW1FV3Yrdno3WG1UOTVmLyszLys3d1A4MTR2K2VmRE9WMy9Tb1gzbEhBQSs2T0RlVUZmTWZqT1dNQURnZGsrZUVLejBwRjdhUWRNQWNPS0xManJjVk1WWDN4ZFdOMjkvR2hZUDdTdm5QMGNXZlM4Y2FTa2ZIWnNQRTlGZ250MDJKTnV0UTBRWUhCMmREejkvcEtYOFFqanVPOXhVeGQvNjZIZHhUZUNIWjNyb2pRT2JHUUJjdU5qZnBsa0QzYjE5WS82TXJpbVNhS2dTTW1wR1U1V2V2bUUvc3dhNk95NzN0UUhBMFJkcjJNbXYvNkExbjl3OXN1UTcwOTdaOWxNNEZsVGdURHJ6WlR1NFN0WFZmcGlJNDhyVmNVRE01Y21Fa3NyRm5IeGZwVHRVLzNCRlF6Q1FGLzJiWVZvTmJIN3ptSXRiU29NajQwSlN6bU15WDVxRHZyaUE3UWRySUlwQSszY2RzTXB1MG5YSThjVjBNdEtYQ1BaZXYrZ0NFTTFTMk5IUHZXZlAvaEwrN0ZTcjMrMHA1UkJFeWhFTjVKQ0tZcjhYbkFTTVQweEJOeXpRR1FlSThmanNHRDM5Uk1QazdzZTJiZDVadFR5b0ZZWGZ0RjZ5MzdneDdOZVV0SkpPVEZsQUhEWkxEdUlMVTNqMytINW9PckQzeVdiSXp0dWdhQXpnbkJLSnVCTHBHZlFyUzh3TzRGWmdWK2MxSXhhTGdXVlUwdE1MRUVUQ29zNHhNekVJdjljSlhRY3lhZ0l3aWdER3dKZ09BdEhBd0FoaXNRVWp5ME9SR0VSaUVMZ0c0aWFra3pvNE1ZQXhjTTVoQU1pMVdXRzF5WUNKSWNNVWFCa1ZSTGRHZVNVMjk5NVRMV3pjVUF6T05KN0o2RkJWQllJZ2dNem1GYnZkQlY0NENvcmc4dmpoekMrRUpFbDhVMWtKdGdZcmhDemdjL3Z2VHdYS1NpYjFwYVJGVlJWT1JEQUpBc3c1RnVUYUpFaFdNMlNIQjNtT0FsaGtOeHd1THplSnNHd3FXemY1VEZOZEtndFk1cUhwNlpGZjY3WS9zQVZhZENhVlk1WUFDRERiM09pNE5JakxuV013MlF0aENCSXNWaHNVVFU5dHZYc2plcTkrWDFkNzUvS0VzNExOT2ZjZGYvK0h0aE1udnd4T0Qwd21IYVhyN1pJdG4yd3VIMlNuQnpiWkFiUEp3cFB4K1ZRdXpjbTdkZ1JDQjU3YTF1QnpVRFJMNGJmbkkwUkUwZWFYZDlXODltcGpxSFpuVUk1SGgybDJka1paVWhPcXBpMnFTbXBPbVo2NFR1dTlxbHovU0VYbzZNRUhhM3dPaXA0NkYxbjc2MzNlZWtWOGRzOFd4am4zN1dsNjNWVmErZWo1b2VFWi84MlpCRVRKanBKMVJiaWoyRDNaLzF0clhVdkxzYmxDSzBYZk94MFNYMmtNc245ZFgrZCs3S2Y2aDhvNEFJeWt1ZmZqVDhMMjBMVSt3NEFaZDVWdkVQWStYcFdxTFYzMjdIUjdEelh1RG5EOHIrb3ZrQmVoSjhpK3k4WUFBQUFBU1VWT1JLNUNZSUk9KSJ9LHdhcm46e2NvbG9yOiIjQzA5ODUzIiwiYmFja2dyb3VuZC1jb2xvciI6IiNGQ0Y4RTMiLCJib3JkZXItY29sb3IiOiIjRkJFRUQ1IiwiYmFja2dyb3VuZC1pbWFnZSI6InVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJRQUFBQVVDQU1BQUFDNlYrMC9BQUFCSmxCTVZFWHI2ZWIvMm9EL3dpNy94anIvMG1QL3lrZi90UUQvdkJqLzNvNy91US8vdnlML3R3ZWJoZ0QvNHB6WDFLM3o4ZTM0OXZLNnRIQ2lsQ1diaVF5bW4wakd3b3JyNmRYUXphM0h4Y0trbjF2V3ZWLzV1UmZrNGRYWjFiRDE4Ky81MlllYmlBbXlyNVM5bWhDenJXcTV0NnVmalJINTRhTHMwb1MrcUQ3NTFYcVBoQXliaHdYc3VqRzNzbStaazBQVHdHNlNoZytQaGhPYmh3T1BnUUw0elYybmx5cmYyN3VMZmdDUGhSSHU3T21MZ0FhZmt5aVdrRDNsNDlpYmlBZlRzMEMrbGdDbml3RDRzZ0RKeHFPaWx6RFdvd1dGZkFIMDh1ZWJpZzZxcEZIQnZIL2F3MjZGZlFUUXpzdnk4T3lFZnoyMHIzakF2YUtiaGdHOXEwbmMyTGJaeFhhbm9VdS91NVdTZ2dDdHAxYW5wSktkbUZ6L3psWC8xbkdKaVltdXE1RHg3K3NBQUFEb1BVWlNBQUFBQVhSU1RsTUFRT2JZWmdBQUFBRmlTMGRFQUlnRkhVZ0FBQUFKY0VoWmN3QUFDeE1BQUFzVEFRQ2FuQmdBQUFBSGRFbE5SUWZkQmdVQkdoaDRhYWg1QUFBQWxrbEVRVlFZMDJOZ29CSUlFOEVVY3duMUZrSVhNMVRqNWREVVFoUFU1MDJNaTdYWFF4R3o1dVZJakdPSlVVVVc4MUhuWUV5TWkySFZjVU9JQ1Faek1NWW14ckV5TXlsSndnVXQ1QmxqV1JMam1KbTRwSTFoWXA1U1FMR1l4RGdtTG5aT1Z4dW9vQ2xJREtnWEtNYk41Z2dWMUFDTEpjYUJ4Tmdjb2lHQ0JpWndkV3hPRVRCRHJUeUVGZXkwallKNGVIak1HV2dFQUlwUkZSQ1V0MDhxQUFBQUFFbEZUa1N1UW1DQykifX19KTs=')
},
{
'name': '/app/lib/js/jquery-ui.js', 'data': base64.b64decode(b'LyohIGpRdWVyeSBVSSAtIHYxLjEwLjMgLSAyMDEzLTA1LTAzCiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBqcXVlcnkudWkuY29yZS5qcywganF1ZXJ5LnVpLndpZGdldC5qcywganF1ZXJ5LnVpLm1vdXNlLmpzLCBqcXVlcnkudWkuZHJhZ2dhYmxlLmpzLCBqcXVlcnkudWkuZHJvcHBhYmxlLmpzLCBqcXVlcnkudWkucmVzaXphYmxlLmpzLCBqcXVlcnkudWkuc2VsZWN0YWJsZS5qcywganF1ZXJ5LnVpLnNvcnRhYmxlLmpzLCBqcXVlcnkudWkuZWZmZWN0LmpzLCBqcXVlcnkudWkuYWNjb3JkaW9uLmpzLCBqcXVlcnkudWkuYXV0b2NvbXBsZXRlLmpzLCBqcXVlcnkudWkuYnV0dG9uLmpzLCBqcXVlcnkudWkuZGF0ZXBpY2tlci5qcywganF1ZXJ5LnVpLmRpYWxvZy5qcywganF1ZXJ5LnVpLmVmZmVjdC1ibGluZC5qcywganF1ZXJ5LnVpLmVmZmVjdC1ib3VuY2UuanMsIGpxdWVyeS51aS5lZmZlY3QtY2xpcC5qcywganF1ZXJ5LnVpLmVmZmVjdC1kcm9wLmpzLCBqcXVlcnkudWkuZWZmZWN0LWV4cGxvZGUuanMsIGpxdWVyeS51aS5lZmZlY3QtZmFkZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1mb2xkLmpzLCBqcXVlcnkudWkuZWZmZWN0LWhpZ2hsaWdodC5qcywganF1ZXJ5LnVpLmVmZmVjdC1wdWxzYXRlLmpzLCBqcXVlcnkudWkuZWZmZWN0LXNjYWxlLmpzLCBqcXVlcnkudWkuZWZmZWN0LXNoYWtlLmpzLCBqcXVlcnkudWkuZWZmZWN0LXNsaWRlLmpzLCBqcXVlcnkudWkuZWZmZWN0LXRyYW5zZmVyLmpzLCBqcXVlcnkudWkubWVudS5qcywganF1ZXJ5LnVpLnBvc2l0aW9uLmpzLCBqcXVlcnkudWkucHJvZ3Jlc3NiYXIuanMsIGpxdWVyeS51aS5zbGlkZXIuanMsIGpxdWVyeS51aS5zcGlubmVyLmpzLCBqcXVlcnkudWkudGFicy5qcywganF1ZXJ5LnVpLnRvb2x0aXAuanMKKiBDb3B5cmlnaHQgMjAxMyBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgdXVpZCA9IDAsCglydW5pcXVlSWQgPSAvXnVpLWlkLVxkKyQvOwoKLy8gJC51aSBtaWdodCBleGlzdCBmcm9tIGNvbXBvbmVudHMgd2l0aCBubyBkZXBlbmRlbmNpZXMsIGUuZy4sICQudWkucG9zaXRpb24KJC51aSA9ICQudWkgfHwge307CgokLmV4dGVuZCggJC51aSwgewoJdmVyc2lvbjogIjEuMTAuMyIsCgoJa2V5Q29kZTogewoJCUJBQ0tTUEFDRTogOCwKCQlDT01NQTogMTg4LAoJCURFTEVURTogNDYsCgkJRE9XTjogNDAsCgkJRU5EOiAzNSwKCQlFTlRFUjogMTMsCgkJRVNDQVBFOiAyNywKCQlIT01FOiAzNiwKCQlMRUZUOiAzNywKCQlOVU1QQURfQUREOiAxMDcsCgkJTlVNUEFEX0RFQ0lNQUw6IDExMCwKCQlOVU1QQURfRElWSURFOiAxMTEsCgkJTlVNUEFEX0VOVEVSOiAxMDgsCgkJTlVNUEFEX01VTFRJUExZOiAxMDYsCgkJTlVNUEFEX1NVQlRSQUNUOiAxMDksCgkJUEFHRV9ET1dOOiAzNCwKCQlQQUdFX1VQOiAzMywKCQlQRVJJT0Q6IDE5MCwKCQlSSUdIVDogMzksCgkJU1BBQ0U6IDMyLAoJCVRBQjogOSwKCQlVUDogMzgKCX0KfSk7CgovLyBwbHVnaW5zCiQuZm4uZXh0ZW5kKHsKCWZvY3VzOiAoZnVuY3Rpb24oIG9yaWcgKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKCBkZWxheSwgZm4gKSB7CgkJCXJldHVybiB0eXBlb2YgZGVsYXkgPT09ICJudW1iZXIiID8KCQkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCQl2YXIgZWxlbSA9IHRoaXM7CgkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCQkJJCggZWxlbSApLmZvY3VzKCk7CgkJCQkJCWlmICggZm4gKSB7CgkJCQkJCQlmbi5jYWxsKCBlbGVtICk7CgkJCQkJCX0KCQkJCQl9LCBkZWxheSApOwoJCQkJfSkgOgoJCQkJb3JpZy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCX0pKCAkLmZuLmZvY3VzICksCgoJc2Nyb2xsUGFyZW50OiBmdW5jdGlvbigpIHsKCQl2YXIgc2Nyb2xsUGFyZW50OwoJCWlmICgoJC51aS5pZSAmJiAoLyhzdGF0aWN8cmVsYXRpdmUpLykudGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSkpIHx8ICgvYWJzb2x1dGUvKS50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKSkgewoJCQlzY3JvbGxQYXJlbnQgPSB0aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gKC8ocmVsYXRpdmV8YWJzb2x1dGV8Zml4ZWQpLykudGVzdCgkLmNzcyh0aGlzLCJwb3NpdGlvbiIpKSAmJiAoLyhhdXRvfHNjcm9sbCkvKS50ZXN0KCQuY3NzKHRoaXMsIm92ZXJmbG93IikrJC5jc3ModGhpcywib3ZlcmZsb3cteSIpKyQuY3NzKHRoaXMsIm92ZXJmbG93LXgiKSk7CgkJCX0pLmVxKDApOwoJCX0gZWxzZSB7CgkJCXNjcm9sbFBhcmVudCA9IHRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJCXJldHVybiAoLyhhdXRvfHNjcm9sbCkvKS50ZXN0KCQuY3NzKHRoaXMsIm92ZXJmbG93IikrJC5jc3ModGhpcywib3ZlcmZsb3cteSIpKyQuY3NzKHRoaXMsIm92ZXJmbG93LXgiKSk7CgkJCX0pLmVxKDApOwoJCX0KCgkJcmV0dXJuICgvZml4ZWQvKS50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKSB8fCAhc2Nyb2xsUGFyZW50Lmxlbmd0aCA/ICQoZG9jdW1lbnQpIDogc2Nyb2xsUGFyZW50OwoJfSwKCgl6SW5kZXg6IGZ1bmN0aW9uKCB6SW5kZXggKSB7CgkJaWYgKCB6SW5kZXggIT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXMuY3NzKCAiekluZGV4IiwgekluZGV4ICk7CgkJfQoKCQlpZiAoIHRoaXMubGVuZ3RoICkgewoJCQl2YXIgZWxlbSA9ICQoIHRoaXNbIDAgXSApLCBwb3NpdGlvbiwgdmFsdWU7CgkJCXdoaWxlICggZWxlbS5sZW5ndGggJiYgZWxlbVsgMCBdICE9PSBkb2N1bWVudCApIHsKCQkJCS8vIElnbm9yZSB6LWluZGV4IGlmIHBvc2l0aW9uIGlzIHNldCB0byBhIHZhbHVlIHdoZXJlIHotaW5kZXggaXMgaWdub3JlZCBieSB0aGUgYnJvd3NlcgoJCQkJLy8gVGhpcyBtYWtlcyBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzCgkJCQkvLyBXZWJLaXQgYWx3YXlzIHJldHVybnMgYXV0byBpZiB0aGUgZWxlbWVudCBpcyBwb3NpdGlvbmVkCgkJCQlwb3NpdGlvbiA9IGVsZW0uY3NzKCAicG9zaXRpb24iICk7CgkJCQlpZiAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAicmVsYXRpdmUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQkJCS8vIElFIHJldHVybnMgMCB3aGVuIHpJbmRleCBpcyBub3Qgc3BlY2lmaWVkCgkJCQkJLy8gb3RoZXIgYnJvd3NlcnMgcmV0dXJuIGEgc3RyaW5nCgkJCQkJLy8gd2UgaWdub3JlIHRoZSBjYXNlIG9mIG5lc3RlZCBlbGVtZW50cyB3aXRoIGFuIGV4cGxpY2l0IHZhbHVlIG9mIDAKCQkJCQkvLyA8ZGl2IHN0eWxlPSJ6LWluZGV4OiAtMTA7Ij48ZGl2IHN0eWxlPSJ6LWluZGV4OiAwOyI+PC9kaXY+PC9kaXY+CgkJCQkJdmFsdWUgPSBwYXJzZUludCggZWxlbS5jc3MoICJ6SW5kZXgiICksIDEwICk7CgkJCQkJaWYgKCAhaXNOYU4oIHZhbHVlICkgJiYgdmFsdWUgIT09IDAgKSB7CgkJCQkJCXJldHVybiB2YWx1ZTsKCQkJCQl9CgkJCQl9CgkJCQllbGVtID0gZWxlbS5wYXJlbnQoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIDA7Cgl9LAoKCXVuaXF1ZUlkOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoICF0aGlzLmlkICkgewoJCQkJdGhpcy5pZCA9ICJ1aS1pZC0iICsgKCsrdXVpZCk7CgkJCX0KCQl9KTsKCX0sCgoJcmVtb3ZlVW5pcXVlSWQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlmICggcnVuaXF1ZUlkLnRlc3QoIHRoaXMuaWQgKSApIHsKCQkJCSQoIHRoaXMgKS5yZW1vdmVBdHRyKCAiaWQiICk7CgkJCX0KCQl9KTsKCX0KfSk7CgovLyBzZWxlY3RvcnMKZnVuY3Rpb24gZm9jdXNhYmxlKCBlbGVtZW50LCBpc1RhYkluZGV4Tm90TmFOICkgewoJdmFyIG1hcCwgbWFwTmFtZSwgaW1nLAoJCW5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJaWYgKCAiYXJlYSIgPT09IG5vZGVOYW1lICkgewoJCW1hcCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKCQltYXBOYW1lID0gbWFwLm5hbWU7CgkJaWYgKCAhZWxlbWVudC5ocmVmIHx8ICFtYXBOYW1lIHx8IG1hcC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAibWFwIiApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpbWcgPSAkKCAiaW1nW3VzZW1hcD0jIiArIG1hcE5hbWUgKyAiXSIgKVswXTsKCQlyZXR1cm4gISFpbWcgJiYgdmlzaWJsZSggaW1nICk7Cgl9CglyZXR1cm4gKCAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QvLnRlc3QoIG5vZGVOYW1lICkgPwoJCSFlbGVtZW50LmRpc2FibGVkIDoKCQkiYSIgPT09IG5vZGVOYW1lID8KCQkJZWxlbWVudC5ocmVmIHx8IGlzVGFiSW5kZXhOb3ROYU4gOgoJCQlpc1RhYkluZGV4Tm90TmFOKSAmJgoJCS8vIHRoZSBlbGVtZW50IGFuZCBhbGwgb2YgaXRzIGFuY2VzdG9ycyBtdXN0IGJlIHZpc2libGUKCQl2aXNpYmxlKCBlbGVtZW50ICk7Cn0KCmZ1bmN0aW9uIHZpc2libGUoIGVsZW1lbnQgKSB7CglyZXR1cm4gJC5leHByLmZpbHRlcnMudmlzaWJsZSggZWxlbWVudCApICYmCgkJISQoIGVsZW1lbnQgKS5wYXJlbnRzKCkuYWRkQmFjaygpLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJcmV0dXJuICQuY3NzKCB0aGlzLCAidmlzaWJpbGl0eSIgKSA9PT0gImhpZGRlbiI7CgkJfSkubGVuZ3RoOwp9CgokLmV4dGVuZCggJC5leHByWyAiOiIgXSwgewoJZGF0YTogJC5leHByLmNyZWF0ZVBzZXVkbyA/CgkJJC5leHByLmNyZWF0ZVBzZXVkbyhmdW5jdGlvbiggZGF0YU5hbWUgKSB7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZGF0YU5hbWUgKTsKCQkJfTsKCQl9KSA6CgkJLy8gc3VwcG9ydDogalF1ZXJ5IDwxLjgKCQlmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CgkJCXJldHVybiAhISQuZGF0YSggZWxlbSwgbWF0Y2hbIDMgXSApOwoJCX0sCgoJZm9jdXNhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQlyZXR1cm4gZm9jdXNhYmxlKCBlbGVtZW50LCAhaXNOYU4oICQuYXR0ciggZWxlbWVudCwgInRhYmluZGV4IiApICkgKTsKCX0sCgoJdGFiYmFibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXZhciB0YWJJbmRleCA9ICQuYXR0ciggZWxlbWVudCwgInRhYmluZGV4IiApLAoJCQlpc1RhYkluZGV4TmFOID0gaXNOYU4oIHRhYkluZGV4ICk7CgkJcmV0dXJuICggaXNUYWJJbmRleE5hTiB8fCB0YWJJbmRleCA+PSAwICkgJiYgZm9jdXNhYmxlKCBlbGVtZW50LCAhaXNUYWJJbmRleE5hTiApOwoJfQp9KTsKCi8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CmlmICggISQoICI8YT4iICkub3V0ZXJXaWR0aCggMSApLmpxdWVyeSApIHsKCSQuZWFjaCggWyAiV2lkdGgiLCAiSGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQl2YXIgc2lkZSA9IG5hbWUgPT09ICJXaWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXSwKCQkJdHlwZSA9IG5hbWUudG9Mb3dlckNhc2UoKSwKCQkJb3JpZyA9IHsKCQkJCWlubmVyV2lkdGg6ICQuZm4uaW5uZXJXaWR0aCwKCQkJCWlubmVySGVpZ2h0OiAkLmZuLmlubmVySGVpZ2h0LAoJCQkJb3V0ZXJXaWR0aDogJC5mbi5vdXRlcldpZHRoLAoJCQkJb3V0ZXJIZWlnaHQ6ICQuZm4ub3V0ZXJIZWlnaHQKCQkJfTsKCgkJZnVuY3Rpb24gcmVkdWNlKCBlbGVtLCBzaXplLCBib3JkZXIsIG1hcmdpbiApIHsKCQkJJC5lYWNoKCBzaWRlLCBmdW5jdGlvbigpIHsKCQkJCXNpemUgLT0gcGFyc2VGbG9hdCggJC5jc3MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMgKSApIHx8IDA7CgkJCQlpZiAoIGJvcmRlciApIHsKCQkJCQlzaXplIC09IHBhcnNlRmxvYXQoICQuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQkJfQoJCQkJaWYgKCBtYXJnaW4gKSB7CgkJCQkJc2l6ZSAtPSBwYXJzZUZsb2F0KCAkLmNzcyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzICkgKSB8fCAwOwoJCQkJfQoJCQl9KTsKCQkJcmV0dXJuIHNpemU7CgkJfQoKCQkkLmZuWyAiaW5uZXIiICsgbmFtZSBdID0gZnVuY3Rpb24oIHNpemUgKSB7CgkJCWlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIG9yaWdbICJpbm5lciIgKyBuYW1lIF0uY2FsbCggdGhpcyApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJJCggdGhpcyApLmNzcyggdHlwZSwgcmVkdWNlKCB0aGlzLCBzaXplICkgKyAicHgiICk7CgkJCX0pOwoJCX07CgoJCSQuZm5bICJvdXRlciIgKyBuYW1lXSA9IGZ1bmN0aW9uKCBzaXplLCBtYXJnaW4gKSB7CgkJCWlmICggdHlwZW9mIHNpemUgIT09ICJudW1iZXIiICkgewoJCQkJcmV0dXJuIG9yaWdbICJvdXRlciIgKyBuYW1lIF0uY2FsbCggdGhpcywgc2l6ZSApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJJCggdGhpcykuY3NzKCB0eXBlLCByZWR1Y2UoIHRoaXMsIHNpemUsIHRydWUsIG1hcmdpbiApICsgInB4IiApOwoJCQl9KTsKCQl9OwoJfSk7Cn0KCi8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CmlmICggISQuZm4uYWRkQmFjayApIHsKCSQuZm4uYWRkQmFjayA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgPwoJCQl0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApCgkJKTsKCX07Cn0KCi8vIHN1cHBvcnQ6IGpRdWVyeSAxLjYuMSwgMS42LjIgKGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0Lzk0MTMpCmlmICggJCggIjxhPiIgKS5kYXRhKCAiYS1iIiwgImEiICkucmVtb3ZlRGF0YSggImEtYiIgKS5kYXRhKCAiYS1iIiApICkgewoJJC5mbi5yZW1vdmVEYXRhID0gKGZ1bmN0aW9uKCByZW1vdmVEYXRhICkgewoJCXJldHVybiBmdW5jdGlvbigga2V5ICkgewoJCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCQlyZXR1cm4gcmVtb3ZlRGF0YS5jYWxsKCB0aGlzLCAkLmNhbWVsQ2FzZSgga2V5ICkgKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiByZW1vdmVEYXRhLmNhbGwoIHRoaXMgKTsKCQkJfQoJCX07Cgl9KSggJC5mbi5yZW1vdmVEYXRhICk7Cn0KCgoKCgovLyBkZXByZWNhdGVkCiQudWkuaWUgPSAhIS9tc2llIFtcdy5dKy8uZXhlYyggbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpICk7CgokLnN1cHBvcnQuc2VsZWN0c3RhcnQgPSAib25zZWxlY3RzdGFydCIgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKTsKJC5mbi5leHRlbmQoewoJZGlzYWJsZVNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuYmluZCggKCAkLnN1cHBvcnQuc2VsZWN0c3RhcnQgPyAic2VsZWN0c3RhcnQiIDogIm1vdXNlZG93biIgKSArCgkJCSIudWktZGlzYWJsZVNlbGVjdGlvbiIsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCX0pOwoJfSwKCgllbmFibGVTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnVuYmluZCggIi51aS1kaXNhYmxlU2VsZWN0aW9uIiApOwoJfQp9KTsKCiQuZXh0ZW5kKCAkLnVpLCB7CgkvLyAkLnVpLnBsdWdpbiBpcyBkZXByZWNhdGVkLiBVc2UgJC53aWRnZXQoKSBleHRlbnNpb25zIGluc3RlYWQuCglwbHVnaW46IHsKCQlhZGQ6IGZ1bmN0aW9uKCBtb2R1bGUsIG9wdGlvbiwgc2V0ICkgewoJCQl2YXIgaSwKCQkJCXByb3RvID0gJC51aVsgbW9kdWxlIF0ucHJvdG90eXBlOwoJCQlmb3IgKCBpIGluIHNldCApIHsKCQkJCXByb3RvLnBsdWdpbnNbIGkgXSA9IHByb3RvLnBsdWdpbnNbIGkgXSB8fCBbXTsKCQkJCXByb3RvLnBsdWdpbnNbIGkgXS5wdXNoKCBbIG9wdGlvbiwgc2V0WyBpIF0gXSApOwoJCQl9CgkJfSwKCQljYWxsOiBmdW5jdGlvbiggaW5zdGFuY2UsIG5hbWUsIGFyZ3MgKSB7CgkJCXZhciBpLAoJCQkJc2V0ID0gaW5zdGFuY2UucGx1Z2luc1sgbmFtZSBdOwoJCQlpZiAoICFzZXQgfHwgIWluc3RhbmNlLmVsZW1lbnRbIDAgXS5wYXJlbnROb2RlIHx8IGluc3RhbmNlLmVsZW1lbnRbIDAgXS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJZm9yICggaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGluc3RhbmNlLm9wdGlvbnNbIHNldFsgaSBdWyAwIF0gXSApIHsKCQkJCQlzZXRbIGkgXVsgMSBdLmFwcGx5KCBpbnN0YW5jZS5lbGVtZW50LCBhcmdzICk7CgkJCQl9CgkJCX0KCQl9Cgl9LAoKCS8vIG9ubHkgdXNlZCBieSByZXNpemFibGUKCWhhc1Njcm9sbDogZnVuY3Rpb24oIGVsLCBhICkgewoKCQkvL0lmIG92ZXJmbG93IGlzIGhpZGRlbiwgdGhlIGVsZW1lbnQgbWlnaHQgaGF2ZSBleHRyYSBjb250ZW50LCBidXQgdGhlIHVzZXIgd2FudHMgdG8gaGlkZSBpdAoJCWlmICggJCggZWwgKS5jc3MoICJvdmVyZmxvdyIgKSA9PT0gImhpZGRlbiIpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdmFyIHNjcm9sbCA9ICggYSAmJiBhID09PSAibGVmdCIgKSA/ICJzY3JvbGxMZWZ0IiA6ICJzY3JvbGxUb3AiLAoJCQloYXMgPSBmYWxzZTsKCgkJaWYgKCBlbFsgc2Nyb2xsIF0gPiAwICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCS8vIFRPRE86IGRldGVybWluZSB3aGljaCBjYXNlcyBhY3R1YWxseSBjYXVzZSB0aGlzIHRvIGhhcHBlbgoJCS8vIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSB0aGUgc2Nyb2xsIHNldCwgc2VlIGlmIGl0J3MgcG9zc2libGUgdG8KCQkvLyBzZXQgdGhlIHNjcm9sbAoJCWVsWyBzY3JvbGwgXSA9IDE7CgkJaGFzID0gKCBlbFsgc2Nyb2xsIF0gPiAwICk7CgkJZWxbIHNjcm9sbCBdID0gMDsKCQlyZXR1cm4gaGFzOwoJfQp9KTsKCn0pKCBqUXVlcnkgKTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKdmFyIHV1aWQgPSAwLAoJc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsCglfY2xlYW5EYXRhID0gJC5jbGVhbkRhdGE7CiQuY2xlYW5EYXRhID0gZnVuY3Rpb24oIGVsZW1zICkgewoJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJdHJ5IHsKCQkJJCggZWxlbSApLnRyaWdnZXJIYW5kbGVyKCAicmVtb3ZlIiApOwoJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzgyMzUKCQl9IGNhdGNoKCBlICkge30KCX0KCV9jbGVhbkRhdGEoIGVsZW1zICk7Cn07CgokLndpZGdldCA9IGZ1bmN0aW9uKCBuYW1lLCBiYXNlLCBwcm90b3R5cGUgKSB7Cgl2YXIgZnVsbE5hbWUsIGV4aXN0aW5nQ29uc3RydWN0b3IsIGNvbnN0cnVjdG9yLCBiYXNlUHJvdG90eXBlLAoJCS8vIHByb3hpZWRQcm90b3R5cGUgYWxsb3dzIHRoZSBwcm92aWRlZCBwcm90b3R5cGUgdG8gcmVtYWluIHVubW9kaWZpZWQKCQkvLyBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGEgbWl4aW4gZm9yIG11bHRpcGxlIHdpZGdldHMgKCM4ODc2KQoJCXByb3hpZWRQcm90b3R5cGUgPSB7fSwKCQluYW1lc3BhY2UgPSBuYW1lLnNwbGl0KCAiLiIgKVsgMCBdOwoKCW5hbWUgPSBuYW1lLnNwbGl0KCAiLiIgKVsgMSBdOwoJZnVsbE5hbWUgPSBuYW1lc3BhY2UgKyAiLSIgKyBuYW1lOwoKCWlmICggIXByb3RvdHlwZSApIHsKCQlwcm90b3R5cGUgPSBiYXNlOwoJCWJhc2UgPSAkLldpZGdldDsKCX0KCgkvLyBjcmVhdGUgc2VsZWN0b3IgZm9yIHBsdWdpbgoJJC5leHByWyAiOiIgXVsgZnVsbE5hbWUudG9Mb3dlckNhc2UoKSBdID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuICEhJC5kYXRhKCBlbGVtLCBmdWxsTmFtZSApOwoJfTsKCgkkWyBuYW1lc3BhY2UgXSA9ICRbIG5hbWVzcGFjZSBdIHx8IHt9OwoJZXhpc3RpbmdDb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBuYW1lIF07Cgljb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBuYW1lIF0gPSBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHsKCQkvLyBhbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgIm5ldyIga2V5d29yZAoJCWlmICggIXRoaXMuX2NyZWF0ZVdpZGdldCApIHsKCQkJcmV0dXJuIG5ldyBjb25zdHJ1Y3Rvciggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IGluaXRpYWxpemluZyBmb3Igc2ltcGxlIGluaGVyaXRhbmNlCgkJLy8gbXVzdCB1c2UgIm5ldyIga2V5d29yZCAodGhlIGNvZGUgYWJvdmUgYWx3YXlzIHBhc3NlcyBhcmdzKQoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJdGhpcy5fY3JlYXRlV2lkZ2V0KCBvcHRpb25zLCBlbGVtZW50ICk7CgkJfQoJfTsKCS8vIGV4dGVuZCB3aXRoIHRoZSBleGlzdGluZyBjb25zdHJ1Y3RvciB0byBjYXJyeSBvdmVyIGFueSBzdGF0aWMgcHJvcGVydGllcwoJJC5leHRlbmQoIGNvbnN0cnVjdG9yLCBleGlzdGluZ0NvbnN0cnVjdG9yLCB7CgkJdmVyc2lvbjogcHJvdG90eXBlLnZlcnNpb24sCgkJLy8gY29weSB0aGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm90b3R5cGUgaW4gY2FzZSB3ZSBuZWVkIHRvCgkJLy8gcmVkZWZpbmUgdGhlIHdpZGdldCBsYXRlcgoJCV9wcm90bzogJC5leHRlbmQoIHt9LCBwcm90b3R5cGUgKSwKCQkvLyB0cmFjayB3aWRnZXRzIHRoYXQgaW5oZXJpdCBmcm9tIHRoaXMgd2lkZ2V0IGluIGNhc2UgdGhpcyB3aWRnZXQgaXMKCQkvLyByZWRlZmluZWQgYWZ0ZXIgYSB3aWRnZXQgaW5oZXJpdHMgZnJvbSBpdAoJCV9jaGlsZENvbnN0cnVjdG9yczogW10KCX0pOwoKCWJhc2VQcm90b3R5cGUgPSBuZXcgYmFzZSgpOwoJLy8gd2UgbmVlZCB0byBtYWtlIHRoZSBvcHRpb25zIGhhc2ggYSBwcm9wZXJ0eSBkaXJlY3RseSBvbiB0aGUgbmV3IGluc3RhbmNlCgkvLyBvdGhlcndpc2Ugd2UnbGwgbW9kaWZ5IHRoZSBvcHRpb25zIGhhc2ggb24gdGhlIHByb3RvdHlwZSB0aGF0IHdlJ3JlCgkvLyBpbmhlcml0aW5nIGZyb20KCWJhc2VQcm90b3R5cGUub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sIGJhc2VQcm90b3R5cGUub3B0aW9ucyApOwoJJC5lYWNoKCBwcm90b3R5cGUsIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHsKCQlpZiAoICEkLmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXByb3hpZWRQcm90b3R5cGVbIHByb3AgXSA9IHZhbHVlOwoJCQlyZXR1cm47CgkJfQoJCXByb3hpZWRQcm90b3R5cGVbIHByb3AgXSA9IChmdW5jdGlvbigpIHsKCQkJdmFyIF9zdXBlciA9IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBiYXNlLnByb3RvdHlwZVsgcHJvcCBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCX0sCgkJCQlfc3VwZXJBcHBseSA9IGZ1bmN0aW9uKCBhcmdzICkgewoJCQkJCXJldHVybiBiYXNlLnByb3RvdHlwZVsgcHJvcCBdLmFwcGx5KCB0aGlzLCBhcmdzICk7CgkJCQl9OwoJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQl2YXIgX19zdXBlciA9IHRoaXMuX3N1cGVyLAoJCQkJCV9fc3VwZXJBcHBseSA9IHRoaXMuX3N1cGVyQXBwbHksCgkJCQkJcmV0dXJuVmFsdWU7CgoJCQkJdGhpcy5fc3VwZXIgPSBfc3VwZXI7CgkJCQl0aGlzLl9zdXBlckFwcGx5ID0gX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuVmFsdWUgPSB2YWx1ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgoJCQkJdGhpcy5fc3VwZXIgPSBfX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9fc3VwZXJBcHBseTsKCgkJCQlyZXR1cm4gcmV0dXJuVmFsdWU7CgkJCX07CgkJfSkoKTsKCX0pOwoJY29uc3RydWN0b3IucHJvdG90eXBlID0gJC53aWRnZXQuZXh0ZW5kKCBiYXNlUHJvdG90eXBlLCB7CgkJLy8gVE9ETzogcmVtb3ZlIHN1cHBvcnQgZm9yIHdpZGdldEV2ZW50UHJlZml4CgkJLy8gYWx3YXlzIHVzZSB0aGUgbmFtZSArIGEgY29sb24gYXMgdGhlIHByZWZpeCwgZS5nLiwgZHJhZ2dhYmxlOnN0YXJ0CgkJLy8gZG9uJ3QgcHJlZml4IGZvciB3aWRnZXRzIHRoYXQgYXJlbid0IERPTS1iYXNlZAoJCXdpZGdldEV2ZW50UHJlZml4OiBleGlzdGluZ0NvbnN0cnVjdG9yID8gYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCA6IG5hbWUKCX0sIHByb3hpZWRQcm90b3R5cGUsIHsKCQljb25zdHJ1Y3RvcjogY29uc3RydWN0b3IsCgkJbmFtZXNwYWNlOiBuYW1lc3BhY2UsCgkJd2lkZ2V0TmFtZTogbmFtZSwKCQl3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWUKCX0pOwoKCS8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0CgkvLyBhcmUgaW5oZXJpdGluZyBmcm9tIGl0IGFuZCByZWRlZmluZSBhbGwgb2YgdGhlbSBzbyB0aGF0IHRoZXkgaW5oZXJpdCBmcm9tCgkvLyB0aGUgbmV3IHZlcnNpb24gb2YgdGhpcyB3aWRnZXQuIFdlJ3JlIGVzc2VudGlhbGx5IHRyeWluZyB0byByZXBsYWNlIG9uZQoJLy8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi4KCWlmICggZXhpc3RpbmdDb25zdHJ1Y3RvciApIHsKCQkkLmVhY2goIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzLCBmdW5jdGlvbiggaSwgY2hpbGQgKSB7CgkJCXZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTsKCgkJCS8vIHJlZGVmaW5lIHRoZSBjaGlsZCB3aWRnZXQgdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlIHRoYXQgd2FzCgkJCS8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2UKCQkJJC53aWRnZXQoIGNoaWxkUHJvdG90eXBlLm5hbWVzcGFjZSArICIuIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLCBjaGlsZC5fcHJvdG8gKTsKCQl9KTsKCQkvLyByZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvcgoJCS8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZAoJCWRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9yczsKCX0gZWxzZSB7CgkJYmFzZS5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaCggY29uc3RydWN0b3IgKTsKCX0KCgkkLndpZGdldC5icmlkZ2UoIG5hbWUsIGNvbnN0cnVjdG9yICk7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICksCgkJaW5wdXRJbmRleCA9IDAsCgkJaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsCgkJa2V5LAoJCXZhbHVlOwoJZm9yICggOyBpbnB1dEluZGV4IDwgaW5wdXRMZW5ndGg7IGlucHV0SW5kZXgrKyApIHsKCQlmb3IgKCBrZXkgaW4gaW5wdXRbIGlucHV0SW5kZXggXSApIHsKCQkJdmFsdWUgPSBpbnB1dFsgaW5wdXRJbmRleCBdWyBrZXkgXTsKCQkJaWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gQ2xvbmUgb2JqZWN0cwoJCQkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7CgkJCQkJdGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID8KCQkJCQkJJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGFyZ2V0WyBrZXkgXSwgdmFsdWUgKSA6CgkJCQkJCS8vIERvbid0IGV4dGVuZCBzdHJpbmdzLCBhcnJheXMsIGV0Yy4gd2l0aCBvYmplY3RzCgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHZhbHVlICk7CgkJCQkvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2UKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0WyBrZXkgXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoJfQoJcmV0dXJuIHRhcmdldDsKfTsKCiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7Cgl2YXIgZnVsbE5hbWUgPSBvYmplY3QucHJvdG90eXBlLndpZGdldEZ1bGxOYW1lIHx8IG5hbWU7CgkkLmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIgaXNNZXRob2RDYWxsID0gdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciLAoJCQlhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICksCgkJCXJldHVyblZhbHVlID0gdGhpczsKCgkJLy8gYWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJb3B0aW9ucyA9ICFpc01ldGhvZENhbGwgJiYgYXJncy5sZW5ndGggPwoJCQkkLndpZGdldC5leHRlbmQuYXBwbHkoIG51bGwsIFsgb3B0aW9ucyBdLmNvbmNhdChhcmdzKSApIDoKCQkJb3B0aW9uczsKCgkJaWYgKCBpc01ldGhvZENhbGwgKSB7CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBtZXRob2RWYWx1ZSwKCQkJCQlpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTsKCQkJCWlmICggIWluc3RhbmNlICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAiY2Fubm90IGNhbGwgbWV0aG9kcyBvbiAiICsgbmFtZSArICIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247ICIgKwoJCQkJCQkiYXR0ZW1wdGVkIHRvIGNhbGwgbWV0aG9kICciICsgb3B0aW9ucyArICInIiApOwoJCQkJfQoJCQkJaWYgKCAhJC5pc0Z1bmN0aW9uKCBpbnN0YW5jZVtvcHRpb25zXSApIHx8IG9wdGlvbnMuY2hhckF0KCAwICkgPT09ICJfIiApIHsKCQkJCQlyZXR1cm4gJC5lcnJvciggIm5vIHN1Y2ggbWV0aG9kICciICsgb3B0aW9ucyArICInIGZvciAiICsgbmFtZSArICIgd2lkZ2V0IGluc3RhbmNlIiApOwoJCQkJfQoJCQkJbWV0aG9kVmFsdWUgPSBpbnN0YW5jZVsgb3B0aW9ucyBdLmFwcGx5KCBpbnN0YW5jZSwgYXJncyApOwoJCQkJaWYgKCBtZXRob2RWYWx1ZSAhPT0gaW5zdGFuY2UgJiYgbWV0aG9kVmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlyZXR1cm5WYWx1ZSA9IG1ldGhvZFZhbHVlICYmIG1ldGhvZFZhbHVlLmpxdWVyeSA/CgkJCQkJCXJldHVyblZhbHVlLnB1c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6CgkJCQkJCW1ldGhvZFZhbHVlOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKS5faW5pdCgpOwoJCQkJfSBlbHNlIHsKCQkJCQkkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBvcHRpb25zLCB0aGlzICkgKTsKCQkJCX0KCQkJfSk7CgkJfQoKCQlyZXR1cm4gcmV0dXJuVmFsdWU7Cgl9Owp9OwoKJC5XaWRnZXQgPSBmdW5jdGlvbiggLyogb3B0aW9ucywgZWxlbWVudCAqLyApIHt9OwokLldpZGdldC5fY2hpbGRDb25zdHJ1Y3RvcnMgPSBbXTsKCiQuV2lkZ2V0LnByb3RvdHlwZSA9IHsKCXdpZGdldE5hbWU6ICJ3aWRnZXQiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICIiLAoJZGVmYXVsdEVsZW1lbnQ6ICI8ZGl2PiIsCglvcHRpb25zOiB7CgkJZGlzYWJsZWQ6IGZhbHNlLAoKCQkvLyBjYWxsYmFja3MKCQljcmVhdGU6IG51bGwKCX0sCglfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHsKCQllbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdOwoJCXRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQl0aGlzLnV1aWQgPSB1dWlkKys7CgkJdGhpcy5ldmVudE5hbWVzcGFjZSA9ICIuIiArIHRoaXMud2lkZ2V0TmFtZSArIHRoaXMudXVpZDsKCQl0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LAoJCQl0aGlzLm9wdGlvbnMsCgkJCXRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSwKCQkJb3B0aW9ucyApOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkvLyAxLjkgQkMgZm9yICM3ODEwCgkJCS8vIFRPRE8gcmVtb3ZlIGR1YWwgc3RvcmFnZQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXROYW1lICkKCQkJLnJlbW92ZURhdGEoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKQoJCQkvLyBzdXBwb3J0OiBqcXVlcnkgPDEuNi4zCgkJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0Lzk0MTMKCQkJLnJlbW92ZURhdGEoICQuY2FtZWxDYXNlKCB0aGlzLndpZGdldEZ1bGxOYW1lICkgKTsKCQl0aGlzLndpZGdldCgpCgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICkKCQkJLnJlbW92ZUNsYXNzKAoJCQkJdGhpcy53aWRnZXRGdWxsTmFtZSArICItZGlzYWJsZWQgIiArCgkJCQkidWktc3RhdGUtZGlzYWJsZWQiICk7CgoJCS8vIGNsZWFuIHVwIGV2ZW50cyBhbmQgc3RhdGVzCgkJdGhpcy5iaW5kaW5ncy51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKTsKCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCXRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7Cgl9LAoJX2Rlc3Ryb3k6ICQubm9vcCwKCgl3aWRnZXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmVsZW1lbnQ7Cgl9LAoKCW9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdmFyIG9wdGlvbnMgPSBrZXksCgkJCXBhcnRzLAoJCQljdXJPcHRpb24sCgkJCWk7CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMCApIHsKCQkJLy8gZG9uJ3QgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBoYXNoCgkJCXJldHVybiAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTsKCQl9CgoJCWlmICggdHlwZW9mIGtleSA9PT0gInN0cmluZyIgKSB7CgkJCS8vIGhhbmRsZSBuZXN0ZWQga2V5cywgZS5nLiwgImZvby5iYXIiID0+IHsgZm9vOiB7IGJhcjogX19fIH0gfQoJCQlvcHRpb25zID0ge307CgkJCXBhcnRzID0ga2V5LnNwbGl0KCAiLiIgKTsKCQkJa2V5ID0gcGFydHMuc2hpZnQoKTsKCQkJaWYgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXJPcHRpb24gPSBvcHRpb25zWyBrZXkgXSA9ICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9uc1sga2V5IF0gKTsKCQkJCWZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkgewoJCQkJCWN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307CgkJCQkJY3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07CgkJCQl9CgkJCQlrZXkgPSBwYXJ0cy5wb3AoKTsKCQkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJCQlyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07CgkJCQl9CgkJCQljdXJPcHRpb25bIGtleSBdID0gdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIHRoaXMub3B0aW9uc1sga2V5IF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiB0aGlzLm9wdGlvbnNbIGtleSBdOwoJCQkJfQoJCQkJb3B0aW9uc1sga2V5IF0gPSB2YWx1ZTsKCQkJfQoJCX0KCgkJdGhpcy5fc2V0T3B0aW9ucyggb3B0aW9ucyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uczogZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGtleTsKCgkJZm9yICgga2V5IGluIG9wdGlvbnMgKSB7CgkJCXRoaXMuX3NldE9wdGlvbigga2V5LCBvcHRpb25zWyBrZXkgXSApOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdGhpcy5vcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpcy53aWRnZXQoKQoJCQkJLnRvZ2dsZUNsYXNzKCB0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIsICEhdmFsdWUgKQoJCQkJLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgdmFsdWUgKTsKCQkJdGhpcy5ob3ZlcmFibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgllbmFibGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLl9zZXRPcHRpb24oICJkaXNhYmxlZCIsIGZhbHNlICk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbiggImRpc2FibGVkIiwgdHJ1ZSApOwoJfSwKCglfb246IGZ1bmN0aW9uKCBzdXBwcmVzc0Rpc2FibGVkQ2hlY2ssIGVsZW1lbnQsIGhhbmRsZXJzICkgewoJCXZhciBkZWxlZ2F0ZUVsZW1lbnQsCgkJCWluc3RhbmNlID0gdGhpczsKCgkJLy8gbm8gc3VwcHJlc3NEaXNhYmxlZENoZWNrIGZsYWcsIHNodWZmbGUgYXJndW1lbnRzCgkJaWYgKCB0eXBlb2Ygc3VwcHJlc3NEaXNhYmxlZENoZWNrICE9PSAiYm9vbGVhbiIgKSB7CgkJCWhhbmRsZXJzID0gZWxlbWVudDsKCQkJZWxlbWVudCA9IHN1cHByZXNzRGlzYWJsZWRDaGVjazsKCQkJc3VwcHJlc3NEaXNhYmxlZENoZWNrID0gZmFsc2U7CgkJfQoKCQkvLyBubyBlbGVtZW50IGFyZ3VtZW50LCBzaHVmZmxlIGFuZCB1c2UgdGhpcy5lbGVtZW50CgkJaWYgKCAhaGFuZGxlcnMgKSB7CgkJCWhhbmRsZXJzID0gZWxlbWVudDsKCQkJZWxlbWVudCA9IHRoaXMuZWxlbWVudDsKCQkJZGVsZWdhdGVFbGVtZW50ID0gdGhpcy53aWRnZXQoKTsKCQl9IGVsc2UgewoJCQkvLyBhY2NlcHQgc2VsZWN0b3JzLCBET00gZWxlbWVudHMKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihcdyspXHMqKC4qKSQvICksCgkJCQlldmVudE5hbWUgPSBtYXRjaFsxXSArIGluc3RhbmNlLmV2ZW50TmFtZXNwYWNlLAoJCQkJc2VsZWN0b3IgPSBtYXRjaFsyXTsKCQkJaWYgKCBzZWxlY3RvciApIHsKCQkJCWRlbGVnYXRlRWxlbWVudC5kZWxlZ2F0ZSggc2VsZWN0b3IsIGV2ZW50TmFtZSwgaGFuZGxlclByb3h5ICk7CgkJCX0gZWxzZSB7CgkJCQllbGVtZW50LmJpbmQoIGV2ZW50TmFtZSwgaGFuZGxlclByb3h5ICk7CgkJCX0KCQl9KTsKCX0sCgoJX29mZjogZnVuY3Rpb24oIGVsZW1lbnQsIGV2ZW50TmFtZSApIHsKCQlldmVudE5hbWUgPSAoZXZlbnROYW1lIHx8ICIiKS5zcGxpdCggIiAiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArICIgIiApICsgdGhpcy5ldmVudE5hbWVzcGFjZTsKCQllbGVtZW50LnVuYmluZCggZXZlbnROYW1lICkudW5kZWxlZ2F0ZSggZXZlbnROYW1lICk7Cgl9LAoKCV9kZWxheTogZnVuY3Rpb24oIGhhbmRsZXIsIGRlbGF5ICkgewoJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJcmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09ICJzdHJpbmciID8gaW5zdGFuY2VbIGhhbmRsZXIgXSA6IGhhbmRsZXIgKQoJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJfQoJCXZhciBpbnN0YW5jZSA9IHRoaXM7CgkJcmV0dXJuIHNldFRpbWVvdXQoIGhhbmRsZXJQcm94eSwgZGVsYXkgfHwgMCApOwoJfSwKCglfaG92ZXJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl0aGlzLmhvdmVyYWJsZSA9IHRoaXMuaG92ZXJhYmxlLmFkZCggZWxlbWVudCApOwoJCXRoaXMuX29uKCBlbGVtZW50LCB7CgkJCW1vdXNlZW50ZXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5hZGRDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQl9LAoJCQltb3VzZWxlYXZlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfQoJCX0pOwoJfSwKCglfZm9jdXNhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl0aGlzLmZvY3VzYWJsZSA9IHRoaXMuZm9jdXNhYmxlLmFkZCggZWxlbWVudCApOwoJCXRoaXMuX29uKCBlbGVtZW50LCB7CgkJCWZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5hZGRDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9LAoJCQlmb2N1c291dDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJCX0KCQl9KTsKCX0sCgoJX3RyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBldmVudCwgZGF0YSApIHsKCQl2YXIgcHJvcCwgb3JpZywKCQkJY2FsbGJhY2sgPSB0aGlzLm9wdGlvbnNbIHR5cGUgXTsKCgkJZGF0YSA9IGRhdGEgfHwge307CgkJZXZlbnQgPSAkLkV2ZW50KCBldmVudCApOwoJCWV2ZW50LnR5cGUgPSAoIHR5cGUgPT09IHRoaXMud2lkZ2V0RXZlbnRQcmVmaXggPwoJCQl0eXBlIDoKCQkJdGhpcy53aWRnZXRFdmVudFByZWZpeCArIHR5cGUgKS50b0xvd2VyQ2FzZSgpOwoJCS8vIHRoZSBvcmlnaW5hbCBldmVudCBtYXkgY29tZSBmcm9tIGFueSBlbGVtZW50CgkJLy8gc28gd2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0IG9uIHRoZSBuZXcgZXZlbnQKCQlldmVudC50YXJnZXQgPSB0aGlzLmVsZW1lbnRbIDAgXTsKCgkJLy8gY29weSBvcmlnaW5hbCBldmVudCBwcm9wZXJ0aWVzIG92ZXIgdG8gdGhlIG5ldyBldmVudAoJCW9yaWcgPSBldmVudC5vcmlnaW5hbEV2ZW50OwoJCWlmICggb3JpZyApIHsKCQkJZm9yICggcHJvcCBpbiBvcmlnICkgewoJCQkJaWYgKCAhKCBwcm9wIGluIGV2ZW50ICkgKSB7CgkJCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdbIHByb3AgXTsKCQkJCX0KCQkJfQoJCX0KCgkJdGhpcy5lbGVtZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhICk7CgkJcmV0dXJuICEoICQuaXNGdW5jdGlvbiggY2FsbGJhY2sgKSAmJgoJCQljYWxsYmFjay5hcHBseSggdGhpcy5lbGVtZW50WzBdLCBbIGV2ZW50IF0uY29uY2F0KCBkYXRhICkgKSA9PT0gZmFsc2UgfHwKCQkJZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKTsKCX0KfTsKCiQuZWFjaCggeyBzaG93OiAiZmFkZUluIiwgaGlkZTogImZhZGVPdXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIGRlZmF1bHRFZmZlY3QgKSB7CgkkLldpZGdldC5wcm90b3R5cGVbICJfIiArIG1ldGhvZCBdID0gZnVuY3Rpb24oIGVsZW1lbnQsIG9wdGlvbnMsIGNhbGxiYWNrICkgewoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciICkgewoJCQlvcHRpb25zID0geyBlZmZlY3Q6IG9wdGlvbnMgfTsKCQl9CgkJdmFyIGhhc09wdGlvbnMsCgkJCWVmZmVjdE5hbWUgPSAhb3B0aW9ucyA/CgkJCQltZXRob2QgOgoJCQkJb3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gIm51bWJlciIgPwoJCQkJCWRlZmF1bHRFZmZlY3QgOgoJCQkJCW9wdGlvbnMuZWZmZWN0IHx8IGRlZmF1bHRFZmZlY3Q7CgkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgkJaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gIm51bWJlciIgKSB7CgkJCW9wdGlvbnMgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07CgkJfQoJCWhhc09wdGlvbnMgPSAhJC5pc0VtcHR5T2JqZWN0KCBvcHRpb25zICk7CgkJb3B0aW9ucy5jb21wbGV0ZSA9IGNhbGxiYWNrOwoJCWlmICggb3B0aW9ucy5kZWxheSApIHsKCQkJZWxlbWVudC5kZWxheSggb3B0aW9ucy5kZWxheSApOwoJCX0KCQlpZiAoIGhhc09wdGlvbnMgJiYgJC5lZmZlY3RzICYmICQuZWZmZWN0cy5lZmZlY3RbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgbWV0aG9kIF0oIG9wdGlvbnMgKTsKCQl9IGVsc2UgaWYgKCBlZmZlY3ROYW1lICE9PSBtZXRob2QgJiYgZWxlbWVudFsgZWZmZWN0TmFtZSBdICkgewoJCQllbGVtZW50WyBlZmZlY3ROYW1lIF0oIG9wdGlvbnMuZHVyYXRpb24sIG9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCWVsZW1lbnQucXVldWUoZnVuY3Rpb24oIG5leHQgKSB7CgkJCQkkKCB0aGlzIClbIG1ldGhvZCBdKCk7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrLmNhbGwoIGVsZW1lbnRbIDAgXSApOwoJCQkJfQoJCQkJbmV4dCgpOwoJCQl9KTsKCQl9Cgl9Owp9KTsKCn0pKCBqUXVlcnkgKTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKdmFyIG1vdXNlSGFuZGxlZCA9IGZhbHNlOwokKCBkb2N1bWVudCApLm1vdXNldXAoIGZ1bmN0aW9uKCkgewoJbW91c2VIYW5kbGVkID0gZmFsc2U7Cn0pOwoKJC53aWRnZXQoInVpLm1vdXNlIiwgewoJdmVyc2lvbjogIjEuMTAuMyIsCglvcHRpb25zOiB7CgkJY2FuY2VsOiAiaW5wdXQsdGV4dGFyZWEsYnV0dG9uLHNlbGVjdCxvcHRpb24iLAoJCWRpc3RhbmNlOiAxLAoJCWRlbGF5OiAwCgl9LAoJX21vdXNlSW5pdDogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQl0aGlzLmVsZW1lbnQKCQkJLmJpbmQoIm1vdXNlZG93bi4iK3RoaXMud2lkZ2V0TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHsKCQkJCXJldHVybiB0aGF0Ll9tb3VzZURvd24oZXZlbnQpOwoJCQl9KQoJCQkuYmluZCgiY2xpY2suIit0aGlzLndpZGdldE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQlpZiAodHJ1ZSA9PT0gJC5kYXRhKGV2ZW50LnRhcmdldCwgdGhhdC53aWRnZXROYW1lICsgIi5wcmV2ZW50Q2xpY2tFdmVudCIpKSB7CgkJCQkJJC5yZW1vdmVEYXRhKGV2ZW50LnRhcmdldCwgdGhhdC53aWRnZXROYW1lICsgIi5wcmV2ZW50Q2xpY2tFdmVudCIpOwoJCQkJCWV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfSk7CgoJCXRoaXMuc3RhcnRlZCA9IGZhbHNlOwoJfSwKCgkvLyBUT0RPOiBtYWtlIHN1cmUgZGVzdHJveWluZyBvbmUgaW5zdGFuY2Ugb2YgbW91c2UgZG9lc24ndCBtZXNzIHdpdGgKCS8vIG90aGVyIGluc3RhbmNlcyBvZiBtb3VzZQoJX21vdXNlRGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKTsKCQlpZiAoIHRoaXMuX21vdXNlTW92ZURlbGVnYXRlICkgewoJCQkkKGRvY3VtZW50KQoJCQkJLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLCB0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkKCQkJCS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSk7CgkJfQoJfSwKCglfbW91c2VEb3duOiBmdW5jdGlvbihldmVudCkgewoJCS8vIGRvbid0IGxldCBtb3JlIHRoYW4gb25lIHdpZGdldCBoYW5kbGUgbW91c2VTdGFydAoJCWlmKCBtb3VzZUhhbmRsZWQgKSB7IHJldHVybjsgfQoKCQkvLyB3ZSBtYXkgaGF2ZSBtaXNzZWQgbW91c2V1cCAob3V0IG9mIHdpbmRvdykKCQkodGhpcy5fbW91c2VTdGFydGVkICYmIHRoaXMuX21vdXNlVXAoZXZlbnQpKTsKCgkJdGhpcy5fbW91c2VEb3duRXZlbnQgPSBldmVudDsKCgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlidG5Jc0xlZnQgPSAoZXZlbnQud2hpY2ggPT09IDEpLAoJCQkvLyBldmVudC50YXJnZXQubm9kZU5hbWUgd29ya3MgYXJvdW5kIGEgYnVnIGluIElFIDggd2l0aAoJCQkvLyBkaXNhYmxlZCBpbnB1dHMgKCM3NjIwKQoJCQllbElzQ2FuY2VsID0gKHR5cGVvZiB0aGlzLm9wdGlvbnMuY2FuY2VsID09PSAic3RyaW5nIiAmJiBldmVudC50YXJnZXQubm9kZU5hbWUgPyAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCh0aGlzLm9wdGlvbnMuY2FuY2VsKS5sZW5ndGggOiBmYWxzZSk7CgkJaWYgKCFidG5Jc0xlZnQgfHwgZWxJc0NhbmNlbCB8fCAhdGhpcy5fbW91c2VDYXB0dXJlKGV2ZW50KSkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCXRoaXMubW91c2VEZWxheU1ldCA9ICF0aGlzLm9wdGlvbnMuZGVsYXk7CgkJaWYgKCF0aGlzLm1vdXNlRGVsYXlNZXQpIHsKCQkJdGhpcy5fbW91c2VEZWxheVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCXRoYXQubW91c2VEZWxheU1ldCA9IHRydWU7CgkJCX0sIHRoaXMub3B0aW9ucy5kZWxheSk7CgkJfQoKCQlpZiAodGhpcy5fbW91c2VEaXN0YW5jZU1ldChldmVudCkgJiYgdGhpcy5fbW91c2VEZWxheU1ldChldmVudCkpIHsKCQkJdGhpcy5fbW91c2VTdGFydGVkID0gKHRoaXMuX21vdXNlU3RhcnQoZXZlbnQpICE9PSBmYWxzZSk7CgkJCWlmICghdGhpcy5fbW91c2VTdGFydGVkKSB7CgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCS8vIENsaWNrIGV2ZW50IG1heSBuZXZlciBoYXZlIGZpcmVkIChHZWNrbyAmIE9wZXJhKQoJCWlmICh0cnVlID09PSAkLmRhdGEoZXZlbnQudGFyZ2V0LCB0aGlzLndpZGdldE5hbWUgKyAiLnByZXZlbnRDbGlja0V2ZW50IikpIHsKCQkJJC5yZW1vdmVEYXRhKGV2ZW50LnRhcmdldCwgdGhpcy53aWRnZXROYW1lICsgIi5wcmV2ZW50Q2xpY2tFdmVudCIpOwoJCX0KCgkJLy8gdGhlc2UgZGVsZWdhdGVzIGFyZSByZXF1aXJlZCB0byBrZWVwIGNvbnRleHQKCQl0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJCXJldHVybiB0aGF0Ll9tb3VzZU1vdmUoZXZlbnQpOwoJCX07CgkJdGhpcy5fbW91c2VVcERlbGVnYXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKCQkJcmV0dXJuIHRoYXQuX21vdXNlVXAoZXZlbnQpOwoJCX07CgkJJChkb2N1bWVudCkKCQkJLmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSwgdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpCgkJCS5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLCB0aGlzLl9tb3VzZVVwRGVsZWdhdGUpOwoKCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQltb3VzZUhhbmRsZWQgPSB0cnVlOwoJCXJldHVybiB0cnVlOwoJfSwKCglfbW91c2VNb3ZlOiBmdW5jdGlvbihldmVudCkgewoJCS8vIElFIG1vdXNldXAgY2hlY2sgLSBtb3VzZXVwIGhhcHBlbmVkIHdoZW4gbW91c2Ugd2FzIG91dCBvZiB3aW5kb3cKCQlpZiAoJC51aS5pZSAmJiAoICFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDwgOSApICYmICFldmVudC5idXR0b24pIHsKCQkJcmV0dXJuIHRoaXMuX21vdXNlVXAoZXZlbnQpOwoJCX0KCgkJaWYgKHRoaXMuX21vdXNlU3RhcnRlZCkgewoJCQl0aGlzLl9tb3VzZURyYWcoZXZlbnQpOwoJCQlyZXR1cm4gZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9CgoJCWlmICh0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGV2ZW50KSAmJiB0aGlzLl9tb3VzZURlbGF5TWV0KGV2ZW50KSkgewoJCQl0aGlzLl9tb3VzZVN0YXJ0ZWQgPQoJCQkJKHRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsIGV2ZW50KSAhPT0gZmFsc2UpOwoJCQkodGhpcy5fbW91c2VTdGFydGVkID8gdGhpcy5fbW91c2VEcmFnKGV2ZW50KSA6IHRoaXMuX21vdXNlVXAoZXZlbnQpKTsKCQl9CgoJCXJldHVybiAhdGhpcy5fbW91c2VTdGFydGVkOwoJfSwKCglfbW91c2VVcDogZnVuY3Rpb24oZXZlbnQpIHsKCQkkKGRvY3VtZW50KQoJCQkudW5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKQoJCQkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLCB0aGlzLl9tb3VzZVVwRGVsZWdhdGUpOwoKCQlpZiAodGhpcy5fbW91c2VTdGFydGVkKSB7CgkJCXRoaXMuX21vdXNlU3RhcnRlZCA9IGZhbHNlOwoKCQkJaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0KSB7CgkJCQkkLmRhdGEoZXZlbnQudGFyZ2V0LCB0aGlzLndpZGdldE5hbWUgKyAiLnByZXZlbnRDbGlja0V2ZW50IiwgdHJ1ZSk7CgkJCX0KCgkJCXRoaXMuX21vdXNlU3RvcChldmVudCk7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZURpc3RhbmNlTWV0OiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiAoTWF0aC5tYXgoCgkJCQlNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWCAtIGV2ZW50LnBhZ2VYKSwKCQkJCU1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZIC0gZXZlbnQucGFnZVkpCgkJCSkgPj0gdGhpcy5vcHRpb25zLmRpc3RhbmNlCgkJKTsKCX0sCgoJX21vdXNlRGVsYXlNZXQ6IGZ1bmN0aW9uKC8qIGV2ZW50ICovKSB7CgkJcmV0dXJuIHRoaXMubW91c2VEZWxheU1ldDsKCX0sCgoJLy8gVGhlc2UgYXJlIHBsYWNlaG9sZGVyIG1ldGhvZHMsIHRvIGJlIG92ZXJyaWRlbiBieSBleHRlbmRpbmcgcGx1Z2luCglfbW91c2VTdGFydDogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHt9LAoJX21vdXNlRHJhZzogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHt9LAoJX21vdXNlU3RvcDogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHt9LAoJX21vdXNlQ2FwdHVyZTogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHsgcmV0dXJuIHRydWU7IH0KfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLndpZGdldCgidWkuZHJhZ2dhYmxlIiwgJC51aS5tb3VzZSwgewoJdmVyc2lvbjogIjEuMTAuMyIsCgl3aWRnZXRFdmVudFByZWZpeDogImRyYWciLAoJb3B0aW9uczogewoJCWFkZENsYXNzZXM6IHRydWUsCgkJYXBwZW5kVG86ICJwYXJlbnQiLAoJCWF4aXM6IGZhbHNlLAoJCWNvbm5lY3RUb1NvcnRhYmxlOiBmYWxzZSwKCQljb250YWlubWVudDogZmFsc2UsCgkJY3Vyc29yOiAiYXV0byIsCgkJY3Vyc29yQXQ6IGZhbHNlLAoJCWdyaWQ6IGZhbHNlLAoJCWhhbmRsZTogZmFsc2UsCgkJaGVscGVyOiAib3JpZ2luYWwiLAoJCWlmcmFtZUZpeDogZmFsc2UsCgkJb3BhY2l0eTogZmFsc2UsCgkJcmVmcmVzaFBvc2l0aW9uczogZmFsc2UsCgkJcmV2ZXJ0OiBmYWxzZSwKCQlyZXZlcnREdXJhdGlvbjogNTAwLAoJCXNjb3BlOiAiZGVmYXVsdCIsCgkJc2Nyb2xsOiB0cnVlLAoJCXNjcm9sbFNlbnNpdGl2aXR5OiAyMCwKCQlzY3JvbGxTcGVlZDogMjAsCgkJc25hcDogZmFsc2UsCgkJc25hcE1vZGU6ICJib3RoIiwKCQlzbmFwVG9sZXJhbmNlOiAyMCwKCQlzdGFjazogZmFsc2UsCgkJekluZGV4OiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJZHJhZzogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsCgl9LAoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgoJCWlmICh0aGlzLm9wdGlvbnMuaGVscGVyID09PSAib3JpZ2luYWwiICYmICEoL14oPzpyfGF8ZikvKS50ZXN0KHRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIikpKSB7CgkJCXRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CgkJfQoJCWlmICh0aGlzLm9wdGlvbnMuYWRkQ2xhc3Nlcyl7CgkJCXRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlIik7CgkJfQoJCWlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpewoJCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpOwoJCX0KCgkJdGhpcy5fbW91c2VJbml0KCk7CgoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCAidWktZHJhZ2dhYmxlIHVpLWRyYWdnYWJsZS1kcmFnZ2luZyB1aS1kcmFnZ2FibGUtZGlzYWJsZWQiICk7CgkJdGhpcy5fbW91c2VEZXN0cm95KCk7Cgl9LAoKCV9tb3VzZUNhcHR1cmU6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zOwoKCQkvLyBhbW9uZyBvdGhlcnMsIHByZXZlbnQgYSBkcmFnIG9uIGEgcmVzaXphYmxlLWhhbmRsZQoJCWlmICh0aGlzLmhlbHBlciB8fCBvLmRpc2FibGVkIHx8ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KCIudWktcmVzaXphYmxlLWhhbmRsZSIpLmxlbmd0aCA+IDApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy9RdWl0IGlmIHdlJ3JlIG5vdCBvbiBhIHZhbGlkIGhhbmRsZQoJCXRoaXMuaGFuZGxlID0gdGhpcy5fZ2V0SGFuZGxlKGV2ZW50KTsKCQlpZiAoIXRoaXMuaGFuZGxlKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSQoby5pZnJhbWVGaXggPT09IHRydWUgPyAiaWZyYW1lIiA6IG8uaWZyYW1lRml4KS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkkKCI8ZGl2IGNsYXNzPSd1aS1kcmFnZ2FibGUtaWZyYW1lRml4JyBzdHlsZT0nYmFja2dyb3VuZDogI2ZmZjsnPjwvZGl2PiIpCgkJCS5jc3MoewoJCQkJd2lkdGg6IHRoaXMub2Zmc2V0V2lkdGgrInB4IiwgaGVpZ2h0OiB0aGlzLm9mZnNldEhlaWdodCsicHgiLAoJCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsIG9wYWNpdHk6ICIwLjAwMSIsIHpJbmRleDogMTAwMAoJCQl9KQoJCQkuY3NzKCQodGhpcykub2Zmc2V0KCkpCgkJCS5hcHBlbmRUbygiYm9keSIpOwoJCX0pOwoKCQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCgkJLy9DcmVhdGUgYW5kIGFwcGVuZCB0aGUgdmlzaWJsZSBoZWxwZXIKCQl0aGlzLmhlbHBlciA9IHRoaXMuX2NyZWF0ZUhlbHBlcihldmVudCk7CgoJCXRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKTsKCgkJLy9DYWNoZSB0aGUgaGVscGVyIHNpemUKCQl0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7CgoJCS8vSWYgZGRtYW5hZ2VyIGlzIHVzZWQgZm9yIGRyb3BwYWJsZXMsIHNldCB0aGUgZ2xvYmFsIGRyYWdnYWJsZQoJCWlmKCQudWkuZGRtYW5hZ2VyKSB7CgkJCSQudWkuZGRtYW5hZ2VyLmN1cnJlbnQgPSB0aGlzOwoJCX0KCgkJLyoKCQkgKiAtIFBvc2l0aW9uIGdlbmVyYXRpb24gLQoJCSAqIFRoaXMgYmxvY2sgZ2VuZXJhdGVzIGV2ZXJ5dGhpbmcgcG9zaXRpb24gcmVsYXRlZCAtIGl0J3MgdGhlIGNvcmUgb2YgZHJhZ2dhYmxlcy4KCQkgKi8KCgkJLy9DYWNoZSB0aGUgbWFyZ2lucyBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudAoJCXRoaXMuX2NhY2hlTWFyZ2lucygpOwoKCQkvL1N0b3JlIHRoZSBoZWxwZXIncyBjc3MgcG9zaXRpb24KCQl0aGlzLmNzc1Bvc2l0aW9uID0gdGhpcy5oZWxwZXIuY3NzKCAicG9zaXRpb24iICk7CgkJdGhpcy5zY3JvbGxQYXJlbnQgPSB0aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKTsKCQl0aGlzLm9mZnNldFBhcmVudCA9IHRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpOwoJCXRoaXMub2Zmc2V0UGFyZW50Q3NzUG9zaXRpb24gPSB0aGlzLm9mZnNldFBhcmVudC5jc3MoICJwb3NpdGlvbiIgKTsKCgkJLy9UaGUgZWxlbWVudCdzIGFic29sdXRlIHBvc2l0aW9uIG9uIHRoZSBwYWdlIG1pbnVzIG1hcmdpbnMKCQl0aGlzLm9mZnNldCA9IHRoaXMucG9zaXRpb25BYnMgPSB0aGlzLmVsZW1lbnQub2Zmc2V0KCk7CgkJdGhpcy5vZmZzZXQgPSB7CgkJCXRvcDogdGhpcy5vZmZzZXQudG9wIC0gdGhpcy5tYXJnaW5zLnRvcCwKCQkJbGVmdDogdGhpcy5vZmZzZXQubGVmdCAtIHRoaXMubWFyZ2lucy5sZWZ0CgkJfTsKCgkJLy9SZXNldCBzY3JvbGwgY2FjaGUKCQl0aGlzLm9mZnNldC5zY3JvbGwgPSBmYWxzZTsKCgkJJC5leHRlbmQodGhpcy5vZmZzZXQsIHsKCQkJY2xpY2s6IHsgLy9XaGVyZSB0aGUgY2xpY2sgaGFwcGVuZWQsIHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50CgkJCQlsZWZ0OiBldmVudC5wYWdlWCAtIHRoaXMub2Zmc2V0LmxlZnQsCgkJCQl0b3A6IGV2ZW50LnBhZ2VZIC0gdGhpcy5vZmZzZXQudG9wCgkJCX0sCgkJCXBhcmVudDogdGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCksCgkJCXJlbGF0aXZlOiB0aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpIC8vVGhpcyBpcyBhIHJlbGF0aXZlIHRvIGFic29sdXRlIHBvc2l0aW9uIG1pbnVzIHRoZSBhY3R1YWwgcG9zaXRpb24gY2FsY3VsYXRpb24gLSBvbmx5IHVzZWQgZm9yIHJlbGF0aXZlIHBvc2l0aW9uZWQgaGVscGVyCgkJfSk7CgoJCS8vR2VuZXJhdGUgdGhlIG9yaWdpbmFsIHBvc2l0aW9uCgkJdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbiA9IHRoaXMuX2dlbmVyYXRlUG9zaXRpb24oZXZlbnQpOwoJCXRoaXMub3JpZ2luYWxQYWdlWCA9IGV2ZW50LnBhZ2VYOwoJCXRoaXMub3JpZ2luYWxQYWdlWSA9IGV2ZW50LnBhZ2VZOwoKCQkvL0FkanVzdCB0aGUgbW91c2Ugb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBoZWxwZXIgaWYgImN1cnNvckF0IiBpcyBzdXBwbGllZAoJCShvLmN1cnNvckF0ICYmIHRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoby5jdXJzb3JBdCkpOwoKCQkvL1NldCBhIGNvbnRhaW5tZW50IGlmIGdpdmVuIGluIHRoZSBvcHRpb25zCgkJdGhpcy5fc2V0Q29udGFpbm1lbnQoKTsKCgkJLy9UcmlnZ2VyIGV2ZW50ICsgY2FsbGJhY2tzCgkJaWYodGhpcy5fdHJpZ2dlcigic3RhcnQiLCBldmVudCkgPT09IGZhbHNlKSB7CgkJCXRoaXMuX2NsZWFyKCk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vUmVjYWNoZSB0aGUgaGVscGVyIHNpemUKCQl0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7CgoJCS8vUHJlcGFyZSB0aGUgZHJvcHBhYmxlIG9mZnNldHMKCQlpZiAoJC51aS5kZG1hbmFnZXIgJiYgIW8uZHJvcEJlaGF2aW91cikgewoJCQkkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLCBldmVudCk7CgkJfQoKCgkJdGhpcy5fbW91c2VEcmFnKGV2ZW50LCB0cnVlKTsgLy9FeGVjdXRlIHRoZSBkcmFnIG9uY2UgLSB0aGlzIGNhdXNlcyB0aGUgaGVscGVyIG5vdCB0byBiZSB2aXNpYmxlIGJlZm9yZSBnZXR0aW5nIGl0cyBjb3JyZWN0IHBvc2l0aW9uCgoJCS8vSWYgdGhlIGRkbWFuYWdlciBpcyB1c2VkIGZvciBkcm9wcGFibGVzLCBpbmZvcm0gdGhlIG1hbmFnZXIgdGhhdCBkcmFnZ2luZyBoYXMgc3RhcnRlZCAoc2VlICM1MDAzKQoJCWlmICggJC51aS5kZG1hbmFnZXIgKSB7CgkJCSQudWkuZGRtYW5hZ2VyLmRyYWdTdGFydCh0aGlzLCBldmVudCk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJX21vdXNlRHJhZzogZnVuY3Rpb24oZXZlbnQsIG5vUHJvcGFnYXRpb24pIHsKCQkvLyByZXNldCBhbnkgbmVjZXNzYXJ5IGNhY2hlZCBwcm9wZXJ0aWVzIChzZWUgIzUwMDkpCgkJaWYgKCB0aGlzLm9mZnNldFBhcmVudENzc1Bvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQl0aGlzLm9mZnNldC5wYXJlbnQgPSB0aGlzLl9nZXRQYXJlbnRPZmZzZXQoKTsKCQl9CgoJCS8vQ29tcHV0ZSB0aGUgaGVscGVycyBwb3NpdGlvbgoJCXRoaXMucG9zaXRpb24gPSB0aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGV2ZW50KTsKCQl0aGlzLnBvc2l0aW9uQWJzID0gdGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7CgoJCS8vQ2FsbCBwbHVnaW5zIGFuZCBjYWxsYmFja3MgYW5kIHVzZSB0aGUgcmVzdWx0aW5nIHBvc2l0aW9uIGlmIHNvbWV0aGluZyBpcyByZXR1cm5lZAoJCWlmICghbm9Qcm9wYWdhdGlvbikgewoJCQl2YXIgdWkgPSB0aGlzLl91aUhhc2goKTsKCQkJaWYodGhpcy5fdHJpZ2dlcigiZHJhZyIsIGV2ZW50LCB1aSkgPT09IGZhbHNlKSB7CgkJCQl0aGlzLl9tb3VzZVVwKHt9KTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl0aGlzLnBvc2l0aW9uID0gdWkucG9zaXRpb247CgkJfQoKCQlpZighdGhpcy5vcHRpb25zLmF4aXMgfHwgdGhpcy5vcHRpb25zLmF4aXMgIT09ICJ5IikgewoJCQl0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0ID0gdGhpcy5wb3NpdGlvbi5sZWZ0KyJweCI7CgkJfQoJCWlmKCF0aGlzLm9wdGlvbnMuYXhpcyB8fCB0aGlzLm9wdGlvbnMuYXhpcyAhPT0gIngiKSB7CgkJCXRoaXMuaGVscGVyWzBdLnN0eWxlLnRvcCA9IHRoaXMucG9zaXRpb24udG9wKyJweCI7CgkJfQoJCWlmKCQudWkuZGRtYW5hZ2VyKSB7CgkJCSQudWkuZGRtYW5hZ2VyLmRyYWcodGhpcywgZXZlbnQpOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfSwKCglfbW91c2VTdG9wOiBmdW5jdGlvbihldmVudCkgewoKCQkvL0lmIHdlIGFyZSB1c2luZyBkcm9wcGFibGVzLCBpbmZvcm0gdGhlIG1hbmFnZXIgYWJvdXQgdGhlIGRyb3AKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCWRyb3BwZWQgPSBmYWxzZTsKCQlpZiAoJC51aS5kZG1hbmFnZXIgJiYgIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyKSB7CgkJCWRyb3BwZWQgPSAkLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsIGV2ZW50KTsKCQl9CgoJCS8vaWYgYSBkcm9wIGNvbWVzIGZyb20gb3V0c2lkZSAoYSBzb3J0YWJsZSkKCQlpZih0aGlzLmRyb3BwZWQpIHsKCQkJZHJvcHBlZCA9IHRoaXMuZHJvcHBlZDsKCQkJdGhpcy5kcm9wcGVkID0gZmFsc2U7CgkJfQoKCQkvL2lmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIG5vIGxvbmdlciBpbiB0aGUgRE9NIGRvbid0IGJvdGhlciB0byBjb250aW51ZSAoc2VlICM4MjY5KQoJCWlmICggdGhpcy5vcHRpb25zLmhlbHBlciA9PT0gIm9yaWdpbmFsIiAmJiAhJC5jb250YWlucyggdGhpcy5lbGVtZW50WyAwIF0ub3duZXJEb2N1bWVudCwgdGhpcy5lbGVtZW50WyAwIF0gKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYoKHRoaXMub3B0aW9ucy5yZXZlcnQgPT09ICJpbnZhbGlkIiAmJiAhZHJvcHBlZCkgfHwgKHRoaXMub3B0aW9ucy5yZXZlcnQgPT09ICJ2YWxpZCIgJiYgZHJvcHBlZCkgfHwgdGhpcy5vcHRpb25zLnJldmVydCA9PT0gdHJ1ZSB8fCAoJC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpICYmIHRoaXMub3B0aW9ucy5yZXZlcnQuY2FsbCh0aGlzLmVsZW1lbnQsIGRyb3BwZWQpKSkgewoJCQkkKHRoaXMuaGVscGVyKS5hbmltYXRlKHRoaXMub3JpZ2luYWxQb3NpdGlvbiwgcGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uLCAxMCksIGZ1bmN0aW9uKCkgewoJCQkJaWYodGhhdC5fdHJpZ2dlcigic3RvcCIsIGV2ZW50KSAhPT0gZmFsc2UpIHsKCQkJCQl0aGF0Ll9jbGVhcigpOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoJCQlpZih0aGlzLl90cmlnZ2VyKCJzdG9wIiwgZXZlbnQpICE9PSBmYWxzZSkgewoJCQkJdGhpcy5fY2xlYXIoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfSwKCglfbW91c2VVcDogZnVuY3Rpb24oZXZlbnQpIHsKCQkvL1JlbW92ZSBmcmFtZSBoZWxwZXJzCgkJJCgiZGl2LnVpLWRyYWdnYWJsZS1pZnJhbWVGaXgiKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7CgkJfSk7CgoJCS8vSWYgdGhlIGRkbWFuYWdlciBpcyB1c2VkIGZvciBkcm9wcGFibGVzLCBpbmZvcm0gdGhlIG1hbmFnZXIgdGhhdCBkcmFnZ2luZyBoYXMgc3RvcHBlZCAoc2VlICM1MDAzKQoJCWlmKCAkLnVpLmRkbWFuYWdlciApIHsKCQkJJC51aS5kZG1hbmFnZXIuZHJhZ1N0b3AodGhpcywgZXZlbnQpOwoJCX0KCgkJcmV0dXJuICQudWkubW91c2UucHJvdG90eXBlLl9tb3VzZVVwLmNhbGwodGhpcywgZXZlbnQpOwoJfSwKCgljYW5jZWw6IGZ1bmN0aW9uKCkgewoKCQlpZih0aGlzLmhlbHBlci5pcygiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpKSB7CgkJCXRoaXMuX21vdXNlVXAoe30pOwoJCX0gZWxzZSB7CgkJCXRoaXMuX2NsZWFyKCk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCgl9LAoKCV9nZXRIYW5kbGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMub3B0aW9ucy5oYW5kbGUgPwoJCQkhISQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIHRoaXMuZWxlbWVudC5maW5kKCB0aGlzLm9wdGlvbnMuaGFuZGxlICkgKS5sZW5ndGggOgoJCQl0cnVlOwoJfSwKCglfY3JlYXRlSGVscGVyOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9ucywKCQkJaGVscGVyID0gJC5pc0Z1bmN0aW9uKG8uaGVscGVyKSA/ICQoby5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLCBbZXZlbnRdKSkgOiAoby5oZWxwZXIgPT09ICJjbG9uZSIgPyB0aGlzLmVsZW1lbnQuY2xvbmUoKS5yZW1vdmVBdHRyKCJpZCIpIDogdGhpcy5lbGVtZW50KTsKCgkJaWYoIWhlbHBlci5wYXJlbnRzKCJib2R5IikubGVuZ3RoKSB7CgkJCWhlbHBlci5hcHBlbmRUbygoby5hcHBlbmRUbyA9PT0gInBhcmVudCIgPyB0aGlzLmVsZW1lbnRbMF0ucGFyZW50Tm9kZSA6IG8uYXBwZW5kVG8pKTsKCQl9CgoJCWlmKGhlbHBlclswXSAhPT0gdGhpcy5lbGVtZW50WzBdICYmICEoLyhmaXhlZHxhYnNvbHV0ZSkvKS50ZXN0KGhlbHBlci5jc3MoInBvc2l0aW9uIikpKSB7CgkJCWhlbHBlci5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIik7CgkJfQoKCQlyZXR1cm4gaGVscGVyOwoKCX0sCgoJX2FkanVzdE9mZnNldEZyb21IZWxwZXI6IGZ1bmN0aW9uKG9iaikgewoJCWlmICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIikgewoJCQlvYmogPSBvYmouc3BsaXQoIiAiKTsKCQl9CgkJaWYgKCQuaXNBcnJheShvYmopKSB7CgkJCW9iaiA9IHtsZWZ0OiArb2JqWzBdLCB0b3A6ICtvYmpbMV0gfHwgMH07CgkJfQoJCWlmICgibGVmdCIgaW4gb2JqKSB7CgkJCXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPSBvYmoubGVmdCArIHRoaXMubWFyZ2lucy5sZWZ0OwoJCX0KCQlpZiAoInJpZ2h0IiBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2subGVmdCA9IHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLSBvYmoucmlnaHQgKyB0aGlzLm1hcmdpbnMubGVmdDsKCQl9CgkJaWYgKCJ0b3AiIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay50b3AgPSBvYmoudG9wICsgdGhpcy5tYXJnaW5zLnRvcDsKCQl9CgkJaWYgKCJib3R0b20iIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay50b3AgPSB0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAtIG9iai5ib3R0b20gKyB0aGlzLm1hcmdpbnMudG9wOwoJCX0KCX0sCgoJX2dldFBhcmVudE9mZnNldDogZnVuY3Rpb24oKSB7CgoJCS8vR2V0IHRoZSBvZmZzZXRQYXJlbnQgYW5kIGNhY2hlIGl0cyBwb3NpdGlvbgoJCXZhciBwbyA9IHRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gbW9kaWZ5IGEgb2Zmc2V0IGNhbGN1bGF0ZWQgb24gc3RhcnQsIHNpbmNlIHRoZSBmb2xsb3dpbmcgaGFwcGVuZWQ6CgkJLy8gMS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBoZWxwZXIgaXMgYWJzb2x1dGUsIHNvIGl0J3MgcG9zaXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgbmV4dCBwb3NpdGlvbmVkIHBhcmVudAoJCS8vIDIuIFRoZSBhY3R1YWwgb2Zmc2V0IHBhcmVudCBpcyBhIGNoaWxkIG9mIHRoZSBzY3JvbGwgcGFyZW50LCBhbmQgdGhlIHNjcm9sbCBwYXJlbnQgaXNuJ3QgdGhlIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGF0CgkJLy8gICAgdGhlIHNjcm9sbCBpcyBpbmNsdWRlZCBpbiB0aGUgaW5pdGlhbCBjYWxjdWxhdGlvbiBvZiB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQsIGFuZCBuZXZlciByZWNhbGN1bGF0ZWQgdXBvbiBkcmFnCgkJaWYodGhpcy5jc3NQb3NpdGlvbiA9PT0gImFic29sdXRlIiAmJiB0aGlzLnNjcm9sbFBhcmVudFswXSAhPT0gZG9jdW1lbnQgJiYgJC5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSwgdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSB7CgkJCXBvLmxlZnQgKz0gdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOwoJCQlwby50b3AgKz0gdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk7CgkJfQoKCQkvL1RoaXMgbmVlZHMgdG8gYmUgYWN0dWFsbHkgZG9uZSBmb3IgYWxsIGJyb3dzZXJzLCBzaW5jZSBwYWdlWC9wYWdlWSBpbmNsdWRlcyB0aGlzIGluZm9ybWF0aW9uCgkJLy9VZ2x5IElFIGZpeAoJCWlmKCh0aGlzLm9mZnNldFBhcmVudFswXSA9PT0gZG9jdW1lbnQuYm9keSkgfHwKCQkJKHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUgJiYgdGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaHRtbCIgJiYgJC51aS5pZSkpIHsKCQkJcG8gPSB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJcmV0dXJuIHsKCQkJdG9wOiBwby50b3AgKyAocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKSB8fCAwKSwKCQkJbGVmdDogcG8ubGVmdCArIChwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKSB8fCAwKQoJCX07CgoJfSwKCglfZ2V0UmVsYXRpdmVPZmZzZXQ6IGZ1bmN0aW9uKCkgewoKCQlpZih0aGlzLmNzc1Bvc2l0aW9uID09PSAicmVsYXRpdmUiKSB7CgkJCXZhciBwID0gdGhpcy5lbGVtZW50LnBvc2l0aW9uKCk7CgkJCXJldHVybiB7CgkJCQl0b3A6IHAudG9wIC0gKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApIHx8IDApICsgdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksCgkJCQlsZWZ0OiBwLmxlZnQgLSAocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApIHx8IDApICsgdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpCgkJCX07CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07CgkJfQoKCX0sCgoJX2NhY2hlTWFyZ2luczogZnVuY3Rpb24oKSB7CgkJdGhpcy5tYXJnaW5zID0gewoJCQlsZWZ0OiAocGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLDEwKSB8fCAwKSwKCQkJdG9wOiAocGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luVG9wIiksMTApIHx8IDApLAoJCQlyaWdodDogKHBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksMTApIHx8IDApLAoJCQlib3R0b206IChwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSwxMCkgfHwgMCkKCQl9OwoJfSwKCglfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWxwZXJQcm9wb3J0aW9ucyA9IHsKCQkJd2lkdGg6IHRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSwKCQkJaGVpZ2h0OiB0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpCgkJfTsKCX0sCgoJX3NldENvbnRhaW5tZW50OiBmdW5jdGlvbigpIHsKCgkJdmFyIG92ZXIsIGMsIGNlLAoJCQlvID0gdGhpcy5vcHRpb25zOwoKCQlpZiAoICFvLmNvbnRhaW5tZW50ICkgewoJCQl0aGlzLmNvbnRhaW5tZW50ID0gbnVsbDsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBvLmNvbnRhaW5tZW50ID09PSAid2luZG93IiApIHsKCQkJdGhpcy5jb250YWlubWVudCA9IFsKCQkJCSQoIHdpbmRvdyApLnNjcm9sbExlZnQoKSAtIHRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQgLSB0aGlzLm9mZnNldC5wYXJlbnQubGVmdCwKCQkJCSQoIHdpbmRvdyApLnNjcm9sbFRvcCgpIC0gdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wIC0gdGhpcy5vZmZzZXQucGFyZW50LnRvcCwKCQkJCSQoIHdpbmRvdyApLnNjcm9sbExlZnQoKSArICQoIHdpbmRvdyApLndpZHRoKCkgLSB0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW5zLmxlZnQsCgkJCQkkKCB3aW5kb3cgKS5zY3JvbGxUb3AoKSArICggJCggd2luZG93ICkuaGVpZ2h0KCkgfHwgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCApIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSB0aGlzLm1hcmdpbnMudG9wCgkJCV07CgkJCXJldHVybjsKCQl9CgoJCWlmICggby5jb250YWlubWVudCA9PT0gImRvY3VtZW50IikgewoJCQl0aGlzLmNvbnRhaW5tZW50ID0gWwoJCQkJMCwKCQkJCTAsCgkJCQkkKCBkb2N1bWVudCApLndpZHRoKCkgLSB0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW5zLmxlZnQsCgkJCQkoICQoIGRvY3VtZW50ICkuaGVpZ2h0KCkgfHwgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCApIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSB0aGlzLm1hcmdpbnMudG9wCgkJCV07CgkJCXJldHVybjsKCQl9CgoJCWlmICggby5jb250YWlubWVudC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgKSB7CgkJCXRoaXMuY29udGFpbm1lbnQgPSBvLmNvbnRhaW5tZW50OwoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG8uY29udGFpbm1lbnQgPT09ICJwYXJlbnQiICkgewoJCQlvLmNvbnRhaW5tZW50ID0gdGhpcy5oZWxwZXJbIDAgXS5wYXJlbnROb2RlOwoJCX0KCgkJYyA9ICQoIG8uY29udGFpbm1lbnQgKTsKCQljZSA9IGNbIDAgXTsKCgkJaWYoICFjZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJb3ZlciA9IGMuY3NzKCAib3ZlcmZsb3ciICkgIT09ICJoaWRkZW4iOwoKCQl0aGlzLmNvbnRhaW5tZW50ID0gWwoJCQkoIHBhcnNlSW50KCBjLmNzcyggImJvcmRlckxlZnRXaWR0aCIgKSwgMTAgKSB8fCAwICkgKyAoIHBhcnNlSW50KCBjLmNzcyggInBhZGRpbmdMZWZ0IiApLCAxMCApIHx8IDAgKSwKCQkJKCBwYXJzZUludCggYy5jc3MoICJib3JkZXJUb3BXaWR0aCIgKSwgMTAgKSB8fCAwICkgKyAoIHBhcnNlSW50KCBjLmNzcyggInBhZGRpbmdUb3AiICksIDEwICkgfHwgMCApICwKCQkJKCBvdmVyID8gTWF0aC5tYXgoIGNlLnNjcm9sbFdpZHRoLCBjZS5vZmZzZXRXaWR0aCApIDogY2Uub2Zmc2V0V2lkdGggKSAtICggcGFyc2VJbnQoIGMuY3NzKCAiYm9yZGVyUmlnaHRXaWR0aCIgKSwgMTAgKSB8fCAwICkgLSAoIHBhcnNlSW50KCBjLmNzcyggInBhZGRpbmdSaWdodCIgKSwgMTAgKSB8fCAwICkgLSB0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW5zLmxlZnQgLSB0aGlzLm1hcmdpbnMucmlnaHQsCgkJCSggb3ZlciA/IE1hdGgubWF4KCBjZS5zY3JvbGxIZWlnaHQsIGNlLm9mZnNldEhlaWdodCApIDogY2Uub2Zmc2V0SGVpZ2h0ICkgLSAoIHBhcnNlSW50KCBjLmNzcyggImJvcmRlckJvdHRvbVdpZHRoIiApLCAxMCApIHx8IDAgKSAtICggcGFyc2VJbnQoIGMuY3NzKCAicGFkZGluZ0JvdHRvbSIgKSwgMTAgKSB8fCAwICkgLSB0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAtIHRoaXMubWFyZ2lucy50b3AgIC0gdGhpcy5tYXJnaW5zLmJvdHRvbQoJCV07CgkJdGhpcy5yZWxhdGl2ZV9jb250YWluZXIgPSBjOwoJfSwKCglfY29udmVydFBvc2l0aW9uVG86IGZ1bmN0aW9uKGQsIHBvcykgewoKCQlpZighcG9zKSB7CgkJCXBvcyA9IHRoaXMucG9zaXRpb247CgkJfQoKCQl2YXIgbW9kID0gZCA9PT0gImFic29sdXRlIiA/IDEgOiAtMSwKCQkJc2Nyb2xsID0gdGhpcy5jc3NQb3NpdGlvbiA9PT0gImFic29sdXRlIiAmJiAhKCB0aGlzLnNjcm9sbFBhcmVudFsgMCBdICE9PSBkb2N1bWVudCAmJiAkLmNvbnRhaW5zKCB0aGlzLnNjcm9sbFBhcmVudFsgMCBdLCB0aGlzLm9mZnNldFBhcmVudFsgMCBdICkgKSA/IHRoaXMub2Zmc2V0UGFyZW50IDogdGhpcy5zY3JvbGxQYXJlbnQ7CgoJCS8vQ2FjaGUgdGhlIHNjcm9sbAoJCWlmICghdGhpcy5vZmZzZXQuc2Nyb2xsKSB7CgkJCXRoaXMub2Zmc2V0LnNjcm9sbCA9IHt0b3AgOiBzY3JvbGwuc2Nyb2xsVG9wKCksIGxlZnQgOiBzY3JvbGwuc2Nyb2xsTGVmdCgpfTsKCQl9CgoJCXJldHVybiB7CgkJCXRvcDogKAoJCQkJcG9zLnRvcAkrCQkJCQkJCQkJCQkJCQkJCS8vIFRoZSBhYnNvbHV0ZSBtb3VzZSBwb3NpdGlvbgoJCQkJdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wICogbW9kICsJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQl0aGlzLm9mZnNldC5wYXJlbnQudG9wICogbW9kIC0JCQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSggKCB0aGlzLmNzc1Bvc2l0aW9uID09PSAiZml4ZWQiID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpIDogdGhpcy5vZmZzZXQuc2Nyb2xsLnRvcCApICogbW9kICkKCQkJKSwKCQkJbGVmdDogKAoJCQkJcG9zLmxlZnQgKwkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQgKiBtb2QgKwkJCQkJCQkJCQkvLyBPbmx5IGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIG5vZGVzOiBSZWxhdGl2ZSBvZmZzZXQgZnJvbSBlbGVtZW50IHRvIG9mZnNldCBwYXJlbnQKCQkJCXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0ICogbW9kCS0JCQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSggKCB0aGlzLmNzc1Bvc2l0aW9uID09PSAiZml4ZWQiID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSA6IHRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0ICkgKiBtb2QgKQoJCQkpCgkJfTsKCgl9LAoKCV9nZW5lcmF0ZVBvc2l0aW9uOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgY29udGFpbm1lbnQsIGNvLCB0b3AsIGxlZnQsCgkJCW8gPSB0aGlzLm9wdGlvbnMsCgkJCXNjcm9sbCA9IHRoaXMuY3NzUG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgJiYgISggdGhpcy5zY3JvbGxQYXJlbnRbIDAgXSAhPT0gZG9jdW1lbnQgJiYgJC5jb250YWlucyggdGhpcy5zY3JvbGxQYXJlbnRbIDAgXSwgdGhpcy5vZmZzZXRQYXJlbnRbIDAgXSApICkgPyB0aGlzLm9mZnNldFBhcmVudCA6IHRoaXMuc2Nyb2xsUGFyZW50LAoJCQlwYWdlWCA9IGV2ZW50LnBhZ2VYLAoJCQlwYWdlWSA9IGV2ZW50LnBhZ2VZOwoKCQkvL0NhY2hlIHRoZSBzY3JvbGwKCQlpZiAoIXRoaXMub2Zmc2V0LnNjcm9sbCkgewoJCQl0aGlzLm9mZnNldC5zY3JvbGwgPSB7dG9wIDogc2Nyb2xsLnNjcm9sbFRvcCgpLCBsZWZ0IDogc2Nyb2xsLnNjcm9sbExlZnQoKX07CgkJfQoKCQkvKgoJCSAqIC0gUG9zaXRpb24gY29uc3RyYWluaW5nIC0KCQkgKiBDb25zdHJhaW4gdGhlIHBvc2l0aW9uIHRvIGEgbWl4IG9mIGdyaWQsIGNvbnRhaW5tZW50LgoJCSAqLwoKCQkvLyBJZiB3ZSBhcmUgbm90IGRyYWdnaW5nIHlldCwgd2Ugd29uJ3QgY2hlY2sgZm9yIG9wdGlvbnMKCQlpZiAoIHRoaXMub3JpZ2luYWxQb3NpdGlvbiApIHsKCQkJaWYgKCB0aGlzLmNvbnRhaW5tZW50ICkgewoJCQkJaWYgKCB0aGlzLnJlbGF0aXZlX2NvbnRhaW5lciApewoJCQkJCWNvID0gdGhpcy5yZWxhdGl2ZV9jb250YWluZXIub2Zmc2V0KCk7CgkJCQkJY29udGFpbm1lbnQgPSBbCgkJCQkJCXRoaXMuY29udGFpbm1lbnRbIDAgXSArIGNvLmxlZnQsCgkJCQkJCXRoaXMuY29udGFpbm1lbnRbIDEgXSArIGNvLnRvcCwKCQkJCQkJdGhpcy5jb250YWlubWVudFsgMiBdICsgY28ubGVmdCwKCQkJCQkJdGhpcy5jb250YWlubWVudFsgMyBdICsgY28udG9wCgkJCQkJXTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWNvbnRhaW5tZW50ID0gdGhpcy5jb250YWlubWVudDsKCQkJCX0KCgkJCQlpZihldmVudC5wYWdlWCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPCBjb250YWlubWVudFswXSkgewoJCQkJCXBhZ2VYID0gY29udGFpbm1lbnRbMF0gKyB0aGlzLm9mZnNldC5jbGljay5sZWZ0OwoJCQkJfQoJCQkJaWYoZXZlbnQucGFnZVkgLSB0aGlzLm9mZnNldC5jbGljay50b3AgPCBjb250YWlubWVudFsxXSkgewoJCQkJCXBhZ2VZID0gY29udGFpbm1lbnRbMV0gKyB0aGlzLm9mZnNldC5jbGljay50b3A7CgkJCQl9CgkJCQlpZihldmVudC5wYWdlWCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPiBjb250YWlubWVudFsyXSkgewoJCQkJCXBhZ2VYID0gY29udGFpbm1lbnRbMl0gKyB0aGlzLm9mZnNldC5jbGljay5sZWZ0OwoJCQkJfQoJCQkJaWYoZXZlbnQucGFnZVkgLSB0aGlzLm9mZnNldC5jbGljay50b3AgPiBjb250YWlubWVudFszXSkgewoJCQkJCXBhZ2VZID0gY29udGFpbm1lbnRbM10gKyB0aGlzLm9mZnNldC5jbGljay50b3A7CgkJCQl9CgkJCX0KCgkJCWlmKG8uZ3JpZCkgewoJCQkJLy9DaGVjayBmb3IgZ3JpZCBlbGVtZW50cyBzZXQgdG8gMCB0byBwcmV2ZW50IGRpdmlkZSBieSAwIGVycm9yIGNhdXNpbmcgaW52YWxpZCBhcmd1bWVudCBlcnJvcnMgaW4gSUUgKHNlZSB0aWNrZXQgIzY5NTApCgkJCQl0b3AgPSBvLmdyaWRbMV0gPyB0aGlzLm9yaWdpbmFsUGFnZVkgKyBNYXRoLnJvdW5kKChwYWdlWSAtIHRoaXMub3JpZ2luYWxQYWdlWSkgLyBvLmdyaWRbMV0pICogby5ncmlkWzFdIDogdGhpcy5vcmlnaW5hbFBhZ2VZOwoJCQkJcGFnZVkgPSBjb250YWlubWVudCA/ICgodG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID49IGNvbnRhaW5tZW50WzFdIHx8IHRvcCAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA+IGNvbnRhaW5tZW50WzNdKSA/IHRvcCA6ICgodG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID49IGNvbnRhaW5tZW50WzFdKSA/IHRvcCAtIG8uZ3JpZFsxXSA6IHRvcCArIG8uZ3JpZFsxXSkpIDogdG9wOwoKCQkJCWxlZnQgPSBvLmdyaWRbMF0gPyB0aGlzLm9yaWdpbmFsUGFnZVggKyBNYXRoLnJvdW5kKChwYWdlWCAtIHRoaXMub3JpZ2luYWxQYWdlWCkgLyBvLmdyaWRbMF0pICogby5ncmlkWzBdIDogdGhpcy5vcmlnaW5hbFBhZ2VYOwoJCQkJcGFnZVggPSBjb250YWlubWVudCA/ICgobGVmdCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPj0gY29udGFpbm1lbnRbMF0gfHwgbGVmdCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPiBjb250YWlubWVudFsyXSkgPyBsZWZ0IDogKChsZWZ0IC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA+PSBjb250YWlubWVudFswXSkgPyBsZWZ0IC0gby5ncmlkWzBdIDogbGVmdCArIG8uZ3JpZFswXSkpIDogbGVmdDsKCQkJfQoKCQl9CgoJCXJldHVybiB7CgkJCXRvcDogKAoJCQkJcGFnZVkgLQkJCQkJCQkJCQkJCQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQl0aGlzLm9mZnNldC5jbGljay50b3AJLQkJCQkJCQkJCQkJCS8vIENsaWNrIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQpCgkJCQl0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AgLQkJCQkJCQkJCQkJCS8vIE9ubHkgZm9yIHJlbGF0aXZlIHBvc2l0aW9uZWQgbm9kZXM6IFJlbGF0aXZlIG9mZnNldCBmcm9tIGVsZW1lbnQgdG8gb2Zmc2V0IHBhcmVudAoJCQkJdGhpcy5vZmZzZXQucGFyZW50LnRvcCArCQkJCQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSggdGhpcy5jc3NQb3NpdGlvbiA9PT0gImZpeGVkIiA/IC10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSA6IHRoaXMub2Zmc2V0LnNjcm9sbC50b3AgKQoJCQkpLAoJCQlsZWZ0OiAoCgkJCQlwYWdlWCAtCQkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgLQkJCQkJCQkJCQkJCS8vIENsaWNrIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQpCgkJCQl0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0IC0JCQkJCQkJCQkJCQkvLyBPbmx5IGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIG5vZGVzOiBSZWxhdGl2ZSBvZmZzZXQgZnJvbSBlbGVtZW50IHRvIG9mZnNldCBwYXJlbnQKCQkJCXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0ICsJCQkJCQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJKCB0aGlzLmNzc1Bvc2l0aW9uID09PSAiZml4ZWQiID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSA6IHRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0ICkKCQkJKQoJCX07CgoJfSwKCglfY2xlYXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKTsKCQlpZih0aGlzLmhlbHBlclswXSAhPT0gdGhpcy5lbGVtZW50WzBdICYmICF0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwpIHsKCQkJdGhpcy5oZWxwZXIucmVtb3ZlKCk7CgkJfQoJCXRoaXMuaGVscGVyID0gbnVsbDsKCQl0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwgPSBmYWxzZTsKCX0sCgoJLy8gRnJvbSBub3cgb24gYnVsayBzdHVmZiAtIG1haW5seSBoZWxwZXJzCgoJX3RyaWdnZXI6IGZ1bmN0aW9uKHR5cGUsIGV2ZW50LCB1aSkgewoJCXVpID0gdWkgfHwgdGhpcy5fdWlIYXNoKCk7CgkJJC51aS5wbHVnaW4uY2FsbCh0aGlzLCB0eXBlLCBbZXZlbnQsIHVpXSk7CgkJLy9UaGUgYWJzb2x1dGUgcG9zaXRpb24gaGFzIHRvIGJlIHJlY2FsY3VsYXRlZCBhZnRlciBwbHVnaW5zCgkJaWYodHlwZSA9PT0gImRyYWciKSB7CgkJCXRoaXMucG9zaXRpb25BYnMgPSB0aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKTsKCQl9CgkJcmV0dXJuICQuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5jYWxsKHRoaXMsIHR5cGUsIGV2ZW50LCB1aSk7Cgl9LAoKCXBsdWdpbnM6IHt9LAoKCV91aUhhc2g6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB7CgkJCWhlbHBlcjogdGhpcy5oZWxwZXIsCgkJCXBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLAoJCQlvcmlnaW5hbFBvc2l0aW9uOiB0aGlzLm9yaWdpbmFsUG9zaXRpb24sCgkJCW9mZnNldDogdGhpcy5wb3NpdGlvbkFicwoJCX07Cgl9Cgp9KTsKCiQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwgImNvbm5lY3RUb1NvcnRhYmxlIiwgewoJc3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoKCQl2YXIgaW5zdCA9ICQodGhpcykuZGF0YSgidWktZHJhZ2dhYmxlIiksIG8gPSBpbnN0Lm9wdGlvbnMsCgkJCXVpU29ydGFibGUgPSAkLmV4dGVuZCh7fSwgdWksIHsgaXRlbTogaW5zdC5lbGVtZW50IH0pOwoJCWluc3Quc29ydGFibGVzID0gW107CgkJJChvLmNvbm5lY3RUb1NvcnRhYmxlKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc29ydGFibGUgPSAkLmRhdGEodGhpcywgInVpLXNvcnRhYmxlIik7CgkJCWlmIChzb3J0YWJsZSAmJiAhc29ydGFibGUub3B0aW9ucy5kaXNhYmxlZCkgewoJCQkJaW5zdC5zb3J0YWJsZXMucHVzaCh7CgkJCQkJaW5zdGFuY2U6IHNvcnRhYmxlLAoJCQkJCXNob3VsZFJldmVydDogc29ydGFibGUub3B0aW9ucy5yZXZlcnQKCQkJCX0pOwoJCQkJc29ydGFibGUucmVmcmVzaFBvc2l0aW9ucygpOwkvLyBDYWxsIHRoZSBzb3J0YWJsZSdzIHJlZnJlc2hQb3NpdGlvbnMgYXQgZHJhZyBzdGFydCB0byByZWZyZXNoIHRoZSBjb250YWluZXJDYWNoZSBzaW5jZSB0aGUgc29ydGFibGUgY29udGFpbmVyIGNhY2hlIGlzIHVzZWQgaW4gZHJhZyBhbmQgbmVlZHMgdG8gYmUgdXAgdG8gZGF0ZSAodGhpcyB3aWxsIGVuc3VyZSBpdCdzIGluaXRpYWxpc2VkIGFzIHdlbGwgYXMgYmVpbmcga2VwdCBpbiBzdGVwIHdpdGggYW55IGNoYW5nZXMgdGhhdCBtaWdodCBoYXZlIGhhcHBlbmVkIG9uIHRoZSBwYWdlKS4KCQkJCXNvcnRhYmxlLl90cmlnZ2VyKCJhY3RpdmF0ZSIsIGV2ZW50LCB1aVNvcnRhYmxlKTsKCQkJfQoJCX0pOwoKCX0sCglzdG9wOiBmdW5jdGlvbihldmVudCwgdWkpIHsKCgkJLy9JZiB3ZSBhcmUgc3RpbGwgb3ZlciB0aGUgc29ydGFibGUsIHdlIGZha2UgdGhlIHN0b3AgZXZlbnQgb2YgdGhlIHNvcnRhYmxlLCBidXQgYWxzbyByZW1vdmUgaGVscGVyCgkJdmFyIGluc3QgPSAkKHRoaXMpLmRhdGEoInVpLWRyYWdnYWJsZSIpLAoJCQl1aVNvcnRhYmxlID0gJC5leHRlbmQoe30sIHVpLCB7IGl0ZW06IGluc3QuZWxlbWVudCB9KTsKCgkJJC5lYWNoKGluc3Quc29ydGFibGVzLCBmdW5jdGlvbigpIHsKCQkJaWYodGhpcy5pbnN0YW5jZS5pc092ZXIpIHsKCgkJCQl0aGlzLmluc3RhbmNlLmlzT3ZlciA9IDA7CgoJCQkJaW5zdC5jYW5jZWxIZWxwZXJSZW1vdmFsID0gdHJ1ZTsgLy9Eb24ndCByZW1vdmUgdGhlIGhlbHBlciBpbiB0aGUgZHJhZ2dhYmxlIGluc3RhbmNlCgkJCQl0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWwgPSBmYWxzZTsgLy9SZW1vdmUgaXQgaW4gdGhlIHNvcnRhYmxlIGluc3RhbmNlIChzbyBzb3J0YWJsZSBwbHVnaW5zIGxpa2UgcmV2ZXJ0IHN0aWxsIHdvcmspCgoJCQkJLy9UaGUgc29ydGFibGUgcmV2ZXJ0IGlzIHN1cHBvcnRlZCwgYW5kIHdlIGhhdmUgdG8gc2V0IGEgdGVtcG9yYXJ5IGRyb3BwZWQgdmFyaWFibGUgb24gdGhlIGRyYWdnYWJsZSB0byBzdXBwb3J0IHJldmVydDogInZhbGlkL2ludmFsaWQiCgkJCQlpZih0aGlzLnNob3VsZFJldmVydCkgewoJCQkJCXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQgPSB0aGlzLnNob3VsZFJldmVydDsKCQkJCX0KCgkJCQkvL1RyaWdnZXIgdGhlIHN0b3Agb2YgdGhlIHNvcnRhYmxlCgkJCQl0aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AoZXZlbnQpOwoKCQkJCXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXIgPSB0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcjsKCgkJCQkvL0lmIHRoZSBoZWxwZXIgaGFzIGJlZW4gdGhlIG9yaWdpbmFsIGl0ZW0sIHJlc3RvcmUgcHJvcGVydGllcyBpbiB0aGUgc29ydGFibGUKCQkJCWlmKGluc3Qub3B0aW9ucy5oZWxwZXIgPT09ICJvcmlnaW5hbCIpIHsKCQkJCQl0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtLmNzcyh7IHRvcDogImF1dG8iLCBsZWZ0OiAiYXV0byIgfSk7CgkJCQl9CgoJCQl9IGVsc2UgewoJCQkJdGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsID0gZmFsc2U7IC8vUmVtb3ZlIHRoZSBoZWxwZXIgaW4gdGhlIHNvcnRhYmxlIGluc3RhbmNlCgkJCQl0aGlzLmluc3RhbmNlLl90cmlnZ2VyKCJkZWFjdGl2YXRlIiwgZXZlbnQsIHVpU29ydGFibGUpOwoJCQl9CgoJCX0pOwoKCX0sCglkcmFnOiBmdW5jdGlvbihldmVudCwgdWkpIHsKCgkJdmFyIGluc3QgPSAkKHRoaXMpLmRhdGEoInVpLWRyYWdnYWJsZSIpLCB0aGF0ID0gdGhpczsKCgkJJC5lYWNoKGluc3Quc29ydGFibGVzLCBmdW5jdGlvbigpIHsKCgkJCXZhciBpbm5lcm1vc3RJbnRlcnNlY3RpbmcgPSBmYWxzZSwKCQkJCXRoaXNTb3J0YWJsZSA9IHRoaXM7CgoJCQkvL0NvcHkgb3ZlciBzb21lIHZhcmlhYmxlcyB0byBhbGxvdyBjYWxsaW5nIHRoZSBzb3J0YWJsZSdzIG5hdGl2ZSBfaW50ZXJzZWN0c1dpdGgKCQkJdGhpcy5pbnN0YW5jZS5wb3NpdGlvbkFicyA9IGluc3QucG9zaXRpb25BYnM7CgkJCXRoaXMuaW5zdGFuY2UuaGVscGVyUHJvcG9ydGlvbnMgPSBpbnN0LmhlbHBlclByb3BvcnRpb25zOwoJCQl0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljayA9IGluc3Qub2Zmc2V0LmNsaWNrOwoKCQkJaWYodGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkpIHsKCQkJCWlubmVybW9zdEludGVyc2VjdGluZyA9IHRydWU7CgkJCQkkLmVhY2goaW5zdC5zb3J0YWJsZXMsIGZ1bmN0aW9uICgpIHsKCQkJCQl0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzID0gaW5zdC5wb3NpdGlvbkFiczsKCQkJCQl0aGlzLmluc3RhbmNlLmhlbHBlclByb3BvcnRpb25zID0gaW5zdC5oZWxwZXJQcm9wb3J0aW9uczsKCQkJCQl0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljayA9IGluc3Qub2Zmc2V0LmNsaWNrOwoJCQkJCWlmICh0aGlzICE9PSB0aGlzU29ydGFibGUgJiYKCQkJCQkJdGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkgJiYKCQkJCQkJJC5jb250YWlucyh0aGlzU29ydGFibGUuaW5zdGFuY2UuZWxlbWVudFswXSwgdGhpcy5pbnN0YW5jZS5lbGVtZW50WzBdKQoJCQkJCSkgewoJCQkJCQlpbm5lcm1vc3RJbnRlcnNlY3RpbmcgPSBmYWxzZTsKCQkJCQl9CgkJCQkJcmV0dXJuIGlubmVybW9zdEludGVyc2VjdGluZzsKCQkJCX0pOwoJCQl9CgoKCQkJaWYoaW5uZXJtb3N0SW50ZXJzZWN0aW5nKSB7CgkJCQkvL0lmIGl0IGludGVyc2VjdHMsIHdlIHVzZSBhIGxpdHRsZSBpc092ZXIgdmFyaWFibGUgYW5kIHNldCBpdCBvbmNlLCBzbyBvdXIgbW92ZS1pbiBzdHVmZiBnZXRzIGZpcmVkIG9ubHkgb25jZQoJCQkJaWYoIXRoaXMuaW5zdGFuY2UuaXNPdmVyKSB7CgoJCQkJCXRoaXMuaW5zdGFuY2UuaXNPdmVyID0gMTsKCQkJCQkvL05vdyB3ZSBmYWtlIHRoZSBzdGFydCBvZiBkcmFnZ2luZyBmb3IgdGhlIHNvcnRhYmxlIGluc3RhbmNlLAoJCQkJCS8vYnkgY2xvbmluZyB0aGUgbGlzdCBncm91cCBpdGVtLCBhcHBlbmRpbmcgaXQgdG8gdGhlIHNvcnRhYmxlIGFuZCB1c2luZyBpdCBhcyBpbnN0LmN1cnJlbnRJdGVtCgkJCQkJLy9XZSBjYW4gdGhlbiBmaXJlIHRoZSBzdGFydCBldmVudCBvZiB0aGUgc29ydGFibGUgd2l0aCBvdXIgcGFzc2VkIGJyb3dzZXIgZXZlbnQsIGFuZCBvdXIgb3duIGhlbHBlciAoc28gaXQgZG9lc24ndCBjcmVhdGUgYSBuZXcgb25lKQoJCQkJCXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0gPSAkKHRoYXQpLmNsb25lKCkucmVtb3ZlQXR0cigiaWQiKS5hcHBlbmRUbyh0aGlzLmluc3RhbmNlLmVsZW1lbnQpLmRhdGEoInVpLXNvcnRhYmxlLWl0ZW0iLCB0cnVlKTsKCQkJCQl0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlciA9IHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI7IC8vU3RvcmUgaGVscGVyIG9wdGlvbiB0byBsYXRlciByZXN0b3JlIGl0CgkJCQkJdGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlciA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdWkuaGVscGVyWzBdOyB9OwoKCQkJCQlldmVudC50YXJnZXQgPSB0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtWzBdOwoJCQkJCXRoaXMuaW5zdGFuY2UuX21vdXNlQ2FwdHVyZShldmVudCwgdHJ1ZSk7CgkJCQkJdGhpcy5pbnN0YW5jZS5fbW91c2VTdGFydChldmVudCwgdHJ1ZSwgdHJ1ZSk7CgoJCQkJCS8vQmVjYXVzZSB0aGUgYnJvd3NlciBldmVudCBpcyB3YXkgb2ZmIHRoZSBuZXcgYXBwZW5kZWQgcG9ydGxldCwgd2UgbW9kaWZ5IGEgY291cGxlIG9mIHZhcmlhYmxlcyB0byByZWZsZWN0IHRoZSBjaGFuZ2VzCgkJCQkJdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wID0gaW5zdC5vZmZzZXQuY2xpY2sudG9wOwoJCQkJCXRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrLmxlZnQgPSBpbnN0Lm9mZnNldC5jbGljay5sZWZ0OwoJCQkJCXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0IC09IGluc3Qub2Zmc2V0LnBhcmVudC5sZWZ0IC0gdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQ7CgkJCQkJdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcCAtPSBpbnN0Lm9mZnNldC5wYXJlbnQudG9wIC0gdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcDsKCgkJCQkJaW5zdC5fdHJpZ2dlcigidG9Tb3J0YWJsZSIsIGV2ZW50KTsKCQkJCQlpbnN0LmRyb3BwZWQgPSB0aGlzLmluc3RhbmNlLmVsZW1lbnQ7IC8vZHJhZ2dhYmxlIHJldmVydCBuZWVkcyB0aGF0CgkJCQkJLy9oYWNrIHNvIHJlY2VpdmUvdXBkYXRlIGNhbGxiYWNrcyB3b3JrIChtb3N0bHkpCgkJCQkJaW5zdC5jdXJyZW50SXRlbSA9IGluc3QuZWxlbWVudDsKCQkJCQl0aGlzLmluc3RhbmNlLmZyb21PdXRzaWRlID0gaW5zdDsKCgkJCQl9CgoJCQkJLy9Qcm92aWRlZCB3ZSBkaWQgYWxsIHRoZSBwcmV2aW91cyBzdGVwcywgd2UgY2FuIGZpcmUgdGhlIGRyYWcgZXZlbnQgb2YgdGhlIHNvcnRhYmxlIG9uIGV2ZXJ5IGRyYWdnYWJsZSBkcmFnLCB3aGVuIGl0IGludGVyc2VjdHMgd2l0aCB0aGUgc29ydGFibGUKCQkJCWlmKHRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0pIHsKCQkJCQl0aGlzLmluc3RhbmNlLl9tb3VzZURyYWcoZXZlbnQpOwoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQkvL0lmIGl0IGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggdGhlIHNvcnRhYmxlLCBhbmQgaXQgaW50ZXJzZWN0ZWQgYmVmb3JlLAoJCQkJLy93ZSBmYWtlIHRoZSBkcmFnIHN0b3Agb2YgdGhlIHNvcnRhYmxlLCBidXQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgcmVtb3ZlIHRoZSBoZWxwZXIgYnkgdXNpbmcgY2FuY2VsSGVscGVyUmVtb3ZhbAoJCQkJaWYodGhpcy5pbnN0YW5jZS5pc092ZXIpIHsKCgkJCQkJdGhpcy5pbnN0YW5jZS5pc092ZXIgPSAwOwoJCQkJCXRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbCA9IHRydWU7CgoJCQkJCS8vUHJldmVudCByZXZlcnRpbmcgb24gdGhpcyBmb3JjZWQgc3RvcAoJCQkJCXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQgPSBmYWxzZTsKCgkJCQkJLy8gVGhlIG91dCBldmVudCBuZWVkcyB0byBiZSB0cmlnZ2VyZWQgaW5kZXBlbmRlbnRseQoJCQkJCXRoaXMuaW5zdGFuY2UuX3RyaWdnZXIoIm91dCIsIGV2ZW50LCB0aGlzLmluc3RhbmNlLl91aUhhc2godGhpcy5pbnN0YW5jZSkpOwoKCQkJCQl0aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AoZXZlbnQsIHRydWUpOwoJCQkJCXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXIgPSB0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcjsKCgkJCQkJLy9Ob3cgd2UgcmVtb3ZlIG91ciBjdXJyZW50SXRlbSwgdGhlIGxpc3QgZ3JvdXAgY2xvbmUgYWdhaW4sIGFuZCB0aGUgcGxhY2Vob2xkZXIsIGFuZCBhbmltYXRlIHRoZSBoZWxwZXIgYmFjayB0byBpdCdzIG9yaWdpbmFsIHNpemUKCQkJCQl0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtLnJlbW92ZSgpOwoJCQkJCWlmKHRoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXIpIHsKCQkJCQkJdGhpcy5pbnN0YW5jZS5wbGFjZWhvbGRlci5yZW1vdmUoKTsKCQkJCQl9CgoJCQkJCWluc3QuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsIGV2ZW50KTsKCQkJCQlpbnN0LmRyb3BwZWQgPSBmYWxzZTsgLy9kcmFnZ2FibGUgcmV2ZXJ0IG5lZWRzIHRoYXQKCQkJCX0KCgkJCX0KCgkJfSk7CgoJfQp9KTsKCiQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwgImN1cnNvciIsIHsKCXN0YXJ0OiBmdW5jdGlvbigpIHsKCQl2YXIgdCA9ICQoImJvZHkiKSwgbyA9ICQodGhpcykuZGF0YSgidWktZHJhZ2dhYmxlIikub3B0aW9uczsKCQlpZiAodC5jc3MoImN1cnNvciIpKSB7CgkJCW8uX2N1cnNvciA9IHQuY3NzKCJjdXJzb3IiKTsKCQl9CgkJdC5jc3MoImN1cnNvciIsIG8uY3Vyc29yKTsKCX0sCglzdG9wOiBmdW5jdGlvbigpIHsKCQl2YXIgbyA9ICQodGhpcykuZGF0YSgidWktZHJhZ2dhYmxlIikub3B0aW9uczsKCQlpZiAoby5fY3Vyc29yKSB7CgkJCSQoImJvZHkiKS5jc3MoImN1cnNvciIsIG8uX2N1cnNvcik7CgkJfQoJfQp9KTsKCiQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwgIm9wYWNpdHkiLCB7CglzdGFydDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgkJdmFyIHQgPSAkKHVpLmhlbHBlciksIG8gPSAkKHRoaXMpLmRhdGEoInVpLWRyYWdnYWJsZSIpLm9wdGlvbnM7CgkJaWYodC5jc3MoIm9wYWNpdHkiKSkgewoJCQlvLl9vcGFjaXR5ID0gdC5jc3MoIm9wYWNpdHkiKTsKCQl9CgkJdC5jc3MoIm9wYWNpdHkiLCBvLm9wYWNpdHkpOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCXZhciBvID0gJCh0aGlzKS5kYXRhKCJ1aS1kcmFnZ2FibGUiKS5vcHRpb25zOwoJCWlmKG8uX29wYWNpdHkpIHsKCQkJJCh1aS5oZWxwZXIpLmNzcygib3BhY2l0eSIsIG8uX29wYWNpdHkpOwoJCX0KCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJzY3JvbGwiLCB7CglzdGFydDogZnVuY3Rpb24oKSB7CgkJdmFyIGkgPSAkKHRoaXMpLmRhdGEoInVpLWRyYWdnYWJsZSIpOwoJCWlmKGkuc2Nyb2xsUGFyZW50WzBdICE9PSBkb2N1bWVudCAmJiBpLnNjcm9sbFBhcmVudFswXS50YWdOYW1lICE9PSAiSFRNTCIpIHsKCQkJaS5vdmVyZmxvd09mZnNldCA9IGkuc2Nyb2xsUGFyZW50Lm9mZnNldCgpOwoJCX0KCX0sCglkcmFnOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCXZhciBpID0gJCh0aGlzKS5kYXRhKCJ1aS1kcmFnZ2FibGUiKSwgbyA9IGkub3B0aW9ucywgc2Nyb2xsZWQgPSBmYWxzZTsKCgkJaWYoaS5zY3JvbGxQYXJlbnRbMF0gIT09IGRvY3VtZW50ICYmIGkuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUgIT09ICJIVE1MIikgewoKCQkJaWYoIW8uYXhpcyB8fCBvLmF4aXMgIT09ICJ4IikgewoJCQkJaWYoKGkub3ZlcmZsb3dPZmZzZXQudG9wICsgaS5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0KSAtIGV2ZW50LnBhZ2VZIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCWkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCA9IHNjcm9sbGVkID0gaS5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wICsgby5zY3JvbGxTcGVlZDsKCQkJCX0gZWxzZSBpZihldmVudC5wYWdlWSAtIGkub3ZlcmZsb3dPZmZzZXQudG9wIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCWkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCA9IHNjcm9sbGVkID0gaS5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wIC0gby5zY3JvbGxTcGVlZDsKCQkJCX0KCQkJfQoKCQkJaWYoIW8uYXhpcyB8fCBvLmF4aXMgIT09ICJ5IikgewoJCQkJaWYoKGkub3ZlcmZsb3dPZmZzZXQubGVmdCArIGkuc2Nyb2xsUGFyZW50WzBdLm9mZnNldFdpZHRoKSAtIGV2ZW50LnBhZ2VYIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCWkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgPSBzY3JvbGxlZCA9IGkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgKyBvLnNjcm9sbFNwZWVkOwoJCQkJfSBlbHNlIGlmKGV2ZW50LnBhZ2VYIC0gaS5vdmVyZmxvd09mZnNldC5sZWZ0IDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCWkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgPSBzY3JvbGxlZCA9IGkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgLSBvLnNjcm9sbFNwZWVkOwoJCQkJfQoJCQl9CgoJCX0gZWxzZSB7CgoJCQlpZighby5heGlzIHx8IG8uYXhpcyAhPT0gIngiKSB7CgkJCQlpZihldmVudC5wYWdlWSAtICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIC0gby5zY3JvbGxTcGVlZCk7CgkJCQl9IGVsc2UgaWYoJCh3aW5kb3cpLmhlaWdodCgpIC0gKGV2ZW50LnBhZ2VZIC0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCkpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpICsgby5zY3JvbGxTcGVlZCk7CgkJCQl9CgkJCX0KCgkJCWlmKCFvLmF4aXMgfHwgby5heGlzICE9PSAieSIpIHsKCQkJCWlmKGV2ZW50LnBhZ2VYIC0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgLSBvLnNjcm9sbFNwZWVkKTsKCQkJCX0gZWxzZSBpZigkKHdpbmRvdykud2lkdGgoKSAtIChldmVudC5wYWdlWCAtICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSkgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KSB7CgkJCQkJc2Nyb2xsZWQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSArIG8uc2Nyb2xsU3BlZWQpOwoJCQkJfQoJCQl9CgoJCX0KCgkJaWYoc2Nyb2xsZWQgIT09IGZhbHNlICYmICQudWkuZGRtYW5hZ2VyICYmICFvLmRyb3BCZWhhdmlvdXIpIHsKCQkJJC51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoaSwgZXZlbnQpOwoJCX0KCgl9Cn0pOwoKJC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCAic25hcCIsIHsKCXN0YXJ0OiBmdW5jdGlvbigpIHsKCgkJdmFyIGkgPSAkKHRoaXMpLmRhdGEoInVpLWRyYWdnYWJsZSIpLAoJCQlvID0gaS5vcHRpb25zOwoKCQlpLnNuYXBFbGVtZW50cyA9IFtdOwoKCQkkKG8uc25hcC5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nID8gKCBvLnNuYXAuaXRlbXMgfHwgIjpkYXRhKHVpLWRyYWdnYWJsZSkiICkgOiBvLnNuYXApLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciAkdCA9ICQodGhpcyksCgkJCQkkbyA9ICR0Lm9mZnNldCgpOwoJCQlpZih0aGlzICE9PSBpLmVsZW1lbnRbMF0pIHsKCQkJCWkuc25hcEVsZW1lbnRzLnB1c2goewoJCQkJCWl0ZW06IHRoaXMsCgkJCQkJd2lkdGg6ICR0Lm91dGVyV2lkdGgoKSwgaGVpZ2h0OiAkdC5vdXRlckhlaWdodCgpLAoJCQkJCXRvcDogJG8udG9wLCBsZWZ0OiAkby5sZWZ0CgkJCQl9KTsKCQkJfQoJCX0pOwoKCX0sCglkcmFnOiBmdW5jdGlvbihldmVudCwgdWkpIHsKCgkJdmFyIHRzLCBicywgbHMsIHJzLCBsLCByLCB0LCBiLCBpLCBmaXJzdCwKCQkJaW5zdCA9ICQodGhpcykuZGF0YSgidWktZHJhZ2dhYmxlIiksCgkJCW8gPSBpbnN0Lm9wdGlvbnMsCgkJCWQgPSBvLnNuYXBUb2xlcmFuY2UsCgkJCXgxID0gdWkub2Zmc2V0LmxlZnQsIHgyID0geDEgKyBpbnN0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLAoJCQl5MSA9IHVpLm9mZnNldC50b3AsIHkyID0geTEgKyBpbnN0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodDsKCgkJZm9yIChpID0gaW5zdC5zbmFwRWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pewoKCQkJbCA9IGluc3Quc25hcEVsZW1lbnRzW2ldLmxlZnQ7CgkJCXIgPSBsICsgaW5zdC5zbmFwRWxlbWVudHNbaV0ud2lkdGg7CgkJCXQgPSBpbnN0LnNuYXBFbGVtZW50c1tpXS50b3A7CgkJCWIgPSB0ICsgaW5zdC5zbmFwRWxlbWVudHNbaV0uaGVpZ2h0OwoKCQkJaWYgKCB4MiA8IGwgLSBkIHx8IHgxID4gciArIGQgfHwgeTIgPCB0IC0gZCB8fCB5MSA+IGIgKyBkIHx8ICEkLmNvbnRhaW5zKCBpbnN0LnNuYXBFbGVtZW50c1sgaSBdLml0ZW0ub3duZXJEb2N1bWVudCwgaW5zdC5zbmFwRWxlbWVudHNbIGkgXS5pdGVtICkgKSB7CgkJCQlpZihpbnN0LnNuYXBFbGVtZW50c1tpXS5zbmFwcGluZykgewoJCQkJCShpbnN0Lm9wdGlvbnMuc25hcC5yZWxlYXNlICYmIGluc3Qub3B0aW9ucy5zbmFwLnJlbGVhc2UuY2FsbChpbnN0LmVsZW1lbnQsIGV2ZW50LCAkLmV4dGVuZChpbnN0Ll91aUhhc2goKSwgeyBzbmFwSXRlbTogaW5zdC5zbmFwRWxlbWVudHNbaV0uaXRlbSB9KSkpOwoJCQkJfQoJCQkJaW5zdC5zbmFwRWxlbWVudHNbaV0uc25hcHBpbmcgPSBmYWxzZTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZihvLnNuYXBNb2RlICE9PSAiaW5uZXIiKSB7CgkJCQl0cyA9IE1hdGguYWJzKHQgLSB5MikgPD0gZDsKCQkJCWJzID0gTWF0aC5hYnMoYiAtIHkxKSA8PSBkOwoJCQkJbHMgPSBNYXRoLmFicyhsIC0geDIpIDw9IGQ7CgkJCQlycyA9IE1hdGguYWJzKHIgLSB4MSkgPD0gZDsKCQkJCWlmKHRzKSB7CgkJCQkJdWkucG9zaXRpb24udG9wID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IHQgLSBpbnN0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodCwgbGVmdDogMCB9KS50b3AgLSBpbnN0Lm1hcmdpbnMudG9wOwoJCQkJfQoJCQkJaWYoYnMpIHsKCQkJCQl1aS5wb3NpdGlvbi50b3AgPSBpbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLCB7IHRvcDogYiwgbGVmdDogMCB9KS50b3AgLSBpbnN0Lm1hcmdpbnMudG9wOwoJCQkJfQoJCQkJaWYobHMpIHsKCQkJCQl1aS5wb3NpdGlvbi5sZWZ0ID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IDAsIGxlZnQ6IGwgLSBpbnN0LmhlbHBlclByb3BvcnRpb25zLndpZHRoIH0pLmxlZnQgLSBpbnN0Lm1hcmdpbnMubGVmdDsKCQkJCX0KCQkJCWlmKHJzKSB7CgkJCQkJdWkucG9zaXRpb24ubGVmdCA9IGluc3QuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIsIHsgdG9wOiAwLCBsZWZ0OiByIH0pLmxlZnQgLSBpbnN0Lm1hcmdpbnMubGVmdDsKCQkJCX0KCQkJfQoKCQkJZmlyc3QgPSAodHMgfHwgYnMgfHwgbHMgfHwgcnMpOwoKCQkJaWYoby5zbmFwTW9kZSAhPT0gIm91dGVyIikgewoJCQkJdHMgPSBNYXRoLmFicyh0IC0geTEpIDw9IGQ7CgkJCQlicyA9IE1hdGguYWJzKGIgLSB5MikgPD0gZDsKCQkJCWxzID0gTWF0aC5hYnMobCAtIHgxKSA8PSBkOwoJCQkJcnMgPSBNYXRoLmFicyhyIC0geDIpIDw9IGQ7CgkJCQlpZih0cykgewoJCQkJCXVpLnBvc2l0aW9uLnRvcCA9IGluc3QuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIsIHsgdG9wOiB0LCBsZWZ0OiAwIH0pLnRvcCAtIGluc3QubWFyZ2lucy50b3A7CgkJCQl9CgkJCQlpZihicykgewoJCQkJCXVpLnBvc2l0aW9uLnRvcCA9IGluc3QuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIsIHsgdG9wOiBiIC0gaW5zdC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsIGxlZnQ6IDAgfSkudG9wIC0gaW5zdC5tYXJnaW5zLnRvcDsKCQkJCX0KCQkJCWlmKGxzKSB7CgkJCQkJdWkucG9zaXRpb24ubGVmdCA9IGluc3QuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIsIHsgdG9wOiAwLCBsZWZ0OiBsIH0pLmxlZnQgLSBpbnN0Lm1hcmdpbnMubGVmdDsKCQkJCX0KCQkJCWlmKHJzKSB7CgkJCQkJdWkucG9zaXRpb24ubGVmdCA9IGluc3QuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIsIHsgdG9wOiAwLCBsZWZ0OiByIC0gaW5zdC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCB9KS5sZWZ0IC0gaW5zdC5tYXJnaW5zLmxlZnQ7CgkJCQl9CgkJCX0KCgkJCWlmKCFpbnN0LnNuYXBFbGVtZW50c1tpXS5zbmFwcGluZyAmJiAodHMgfHwgYnMgfHwgbHMgfHwgcnMgfHwgZmlyc3QpKSB7CgkJCQkoaW5zdC5vcHRpb25zLnNuYXAuc25hcCAmJiBpbnN0Lm9wdGlvbnMuc25hcC5zbmFwLmNhbGwoaW5zdC5lbGVtZW50LCBldmVudCwgJC5leHRlbmQoaW5zdC5fdWlIYXNoKCksIHsgc25hcEl0ZW06IGluc3Quc25hcEVsZW1lbnRzW2ldLml0ZW0gfSkpKTsKCQkJfQoJCQlpbnN0LnNuYXBFbGVtZW50c1tpXS5zbmFwcGluZyA9ICh0cyB8fCBicyB8fCBscyB8fCBycyB8fCBmaXJzdCk7CgoJCX0KCgl9Cn0pOwoKJC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCAic3RhY2siLCB7CglzdGFydDogZnVuY3Rpb24oKSB7CgkJdmFyIG1pbiwKCQkJbyA9IHRoaXMuZGF0YSgidWktZHJhZ2dhYmxlIikub3B0aW9ucywKCQkJZ3JvdXAgPSAkLm1ha2VBcnJheSgkKG8uc3RhY2spKS5zb3J0KGZ1bmN0aW9uKGEsYikgewoJCQkJcmV0dXJuIChwYXJzZUludCgkKGEpLmNzcygiekluZGV4IiksMTApIHx8IDApIC0gKHBhcnNlSW50KCQoYikuY3NzKCJ6SW5kZXgiKSwxMCkgfHwgMCk7CgkJCX0pOwoKCQlpZiAoIWdyb3VwLmxlbmd0aCkgeyByZXR1cm47IH0KCgkJbWluID0gcGFyc2VJbnQoJChncm91cFswXSkuY3NzKCJ6SW5kZXgiKSwgMTApIHx8IDA7CgkJJChncm91cCkuZWFjaChmdW5jdGlvbihpKSB7CgkJCSQodGhpcykuY3NzKCJ6SW5kZXgiLCBtaW4gKyBpKTsKCQl9KTsKCQl0aGlzLmNzcygiekluZGV4IiwgKG1pbiArIGdyb3VwLmxlbmd0aCkpOwoJfQp9KTsKCiQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwgInpJbmRleCIsIHsKCXN0YXJ0OiBmdW5jdGlvbihldmVudCwgdWkpIHsKCQl2YXIgdCA9ICQodWkuaGVscGVyKSwgbyA9ICQodGhpcykuZGF0YSgidWktZHJhZ2dhYmxlIikub3B0aW9uczsKCQlpZih0LmNzcygiekluZGV4IikpIHsKCQkJby5fekluZGV4ID0gdC5jc3MoInpJbmRleCIpOwoJCX0KCQl0LmNzcygiekluZGV4Iiwgby56SW5kZXgpOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCXZhciBvID0gJCh0aGlzKS5kYXRhKCJ1aS1kcmFnZ2FibGUiKS5vcHRpb25zOwoJCWlmKG8uX3pJbmRleCkgewoJCQkkKHVpLmhlbHBlcikuY3NzKCJ6SW5kZXgiLCBvLl96SW5kZXgpOwoJCX0KCX0KfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgpmdW5jdGlvbiBpc092ZXJBeGlzKCB4LCByZWZlcmVuY2UsIHNpemUgKSB7CglyZXR1cm4gKCB4ID4gcmVmZXJlbmNlICkgJiYgKCB4IDwgKCByZWZlcmVuY2UgKyBzaXplICkgKTsKfQoKJC53aWRnZXQoInVpLmRyb3BwYWJsZSIsIHsKCXZlcnNpb246ICIxLjEwLjMiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICJkcm9wIiwKCW9wdGlvbnM6IHsKCQlhY2NlcHQ6ICIqIiwKCQlhY3RpdmVDbGFzczogZmFsc2UsCgkJYWRkQ2xhc3NlczogdHJ1ZSwKCQlncmVlZHk6IGZhbHNlLAoJCWhvdmVyQ2xhc3M6IGZhbHNlLAoJCXNjb3BlOiAiZGVmYXVsdCIsCgkJdG9sZXJhbmNlOiAiaW50ZXJzZWN0IiwKCgkJLy8gY2FsbGJhY2tzCgkJYWN0aXZhdGU6IG51bGwsCgkJZGVhY3RpdmF0ZTogbnVsbCwKCQlkcm9wOiBudWxsLAoJCW91dDogbnVsbCwKCQlvdmVyOiBudWxsCgl9LAoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zLAoJCQlhY2NlcHQgPSBvLmFjY2VwdDsKCgkJdGhpcy5pc292ZXIgPSBmYWxzZTsKCQl0aGlzLmlzb3V0ID0gdHJ1ZTsKCgkJdGhpcy5hY2NlcHQgPSAkLmlzRnVuY3Rpb24oYWNjZXB0KSA/IGFjY2VwdCA6IGZ1bmN0aW9uKGQpIHsKCQkJcmV0dXJuIGQuaXMoYWNjZXB0KTsKCQl9OwoKCQkvL1N0b3JlIHRoZSBkcm9wcGFibGUncyBwcm9wb3J0aW9ucwoJCXRoaXMucHJvcG9ydGlvbnMgPSB7IHdpZHRoOiB0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsIGhlaWdodDogdGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodCB9OwoKCQkvLyBBZGQgdGhlIHJlZmVyZW5jZSBhbmQgcG9zaXRpb25zIHRvIHRoZSBtYW5hZ2VyCgkJJC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tvLnNjb3BlXSA9ICQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbby5zY29wZV0gfHwgW107CgkJJC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tvLnNjb3BlXS5wdXNoKHRoaXMpOwoKCQkoby5hZGRDbGFzc2VzICYmIHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJvcHBhYmxlIikpOwoKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXZhciBpID0gMCwKCQkJZHJvcCA9ICQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTsKCgkJZm9yICggOyBpIDwgZHJvcC5sZW5ndGg7IGkrKyApIHsKCQkJaWYgKCBkcm9wW2ldID09PSB0aGlzICkgewoJCQkJZHJvcC5zcGxpY2UoaSwgMSk7CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJvcHBhYmxlIHVpLWRyb3BwYWJsZS1kaXNhYmxlZCIpOwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CgoJCWlmKGtleSA9PT0gImFjY2VwdCIpIHsKCQkJdGhpcy5hY2NlcHQgPSAkLmlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUgOiBmdW5jdGlvbihkKSB7CgkJCQlyZXR1cm4gZC5pcyh2YWx1ZSk7CgkJCX07CgkJfQoJCSQuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cgl9LAoKCV9hY3RpdmF0ZTogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgZHJhZ2dhYmxlID0gJC51aS5kZG1hbmFnZXIuY3VycmVudDsKCQlpZih0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpIHsKCQkJdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyk7CgkJfQoJCWlmKGRyYWdnYWJsZSl7CgkJCXRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIiwgZXZlbnQsIHRoaXMudWkoZHJhZ2dhYmxlKSk7CgkJfQoJfSwKCglfZGVhY3RpdmF0ZTogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgZHJhZ2dhYmxlID0gJC51aS5kZG1hbmFnZXIuY3VycmVudDsKCQlpZih0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpIHsKCQkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyk7CgkJfQoJCWlmKGRyYWdnYWJsZSl7CgkJCXRoaXMuX3RyaWdnZXIoImRlYWN0aXZhdGUiLCBldmVudCwgdGhpcy51aShkcmFnZ2FibGUpKTsKCQl9Cgl9LAoKCV9vdmVyOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgZHJhZ2dhYmxlID0gJC51aS5kZG1hbmFnZXIuY3VycmVudDsKCgkJLy8gQmFpbCBpZiBkcmFnZ2FibGUgYW5kIGRyb3BwYWJsZSBhcmUgc2FtZSBlbGVtZW50CgkJaWYgKCFkcmFnZ2FibGUgfHwgKGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2FibGUuZWxlbWVudClbMF0gPT09IHRoaXMuZWxlbWVudFswXSkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAodGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sKGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2FibGUuZWxlbWVudCkpKSB7CgkJCWlmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSB7CgkJCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpOwoJCQl9CgkJCXRoaXMuX3RyaWdnZXIoIm92ZXIiLCBldmVudCwgdGhpcy51aShkcmFnZ2FibGUpKTsKCQl9CgoJfSwKCglfb3V0OiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgZHJhZ2dhYmxlID0gJC51aS5kZG1hbmFnZXIuY3VycmVudDsKCgkJLy8gQmFpbCBpZiBkcmFnZ2FibGUgYW5kIGRyb3BwYWJsZSBhcmUgc2FtZSBlbGVtZW50CgkJaWYgKCFkcmFnZ2FibGUgfHwgKGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2FibGUuZWxlbWVudClbMF0gPT09IHRoaXMuZWxlbWVudFswXSkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAodGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sKGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2FibGUuZWxlbWVudCkpKSB7CgkJCWlmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSB7CgkJCQl0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpOwoJCQl9CgkJCXRoaXMuX3RyaWdnZXIoIm91dCIsIGV2ZW50LCB0aGlzLnVpKGRyYWdnYWJsZSkpOwoJCX0KCgl9LAoKCV9kcm9wOiBmdW5jdGlvbihldmVudCxjdXN0b20pIHsKCgkJdmFyIGRyYWdnYWJsZSA9IGN1c3RvbSB8fCAkLnVpLmRkbWFuYWdlci5jdXJyZW50LAoJCQljaGlsZHJlbkludGVyc2VjdGlvbiA9IGZhbHNlOwoKCQkvLyBCYWlsIGlmIGRyYWdnYWJsZSBhbmQgZHJvcHBhYmxlIGFyZSBzYW1lIGVsZW1lbnQKCQlpZiAoIWRyYWdnYWJsZSB8fCAoZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdnYWJsZS5lbGVtZW50KVswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXRoaXMuZWxlbWVudC5maW5kKCI6ZGF0YSh1aS1kcm9wcGFibGUpIikubm90KCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIikuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGluc3QgPSAkLmRhdGEodGhpcywgInVpLWRyb3BwYWJsZSIpOwoJCQlpZigKCQkJCWluc3Qub3B0aW9ucy5ncmVlZHkgJiYKCQkJCSFpbnN0Lm9wdGlvbnMuZGlzYWJsZWQgJiYKCQkJCWluc3Qub3B0aW9ucy5zY29wZSA9PT0gZHJhZ2dhYmxlLm9wdGlvbnMuc2NvcGUgJiYKCQkJCWluc3QuYWNjZXB0LmNhbGwoaW5zdC5lbGVtZW50WzBdLCAoZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdnYWJsZS5lbGVtZW50KSkgJiYKCQkJCSQudWkuaW50ZXJzZWN0KGRyYWdnYWJsZSwgJC5leHRlbmQoaW5zdCwgeyBvZmZzZXQ6IGluc3QuZWxlbWVudC5vZmZzZXQoKSB9KSwgaW5zdC5vcHRpb25zLnRvbGVyYW5jZSkKCQkJKSB7IGNoaWxkcmVuSW50ZXJzZWN0aW9uID0gdHJ1ZTsgcmV0dXJuIGZhbHNlOyB9CgkJfSk7CgkJaWYoY2hpbGRyZW5JbnRlcnNlY3Rpb24pIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYodGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sKGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2FibGUuZWxlbWVudCkpKSB7CgkJCWlmKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcykgewoJCQkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyk7CgkJCX0KCQkJaWYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpIHsKCQkJCXRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyk7CgkJCX0KCQkJdGhpcy5fdHJpZ2dlcigiZHJvcCIsIGV2ZW50LCB0aGlzLnVpKGRyYWdnYWJsZSkpOwoJCQlyZXR1cm4gdGhpcy5lbGVtZW50OwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoKCX0sCgoJdWk6IGZ1bmN0aW9uKGMpIHsKCQlyZXR1cm4gewoJCQlkcmFnZ2FibGU6IChjLmN1cnJlbnRJdGVtIHx8IGMuZWxlbWVudCksCgkJCWhlbHBlcjogYy5oZWxwZXIsCgkJCXBvc2l0aW9uOiBjLnBvc2l0aW9uLAoJCQlvZmZzZXQ6IGMucG9zaXRpb25BYnMKCQl9OwoJfQoKfSk7CgokLnVpLmludGVyc2VjdCA9IGZ1bmN0aW9uKGRyYWdnYWJsZSwgZHJvcHBhYmxlLCB0b2xlcmFuY2VNb2RlKSB7CgoJaWYgKCFkcm9wcGFibGUub2Zmc2V0KSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXZhciBkcmFnZ2FibGVMZWZ0LCBkcmFnZ2FibGVUb3AsCgkJeDEgPSAoZHJhZ2dhYmxlLnBvc2l0aW9uQWJzIHx8IGRyYWdnYWJsZS5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCwgeDIgPSB4MSArIGRyYWdnYWJsZS5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCwKCQl5MSA9IChkcmFnZ2FibGUucG9zaXRpb25BYnMgfHwgZHJhZ2dhYmxlLnBvc2l0aW9uLmFic29sdXRlKS50b3AsIHkyID0geTEgKyBkcmFnZ2FibGUuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LAoJCWwgPSBkcm9wcGFibGUub2Zmc2V0LmxlZnQsIHIgPSBsICsgZHJvcHBhYmxlLnByb3BvcnRpb25zLndpZHRoLAoJCXQgPSBkcm9wcGFibGUub2Zmc2V0LnRvcCwgYiA9IHQgKyBkcm9wcGFibGUucHJvcG9ydGlvbnMuaGVpZ2h0OwoKCXN3aXRjaCAodG9sZXJhbmNlTW9kZSkgewoJCWNhc2UgImZpdCI6CgkJCXJldHVybiAobCA8PSB4MSAmJiB4MiA8PSByICYmIHQgPD0geTEgJiYgeTIgPD0gYik7CgkJY2FzZSAiaW50ZXJzZWN0IjoKCQkJcmV0dXJuIChsIDwgeDEgKyAoZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC8gMikgJiYgLy8gUmlnaHQgSGFsZgoJCQkJeDIgLSAoZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC8gMikgPCByICYmIC8vIExlZnQgSGFsZgoJCQkJdCA8IHkxICsgKGRyYWdnYWJsZS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLyAyKSAmJiAvLyBCb3R0b20gSGFsZgoJCQkJeTIgLSAoZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAvIDIpIDwgYiApOyAvLyBUb3AgSGFsZgoJCWNhc2UgInBvaW50ZXIiOgoJCQlkcmFnZ2FibGVMZWZ0ID0gKChkcmFnZ2FibGUucG9zaXRpb25BYnMgfHwgZHJhZ2dhYmxlLnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0ICsgKGRyYWdnYWJsZS5jbGlja09mZnNldCB8fCBkcmFnZ2FibGUub2Zmc2V0LmNsaWNrKS5sZWZ0KTsKCQkJZHJhZ2dhYmxlVG9wID0gKChkcmFnZ2FibGUucG9zaXRpb25BYnMgfHwgZHJhZ2dhYmxlLnBvc2l0aW9uLmFic29sdXRlKS50b3AgKyAoZHJhZ2dhYmxlLmNsaWNrT2Zmc2V0IHx8IGRyYWdnYWJsZS5vZmZzZXQuY2xpY2spLnRvcCk7CgkJCXJldHVybiBpc092ZXJBeGlzKCBkcmFnZ2FibGVUb3AsIHQsIGRyb3BwYWJsZS5wcm9wb3J0aW9ucy5oZWlnaHQgKSAmJiBpc092ZXJBeGlzKCBkcmFnZ2FibGVMZWZ0LCBsLCBkcm9wcGFibGUucHJvcG9ydGlvbnMud2lkdGggKTsKCQljYXNlICJ0b3VjaCI6CgkJCXJldHVybiAoCgkJCQkoeTEgPj0gdCAmJiB5MSA8PSBiKSB8fAkvLyBUb3AgZWRnZSB0b3VjaGluZwoJCQkJKHkyID49IHQgJiYgeTIgPD0gYikgfHwJLy8gQm90dG9tIGVkZ2UgdG91Y2hpbmcKCQkJCSh5MSA8IHQgJiYgeTIgPiBiKQkJLy8gU3Vycm91bmRlZCB2ZXJ0aWNhbGx5CgkJCSkgJiYgKAoJCQkJKHgxID49IGwgJiYgeDEgPD0gcikgfHwJLy8gTGVmdCBlZGdlIHRvdWNoaW5nCgkJCQkoeDIgPj0gbCAmJiB4MiA8PSByKSB8fAkvLyBSaWdodCBlZGdlIHRvdWNoaW5nCgkJCQkoeDEgPCBsICYmIHgyID4gcikJCS8vIFN1cnJvdW5kZWQgaG9yaXpvbnRhbGx5CgkJCSk7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCn07CgovKgoJVGhpcyBtYW5hZ2VyIHRyYWNrcyBvZmZzZXRzIG9mIGRyYWdnYWJsZXMgYW5kIGRyb3BwYWJsZXMKKi8KJC51aS5kZG1hbmFnZXIgPSB7CgljdXJyZW50OiBudWxsLAoJZHJvcHBhYmxlczogeyAiZGVmYXVsdCI6IFtdIH0sCglwcmVwYXJlT2Zmc2V0czogZnVuY3Rpb24odCwgZXZlbnQpIHsKCgkJdmFyIGksIGosCgkJCW0gPSAkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV0gfHwgW10sCgkJCXR5cGUgPSBldmVudCA/IGV2ZW50LnR5cGUgOiBudWxsLCAvLyB3b3JrYXJvdW5kIGZvciAjMjMxNwoJCQlsaXN0ID0gKHQuY3VycmVudEl0ZW0gfHwgdC5lbGVtZW50KS5maW5kKCI6ZGF0YSh1aS1kcm9wcGFibGUpIikuYWRkQmFjaygpOwoKCQlkcm9wcGFibGVzTG9vcDogZm9yIChpID0gMDsgaSA8IG0ubGVuZ3RoOyBpKyspIHsKCgkJCS8vTm8gZGlzYWJsZWQgYW5kIG5vbi1hY2NlcHRlZAoJCQlpZihtW2ldLm9wdGlvbnMuZGlzYWJsZWQgfHwgKHQgJiYgIW1baV0uYWNjZXB0LmNhbGwobVtpXS5lbGVtZW50WzBdLCh0LmN1cnJlbnRJdGVtIHx8IHQuZWxlbWVudCkpKSkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIEZpbHRlciBvdXQgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgZHJhZ2dlZCBpdGVtCgkJCWZvciAoaj0wOyBqIDwgbGlzdC5sZW5ndGg7IGorKykgewoJCQkJaWYobGlzdFtqXSA9PT0gbVtpXS5lbGVtZW50WzBdKSB7CgkJCQkJbVtpXS5wcm9wb3J0aW9ucy5oZWlnaHQgPSAwOwoJCQkJCWNvbnRpbnVlIGRyb3BwYWJsZXNMb29wOwoJCQkJfQoJCQl9CgoJCQltW2ldLnZpc2libGUgPSBtW2ldLmVsZW1lbnQuY3NzKCJkaXNwbGF5IikgIT09ICJub25lIjsKCQkJaWYoIW1baV0udmlzaWJsZSkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vQWN0aXZhdGUgdGhlIGRyb3BwYWJsZSBpZiB1c2VkIGRpcmVjdGx5IGZyb20gZHJhZ2dhYmxlcwoJCQlpZih0eXBlID09PSAibW91c2Vkb3duIikgewoJCQkJbVtpXS5fYWN0aXZhdGUuY2FsbChtW2ldLCBldmVudCk7CgkJCX0KCgkJCW1baV0ub2Zmc2V0ID0gbVtpXS5lbGVtZW50Lm9mZnNldCgpOwoJCQltW2ldLnByb3BvcnRpb25zID0geyB3aWR0aDogbVtpXS5lbGVtZW50WzBdLm9mZnNldFdpZHRoLCBoZWlnaHQ6IG1baV0uZWxlbWVudFswXS5vZmZzZXRIZWlnaHQgfTsKCgkJfQoKCX0sCglkcm9wOiBmdW5jdGlvbihkcmFnZ2FibGUsIGV2ZW50KSB7CgoJCXZhciBkcm9wcGVkID0gZmFsc2U7CgkJLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgZHJvcHBhYmxlcyBpbiBjYXNlIHRoZSBsaXN0IGNoYW5nZXMgZHVyaW5nIHRoZSBkcm9wICgjOTExNikKCQkkLmVhY2goKCQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbZHJhZ2dhYmxlLm9wdGlvbnMuc2NvcGVdIHx8IFtdKS5zbGljZSgpLCBmdW5jdGlvbigpIHsKCgkJCWlmKCF0aGlzLm9wdGlvbnMpIHsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCAmJiB0aGlzLnZpc2libGUgJiYgJC51aS5pbnRlcnNlY3QoZHJhZ2dhYmxlLCB0aGlzLCB0aGlzLm9wdGlvbnMudG9sZXJhbmNlKSkgewoJCQkJZHJvcHBlZCA9IHRoaXMuX2Ryb3AuY2FsbCh0aGlzLCBldmVudCkgfHwgZHJvcHBlZDsKCQkJfQoKCQkJaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQgJiYgdGhpcy52aXNpYmxlICYmIHRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLChkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxlLmVsZW1lbnQpKSkgewoJCQkJdGhpcy5pc291dCA9IHRydWU7CgkJCQl0aGlzLmlzb3ZlciA9IGZhbHNlOwoJCQkJdGhpcy5fZGVhY3RpdmF0ZS5jYWxsKHRoaXMsIGV2ZW50KTsKCQkJfQoKCQl9KTsKCQlyZXR1cm4gZHJvcHBlZDsKCgl9LAoJZHJhZ1N0YXJ0OiBmdW5jdGlvbiggZHJhZ2dhYmxlLCBldmVudCApIHsKCQkvL0xpc3RlbiBmb3Igc2Nyb2xsaW5nIHNvIHRoYXQgaWYgdGhlIGRyYWdnaW5nIGNhdXNlcyBzY3JvbGxpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcm9wcGFibGVzIGNhbiBiZSByZWNhbGN1bGF0ZWQgKHNlZSAjNTAwMykKCQlkcmFnZ2FibGUuZWxlbWVudC5wYXJlbnRzVW50aWwoICJib2R5IiApLmJpbmQoICJzY3JvbGwuZHJvcHBhYmxlIiwgZnVuY3Rpb24oKSB7CgkJCWlmKCAhZHJhZ2dhYmxlLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9ucyApIHsKCQkJCSQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKCBkcmFnZ2FibGUsIGV2ZW50ICk7CgkJCX0KCQl9KTsKCX0sCglkcmFnOiBmdW5jdGlvbihkcmFnZ2FibGUsIGV2ZW50KSB7CgoJCS8vSWYgeW91IGhhdmUgYSBoaWdobHkgZHluYW1pYyBwYWdlLCB5b3UgbWlnaHQgdHJ5IHRoaXMgb3B0aW9uLiBJdCByZW5kZXJzIHBvc2l0aW9ucyBldmVyeSB0aW1lIHlvdSBtb3ZlIHRoZSBtb3VzZS4KCQlpZihkcmFnZ2FibGUub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zKSB7CgkJCSQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGRyYWdnYWJsZSwgZXZlbnQpOwoJCX0KCgkJLy9SdW4gdGhyb3VnaCBhbGwgZHJvcHBhYmxlcyBhbmQgY2hlY2sgdGhlaXIgcG9zaXRpb25zIGJhc2VkIG9uIHNwZWNpZmljIHRvbGVyYW5jZSBvcHRpb25zCgkJJC5lYWNoKCQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbZHJhZ2dhYmxlLm9wdGlvbnMuc2NvcGVdIHx8IFtdLCBmdW5jdGlvbigpIHsKCgkJCWlmKHRoaXMub3B0aW9ucy5kaXNhYmxlZCB8fCB0aGlzLmdyZWVkeUNoaWxkIHx8ICF0aGlzLnZpc2libGUpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJdmFyIHBhcmVudEluc3RhbmNlLCBzY29wZSwgcGFyZW50LAoJCQkJaW50ZXJzZWN0cyA9ICQudWkuaW50ZXJzZWN0KGRyYWdnYWJsZSwgdGhpcywgdGhpcy5vcHRpb25zLnRvbGVyYW5jZSksCgkJCQljID0gIWludGVyc2VjdHMgJiYgdGhpcy5pc292ZXIgPyAiaXNvdXQiIDogKGludGVyc2VjdHMgJiYgIXRoaXMuaXNvdmVyID8gImlzb3ZlciIgOiBudWxsKTsKCQkJaWYoIWMpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKHRoaXMub3B0aW9ucy5ncmVlZHkpIHsKCQkJCS8vIGZpbmQgZHJvcHBhYmxlIHBhcmVudHMgd2l0aCBzYW1lIHNjb3BlCgkJCQlzY29wZSA9IHRoaXMub3B0aW9ucy5zY29wZTsKCQkJCXBhcmVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnRzKCI6ZGF0YSh1aS1kcm9wcGFibGUpIikuZmlsdGVyKGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gJC5kYXRhKHRoaXMsICJ1aS1kcm9wcGFibGUiKS5vcHRpb25zLnNjb3BlID09PSBzY29wZTsKCQkJCX0pOwoKCQkJCWlmIChwYXJlbnQubGVuZ3RoKSB7CgkJCQkJcGFyZW50SW5zdGFuY2UgPSAkLmRhdGEocGFyZW50WzBdLCAidWktZHJvcHBhYmxlIik7CgkJCQkJcGFyZW50SW5zdGFuY2UuZ3JlZWR5Q2hpbGQgPSAoYyA9PT0gImlzb3ZlciIpOwoJCQkJfQoJCQl9CgoJCQkvLyB3ZSBqdXN0IG1vdmVkIGludG8gYSBncmVlZHkgY2hpbGQKCQkJaWYgKHBhcmVudEluc3RhbmNlICYmIGMgPT09ICJpc292ZXIiKSB7CgkJCQlwYXJlbnRJbnN0YW5jZS5pc292ZXIgPSBmYWxzZTsKCQkJCXBhcmVudEluc3RhbmNlLmlzb3V0ID0gdHJ1ZTsKCQkJCXBhcmVudEluc3RhbmNlLl9vdXQuY2FsbChwYXJlbnRJbnN0YW5jZSwgZXZlbnQpOwoJCQl9CgoJCQl0aGlzW2NdID0gdHJ1ZTsKCQkJdGhpc1tjID09PSAiaXNvdXQiID8gImlzb3ZlciIgOiAiaXNvdXQiXSA9IGZhbHNlOwoJCQl0aGlzW2MgPT09ICJpc292ZXIiID8gIl9vdmVyIiA6ICJfb3V0Il0uY2FsbCh0aGlzLCBldmVudCk7CgoJCQkvLyB3ZSBqdXN0IG1vdmVkIG91dCBvZiBhIGdyZWVkeSBjaGlsZAoJCQlpZiAocGFyZW50SW5zdGFuY2UgJiYgYyA9PT0gImlzb3V0IikgewoJCQkJcGFyZW50SW5zdGFuY2UuaXNvdXQgPSBmYWxzZTsKCQkJCXBhcmVudEluc3RhbmNlLmlzb3ZlciA9IHRydWU7CgkJCQlwYXJlbnRJbnN0YW5jZS5fb3Zlci5jYWxsKHBhcmVudEluc3RhbmNlLCBldmVudCk7CgkJCX0KCQl9KTsKCgl9LAoJZHJhZ1N0b3A6IGZ1bmN0aW9uKCBkcmFnZ2FibGUsIGV2ZW50ICkgewoJCWRyYWdnYWJsZS5lbGVtZW50LnBhcmVudHNVbnRpbCggImJvZHkiICkudW5iaW5kKCAic2Nyb2xsLmRyb3BwYWJsZSIgKTsKCQkvL0NhbGwgcHJlcGFyZU9mZnNldHMgb25lIGZpbmFsIHRpbWUgc2luY2UgSUUgZG9lcyBub3QgZmlyZSByZXR1cm4gc2Nyb2xsIGV2ZW50cyB3aGVuIG92ZXJmbG93IHdhcyBjYXVzZWQgYnkgZHJhZyAoc2VlICM1MDAzKQoJCWlmKCAhZHJhZ2dhYmxlLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9ucyApIHsKCQkJJC51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoIGRyYWdnYWJsZSwgZXZlbnQgKTsKCQl9Cgl9Cn07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgpmdW5jdGlvbiBudW0odikgewoJcmV0dXJuIHBhcnNlSW50KHYsIDEwKSB8fCAwOwp9CgpmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkgewoJcmV0dXJuICFpc05hTihwYXJzZUludCh2YWx1ZSwgMTApKTsKfQoKJC53aWRnZXQoInVpLnJlc2l6YWJsZSIsICQudWkubW91c2UsIHsKCXZlcnNpb246ICIxLjEwLjMiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICJyZXNpemUiLAoJb3B0aW9uczogewoJCWFsc29SZXNpemU6IGZhbHNlLAoJCWFuaW1hdGU6IGZhbHNlLAoJCWFuaW1hdGVEdXJhdGlvbjogInNsb3ciLAoJCWFuaW1hdGVFYXNpbmc6ICJzd2luZyIsCgkJYXNwZWN0UmF0aW86IGZhbHNlLAoJCWF1dG9IaWRlOiBmYWxzZSwKCQljb250YWlubWVudDogZmFsc2UsCgkJZ2hvc3Q6IGZhbHNlLAoJCWdyaWQ6IGZhbHNlLAoJCWhhbmRsZXM6ICJlLHMsc2UiLAoJCWhlbHBlcjogZmFsc2UsCgkJbWF4SGVpZ2h0OiBudWxsLAoJCW1heFdpZHRoOiBudWxsLAoJCW1pbkhlaWdodDogMTAsCgkJbWluV2lkdGg6IDEwLAoJCS8vIFNlZSAjNzk2MAoJCXpJbmRleDogOTAsCgoJCS8vIGNhbGxiYWNrcwoJCXJlc2l6ZTogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsCgl9LAoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgoJCXZhciBuLCBpLCBoYW5kbGUsIGF4aXMsIGhuYW1lLAoJCQl0aGF0ID0gdGhpcywKCQkJbyA9IHRoaXMub3B0aW9uczsKCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZSIpOwoKCQkkLmV4dGVuZCh0aGlzLCB7CgkJCV9hc3BlY3RSYXRpbzogISEoby5hc3BlY3RSYXRpbyksCgkJCWFzcGVjdFJhdGlvOiBvLmFzcGVjdFJhdGlvLAoJCQlvcmlnaW5hbEVsZW1lbnQ6IHRoaXMuZWxlbWVudCwKCQkJX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHM6IFtdLAoJCQlfaGVscGVyOiBvLmhlbHBlciB8fCBvLmdob3N0IHx8IG8uYW5pbWF0ZSA/IG8uaGVscGVyIHx8ICJ1aS1yZXNpemFibGUtaGVscGVyIiA6IG51bGwKCQl9KTsKCgkJLy9XcmFwIHRoZSBlbGVtZW50IGlmIGl0IGNhbm5vdCBob2xkIGNoaWxkIG5vZGVzCgkJaWYodGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcvaSkpIHsKCgkJCS8vQ3JlYXRlIGEgd3JhcHBlciBlbGVtZW50IGFuZCBzZXQgdGhlIHdyYXBwZXIgdG8gdGhlIG5ldyBjdXJyZW50IGludGVybmFsIGVsZW1lbnQKCQkJdGhpcy5lbGVtZW50LndyYXAoCgkJCQkkKCI8ZGl2IGNsYXNzPSd1aS13cmFwcGVyJyBzdHlsZT0nb3ZlcmZsb3c6IGhpZGRlbjsnPjwvZGl2PiIpLmNzcyh7CgkJCQkJcG9zaXRpb246IHRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIiksCgkJCQkJd2lkdGg6IHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksCgkJCQkJaGVpZ2h0OiB0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSwKCQkJCQl0b3A6IHRoaXMuZWxlbWVudC5jc3MoInRvcCIpLAoJCQkJCWxlZnQ6IHRoaXMuZWxlbWVudC5jc3MoImxlZnQiKQoJCQkJfSkKCQkJKTsKCgkJCS8vT3ZlcndyaXRlIHRoZSBvcmlnaW5hbCB0aGlzLmVsZW1lbnQKCQkJdGhpcy5lbGVtZW50ID0gdGhpcy5lbGVtZW50LnBhcmVudCgpLmRhdGEoCgkJCQkidWktcmVzaXphYmxlIiwgdGhpcy5lbGVtZW50LmRhdGEoInVpLXJlc2l6YWJsZSIpCgkJCSk7CgoJCQl0aGlzLmVsZW1lbnRJc1dyYXBwZXIgPSB0cnVlOwoKCQkJLy9Nb3ZlIG1hcmdpbnMgdG8gdGhlIHdyYXBwZXIKCQkJdGhpcy5lbGVtZW50LmNzcyh7IG1hcmdpbkxlZnQ6IHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLCBtYXJnaW5Ub3A6IHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luVG9wIiksIG1hcmdpblJpZ2h0OiB0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksIG1hcmdpbkJvdHRvbTogdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSB9KTsKCQkJdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHsgbWFyZ2luTGVmdDogMCwgbWFyZ2luVG9wOiAwLCBtYXJnaW5SaWdodDogMCwgbWFyZ2luQm90dG9tOiAwfSk7CgoJCQkvL1ByZXZlbnQgU2FmYXJpIHRleHRhcmVhIHJlc2l6ZQoJCQl0aGlzLm9yaWdpbmFsUmVzaXplU3R5bGUgPSB0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIpOwoJCQl0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsICJub25lIik7CgoJCQkvL1B1c2ggdGhlIGFjdHVhbCBlbGVtZW50IHRvIG91ciBwcm9wb3J0aW9uYWxseVJlc2l6ZSBpbnRlcm5hbCBhcnJheQoJCQl0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLnB1c2godGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHsgcG9zaXRpb246ICJzdGF0aWMiLCB6b29tOiAxLCBkaXNwbGF5OiAiYmxvY2siIH0pKTsKCgkJCS8vIGF2b2lkIElFIGp1bXAgKGhhcmQgc2V0IHRoZSBtYXJnaW4pCgkJCXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7IG1hcmdpbjogdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW4iKSB9KTsKCgkJCS8vIGZpeCBoYW5kbGVycyBvZmZzZXQKCQkJdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKTsKCgkJfQoKCQl0aGlzLmhhbmRsZXMgPSBvLmhhbmRsZXMgfHwgKCEkKCIudWktcmVzaXphYmxlLWhhbmRsZSIsIHRoaXMuZWxlbWVudCkubGVuZ3RoID8gImUscyxzZSIgOiB7IG46ICIudWktcmVzaXphYmxlLW4iLCBlOiAiLnVpLXJlc2l6YWJsZS1lIiwgczogIi51aS1yZXNpemFibGUtcyIsIHc6ICIudWktcmVzaXphYmxlLXciLCBzZTogIi51aS1yZXNpemFibGUtc2UiLCBzdzogIi51aS1yZXNpemFibGUtc3ciLCBuZTogIi51aS1yZXNpemFibGUtbmUiLCBudzogIi51aS1yZXNpemFibGUtbnciIH0pOwoJCWlmKHRoaXMuaGFuZGxlcy5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7CgoJCQlpZiAoIHRoaXMuaGFuZGxlcyA9PT0gImFsbCIpIHsKCQkJCXRoaXMuaGFuZGxlcyA9ICJuLGUscyx3LHNlLHN3LG5lLG53IjsKCQkJfQoKCQkJbiA9IHRoaXMuaGFuZGxlcy5zcGxpdCgiLCIpOwoJCQl0aGlzLmhhbmRsZXMgPSB7fTsKCgkJCWZvcihpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspIHsKCgkJCQloYW5kbGUgPSAkLnRyaW0obltpXSk7CgkJCQlobmFtZSA9ICJ1aS1yZXNpemFibGUtIitoYW5kbGU7CgkJCQlheGlzID0gJCgiPGRpdiBjbGFzcz0ndWktcmVzaXphYmxlLWhhbmRsZSAiICsgaG5hbWUgKyAiJz48L2Rpdj4iKTsKCgkJCQkvLyBBcHBseSB6SW5kZXggdG8gYWxsIGhhbmRsZXMgLSBzZWUgIzc5NjAKCQkJCWF4aXMuY3NzKHsgekluZGV4OiBvLnpJbmRleCB9KTsKCgkJCQkvL1RPRE8gOiBXaGF0J3MgZ29pbmcgb24gaGVyZT8KCQkJCWlmICgic2UiID09PSBoYW5kbGUpIHsKCQkJCQlheGlzLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIik7CgkJCQl9CgoJCQkJLy9JbnNlcnQgaW50byBpbnRlcm5hbCBoYW5kbGVzIG9iamVjdCBhbmQgYXBwZW5kIHRvIGVsZW1lbnQKCQkJCXRoaXMuaGFuZGxlc1toYW5kbGVdID0gIi51aS1yZXNpemFibGUtIitoYW5kbGU7CgkJCQl0aGlzLmVsZW1lbnQuYXBwZW5kKGF4aXMpOwoJCQl9CgoJCX0KCgkJdGhpcy5fcmVuZGVyQXhpcyA9IGZ1bmN0aW9uKHRhcmdldCkgewoKCQkJdmFyIGksIGF4aXMsIHBhZFBvcywgcGFkV3JhcHBlcjsKCgkJCXRhcmdldCA9IHRhcmdldCB8fCB0aGlzLmVsZW1lbnQ7CgoJCQlmb3IoaSBpbiB0aGlzLmhhbmRsZXMpIHsKCgkJCQlpZih0aGlzLmhhbmRsZXNbaV0uY29uc3RydWN0b3IgPT09IFN0cmluZykgewoJCQkJCXRoaXMuaGFuZGxlc1tpXSA9ICQodGhpcy5oYW5kbGVzW2ldLCB0aGlzLmVsZW1lbnQpLnNob3coKTsKCQkJCX0KCgkJCQkvL0FwcGx5IHBhZCB0byB3cmFwcGVyIGVsZW1lbnQsIG5lZWRlZCB0byBmaXggYXhpcyBwb3NpdGlvbiAodGV4dGFyZWEsIGlucHV0cywgc2Nyb2xscykKCQkJCWlmICh0aGlzLmVsZW1lbnRJc1dyYXBwZXIgJiYgdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL3RleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b24vaSkpIHsKCgkJCQkJYXhpcyA9ICQodGhpcy5oYW5kbGVzW2ldLCB0aGlzLmVsZW1lbnQpOwoKCQkJCQkvL0NoZWNraW5nIHRoZSBjb3JyZWN0IHBhZCBhbmQgYm9yZGVyCgkJCQkJcGFkV3JhcHBlciA9IC9zd3xuZXxud3xzZXxufHMvLnRlc3QoaSkgPyBheGlzLm91dGVySGVpZ2h0KCkgOiBheGlzLm91dGVyV2lkdGgoKTsKCgkJCQkJLy9UaGUgcGFkZGluZyB0eXBlIGkgaGF2ZSB0byBhcHBseS4uLgoJCQkJCXBhZFBvcyA9IFsgInBhZGRpbmciLAoJCQkJCQkvbmV8bnd8bi8udGVzdChpKSA/ICJUb3AiIDoKCQkJCQkJL3NlfHN3fHMvLnRlc3QoaSkgPyAiQm90dG9tIiA6CgkJCQkJCS9eZSQvLnRlc3QoaSkgPyAiUmlnaHQiIDogIkxlZnQiIF0uam9pbigiIik7CgoJCQkJCXRhcmdldC5jc3MocGFkUG9zLCBwYWRXcmFwcGVyKTsKCgkJCQkJdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKTsKCgkJCQl9CgoJCQkJLy9UT0RPOiBXaGF0J3MgdGhhdCBnb29kIGZvcj8gVGhlcmUncyBub3QgYW55dGhpbmcgdG8gYmUgZXhlY3V0ZWQgbGVmdAoJCQkJaWYoISQodGhpcy5oYW5kbGVzW2ldKS5sZW5ndGgpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJfQoJCX07CgoJCS8vVE9ETzogbWFrZSByZW5kZXJBeGlzIGEgcHJvdG90eXBlIGZ1bmN0aW9uCgkJdGhpcy5fcmVuZGVyQXhpcyh0aGlzLmVsZW1lbnQpOwoKCQl0aGlzLl9oYW5kbGVzID0gJCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiLCB0aGlzLmVsZW1lbnQpCgkJCS5kaXNhYmxlU2VsZWN0aW9uKCk7CgoJCS8vTWF0Y2hpbmcgYXhpcyBuYW1lCgkJdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKSB7CgkJCWlmICghdGhhdC5yZXNpemluZykgewoJCQkJaWYgKHRoaXMuY2xhc3NOYW1lKSB7CgkJCQkJYXhpcyA9IHRoaXMuY2xhc3NOYW1lLm1hdGNoKC91aS1yZXNpemFibGUtKHNlfHN3fG5lfG53fG58ZXxzfHcpL2kpOwoJCQkJfQoJCQkJLy9BeGlzLCBkZWZhdWx0ID0gc2UKCQkJCXRoYXQuYXhpcyA9IGF4aXMgJiYgYXhpc1sxXSA/IGF4aXNbMV0gOiAic2UiOwoJCQl9CgkJfSk7CgoJCS8vSWYgd2Ugd2FudCB0byBhdXRvIGhpZGUgdGhlIGVsZW1lbnRzCgkJaWYgKG8uYXV0b0hpZGUpIHsKCQkJdGhpcy5faGFuZGxlcy5oaWRlKCk7CgkJCSQodGhpcy5lbGVtZW50KQoJCQkJLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKQoJCQkJLm1vdXNlZW50ZXIoZnVuY3Rpb24oKSB7CgkJCQkJaWYgKG8uZGlzYWJsZWQpIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQkkKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKTsKCQkJCQl0aGF0Ll9oYW5kbGVzLnNob3coKTsKCQkJCX0pCgkJCQkubW91c2VsZWF2ZShmdW5jdGlvbigpewoJCQkJCWlmIChvLmRpc2FibGVkKSB7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJaWYgKCF0aGF0LnJlc2l6aW5nKSB7CgkJCQkJCSQodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpOwoJCQkJCQl0aGF0Ll9oYW5kbGVzLmhpZGUoKTsKCQkJCQl9CgkJCQl9KTsKCQl9CgoJCS8vSW5pdGlhbGl6ZSB0aGUgbW91c2UgaW50ZXJhY3Rpb24KCQl0aGlzLl9tb3VzZUluaXQoKTsKCgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCgkJdGhpcy5fbW91c2VEZXN0cm95KCk7CgoJCXZhciB3cmFwcGVyLAoJCQlfZGVzdHJveSA9IGZ1bmN0aW9uKGV4cCkgewoJCQkJJChleHApLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUgdWktcmVzaXphYmxlLWRpc2FibGVkIHVpLXJlc2l6YWJsZS1yZXNpemluZyIpCgkJCQkJLnJlbW92ZURhdGEoInJlc2l6YWJsZSIpLnJlbW92ZURhdGEoInVpLXJlc2l6YWJsZSIpLnVuYmluZCgiLnJlc2l6YWJsZSIpLmZpbmQoIi51aS1yZXNpemFibGUtaGFuZGxlIikucmVtb3ZlKCk7CgkJCX07CgoJCS8vVE9ETzogVW53cmFwIGF0IHNhbWUgRE9NIHBvc2l0aW9uCgkJaWYgKHRoaXMuZWxlbWVudElzV3JhcHBlcikgewoJCQlfZGVzdHJveSh0aGlzLmVsZW1lbnQpOwoJCQl3cmFwcGVyID0gdGhpcy5lbGVtZW50OwoJCQl0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoewoJCQkJcG9zaXRpb246IHdyYXBwZXIuY3NzKCJwb3NpdGlvbiIpLAoJCQkJd2lkdGg6IHdyYXBwZXIub3V0ZXJXaWR0aCgpLAoJCQkJaGVpZ2h0OiB3cmFwcGVyLm91dGVySGVpZ2h0KCksCgkJCQl0b3A6IHdyYXBwZXIuY3NzKCJ0b3AiKSwKCQkJCWxlZnQ6IHdyYXBwZXIuY3NzKCJsZWZ0IikKCQkJfSkuaW5zZXJ0QWZ0ZXIoIHdyYXBwZXIgKTsKCQkJd3JhcHBlci5yZW1vdmUoKTsKCQl9CgoJCXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiwgdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlKTsKCQlfZGVzdHJveSh0aGlzLm9yaWdpbmFsRWxlbWVudCk7CgoJCXJldHVybiB0aGlzOwoJfSwKCglfbW91c2VDYXB0dXJlOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBpLCBoYW5kbGUsCgkJCWNhcHR1cmUgPSBmYWxzZTsKCgkJZm9yIChpIGluIHRoaXMuaGFuZGxlcykgewoJCQloYW5kbGUgPSAkKHRoaXMuaGFuZGxlc1tpXSlbMF07CgkJCWlmIChoYW5kbGUgPT09IGV2ZW50LnRhcmdldCB8fCAkLmNvbnRhaW5zKGhhbmRsZSwgZXZlbnQudGFyZ2V0KSkgewoJCQkJY2FwdHVyZSA9IHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiAhdGhpcy5vcHRpb25zLmRpc2FibGVkICYmIGNhcHR1cmU7Cgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgY3VybGVmdCwgY3VydG9wLCBjdXJzb3IsCgkJCW8gPSB0aGlzLm9wdGlvbnMsCgkJCWluaVBvcyA9IHRoaXMuZWxlbWVudC5wb3NpdGlvbigpLAoJCQllbCA9IHRoaXMuZWxlbWVudDsKCgkJdGhpcy5yZXNpemluZyA9IHRydWU7CgoJCS8vIGJ1Z2ZpeCBmb3IgaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC8xNzQ5CgkJaWYgKCAoL2Fic29sdXRlLykudGVzdCggZWwuY3NzKCJwb3NpdGlvbiIpICkgKSB7CgkJCWVsLmNzcyh7IHBvc2l0aW9uOiAiYWJzb2x1dGUiLCB0b3A6IGVsLmNzcygidG9wIiksIGxlZnQ6IGVsLmNzcygibGVmdCIpIH0pOwoJCX0gZWxzZSBpZiAoZWwuaXMoIi51aS1kcmFnZ2FibGUiKSkgewoJCQllbC5jc3MoeyBwb3NpdGlvbjogImFic29sdXRlIiwgdG9wOiBpbmlQb3MudG9wLCBsZWZ0OiBpbmlQb3MubGVmdCB9KTsKCQl9CgoJCXRoaXMuX3JlbmRlclByb3h5KCk7CgoJCWN1cmxlZnQgPSBudW0odGhpcy5oZWxwZXIuY3NzKCJsZWZ0IikpOwoJCWN1cnRvcCA9IG51bSh0aGlzLmhlbHBlci5jc3MoInRvcCIpKTsKCgkJaWYgKG8uY29udGFpbm1lbnQpIHsKCQkJY3VybGVmdCArPSAkKG8uY29udGFpbm1lbnQpLnNjcm9sbExlZnQoKSB8fCAwOwoJCQljdXJ0b3AgKz0gJChvLmNvbnRhaW5tZW50KS5zY3JvbGxUb3AoKSB8fCAwOwoJCX0KCgkJLy9TdG9yZSBuZWVkZWQgdmFyaWFibGVzCgkJdGhpcy5vZmZzZXQgPSB0aGlzLmhlbHBlci5vZmZzZXQoKTsKCQl0aGlzLnBvc2l0aW9uID0geyBsZWZ0OiBjdXJsZWZ0LCB0b3A6IGN1cnRvcCB9OwoJCXRoaXMuc2l6ZSA9IHRoaXMuX2hlbHBlciA/IHsgd2lkdGg6IGVsLm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBlbC5vdXRlckhlaWdodCgpIH0gOiB7IHdpZHRoOiBlbC53aWR0aCgpLCBoZWlnaHQ6IGVsLmhlaWdodCgpIH07CgkJdGhpcy5vcmlnaW5hbFNpemUgPSB0aGlzLl9oZWxwZXIgPyB7IHdpZHRoOiBlbC5vdXRlcldpZHRoKCksIGhlaWdodDogZWwub3V0ZXJIZWlnaHQoKSB9IDogeyB3aWR0aDogZWwud2lkdGgoKSwgaGVpZ2h0OiBlbC5oZWlnaHQoKSB9OwoJCXRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHsgbGVmdDogY3VybGVmdCwgdG9wOiBjdXJ0b3AgfTsKCQl0aGlzLnNpemVEaWZmID0geyB3aWR0aDogZWwub3V0ZXJXaWR0aCgpIC0gZWwud2lkdGgoKSwgaGVpZ2h0OiBlbC5vdXRlckhlaWdodCgpIC0gZWwuaGVpZ2h0KCkgfTsKCQl0aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbiA9IHsgbGVmdDogZXZlbnQucGFnZVgsIHRvcDogZXZlbnQucGFnZVkgfTsKCgkJLy9Bc3BlY3QgUmF0aW8KCQl0aGlzLmFzcGVjdFJhdGlvID0gKHR5cGVvZiBvLmFzcGVjdFJhdGlvID09PSAibnVtYmVyIikgPyBvLmFzcGVjdFJhdGlvIDogKCh0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aCAvIHRoaXMub3JpZ2luYWxTaXplLmhlaWdodCkgfHwgMSk7CgoJCWN1cnNvciA9ICQoIi51aS1yZXNpemFibGUtIiArIHRoaXMuYXhpcykuY3NzKCJjdXJzb3IiKTsKCQkkKCJib2R5IikuY3NzKCJjdXJzb3IiLCBjdXJzb3IgPT09ICJhdXRvIiA/IHRoaXMuYXhpcyArICItcmVzaXplIiA6IGN1cnNvcik7CgoJCWVsLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKTsKCQl0aGlzLl9wcm9wYWdhdGUoInN0YXJ0IiwgZXZlbnQpOwoJCXJldHVybiB0cnVlOwoJfSwKCglfbW91c2VEcmFnOiBmdW5jdGlvbihldmVudCkgewoKCQkvL0luY3JlYXNlIHBlcmZvcm1hbmNlLCBhdm9pZCByZWdleAoJCXZhciBkYXRhLAoJCQllbCA9IHRoaXMuaGVscGVyLCBwcm9wcyA9IHt9LAoJCQlzbXAgPSB0aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbiwKCQkJYSA9IHRoaXMuYXhpcywKCQkJcHJldlRvcCA9IHRoaXMucG9zaXRpb24udG9wLAoJCQlwcmV2TGVmdCA9IHRoaXMucG9zaXRpb24ubGVmdCwKCQkJcHJldldpZHRoID0gdGhpcy5zaXplLndpZHRoLAoJCQlwcmV2SGVpZ2h0ID0gdGhpcy5zaXplLmhlaWdodCwKCQkJZHggPSAoZXZlbnQucGFnZVgtc21wLmxlZnQpfHwwLAoJCQlkeSA9IChldmVudC5wYWdlWS1zbXAudG9wKXx8MCwKCQkJdHJpZ2dlciA9IHRoaXMuX2NoYW5nZVthXTsKCgkJaWYgKCF0cmlnZ2VyKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSB0aGUgYXR0cnMgdGhhdCB3aWxsIGJlIGNoYW5nZQoJCWRhdGEgPSB0cmlnZ2VyLmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSk7CgoJCS8vIFB1dCB0aGlzIGluIHRoZSBtb3VzZURyYWcgaGFuZGxlciBzaW5jZSB0aGUgdXNlciBjYW4gc3RhcnQgcHJlc3Npbmcgc2hpZnQgd2hpbGUgcmVzaXppbmcKCQl0aGlzLl91cGRhdGVWaXJ0dWFsQm91bmRhcmllcyhldmVudC5zaGlmdEtleSk7CgkJaWYgKHRoaXMuX2FzcGVjdFJhdGlvIHx8IGV2ZW50LnNoaWZ0S2V5KSB7CgkJCWRhdGEgPSB0aGlzLl91cGRhdGVSYXRpbyhkYXRhLCBldmVudCk7CgkJfQoKCQlkYXRhID0gdGhpcy5fcmVzcGVjdFNpemUoZGF0YSwgZXZlbnQpOwoKCQl0aGlzLl91cGRhdGVDYWNoZShkYXRhKTsKCgkJLy8gcGx1Z2lucyBjYWxsYmFja3MgbmVlZCB0byBiZSBjYWxsZWQgZmlyc3QKCQl0aGlzLl9wcm9wYWdhdGUoInJlc2l6ZSIsIGV2ZW50KTsKCgkJaWYgKHRoaXMucG9zaXRpb24udG9wICE9PSBwcmV2VG9wKSB7CgkJCXByb3BzLnRvcCA9IHRoaXMucG9zaXRpb24udG9wICsgInB4IjsKCQl9CgkJaWYgKHRoaXMucG9zaXRpb24ubGVmdCAhPT0gcHJldkxlZnQpIHsKCQkJcHJvcHMubGVmdCA9IHRoaXMucG9zaXRpb24ubGVmdCArICJweCI7CgkJfQoJCWlmICh0aGlzLnNpemUud2lkdGggIT09IHByZXZXaWR0aCkgewoJCQlwcm9wcy53aWR0aCA9IHRoaXMuc2l6ZS53aWR0aCArICJweCI7CgkJfQoJCWlmICh0aGlzLnNpemUuaGVpZ2h0ICE9PSBwcmV2SGVpZ2h0KSB7CgkJCXByb3BzLmhlaWdodCA9IHRoaXMuc2l6ZS5oZWlnaHQgKyAicHgiOwoJCX0KCQllbC5jc3MocHJvcHMpOwoKCQlpZiAoIXRoaXMuX2hlbHBlciAmJiB0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aCkgewoJCQl0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpOwoJCX0KCgkJLy8gQ2FsbCB0aGUgdXNlciBjYWxsYmFjayBpZiB0aGUgZWxlbWVudCB3YXMgcmVzaXplZAoJCWlmICggISAkLmlzRW1wdHlPYmplY3QocHJvcHMpICkgewoJCQl0aGlzLl90cmlnZ2VyKCJyZXNpemUiLCBldmVudCwgdGhpcy51aSgpKTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0sCgoJX21vdXNlU3RvcDogZnVuY3Rpb24oZXZlbnQpIHsKCgkJdGhpcy5yZXNpemluZyA9IGZhbHNlOwoJCXZhciBwciwgaXN0YSwgc29mZnNldGgsIHNvZmZzZXR3LCBzLCBsZWZ0LCB0b3AsCgkJCW8gPSB0aGlzLm9wdGlvbnMsIHRoYXQgPSB0aGlzOwoKCQlpZih0aGlzLl9oZWxwZXIpIHsKCgkJCXByID0gdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czsKCQkJaXN0YSA9IHByLmxlbmd0aCAmJiAoL3RleHRhcmVhL2kpLnRlc3QocHJbMF0ubm9kZU5hbWUpOwoJCQlzb2Zmc2V0aCA9IGlzdGEgJiYgJC51aS5oYXNTY3JvbGwocHJbMF0sICJsZWZ0IikgLyogVE9ETyAtIGp1bXAgaGVpZ2h0ICovID8gMCA6IHRoYXQuc2l6ZURpZmYuaGVpZ2h0OwoJCQlzb2Zmc2V0dyA9IGlzdGEgPyAwIDogdGhhdC5zaXplRGlmZi53aWR0aDsKCgkJCXMgPSB7IHdpZHRoOiAodGhhdC5oZWxwZXIud2lkdGgoKSAgLSBzb2Zmc2V0dyksIGhlaWdodDogKHRoYXQuaGVscGVyLmhlaWdodCgpIC0gc29mZnNldGgpIH07CgkJCWxlZnQgPSAocGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygibGVmdCIpLCAxMCkgKyAodGhhdC5wb3NpdGlvbi5sZWZ0IC0gdGhhdC5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpKSB8fCBudWxsOwoJCQl0b3AgPSAocGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygidG9wIiksIDEwKSArICh0aGF0LnBvc2l0aW9uLnRvcCAtIHRoYXQub3JpZ2luYWxQb3NpdGlvbi50b3ApKSB8fCBudWxsOwoKCQkJaWYgKCFvLmFuaW1hdGUpIHsKCQkJCXRoaXMuZWxlbWVudC5jc3MoJC5leHRlbmQocywgeyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9KSk7CgkJCX0KCgkJCXRoYXQuaGVscGVyLmhlaWdodCh0aGF0LnNpemUuaGVpZ2h0KTsKCQkJdGhhdC5oZWxwZXIud2lkdGgodGhhdC5zaXplLndpZHRoKTsKCgkJCWlmICh0aGlzLl9oZWxwZXIgJiYgIW8uYW5pbWF0ZSkgewoJCQkJdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKTsKCQkJfQoJCX0KCgkJJCgiYm9keSIpLmNzcygiY3Vyc29yIiwgImF1dG8iKTsKCgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKTsKCgkJdGhpcy5fcHJvcGFnYXRlKCJzdG9wIiwgZXZlbnQpOwoKCQlpZiAodGhpcy5faGVscGVyKSB7CgkJCXRoaXMuaGVscGVyLnJlbW92ZSgpOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoKCX0sCgoJX3VwZGF0ZVZpcnR1YWxCb3VuZGFyaWVzOiBmdW5jdGlvbihmb3JjZUFzcGVjdFJhdGlvKSB7CgkJdmFyIHBNaW5XaWR0aCwgcE1heFdpZHRoLCBwTWluSGVpZ2h0LCBwTWF4SGVpZ2h0LCBiLAoJCQlvID0gdGhpcy5vcHRpb25zOwoKCQliID0gewoJCQltaW5XaWR0aDogaXNOdW1iZXIoby5taW5XaWR0aCkgPyBvLm1pbldpZHRoIDogMCwKCQkJbWF4V2lkdGg6IGlzTnVtYmVyKG8ubWF4V2lkdGgpID8gby5tYXhXaWR0aCA6IEluZmluaXR5LAoJCQltaW5IZWlnaHQ6IGlzTnVtYmVyKG8ubWluSGVpZ2h0KSA/IG8ubWluSGVpZ2h0IDogMCwKCQkJbWF4SGVpZ2h0OiBpc051bWJlcihvLm1heEhlaWdodCkgPyBvLm1heEhlaWdodCA6IEluZmluaXR5CgkJfTsKCgkJaWYodGhpcy5fYXNwZWN0UmF0aW8gfHwgZm9yY2VBc3BlY3RSYXRpbykgewoJCQkvLyBXZSB3YW50IHRvIGNyZWF0ZSBhbiBlbmNsb3NpbmcgYm94IHdob3NlIGFzcGVjdCByYXRpb24gaXMgdGhlIHJlcXVlc3RlZCBvbmUKCQkJLy8gRmlyc3QsIGNvbXB1dGUgdGhlICJwcm9qZWN0ZWQiIHNpemUgZm9yIGVhY2ggZGltZW5zaW9uIGJhc2VkIG9uIHRoZSBhc3BlY3QgcmF0aW8gYW5kIG90aGVyIGRpbWVuc2lvbgoJCQlwTWluV2lkdGggPSBiLm1pbkhlaWdodCAqIHRoaXMuYXNwZWN0UmF0aW87CgkJCXBNaW5IZWlnaHQgPSBiLm1pbldpZHRoIC8gdGhpcy5hc3BlY3RSYXRpbzsKCQkJcE1heFdpZHRoID0gYi5tYXhIZWlnaHQgKiB0aGlzLmFzcGVjdFJhdGlvOwoJCQlwTWF4SGVpZ2h0ID0gYi5tYXhXaWR0aCAvIHRoaXMuYXNwZWN0UmF0aW87CgoJCQlpZihwTWluV2lkdGggPiBiLm1pbldpZHRoKSB7CgkJCQliLm1pbldpZHRoID0gcE1pbldpZHRoOwoJCQl9CgkJCWlmKHBNaW5IZWlnaHQgPiBiLm1pbkhlaWdodCkgewoJCQkJYi5taW5IZWlnaHQgPSBwTWluSGVpZ2h0OwoJCQl9CgkJCWlmKHBNYXhXaWR0aCA8IGIubWF4V2lkdGgpIHsKCQkJCWIubWF4V2lkdGggPSBwTWF4V2lkdGg7CgkJCX0KCQkJaWYocE1heEhlaWdodCA8IGIubWF4SGVpZ2h0KSB7CgkJCQliLm1heEhlaWdodCA9IHBNYXhIZWlnaHQ7CgkJCX0KCQl9CgkJdGhpcy5fdkJvdW5kYXJpZXMgPSBiOwoJfSwKCglfdXBkYXRlQ2FjaGU6IGZ1bmN0aW9uKGRhdGEpIHsKCQl0aGlzLm9mZnNldCA9IHRoaXMuaGVscGVyLm9mZnNldCgpOwoJCWlmIChpc051bWJlcihkYXRhLmxlZnQpKSB7CgkJCXRoaXMucG9zaXRpb24ubGVmdCA9IGRhdGEubGVmdDsKCQl9CgkJaWYgKGlzTnVtYmVyKGRhdGEudG9wKSkgewoJCQl0aGlzLnBvc2l0aW9uLnRvcCA9IGRhdGEudG9wOwoJCX0KCQlpZiAoaXNOdW1iZXIoZGF0YS5oZWlnaHQpKSB7CgkJCXRoaXMuc2l6ZS5oZWlnaHQgPSBkYXRhLmhlaWdodDsKCQl9CgkJaWYgKGlzTnVtYmVyKGRhdGEud2lkdGgpKSB7CgkJCXRoaXMuc2l6ZS53aWR0aCA9IGRhdGEud2lkdGg7CgkJfQoJfSwKCglfdXBkYXRlUmF0aW86IGZ1bmN0aW9uKCBkYXRhICkgewoKCQl2YXIgY3BvcyA9IHRoaXMucG9zaXRpb24sCgkJCWNzaXplID0gdGhpcy5zaXplLAoJCQlhID0gdGhpcy5heGlzOwoKCQlpZiAoaXNOdW1iZXIoZGF0YS5oZWlnaHQpKSB7CgkJCWRhdGEud2lkdGggPSAoZGF0YS5oZWlnaHQgKiB0aGlzLmFzcGVjdFJhdGlvKTsKCQl9IGVsc2UgaWYgKGlzTnVtYmVyKGRhdGEud2lkdGgpKSB7CgkJCWRhdGEuaGVpZ2h0ID0gKGRhdGEud2lkdGggLyB0aGlzLmFzcGVjdFJhdGlvKTsKCQl9CgoJCWlmIChhID09PSAic3ciKSB7CgkJCWRhdGEubGVmdCA9IGNwb3MubGVmdCArIChjc2l6ZS53aWR0aCAtIGRhdGEud2lkdGgpOwoJCQlkYXRhLnRvcCA9IG51bGw7CgkJfQoJCWlmIChhID09PSAibnciKSB7CgkJCWRhdGEudG9wID0gY3Bvcy50b3AgKyAoY3NpemUuaGVpZ2h0IC0gZGF0YS5oZWlnaHQpOwoJCQlkYXRhLmxlZnQgPSBjcG9zLmxlZnQgKyAoY3NpemUud2lkdGggLSBkYXRhLndpZHRoKTsKCQl9CgoJCXJldHVybiBkYXRhOwoJfSwKCglfcmVzcGVjdFNpemU6IGZ1bmN0aW9uKCBkYXRhICkgewoKCQl2YXIgbyA9IHRoaXMuX3ZCb3VuZGFyaWVzLAoJCQlhID0gdGhpcy5heGlzLAoJCQlpc21heHcgPSBpc051bWJlcihkYXRhLndpZHRoKSAmJiBvLm1heFdpZHRoICYmIChvLm1heFdpZHRoIDwgZGF0YS53aWR0aCksIGlzbWF4aCA9IGlzTnVtYmVyKGRhdGEuaGVpZ2h0KSAmJiBvLm1heEhlaWdodCAmJiAoby5tYXhIZWlnaHQgPCBkYXRhLmhlaWdodCksCgkJCWlzbWludyA9IGlzTnVtYmVyKGRhdGEud2lkdGgpICYmIG8ubWluV2lkdGggJiYgKG8ubWluV2lkdGggPiBkYXRhLndpZHRoKSwgaXNtaW5oID0gaXNOdW1iZXIoZGF0YS5oZWlnaHQpICYmIG8ubWluSGVpZ2h0ICYmIChvLm1pbkhlaWdodCA+IGRhdGEuaGVpZ2h0KSwKCQkJZHcgPSB0aGlzLm9yaWdpbmFsUG9zaXRpb24ubGVmdCArIHRoaXMub3JpZ2luYWxTaXplLndpZHRoLAoJCQlkaCA9IHRoaXMucG9zaXRpb24udG9wICsgdGhpcy5zaXplLmhlaWdodCwKCQkJY3cgPSAvc3d8bnd8dy8udGVzdChhKSwgY2ggPSAvbnd8bmV8bi8udGVzdChhKTsKCQlpZiAoaXNtaW53KSB7CgkJCWRhdGEud2lkdGggPSBvLm1pbldpZHRoOwoJCX0KCQlpZiAoaXNtaW5oKSB7CgkJCWRhdGEuaGVpZ2h0ID0gby5taW5IZWlnaHQ7CgkJfQoJCWlmIChpc21heHcpIHsKCQkJZGF0YS53aWR0aCA9IG8ubWF4V2lkdGg7CgkJfQoJCWlmIChpc21heGgpIHsKCQkJZGF0YS5oZWlnaHQgPSBvLm1heEhlaWdodDsKCQl9CgoJCWlmIChpc21pbncgJiYgY3cpIHsKCQkJZGF0YS5sZWZ0ID0gZHcgLSBvLm1pbldpZHRoOwoJCX0KCQlpZiAoaXNtYXh3ICYmIGN3KSB7CgkJCWRhdGEubGVmdCA9IGR3IC0gby5tYXhXaWR0aDsKCQl9CgkJaWYgKGlzbWluaCAmJiBjaCkgewoJCQlkYXRhLnRvcCA9IGRoIC0gby5taW5IZWlnaHQ7CgkJfQoJCWlmIChpc21heGggJiYgY2gpIHsKCQkJZGF0YS50b3AgPSBkaCAtIG8ubWF4SGVpZ2h0OwoJCX0KCgkJLy8gZml4aW5nIGp1bXAgZXJyb3Igb24gdG9wL2xlZnQgLSBidWcgIzIzMzAKCQlpZiAoIWRhdGEud2lkdGggJiYgIWRhdGEuaGVpZ2h0ICYmICFkYXRhLmxlZnQgJiYgZGF0YS50b3ApIHsKCQkJZGF0YS50b3AgPSBudWxsOwoJCX0gZWxzZSBpZiAoIWRhdGEud2lkdGggJiYgIWRhdGEuaGVpZ2h0ICYmICFkYXRhLnRvcCAmJiBkYXRhLmxlZnQpIHsKCQkJZGF0YS5sZWZ0ID0gbnVsbDsKCQl9CgoJCXJldHVybiBkYXRhOwoJfSwKCglfcHJvcG9ydGlvbmFsbHlSZXNpemU6IGZ1bmN0aW9uKCkgewoKCQlpZiAoIXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBpLCBqLCBib3JkZXJzLCBwYWRkaW5ncywgcHJlbCwKCQkJZWxlbWVudCA9IHRoaXMuaGVscGVyIHx8IHRoaXMuZWxlbWVudDsKCgkJZm9yICggaT0wOyBpIDwgdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGg7IGkrKykgewoKCQkJcHJlbCA9IHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHNbaV07CgoJCQlpZiAoIXRoaXMuYm9yZGVyRGlmKSB7CgkJCQl0aGlzLmJvcmRlckRpZiA9IFtdOwoJCQkJYm9yZGVycyA9IFtwcmVsLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwgcHJlbC5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSwgcHJlbC5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksIHByZWwuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKV07CgkJCQlwYWRkaW5ncyA9IFtwcmVsLmNzcygicGFkZGluZ1RvcCIpLCBwcmVsLmNzcygicGFkZGluZ1JpZ2h0IiksIHByZWwuY3NzKCJwYWRkaW5nQm90dG9tIiksIHByZWwuY3NzKCJwYWRkaW5nTGVmdCIpXTsKCgkJCQlmb3IgKCBqID0gMDsgaiA8IGJvcmRlcnMubGVuZ3RoOyBqKysgKSB7CgkJCQkJdGhpcy5ib3JkZXJEaWZbIGogXSA9ICggcGFyc2VJbnQoIGJvcmRlcnNbIGogXSwgMTAgKSB8fCAwICkgKyAoIHBhcnNlSW50KCBwYWRkaW5nc1sgaiBdLCAxMCApIHx8IDAgKTsKCQkJCX0KCQkJfQoKCQkJcHJlbC5jc3MoewoJCQkJaGVpZ2h0OiAoZWxlbWVudC5oZWlnaHQoKSAtIHRoaXMuYm9yZGVyRGlmWzBdIC0gdGhpcy5ib3JkZXJEaWZbMl0pIHx8IDAsCgkJCQl3aWR0aDogKGVsZW1lbnQud2lkdGgoKSAtIHRoaXMuYm9yZGVyRGlmWzFdIC0gdGhpcy5ib3JkZXJEaWZbM10pIHx8IDAKCQkJfSk7CgoJCX0KCgl9LAoKCV9yZW5kZXJQcm94eTogZnVuY3Rpb24oKSB7CgoJCXZhciBlbCA9IHRoaXMuZWxlbWVudCwgbyA9IHRoaXMub3B0aW9uczsKCQl0aGlzLmVsZW1lbnRPZmZzZXQgPSBlbC5vZmZzZXQoKTsKCgkJaWYodGhpcy5faGVscGVyKSB7CgoJCQl0aGlzLmhlbHBlciA9IHRoaXMuaGVscGVyIHx8ICQoIjxkaXYgc3R5bGU9J292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PiIpOwoKCQkJdGhpcy5oZWxwZXIuYWRkQ2xhc3ModGhpcy5faGVscGVyKS5jc3MoewoJCQkJd2lkdGg6IHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkgLSAxLAoJCQkJaGVpZ2h0OiB0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSAtIDEsCgkJCQlwb3NpdGlvbjogImFic29sdXRlIiwKCQkJCWxlZnQ6IHRoaXMuZWxlbWVudE9mZnNldC5sZWZ0ICsicHgiLAoJCQkJdG9wOiB0aGlzLmVsZW1lbnRPZmZzZXQudG9wICsicHgiLAoJCQkJekluZGV4OiArK28uekluZGV4IC8vVE9ETzogRG9uJ3QgbW9kaWZ5IG9wdGlvbgoJCQl9KTsKCgkJCXRoaXMuaGVscGVyCgkJCQkuYXBwZW5kVG8oImJvZHkiKQoJCQkJLmRpc2FibGVTZWxlY3Rpb24oKTsKCgkJfSBlbHNlIHsKCQkJdGhpcy5oZWxwZXIgPSB0aGlzLmVsZW1lbnQ7CgkJfQoKCX0sCgoJX2NoYW5nZTogewoJCWU6IGZ1bmN0aW9uKGV2ZW50LCBkeCkgewoJCQlyZXR1cm4geyB3aWR0aDogdGhpcy5vcmlnaW5hbFNpemUud2lkdGggKyBkeCB9OwoJCX0sCgkJdzogZnVuY3Rpb24oZXZlbnQsIGR4KSB7CgkJCXZhciBjcyA9IHRoaXMub3JpZ2luYWxTaXplLCBzcCA9IHRoaXMub3JpZ2luYWxQb3NpdGlvbjsKCQkJcmV0dXJuIHsgbGVmdDogc3AubGVmdCArIGR4LCB3aWR0aDogY3Mud2lkdGggLSBkeCB9OwoJCX0sCgkJbjogZnVuY3Rpb24oZXZlbnQsIGR4LCBkeSkgewoJCQl2YXIgY3MgPSB0aGlzLm9yaWdpbmFsU2l6ZSwgc3AgPSB0aGlzLm9yaWdpbmFsUG9zaXRpb247CgkJCXJldHVybiB7IHRvcDogc3AudG9wICsgZHksIGhlaWdodDogY3MuaGVpZ2h0IC0gZHkgfTsKCQl9LAoJCXM6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuIHsgaGVpZ2h0OiB0aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHQgKyBkeSB9OwoJCX0sCgkJc2U6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuICQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSkpOwoJCX0sCgkJc3c6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuICQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSkpOwoJCX0sCgkJbmU6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuICQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSkpOwoJCX0sCgkJbnc6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuICQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSkpOwoJCX0KCX0sCgoJX3Byb3BhZ2F0ZTogZnVuY3Rpb24obiwgZXZlbnQpIHsKCQkkLnVpLnBsdWdpbi5jYWxsKHRoaXMsIG4sIFtldmVudCwgdGhpcy51aSgpXSk7CgkJKG4gIT09ICJyZXNpemUiICYmIHRoaXMuX3RyaWdnZXIobiwgZXZlbnQsIHRoaXMudWkoKSkpOwoJfSwKCglwbHVnaW5zOiB7fSwKCgl1aTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHsKCQkJb3JpZ2luYWxFbGVtZW50OiB0aGlzLm9yaWdpbmFsRWxlbWVudCwKCQkJZWxlbWVudDogdGhpcy5lbGVtZW50LAoJCQloZWxwZXI6IHRoaXMuaGVscGVyLAoJCQlwb3NpdGlvbjogdGhpcy5wb3NpdGlvbiwKCQkJc2l6ZTogdGhpcy5zaXplLAoJCQlvcmlnaW5hbFNpemU6IHRoaXMub3JpZ2luYWxTaXplLAoJCQlvcmlnaW5hbFBvc2l0aW9uOiB0aGlzLm9yaWdpbmFsUG9zaXRpb24KCQl9OwoJfQoKfSk7CgovKgogKiBSZXNpemFibGUgRXh0ZW5zaW9ucwogKi8KCiQudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwgImFuaW1hdGUiLCB7CgoJc3RvcDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUiKSwKCQkJbyA9IHRoYXQub3B0aW9ucywKCQkJcHIgPSB0aGF0Ll9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLAoJCQlpc3RhID0gcHIubGVuZ3RoICYmICgvdGV4dGFyZWEvaSkudGVzdChwclswXS5ub2RlTmFtZSksCgkJCXNvZmZzZXRoID0gaXN0YSAmJiAkLnVpLmhhc1Njcm9sbChwclswXSwgImxlZnQiKSAvKiBUT0RPIC0ganVtcCBoZWlnaHQgKi8gPyAwIDogdGhhdC5zaXplRGlmZi5oZWlnaHQsCgkJCXNvZmZzZXR3ID0gaXN0YSA/IDAgOiB0aGF0LnNpemVEaWZmLndpZHRoLAoJCQlzdHlsZSA9IHsgd2lkdGg6ICh0aGF0LnNpemUud2lkdGggLSBzb2Zmc2V0dyksIGhlaWdodDogKHRoYXQuc2l6ZS5oZWlnaHQgLSBzb2Zmc2V0aCkgfSwKCQkJbGVmdCA9IChwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCJsZWZ0IiksIDEwKSArICh0aGF0LnBvc2l0aW9uLmxlZnQgLSB0aGF0Lm9yaWdpbmFsUG9zaXRpb24ubGVmdCkpIHx8IG51bGwsCgkJCXRvcCA9IChwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCJ0b3AiKSwgMTApICsgKHRoYXQucG9zaXRpb24udG9wIC0gdGhhdC5vcmlnaW5hbFBvc2l0aW9uLnRvcCkpIHx8IG51bGw7CgoJCXRoYXQuZWxlbWVudC5hbmltYXRlKAoJCQkkLmV4dGVuZChzdHlsZSwgdG9wICYmIGxlZnQgPyB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gOiB7fSksIHsKCQkJCWR1cmF0aW9uOiBvLmFuaW1hdGVEdXJhdGlvbiwKCQkJCWVhc2luZzogby5hbmltYXRlRWFzaW5nLAoJCQkJc3RlcDogZnVuY3Rpb24oKSB7CgoJCQkJCXZhciBkYXRhID0gewoJCQkJCQl3aWR0aDogcGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygid2lkdGgiKSwgMTApLAoJCQkJCQloZWlnaHQ6IHBhcnNlSW50KHRoYXQuZWxlbWVudC5jc3MoImhlaWdodCIpLCAxMCksCgkJCQkJCXRvcDogcGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygidG9wIiksIDEwKSwKCQkJCQkJbGVmdDogcGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygibGVmdCIpLCAxMCkKCQkJCQl9OwoKCQkJCQlpZiAocHIgJiYgcHIubGVuZ3RoKSB7CgkJCQkJCSQocHJbMF0pLmNzcyh7IHdpZHRoOiBkYXRhLndpZHRoLCBoZWlnaHQ6IGRhdGEuaGVpZ2h0IH0pOwoJCQkJCX0KCgkJCQkJLy8gcHJvcGFnYXRpbmcgcmVzaXplLCBhbmQgdXBkYXRpbmcgdmFsdWVzIGZvciBlYWNoIGFuaW1hdGlvbiBzdGVwCgkJCQkJdGhhdC5fdXBkYXRlQ2FjaGUoZGF0YSk7CgkJCQkJdGhhdC5fcHJvcGFnYXRlKCJyZXNpemUiLCBldmVudCk7CgoJCQkJfQoJCQl9CgkJKTsKCX0KCn0pOwoKJC51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCAiY29udGFpbm1lbnQiLCB7CgoJc3RhcnQ6IGZ1bmN0aW9uKCkgewoJCXZhciBlbGVtZW50LCBwLCBjbywgY2gsIGN3LCB3aWR0aCwgaGVpZ2h0LAoJCQl0aGF0ID0gJCh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUiKSwKCQkJbyA9IHRoYXQub3B0aW9ucywKCQkJZWwgPSB0aGF0LmVsZW1lbnQsCgkJCW9jID0gby5jb250YWlubWVudCwKCQkJY2UgPSAob2MgaW5zdGFuY2VvZiAkKSA/IG9jLmdldCgwKSA6ICgvcGFyZW50Ly50ZXN0KG9jKSkgPyBlbC5wYXJlbnQoKS5nZXQoMCkgOiBvYzsKCgkJaWYgKCFjZSkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGF0LmNvbnRhaW5lckVsZW1lbnQgPSAkKGNlKTsKCgkJaWYgKC9kb2N1bWVudC8udGVzdChvYykgfHwgb2MgPT09IGRvY3VtZW50KSB7CgkJCXRoYXQuY29udGFpbmVyT2Zmc2V0ID0geyBsZWZ0OiAwLCB0b3A6IDAgfTsKCQkJdGhhdC5jb250YWluZXJQb3NpdGlvbiA9IHsgbGVmdDogMCwgdG9wOiAwIH07CgoJCQl0aGF0LnBhcmVudERhdGEgPSB7CgkJCQllbGVtZW50OiAkKGRvY3VtZW50KSwgbGVmdDogMCwgdG9wOiAwLAoJCQkJd2lkdGg6ICQoZG9jdW1lbnQpLndpZHRoKCksIGhlaWdodDogJChkb2N1bWVudCkuaGVpZ2h0KCkgfHwgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodAoJCQl9OwoJCX0KCgkJLy8gaSdtIGEgbm9kZSwgc28gY29tcHV0ZSB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20KCQllbHNlIHsKCQkJZWxlbWVudCA9ICQoY2UpOwoJCQlwID0gW107CgkJCSQoWyAiVG9wIiwgIlJpZ2h0IiwgIkxlZnQiLCAiQm90dG9tIiBdKS5lYWNoKGZ1bmN0aW9uKGksIG5hbWUpIHsgcFtpXSA9IG51bShlbGVtZW50LmNzcygicGFkZGluZyIgKyBuYW1lKSk7IH0pOwoKCQkJdGhhdC5jb250YWluZXJPZmZzZXQgPSBlbGVtZW50Lm9mZnNldCgpOwoJCQl0aGF0LmNvbnRhaW5lclBvc2l0aW9uID0gZWxlbWVudC5wb3NpdGlvbigpOwoJCQl0aGF0LmNvbnRhaW5lclNpemUgPSB7IGhlaWdodDogKGVsZW1lbnQuaW5uZXJIZWlnaHQoKSAtIHBbM10pLCB3aWR0aDogKGVsZW1lbnQuaW5uZXJXaWR0aCgpIC0gcFsxXSkgfTsKCgkJCWNvID0gdGhhdC5jb250YWluZXJPZmZzZXQ7CgkJCWNoID0gdGhhdC5jb250YWluZXJTaXplLmhlaWdodDsKCQkJY3cgPSB0aGF0LmNvbnRhaW5lclNpemUud2lkdGg7CgkJCXdpZHRoID0gKCQudWkuaGFzU2Nyb2xsKGNlLCAibGVmdCIpID8gY2Uuc2Nyb2xsV2lkdGggOiBjdyApOwoJCQloZWlnaHQgPSAoJC51aS5oYXNTY3JvbGwoY2UpID8gY2Uuc2Nyb2xsSGVpZ2h0IDogY2gpOwoKCQkJdGhhdC5wYXJlbnREYXRhID0gewoJCQkJZWxlbWVudDogY2UsIGxlZnQ6IGNvLmxlZnQsIHRvcDogY28udG9wLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0CgkJCX07CgkJfQoJfSwKCglyZXNpemU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgd29zZXQsIGhvc2V0LCBpc1BhcmVudCwgaXNPZmZzZXRSZWxhdGl2ZSwKCQkJdGhhdCA9ICQodGhpcykuZGF0YSgidWktcmVzaXphYmxlIiksCgkJCW8gPSB0aGF0Lm9wdGlvbnMsCgkJCWNvID0gdGhhdC5jb250YWluZXJPZmZzZXQsIGNwID0gdGhhdC5wb3NpdGlvbiwKCQkJcFJhdGlvID0gdGhhdC5fYXNwZWN0UmF0aW8gfHwgZXZlbnQuc2hpZnRLZXksCgkJCWNvcCA9IHsgdG9wOjAsIGxlZnQ6MCB9LCBjZSA9IHRoYXQuY29udGFpbmVyRWxlbWVudDsKCgkJaWYgKGNlWzBdICE9PSBkb2N1bWVudCAmJiAoL3N0YXRpYy8pLnRlc3QoY2UuY3NzKCJwb3NpdGlvbiIpKSkgewoJCQljb3AgPSBjbzsKCQl9CgoJCWlmIChjcC5sZWZ0IDwgKHRoYXQuX2hlbHBlciA/IGNvLmxlZnQgOiAwKSkgewoJCQl0aGF0LnNpemUud2lkdGggPSB0aGF0LnNpemUud2lkdGggKyAodGhhdC5faGVscGVyID8gKHRoYXQucG9zaXRpb24ubGVmdCAtIGNvLmxlZnQpIDogKHRoYXQucG9zaXRpb24ubGVmdCAtIGNvcC5sZWZ0KSk7CgkJCWlmIChwUmF0aW8pIHsKCQkJCXRoYXQuc2l6ZS5oZWlnaHQgPSB0aGF0LnNpemUud2lkdGggLyB0aGF0LmFzcGVjdFJhdGlvOwoJCQl9CgkJCXRoYXQucG9zaXRpb24ubGVmdCA9IG8uaGVscGVyID8gY28ubGVmdCA6IDA7CgkJfQoKCQlpZiAoY3AudG9wIDwgKHRoYXQuX2hlbHBlciA/IGNvLnRvcCA6IDApKSB7CgkJCXRoYXQuc2l6ZS5oZWlnaHQgPSB0aGF0LnNpemUuaGVpZ2h0ICsgKHRoYXQuX2hlbHBlciA/ICh0aGF0LnBvc2l0aW9uLnRvcCAtIGNvLnRvcCkgOiB0aGF0LnBvc2l0aW9uLnRvcCk7CgkJCWlmIChwUmF0aW8pIHsKCQkJCXRoYXQuc2l6ZS53aWR0aCA9IHRoYXQuc2l6ZS5oZWlnaHQgKiB0aGF0LmFzcGVjdFJhdGlvOwoJCQl9CgkJCXRoYXQucG9zaXRpb24udG9wID0gdGhhdC5faGVscGVyID8gY28udG9wIDogMDsKCQl9CgoJCXRoYXQub2Zmc2V0LmxlZnQgPSB0aGF0LnBhcmVudERhdGEubGVmdCt0aGF0LnBvc2l0aW9uLmxlZnQ7CgkJdGhhdC5vZmZzZXQudG9wID0gdGhhdC5wYXJlbnREYXRhLnRvcCt0aGF0LnBvc2l0aW9uLnRvcDsKCgkJd29zZXQgPSBNYXRoLmFicyggKHRoYXQuX2hlbHBlciA/IHRoYXQub2Zmc2V0LmxlZnQgLSBjb3AubGVmdCA6ICh0aGF0Lm9mZnNldC5sZWZ0IC0gY29wLmxlZnQpKSArIHRoYXQuc2l6ZURpZmYud2lkdGggKTsKCQlob3NldCA9IE1hdGguYWJzKCAodGhhdC5faGVscGVyID8gdGhhdC5vZmZzZXQudG9wIC0gY29wLnRvcCA6ICh0aGF0Lm9mZnNldC50b3AgLSBjby50b3ApKSArIHRoYXQuc2l6ZURpZmYuaGVpZ2h0ICk7CgoJCWlzUGFyZW50ID0gdGhhdC5jb250YWluZXJFbGVtZW50LmdldCgwKSA9PT0gdGhhdC5lbGVtZW50LnBhcmVudCgpLmdldCgwKTsKCQlpc09mZnNldFJlbGF0aXZlID0gL3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KHRoYXQuY29udGFpbmVyRWxlbWVudC5jc3MoInBvc2l0aW9uIikpOwoKCQlpZihpc1BhcmVudCAmJiBpc09mZnNldFJlbGF0aXZlKSB7CgkJCXdvc2V0IC09IHRoYXQucGFyZW50RGF0YS5sZWZ0OwoJCX0KCgkJaWYgKHdvc2V0ICsgdGhhdC5zaXplLndpZHRoID49IHRoYXQucGFyZW50RGF0YS53aWR0aCkgewoJCQl0aGF0LnNpemUud2lkdGggPSB0aGF0LnBhcmVudERhdGEud2lkdGggLSB3b3NldDsKCQkJaWYgKHBSYXRpbykgewoJCQkJdGhhdC5zaXplLmhlaWdodCA9IHRoYXQuc2l6ZS53aWR0aCAvIHRoYXQuYXNwZWN0UmF0aW87CgkJCX0KCQl9CgoJCWlmIChob3NldCArIHRoYXQuc2l6ZS5oZWlnaHQgPj0gdGhhdC5wYXJlbnREYXRhLmhlaWdodCkgewoJCQl0aGF0LnNpemUuaGVpZ2h0ID0gdGhhdC5wYXJlbnREYXRhLmhlaWdodCAtIGhvc2V0OwoJCQlpZiAocFJhdGlvKSB7CgkJCQl0aGF0LnNpemUud2lkdGggPSB0aGF0LnNpemUuaGVpZ2h0ICogdGhhdC5hc3BlY3RSYXRpbzsKCQkJfQoJCX0KCX0sCgoJc3RvcDogZnVuY3Rpb24oKXsKCQl2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgidWktcmVzaXphYmxlIiksCgkJCW8gPSB0aGF0Lm9wdGlvbnMsCgkJCWNvID0gdGhhdC5jb250YWluZXJPZmZzZXQsCgkJCWNvcCA9IHRoYXQuY29udGFpbmVyUG9zaXRpb24sCgkJCWNlID0gdGhhdC5jb250YWluZXJFbGVtZW50LAoJCQloZWxwZXIgPSAkKHRoYXQuaGVscGVyKSwKCQkJaG8gPSBoZWxwZXIub2Zmc2V0KCksCgkJCXcgPSBoZWxwZXIub3V0ZXJXaWR0aCgpIC0gdGhhdC5zaXplRGlmZi53aWR0aCwKCQkJaCA9IGhlbHBlci5vdXRlckhlaWdodCgpIC0gdGhhdC5zaXplRGlmZi5oZWlnaHQ7CgoJCWlmICh0aGF0Ll9oZWxwZXIgJiYgIW8uYW5pbWF0ZSAmJiAoL3JlbGF0aXZlLykudGVzdChjZS5jc3MoInBvc2l0aW9uIikpKSB7CgkJCSQodGhpcykuY3NzKHsgbGVmdDogaG8ubGVmdCAtIGNvcC5sZWZ0IC0gY28ubGVmdCwgd2lkdGg6IHcsIGhlaWdodDogaCB9KTsKCQl9CgoJCWlmICh0aGF0Ll9oZWxwZXIgJiYgIW8uYW5pbWF0ZSAmJiAoL3N0YXRpYy8pLnRlc3QoY2UuY3NzKCJwb3NpdGlvbiIpKSkgewoJCQkkKHRoaXMpLmNzcyh7IGxlZnQ6IGhvLmxlZnQgLSBjb3AubGVmdCAtIGNvLmxlZnQsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfSk7CgkJfQoKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsICJhbHNvUmVzaXplIiwgewoKCXN0YXJ0OiBmdW5jdGlvbiAoKSB7CgkJdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoInVpLXJlc2l6YWJsZSIpLAoJCQlvID0gdGhhdC5vcHRpb25zLAoJCQlfc3RvcmUgPSBmdW5jdGlvbiAoZXhwKSB7CgkJCQkkKGV4cCkuZWFjaChmdW5jdGlvbigpIHsKCQkJCQl2YXIgZWwgPSAkKHRoaXMpOwoJCQkJCWVsLmRhdGEoInVpLXJlc2l6YWJsZS1hbHNvcmVzaXplIiwgewoJCQkJCQl3aWR0aDogcGFyc2VJbnQoZWwud2lkdGgoKSwgMTApLCBoZWlnaHQ6IHBhcnNlSW50KGVsLmhlaWdodCgpLCAxMCksCgkJCQkJCWxlZnQ6IHBhcnNlSW50KGVsLmNzcygibGVmdCIpLCAxMCksIHRvcDogcGFyc2VJbnQoZWwuY3NzKCJ0b3AiKSwgMTApCgkJCQkJfSk7CgkJCQl9KTsKCQkJfTsKCgkJaWYgKHR5cGVvZihvLmFsc29SZXNpemUpID09PSAib2JqZWN0IiAmJiAhby5hbHNvUmVzaXplLnBhcmVudE5vZGUpIHsKCQkJaWYgKG8uYWxzb1Jlc2l6ZS5sZW5ndGgpIHsgby5hbHNvUmVzaXplID0gby5hbHNvUmVzaXplWzBdOyBfc3RvcmUoby5hbHNvUmVzaXplKTsgfQoJCQllbHNlIHsgJC5lYWNoKG8uYWxzb1Jlc2l6ZSwgZnVuY3Rpb24gKGV4cCkgeyBfc3RvcmUoZXhwKTsgfSk7IH0KCQl9ZWxzZXsKCQkJX3N0b3JlKG8uYWxzb1Jlc2l6ZSk7CgkJfQoJfSwKCglyZXNpemU6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKCQl2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgidWktcmVzaXphYmxlIiksCgkJCW8gPSB0aGF0Lm9wdGlvbnMsCgkJCW9zID0gdGhhdC5vcmlnaW5hbFNpemUsCgkJCW9wID0gdGhhdC5vcmlnaW5hbFBvc2l0aW9uLAoJCQlkZWx0YSA9IHsKCQkJCWhlaWdodDogKHRoYXQuc2l6ZS5oZWlnaHQgLSBvcy5oZWlnaHQpIHx8IDAsIHdpZHRoOiAodGhhdC5zaXplLndpZHRoIC0gb3Mud2lkdGgpIHx8IDAsCgkJCQl0b3A6ICh0aGF0LnBvc2l0aW9uLnRvcCAtIG9wLnRvcCkgfHwgMCwgbGVmdDogKHRoYXQucG9zaXRpb24ubGVmdCAtIG9wLmxlZnQpIHx8IDAKCQkJfSwKCgkJCV9hbHNvUmVzaXplID0gZnVuY3Rpb24gKGV4cCwgYykgewoJCQkJJChleHApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJdmFyIGVsID0gJCh0aGlzKSwgc3RhcnQgPSAkKHRoaXMpLmRhdGEoInVpLXJlc2l6YWJsZS1hbHNvcmVzaXplIiksIHN0eWxlID0ge30sCgkJCQkJCWNzcyA9IGMgJiYgYy5sZW5ndGggPyBjIDogZWwucGFyZW50cyh1aS5vcmlnaW5hbEVsZW1lbnRbMF0pLmxlbmd0aCA/IFsid2lkdGgiLCAiaGVpZ2h0Il0gOiBbIndpZHRoIiwgImhlaWdodCIsICJ0b3AiLCAibGVmdCJdOwoKCQkJCQkkLmVhY2goY3NzLCBmdW5jdGlvbiAoaSwgcHJvcCkgewoJCQkJCQl2YXIgc3VtID0gKHN0YXJ0W3Byb3BdfHwwKSArIChkZWx0YVtwcm9wXXx8MCk7CgkJCQkJCWlmIChzdW0gJiYgc3VtID49IDApIHsKCQkJCQkJCXN0eWxlW3Byb3BdID0gc3VtIHx8IG51bGw7CgkJCQkJCX0KCQkJCQl9KTsKCgkJCQkJZWwuY3NzKHN0eWxlKTsKCQkJCX0pOwoJCQl9OwoKCQlpZiAodHlwZW9mKG8uYWxzb1Jlc2l6ZSkgPT09ICJvYmplY3QiICYmICFvLmFsc29SZXNpemUubm9kZVR5cGUpIHsKCQkJJC5lYWNoKG8uYWxzb1Jlc2l6ZSwgZnVuY3Rpb24gKGV4cCwgYykgeyBfYWxzb1Jlc2l6ZShleHAsIGMpOyB9KTsKCQl9ZWxzZXsKCQkJX2Fsc29SZXNpemUoby5hbHNvUmVzaXplKTsKCQl9Cgl9LAoKCXN0b3A6IGZ1bmN0aW9uICgpIHsKCQkkKHRoaXMpLnJlbW92ZURhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIik7Cgl9Cn0pOwoKJC51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCAiZ2hvc3QiLCB7CgoJc3RhcnQ6IGZ1bmN0aW9uKCkgewoKCQl2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgidWktcmVzaXphYmxlIiksIG8gPSB0aGF0Lm9wdGlvbnMsIGNzID0gdGhhdC5zaXplOwoKCQl0aGF0Lmdob3N0ID0gdGhhdC5vcmlnaW5hbEVsZW1lbnQuY2xvbmUoKTsKCQl0aGF0Lmdob3N0CgkJCS5jc3MoeyBvcGFjaXR5OiAwLjI1LCBkaXNwbGF5OiAiYmxvY2siLCBwb3NpdGlvbjogInJlbGF0aXZlIiwgaGVpZ2h0OiBjcy5oZWlnaHQsIHdpZHRoOiBjcy53aWR0aCwgbWFyZ2luOiAwLCBsZWZ0OiAwLCB0b3A6IDAgfSkKCQkJLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtZ2hvc3QiKQoJCQkuYWRkQ2xhc3ModHlwZW9mIG8uZ2hvc3QgPT09ICJzdHJpbmciID8gby5naG9zdCA6ICIiKTsKCgkJdGhhdC5naG9zdC5hcHBlbmRUbyh0aGF0LmhlbHBlcik7CgoJfSwKCglyZXNpemU6IGZ1bmN0aW9uKCl7CgkJdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoInVpLXJlc2l6YWJsZSIpOwoJCWlmICh0aGF0Lmdob3N0KSB7CgkJCXRoYXQuZ2hvc3QuY3NzKHsgcG9zaXRpb246ICJyZWxhdGl2ZSIsIGhlaWdodDogdGhhdC5zaXplLmhlaWdodCwgd2lkdGg6IHRoYXQuc2l6ZS53aWR0aCB9KTsKCQl9Cgl9LAoKCXN0b3A6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUiKTsKCQlpZiAodGhhdC5naG9zdCAmJiB0aGF0LmhlbHBlcikgewoJCQl0aGF0LmhlbHBlci5nZXQoMCkucmVtb3ZlQ2hpbGQodGhhdC5naG9zdC5nZXQoMCkpOwoJCX0KCX0KCn0pOwoKJC51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCAiZ3JpZCIsIHsKCglyZXNpemU6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUiKSwKCQkJbyA9IHRoYXQub3B0aW9ucywKCQkJY3MgPSB0aGF0LnNpemUsCgkJCW9zID0gdGhhdC5vcmlnaW5hbFNpemUsCgkJCW9wID0gdGhhdC5vcmlnaW5hbFBvc2l0aW9uLAoJCQlhID0gdGhhdC5heGlzLAoJCQlncmlkID0gdHlwZW9mIG8uZ3JpZCA9PT0gIm51bWJlciIgPyBbby5ncmlkLCBvLmdyaWRdIDogby5ncmlkLAoJCQlncmlkWCA9IChncmlkWzBdfHwxKSwKCQkJZ3JpZFkgPSAoZ3JpZFsxXXx8MSksCgkJCW94ID0gTWF0aC5yb3VuZCgoY3Mud2lkdGggLSBvcy53aWR0aCkgLyBncmlkWCkgKiBncmlkWCwKCQkJb3kgPSBNYXRoLnJvdW5kKChjcy5oZWlnaHQgLSBvcy5oZWlnaHQpIC8gZ3JpZFkpICogZ3JpZFksCgkJCW5ld1dpZHRoID0gb3Mud2lkdGggKyBveCwKCQkJbmV3SGVpZ2h0ID0gb3MuaGVpZ2h0ICsgb3ksCgkJCWlzTWF4V2lkdGggPSBvLm1heFdpZHRoICYmIChvLm1heFdpZHRoIDwgbmV3V2lkdGgpLAoJCQlpc01heEhlaWdodCA9IG8ubWF4SGVpZ2h0ICYmIChvLm1heEhlaWdodCA8IG5ld0hlaWdodCksCgkJCWlzTWluV2lkdGggPSBvLm1pbldpZHRoICYmIChvLm1pbldpZHRoID4gbmV3V2lkdGgpLAoJCQlpc01pbkhlaWdodCA9IG8ubWluSGVpZ2h0ICYmIChvLm1pbkhlaWdodCA+IG5ld0hlaWdodCk7CgoJCW8uZ3JpZCA9IGdyaWQ7CgoJCWlmIChpc01pbldpZHRoKSB7CgkJCW5ld1dpZHRoID0gbmV3V2lkdGggKyBncmlkWDsKCQl9CgkJaWYgKGlzTWluSGVpZ2h0KSB7CgkJCW5ld0hlaWdodCA9IG5ld0hlaWdodCArIGdyaWRZOwoJCX0KCQlpZiAoaXNNYXhXaWR0aCkgewoJCQluZXdXaWR0aCA9IG5ld1dpZHRoIC0gZ3JpZFg7CgkJfQoJCWlmIChpc01heEhlaWdodCkgewoJCQluZXdIZWlnaHQgPSBuZXdIZWlnaHQgLSBncmlkWTsKCQl9CgoJCWlmICgvXihzZXxzfGUpJC8udGVzdChhKSkgewoJCQl0aGF0LnNpemUud2lkdGggPSBuZXdXaWR0aDsKCQkJdGhhdC5zaXplLmhlaWdodCA9IG5ld0hlaWdodDsKCQl9IGVsc2UgaWYgKC9eKG5lKSQvLnRlc3QoYSkpIHsKCQkJdGhhdC5zaXplLndpZHRoID0gbmV3V2lkdGg7CgkJCXRoYXQuc2l6ZS5oZWlnaHQgPSBuZXdIZWlnaHQ7CgkJCXRoYXQucG9zaXRpb24udG9wID0gb3AudG9wIC0gb3k7CgkJfSBlbHNlIGlmICgvXihzdykkLy50ZXN0KGEpKSB7CgkJCXRoYXQuc2l6ZS53aWR0aCA9IG5ld1dpZHRoOwoJCQl0aGF0LnNpemUuaGVpZ2h0ID0gbmV3SGVpZ2h0OwoJCQl0aGF0LnBvc2l0aW9uLmxlZnQgPSBvcC5sZWZ0IC0gb3g7CgkJfSBlbHNlIHsKCQkJdGhhdC5zaXplLndpZHRoID0gbmV3V2lkdGg7CgkJCXRoYXQuc2l6ZS5oZWlnaHQgPSBuZXdIZWlnaHQ7CgkJCXRoYXQucG9zaXRpb24udG9wID0gb3AudG9wIC0gb3k7CgkJCXRoYXQucG9zaXRpb24ubGVmdCA9IG9wLmxlZnQgLSBveDsKCQl9Cgl9Cgp9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQud2lkZ2V0KCJ1aS5zZWxlY3RhYmxlIiwgJC51aS5tb3VzZSwgewoJdmVyc2lvbjogIjEuMTAuMyIsCglvcHRpb25zOiB7CgkJYXBwZW5kVG86ICJib2R5IiwKCQlhdXRvUmVmcmVzaDogdHJ1ZSwKCQlkaXN0YW5jZTogMCwKCQlmaWx0ZXI6ICIqIiwKCQl0b2xlcmFuY2U6ICJ0b3VjaCIsCgoJCS8vIGNhbGxiYWNrcwoJCXNlbGVjdGVkOiBudWxsLAoJCXNlbGVjdGluZzogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsLAoJCXVuc2VsZWN0ZWQ6IG51bGwsCgkJdW5zZWxlY3Rpbmc6IG51bGwKCX0sCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl2YXIgc2VsZWN0ZWVzLAoJCQl0aGF0ID0gdGhpczsKCgkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIik7CgoJCXRoaXMuZHJhZ2dlZCA9IGZhbHNlOwoKCQkvLyBjYWNoZSBzZWxlY3RlZSBjaGlsZHJlbiBiYXNlZCBvbiBmaWx0ZXIKCQl0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsKCQkJc2VsZWN0ZWVzID0gJCh0aGF0Lm9wdGlvbnMuZmlsdGVyLCB0aGF0LmVsZW1lbnRbMF0pOwoJCQlzZWxlY3RlZXMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIik7CgkJCXNlbGVjdGVlcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyICR0aGlzID0gJCh0aGlzKSwKCQkJCQlwb3MgPSAkdGhpcy5vZmZzZXQoKTsKCQkJCSQuZGF0YSh0aGlzLCAic2VsZWN0YWJsZS1pdGVtIiwgewoJCQkJCWVsZW1lbnQ6IHRoaXMsCgkJCQkJJGVsZW1lbnQ6ICR0aGlzLAoJCQkJCWxlZnQ6IHBvcy5sZWZ0LAoJCQkJCXRvcDogcG9zLnRvcCwKCQkJCQlyaWdodDogcG9zLmxlZnQgKyAkdGhpcy5vdXRlcldpZHRoKCksCgkJCQkJYm90dG9tOiBwb3MudG9wICsgJHRoaXMub3V0ZXJIZWlnaHQoKSwKCQkJCQlzdGFydHNlbGVjdGVkOiBmYWxzZSwKCQkJCQlzZWxlY3RlZDogJHRoaXMuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksCgkJCQkJc2VsZWN0aW5nOiAkdGhpcy5oYXNDbGFzcygidWktc2VsZWN0aW5nIiksCgkJCQkJdW5zZWxlY3Rpbmc6ICR0aGlzLmhhc0NsYXNzKCJ1aS11bnNlbGVjdGluZyIpCgkJCQl9KTsKCQkJfSk7CgkJfTsKCQl0aGlzLnJlZnJlc2goKTsKCgkJdGhpcy5zZWxlY3RlZXMgPSBzZWxlY3RlZXMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIik7CgoJCXRoaXMuX21vdXNlSW5pdCgpOwoKCQl0aGlzLmhlbHBlciA9ICQoIjxkaXYgY2xhc3M9J3VpLXNlbGVjdGFibGUtaGVscGVyJz48L2Rpdj4iKTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2VsZWN0ZWVzCgkJCS5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKQoJCQkucmVtb3ZlRGF0YSgic2VsZWN0YWJsZS1pdGVtIik7CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcygidWktc2VsZWN0YWJsZSB1aS1zZWxlY3RhYmxlLWRpc2FibGVkIik7CgkJdGhpcy5fbW91c2VEZXN0cm95KCk7Cgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbihldmVudCkgewoJCXZhciB0aGF0ID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCgkJdGhpcy5vcG9zID0gW2V2ZW50LnBhZ2VYLCBldmVudC5wYWdlWV07CgoJCWlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5zZWxlY3RlZXMgPSAkKG9wdGlvbnMuZmlsdGVyLCB0aGlzLmVsZW1lbnRbMF0pOwoKCQl0aGlzLl90cmlnZ2VyKCJzdGFydCIsIGV2ZW50KTsKCgkJJChvcHRpb25zLmFwcGVuZFRvKS5hcHBlbmQodGhpcy5oZWxwZXIpOwoJCS8vIHBvc2l0aW9uIGhlbHBlciAobGFzc28pCgkJdGhpcy5oZWxwZXIuY3NzKHsKCQkJImxlZnQiOiBldmVudC5wYWdlWCwKCQkJInRvcCI6IGV2ZW50LnBhZ2VZLAoJCQkid2lkdGgiOiAwLAoJCQkiaGVpZ2h0IjogMAoJCX0pOwoKCQlpZiAob3B0aW9ucy5hdXRvUmVmcmVzaCkgewoJCQl0aGlzLnJlZnJlc2goKTsKCQl9CgoJCXRoaXMuc2VsZWN0ZWVzLmZpbHRlcigiLnVpLXNlbGVjdGVkIikuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHNlbGVjdGVlID0gJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0iKTsKCQkJc2VsZWN0ZWUuc3RhcnRzZWxlY3RlZCA9IHRydWU7CgkJCWlmICghZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuY3RybEtleSkgewoJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIik7CgkJCQlzZWxlY3RlZS5zZWxlY3RlZCA9IGZhbHNlOwoJCQkJc2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7CgkJCQlzZWxlY3RlZS51bnNlbGVjdGluZyA9IHRydWU7CgkJCQkvLyBzZWxlY3RhYmxlIFVOU0VMRUNUSU5HIGNhbGxiYWNrCgkJCQl0aGF0Ll90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsIGV2ZW50LCB7CgkJCQkJdW5zZWxlY3Rpbmc6IHNlbGVjdGVlLmVsZW1lbnQKCQkJCX0pOwoJCQl9CgkJfSk7CgoJCSQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCkuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBkb1NlbGVjdCwKCQkJCXNlbGVjdGVlID0gJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0iKTsKCQkJaWYgKHNlbGVjdGVlKSB7CgkJCQlkb1NlbGVjdCA9ICghZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuY3RybEtleSkgfHwgIXNlbGVjdGVlLiRlbGVtZW50Lmhhc0NsYXNzKCJ1aS1zZWxlY3RlZCIpOwoJCQkJc2VsZWN0ZWUuJGVsZW1lbnQKCQkJCQkucmVtb3ZlQ2xhc3MoZG9TZWxlY3QgPyAidWktdW5zZWxlY3RpbmciIDogInVpLXNlbGVjdGVkIikKCQkJCQkuYWRkQ2xhc3MoZG9TZWxlY3QgPyAidWktc2VsZWN0aW5nIiA6ICJ1aS11bnNlbGVjdGluZyIpOwoJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSAhZG9TZWxlY3Q7CgkJCQlzZWxlY3RlZS5zZWxlY3RpbmcgPSBkb1NlbGVjdDsKCQkJCXNlbGVjdGVlLnNlbGVjdGVkID0gZG9TZWxlY3Q7CgkJCQkvLyBzZWxlY3RhYmxlIChVTilTRUxFQ1RJTkcgY2FsbGJhY2sKCQkJCWlmIChkb1NlbGVjdCkgewoJCQkJCXRoYXQuX3RyaWdnZXIoInNlbGVjdGluZyIsIGV2ZW50LCB7CgkJCQkJCXNlbGVjdGluZzogc2VsZWN0ZWUuZWxlbWVudAoJCQkJCX0pOwoJCQkJfSBlbHNlIHsKCQkJCQl0aGF0Ll90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsIGV2ZW50LCB7CgkJCQkJCXVuc2VsZWN0aW5nOiBzZWxlY3RlZS5lbGVtZW50CgkJCQkJfSk7CgkJCQl9CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9KTsKCgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXRoaXMuZHJhZ2dlZCA9IHRydWU7CgoJCWlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIHRtcCwKCQkJdGhhdCA9IHRoaXMsCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCXgxID0gdGhpcy5vcG9zWzBdLAoJCQl5MSA9IHRoaXMub3Bvc1sxXSwKCQkJeDIgPSBldmVudC5wYWdlWCwKCQkJeTIgPSBldmVudC5wYWdlWTsKCgkJaWYgKHgxID4geDIpIHsgdG1wID0geDI7IHgyID0geDE7IHgxID0gdG1wOyB9CgkJaWYgKHkxID4geTIpIHsgdG1wID0geTI7IHkyID0geTE7IHkxID0gdG1wOyB9CgkJdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OiB4MSwgdG9wOiB5MSwgd2lkdGg6IHgyLXgxLCBoZWlnaHQ6IHkyLXkxfSk7CgoJCXRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBzZWxlY3RlZSA9ICQuZGF0YSh0aGlzLCAic2VsZWN0YWJsZS1pdGVtIiksCgkJCQloaXQgPSBmYWxzZTsKCgkJCS8vcHJldmVudCBoZWxwZXIgZnJvbSBiZWluZyBzZWxlY3RlZCBpZiBhcHBlbmRUbzogc2VsZWN0YWJsZQoJCQlpZiAoIXNlbGVjdGVlIHx8IHNlbGVjdGVlLmVsZW1lbnQgPT09IHRoYXQuZWxlbWVudFswXSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAob3B0aW9ucy50b2xlcmFuY2UgPT09ICJ0b3VjaCIpIHsKCQkJCWhpdCA9ICggIShzZWxlY3RlZS5sZWZ0ID4geDIgfHwgc2VsZWN0ZWUucmlnaHQgPCB4MSB8fCBzZWxlY3RlZS50b3AgPiB5MiB8fCBzZWxlY3RlZS5ib3R0b20gPCB5MSkgKTsKCQkJfSBlbHNlIGlmIChvcHRpb25zLnRvbGVyYW5jZSA9PT0gImZpdCIpIHsKCQkJCWhpdCA9IChzZWxlY3RlZS5sZWZ0ID4geDEgJiYgc2VsZWN0ZWUucmlnaHQgPCB4MiAmJiBzZWxlY3RlZS50b3AgPiB5MSAmJiBzZWxlY3RlZS5ib3R0b20gPCB5Mik7CgkJCX0KCgkJCWlmIChoaXQpIHsKCQkJCS8vIFNFTEVDVAoJCQkJaWYgKHNlbGVjdGVlLnNlbGVjdGVkKSB7CgkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIik7CgkJCQkJc2VsZWN0ZWUuc2VsZWN0ZWQgPSBmYWxzZTsKCQkJCX0KCQkJCWlmIChzZWxlY3RlZS51bnNlbGVjdGluZykgewoJCQkJCXNlbGVjdGVlLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpOwoJCQkJCXNlbGVjdGVlLnVuc2VsZWN0aW5nID0gZmFsc2U7CgkJCQl9CgkJCQlpZiAoIXNlbGVjdGVlLnNlbGVjdGluZykgewoJCQkJCXNlbGVjdGVlLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RpbmciKTsKCQkJCQlzZWxlY3RlZS5zZWxlY3RpbmcgPSB0cnVlOwoJCQkJCS8vIHNlbGVjdGFibGUgU0VMRUNUSU5HIGNhbGxiYWNrCgkJCQkJdGhhdC5fdHJpZ2dlcigic2VsZWN0aW5nIiwgZXZlbnQsIHsKCQkJCQkJc2VsZWN0aW5nOiBzZWxlY3RlZS5lbGVtZW50CgkJCQkJfSk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBVTlNFTEVDVAoJCQkJaWYgKHNlbGVjdGVlLnNlbGVjdGluZykgewoJCQkJCWlmICgoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJiBzZWxlY3RlZS5zdGFydHNlbGVjdGVkKSB7CgkJCQkJCXNlbGVjdGVlLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKTsKCQkJCQkJc2VsZWN0ZWUuc2VsZWN0aW5nID0gZmFsc2U7CgkJCQkJCXNlbGVjdGVlLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpOwoJCQkJCQlzZWxlY3RlZS5zZWxlY3RlZCA9IHRydWU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpOwoJCQkJCQlzZWxlY3RlZS5zZWxlY3RpbmcgPSBmYWxzZTsKCQkJCQkJaWYgKHNlbGVjdGVlLnN0YXJ0c2VsZWN0ZWQpIHsKCQkJCQkJCXNlbGVjdGVlLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpOwoJCQkJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSB0cnVlOwoJCQkJCQl9CgkJCQkJCS8vIHNlbGVjdGFibGUgVU5TRUxFQ1RJTkcgY2FsbGJhY2sKCQkJCQkJdGhhdC5fdHJpZ2dlcigidW5zZWxlY3RpbmciLCBldmVudCwgewoJCQkJCQkJdW5zZWxlY3Rpbmc6IHNlbGVjdGVlLmVsZW1lbnQKCQkJCQkJfSk7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKHNlbGVjdGVlLnNlbGVjdGVkKSB7CgkJCQkJaWYgKCFldmVudC5tZXRhS2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFzZWxlY3RlZS5zdGFydHNlbGVjdGVkKSB7CgkJCQkJCXNlbGVjdGVlLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpOwoJCQkJCQlzZWxlY3RlZS5zZWxlY3RlZCA9IGZhbHNlOwoKCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7CgkJCQkJCXNlbGVjdGVlLnVuc2VsZWN0aW5nID0gdHJ1ZTsKCQkJCQkJLy8gc2VsZWN0YWJsZSBVTlNFTEVDVElORyBjYWxsYmFjawoJCQkJCQl0aGF0Ll90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsIGV2ZW50LCB7CgkJCQkJCQl1bnNlbGVjdGluZzogc2VsZWN0ZWUuZWxlbWVudAoJCQkJCQl9KTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9KTsKCgkJcmV0dXJuIGZhbHNlOwoJfSwKCglfbW91c2VTdG9wOiBmdW5jdGlvbihldmVudCkgewoJCXZhciB0aGF0ID0gdGhpczsKCgkJdGhpcy5kcmFnZ2VkID0gZmFsc2U7CgoJCSQoIi51aS11bnNlbGVjdGluZyIsIHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHNlbGVjdGVlID0gJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0iKTsKCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7CgkJCXNlbGVjdGVlLnVuc2VsZWN0aW5nID0gZmFsc2U7CgkJCXNlbGVjdGVlLnN0YXJ0c2VsZWN0ZWQgPSBmYWxzZTsKCQkJdGhhdC5fdHJpZ2dlcigidW5zZWxlY3RlZCIsIGV2ZW50LCB7CgkJCQl1bnNlbGVjdGVkOiBzZWxlY3RlZS5lbGVtZW50CgkJCX0pOwoJCX0pOwoJCSQoIi51aS1zZWxlY3RpbmciLCB0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBzZWxlY3RlZSA9ICQuZGF0YSh0aGlzLCAic2VsZWN0YWJsZS1pdGVtIik7CgkJCXNlbGVjdGVlLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKS5hZGRDbGFzcygidWktc2VsZWN0ZWQiKTsKCQkJc2VsZWN0ZWUuc2VsZWN0aW5nID0gZmFsc2U7CgkJCXNlbGVjdGVlLnNlbGVjdGVkID0gdHJ1ZTsKCQkJc2VsZWN0ZWUuc3RhcnRzZWxlY3RlZCA9IHRydWU7CgkJCXRoYXQuX3RyaWdnZXIoInNlbGVjdGVkIiwgZXZlbnQsIHsKCQkJCXNlbGVjdGVkOiBzZWxlY3RlZS5lbGVtZW50CgkJCX0pOwoJCX0pOwoJCXRoaXMuX3RyaWdnZXIoInN0b3AiLCBldmVudCk7CgoJCXRoaXMuaGVscGVyLnJlbW92ZSgpOwoKCQlyZXR1cm4gZmFsc2U7Cgl9Cgp9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCi8qanNoaW50IGxvb3BmdW5jOiB0cnVlICovCgpmdW5jdGlvbiBpc092ZXJBeGlzKCB4LCByZWZlcmVuY2UsIHNpemUgKSB7CglyZXR1cm4gKCB4ID4gcmVmZXJlbmNlICkgJiYgKCB4IDwgKCByZWZlcmVuY2UgKyBzaXplICkgKTsKfQoKZnVuY3Rpb24gaXNGbG9hdGluZyhpdGVtKSB7CglyZXR1cm4gKC9sZWZ0fHJpZ2h0LykudGVzdChpdGVtLmNzcygiZmxvYXQiKSkgfHwgKC9pbmxpbmV8dGFibGUtY2VsbC8pLnRlc3QoaXRlbS5jc3MoImRpc3BsYXkiKSk7Cn0KCiQud2lkZ2V0KCJ1aS5zb3J0YWJsZSIsICQudWkubW91c2UsIHsKCXZlcnNpb246ICIxLjEwLjMiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICJzb3J0IiwKCXJlYWR5OiBmYWxzZSwKCW9wdGlvbnM6IHsKCQlhcHBlbmRUbzogInBhcmVudCIsCgkJYXhpczogZmFsc2UsCgkJY29ubmVjdFdpdGg6IGZhbHNlLAoJCWNvbnRhaW5tZW50OiBmYWxzZSwKCQljdXJzb3I6ICJhdXRvIiwKCQljdXJzb3JBdDogZmFsc2UsCgkJZHJvcE9uRW1wdHk6IHRydWUsCgkJZm9yY2VQbGFjZWhvbGRlclNpemU6IGZhbHNlLAoJCWZvcmNlSGVscGVyU2l6ZTogZmFsc2UsCgkJZ3JpZDogZmFsc2UsCgkJaGFuZGxlOiBmYWxzZSwKCQloZWxwZXI6ICJvcmlnaW5hbCIsCgkJaXRlbXM6ICI+ICoiLAoJCW9wYWNpdHk6IGZhbHNlLAoJCXBsYWNlaG9sZGVyOiBmYWxzZSwKCQlyZXZlcnQ6IGZhbHNlLAoJCXNjcm9sbDogdHJ1ZSwKCQlzY3JvbGxTZW5zaXRpdml0eTogMjAsCgkJc2Nyb2xsU3BlZWQ6IDIwLAoJCXNjb3BlOiAiZGVmYXVsdCIsCgkJdG9sZXJhbmNlOiAiaW50ZXJzZWN0IiwKCQl6SW5kZXg6IDEwMDAsCgoJCS8vIGNhbGxiYWNrcwoJCWFjdGl2YXRlOiBudWxsLAoJCWJlZm9yZVN0b3A6IG51bGwsCgkJY2hhbmdlOiBudWxsLAoJCWRlYWN0aXZhdGU6IG51bGwsCgkJb3V0OiBudWxsLAoJCW92ZXI6IG51bGwsCgkJcmVjZWl2ZTogbnVsbCwKCQlyZW1vdmU6IG51bGwsCgkJc29ydDogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsLAoJCXVwZGF0ZTogbnVsbAoJfSwKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCQl0aGlzLmNvbnRhaW5lckNhY2hlID0ge307CgkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zb3J0YWJsZSIpOwoKCQkvL0dldCB0aGUgaXRlbXMKCQl0aGlzLnJlZnJlc2goKTsKCgkJLy9MZXQncyBkZXRlcm1pbmUgaWYgdGhlIGl0ZW1zIGFyZSBiZWluZyBkaXNwbGF5ZWQgaG9yaXpvbnRhbGx5CgkJdGhpcy5mbG9hdGluZyA9IHRoaXMuaXRlbXMubGVuZ3RoID8gby5heGlzID09PSAieCIgfHwgaXNGbG9hdGluZyh0aGlzLml0ZW1zWzBdLml0ZW0pIDogZmFsc2U7CgoJCS8vTGV0J3MgZGV0ZXJtaW5lIHRoZSBwYXJlbnQncyBvZmZzZXQKCQl0aGlzLm9mZnNldCA9IHRoaXMuZWxlbWVudC5vZmZzZXQoKTsKCgkJLy9Jbml0aWFsaXplIG1vdXNlIGV2ZW50cyBmb3IgaW50ZXJhY3Rpb24KCQl0aGlzLl9tb3VzZUluaXQoKTsKCgkJLy9XZSdyZSByZWFkeSB0byBnbwoJCXRoaXMucmVhZHkgPSB0cnVlOwoKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlIHVpLXNvcnRhYmxlLWRpc2FibGVkIik7CgkJdGhpcy5fbW91c2VEZXN0cm95KCk7CgoJCWZvciAoIHZhciBpID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApIHsKCQkJdGhpcy5pdGVtc1tpXS5pdGVtLnJlbW92ZURhdGEodGhpcy53aWRnZXROYW1lICsgIi1pdGVtIik7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oa2V5LCB2YWx1ZSl7CgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgKSB7CgkJCXRoaXMub3B0aW9uc1sga2V5IF0gPSB2YWx1ZTsKCgkJCXRoaXMud2lkZ2V0KCkudG9nZ2xlQ2xhc3MoICJ1aS1zb3J0YWJsZS1kaXNhYmxlZCIsICEhdmFsdWUgKTsKCQl9IGVsc2UgewoJCQkvLyBEb24ndCBjYWxsIHdpZGdldCBiYXNlIF9zZXRPcHRpb24gZm9yIGRpc2FibGUgYXMgaXQgYWRkcyB1aS1zdGF0ZS1kaXNhYmxlZCBjbGFzcwoJCQkkLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoJCX0KCX0sCgoJX21vdXNlQ2FwdHVyZTogZnVuY3Rpb24oZXZlbnQsIG92ZXJyaWRlSGFuZGxlKSB7CgkJdmFyIGN1cnJlbnRJdGVtID0gbnVsbCwKCQkJdmFsaWRIYW5kbGUgPSBmYWxzZSwKCQkJdGhhdCA9IHRoaXM7CgoJCWlmICh0aGlzLnJldmVydGluZykgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWQgfHwgdGhpcy5vcHRpb25zLnR5cGUgPT09ICJzdGF0aWMiKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vV2UgaGF2ZSB0byByZWZyZXNoIHRoZSBpdGVtcyBkYXRhIG9uY2UgZmlyc3QKCQl0aGlzLl9yZWZyZXNoSXRlbXMoZXZlbnQpOwoKCQkvL0ZpbmQgb3V0IGlmIHRoZSBjbGlja2VkIG5vZGUgKG9yIG9uZSBvZiBpdHMgcGFyZW50cykgaXMgYSBhY3R1YWwgaXRlbSBpbiB0aGlzLml0ZW1zCgkJJChldmVudC50YXJnZXQpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZigkLmRhdGEodGhpcywgdGhhdC53aWRnZXROYW1lICsgIi1pdGVtIikgPT09IHRoYXQpIHsKCQkJCWN1cnJlbnRJdGVtID0gJCh0aGlzKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0pOwoJCWlmKCQuZGF0YShldmVudC50YXJnZXQsIHRoYXQud2lkZ2V0TmFtZSArICItaXRlbSIpID09PSB0aGF0KSB7CgkJCWN1cnJlbnRJdGVtID0gJChldmVudC50YXJnZXQpOwoJCX0KCgkJaWYoIWN1cnJlbnRJdGVtKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaWYodGhpcy5vcHRpb25zLmhhbmRsZSAmJiAhb3ZlcnJpZGVIYW5kbGUpIHsKCQkJJCh0aGlzLm9wdGlvbnMuaGFuZGxlLCBjdXJyZW50SXRlbSkuZmluZCgiKiIpLmFkZEJhY2soKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJaWYodGhpcyA9PT0gZXZlbnQudGFyZ2V0KSB7CgkJCQkJdmFsaWRIYW5kbGUgPSB0cnVlOwoJCQkJfQoJCQl9KTsKCQkJaWYoIXZhbGlkSGFuZGxlKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCXRoaXMuY3VycmVudEl0ZW0gPSBjdXJyZW50SXRlbTsKCQl0aGlzLl9yZW1vdmVDdXJyZW50c0Zyb21JdGVtcygpOwoJCXJldHVybiB0cnVlOwoKCX0sCgoJX21vdXNlU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCBvdmVycmlkZUhhbmRsZSwgbm9BY3RpdmF0aW9uKSB7CgoJCXZhciBpLCBib2R5LAoJCQlvID0gdGhpcy5vcHRpb25zOwoKCQl0aGlzLmN1cnJlbnRDb250YWluZXIgPSB0aGlzOwoKCQkvL1dlIG9ubHkgbmVlZCB0byBjYWxsIHJlZnJlc2hQb3NpdGlvbnMsIGJlY2F1c2UgdGhlIHJlZnJlc2hJdGVtcyBjYWxsIGhhcyBiZWVuIG1vdmVkIHRvIG1vdXNlQ2FwdHVyZQoJCXRoaXMucmVmcmVzaFBvc2l0aW9ucygpOwoKCQkvL0NyZWF0ZSBhbmQgYXBwZW5kIHRoZSB2aXNpYmxlIGhlbHBlcgoJCXRoaXMuaGVscGVyID0gdGhpcy5fY3JlYXRlSGVscGVyKGV2ZW50KTsKCgkJLy9DYWNoZSB0aGUgaGVscGVyIHNpemUKCQl0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7CgoJCS8qCgkJICogLSBQb3NpdGlvbiBnZW5lcmF0aW9uIC0KCQkgKiBUaGlzIGJsb2NrIGdlbmVyYXRlcyBldmVyeXRoaW5nIHBvc2l0aW9uIHJlbGF0ZWQgLSBpdCdzIHRoZSBjb3JlIG9mIGRyYWdnYWJsZXMuCgkJICovCgoJCS8vQ2FjaGUgdGhlIG1hcmdpbnMgb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQKCQl0aGlzLl9jYWNoZU1hcmdpbnMoKTsKCgkJLy9HZXQgdGhlIG5leHQgc2Nyb2xsaW5nIHBhcmVudAoJCXRoaXMuc2Nyb2xsUGFyZW50ID0gdGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCk7CgoJCS8vVGhlIGVsZW1lbnQncyBhYnNvbHV0ZSBwb3NpdGlvbiBvbiB0aGUgcGFnZSBtaW51cyBtYXJnaW5zCgkJdGhpcy5vZmZzZXQgPSB0aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpOwoJCXRoaXMub2Zmc2V0ID0gewoJCQl0b3A6IHRoaXMub2Zmc2V0LnRvcCAtIHRoaXMubWFyZ2lucy50b3AsCgkJCWxlZnQ6IHRoaXMub2Zmc2V0LmxlZnQgLSB0aGlzLm1hcmdpbnMubGVmdAoJCX07CgoJCSQuZXh0ZW5kKHRoaXMub2Zmc2V0LCB7CgkJCWNsaWNrOiB7IC8vV2hlcmUgdGhlIGNsaWNrIGhhcHBlbmVkLCByZWxhdGl2ZSB0byB0aGUgZWxlbWVudAoJCQkJbGVmdDogZXZlbnQucGFnZVggLSB0aGlzLm9mZnNldC5sZWZ0LAoJCQkJdG9wOiBldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0LnRvcAoJCQl9LAoJCQlwYXJlbnQ6IHRoaXMuX2dldFBhcmVudE9mZnNldCgpLAoJCQlyZWxhdGl2ZTogdGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSAvL1RoaXMgaXMgYSByZWxhdGl2ZSB0byBhYnNvbHV0ZSBwb3NpdGlvbiBtaW51cyB0aGUgYWN0dWFsIHBvc2l0aW9uIGNhbGN1bGF0aW9uIC0gb25seSB1c2VkIGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIGhlbHBlcgoJCX0pOwoKCQkvLyBPbmx5IGFmdGVyIHdlIGdvdCB0aGUgb2Zmc2V0LCB3ZSBjYW4gY2hhbmdlIHRoZSBoZWxwZXIncyBwb3NpdGlvbiB0byBhYnNvbHV0ZQoJCS8vIFRPRE86IFN0aWxsIG5lZWQgdG8gZmlndXJlIG91dCBhIHdheSB0byBtYWtlIHJlbGF0aXZlIHNvcnRpbmcgcG9zc2libGUKCQl0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIik7CgkJdGhpcy5jc3NQb3NpdGlvbiA9IHRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKTsKCgkJLy9HZW5lcmF0ZSB0aGUgb3JpZ2luYWwgcG9zaXRpb24KCQl0aGlzLm9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGV2ZW50KTsKCQl0aGlzLm9yaWdpbmFsUGFnZVggPSBldmVudC5wYWdlWDsKCQl0aGlzLm9yaWdpbmFsUGFnZVkgPSBldmVudC5wYWdlWTsKCgkJLy9BZGp1c3QgdGhlIG1vdXNlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgaGVscGVyIGlmICJjdXJzb3JBdCIgaXMgc3VwcGxpZWQKCQkoby5jdXJzb3JBdCAmJiB0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKG8uY3Vyc29yQXQpKTsKCgkJLy9DYWNoZSB0aGUgZm9ybWVyIERPTSBwb3NpdGlvbgoJCXRoaXMuZG9tUG9zaXRpb24gPSB7IHByZXY6IHRoaXMuY3VycmVudEl0ZW0ucHJldigpWzBdLCBwYXJlbnQ6IHRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF0gfTsKCgkJLy9JZiB0aGUgaGVscGVyIGlzIG5vdCB0aGUgb3JpZ2luYWwsIGhpZGUgdGhlIG9yaWdpbmFsIHNvIGl0J3Mgbm90IHBsYXlpbmcgYW55IHJvbGUgZHVyaW5nIHRoZSBkcmFnLCB3b24ndCBjYXVzZSBhbnl0aGluZyBiYWQgdGhpcyB3YXkKCQlpZih0aGlzLmhlbHBlclswXSAhPT0gdGhpcy5jdXJyZW50SXRlbVswXSkgewoJCQl0aGlzLmN1cnJlbnRJdGVtLmhpZGUoKTsKCQl9CgoJCS8vQ3JlYXRlIHRoZSBwbGFjZWhvbGRlcgoJCXRoaXMuX2NyZWF0ZVBsYWNlaG9sZGVyKCk7CgoJCS8vU2V0IGEgY29udGFpbm1lbnQgaWYgZ2l2ZW4gaW4gdGhlIG9wdGlvbnMKCQlpZihvLmNvbnRhaW5tZW50KSB7CgkJCXRoaXMuX3NldENvbnRhaW5tZW50KCk7CgkJfQoKCQlpZiggby5jdXJzb3IgJiYgby5jdXJzb3IgIT09ICJhdXRvIiApIHsgLy8gY3Vyc29yIG9wdGlvbgoJCQlib2R5ID0gdGhpcy5kb2N1bWVudC5maW5kKCAiYm9keSIgKTsKCgkJCS8vIHN1cHBvcnQ6IElFCgkJCXRoaXMuc3RvcmVkQ3Vyc29yID0gYm9keS5jc3MoICJjdXJzb3IiICk7CgkJCWJvZHkuY3NzKCAiY3Vyc29yIiwgby5jdXJzb3IgKTsKCgkJCXRoaXMuc3RvcmVkU3R5bGVzaGVldCA9ICQoICI8c3R5bGU+KnsgY3Vyc29yOiAiK28uY3Vyc29yKyIgIWltcG9ydGFudDsgfTwvc3R5bGU+IiApLmFwcGVuZFRvKCBib2R5ICk7CgkJfQoKCQlpZihvLm9wYWNpdHkpIHsgLy8gb3BhY2l0eSBvcHRpb24KCQkJaWYgKHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpKSB7CgkJCQl0aGlzLl9zdG9yZWRPcGFjaXR5ID0gdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iik7CgkJCX0KCQkJdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iiwgby5vcGFjaXR5KTsKCQl9CgoJCWlmKG8uekluZGV4KSB7IC8vIHpJbmRleCBvcHRpb24KCQkJaWYgKHRoaXMuaGVscGVyLmNzcygiekluZGV4IikpIHsKCQkJCXRoaXMuX3N0b3JlZFpJbmRleCA9IHRoaXMuaGVscGVyLmNzcygiekluZGV4Iik7CgkJCX0KCQkJdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLCBvLnpJbmRleCk7CgkJfQoKCQkvL1ByZXBhcmUgc2Nyb2xsaW5nCgkJaWYodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT09IGRvY3VtZW50ICYmIHRoaXMuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUgIT09ICJIVE1MIikgewoJCQl0aGlzLm92ZXJmbG93T2Zmc2V0ID0gdGhpcy5zY3JvbGxQYXJlbnQub2Zmc2V0KCk7CgkJfQoKCQkvL0NhbGwgY2FsbGJhY2tzCgkJdGhpcy5fdHJpZ2dlcigic3RhcnQiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoKCQkvL1JlY2FjaGUgdGhlIGhlbHBlciBzaXplCgkJaWYoIXRoaXMuX3ByZXNlcnZlSGVscGVyUHJvcG9ydGlvbnMpIHsKCQkJdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpOwoJCX0KCgoJCS8vUG9zdCAiYWN0aXZhdGUiIGV2ZW50cyB0byBwb3NzaWJsZSBjb250YWluZXJzCgkJaWYoICFub0FjdGl2YXRpb24gKSB7CgkJCWZvciAoIGkgPSB0aGlzLmNvbnRhaW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7CgkJCQl0aGlzLmNvbnRhaW5lcnNbIGkgXS5fdHJpZ2dlciggImFjdGl2YXRlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCggdGhpcyApICk7CgkJCX0KCQl9CgoJCS8vUHJlcGFyZSBwb3NzaWJsZSBkcm9wcGFibGVzCgkJaWYoJC51aS5kZG1hbmFnZXIpIHsKCQkJJC51aS5kZG1hbmFnZXIuY3VycmVudCA9IHRoaXM7CgkJfQoKCQlpZiAoJC51aS5kZG1hbmFnZXIgJiYgIW8uZHJvcEJlaGF2aW91cikgewoJCQkkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLCBldmVudCk7CgkJfQoKCQl0aGlzLmRyYWdnaW5nID0gdHJ1ZTsKCgkJdGhpcy5oZWxwZXIuYWRkQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOwoJCXRoaXMuX21vdXNlRHJhZyhldmVudCk7IC8vRXhlY3V0ZSB0aGUgZHJhZyBvbmNlIC0gdGhpcyBjYXVzZXMgdGhlIGhlbHBlciBub3QgdG8gYmUgdmlzaWJsZSBiZWZvcmUgZ2V0dGluZyBpdHMgY29ycmVjdCBwb3NpdGlvbgoJCXJldHVybiB0cnVlOwoKCX0sCgoJX21vdXNlRHJhZzogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgaSwgaXRlbSwgaXRlbUVsZW1lbnQsIGludGVyc2VjdGlvbiwKCQkJbyA9IHRoaXMub3B0aW9ucywKCQkJc2Nyb2xsZWQgPSBmYWxzZTsKCgkJLy9Db21wdXRlIHRoZSBoZWxwZXJzIHBvc2l0aW9uCgkJdGhpcy5wb3NpdGlvbiA9IHRoaXMuX2dlbmVyYXRlUG9zaXRpb24oZXZlbnQpOwoJCXRoaXMucG9zaXRpb25BYnMgPSB0aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKTsKCgkJaWYgKCF0aGlzLmxhc3RQb3NpdGlvbkFicykgewoJCQl0aGlzLmxhc3RQb3NpdGlvbkFicyA9IHRoaXMucG9zaXRpb25BYnM7CgkJfQoKCQkvL0RvIHNjcm9sbGluZwoJCWlmKHRoaXMub3B0aW9ucy5zY3JvbGwpIHsKCQkJaWYodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT09IGRvY3VtZW50ICYmIHRoaXMuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUgIT09ICJIVE1MIikgewoKCQkJCWlmKCh0aGlzLm92ZXJmbG93T2Zmc2V0LnRvcCArIHRoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodCkgLSBldmVudC5wYWdlWSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQl0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgPSBzY3JvbGxlZCA9IHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCArIG8uc2Nyb2xsU3BlZWQ7CgkJCQl9IGVsc2UgaWYoZXZlbnQucGFnZVkgLSB0aGlzLm92ZXJmbG93T2Zmc2V0LnRvcCA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQl0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgPSBzY3JvbGxlZCA9IHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCAtIG8uc2Nyb2xsU3BlZWQ7CgkJCQl9CgoJCQkJaWYoKHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCArIHRoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldFdpZHRoKSAtIGV2ZW50LnBhZ2VYIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgPSBzY3JvbGxlZCA9IHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgKyBvLnNjcm9sbFNwZWVkOwoJCQkJfSBlbHNlIGlmKGV2ZW50LnBhZ2VYIC0gdGhpcy5vdmVyZmxvd09mZnNldC5sZWZ0IDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgPSBzY3JvbGxlZCA9IHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgLSBvLnNjcm9sbFNwZWVkOwoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQlpZihldmVudC5wYWdlWSAtICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIC0gby5zY3JvbGxTcGVlZCk7CgkJCQl9IGVsc2UgaWYoJCh3aW5kb3cpLmhlaWdodCgpIC0gKGV2ZW50LnBhZ2VZIC0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCkpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpICsgby5zY3JvbGxTcGVlZCk7CgkJCQl9CgoJCQkJaWYoZXZlbnQucGFnZVggLSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KSB7CgkJCQkJc2Nyb2xsZWQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSAtIG8uc2Nyb2xsU3BlZWQpOwoJCQkJfSBlbHNlIGlmKCQod2luZG93KS53aWR0aCgpIC0gKGV2ZW50LnBhZ2VYIC0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpICsgby5zY3JvbGxTcGVlZCk7CgkJCQl9CgoJCQl9CgoJCQlpZihzY3JvbGxlZCAhPT0gZmFsc2UgJiYgJC51aS5kZG1hbmFnZXIgJiYgIW8uZHJvcEJlaGF2aW91cikgewoJCQkJJC51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcywgZXZlbnQpOwoJCQl9CgkJfQoKCQkvL1JlZ2VuZXJhdGUgdGhlIGFic29sdXRlIHBvc2l0aW9uIHVzZWQgZm9yIHBvc2l0aW9uIGNoZWNrcwoJCXRoaXMucG9zaXRpb25BYnMgPSB0aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKTsKCgkJLy9TZXQgdGhlIGhlbHBlciBwb3NpdGlvbgoJCWlmKCF0aGlzLm9wdGlvbnMuYXhpcyB8fCB0aGlzLm9wdGlvbnMuYXhpcyAhPT0gInkiKSB7CgkJCXRoaXMuaGVscGVyWzBdLnN0eWxlLmxlZnQgPSB0aGlzLnBvc2l0aW9uLmxlZnQrInB4IjsKCQl9CgkJaWYoIXRoaXMub3B0aW9ucy5heGlzIHx8IHRoaXMub3B0aW9ucy5heGlzICE9PSAieCIpIHsKCQkJdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wID0gdGhpcy5wb3NpdGlvbi50b3ArInB4IjsKCQl9CgoJCS8vUmVhcnJhbmdlCgkJZm9yIChpID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoKCQkJLy9DYWNoZSB2YXJpYWJsZXMgYW5kIGludGVyc2VjdGlvbiwgY29udGludWUgaWYgbm8gaW50ZXJzZWN0aW9uCgkJCWl0ZW0gPSB0aGlzLml0ZW1zW2ldOwoJCQlpdGVtRWxlbWVudCA9IGl0ZW0uaXRlbVswXTsKCQkJaW50ZXJzZWN0aW9uID0gdGhpcy5faW50ZXJzZWN0c1dpdGhQb2ludGVyKGl0ZW0pOwoJCQlpZiAoIWludGVyc2VjdGlvbikgewoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIE9ubHkgcHV0IHRoZSBwbGFjZWhvbGRlciBpbnNpZGUgdGhlIGN1cnJlbnQgQ29udGFpbmVyLCBza2lwIGFsbAoJCQkvLyBpdGVtcyBmb3JtIG90aGVyIGNvbnRhaW5lcnMuIFRoaXMgd29ya3MgYmVjYXVzZSB3aGVuIG1vdmluZwoJCQkvLyBhbiBpdGVtIGZyb20gb25lIGNvbnRhaW5lciB0byBhbm90aGVyIHRoZQoJCQkvLyBjdXJyZW50Q29udGFpbmVyIGlzIHN3aXRjaGVkIGJlZm9yZSB0aGUgcGxhY2Vob2xkZXIgaXMgbW92ZWQuCgkJCS8vCgkJCS8vIFdpdGhvdXQgdGhpcyBtb3ZpbmcgaXRlbXMgaW4gInN1Yi1zb3J0YWJsZXMiIGNhbiBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gaml0dGVyCgkJCS8vIGJlZXR3ZWVuIHRoZSBvdXRlciBhbmQgaW5uZXIgY29udGFpbmVyLgoJCQlpZiAoaXRlbS5pbnN0YW5jZSAhPT0gdGhpcy5jdXJyZW50Q29udGFpbmVyKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gY2Fubm90IGludGVyc2VjdCB3aXRoIGl0c2VsZgoJCQkvLyBubyB1c2VsZXNzIGFjdGlvbnMgdGhhdCBoYXZlIGJlZW4gZG9uZSBiZWZvcmUKCQkJLy8gbm8gYWN0aW9uIGlmIHRoZSBpdGVtIG1vdmVkIGlzIHRoZSBwYXJlbnQgb2YgdGhlIGl0ZW0gY2hlY2tlZAoJCQlpZiAoaXRlbUVsZW1lbnQgIT09IHRoaXMuY3VycmVudEl0ZW1bMF0gJiYKCQkJCXRoaXMucGxhY2Vob2xkZXJbaW50ZXJzZWN0aW9uID09PSAxID8gIm5leHQiIDogInByZXYiXSgpWzBdICE9PSBpdGVtRWxlbWVudCAmJgoJCQkJISQuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSwgaXRlbUVsZW1lbnQpICYmCgkJCQkodGhpcy5vcHRpb25zLnR5cGUgPT09ICJzZW1pLWR5bmFtaWMiID8gISQuY29udGFpbnModGhpcy5lbGVtZW50WzBdLCBpdGVtRWxlbWVudCkgOiB0cnVlKQoJCQkpIHsKCgkJCQl0aGlzLmRpcmVjdGlvbiA9IGludGVyc2VjdGlvbiA9PT0gMSA/ICJkb3duIiA6ICJ1cCI7CgoJCQkJaWYgKHRoaXMub3B0aW9ucy50b2xlcmFuY2UgPT09ICJwb2ludGVyIiB8fCB0aGlzLl9pbnRlcnNlY3RzV2l0aFNpZGVzKGl0ZW0pKSB7CgkJCQkJdGhpcy5fcmVhcnJhbmdlKGV2ZW50LCBpdGVtKTsKCQkJCX0gZWxzZSB7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJdGhpcy5fdHJpZ2dlcigiY2hhbmdlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQkvL1Bvc3QgZXZlbnRzIHRvIGNvbnRhaW5lcnMKCQl0aGlzLl9jb250YWN0Q29udGFpbmVycyhldmVudCk7CgoJCS8vSW50ZXJjb25uZWN0IHdpdGggZHJvcHBhYmxlcwoJCWlmKCQudWkuZGRtYW5hZ2VyKSB7CgkJCSQudWkuZGRtYW5hZ2VyLmRyYWcodGhpcywgZXZlbnQpOwoJCX0KCgkJLy9DYWxsIGNhbGxiYWNrcwoJCXRoaXMuX3RyaWdnZXIoInNvcnQiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoKCQl0aGlzLmxhc3RQb3NpdGlvbkFicyA9IHRoaXMucG9zaXRpb25BYnM7CgkJcmV0dXJuIGZhbHNlOwoKCX0sCgoJX21vdXNlU3RvcDogZnVuY3Rpb24oZXZlbnQsIG5vUHJvcGFnYXRpb24pIHsKCgkJaWYoIWV2ZW50KSB7CgkJCXJldHVybjsKCQl9CgoJCS8vSWYgd2UgYXJlIHVzaW5nIGRyb3BwYWJsZXMsIGluZm9ybSB0aGUgbWFuYWdlciBhYm91dCB0aGUgZHJvcAoJCWlmICgkLnVpLmRkbWFuYWdlciAmJiAhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXIpIHsKCQkJJC51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLCBldmVudCk7CgkJfQoKCQlpZih0aGlzLm9wdGlvbnMucmV2ZXJ0KSB7CgkJCXZhciB0aGF0ID0gdGhpcywKCQkJCWN1ciA9IHRoaXMucGxhY2Vob2xkZXIub2Zmc2V0KCksCgkJCQlheGlzID0gdGhpcy5vcHRpb25zLmF4aXMsCgkJCQlhbmltYXRpb24gPSB7fTsKCgkJCWlmICggIWF4aXMgfHwgYXhpcyA9PT0gIngiICkgewoJCQkJYW5pbWF0aW9uLmxlZnQgPSBjdXIubGVmdCAtIHRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0IC0gdGhpcy5tYXJnaW5zLmxlZnQgKyAodGhpcy5vZmZzZXRQYXJlbnRbMF0gPT09IGRvY3VtZW50LmJvZHkgPyAwIDogdGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsTGVmdCk7CgkJCX0KCQkJaWYgKCAhYXhpcyB8fCBheGlzID09PSAieSIgKSB7CgkJCQlhbmltYXRpb24udG9wID0gY3VyLnRvcCAtIHRoaXMub2Zmc2V0LnBhcmVudC50b3AgLSB0aGlzLm1hcmdpbnMudG9wICsgKHRoaXMub2Zmc2V0UGFyZW50WzBdID09PSBkb2N1bWVudC5ib2R5ID8gMCA6IHRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbFRvcCk7CgkJCX0KCQkJdGhpcy5yZXZlcnRpbmcgPSB0cnVlOwoJCQkkKHRoaXMuaGVscGVyKS5hbmltYXRlKCBhbmltYXRpb24sIHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnQsIDEwKSB8fCA1MDAsIGZ1bmN0aW9uKCkgewoJCQkJdGhhdC5fY2xlYXIoZXZlbnQpOwoJCQl9KTsKCQl9IGVsc2UgewoJCQl0aGlzLl9jbGVhcihldmVudCwgbm9Qcm9wYWdhdGlvbik7CgkJfQoKCQlyZXR1cm4gZmFsc2U7CgoJfSwKCgljYW5jZWw6IGZ1bmN0aW9uKCkgewoKCQlpZih0aGlzLmRyYWdnaW5nKSB7CgoJCQl0aGlzLl9tb3VzZVVwKHsgdGFyZ2V0OiBudWxsIH0pOwoKCQkJaWYodGhpcy5vcHRpb25zLmhlbHBlciA9PT0gIm9yaWdpbmFsIikgewoJCQkJdGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIik7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmN1cnJlbnRJdGVtLnNob3coKTsKCQkJfQoKCQkJLy9Qb3N0IGRlYWN0aXZhdGluZyBldmVudHMgdG8gY29udGFpbmVycwoJCQlmb3IgKHZhciBpID0gdGhpcy5jb250YWluZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsIG51bGwsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgkJCQlpZih0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlcikgewoJCQkJCXRoaXMuY29udGFpbmVyc1tpXS5fdHJpZ2dlcigib3V0IiwgbnVsbCwgdGhpcy5fdWlIYXNoKHRoaXMpKTsKCQkJCQl0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlciA9IDA7CgkJCQl9CgkJCX0KCgkJfQoKCQlpZiAodGhpcy5wbGFjZWhvbGRlcikgewoJCQkvLyQodGhpcy5wbGFjZWhvbGRlclswXSkucmVtb3ZlKCk7IHdvdWxkIGhhdmUgYmVlbiB0aGUgalF1ZXJ5IHdheSAtIHVuZm9ydHVuYXRlbHksIGl0IHVuYmluZHMgQUxMIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBub2RlIQoJCQlpZih0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUpIHsKCQkJCXRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKTsKCQkJfQoJCQlpZih0aGlzLm9wdGlvbnMuaGVscGVyICE9PSAib3JpZ2luYWwiICYmIHRoaXMuaGVscGVyICYmIHRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpIHsKCQkJCXRoaXMuaGVscGVyLnJlbW92ZSgpOwoJCQl9CgoJCQkkLmV4dGVuZCh0aGlzLCB7CgkJCQloZWxwZXI6IG51bGwsCgkJCQlkcmFnZ2luZzogZmFsc2UsCgkJCQlyZXZlcnRpbmc6IGZhbHNlLAoJCQkJX25vRmluYWxTb3J0OiBudWxsCgkJCX0pOwoKCQkJaWYodGhpcy5kb21Qb3NpdGlvbi5wcmV2KSB7CgkJCQkkKHRoaXMuZG9tUG9zaXRpb24ucHJldikuYWZ0ZXIodGhpcy5jdXJyZW50SXRlbSk7CgkJCX0gZWxzZSB7CgkJCQkkKHRoaXMuZG9tUG9zaXRpb24ucGFyZW50KS5wcmVwZW5kKHRoaXMuY3VycmVudEl0ZW0pOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCgl9LAoKCXNlcmlhbGl6ZTogZnVuY3Rpb24obykgewoKCQl2YXIgaXRlbXMgPSB0aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KG8gJiYgby5jb25uZWN0ZWQpLAoJCQlzdHIgPSBbXTsKCQlvID0gbyB8fCB7fTsKCgkJJChpdGVtcykuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHJlcyA9ICgkKG8uaXRlbSB8fCB0aGlzKS5hdHRyKG8uYXR0cmlidXRlIHx8ICJpZCIpIHx8ICIiKS5tYXRjaChvLmV4cHJlc3Npb24gfHwgKC8oLispW1wtPV9dKC4rKS8pKTsKCQkJaWYgKHJlcykgewoJCQkJc3RyLnB1c2goKG8ua2V5IHx8IHJlc1sxXSsiW10iKSsiPSIrKG8ua2V5ICYmIG8uZXhwcmVzc2lvbiA/IHJlc1sxXSA6IHJlc1syXSkpOwoJCQl9CgkJfSk7CgoJCWlmKCFzdHIubGVuZ3RoICYmIG8ua2V5KSB7CgkJCXN0ci5wdXNoKG8ua2V5ICsgIj0iKTsKCQl9CgoJCXJldHVybiBzdHIuam9pbigiJiIpOwoKCX0sCgoJdG9BcnJheTogZnVuY3Rpb24obykgewoKCQl2YXIgaXRlbXMgPSB0aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KG8gJiYgby5jb25uZWN0ZWQpLAoJCQlyZXQgPSBbXTsKCgkJbyA9IG8gfHwge307CgoJCWl0ZW1zLmVhY2goZnVuY3Rpb24oKSB7IHJldC5wdXNoKCQoby5pdGVtIHx8IHRoaXMpLmF0dHIoby5hdHRyaWJ1dGUgfHwgImlkIikgfHwgIiIpOyB9KTsKCQlyZXR1cm4gcmV0OwoKCX0sCgoJLyogQmUgY2FyZWZ1bCB3aXRoIHRoZSBmb2xsb3dpbmcgY29yZSBmdW5jdGlvbnMgKi8KCV9pbnRlcnNlY3RzV2l0aDogZnVuY3Rpb24oaXRlbSkgewoKCQl2YXIgeDEgPSB0aGlzLnBvc2l0aW9uQWJzLmxlZnQsCgkJCXgyID0geDEgKyB0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLAoJCQl5MSA9IHRoaXMucG9zaXRpb25BYnMudG9wLAoJCQl5MiA9IHkxICsgdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsCgkJCWwgPSBpdGVtLmxlZnQsCgkJCXIgPSBsICsgaXRlbS53aWR0aCwKCQkJdCA9IGl0ZW0udG9wLAoJCQliID0gdCArIGl0ZW0uaGVpZ2h0LAoJCQlkeUNsaWNrID0gdGhpcy5vZmZzZXQuY2xpY2sudG9wLAoJCQlkeENsaWNrID0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCwKCQkJaXNPdmVyRWxlbWVudEhlaWdodCA9ICggdGhpcy5vcHRpb25zLmF4aXMgPT09ICJ4IiApIHx8ICggKCB5MSArIGR5Q2xpY2sgKSA+IHQgJiYgKCB5MSArIGR5Q2xpY2sgKSA8IGIgKSwKCQkJaXNPdmVyRWxlbWVudFdpZHRoID0gKCB0aGlzLm9wdGlvbnMuYXhpcyA9PT0gInkiICkgfHwgKCAoIHgxICsgZHhDbGljayApID4gbCAmJiAoIHgxICsgZHhDbGljayApIDwgciApLAoJCQlpc092ZXJFbGVtZW50ID0gaXNPdmVyRWxlbWVudEhlaWdodCAmJiBpc092ZXJFbGVtZW50V2lkdGg7CgoJCWlmICggdGhpcy5vcHRpb25zLnRvbGVyYW5jZSA9PT0gInBvaW50ZXIiIHx8CgkJCXRoaXMub3B0aW9ucy5mb3JjZVBvaW50ZXJGb3JDb250YWluZXJzIHx8CgkJCSh0aGlzLm9wdGlvbnMudG9sZXJhbmNlICE9PSAicG9pbnRlciIgJiYgdGhpcy5oZWxwZXJQcm9wb3J0aW9uc1t0aGlzLmZsb2F0aW5nID8gIndpZHRoIiA6ICJoZWlnaHQiXSA+IGl0ZW1bdGhpcy5mbG9hdGluZyA/ICJ3aWR0aCIgOiAiaGVpZ2h0Il0pCgkJKSB7CgkJCXJldHVybiBpc092ZXJFbGVtZW50OwoJCX0gZWxzZSB7CgoJCQlyZXR1cm4gKGwgPCB4MSArICh0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC8gMikgJiYgLy8gUmlnaHQgSGFsZgoJCQkJeDIgLSAodGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAvIDIpIDwgciAmJiAvLyBMZWZ0IEhhbGYKCQkJCXQgPCB5MSArICh0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAvIDIpICYmIC8vIEJvdHRvbSBIYWxmCgkJCQl5MiAtICh0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAvIDIpIDwgYiApOyAvLyBUb3AgSGFsZgoKCQl9Cgl9LAoKCV9pbnRlcnNlY3RzV2l0aFBvaW50ZXI6IGZ1bmN0aW9uKGl0ZW0pIHsKCgkJdmFyIGlzT3ZlckVsZW1lbnRIZWlnaHQgPSAodGhpcy5vcHRpb25zLmF4aXMgPT09ICJ4IikgfHwgaXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCArIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCwgaXRlbS50b3AsIGl0ZW0uaGVpZ2h0KSwKCQkJaXNPdmVyRWxlbWVudFdpZHRoID0gKHRoaXMub3B0aW9ucy5heGlzID09PSAieSIpIHx8IGlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0ICsgdGhpcy5vZmZzZXQuY2xpY2subGVmdCwgaXRlbS5sZWZ0LCBpdGVtLndpZHRoKSwKCQkJaXNPdmVyRWxlbWVudCA9IGlzT3ZlckVsZW1lbnRIZWlnaHQgJiYgaXNPdmVyRWxlbWVudFdpZHRoLAoJCQl2ZXJ0aWNhbERpcmVjdGlvbiA9IHRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLAoJCQlob3Jpem9udGFsRGlyZWN0aW9uID0gdGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTsKCgkJaWYgKCFpc092ZXJFbGVtZW50KSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXJldHVybiB0aGlzLmZsb2F0aW5nID8KCQkJKCAoKGhvcml6b250YWxEaXJlY3Rpb24gJiYgaG9yaXpvbnRhbERpcmVjdGlvbiA9PT0gInJpZ2h0IikgfHwgdmVydGljYWxEaXJlY3Rpb24gPT09ICJkb3duIikgPyAyIDogMSApCgkJCTogKCB2ZXJ0aWNhbERpcmVjdGlvbiAmJiAodmVydGljYWxEaXJlY3Rpb24gPT09ICJkb3duIiA/IDIgOiAxKSApOwoKCX0sCgoJX2ludGVyc2VjdHNXaXRoU2lkZXM6IGZ1bmN0aW9uKGl0ZW0pIHsKCgkJdmFyIGlzT3ZlckJvdHRvbUhhbGYgPSBpc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wICsgdGhpcy5vZmZzZXQuY2xpY2sudG9wLCBpdGVtLnRvcCArIChpdGVtLmhlaWdodC8yKSwgaXRlbS5oZWlnaHQpLAoJCQlpc092ZXJSaWdodEhhbGYgPSBpc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCArIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsIGl0ZW0ubGVmdCArIChpdGVtLndpZHRoLzIpLCBpdGVtLndpZHRoKSwKCQkJdmVydGljYWxEaXJlY3Rpb24gPSB0aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSwKCQkJaG9yaXpvbnRhbERpcmVjdGlvbiA9IHRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7CgoJCWlmICh0aGlzLmZsb2F0aW5nICYmIGhvcml6b250YWxEaXJlY3Rpb24pIHsKCQkJcmV0dXJuICgoaG9yaXpvbnRhbERpcmVjdGlvbiA9PT0gInJpZ2h0IiAmJiBpc092ZXJSaWdodEhhbGYpIHx8IChob3Jpem9udGFsRGlyZWN0aW9uID09PSAibGVmdCIgJiYgIWlzT3ZlclJpZ2h0SGFsZikpOwoJCX0gZWxzZSB7CgkJCXJldHVybiB2ZXJ0aWNhbERpcmVjdGlvbiAmJiAoKHZlcnRpY2FsRGlyZWN0aW9uID09PSAiZG93biIgJiYgaXNPdmVyQm90dG9tSGFsZikgfHwgKHZlcnRpY2FsRGlyZWN0aW9uID09PSAidXAiICYmICFpc092ZXJCb3R0b21IYWxmKSk7CgkJfQoKCX0sCgoJX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGRlbHRhID0gdGhpcy5wb3NpdGlvbkFicy50b3AgLSB0aGlzLmxhc3RQb3NpdGlvbkFicy50b3A7CgkJcmV0dXJuIGRlbHRhICE9PSAwICYmIChkZWx0YSA+IDAgPyAiZG93biIgOiAidXAiKTsKCX0sCgoJX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOiBmdW5jdGlvbigpIHsKCQl2YXIgZGVsdGEgPSB0aGlzLnBvc2l0aW9uQWJzLmxlZnQgLSB0aGlzLmxhc3RQb3NpdGlvbkFicy5sZWZ0OwoJCXJldHVybiBkZWx0YSAhPT0gMCAmJiAoZGVsdGEgPiAwID8gInJpZ2h0IiA6ICJsZWZ0Iik7Cgl9LAoKCXJlZnJlc2g6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdGhpcy5fcmVmcmVzaEl0ZW1zKGV2ZW50KTsKCQl0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJX2Nvbm5lY3RXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCQlyZXR1cm4gb3B0aW9ucy5jb25uZWN0V2l0aC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nID8gW29wdGlvbnMuY29ubmVjdFdpdGhdIDogb3B0aW9ucy5jb25uZWN0V2l0aDsKCX0sCgoJX2dldEl0ZW1zQXNqUXVlcnk6IGZ1bmN0aW9uKGNvbm5lY3RlZCkgewoKCQl2YXIgaSwgaiwgY3VyLCBpbnN0LAoJCQlpdGVtcyA9IFtdLAoJCQlxdWVyaWVzID0gW10sCgkJCWNvbm5lY3RXaXRoID0gdGhpcy5fY29ubmVjdFdpdGgoKTsKCgkJaWYoY29ubmVjdFdpdGggJiYgY29ubmVjdGVkKSB7CgkJCWZvciAoaSA9IGNvbm5lY3RXaXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJCWN1ciA9ICQoY29ubmVjdFdpdGhbaV0pOwoJCQkJZm9yICggaiA9IGN1ci5sZW5ndGggLSAxOyBqID49IDA7IGotLSl7CgkJCQkJaW5zdCA9ICQuZGF0YShjdXJbal0sIHRoaXMud2lkZ2V0RnVsbE5hbWUpOwoJCQkJCWlmKGluc3QgJiYgaW5zdCAhPT0gdGhpcyAmJiAhaW5zdC5vcHRpb25zLmRpc2FibGVkKSB7CgkJCQkJCXF1ZXJpZXMucHVzaChbJC5pc0Z1bmN0aW9uKGluc3Qub3B0aW9ucy5pdGVtcykgPyBpbnN0Lm9wdGlvbnMuaXRlbXMuY2FsbChpbnN0LmVsZW1lbnQpIDogJChpbnN0Lm9wdGlvbnMuaXRlbXMsIGluc3QuZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSwgaW5zdF0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcXVlcmllcy5wdXNoKFskLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKSA/IHRoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudCwgbnVsbCwgeyBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIGl0ZW06IHRoaXMuY3VycmVudEl0ZW0gfSkgOiAkKHRoaXMub3B0aW9ucy5pdGVtcywgdGhpcy5lbGVtZW50KS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKS5ub3QoIi51aS1zb3J0YWJsZS1wbGFjZWhvbGRlciIpLCB0aGlzXSk7CgoJCWZvciAoaSA9IHF1ZXJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pewoJCQlxdWVyaWVzW2ldWzBdLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlpdGVtcy5wdXNoKHRoaXMpOwoJCQl9KTsKCQl9CgoJCXJldHVybiAkKGl0ZW1zKTsKCgl9LAoKCV9yZW1vdmVDdXJyZW50c0Zyb21JdGVtczogZnVuY3Rpb24oKSB7CgoJCXZhciBsaXN0ID0gdGhpcy5jdXJyZW50SXRlbS5maW5kKCI6ZGF0YSgiICsgdGhpcy53aWRnZXROYW1lICsgIi1pdGVtKSIpOwoKCQl0aGlzLml0ZW1zID0gJC5ncmVwKHRoaXMuaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CgkJCWZvciAodmFyIGo9MDsgaiA8IGxpc3QubGVuZ3RoOyBqKyspIHsKCQkJCWlmKGxpc3Rbal0gPT09IGl0ZW0uaXRlbVswXSkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9KTsKCgl9LAoKCV9yZWZyZXNoSXRlbXM6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXRoaXMuaXRlbXMgPSBbXTsKCQl0aGlzLmNvbnRhaW5lcnMgPSBbdGhpc107CgoJCXZhciBpLCBqLCBjdXIsIGluc3QsIHRhcmdldERhdGEsIF9xdWVyaWVzLCBpdGVtLCBxdWVyaWVzTGVuZ3RoLAoJCQlpdGVtcyA9IHRoaXMuaXRlbXMsCgkJCXF1ZXJpZXMgPSBbWyQuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpID8gdGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50WzBdLCBldmVudCwgeyBpdGVtOiB0aGlzLmN1cnJlbnRJdGVtIH0pIDogJCh0aGlzLm9wdGlvbnMuaXRlbXMsIHRoaXMuZWxlbWVudCksIHRoaXNdXSwKCQkJY29ubmVjdFdpdGggPSB0aGlzLl9jb25uZWN0V2l0aCgpOwoKCQlpZihjb25uZWN0V2l0aCAmJiB0aGlzLnJlYWR5KSB7IC8vU2hvdWxkbid0IGJlIHJ1biB0aGUgZmlyc3QgdGltZSB0aHJvdWdoIGR1ZSB0byBtYXNzaXZlIHNsb3ctZG93bgoJCQlmb3IgKGkgPSBjb25uZWN0V2l0aC5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJCQljdXIgPSAkKGNvbm5lY3RXaXRoW2ldKTsKCQkJCWZvciAoaiA9IGN1ci5sZW5ndGggLSAxOyBqID49IDA7IGotLSl7CgkJCQkJaW5zdCA9ICQuZGF0YShjdXJbal0sIHRoaXMud2lkZ2V0RnVsbE5hbWUpOwoJCQkJCWlmKGluc3QgJiYgaW5zdCAhPT0gdGhpcyAmJiAhaW5zdC5vcHRpb25zLmRpc2FibGVkKSB7CgkJCQkJCXF1ZXJpZXMucHVzaChbJC5pc0Z1bmN0aW9uKGluc3Qub3B0aW9ucy5pdGVtcykgPyBpbnN0Lm9wdGlvbnMuaXRlbXMuY2FsbChpbnN0LmVsZW1lbnRbMF0sIGV2ZW50LCB7IGl0ZW06IHRoaXMuY3VycmVudEl0ZW0gfSkgOiAkKGluc3Qub3B0aW9ucy5pdGVtcywgaW5zdC5lbGVtZW50KSwgaW5zdF0pOwoJCQkJCQl0aGlzLmNvbnRhaW5lcnMucHVzaChpbnN0KTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCWZvciAoaSA9IHF1ZXJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJdGFyZ2V0RGF0YSA9IHF1ZXJpZXNbaV1bMV07CgkJCV9xdWVyaWVzID0gcXVlcmllc1tpXVswXTsKCgkJCWZvciAoaj0wLCBxdWVyaWVzTGVuZ3RoID0gX3F1ZXJpZXMubGVuZ3RoOyBqIDwgcXVlcmllc0xlbmd0aDsgaisrKSB7CgkJCQlpdGVtID0gJChfcXVlcmllc1tqXSk7CgoJCQkJaXRlbS5kYXRhKHRoaXMud2lkZ2V0TmFtZSArICItaXRlbSIsIHRhcmdldERhdGEpOyAvLyBEYXRhIGZvciB0YXJnZXQgY2hlY2tpbmcgKG1vdXNlIG1hbmFnZXIpCgoJCQkJaXRlbXMucHVzaCh7CgkJCQkJaXRlbTogaXRlbSwKCQkJCQlpbnN0YW5jZTogdGFyZ2V0RGF0YSwKCQkJCQl3aWR0aDogMCwgaGVpZ2h0OiAwLAoJCQkJCWxlZnQ6IDAsIHRvcDogMAoJCQkJfSk7CgkJCX0KCQl9CgoJfSwKCglyZWZyZXNoUG9zaXRpb25zOiBmdW5jdGlvbihmYXN0KSB7CgoJCS8vVGhpcyBoYXMgdG8gYmUgcmVkb25lIGJlY2F1c2UgZHVlIHRvIHRoZSBpdGVtIGJlaW5nIG1vdmVkIG91dC9pbnRvIHRoZSBvZmZzZXRQYXJlbnQsIHRoZSBvZmZzZXRQYXJlbnQncyBwb3NpdGlvbiB3aWxsIGNoYW5nZQoJCWlmKHRoaXMub2Zmc2V0UGFyZW50ICYmIHRoaXMuaGVscGVyKSB7CgkJCXRoaXMub2Zmc2V0LnBhcmVudCA9IHRoaXMuX2dldFBhcmVudE9mZnNldCgpOwoJCX0KCgkJdmFyIGksIGl0ZW0sIHQsIHA7CgoJCWZvciAoaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pewoJCQlpdGVtID0gdGhpcy5pdGVtc1tpXTsKCgkJCS8vV2UgaWdub3JlIGNhbGN1bGF0aW5nIHBvc2l0aW9ucyBvZiBhbGwgY29ubmVjdGVkIGNvbnRhaW5lcnMgd2hlbiB3ZSdyZSBub3Qgb3ZlciB0aGVtCgkJCWlmKGl0ZW0uaW5zdGFuY2UgIT09IHRoaXMuY3VycmVudENvbnRhaW5lciAmJiB0aGlzLmN1cnJlbnRDb250YWluZXIgJiYgaXRlbS5pdGVtWzBdICE9PSB0aGlzLmN1cnJlbnRJdGVtWzBdKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJdCA9IHRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50ID8gJCh0aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudCwgaXRlbS5pdGVtKSA6IGl0ZW0uaXRlbTsKCgkJCWlmICghZmFzdCkgewoJCQkJaXRlbS53aWR0aCA9IHQub3V0ZXJXaWR0aCgpOwoJCQkJaXRlbS5oZWlnaHQgPSB0Lm91dGVySGVpZ2h0KCk7CgkJCX0KCgkJCXAgPSB0Lm9mZnNldCgpOwoJCQlpdGVtLmxlZnQgPSBwLmxlZnQ7CgkJCWl0ZW0udG9wID0gcC50b3A7CgkJfQoKCQlpZih0aGlzLm9wdGlvbnMuY3VzdG9tICYmIHRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMpIHsKCQkJdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycy5jYWxsKHRoaXMpOwoJCX0gZWxzZSB7CgkJCWZvciAoaSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJCQlwID0gdGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub2Zmc2V0KCk7CgkJCQl0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUubGVmdCA9IHAubGVmdDsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS50b3AgPSBwLnRvcDsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS53aWR0aAk9IHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVyV2lkdGgoKTsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5oZWlnaHQgPSB0aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudC5vdXRlckhlaWdodCgpOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJX2NyZWF0ZVBsYWNlaG9sZGVyOiBmdW5jdGlvbih0aGF0KSB7CgkJdGhhdCA9IHRoYXQgfHwgdGhpczsKCQl2YXIgY2xhc3NOYW1lLAoJCQlvID0gdGhhdC5vcHRpb25zOwoKCQlpZighby5wbGFjZWhvbGRlciB8fCBvLnBsYWNlaG9sZGVyLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKCQkJY2xhc3NOYW1lID0gby5wbGFjZWhvbGRlcjsKCQkJby5wbGFjZWhvbGRlciA9IHsKCQkJCWVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoKCQkJCQl2YXIgbm9kZU5hbWUgPSB0aGF0LmN1cnJlbnRJdGVtWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCWVsZW1lbnQgPSAkKCAiPCIgKyBub2RlTmFtZSArICI+IiwgdGhhdC5kb2N1bWVudFswXSApCgkJCQkJCQkuYWRkQ2xhc3MoY2xhc3NOYW1lIHx8IHRoYXQuY3VycmVudEl0ZW1bMF0uY2xhc3NOYW1lKyIgdWktc29ydGFibGUtcGxhY2Vob2xkZXIiKQoJCQkJCQkJLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTsKCgkJCQkJaWYgKCBub2RlTmFtZSA9PT0gInRyIiApIHsKCQkJCQkJdGhhdC5jdXJyZW50SXRlbS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJCQkkKCAiPHRkPiYjMTYwOzwvdGQ+IiwgdGhhdC5kb2N1bWVudFswXSApCgkJCQkJCQkJLmF0dHIoICJjb2xzcGFuIiwgJCggdGhpcyApLmF0dHIoICJjb2xzcGFuIiApIHx8IDEgKQoJCQkJCQkJCS5hcHBlbmRUbyggZWxlbWVudCApOwoJCQkJCQl9KTsKCQkJCQl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gImltZyIgKSB7CgkJCQkJCWVsZW1lbnQuYXR0ciggInNyYyIsIHRoYXQuY3VycmVudEl0ZW0uYXR0ciggInNyYyIgKSApOwoJCQkJCX0KCgkJCQkJaWYgKCAhY2xhc3NOYW1lICkgewoJCQkJCQllbGVtZW50LmNzcyggInZpc2liaWxpdHkiLCAiaGlkZGVuIiApOwoJCQkJCX0KCgkJCQkJcmV0dXJuIGVsZW1lbnQ7CgkJCQl9LAoJCQkJdXBkYXRlOiBmdW5jdGlvbihjb250YWluZXIsIHApIHsKCgkJCQkJLy8gMS4gSWYgYSBjbGFzc05hbWUgaXMgc2V0IGFzICdwbGFjZWhvbGRlciBvcHRpb24sIHdlIGRvbid0IGZvcmNlIHNpemVzIC0gdGhlIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB0aGF0CgkJCQkJLy8gMi4gVGhlIG9wdGlvbiAnZm9yY2VQbGFjZWhvbGRlclNpemUgY2FuIGJlIGVuYWJsZWQgdG8gZm9yY2UgaXQgZXZlbiBpZiBhIGNsYXNzIG5hbWUgaXMgc3BlY2lmaWVkCgkJCQkJaWYoY2xhc3NOYW1lICYmICFvLmZvcmNlUGxhY2Vob2xkZXJTaXplKSB7CgkJCQkJCXJldHVybjsKCQkJCQl9CgoJCQkJCS8vSWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGEgYWN0dWFsIGhlaWdodCBieSBpdHNlbGYgKHdpdGhvdXQgc3R5bGVzIGNvbWluZyBmcm9tIGEgc3R5bGVzaGVldCksIGl0IHJlY2VpdmVzIHRoZSBpbmxpbmUgaGVpZ2h0IGZyb20gdGhlIGRyYWdnZWQgaXRlbQoJCQkJCWlmKCFwLmhlaWdodCgpKSB7IHAuaGVpZ2h0KHRoYXQuY3VycmVudEl0ZW0uaW5uZXJIZWlnaHQoKSAtIHBhcnNlSW50KHRoYXQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nVG9wIil8fDAsIDEwKSAtIHBhcnNlSW50KHRoYXQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nQm90dG9tIil8fDAsIDEwKSk7IH0KCQkJCQlpZighcC53aWR0aCgpKSB7IHAud2lkdGgodGhhdC5jdXJyZW50SXRlbS5pbm5lcldpZHRoKCkgLSBwYXJzZUludCh0aGF0LmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ0xlZnQiKXx8MCwgMTApIC0gcGFyc2VJbnQodGhhdC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdSaWdodCIpfHwwLCAxMCkpOyB9CgkJCQl9CgkJCX07CgkJfQoKCQkvL0NyZWF0ZSB0aGUgcGxhY2Vob2xkZXIKCQl0aGF0LnBsYWNlaG9sZGVyID0gJChvLnBsYWNlaG9sZGVyLmVsZW1lbnQuY2FsbCh0aGF0LmVsZW1lbnQsIHRoYXQuY3VycmVudEl0ZW0pKTsKCgkJLy9BcHBlbmQgaXQgYWZ0ZXIgdGhlIGFjdHVhbCBjdXJyZW50IGl0ZW0KCQl0aGF0LmN1cnJlbnRJdGVtLmFmdGVyKHRoYXQucGxhY2Vob2xkZXIpOwoKCQkvL1VwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgcGxhY2Vob2xkZXIgKFRPRE86IExvZ2ljIHRvIGZ1enp5LCBzZWUgbGluZSAzMTYvMzE3KQoJCW8ucGxhY2Vob2xkZXIudXBkYXRlKHRoYXQsIHRoYXQucGxhY2Vob2xkZXIpOwoKCX0sCgoJX2NvbnRhY3RDb250YWluZXJzOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBpLCBqLCBkaXN0LCBpdGVtV2l0aExlYXN0RGlzdGFuY2UsIHBvc1Byb3BlcnR5LCBzaXplUHJvcGVydHksIGJhc2UsIGN1ciwgbmVhckJvdHRvbSwgZmxvYXRpbmcsCgkJCWlubmVybW9zdENvbnRhaW5lciA9IG51bGwsCgkJCWlubmVybW9zdEluZGV4ID0gbnVsbDsKCgkJLy8gZ2V0IGlubmVybW9zdCBjb250YWluZXIgdGhhdCBpbnRlcnNlY3RzIHdpdGggaXRlbQoJCWZvciAoaSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoKCQkJLy8gbmV2ZXIgY29uc2lkZXIgYSBjb250YWluZXIgdGhhdCdzIGxvY2F0ZWQgd2l0aGluIHRoZSBpdGVtIGl0c2VsZgoJCQlpZigkLmNvbnRhaW5zKHRoaXMuY3VycmVudEl0ZW1bMF0sIHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdKSkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmKHRoaXMuX2ludGVyc2VjdHNXaXRoKHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZSkpIHsKCgkJCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IGZvdW5kIGEgY29udGFpbmVyIGFuZCBpdCdzIG1vcmUgImlubmVyIiB0aGFuIHRoaXMsIHRoZW4gY29udGludWUKCQkJCWlmKGlubmVybW9zdENvbnRhaW5lciAmJiAkLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdLCBpbm5lcm1vc3RDb250YWluZXIuZWxlbWVudFswXSkpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpbm5lcm1vc3RDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcnNbaV07CgkJCQlpbm5lcm1vc3RJbmRleCA9IGk7CgoJCQl9IGVsc2UgewoJCQkJLy8gY29udGFpbmVyIGRvZXNuJ3QgaW50ZXJzZWN0LiB0cmlnZ2VyICJvdXQiIGV2ZW50IGlmIG5lY2Vzc2FyeQoJCQkJaWYodGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIpIHsKCQkJCQl0aGlzLmNvbnRhaW5lcnNbaV0uX3RyaWdnZXIoIm91dCIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOwoJCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5vdmVyID0gMDsKCQkJCX0KCQkJfQoKCQl9CgoJCS8vIGlmIG5vIGludGVyc2VjdGluZyBjb250YWluZXJzIGZvdW5kLCByZXR1cm4KCQlpZighaW5uZXJtb3N0Q29udGFpbmVyKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIG1vdmUgdGhlIGl0ZW0gaW50byB0aGUgY29udGFpbmVyIGlmIGl0J3Mgbm90IHRoZXJlIGFscmVhZHkKCQlpZih0aGlzLmNvbnRhaW5lcnMubGVuZ3RoID09PSAxKSB7CgkJCWlmICghdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5jb250YWluZXJDYWNoZS5vdmVyKSB7CgkJCQl0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLl90cmlnZ2VyKCJvdmVyIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgkJCQl0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmNvbnRhaW5lckNhY2hlLm92ZXIgPSAxOwoJCQl9CgkJfSBlbHNlIHsKCgkJCS8vV2hlbiBlbnRlcmluZyBhIG5ldyBjb250YWluZXIsIHdlIHdpbGwgZmluZCB0aGUgaXRlbSB3aXRoIHRoZSBsZWFzdCBkaXN0YW5jZSBhbmQgYXBwZW5kIG91ciBpdGVtIG5lYXIgaXQKCQkJZGlzdCA9IDEwMDAwOwoJCQlpdGVtV2l0aExlYXN0RGlzdGFuY2UgPSBudWxsOwoJCQlmbG9hdGluZyA9IGlubmVybW9zdENvbnRhaW5lci5mbG9hdGluZyB8fCBpc0Zsb2F0aW5nKHRoaXMuY3VycmVudEl0ZW0pOwoJCQlwb3NQcm9wZXJ0eSA9IGZsb2F0aW5nID8gImxlZnQiIDogInRvcCI7CgkJCXNpemVQcm9wZXJ0eSA9IGZsb2F0aW5nID8gIndpZHRoIiA6ICJoZWlnaHQiOwoJCQliYXNlID0gdGhpcy5wb3NpdGlvbkFic1twb3NQcm9wZXJ0eV0gKyB0aGlzLm9mZnNldC5jbGlja1twb3NQcm9wZXJ0eV07CgkJCWZvciAoaiA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKCQkJCWlmKCEkLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF0uZWxlbWVudFswXSwgdGhpcy5pdGVtc1tqXS5pdGVtWzBdKSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaWYodGhpcy5pdGVtc1tqXS5pdGVtWzBdID09PSB0aGlzLmN1cnJlbnRJdGVtWzBdKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlpZiAoZmxvYXRpbmcgJiYgIWlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3AgKyB0aGlzLm9mZnNldC5jbGljay50b3AsIHRoaXMuaXRlbXNbal0udG9wLCB0aGlzLml0ZW1zW2pdLmhlaWdodCkpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCWN1ciA9IHRoaXMuaXRlbXNbal0uaXRlbS5vZmZzZXQoKVtwb3NQcm9wZXJ0eV07CgkJCQluZWFyQm90dG9tID0gZmFsc2U7CgkJCQlpZihNYXRoLmFicyhjdXIgLSBiYXNlKSA+IE1hdGguYWJzKGN1ciArIHRoaXMuaXRlbXNbal1bc2l6ZVByb3BlcnR5XSAtIGJhc2UpKXsKCQkJCQluZWFyQm90dG9tID0gdHJ1ZTsKCQkJCQljdXIgKz0gdGhpcy5pdGVtc1tqXVtzaXplUHJvcGVydHldOwoJCQkJfQoKCQkJCWlmKE1hdGguYWJzKGN1ciAtIGJhc2UpIDwgZGlzdCkgewoJCQkJCWRpc3QgPSBNYXRoLmFicyhjdXIgLSBiYXNlKTsgaXRlbVdpdGhMZWFzdERpc3RhbmNlID0gdGhpcy5pdGVtc1tqXTsKCQkJCQl0aGlzLmRpcmVjdGlvbiA9IG5lYXJCb3R0b20gPyAidXAiOiAiZG93biI7CgkJCQl9CgkJCX0KCgkJCS8vQ2hlY2sgaWYgZHJvcE9uRW1wdHkgaXMgZW5hYmxlZAoJCQlpZighaXRlbVdpdGhMZWFzdERpc3RhbmNlICYmICF0aGlzLm9wdGlvbnMuZHJvcE9uRW1wdHkpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYodGhpcy5jdXJyZW50Q29udGFpbmVyID09PSB0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWl0ZW1XaXRoTGVhc3REaXN0YW5jZSA/IHRoaXMuX3JlYXJyYW5nZShldmVudCwgaXRlbVdpdGhMZWFzdERpc3RhbmNlLCBudWxsLCB0cnVlKSA6IHRoaXMuX3JlYXJyYW5nZShldmVudCwgbnVsbCwgdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5lbGVtZW50LCB0cnVlKTsKCQkJdGhpcy5fdHJpZ2dlcigiY2hhbmdlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQkJdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5fdHJpZ2dlcigiY2hhbmdlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgkJCXRoaXMuY3VycmVudENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF07CgoJCQkvL1VwZGF0ZSB0aGUgcGxhY2Vob2xkZXIKCQkJdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLnVwZGF0ZSh0aGlzLmN1cnJlbnRDb250YWluZXIsIHRoaXMucGxhY2Vob2xkZXIpOwoKCQkJdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5fdHJpZ2dlcigib3ZlciIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOwoJCQl0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmNvbnRhaW5lckNhY2hlLm92ZXIgPSAxOwoJCX0KCgoJfSwKCglfY3JlYXRlSGVscGVyOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9ucywKCQkJaGVscGVyID0gJC5pc0Z1bmN0aW9uKG8uaGVscGVyKSA/ICQoby5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLCBbZXZlbnQsIHRoaXMuY3VycmVudEl0ZW1dKSkgOiAoby5oZWxwZXIgPT09ICJjbG9uZSIgPyB0aGlzLmN1cnJlbnRJdGVtLmNsb25lKCkgOiB0aGlzLmN1cnJlbnRJdGVtKTsKCgkJLy9BZGQgdGhlIGhlbHBlciB0byB0aGUgRE9NIGlmIHRoYXQgZGlkbid0IGhhcHBlbiBhbHJlYWR5CgkJaWYoIWhlbHBlci5wYXJlbnRzKCJib2R5IikubGVuZ3RoKSB7CgkJCSQoby5hcHBlbmRUbyAhPT0gInBhcmVudCIgPyBvLmFwcGVuZFRvIDogdGhpcy5jdXJyZW50SXRlbVswXS5wYXJlbnROb2RlKVswXS5hcHBlbmRDaGlsZChoZWxwZXJbMF0pOwoJCX0KCgkJaWYoaGVscGVyWzBdID09PSB0aGlzLmN1cnJlbnRJdGVtWzBdKSB7CgkJCXRoaXMuX3N0b3JlZENTUyA9IHsgd2lkdGg6IHRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUud2lkdGgsIGhlaWdodDogdGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS5oZWlnaHQsIHBvc2l0aW9uOiB0aGlzLmN1cnJlbnRJdGVtLmNzcygicG9zaXRpb24iKSwgdG9wOiB0aGlzLmN1cnJlbnRJdGVtLmNzcygidG9wIiksIGxlZnQ6IHRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0IikgfTsKCQl9CgoJCWlmKCFoZWxwZXJbMF0uc3R5bGUud2lkdGggfHwgby5mb3JjZUhlbHBlclNpemUpIHsKCQkJaGVscGVyLndpZHRoKHRoaXMuY3VycmVudEl0ZW0ud2lkdGgoKSk7CgkJfQoJCWlmKCFoZWxwZXJbMF0uc3R5bGUuaGVpZ2h0IHx8IG8uZm9yY2VIZWxwZXJTaXplKSB7CgkJCWhlbHBlci5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5oZWlnaHQoKSk7CgkJfQoKCQlyZXR1cm4gaGVscGVyOwoKCX0sCgoJX2FkanVzdE9mZnNldEZyb21IZWxwZXI6IGZ1bmN0aW9uKG9iaikgewoJCWlmICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIikgewoJCQlvYmogPSBvYmouc3BsaXQoIiAiKTsKCQl9CgkJaWYgKCQuaXNBcnJheShvYmopKSB7CgkJCW9iaiA9IHtsZWZ0OiArb2JqWzBdLCB0b3A6ICtvYmpbMV0gfHwgMH07CgkJfQoJCWlmICgibGVmdCIgaW4gb2JqKSB7CgkJCXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPSBvYmoubGVmdCArIHRoaXMubWFyZ2lucy5sZWZ0OwoJCX0KCQlpZiAoInJpZ2h0IiBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2subGVmdCA9IHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLSBvYmoucmlnaHQgKyB0aGlzLm1hcmdpbnMubGVmdDsKCQl9CgkJaWYgKCJ0b3AiIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay50b3AgPSBvYmoudG9wICsgdGhpcy5tYXJnaW5zLnRvcDsKCQl9CgkJaWYgKCJib3R0b20iIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay50b3AgPSB0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAtIG9iai5ib3R0b20gKyB0aGlzLm1hcmdpbnMudG9wOwoJCX0KCX0sCgoJX2dldFBhcmVudE9mZnNldDogZnVuY3Rpb24oKSB7CgoKCQkvL0dldCB0aGUgb2Zmc2V0UGFyZW50IGFuZCBjYWNoZSBpdHMgcG9zaXRpb24KCQl0aGlzLm9mZnNldFBhcmVudCA9IHRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpOwoJCXZhciBwbyA9IHRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gbW9kaWZ5IGEgb2Zmc2V0IGNhbGN1bGF0ZWQgb24gc3RhcnQsIHNpbmNlIHRoZSBmb2xsb3dpbmcgaGFwcGVuZWQ6CgkJLy8gMS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBoZWxwZXIgaXMgYWJzb2x1dGUsIHNvIGl0J3MgcG9zaXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgbmV4dCBwb3NpdGlvbmVkIHBhcmVudAoJCS8vIDIuIFRoZSBhY3R1YWwgb2Zmc2V0IHBhcmVudCBpcyBhIGNoaWxkIG9mIHRoZSBzY3JvbGwgcGFyZW50LCBhbmQgdGhlIHNjcm9sbCBwYXJlbnQgaXNuJ3QgdGhlIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGF0CgkJLy8gICAgdGhlIHNjcm9sbCBpcyBpbmNsdWRlZCBpbiB0aGUgaW5pdGlhbCBjYWxjdWxhdGlvbiBvZiB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQsIGFuZCBuZXZlciByZWNhbGN1bGF0ZWQgdXBvbiBkcmFnCgkJaWYodGhpcy5jc3NQb3NpdGlvbiA9PT0gImFic29sdXRlIiAmJiB0aGlzLnNjcm9sbFBhcmVudFswXSAhPT0gZG9jdW1lbnQgJiYgJC5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSwgdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSB7CgkJCXBvLmxlZnQgKz0gdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOwoJCQlwby50b3AgKz0gdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk7CgkJfQoKCQkvLyBUaGlzIG5lZWRzIHRvIGJlIGFjdHVhbGx5IGRvbmUgZm9yIGFsbCBicm93c2Vycywgc2luY2UgcGFnZVgvcGFnZVkgaW5jbHVkZXMgdGhpcyBpbmZvcm1hdGlvbgoJCS8vIHdpdGggYW4gdWdseSBJRSBmaXgKCQlpZiggdGhpcy5vZmZzZXRQYXJlbnRbMF0gPT09IGRvY3VtZW50LmJvZHkgfHwgKHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUgJiYgdGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaHRtbCIgJiYgJC51aS5pZSkpIHsKCQkJcG8gPSB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJcmV0dXJuIHsKCQkJdG9wOiBwby50b3AgKyAocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKSB8fCAwKSwKCQkJbGVmdDogcG8ubGVmdCArIChwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKSB8fCAwKQoJCX07CgoJfSwKCglfZ2V0UmVsYXRpdmVPZmZzZXQ6IGZ1bmN0aW9uKCkgewoKCQlpZih0aGlzLmNzc1Bvc2l0aW9uID09PSAicmVsYXRpdmUiKSB7CgkJCXZhciBwID0gdGhpcy5jdXJyZW50SXRlbS5wb3NpdGlvbigpOwoJCQlyZXR1cm4gewoJCQkJdG9wOiBwLnRvcCAtIChwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKSB8fCAwKSArIHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLAoJCQkJbGVmdDogcC5sZWZ0IC0gKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKSB8fCAwKSArIHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKQoJCQl9OwoJCX0gZWxzZSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgl9LAoKCV9jYWNoZU1hcmdpbnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMubWFyZ2lucyA9IHsKCQkJbGVmdDogKHBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5MZWZ0IiksMTApIHx8IDApLAoJCQl0b3A6IChwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcygibWFyZ2luVG9wIiksMTApIHx8IDApCgkJfTsKCX0sCgoJX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGVscGVyUHJvcG9ydGlvbnMgPSB7CgkJCXdpZHRoOiB0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksCgkJCWhlaWdodDogdGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKQoJCX07Cgl9LAoKCV9zZXRDb250YWlubWVudDogZnVuY3Rpb24oKSB7CgoJCXZhciBjZSwgY28sIG92ZXIsCgkJCW8gPSB0aGlzLm9wdGlvbnM7CgkJaWYoby5jb250YWlubWVudCA9PT0gInBhcmVudCIpIHsKCQkJby5jb250YWlubWVudCA9IHRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGU7CgkJfQoJCWlmKG8uY29udGFpbm1lbnQgPT09ICJkb2N1bWVudCIgfHwgby5jb250YWlubWVudCA9PT0gIndpbmRvdyIpIHsKCQkJdGhpcy5jb250YWlubWVudCA9IFsKCQkJCTAgLSB0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0IC0gdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsCgkJCQkwIC0gdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wIC0gdGhpcy5vZmZzZXQucGFyZW50LnRvcCwKCQkJCSQoby5jb250YWlubWVudCA9PT0gImRvY3VtZW50IiA/IGRvY3VtZW50IDogd2luZG93KS53aWR0aCgpIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAtIHRoaXMubWFyZ2lucy5sZWZ0LAoJCQkJKCQoby5jb250YWlubWVudCA9PT0gImRvY3VtZW50IiA/IGRvY3VtZW50IDogd2luZG93KS5oZWlnaHQoKSB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0IC0gdGhpcy5tYXJnaW5zLnRvcAoJCQldOwoJCX0KCgkJaWYoISgvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvKS50ZXN0KG8uY29udGFpbm1lbnQpKSB7CgkJCWNlID0gJChvLmNvbnRhaW5tZW50KVswXTsKCQkJY28gPSAkKG8uY29udGFpbm1lbnQpLm9mZnNldCgpOwoJCQlvdmVyID0gKCQoY2UpLmNzcygib3ZlcmZsb3ciKSAhPT0gImhpZGRlbiIpOwoKCQkJdGhpcy5jb250YWlubWVudCA9IFsKCQkJCWNvLmxlZnQgKyAocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCkgfHwgMCkgKyAocGFyc2VJbnQoJChjZSkuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKSB8fCAwKSAtIHRoaXMubWFyZ2lucy5sZWZ0LAoJCQkJY28udG9wICsgKHBhcnNlSW50KCQoY2UpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCkgfHwgMCkgKyAocGFyc2VJbnQoJChjZSkuY3NzKCJwYWRkaW5nVG9wIiksMTApIHx8IDApIC0gdGhpcy5tYXJnaW5zLnRvcCwKCQkJCWNvLmxlZnQrKG92ZXIgPyBNYXRoLm1heChjZS5zY3JvbGxXaWR0aCxjZS5vZmZzZXRXaWR0aCkgOiBjZS5vZmZzZXRXaWR0aCkgLSAocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCkgfHwgMCkgLSAocGFyc2VJbnQoJChjZSkuY3NzKCJwYWRkaW5nUmlnaHQiKSwxMCkgfHwgMCkgLSB0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW5zLmxlZnQsCgkJCQljby50b3ArKG92ZXIgPyBNYXRoLm1heChjZS5zY3JvbGxIZWlnaHQsY2Uub2Zmc2V0SGVpZ2h0KSA6IGNlLm9mZnNldEhlaWdodCkgLSAocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKSB8fCAwKSAtIChwYXJzZUludCgkKGNlKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCkgfHwgMCkgLSB0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAtIHRoaXMubWFyZ2lucy50b3AKCQkJXTsKCQl9CgoJfSwKCglfY29udmVydFBvc2l0aW9uVG86IGZ1bmN0aW9uKGQsIHBvcykgewoKCQlpZighcG9zKSB7CgkJCXBvcyA9IHRoaXMucG9zaXRpb247CgkJfQoJCXZhciBtb2QgPSBkID09PSAiYWJzb2x1dGUiID8gMSA6IC0xLAoJCQlzY3JvbGwgPSB0aGlzLmNzc1Bvc2l0aW9uID09PSAiYWJzb2x1dGUiICYmICEodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT09IGRvY3VtZW50ICYmICQuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sIHRoaXMub2Zmc2V0UGFyZW50WzBdKSkgPyB0aGlzLm9mZnNldFBhcmVudCA6IHRoaXMuc2Nyb2xsUGFyZW50LAoJCQlzY3JvbGxJc1Jvb3ROb2RlID0gKC8oaHRtbHxib2R5KS9pKS50ZXN0KHNjcm9sbFswXS50YWdOYW1lKTsKCgkJcmV0dXJuIHsKCQkJdG9wOiAoCgkJCQlwb3MudG9wCSsJCQkJCQkJCQkJCQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQl0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AgKiBtb2QgKwkJCQkJCQkJCQkvLyBPbmx5IGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIG5vZGVzOiBSZWxhdGl2ZSBvZmZzZXQgZnJvbSBlbGVtZW50IHRvIG9mZnNldCBwYXJlbnQKCQkJCXRoaXMub2Zmc2V0LnBhcmVudC50b3AgKiBtb2QgLQkJCQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSggKCB0aGlzLmNzc1Bvc2l0aW9uID09PSAiZml4ZWQiID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpIDogKCBzY3JvbGxJc1Jvb3ROb2RlID8gMCA6IHNjcm9sbC5zY3JvbGxUb3AoKSApICkgKiBtb2QpCgkJCSksCgkJCWxlZnQ6ICgKCQkJCXBvcy5sZWZ0ICsJCQkJCQkJCQkJCQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQl0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0ICogbW9kICsJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQl0aGlzLm9mZnNldC5wYXJlbnQubGVmdCAqIG1vZAktCQkJCQkJCQkJCS8vIFRoZSBvZmZzZXRQYXJlbnQncyBvZmZzZXQgd2l0aG91dCBib3JkZXJzIChvZmZzZXQgKyBib3JkZXIpCgkJCQkoICggdGhpcy5jc3NQb3NpdGlvbiA9PT0gImZpeGVkIiA/IC10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCkgOiBzY3JvbGxJc1Jvb3ROb2RlID8gMCA6IHNjcm9sbC5zY3JvbGxMZWZ0KCkgKSAqIG1vZCkKCQkJKQoJCX07CgoJfSwKCglfZ2VuZXJhdGVQb3NpdGlvbjogZnVuY3Rpb24oZXZlbnQpIHsKCgkJdmFyIHRvcCwgbGVmdCwKCQkJbyA9IHRoaXMub3B0aW9ucywKCQkJcGFnZVggPSBldmVudC5wYWdlWCwKCQkJcGFnZVkgPSBldmVudC5wYWdlWSwKCQkJc2Nyb2xsID0gdGhpcy5jc3NQb3NpdGlvbiA9PT0gImFic29sdXRlIiAmJiAhKHRoaXMuc2Nyb2xsUGFyZW50WzBdICE9PSBkb2N1bWVudCAmJiAkLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLCB0aGlzLm9mZnNldFBhcmVudFswXSkpID8gdGhpcy5vZmZzZXRQYXJlbnQgOiB0aGlzLnNjcm9sbFBhcmVudCwgc2Nyb2xsSXNSb290Tm9kZSA9ICgvKGh0bWx8Ym9keSkvaSkudGVzdChzY3JvbGxbMF0udGFnTmFtZSk7CgoJCS8vIFRoaXMgaXMgYW5vdGhlciB2ZXJ5IHdlaXJkIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgaGFwcGVucyBmb3IgcmVsYXRpdmUgZWxlbWVudHM6CgkJLy8gMS4gSWYgdGhlIGNzcyBwb3NpdGlvbiBpcyByZWxhdGl2ZQoJCS8vIDIuIGFuZCB0aGUgc2Nyb2xsIHBhcmVudCBpcyB0aGUgZG9jdW1lbnQgb3Igc2ltaWxhciB0byB0aGUgb2Zmc2V0IHBhcmVudAoJCS8vIHdlIGhhdmUgdG8gcmVmcmVzaCB0aGUgcmVsYXRpdmUgb2Zmc2V0IGR1cmluZyB0aGUgc2Nyb2xsIHNvIHRoZXJlIGFyZSBubyBqdW1wcwoJCWlmKHRoaXMuY3NzUG9zaXRpb24gPT09ICJyZWxhdGl2ZSIgJiYgISh0aGlzLnNjcm9sbFBhcmVudFswXSAhPT0gZG9jdW1lbnQgJiYgdGhpcy5zY3JvbGxQYXJlbnRbMF0gIT09IHRoaXMub2Zmc2V0UGFyZW50WzBdKSkgewoJCQl0aGlzLm9mZnNldC5yZWxhdGl2ZSA9IHRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCk7CgkJfQoKCQkvKgoJCSAqIC0gUG9zaXRpb24gY29uc3RyYWluaW5nIC0KCQkgKiBDb25zdHJhaW4gdGhlIHBvc2l0aW9uIHRvIGEgbWl4IG9mIGdyaWQsIGNvbnRhaW5tZW50LgoJCSAqLwoKCQlpZih0aGlzLm9yaWdpbmFsUG9zaXRpb24pIHsgLy9JZiB3ZSBhcmUgbm90IGRyYWdnaW5nIHlldCwgd2Ugd29uJ3QgY2hlY2sgZm9yIG9wdGlvbnMKCgkJCWlmKHRoaXMuY29udGFpbm1lbnQpIHsKCQkJCWlmKGV2ZW50LnBhZ2VYIC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA8IHRoaXMuY29udGFpbm1lbnRbMF0pIHsKCQkJCQlwYWdlWCA9IHRoaXMuY29udGFpbm1lbnRbMF0gKyB0aGlzLm9mZnNldC5jbGljay5sZWZ0OwoJCQkJfQoJCQkJaWYoZXZlbnQucGFnZVkgLSB0aGlzLm9mZnNldC5jbGljay50b3AgPCB0aGlzLmNvbnRhaW5tZW50WzFdKSB7CgkJCQkJcGFnZVkgPSB0aGlzLmNvbnRhaW5tZW50WzFdICsgdGhpcy5vZmZzZXQuY2xpY2sudG9wOwoJCQkJfQoJCQkJaWYoZXZlbnQucGFnZVggLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0ID4gdGhpcy5jb250YWlubWVudFsyXSkgewoJCQkJCXBhZ2VYID0gdGhpcy5jb250YWlubWVudFsyXSArIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ7CgkJCQl9CgkJCQlpZihldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA+IHRoaXMuY29udGFpbm1lbnRbM10pIHsKCQkJCQlwYWdlWSA9IHRoaXMuY29udGFpbm1lbnRbM10gKyB0aGlzLm9mZnNldC5jbGljay50b3A7CgkJCQl9CgkJCX0KCgkJCWlmKG8uZ3JpZCkgewoJCQkJdG9wID0gdGhpcy5vcmlnaW5hbFBhZ2VZICsgTWF0aC5yb3VuZCgocGFnZVkgLSB0aGlzLm9yaWdpbmFsUGFnZVkpIC8gby5ncmlkWzFdKSAqIG8uZ3JpZFsxXTsKCQkJCXBhZ2VZID0gdGhpcy5jb250YWlubWVudCA/ICggKHRvcCAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA+PSB0aGlzLmNvbnRhaW5tZW50WzFdICYmIHRvcCAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA8PSB0aGlzLmNvbnRhaW5tZW50WzNdKSA/IHRvcCA6ICgodG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID49IHRoaXMuY29udGFpbm1lbnRbMV0pID8gdG9wIC0gby5ncmlkWzFdIDogdG9wICsgby5ncmlkWzFdKSkgOiB0b3A7CgoJCQkJbGVmdCA9IHRoaXMub3JpZ2luYWxQYWdlWCArIE1hdGgucm91bmQoKHBhZ2VYIC0gdGhpcy5vcmlnaW5hbFBhZ2VYKSAvIG8uZ3JpZFswXSkgKiBvLmdyaWRbMF07CgkJCQlwYWdlWCA9IHRoaXMuY29udGFpbm1lbnQgPyAoIChsZWZ0IC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA+PSB0aGlzLmNvbnRhaW5tZW50WzBdICYmIGxlZnQgLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0IDw9IHRoaXMuY29udGFpbm1lbnRbMl0pID8gbGVmdCA6ICgobGVmdCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPj0gdGhpcy5jb250YWlubWVudFswXSkgPyBsZWZ0IC0gby5ncmlkWzBdIDogbGVmdCArIG8uZ3JpZFswXSkpIDogbGVmdDsKCQkJfQoKCQl9CgoJCXJldHVybiB7CgkJCXRvcDogKAoJCQkJcGFnZVkgLQkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMub2Zmc2V0LmNsaWNrLnRvcCAtCQkJCQkJCQkJCQkJCS8vIENsaWNrIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQpCgkJCQl0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AJLQkJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQl0aGlzLm9mZnNldC5wYXJlbnQudG9wICsJCQkJCQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJKCAoIHRoaXMuY3NzUG9zaXRpb24gPT09ICJmaXhlZCIgPyAtdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkgOiAoIHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbFRvcCgpICkgKSkKCQkJKSwKCQkJbGVmdDogKAoJCQkJcGFnZVggLQkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgLQkJCQkJCQkJCQkJCS8vIENsaWNrIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQpCgkJCQl0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0CS0JCQkJCQkJCQkJCS8vIE9ubHkgZm9yIHJlbGF0aXZlIHBvc2l0aW9uZWQgbm9kZXM6IFJlbGF0aXZlIG9mZnNldCBmcm9tIGVsZW1lbnQgdG8gb2Zmc2V0IHBhcmVudAoJCQkJdGhpcy5vZmZzZXQucGFyZW50LmxlZnQgKwkJCQkJCQkJCQkJCS8vIFRoZSBvZmZzZXRQYXJlbnQncyBvZmZzZXQgd2l0aG91dCBib3JkZXJzIChvZmZzZXQgKyBib3JkZXIpCgkJCQkoICggdGhpcy5jc3NQb3NpdGlvbiA9PT0gImZpeGVkIiA/IC10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCkgOiBzY3JvbGxJc1Jvb3ROb2RlID8gMCA6IHNjcm9sbC5zY3JvbGxMZWZ0KCkgKSkKCQkJKQoJCX07CgoJfSwKCglfcmVhcnJhbmdlOiBmdW5jdGlvbihldmVudCwgaSwgYSwgaGFyZFJlZnJlc2gpIHsKCgkJYSA/IGFbMF0uYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSkgOiBpLml0ZW1bMF0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5wbGFjZWhvbGRlclswXSwgKHRoaXMuZGlyZWN0aW9uID09PSAiZG93biIgPyBpLml0ZW1bMF0gOiBpLml0ZW1bMF0ubmV4dFNpYmxpbmcpKTsKCgkJLy9WYXJpb3VzIHRoaW5ncyBkb25lIGhlcmUgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2U6CgkJLy8gMS4gd2UgY3JlYXRlIGEgc2V0VGltZW91dCwgdGhhdCBjYWxscyByZWZyZXNoUG9zaXRpb25zCgkJLy8gMi4gb24gdGhlIGluc3RhbmNlLCB3ZSBoYXZlIGEgY291bnRlciB2YXJpYWJsZSwgdGhhdCBnZXQncyBoaWdoZXIgYWZ0ZXIgZXZlcnkgYXBwZW5kCgkJLy8gMy4gb24gdGhlIGxvY2FsIHNjb3BlLCB3ZSBjb3B5IHRoZSBjb3VudGVyIHZhcmlhYmxlLCBhbmQgY2hlY2sgaW4gdGhlIHRpbWVvdXQsIGlmIGl0J3Mgc3RpbGwgdGhlIHNhbWUKCQkvLyA0LiB0aGlzIGxldHMgb25seSB0aGUgbGFzdCBhZGRpdGlvbiB0byB0aGUgdGltZW91dCBzdGFjayB0aHJvdWdoCgkJdGhpcy5jb3VudGVyID0gdGhpcy5jb3VudGVyID8gKyt0aGlzLmNvdW50ZXIgOiAxOwoJCXZhciBjb3VudGVyID0gdGhpcy5jb3VudGVyOwoKCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJaWYoY291bnRlciA9PT0gdGhpcy5jb3VudGVyKSB7CgkJCQl0aGlzLnJlZnJlc2hQb3NpdGlvbnMoIWhhcmRSZWZyZXNoKTsgLy9QcmVjb21wdXRlIGFmdGVyIGVhY2ggRE9NIGluc2VydGlvbiwgTk9UIG9uIG1vdXNlbW92ZQoJCQl9CgkJfSk7CgoJfSwKCglfY2xlYXI6IGZ1bmN0aW9uKGV2ZW50LCBub1Byb3BhZ2F0aW9uKSB7CgoJCXRoaXMucmV2ZXJ0aW5nID0gZmFsc2U7CgkJLy8gV2UgZGVsYXkgYWxsIGV2ZW50cyB0aGF0IGhhdmUgdG8gYmUgdHJpZ2dlcmVkIHRvIGFmdGVyIHRoZSBwb2ludCB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgaGFzIGJlZW4gcmVtb3ZlZCBhbmQKCQkvLyBldmVyeXRoaW5nIGVsc2Ugbm9ybWFsaXplZCBhZ2FpbgoJCXZhciBpLAoJCQlkZWxheWVkVHJpZ2dlcnMgPSBbXTsKCgkJLy8gV2UgZmlyc3QgaGF2ZSB0byB1cGRhdGUgdGhlIGRvbSBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGN1cnJlbnRJdGVtCgkJLy8gTm90ZTogZG9uJ3QgZG8gaXQgaWYgdGhlIGN1cnJlbnQgaXRlbSBpcyBhbHJlYWR5IHJlbW92ZWQgKGJ5IGEgdXNlciksIG9yIGl0IGdldHMgcmVhcHBlbmRlZCAoc2VlICM0MDg4KQoJCWlmKCF0aGlzLl9ub0ZpbmFsU29ydCAmJiB0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCkgewoJCQl0aGlzLnBsYWNlaG9sZGVyLmJlZm9yZSh0aGlzLmN1cnJlbnRJdGVtKTsKCQl9CgkJdGhpcy5fbm9GaW5hbFNvcnQgPSBudWxsOwoKCQlpZih0aGlzLmhlbHBlclswXSA9PT0gdGhpcy5jdXJyZW50SXRlbVswXSkgewoJCQlmb3IoaSBpbiB0aGlzLl9zdG9yZWRDU1MpIHsKCQkJCWlmKHRoaXMuX3N0b3JlZENTU1tpXSA9PT0gImF1dG8iIHx8IHRoaXMuX3N0b3JlZENTU1tpXSA9PT0gInN0YXRpYyIpIHsKCQkJCQl0aGlzLl9zdG9yZWRDU1NbaV0gPSAiIjsKCQkJCX0KCQkJfQoJCQl0aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTsKCQl9IGVsc2UgewoJCQl0aGlzLmN1cnJlbnRJdGVtLnNob3coKTsKCQl9CgoJCWlmKHRoaXMuZnJvbU91dHNpZGUgJiYgIW5vUHJvcGFnYXRpb24pIHsKCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goZnVuY3Rpb24oZXZlbnQpIHsgdGhpcy5fdHJpZ2dlcigicmVjZWl2ZSIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcy5mcm9tT3V0c2lkZSkpOyB9KTsKCQl9CgkJaWYoKHRoaXMuZnJvbU91dHNpZGUgfHwgdGhpcy5kb21Qb3NpdGlvbi5wcmV2ICE9PSB0aGlzLmN1cnJlbnRJdGVtLnByZXYoKS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKVswXSB8fCB0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCAhPT0gdGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXSkgJiYgIW5vUHJvcGFnYXRpb24pIHsKCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goZnVuY3Rpb24oZXZlbnQpIHsgdGhpcy5fdHJpZ2dlcigidXBkYXRlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsgfSk7IC8vVHJpZ2dlciB1cGRhdGUgY2FsbGJhY2sgaWYgdGhlIERPTSBwb3NpdGlvbiBoYXMgY2hhbmdlZAoJCX0KCgkJLy8gQ2hlY2sgaWYgdGhlIGl0ZW1zIENvbnRhaW5lciBoYXMgQ2hhbmdlZCBhbmQgdHJpZ2dlciBhcHByb3ByaWF0ZQoJCS8vIGV2ZW50cy4KCQlpZiAodGhpcyAhPT0gdGhpcy5jdXJyZW50Q29udGFpbmVyKSB7CgkJCWlmKCFub1Byb3BhZ2F0aW9uKSB7CgkJCQlkZWxheWVkVHJpZ2dlcnMucHVzaChmdW5jdGlvbihldmVudCkgeyB0aGlzLl90cmlnZ2VyKCJyZW1vdmUiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOyB9KTsKCQkJCWRlbGF5ZWRUcmlnZ2Vycy5wdXNoKChmdW5jdGlvbihjKSB7IHJldHVybiBmdW5jdGlvbihldmVudCkgeyBjLl90cmlnZ2VyKCJyZWNlaXZlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7IH07ICB9KS5jYWxsKHRoaXMsIHRoaXMuY3VycmVudENvbnRhaW5lcikpOwoJCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goKGZ1bmN0aW9uKGMpIHsgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7IGMuX3RyaWdnZXIoInVwZGF0ZSIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOyAgfTsgfSkuY2FsbCh0aGlzLCB0aGlzLmN1cnJlbnRDb250YWluZXIpKTsKCQkJfQoJCX0KCgoJCS8vUG9zdCBldmVudHMgdG8gY29udGFpbmVycwoJCWZvciAoaSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJCWlmKCFub1Byb3BhZ2F0aW9uKSB7CgkJCQlkZWxheWVkVHJpZ2dlcnMucHVzaCgoZnVuY3Rpb24oYykgeyByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsgYy5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOyB9OyAgfSkuY2FsbCh0aGlzLCB0aGlzLmNvbnRhaW5lcnNbaV0pKTsKCQkJfQoJCQlpZih0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlcikgewoJCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goKGZ1bmN0aW9uKGMpIHsgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7IGMuX3RyaWdnZXIoIm91dCIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOyB9OyAgfSkuY2FsbCh0aGlzLCB0aGlzLmNvbnRhaW5lcnNbaV0pKTsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5vdmVyID0gMDsKCQkJfQoJCX0KCgkJLy9EbyB3aGF0IHdhcyBvcmlnaW5hbGx5IGluIHBsdWdpbnMKCQlpZiAoIHRoaXMuc3RvcmVkQ3Vyc29yICkgewoJCQl0aGlzLmRvY3VtZW50LmZpbmQoICJib2R5IiApLmNzcyggImN1cnNvciIsIHRoaXMuc3RvcmVkQ3Vyc29yICk7CgkJCXRoaXMuc3RvcmVkU3R5bGVzaGVldC5yZW1vdmUoKTsKCQl9CgkJaWYodGhpcy5fc3RvcmVkT3BhY2l0eSkgewoJCQl0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLCB0aGlzLl9zdG9yZWRPcGFjaXR5KTsKCQl9CgkJaWYodGhpcy5fc3RvcmVkWkluZGV4KSB7CgkJCXRoaXMuaGVscGVyLmNzcygiekluZGV4IiwgdGhpcy5fc3RvcmVkWkluZGV4ID09PSAiYXV0byIgPyAiIiA6IHRoaXMuX3N0b3JlZFpJbmRleCk7CgkJfQoKCQl0aGlzLmRyYWdnaW5nID0gZmFsc2U7CgkJaWYodGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsKSB7CgkJCWlmKCFub1Byb3BhZ2F0aW9uKSB7CgkJCQl0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQkJCWZvciAoaT0wOyBpIDwgZGVsYXllZFRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7CgkJCQkJZGVsYXllZFRyaWdnZXJzW2ldLmNhbGwodGhpcywgZXZlbnQpOwoJCQkJfSAvL1RyaWdnZXIgYWxsIGRlbGF5ZWQgZXZlbnRzCgkJCQl0aGlzLl90cmlnZ2VyKCJzdG9wIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQkJfQoKCQkJdGhpcy5mcm9tT3V0c2lkZSA9IGZhbHNlOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZighbm9Qcm9wYWdhdGlvbikgewoJCQl0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQl9CgoJCS8vJCh0aGlzLnBsYWNlaG9sZGVyWzBdKS5yZW1vdmUoKTsgd291bGQgaGF2ZSBiZWVuIHRoZSBqUXVlcnkgd2F5IC0gdW5mb3J0dW5hdGVseSwgaXQgdW5iaW5kcyBBTEwgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIG5vZGUhCgkJdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pOwoKCQlpZih0aGlzLmhlbHBlclswXSAhPT0gdGhpcy5jdXJyZW50SXRlbVswXSkgewoJCQl0aGlzLmhlbHBlci5yZW1vdmUoKTsKCQl9CgkJdGhpcy5oZWxwZXIgPSBudWxsOwoKCQlpZighbm9Qcm9wYWdhdGlvbikgewoJCQlmb3IgKGk9MDsgaSA8IGRlbGF5ZWRUcmlnZ2Vycy5sZW5ndGg7IGkrKykgewoJCQkJZGVsYXllZFRyaWdnZXJzW2ldLmNhbGwodGhpcywgZXZlbnQpOwoJCQl9IC8vVHJpZ2dlciBhbGwgZGVsYXllZCBldmVudHMKCQkJdGhpcy5fdHJpZ2dlcigic3RvcCIsIGV2ZW50LCB0aGlzLl91aUhhc2goKSk7CgkJfQoKCQl0aGlzLmZyb21PdXRzaWRlID0gZmFsc2U7CgkJcmV0dXJuIHRydWU7CgoJfSwKCglfdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJaWYgKCQuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpID09PSBmYWxzZSkgewoJCQl0aGlzLmNhbmNlbCgpOwoJCX0KCX0sCgoJX3VpSGFzaDogZnVuY3Rpb24oX2luc3QpIHsKCQl2YXIgaW5zdCA9IF9pbnN0IHx8IHRoaXM7CgkJcmV0dXJuIHsKCQkJaGVscGVyOiBpbnN0LmhlbHBlciwKCQkJcGxhY2Vob2xkZXI6IGluc3QucGxhY2Vob2xkZXIgfHwgJChbXSksCgkJCXBvc2l0aW9uOiBpbnN0LnBvc2l0aW9uLAoJCQlvcmlnaW5hbFBvc2l0aW9uOiBpbnN0Lm9yaWdpbmFsUG9zaXRpb24sCgkJCW9mZnNldDogaW5zdC5wb3NpdGlvbkFicywKCQkJaXRlbTogaW5zdC5jdXJyZW50SXRlbSwKCQkJc2VuZGVyOiBfaW5zdCA/IF9pbnN0LmVsZW1lbnQgOiBudWxsCgkJfTsKCX0KCn0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCB1bmRlZmluZWQpIHsKCnZhciBkYXRhU3BhY2UgPSAidWktZWZmZWN0cy0iOwoKJC5lZmZlY3RzID0gewoJZWZmZWN0OiB7fQp9OwoKLyohCiAqIGpRdWVyeSBDb2xvciBBbmltYXRpb25zIHYyLjEuMgogKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS1jb2xvcgogKgogKiBDb3B5cmlnaHQgMjAxMyBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiBXZWQgSmFuIDE2IDA4OjQ3OjA5IDIwMTMgLTA2MDAKICovCihmdW5jdGlvbiggalF1ZXJ5LCB1bmRlZmluZWQgKSB7CgoJdmFyIHN0ZXBIb29rcyA9ICJiYWNrZ3JvdW5kQ29sb3IgYm9yZGVyQm90dG9tQ29sb3IgYm9yZGVyTGVmdENvbG9yIGJvcmRlclJpZ2h0Q29sb3IgYm9yZGVyVG9wQ29sb3IgY29sb3IgY29sdW1uUnVsZUNvbG9yIG91dGxpbmVDb2xvciB0ZXh0RGVjb3JhdGlvbkNvbG9yIHRleHRFbXBoYXNpc0NvbG9yIiwKCgkvLyBwbHVzZXF1YWxzIHRlc3QgZm9yICs9IDEwMCAtPSAxMDAKCXJwbHVzZXF1YWxzID0gL14oW1wtK10pPVxzKihcZCtcLj9cZCopLywKCS8vIGEgc2V0IG9mIFJFJ3MgdGhhdCBjYW4gbWF0Y2ggc3RyaW5ncyBhbmQgZ2VuZXJhdGUgY29sb3IgdHVwbGVzLgoJc3RyaW5nUGFyc2VycyA9IFt7CgkJCXJlOiAvcmdiYT9cKFxzKihcZHsxLDN9KVxzKixccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqKD86LFxzKihcZD8oPzpcLlxkKyk/KVxzKik/XCkvLAoJCQlwYXJzZTogZnVuY3Rpb24oIGV4ZWNSZXN1bHQgKSB7CgkJCQlyZXR1cm4gWwoJCQkJCWV4ZWNSZXN1bHRbIDEgXSwKCQkJCQlleGVjUmVzdWx0WyAyIF0sCgkJCQkJZXhlY1Jlc3VsdFsgMyBdLAoJCQkJCWV4ZWNSZXN1bHRbIDQgXQoJCQkJXTsKCQkJfQoJCX0sIHsKCQkJcmU6IC9yZ2JhP1woXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkPyg/OlwuXGQrKT8pXHMqKT9cKS8sCgkJCXBhcnNlOiBmdW5jdGlvbiggZXhlY1Jlc3VsdCApIHsKCQkJCXJldHVybiBbCgkJCQkJZXhlY1Jlc3VsdFsgMSBdICogMi41NSwKCQkJCQlleGVjUmVzdWx0WyAyIF0gKiAyLjU1LAoJCQkJCWV4ZWNSZXN1bHRbIDMgXSAqIDIuNTUsCgkJCQkJZXhlY1Jlc3VsdFsgNCBdCgkJCQldOwoJCQl9CgkJfSwgewoJCQkvLyB0aGlzIHJlZ2V4IGlnbm9yZXMgQS1GIGJlY2F1c2UgaXQncyBjb21wYXJlZCBhZ2FpbnN0IGFuIGFscmVhZHkgbG93ZXJjYXNlZCBzdHJpbmcKCQkJcmU6IC8jKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pLywKCQkJcGFyc2U6IGZ1bmN0aW9uKCBleGVjUmVzdWx0ICkgewoJCQkJcmV0dXJuIFsKCQkJCQlwYXJzZUludCggZXhlY1Jlc3VsdFsgMSBdLCAxNiApLAoJCQkJCXBhcnNlSW50KCBleGVjUmVzdWx0WyAyIF0sIDE2ICksCgkJCQkJcGFyc2VJbnQoIGV4ZWNSZXN1bHRbIDMgXSwgMTYgKQoJCQkJXTsKCQkJfQoJCX0sIHsKCQkJLy8gdGhpcyByZWdleCBpZ25vcmVzIEEtRiBiZWNhdXNlIGl0J3MgY29tcGFyZWQgYWdhaW5zdCBhbiBhbHJlYWR5IGxvd2VyY2FzZWQgc3RyaW5nCgkJCXJlOiAvIyhbYS1mMC05XSkoW2EtZjAtOV0pKFthLWYwLTldKS8sCgkJCXBhcnNlOiBmdW5jdGlvbiggZXhlY1Jlc3VsdCApIHsKCQkJCXJldHVybiBbCgkJCQkJcGFyc2VJbnQoIGV4ZWNSZXN1bHRbIDEgXSArIGV4ZWNSZXN1bHRbIDEgXSwgMTYgKSwKCQkJCQlwYXJzZUludCggZXhlY1Jlc3VsdFsgMiBdICsgZXhlY1Jlc3VsdFsgMiBdLCAxNiApLAoJCQkJCXBhcnNlSW50KCBleGVjUmVzdWx0WyAzIF0gKyBleGVjUmVzdWx0WyAzIF0sIDE2ICkKCQkJCV07CgkJCX0KCQl9LCB7CgkJCXJlOiAvaHNsYT9cKFxzKihcZCsoPzpcLlxkKyk/KVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLywKCQkJc3BhY2U6ICJoc2xhIiwKCQkJcGFyc2U6IGZ1bmN0aW9uKCBleGVjUmVzdWx0ICkgewoJCQkJcmV0dXJuIFsKCQkJCQlleGVjUmVzdWx0WyAxIF0sCgkJCQkJZXhlY1Jlc3VsdFsgMiBdIC8gMTAwLAoJCQkJCWV4ZWNSZXN1bHRbIDMgXSAvIDEwMCwKCQkJCQlleGVjUmVzdWx0WyA0IF0KCQkJCV07CgkJCX0KCQl9XSwKCgkvLyBqUXVlcnkuQ29sb3IoICkKCWNvbG9yID0galF1ZXJ5LkNvbG9yID0gZnVuY3Rpb24oIGNvbG9yLCBncmVlbiwgYmx1ZSwgYWxwaGEgKSB7CgkJcmV0dXJuIG5ldyBqUXVlcnkuQ29sb3IuZm4ucGFyc2UoIGNvbG9yLCBncmVlbiwgYmx1ZSwgYWxwaGEgKTsKCX0sCglzcGFjZXMgPSB7CgkJcmdiYTogewoJCQlwcm9wczogewoJCQkJcmVkOiB7CgkJCQkJaWR4OiAwLAoJCQkJCXR5cGU6ICJieXRlIgoJCQkJfSwKCQkJCWdyZWVuOiB7CgkJCQkJaWR4OiAxLAoJCQkJCXR5cGU6ICJieXRlIgoJCQkJfSwKCQkJCWJsdWU6IHsKCQkJCQlpZHg6IDIsCgkJCQkJdHlwZTogImJ5dGUiCgkJCQl9CgkJCX0KCQl9LAoKCQloc2xhOiB7CgkJCXByb3BzOiB7CgkJCQlodWU6IHsKCQkJCQlpZHg6IDAsCgkJCQkJdHlwZTogImRlZ3JlZXMiCgkJCQl9LAoJCQkJc2F0dXJhdGlvbjogewoJCQkJCWlkeDogMSwKCQkJCQl0eXBlOiAicGVyY2VudCIKCQkJCX0sCgkJCQlsaWdodG5lc3M6IHsKCQkJCQlpZHg6IDIsCgkJCQkJdHlwZTogInBlcmNlbnQiCgkJCQl9CgkJCX0KCQl9Cgl9LAoJcHJvcFR5cGVzID0gewoJCSJieXRlIjogewoJCQlmbG9vcjogdHJ1ZSwKCQkJbWF4OiAyNTUKCQl9LAoJCSJwZXJjZW50IjogewoJCQltYXg6IDEKCQl9LAoJCSJkZWdyZWVzIjogewoJCQltb2Q6IDM2MCwKCQkJZmxvb3I6IHRydWUKCQl9Cgl9LAoJc3VwcG9ydCA9IGNvbG9yLnN1cHBvcnQgPSB7fSwKCgkvLyBlbGVtZW50IGZvciBzdXBwb3J0IHRlc3RzCglzdXBwb3J0RWxlbSA9IGpRdWVyeSggIjxwPiIgKVsgMCBdLAoKCS8vIGNvbG9ycyA9IGpRdWVyeS5Db2xvci5uYW1lcwoJY29sb3JzLAoKCS8vIGxvY2FsIGFsaWFzZXMgb2YgZnVuY3Rpb25zIGNhbGxlZCBvZnRlbgoJZWFjaCA9IGpRdWVyeS5lYWNoOwoKLy8gZGV0ZXJtaW5lIHJnYmEgc3VwcG9ydCBpbW1lZGlhdGVseQpzdXBwb3J0RWxlbS5zdHlsZS5jc3NUZXh0ID0gImJhY2tncm91bmQtY29sb3I6cmdiYSgxLDEsMSwuNSkiOwpzdXBwb3J0LnJnYmEgPSBzdXBwb3J0RWxlbS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IuaW5kZXhPZiggInJnYmEiICkgPiAtMTsKCi8vIGRlZmluZSBjYWNoZSBuYW1lIGFuZCBhbHBoYSBwcm9wZXJ0aWVzCi8vIGZvciByZ2JhIGFuZCBoc2xhIHNwYWNlcwplYWNoKCBzcGFjZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUsIHNwYWNlICkgewoJc3BhY2UuY2FjaGUgPSAiXyIgKyBzcGFjZU5hbWU7CglzcGFjZS5wcm9wcy5hbHBoYSA9IHsKCQlpZHg6IDMsCgkJdHlwZTogInBlcmNlbnQiLAoJCWRlZjogMQoJfTsKfSk7CgpmdW5jdGlvbiBjbGFtcCggdmFsdWUsIHByb3AsIGFsbG93RW1wdHkgKSB7Cgl2YXIgdHlwZSA9IHByb3BUeXBlc1sgcHJvcC50eXBlIF0gfHwge307CgoJaWYgKCB2YWx1ZSA9PSBudWxsICkgewoJCXJldHVybiAoYWxsb3dFbXB0eSB8fCAhcHJvcC5kZWYpID8gbnVsbCA6IHByb3AuZGVmOwoJfQoKCS8vIH5+IGlzIGFuIHNob3J0IHdheSBvZiBkb2luZyBmbG9vciBmb3IgcG9zaXRpdmUgbnVtYmVycwoJdmFsdWUgPSB0eXBlLmZsb29yID8gfn52YWx1ZSA6IHBhcnNlRmxvYXQoIHZhbHVlICk7CgoJLy8gSUUgd2lsbCBwYXNzIGluIGVtcHR5IHN0cmluZ3MgYXMgdmFsdWUgZm9yIGFscGhhLAoJLy8gd2hpY2ggd2lsbCBoaXQgdGhpcyBjYXNlCglpZiAoIGlzTmFOKCB2YWx1ZSApICkgewoJCXJldHVybiBwcm9wLmRlZjsKCX0KCglpZiAoIHR5cGUubW9kICkgewoJCS8vIHdlIGFkZCBtb2QgYmVmb3JlIG1vZGRpbmcgdG8gbWFrZSBzdXJlIHRoYXQgbmVnYXRpdmVzIHZhbHVlcwoJCS8vIGdldCBjb252ZXJ0ZWQgcHJvcGVybHk6IC0xMCAtPiAzNTAKCQlyZXR1cm4gKHZhbHVlICsgdHlwZS5tb2QpICUgdHlwZS5tb2Q7Cgl9CgoJLy8gZm9yIG5vdyBhbGwgcHJvcGVydHkgdHlwZXMgd2l0aG91dCBtb2QgaGF2ZSBtaW4gYW5kIG1heAoJcmV0dXJuIDAgPiB2YWx1ZSA/IDAgOiB0eXBlLm1heCA8IHZhbHVlID8gdHlwZS5tYXggOiB2YWx1ZTsKfQoKZnVuY3Rpb24gc3RyaW5nUGFyc2UoIHN0cmluZyApIHsKCXZhciBpbnN0ID0gY29sb3IoKSwKCQlyZ2JhID0gaW5zdC5fcmdiYSA9IFtdOwoKCXN0cmluZyA9IHN0cmluZy50b0xvd2VyQ2FzZSgpOwoKCWVhY2goIHN0cmluZ1BhcnNlcnMsIGZ1bmN0aW9uKCBpLCBwYXJzZXIgKSB7CgkJdmFyIHBhcnNlZCwKCQkJbWF0Y2ggPSBwYXJzZXIucmUuZXhlYyggc3RyaW5nICksCgkJCXZhbHVlcyA9IG1hdGNoICYmIHBhcnNlci5wYXJzZSggbWF0Y2ggKSwKCQkJc3BhY2VOYW1lID0gcGFyc2VyLnNwYWNlIHx8ICJyZ2JhIjsKCgkJaWYgKCB2YWx1ZXMgKSB7CgkJCXBhcnNlZCA9IGluc3RbIHNwYWNlTmFtZSBdKCB2YWx1ZXMgKTsKCgkJCS8vIGlmIHRoaXMgd2FzIGFuIHJnYmEgcGFyc2UgdGhlIGFzc2lnbm1lbnQgbWlnaHQgaGFwcGVuIHR3aWNlCgkJCS8vIG9oIHdlbGwuLi4uCgkJCWluc3RbIHNwYWNlc1sgc3BhY2VOYW1lIF0uY2FjaGUgXSA9IHBhcnNlZFsgc3BhY2VzWyBzcGFjZU5hbWUgXS5jYWNoZSBdOwoJCQlyZ2JhID0gaW5zdC5fcmdiYSA9IHBhcnNlZC5fcmdiYTsKCgkJCS8vIGV4aXQgZWFjaCggc3RyaW5nUGFyc2VycyApIGhlcmUgYmVjYXVzZSB3ZSBtYXRjaGVkCgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9KTsKCgkvLyBGb3VuZCBhIHN0cmluZ1BhcnNlciB0aGF0IGhhbmRsZWQgaXQKCWlmICggcmdiYS5sZW5ndGggKSB7CgoJCS8vIGlmIHRoaXMgY2FtZSBmcm9tIGEgcGFyc2VkIHN0cmluZywgZm9yY2UgInRyYW5zcGFyZW50IiB3aGVuIGFscGhhIGlzIDAKCQkvLyBjaHJvbWUsIChhbmQgbWF5YmUgb3RoZXJzKSByZXR1cm4gInRyYW5zcGFyZW50IiBhcyByZ2JhKDAsMCwwLDApCgkJaWYgKCByZ2JhLmpvaW4oKSA9PT0gIjAsMCwwLDAiICkgewoJCQlqUXVlcnkuZXh0ZW5kKCByZ2JhLCBjb2xvcnMudHJhbnNwYXJlbnQgKTsKCQl9CgkJcmV0dXJuIGluc3Q7Cgl9CgoJLy8gbmFtZWQgY29sb3JzCglyZXR1cm4gY29sb3JzWyBzdHJpbmcgXTsKfQoKY29sb3IuZm4gPSBqUXVlcnkuZXh0ZW5kKCBjb2xvci5wcm90b3R5cGUsIHsKCXBhcnNlOiBmdW5jdGlvbiggcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEgKSB7CgkJaWYgKCByZWQgPT09IHVuZGVmaW5lZCApIHsKCQkJdGhpcy5fcmdiYSA9IFsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCBdOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCByZWQuanF1ZXJ5IHx8IHJlZC5ub2RlVHlwZSApIHsKCQkJcmVkID0galF1ZXJ5KCByZWQgKS5jc3MoIGdyZWVuICk7CgkJCWdyZWVuID0gdW5kZWZpbmVkOwoJCX0KCgkJdmFyIGluc3QgPSB0aGlzLAoJCQl0eXBlID0galF1ZXJ5LnR5cGUoIHJlZCApLAoJCQlyZ2JhID0gdGhpcy5fcmdiYSA9IFtdOwoKCQkvLyBtb3JlIHRoYW4gMSBhcmd1bWVudCBzcGVjaWZpZWQgLSBhc3N1bWUgKCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSApCgkJaWYgKCBncmVlbiAhPT0gdW5kZWZpbmVkICkgewoJCQlyZWQgPSBbIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhIF07CgkJCXR5cGUgPSAiYXJyYXkiOwoJCX0KCgkJaWYgKCB0eXBlID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIHRoaXMucGFyc2UoIHN0cmluZ1BhcnNlKCByZWQgKSB8fCBjb2xvcnMuX2RlZmF1bHQgKTsKCQl9CgoJCWlmICggdHlwZSA9PT0gImFycmF5IiApIHsKCQkJZWFjaCggc3BhY2VzLnJnYmEucHJvcHMsIGZ1bmN0aW9uKCBrZXksIHByb3AgKSB7CgkJCQlyZ2JhWyBwcm9wLmlkeCBdID0gY2xhbXAoIHJlZFsgcHJvcC5pZHggXSwgcHJvcCApOwoJCQl9KTsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlpZiAoIHR5cGUgPT09ICJvYmplY3QiICkgewoJCQlpZiAoIHJlZCBpbnN0YW5jZW9mIGNvbG9yICkgewoJCQkJZWFjaCggc3BhY2VzLCBmdW5jdGlvbiggc3BhY2VOYW1lLCBzcGFjZSApIHsKCQkJCQlpZiAoIHJlZFsgc3BhY2UuY2FjaGUgXSApIHsKCQkJCQkJaW5zdFsgc3BhY2UuY2FjaGUgXSA9IHJlZFsgc3BhY2UuY2FjaGUgXS5zbGljZSgpOwoJCQkJCX0KCQkJCX0pOwoJCQl9IGVsc2UgewoJCQkJZWFjaCggc3BhY2VzLCBmdW5jdGlvbiggc3BhY2VOYW1lLCBzcGFjZSApIHsKCQkJCQl2YXIgY2FjaGUgPSBzcGFjZS5jYWNoZTsKCQkJCQllYWNoKCBzcGFjZS5wcm9wcywgZnVuY3Rpb24oIGtleSwgcHJvcCApIHsKCgkJCQkJCS8vIGlmIHRoZSBjYWNoZSBkb2Vzbid0IGV4aXN0LCBhbmQgd2Uga25vdyBob3cgdG8gY29udmVydAoJCQkJCQlpZiAoICFpbnN0WyBjYWNoZSBdICYmIHNwYWNlLnRvICkgewoKCQkJCQkJCS8vIGlmIHRoZSB2YWx1ZSB3YXMgbnVsbCwgd2UgZG9uJ3QgbmVlZCB0byBjb3B5IGl0CgkJCQkJCQkvLyBpZiB0aGUga2V5IHdhcyBhbHBoYSwgd2UgZG9uJ3QgbmVlZCB0byBjb3B5IGl0IGVpdGhlcgoJCQkJCQkJaWYgKCBrZXkgPT09ICJhbHBoYSIgfHwgcmVkWyBrZXkgXSA9PSBudWxsICkgewoJCQkJCQkJCXJldHVybjsKCQkJCQkJCX0KCQkJCQkJCWluc3RbIGNhY2hlIF0gPSBzcGFjZS50byggaW5zdC5fcmdiYSApOwoJCQkJCQl9CgoJCQkJCQkvLyB0aGlzIGlzIHRoZSBvbmx5IGNhc2Ugd2hlcmUgd2UgYWxsb3cgbnVsbHMgZm9yIEFMTCBwcm9wZXJ0aWVzLgoJCQkJCQkvLyBjYWxsIGNsYW1wIHdpdGggYWx3YXlzQWxsb3dFbXB0eQoJCQkJCQlpbnN0WyBjYWNoZSBdWyBwcm9wLmlkeCBdID0gY2xhbXAoIHJlZFsga2V5IF0sIHByb3AsIHRydWUgKTsKCQkJCQl9KTsKCgkJCQkJLy8gZXZlcnl0aGluZyBkZWZpbmVkIGJ1dCBhbHBoYT8KCQkJCQlpZiAoIGluc3RbIGNhY2hlIF0gJiYgalF1ZXJ5LmluQXJyYXkoIG51bGwsIGluc3RbIGNhY2hlIF0uc2xpY2UoIDAsIDMgKSApIDwgMCApIHsKCQkJCQkJLy8gdXNlIHRoZSBkZWZhdWx0IG9mIDEKCQkJCQkJaW5zdFsgY2FjaGUgXVsgMyBdID0gMTsKCQkJCQkJaWYgKCBzcGFjZS5mcm9tICkgewoJCQkJCQkJaW5zdC5fcmdiYSA9IHNwYWNlLmZyb20oIGluc3RbIGNhY2hlIF0gKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCglpczogZnVuY3Rpb24oIGNvbXBhcmUgKSB7CgkJdmFyIGlzID0gY29sb3IoIGNvbXBhcmUgKSwKCQkJc2FtZSA9IHRydWUsCgkJCWluc3QgPSB0aGlzOwoKCQllYWNoKCBzcGFjZXMsIGZ1bmN0aW9uKCBfLCBzcGFjZSApIHsKCQkJdmFyIGxvY2FsQ2FjaGUsCgkJCQlpc0NhY2hlID0gaXNbIHNwYWNlLmNhY2hlIF07CgkJCWlmIChpc0NhY2hlKSB7CgkJCQlsb2NhbENhY2hlID0gaW5zdFsgc3BhY2UuY2FjaGUgXSB8fCBzcGFjZS50byAmJiBzcGFjZS50byggaW5zdC5fcmdiYSApIHx8IFtdOwoJCQkJZWFjaCggc3BhY2UucHJvcHMsIGZ1bmN0aW9uKCBfLCBwcm9wICkgewoJCQkJCWlmICggaXNDYWNoZVsgcHJvcC5pZHggXSAhPSBudWxsICkgewoJCQkJCQlzYW1lID0gKCBpc0NhY2hlWyBwcm9wLmlkeCBdID09PSBsb2NhbENhY2hlWyBwcm9wLmlkeCBdICk7CgkJCQkJCXJldHVybiBzYW1lOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJCXJldHVybiBzYW1lOwoJCX0pOwoJCXJldHVybiBzYW1lOwoJfSwKCV9zcGFjZTogZnVuY3Rpb24oKSB7CgkJdmFyIHVzZWQgPSBbXSwKCQkJaW5zdCA9IHRoaXM7CgkJZWFjaCggc3BhY2VzLCBmdW5jdGlvbiggc3BhY2VOYW1lLCBzcGFjZSApIHsKCQkJaWYgKCBpbnN0WyBzcGFjZS5jYWNoZSBdICkgewoJCQkJdXNlZC5wdXNoKCBzcGFjZU5hbWUgKTsKCQkJfQoJCX0pOwoJCXJldHVybiB1c2VkLnBvcCgpOwoJfSwKCXRyYW5zaXRpb246IGZ1bmN0aW9uKCBvdGhlciwgZGlzdGFuY2UgKSB7CgkJdmFyIGVuZCA9IGNvbG9yKCBvdGhlciApLAoJCQlzcGFjZU5hbWUgPSBlbmQuX3NwYWNlKCksCgkJCXNwYWNlID0gc3BhY2VzWyBzcGFjZU5hbWUgXSwKCQkJc3RhcnRDb2xvciA9IHRoaXMuYWxwaGEoKSA9PT0gMCA/IGNvbG9yKCAidHJhbnNwYXJlbnQiICkgOiB0aGlzLAoJCQlzdGFydCA9IHN0YXJ0Q29sb3JbIHNwYWNlLmNhY2hlIF0gfHwgc3BhY2UudG8oIHN0YXJ0Q29sb3IuX3JnYmEgKSwKCQkJcmVzdWx0ID0gc3RhcnQuc2xpY2UoKTsKCgkJZW5kID0gZW5kWyBzcGFjZS5jYWNoZSBdOwoJCWVhY2goIHNwYWNlLnByb3BzLCBmdW5jdGlvbigga2V5LCBwcm9wICkgewoJCQl2YXIgaW5kZXggPSBwcm9wLmlkeCwKCQkJCXN0YXJ0VmFsdWUgPSBzdGFydFsgaW5kZXggXSwKCQkJCWVuZFZhbHVlID0gZW5kWyBpbmRleCBdLAoJCQkJdHlwZSA9IHByb3BUeXBlc1sgcHJvcC50eXBlIF0gfHwge307CgoJCQkvLyBpZiBudWxsLCBkb24ndCBvdmVycmlkZSBzdGFydCB2YWx1ZQoJCQlpZiAoIGVuZFZhbHVlID09PSBudWxsICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCS8vIGlmIG51bGwgLSB1c2UgZW5kCgkJCWlmICggc3RhcnRWYWx1ZSA9PT0gbnVsbCApIHsKCQkJCXJlc3VsdFsgaW5kZXggXSA9IGVuZFZhbHVlOwoJCQl9IGVsc2UgewoJCQkJaWYgKCB0eXBlLm1vZCApIHsKCQkJCQlpZiAoIGVuZFZhbHVlIC0gc3RhcnRWYWx1ZSA+IHR5cGUubW9kIC8gMiApIHsKCQkJCQkJc3RhcnRWYWx1ZSArPSB0eXBlLm1vZDsKCQkJCQl9IGVsc2UgaWYgKCBzdGFydFZhbHVlIC0gZW5kVmFsdWUgPiB0eXBlLm1vZCAvIDIgKSB7CgkJCQkJCXN0YXJ0VmFsdWUgLT0gdHlwZS5tb2Q7CgkJCQkJfQoJCQkJfQoJCQkJcmVzdWx0WyBpbmRleCBdID0gY2xhbXAoICggZW5kVmFsdWUgLSBzdGFydFZhbHVlICkgKiBkaXN0YW5jZSArIHN0YXJ0VmFsdWUsIHByb3AgKTsKCQkJfQoJCX0pOwoJCXJldHVybiB0aGlzWyBzcGFjZU5hbWUgXSggcmVzdWx0ICk7Cgl9LAoJYmxlbmQ6IGZ1bmN0aW9uKCBvcGFxdWUgKSB7CgkJLy8gaWYgd2UgYXJlIGFscmVhZHkgb3BhcXVlIC0gcmV0dXJuIG91cnNlbGYKCQlpZiAoIHRoaXMuX3JnYmFbIDMgXSA9PT0gMSApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQl2YXIgcmdiID0gdGhpcy5fcmdiYS5zbGljZSgpLAoJCQlhID0gcmdiLnBvcCgpLAoJCQlibGVuZCA9IGNvbG9yKCBvcGFxdWUgKS5fcmdiYTsKCgkJcmV0dXJuIGNvbG9yKCBqUXVlcnkubWFwKCByZ2IsIGZ1bmN0aW9uKCB2LCBpICkgewoJCQlyZXR1cm4gKCAxIC0gYSApICogYmxlbmRbIGkgXSArIGEgKiB2OwoJCX0pKTsKCX0sCgl0b1JnYmFTdHJpbmc6IGZ1bmN0aW9uKCkgewoJCXZhciBwcmVmaXggPSAicmdiYSgiLAoJCQlyZ2JhID0galF1ZXJ5Lm1hcCggdGhpcy5fcmdiYSwgZnVuY3Rpb24oIHYsIGkgKSB7CgkJCQlyZXR1cm4gdiA9PSBudWxsID8gKCBpID4gMiA/IDEgOiAwICkgOiB2OwoJCQl9KTsKCgkJaWYgKCByZ2JhWyAzIF0gPT09IDEgKSB7CgkJCXJnYmEucG9wKCk7CgkJCXByZWZpeCA9ICJyZ2IoIjsKCQl9CgoJCXJldHVybiBwcmVmaXggKyByZ2JhLmpvaW4oKSArICIpIjsKCX0sCgl0b0hzbGFTdHJpbmc6IGZ1bmN0aW9uKCkgewoJCXZhciBwcmVmaXggPSAiaHNsYSgiLAoJCQloc2xhID0galF1ZXJ5Lm1hcCggdGhpcy5oc2xhKCksIGZ1bmN0aW9uKCB2LCBpICkgewoJCQkJaWYgKCB2ID09IG51bGwgKSB7CgkJCQkJdiA9IGkgPiAyID8gMSA6IDA7CgkJCQl9CgoJCQkJLy8gY2F0Y2ggMSBhbmQgMgoJCQkJaWYgKCBpICYmIGkgPCAzICkgewoJCQkJCXYgPSBNYXRoLnJvdW5kKCB2ICogMTAwICkgKyAiJSI7CgkJCQl9CgkJCQlyZXR1cm4gdjsKCQkJfSk7CgoJCWlmICggaHNsYVsgMyBdID09PSAxICkgewoJCQloc2xhLnBvcCgpOwoJCQlwcmVmaXggPSAiaHNsKCI7CgkJfQoJCXJldHVybiBwcmVmaXggKyBoc2xhLmpvaW4oKSArICIpIjsKCX0sCgl0b0hleFN0cmluZzogZnVuY3Rpb24oIGluY2x1ZGVBbHBoYSApIHsKCQl2YXIgcmdiYSA9IHRoaXMuX3JnYmEuc2xpY2UoKSwKCQkJYWxwaGEgPSByZ2JhLnBvcCgpOwoKCQlpZiAoIGluY2x1ZGVBbHBoYSApIHsKCQkJcmdiYS5wdXNoKCB+figgYWxwaGEgKiAyNTUgKSApOwoJCX0KCgkJcmV0dXJuICIjIiArIGpRdWVyeS5tYXAoIHJnYmEsIGZ1bmN0aW9uKCB2ICkgewoKCQkJLy8gZGVmYXVsdCB0byAwIHdoZW4gbnVsbHMgZXhpc3QKCQkJdiA9ICggdiB8fCAwICkudG9TdHJpbmcoIDE2ICk7CgkJCXJldHVybiB2Lmxlbmd0aCA9PT0gMSA/ICIwIiArIHYgOiB2OwoJCX0pLmpvaW4oIiIpOwoJfSwKCXRvU3RyaW5nOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5fcmdiYVsgMyBdID09PSAwID8gInRyYW5zcGFyZW50IiA6IHRoaXMudG9SZ2JhU3RyaW5nKCk7Cgl9Cn0pOwpjb2xvci5mbi5wYXJzZS5wcm90b3R5cGUgPSBjb2xvci5mbjsKCi8vIGhzbGEgY29udmVyc2lvbnMgYWRhcHRlZCBmcm9tOgovLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL21hYXNoYWFjay9zb3VyY2UvYnJvd3NlL3BhY2thZ2VzL2dyYXBoaWNzL3RydW5rL3NyYy9ncmFwaGljcy9jb2xvcnMvSFVFMlJHQi5hcz9yPTUwMjEKCmZ1bmN0aW9uIGh1ZTJyZ2IoIHAsIHEsIGggKSB7CgloID0gKCBoICsgMSApICUgMTsKCWlmICggaCAqIDYgPCAxICkgewoJCXJldHVybiBwICsgKHEgLSBwKSAqIGggKiA2OwoJfQoJaWYgKCBoICogMiA8IDEpIHsKCQlyZXR1cm4gcTsKCX0KCWlmICggaCAqIDMgPCAyICkgewoJCXJldHVybiBwICsgKHEgLSBwKSAqICgoMi8zKSAtIGgpICogNjsKCX0KCXJldHVybiBwOwp9CgpzcGFjZXMuaHNsYS50byA9IGZ1bmN0aW9uICggcmdiYSApIHsKCWlmICggcmdiYVsgMCBdID09IG51bGwgfHwgcmdiYVsgMSBdID09IG51bGwgfHwgcmdiYVsgMiBdID09IG51bGwgKSB7CgkJcmV0dXJuIFsgbnVsbCwgbnVsbCwgbnVsbCwgcmdiYVsgMyBdIF07Cgl9Cgl2YXIgciA9IHJnYmFbIDAgXSAvIDI1NSwKCQlnID0gcmdiYVsgMSBdIC8gMjU1LAoJCWIgPSByZ2JhWyAyIF0gLyAyNTUsCgkJYSA9IHJnYmFbIDMgXSwKCQltYXggPSBNYXRoLm1heCggciwgZywgYiApLAoJCW1pbiA9IE1hdGgubWluKCByLCBnLCBiICksCgkJZGlmZiA9IG1heCAtIG1pbiwKCQlhZGQgPSBtYXggKyBtaW4sCgkJbCA9IGFkZCAqIDAuNSwKCQloLCBzOwoKCWlmICggbWluID09PSBtYXggKSB7CgkJaCA9IDA7Cgl9IGVsc2UgaWYgKCByID09PSBtYXggKSB7CgkJaCA9ICggNjAgKiAoIGcgLSBiICkgLyBkaWZmICkgKyAzNjA7Cgl9IGVsc2UgaWYgKCBnID09PSBtYXggKSB7CgkJaCA9ICggNjAgKiAoIGIgLSByICkgLyBkaWZmICkgKyAxMjA7Cgl9IGVsc2UgewoJCWggPSAoIDYwICogKCByIC0gZyApIC8gZGlmZiApICsgMjQwOwoJfQoKCS8vIGNocm9tYSAoZGlmZikgPT0gMCBtZWFucyBncmV5c2NhbGUgd2hpY2gsIGJ5IGRlZmluaXRpb24sIHNhdHVyYXRpb24gPSAwJQoJLy8gb3RoZXJ3aXNlLCBzYXR1cmF0aW9uIGlzIGJhc2VkIG9uIHRoZSByYXRpbyBvZiBjaHJvbWEgKGRpZmYpIHRvIGxpZ2h0bmVzcyAoYWRkKQoJaWYgKCBkaWZmID09PSAwICkgewoJCXMgPSAwOwoJfSBlbHNlIGlmICggbCA8PSAwLjUgKSB7CgkJcyA9IGRpZmYgLyBhZGQ7Cgl9IGVsc2UgewoJCXMgPSBkaWZmIC8gKCAyIC0gYWRkICk7Cgl9CglyZXR1cm4gWyBNYXRoLnJvdW5kKGgpICUgMzYwLCBzLCBsLCBhID09IG51bGwgPyAxIDogYSBdOwp9OwoKc3BhY2VzLmhzbGEuZnJvbSA9IGZ1bmN0aW9uICggaHNsYSApIHsKCWlmICggaHNsYVsgMCBdID09IG51bGwgfHwgaHNsYVsgMSBdID09IG51bGwgfHwgaHNsYVsgMiBdID09IG51bGwgKSB7CgkJcmV0dXJuIFsgbnVsbCwgbnVsbCwgbnVsbCwgaHNsYVsgMyBdIF07Cgl9Cgl2YXIgaCA9IGhzbGFbIDAgXSAvIDM2MCwKCQlzID0gaHNsYVsgMSBdLAoJCWwgPSBoc2xhWyAyIF0sCgkJYSA9IGhzbGFbIDMgXSwKCQlxID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSBsICogcywKCQlwID0gMiAqIGwgLSBxOwoKCXJldHVybiBbCgkJTWF0aC5yb3VuZCggaHVlMnJnYiggcCwgcSwgaCArICggMSAvIDMgKSApICogMjU1ICksCgkJTWF0aC5yb3VuZCggaHVlMnJnYiggcCwgcSwgaCApICogMjU1ICksCgkJTWF0aC5yb3VuZCggaHVlMnJnYiggcCwgcSwgaCAtICggMSAvIDMgKSApICogMjU1ICksCgkJYQoJXTsKfTsKCgplYWNoKCBzcGFjZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUsIHNwYWNlICkgewoJdmFyIHByb3BzID0gc3BhY2UucHJvcHMsCgkJY2FjaGUgPSBzcGFjZS5jYWNoZSwKCQl0byA9IHNwYWNlLnRvLAoJCWZyb20gPSBzcGFjZS5mcm9tOwoKCS8vIG1ha2VzIHJnYmEoKSBhbmQgaHNsYSgpCgljb2xvci5mblsgc3BhY2VOYW1lIF0gPSBmdW5jdGlvbiggdmFsdWUgKSB7CgoJCS8vIGdlbmVyYXRlIGEgY2FjaGUgZm9yIHRoaXMgc3BhY2UgaWYgaXQgZG9lc24ndCBleGlzdAoJCWlmICggdG8gJiYgIXRoaXNbIGNhY2hlIF0gKSB7CgkJCXRoaXNbIGNhY2hlIF0gPSB0byggdGhpcy5fcmdiYSApOwoJCX0KCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzWyBjYWNoZSBdLnNsaWNlKCk7CgkJfQoKCQl2YXIgcmV0LAoJCQl0eXBlID0galF1ZXJ5LnR5cGUoIHZhbHVlICksCgkJCWFyciA9ICggdHlwZSA9PT0gImFycmF5IiB8fCB0eXBlID09PSAib2JqZWN0IiApID8gdmFsdWUgOiBhcmd1bWVudHMsCgkJCWxvY2FsID0gdGhpc1sgY2FjaGUgXS5zbGljZSgpOwoKCQllYWNoKCBwcm9wcywgZnVuY3Rpb24oIGtleSwgcHJvcCApIHsKCQkJdmFyIHZhbCA9IGFyclsgdHlwZSA9PT0gIm9iamVjdCIgPyBrZXkgOiBwcm9wLmlkeCBdOwoJCQlpZiAoIHZhbCA9PSBudWxsICkgewoJCQkJdmFsID0gbG9jYWxbIHByb3AuaWR4IF07CgkJCX0KCQkJbG9jYWxbIHByb3AuaWR4IF0gPSBjbGFtcCggdmFsLCBwcm9wICk7CgkJfSk7CgoJCWlmICggZnJvbSApIHsKCQkJcmV0ID0gY29sb3IoIGZyb20oIGxvY2FsICkgKTsKCQkJcmV0WyBjYWNoZSBdID0gbG9jYWw7CgkJCXJldHVybiByZXQ7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGNvbG9yKCBsb2NhbCApOwoJCX0KCX07CgoJLy8gbWFrZXMgcmVkKCkgZ3JlZW4oKSBibHVlKCkgYWxwaGEoKSBodWUoKSBzYXR1cmF0aW9uKCkgbGlnaHRuZXNzKCkKCWVhY2goIHByb3BzLCBmdW5jdGlvbigga2V5LCBwcm9wICkgewoJCS8vIGFscGhhIGlzIGluY2x1ZGVkIGluIG1vcmUgdGhhbiBvbmUgc3BhY2UKCQlpZiAoIGNvbG9yLmZuWyBrZXkgXSApIHsKCQkJcmV0dXJuOwoJCX0KCQljb2xvci5mblsga2V5IF0gPSBmdW5jdGlvbiggdmFsdWUgKSB7CgkJCXZhciB2dHlwZSA9IGpRdWVyeS50eXBlKCB2YWx1ZSApLAoJCQkJZm4gPSAoIGtleSA9PT0gImFscGhhIiA/ICggdGhpcy5faHNsYSA/ICJoc2xhIiA6ICJyZ2JhIiApIDogc3BhY2VOYW1lICksCgkJCQlsb2NhbCA9IHRoaXNbIGZuIF0oKSwKCQkJCWN1ciA9IGxvY2FsWyBwcm9wLmlkeCBdLAoJCQkJbWF0Y2g7CgoJCQlpZiAoIHZ0eXBlID09PSAidW5kZWZpbmVkIiApIHsKCQkJCXJldHVybiBjdXI7CgkJCX0KCgkJCWlmICggdnR5cGUgPT09ICJmdW5jdGlvbiIgKSB7CgkJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIHRoaXMsIGN1ciApOwoJCQkJdnR5cGUgPSBqUXVlcnkudHlwZSggdmFsdWUgKTsKCQkJfQoJCQlpZiAoIHZhbHVlID09IG51bGwgJiYgcHJvcC5lbXB0eSApIHsKCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJCWlmICggdnR5cGUgPT09ICJzdHJpbmciICkgewoJCQkJbWF0Y2ggPSBycGx1c2VxdWFscy5leGVjKCB2YWx1ZSApOwoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQl2YWx1ZSA9IGN1ciArIHBhcnNlRmxvYXQoIG1hdGNoWyAyIF0gKSAqICggbWF0Y2hbIDEgXSA9PT0gIisiID8gMSA6IC0xICk7CgkJCQl9CgkJCX0KCQkJbG9jYWxbIHByb3AuaWR4IF0gPSB2YWx1ZTsKCQkJcmV0dXJuIHRoaXNbIGZuIF0oIGxvY2FsICk7CgkJfTsKCX0pOwp9KTsKCi8vIGFkZCBjc3NIb29rIGFuZCAuZnguc3RlcCBmdW5jdGlvbiBmb3IgZWFjaCBuYW1lZCBob29rLgovLyBhY2NlcHQgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIHByb3BlcnRpZXMKY29sb3IuaG9vayA9IGZ1bmN0aW9uKCBob29rICkgewoJdmFyIGhvb2tzID0gaG9vay5zcGxpdCggIiAiICk7CgllYWNoKCBob29rcywgZnVuY3Rpb24oIGksIGhvb2sgKSB7CgkJalF1ZXJ5LmNzc0hvb2tzWyBob29rIF0gPSB7CgkJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCQkJdmFyIHBhcnNlZCwgY3VyRWxlbSwKCQkJCQliYWNrZ3JvdW5kQ29sb3IgPSAiIjsKCgkJCQlpZiAoIHZhbHVlICE9PSAidHJhbnNwYXJlbnQiICYmICggalF1ZXJ5LnR5cGUoIHZhbHVlICkgIT09ICJzdHJpbmciIHx8ICggcGFyc2VkID0gc3RyaW5nUGFyc2UoIHZhbHVlICkgKSApICkgewoJCQkJCXZhbHVlID0gY29sb3IoIHBhcnNlZCB8fCB2YWx1ZSApOwoJCQkJCWlmICggIXN1cHBvcnQucmdiYSAmJiB2YWx1ZS5fcmdiYVsgMyBdICE9PSAxICkgewoJCQkJCQljdXJFbGVtID0gaG9vayA9PT0gImJhY2tncm91bmRDb2xvciIgPyBlbGVtLnBhcmVudE5vZGUgOiBlbGVtOwoJCQkJCQl3aGlsZSAoCgkJCQkJCQkoYmFja2dyb3VuZENvbG9yID09PSAiIiB8fCBiYWNrZ3JvdW5kQ29sb3IgPT09ICJ0cmFuc3BhcmVudCIpICYmCgkJCQkJCQljdXJFbGVtICYmIGN1ckVsZW0uc3R5bGUKCQkJCQkJKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCWJhY2tncm91bmRDb2xvciA9IGpRdWVyeS5jc3MoIGN1ckVsZW0sICJiYWNrZ3JvdW5kQ29sb3IiICk7CgkJCQkJCQkJY3VyRWxlbSA9IGN1ckVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQl2YWx1ZSA9IHZhbHVlLmJsZW5kKCBiYWNrZ3JvdW5kQ29sb3IgJiYgYmFja2dyb3VuZENvbG9yICE9PSAidHJhbnNwYXJlbnQiID8KCQkJCQkJCWJhY2tncm91bmRDb2xvciA6CgkJCQkJCQkiX2RlZmF1bHQiICk7CgkJCQkJfQoKCQkJCQl2YWx1ZSA9IHZhbHVlLnRvUmdiYVN0cmluZygpOwoJCQkJfQoJCQkJdHJ5IHsKCQkJCQllbGVtLnN0eWxlWyBob29rIF0gPSB2YWx1ZTsKCQkJCX0gY2F0Y2goIGUgKSB7CgkJCQkJLy8gd3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIG9uICJpbnZhbGlkIiB2YWx1ZXMgbGlrZSAnYXV0bycgb3IgJ2luaGVyaXQnCgkJCQl9CgkJCX0KCQl9OwoJCWpRdWVyeS5meC5zdGVwWyBob29rIF0gPSBmdW5jdGlvbiggZnggKSB7CgkJCWlmICggIWZ4LmNvbG9ySW5pdCApIHsKCQkJCWZ4LnN0YXJ0ID0gY29sb3IoIGZ4LmVsZW0sIGhvb2sgKTsKCQkJCWZ4LmVuZCA9IGNvbG9yKCBmeC5lbmQgKTsKCQkJCWZ4LmNvbG9ySW5pdCA9IHRydWU7CgkJCX0KCQkJalF1ZXJ5LmNzc0hvb2tzWyBob29rIF0uc2V0KCBmeC5lbGVtLCBmeC5zdGFydC50cmFuc2l0aW9uKCBmeC5lbmQsIGZ4LnBvcyApICk7CgkJfTsKCX0pOwoKfTsKCmNvbG9yLmhvb2soIHN0ZXBIb29rcyApOwoKalF1ZXJ5LmNzc0hvb2tzLmJvcmRlckNvbG9yID0gewoJZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGV4cGFuZGVkID0ge307CgoJCWVhY2goIFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXSwgZnVuY3Rpb24oIGksIHBhcnQgKSB7CgkJCWV4cGFuZGVkWyAiYm9yZGVyIiArIHBhcnQgKyAiQ29sb3IiIF0gPSB2YWx1ZTsKCQl9KTsKCQlyZXR1cm4gZXhwYW5kZWQ7Cgl9Cn07CgovLyBCYXNpYyBjb2xvciBuYW1lcyBvbmx5LgovLyBVc2FnZSBvZiBhbnkgb2YgdGhlIG90aGVyIGNvbG9yIG5hbWVzIHJlcXVpcmVzIGFkZGluZyB5b3Vyc2VsZiBvciBpbmNsdWRpbmcKLy8ganF1ZXJ5LmNvbG9yLnN2Zy1uYW1lcy5qcy4KY29sb3JzID0galF1ZXJ5LkNvbG9yLm5hbWVzID0gewoJLy8gNC4xLiBCYXNpYyBjb2xvciBrZXl3b3JkcwoJYXF1YTogIiMwMGZmZmYiLAoJYmxhY2s6ICIjMDAwMDAwIiwKCWJsdWU6ICIjMDAwMGZmIiwKCWZ1Y2hzaWE6ICIjZmYwMGZmIiwKCWdyYXk6ICIjODA4MDgwIiwKCWdyZWVuOiAiIzAwODAwMCIsCglsaW1lOiAiIzAwZmYwMCIsCgltYXJvb246ICIjODAwMDAwIiwKCW5hdnk6ICIjMDAwMDgwIiwKCW9saXZlOiAiIzgwODAwMCIsCglwdXJwbGU6ICIjODAwMDgwIiwKCXJlZDogIiNmZjAwMDAiLAoJc2lsdmVyOiAiI2MwYzBjMCIsCgl0ZWFsOiAiIzAwODA4MCIsCgl3aGl0ZTogIiNmZmZmZmYiLAoJeWVsbG93OiAiI2ZmZmYwMCIsCgoJLy8gNC4yLjMuICJ0cmFuc3BhcmVudCIgY29sb3Iga2V5d29yZAoJdHJhbnNwYXJlbnQ6IFsgbnVsbCwgbnVsbCwgbnVsbCwgMCBdLAoKCV9kZWZhdWx0OiAiI2ZmZmZmZiIKfTsKCn0pKCBqUXVlcnkgKTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENMQVNTIEFOSU1BVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwooZnVuY3Rpb24oKSB7Cgp2YXIgY2xhc3NBbmltYXRpb25BY3Rpb25zID0gWyAiYWRkIiwgInJlbW92ZSIsICJ0b2dnbGUiIF0sCglzaG9ydGhhbmRTdHlsZXMgPSB7CgkJYm9yZGVyOiAxLAoJCWJvcmRlckJvdHRvbTogMSwKCQlib3JkZXJDb2xvcjogMSwKCQlib3JkZXJMZWZ0OiAxLAoJCWJvcmRlclJpZ2h0OiAxLAoJCWJvcmRlclRvcDogMSwKCQlib3JkZXJXaWR0aDogMSwKCQltYXJnaW46IDEsCgkJcGFkZGluZzogMQoJfTsKCiQuZWFjaChbICJib3JkZXJMZWZ0U3R5bGUiLCAiYm9yZGVyUmlnaHRTdHlsZSIsICJib3JkZXJCb3R0b21TdHlsZSIsICJib3JkZXJUb3BTdHlsZSIgXSwgZnVuY3Rpb24oIF8sIHByb3AgKSB7CgkkLmZ4LnN0ZXBbIHByb3AgXSA9IGZ1bmN0aW9uKCBmeCApIHsKCQlpZiAoIGZ4LmVuZCAhPT0gIm5vbmUiICYmICFmeC5zZXRBdHRyIHx8IGZ4LnBvcyA9PT0gMSAmJiAhZnguc2V0QXR0ciApIHsKCQkJalF1ZXJ5LnN0eWxlKCBmeC5lbGVtLCBwcm9wLCBmeC5lbmQgKTsKCQkJZnguc2V0QXR0ciA9IHRydWU7CgkJfQoJfTsKfSk7CgpmdW5jdGlvbiBnZXRFbGVtZW50U3R5bGVzKCBlbGVtICkgewoJdmFyIGtleSwgbGVuLAoJCXN0eWxlID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ID8KCQkJZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKSA6CgkJCWVsZW0uY3VycmVudFN0eWxlLAoJCXN0eWxlcyA9IHt9OwoKCWlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoICYmIHN0eWxlWyAwIF0gJiYgc3R5bGVbIHN0eWxlWyAwIF0gXSApIHsKCQlsZW4gPSBzdHlsZS5sZW5ndGg7CgkJd2hpbGUgKCBsZW4tLSApIHsKCQkJa2V5ID0gc3R5bGVbIGxlbiBdOwoJCQlpZiAoIHR5cGVvZiBzdHlsZVsga2V5IF0gPT09ICJzdHJpbmciICkgewoJCQkJc3R5bGVzWyAkLmNhbWVsQ2FzZSgga2V5ICkgXSA9IHN0eWxlWyBrZXkgXTsKCQkJfQoJCX0KCS8vIHN1cHBvcnQ6IE9wZXJhLCBJRSA8OQoJfSBlbHNlIHsKCQlmb3IgKCBrZXkgaW4gc3R5bGUgKSB7CgkJCWlmICggdHlwZW9mIHN0eWxlWyBrZXkgXSA9PT0gInN0cmluZyIgKSB7CgkJCQlzdHlsZXNbIGtleSBdID0gc3R5bGVbIGtleSBdOwoJCQl9CgkJfQoJfQoKCXJldHVybiBzdHlsZXM7Cn0KCgpmdW5jdGlvbiBzdHlsZURpZmZlcmVuY2UoIG9sZFN0eWxlLCBuZXdTdHlsZSApIHsKCXZhciBkaWZmID0ge30sCgkJbmFtZSwgdmFsdWU7CgoJZm9yICggbmFtZSBpbiBuZXdTdHlsZSApIHsKCQl2YWx1ZSA9IG5ld1N0eWxlWyBuYW1lIF07CgkJaWYgKCBvbGRTdHlsZVsgbmFtZSBdICE9PSB2YWx1ZSApIHsKCQkJaWYgKCAhc2hvcnRoYW5kU3R5bGVzWyBuYW1lIF0gKSB7CgkJCQlpZiAoICQuZnguc3RlcFsgbmFtZSBdIHx8ICFpc05hTiggcGFyc2VGbG9hdCggdmFsdWUgKSApICkgewoJCQkJCWRpZmZbIG5hbWUgXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBkaWZmOwp9CgovLyBzdXBwb3J0OiBqUXVlcnkgPDEuOAppZiAoICEkLmZuLmFkZEJhY2sgKSB7CgkkLmZuLmFkZEJhY2sgPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Owp9CgokLmVmZmVjdHMuYW5pbWF0ZUNsYXNzID0gZnVuY3Rpb24oIHZhbHVlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayApIHsKCXZhciBvID0gJC5zcGVlZCggZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2sgKTsKCglyZXR1cm4gdGhpcy5xdWV1ZSggZnVuY3Rpb24oKSB7CgkJdmFyIGFuaW1hdGVkID0gJCggdGhpcyApLAoJCQliYXNlQ2xhc3MgPSBhbmltYXRlZC5hdHRyKCAiY2xhc3MiICkgfHwgIiIsCgkJCWFwcGx5Q2xhc3NDaGFuZ2UsCgkJCWFsbEFuaW1hdGlvbnMgPSBvLmNoaWxkcmVuID8gYW5pbWF0ZWQuZmluZCggIioiICkuYWRkQmFjaygpIDogYW5pbWF0ZWQ7CgoJCS8vIG1hcCB0aGUgYW5pbWF0ZWQgb2JqZWN0cyB0byBzdG9yZSB0aGUgb3JpZ2luYWwgc3R5bGVzLgoJCWFsbEFuaW1hdGlvbnMgPSBhbGxBbmltYXRpb25zLm1hcChmdW5jdGlvbigpIHsKCQkJdmFyIGVsID0gJCggdGhpcyApOwoJCQlyZXR1cm4gewoJCQkJZWw6IGVsLAoJCQkJc3RhcnQ6IGdldEVsZW1lbnRTdHlsZXMoIHRoaXMgKQoJCQl9OwoJCX0pOwoKCQkvLyBhcHBseSBjbGFzcyBjaGFuZ2UKCQlhcHBseUNsYXNzQ2hhbmdlID0gZnVuY3Rpb24oKSB7CgkJCSQuZWFjaCggY2xhc3NBbmltYXRpb25BY3Rpb25zLCBmdW5jdGlvbihpLCBhY3Rpb24pIHsKCQkJCWlmICggdmFsdWVbIGFjdGlvbiBdICkgewoJCQkJCWFuaW1hdGVkWyBhY3Rpb24gKyAiQ2xhc3MiIF0oIHZhbHVlWyBhY3Rpb24gXSApOwoJCQkJfQoJCQl9KTsKCQl9OwoJCWFwcGx5Q2xhc3NDaGFuZ2UoKTsKCgkJLy8gbWFwIGFsbCBhbmltYXRlZCBvYmplY3RzIGFnYWluIC0gY2FsY3VsYXRlIG5ldyBzdHlsZXMgYW5kIGRpZmYKCQlhbGxBbmltYXRpb25zID0gYWxsQW5pbWF0aW9ucy5tYXAoZnVuY3Rpb24oKSB7CgkJCXRoaXMuZW5kID0gZ2V0RWxlbWVudFN0eWxlcyggdGhpcy5lbFsgMCBdICk7CgkJCXRoaXMuZGlmZiA9IHN0eWxlRGlmZmVyZW5jZSggdGhpcy5zdGFydCwgdGhpcy5lbmQgKTsKCQkJcmV0dXJuIHRoaXM7CgkJfSk7CgoJCS8vIGFwcGx5IG9yaWdpbmFsIGNsYXNzCgkJYW5pbWF0ZWQuYXR0ciggImNsYXNzIiwgYmFzZUNsYXNzICk7CgoJCS8vIG1hcCBhbGwgYW5pbWF0ZWQgb2JqZWN0cyBhZ2FpbiAtIHRoaXMgdGltZSBjb2xsZWN0aW5nIGEgcHJvbWlzZQoJCWFsbEFuaW1hdGlvbnMgPSBhbGxBbmltYXRpb25zLm1hcChmdW5jdGlvbigpIHsKCQkJdmFyIHN0eWxlSW5mbyA9IHRoaXMsCgkJCQlkZmQgPSAkLkRlZmVycmVkKCksCgkJCQlvcHRzID0gJC5leHRlbmQoe30sIG8sIHsKCQkJCQlxdWV1ZTogZmFsc2UsCgkJCQkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQkJCQlkZmQucmVzb2x2ZSggc3R5bGVJbmZvICk7CgkJCQkJfQoJCQkJfSk7CgoJCQl0aGlzLmVsLmFuaW1hdGUoIHRoaXMuZGlmZiwgb3B0cyApOwoJCQlyZXR1cm4gZGZkLnByb21pc2UoKTsKCQl9KTsKCgkJLy8gb25jZSBhbGwgYW5pbWF0aW9ucyBoYXZlIGNvbXBsZXRlZDoKCQkkLndoZW4uYXBwbHkoICQsIGFsbEFuaW1hdGlvbnMuZ2V0KCkgKS5kb25lKGZ1bmN0aW9uKCkgewoKCQkJLy8gc2V0IHRoZSBmaW5hbCBjbGFzcwoJCQlhcHBseUNsYXNzQ2hhbmdlKCk7CgoJCQkvLyBmb3IgZWFjaCBhbmltYXRlZCBlbGVtZW50LAoJCQkvLyBjbGVhciBhbGwgY3NzIHByb3BlcnRpZXMgdGhhdCB3ZXJlIGFuaW1hdGVkCgkJCSQuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbigpIHsKCQkJCXZhciBlbCA9IHRoaXMuZWw7CgkJCQkkLmVhY2goIHRoaXMuZGlmZiwgZnVuY3Rpb24oa2V5KSB7CgkJCQkJZWwuY3NzKCBrZXksICIiICk7CgkJCQl9KTsKCQkJfSk7CgoJCQkvLyB0aGlzIGlzIGd1YXJudGVlZCB0byBiZSB0aGVyZSBpZiB5b3UgdXNlIGpRdWVyeS5zcGVlZCgpCgkJCS8vIGl0IGFsc28gaGFuZGxlcyBkZXF1ZXVpbmcgdGhlIG5leHQgYW5pbS4uLgoJCQlvLmNvbXBsZXRlLmNhbGwoIGFuaW1hdGVkWyAwIF0gKTsKCQl9KTsKCX0pOwp9OwoKJC5mbi5leHRlbmQoewoJYWRkQ2xhc3M6IChmdW5jdGlvbiggb3JpZyApIHsKCQlyZXR1cm4gZnVuY3Rpb24oIGNsYXNzTmFtZXMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCQlyZXR1cm4gc3BlZWQgPwoJCQkJJC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKCB0aGlzLAoJCQkJCXsgYWRkOiBjbGFzc05hbWVzIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgOgoJCQkJb3JpZy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCX0pKCAkLmZuLmFkZENsYXNzICksCgoJcmVtb3ZlQ2xhc3M6IChmdW5jdGlvbiggb3JpZyApIHsKCQlyZXR1cm4gZnVuY3Rpb24oIGNsYXNzTmFtZXMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPwoJCQkJJC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKCB0aGlzLAoJCQkJCXsgcmVtb3ZlOiBjbGFzc05hbWVzIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgOgoJCQkJb3JpZy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCX0pKCAkLmZuLnJlbW92ZUNsYXNzICksCgoJdG9nZ2xlQ2xhc3M6IChmdW5jdGlvbiggb3JpZyApIHsKCQlyZXR1cm4gZnVuY3Rpb24oIGNsYXNzTmFtZXMsIGZvcmNlLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKCQkJaWYgKCB0eXBlb2YgZm9yY2UgPT09ICJib29sZWFuIiB8fCBmb3JjZSA9PT0gdW5kZWZpbmVkICkgewoJCQkJaWYgKCAhc3BlZWQgKSB7CgkJCQkJLy8gd2l0aG91dCBzcGVlZCBwYXJhbWV0ZXIKCQkJCQlyZXR1cm4gb3JpZy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiAkLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwoIHRoaXMsCgkJCQkJCShmb3JjZSA/IHsgYWRkOiBjbGFzc05hbWVzIH0gOiB7IHJlbW92ZTogY2xhc3NOYW1lcyB9KSwKCQkJCQkJc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIHdpdGhvdXQgZm9yY2UgcGFyYW1ldGVyCgkJCQlyZXR1cm4gJC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKCB0aGlzLAoJCQkJCXsgdG9nZ2xlOiBjbGFzc05hbWVzIH0sIGZvcmNlLCBzcGVlZCwgZWFzaW5nICk7CgkJCX0KCQl9OwoJfSkoICQuZm4udG9nZ2xlQ2xhc3MgKSwKCglzd2l0Y2hDbGFzczogZnVuY3Rpb24oIHJlbW92ZSwgYWRkLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjaykgewoJCXJldHVybiAkLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwoIHRoaXMsIHsKCQkJYWRkOiBhZGQsCgkJCXJlbW92ZTogcmVtb3ZlCgkJfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0KfSk7Cgp9KSgpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVGRkVDVFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCihmdW5jdGlvbigpIHsKCiQuZXh0ZW5kKCAkLmVmZmVjdHMsIHsKCXZlcnNpb246ICIxLjEwLjMiLAoKCS8vIFNhdmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgaW4gYSBkYXRhIHN0b3JhZ2UKCXNhdmU6IGZ1bmN0aW9uKCBlbGVtZW50LCBzZXQgKSB7CgkJZm9yKCB2YXIgaT0wOyBpIDwgc2V0Lmxlbmd0aDsgaSsrICkgewoJCQlpZiAoIHNldFsgaSBdICE9PSBudWxsICkgewoJCQkJZWxlbWVudC5kYXRhKCBkYXRhU3BhY2UgKyBzZXRbIGkgXSwgZWxlbWVudFsgMCBdLnN0eWxlWyBzZXRbIGkgXSBdICk7CgkJCX0KCQl9Cgl9LAoKCS8vIFJlc3RvcmVzIGEgc2V0IG9mIHByZXZpb3VzbHkgc2F2ZWQgcHJvcGVydGllcyBmcm9tIGEgZGF0YSBzdG9yYWdlCglyZXN0b3JlOiBmdW5jdGlvbiggZWxlbWVudCwgc2V0ICkgewoJCXZhciB2YWwsIGk7CgkJZm9yKCBpPTA7IGkgPCBzZXQubGVuZ3RoOyBpKysgKSB7CgkJCWlmICggc2V0WyBpIF0gIT09IG51bGwgKSB7CgkJCQl2YWwgPSBlbGVtZW50LmRhdGEoIGRhdGFTcGFjZSArIHNldFsgaSBdICk7CgkJCQkvLyBzdXBwb3J0OiBqUXVlcnkgMS42LjIKCQkJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0Lzk5MTcKCQkJCS8vIGpRdWVyeSAxLjYuMiBpbmNvcnJlY3RseSByZXR1cm5zIHVuZGVmaW5lZCBmb3IgYW55IGZhbHN5IHZhbHVlLgoJCQkJLy8gV2UgY2FuJ3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuICIiIGFuZCAwIGhlcmUsIHNvIHdlIGp1c3QgYXNzdW1lCgkJCQkvLyBlbXB0eSBzdHJpbmcgc2luY2UgaXQncyBsaWtlbHkgdG8gYmUgYSBtb3JlIGNvbW1vbiB2YWx1ZS4uLgoJCQkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKCQkJCQl2YWwgPSAiIjsKCQkJCX0KCQkJCWVsZW1lbnQuY3NzKCBzZXRbIGkgXSwgdmFsICk7CgkJCX0KCQl9Cgl9LAoKCXNldE1vZGU6IGZ1bmN0aW9uKCBlbCwgbW9kZSApIHsKCQlpZiAobW9kZSA9PT0gInRvZ2dsZSIpIHsKCQkJbW9kZSA9IGVsLmlzKCAiOmhpZGRlbiIgKSA/ICJzaG93IiA6ICJoaWRlIjsKCQl9CgkJcmV0dXJuIG1vZGU7Cgl9LAoKCS8vIFRyYW5zbGF0ZXMgYSBbdG9wLGxlZnRdIGFycmF5IGludG8gYSBiYXNlbGluZSB2YWx1ZQoJLy8gdGhpcyBzaG91bGQgYmUgYSBsaXR0bGUgbW9yZSBmbGV4aWJsZSBpbiB0aGUgZnV0dXJlIHRvIGhhbmRsZSBhIHN0cmluZyAmIGhhc2gKCWdldEJhc2VsaW5lOiBmdW5jdGlvbiggb3JpZ2luLCBvcmlnaW5hbCApIHsKCQl2YXIgeSwgeDsKCQlzd2l0Y2ggKCBvcmlnaW5bIDAgXSApIHsKCQkJY2FzZSAidG9wIjogeSA9IDA7IGJyZWFrOwoJCQljYXNlICJtaWRkbGUiOiB5ID0gMC41OyBicmVhazsKCQkJY2FzZSAiYm90dG9tIjogeSA9IDE7IGJyZWFrOwoJCQlkZWZhdWx0OiB5ID0gb3JpZ2luWyAwIF0gLyBvcmlnaW5hbC5oZWlnaHQ7CgkJfQoJCXN3aXRjaCAoIG9yaWdpblsgMSBdICkgewoJCQljYXNlICJsZWZ0IjogeCA9IDA7IGJyZWFrOwoJCQljYXNlICJjZW50ZXIiOiB4ID0gMC41OyBicmVhazsKCQkJY2FzZSAicmlnaHQiOiB4ID0gMTsgYnJlYWs7CgkJCWRlZmF1bHQ6IHggPSBvcmlnaW5bIDEgXSAvIG9yaWdpbmFsLndpZHRoOwoJCX0KCQlyZXR1cm4gewoJCQl4OiB4LAoJCQl5OiB5CgkJfTsKCX0sCgoJLy8gV3JhcHMgdGhlIGVsZW1lbnQgYXJvdW5kIGEgd3JhcHBlciB0aGF0IGNvcGllcyBwb3NpdGlvbiBwcm9wZXJ0aWVzCgljcmVhdGVXcmFwcGVyOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCgkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSB3cmFwcGVkLCByZXR1cm4gaXQKCQlpZiAoIGVsZW1lbnQucGFyZW50KCkuaXMoICIudWktZWZmZWN0cy13cmFwcGVyIiApKSB7CgkJCXJldHVybiBlbGVtZW50LnBhcmVudCgpOwoJCX0KCgkJLy8gd3JhcCB0aGUgZWxlbWVudAoJCXZhciBwcm9wcyA9IHsKCQkJCXdpZHRoOiBlbGVtZW50Lm91dGVyV2lkdGgodHJ1ZSksCgkJCQloZWlnaHQ6IGVsZW1lbnQub3V0ZXJIZWlnaHQodHJ1ZSksCgkJCQkiZmxvYXQiOiBlbGVtZW50LmNzcyggImZsb2F0IiApCgkJCX0sCgkJCXdyYXBwZXIgPSAkKCAiPGRpdj48L2Rpdj4iICkKCQkJCS5hZGRDbGFzcyggInVpLWVmZmVjdHMtd3JhcHBlciIgKQoJCQkJLmNzcyh7CgkJCQkJZm9udFNpemU6ICIxMDAlIiwKCQkJCQliYWNrZ3JvdW5kOiAidHJhbnNwYXJlbnQiLAoJCQkJCWJvcmRlcjogIm5vbmUiLAoJCQkJCW1hcmdpbjogMCwKCQkJCQlwYWRkaW5nOiAwCgkJCQl9KSwKCQkJLy8gU3RvcmUgdGhlIHNpemUgaW4gY2FzZSB3aWR0aC9oZWlnaHQgYXJlIGRlZmluZWQgaW4gJSAtIEZpeGVzICM1MjQ1CgkJCXNpemUgPSB7CgkJCQl3aWR0aDogZWxlbWVudC53aWR0aCgpLAoJCQkJaGVpZ2h0OiBlbGVtZW50LmhlaWdodCgpCgkJCX0sCgkJCWFjdGl2ZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CgoJCS8vIHN1cHBvcnQ6IEZpcmVmb3gKCQkvLyBGaXJlZm94IGluY29ycmVjdGx5IGV4cG9zZXMgYW5vbnltb3VzIGNvbnRlbnQKCQkvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01NjE2NjQKCQl0cnkgewoJCQlhY3RpdmUuaWQ7CgkJfSBjYXRjaCggZSApIHsKCQkJYWN0aXZlID0gZG9jdW1lbnQuYm9keTsKCQl9CgoJCWVsZW1lbnQud3JhcCggd3JhcHBlciApOwoKCQkvLyBGaXhlcyAjNzU5NSAtIEVsZW1lbnRzIGxvc2UgZm9jdXMgd2hlbiB3cmFwcGVkLgoJCWlmICggZWxlbWVudFsgMCBdID09PSBhY3RpdmUgfHwgJC5jb250YWlucyggZWxlbWVudFsgMCBdLCBhY3RpdmUgKSApIHsKCQkJJCggYWN0aXZlICkuZm9jdXMoKTsKCQl9CgoJCXdyYXBwZXIgPSBlbGVtZW50LnBhcmVudCgpOyAvL0hvdGZpeCBmb3IgalF1ZXJ5IDEuNCBzaW5jZSBzb21lIGNoYW5nZSBpbiB3cmFwKCkgc2VlbXMgdG8gYWN0dWFsbHkgbG9zZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSB3cmFwcGVkIGVsZW1lbnQKCgkJLy8gdHJhbnNmZXIgcG9zaXRpb25pbmcgcHJvcGVydGllcyB0byB0aGUgd3JhcHBlcgoJCWlmICggZWxlbWVudC5jc3MoICJwb3NpdGlvbiIgKSA9PT0gInN0YXRpYyIgKSB7CgkJCXdyYXBwZXIuY3NzKHsgcG9zaXRpb246ICJyZWxhdGl2ZSIgfSk7CgkJCWVsZW1lbnQuY3NzKHsgcG9zaXRpb246ICJyZWxhdGl2ZSIgfSk7CgkJfSBlbHNlIHsKCQkJJC5leHRlbmQoIHByb3BzLCB7CgkJCQlwb3NpdGlvbjogZWxlbWVudC5jc3MoICJwb3NpdGlvbiIgKSwKCQkJCXpJbmRleDogZWxlbWVudC5jc3MoICJ6LWluZGV4IiApCgkJCX0pOwoJCQkkLmVhY2goWyAidG9wIiwgImxlZnQiLCAiYm90dG9tIiwgInJpZ2h0IiBdLCBmdW5jdGlvbihpLCBwb3MpIHsKCQkJCXByb3BzWyBwb3MgXSA9IGVsZW1lbnQuY3NzKCBwb3MgKTsKCQkJCWlmICggaXNOYU4oIHBhcnNlSW50KCBwcm9wc1sgcG9zIF0sIDEwICkgKSApIHsKCQkJCQlwcm9wc1sgcG9zIF0gPSAiYXV0byI7CgkJCQl9CgkJCX0pOwoJCQllbGVtZW50LmNzcyh7CgkJCQlwb3NpdGlvbjogInJlbGF0aXZlIiwKCQkJCXRvcDogMCwKCQkJCWxlZnQ6IDAsCgkJCQlyaWdodDogImF1dG8iLAoJCQkJYm90dG9tOiAiYXV0byIKCQkJfSk7CgkJfQoJCWVsZW1lbnQuY3NzKHNpemUpOwoKCQlyZXR1cm4gd3JhcHBlci5jc3MoIHByb3BzICkuc2hvdygpOwoJfSwKCglyZW1vdmVXcmFwcGVyOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl2YXIgYWN0aXZlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCgkJaWYgKCBlbGVtZW50LnBhcmVudCgpLmlzKCAiLnVpLWVmZmVjdHMtd3JhcHBlciIgKSApIHsKCQkJZWxlbWVudC5wYXJlbnQoKS5yZXBsYWNlV2l0aCggZWxlbWVudCApOwoKCQkJLy8gRml4ZXMgIzc1OTUgLSBFbGVtZW50cyBsb3NlIGZvY3VzIHdoZW4gd3JhcHBlZC4KCQkJaWYgKCBlbGVtZW50WyAwIF0gPT09IGFjdGl2ZSB8fCAkLmNvbnRhaW5zKCBlbGVtZW50WyAwIF0sIGFjdGl2ZSApICkgewoJCQkJJCggYWN0aXZlICkuZm9jdXMoKTsKCQkJfQoJCX0KCgoJCXJldHVybiBlbGVtZW50OwoJfSwKCglzZXRUcmFuc2l0aW9uOiBmdW5jdGlvbiggZWxlbWVudCwgbGlzdCwgZmFjdG9yLCB2YWx1ZSApIHsKCQl2YWx1ZSA9IHZhbHVlIHx8IHt9OwoJCSQuZWFjaCggbGlzdCwgZnVuY3Rpb24oIGksIHggKSB7CgkJCXZhciB1bml0ID0gZWxlbWVudC5jc3NVbml0KCB4ICk7CgkJCWlmICggdW5pdFsgMCBdID4gMCApIHsKCQkJCXZhbHVlWyB4IF0gPSB1bml0WyAwIF0gKiBmYWN0b3IgKyB1bml0WyAxIF07CgkJCX0KCQl9KTsKCQlyZXR1cm4gdmFsdWU7Cgl9Cn0pOwoKLy8gcmV0dXJuIGFuIGVmZmVjdCBvcHRpb25zIG9iamVjdCBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnM6CmZ1bmN0aW9uIF9ub3JtYWxpemVBcmd1bWVudHMoIGVmZmVjdCwgb3B0aW9ucywgc3BlZWQsIGNhbGxiYWNrICkgewoKCS8vIGFsbG93IHBhc3NpbmcgYWxsIG9wdGlvbnMgYXMgdGhlIGZpcnN0IHBhcmFtZXRlcgoJaWYgKCAkLmlzUGxhaW5PYmplY3QoIGVmZmVjdCApICkgewoJCW9wdGlvbnMgPSBlZmZlY3Q7CgkJZWZmZWN0ID0gZWZmZWN0LmVmZmVjdDsKCX0KCgkvLyBjb252ZXJ0IHRvIGFuIG9iamVjdAoJZWZmZWN0ID0geyBlZmZlY3Q6IGVmZmVjdCB9OwoKCS8vIGNhdGNoIChlZmZlY3QsIG51bGwsIC4uLikKCWlmICggb3B0aW9ucyA9PSBudWxsICkgewoJCW9wdGlvbnMgPSB7fTsKCX0KCgkvLyBjYXRjaCAoZWZmZWN0LCBjYWxsYmFjaykKCWlmICggJC5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CgkJY2FsbGJhY2sgPSBvcHRpb25zOwoJCXNwZWVkID0gbnVsbDsKCQlvcHRpb25zID0ge307Cgl9CgoJLy8gY2F0Y2ggKGVmZmVjdCwgc3BlZWQsID8pCglpZiAoIHR5cGVvZiBvcHRpb25zID09PSAibnVtYmVyIiB8fCAkLmZ4LnNwZWVkc1sgb3B0aW9ucyBdICkgewoJCWNhbGxiYWNrID0gc3BlZWQ7CgkJc3BlZWQgPSBvcHRpb25zOwoJCW9wdGlvbnMgPSB7fTsKCX0KCgkvLyBjYXRjaCAoZWZmZWN0LCBvcHRpb25zLCBjYWxsYmFjaykKCWlmICggJC5pc0Z1bmN0aW9uKCBzcGVlZCApICkgewoJCWNhbGxiYWNrID0gc3BlZWQ7CgkJc3BlZWQgPSBudWxsOwoJfQoKCS8vIGFkZCBvcHRpb25zIHRvIGVmZmVjdAoJaWYgKCBvcHRpb25zICkgewoJCSQuZXh0ZW5kKCBlZmZlY3QsIG9wdGlvbnMgKTsKCX0KCglzcGVlZCA9IHNwZWVkIHx8IG9wdGlvbnMuZHVyYXRpb247CgllZmZlY3QuZHVyYXRpb24gPSAkLmZ4Lm9mZiA/IDAgOgoJCXR5cGVvZiBzcGVlZCA9PT0gIm51bWJlciIgPyBzcGVlZCA6CgkJc3BlZWQgaW4gJC5meC5zcGVlZHMgPyAkLmZ4LnNwZWVkc1sgc3BlZWQgXSA6CgkJJC5meC5zcGVlZHMuX2RlZmF1bHQ7CgoJZWZmZWN0LmNvbXBsZXRlID0gY2FsbGJhY2sgfHwgb3B0aW9ucy5jb21wbGV0ZTsKCglyZXR1cm4gZWZmZWN0Owp9CgpmdW5jdGlvbiBzdGFuZGFyZEFuaW1hdGlvbk9wdGlvbiggb3B0aW9uICkgewoJLy8gVmFsaWQgc3RhbmRhcmQgc3BlZWRzIChub3RoaW5nLCBudW1iZXIsIG5hbWVkIHNwZWVkKQoJaWYgKCAhb3B0aW9uIHx8IHR5cGVvZiBvcHRpb24gPT09ICJudW1iZXIiIHx8ICQuZnguc3BlZWRzWyBvcHRpb24gXSApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvLyBJbnZhbGlkIHN0cmluZ3MgLSB0cmVhdCBhcyAibm9ybWFsIiBzcGVlZAoJaWYgKCB0eXBlb2Ygb3B0aW9uID09PSAic3RyaW5nIiAmJiAhJC5lZmZlY3RzLmVmZmVjdFsgb3B0aW9uIF0gKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLy8gQ29tcGxldGUgY2FsbGJhY2sKCWlmICggJC5pc0Z1bmN0aW9uKCBvcHRpb24gKSApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvLyBPcHRpb25zIGhhc2ggKGJ1dCBub3QgbmFtaW5nIGFuIGVmZmVjdCkKCWlmICggdHlwZW9mIG9wdGlvbiA9PT0gIm9iamVjdCIgJiYgIW9wdGlvbi5lZmZlY3QgKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLy8gRGlkbid0IG1hdGNoIGFueSBzdGFuZGFyZCBBUEkKCXJldHVybiBmYWxzZTsKfQoKJC5mbi5leHRlbmQoewoJZWZmZWN0OiBmdW5jdGlvbiggLyogZWZmZWN0LCBvcHRpb25zLCBzcGVlZCwgY2FsbGJhY2sgKi8gKSB7CgkJdmFyIGFyZ3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKCQkJbW9kZSA9IGFyZ3MubW9kZSwKCQkJcXVldWUgPSBhcmdzLnF1ZXVlLAoJCQllZmZlY3RNZXRob2QgPSAkLmVmZmVjdHMuZWZmZWN0WyBhcmdzLmVmZmVjdCBdOwoKCQlpZiAoICQuZngub2ZmIHx8ICFlZmZlY3RNZXRob2QgKSB7CgkJCS8vIGRlbGVnYXRlIHRvIHRoZSBvcmlnaW5hbCBtZXRob2QgKGUuZy4sIC5zaG93KCkpIGlmIHBvc3NpYmxlCgkJCWlmICggbW9kZSApIHsKCQkJCXJldHVybiB0aGlzWyBtb2RlIF0oIGFyZ3MuZHVyYXRpb24sIGFyZ3MuY29tcGxldGUgKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJCWlmICggYXJncy5jb21wbGV0ZSApIHsKCQkJCQkJYXJncy5jb21wbGV0ZS5jYWxsKCB0aGlzICk7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQl9CgoJCWZ1bmN0aW9uIHJ1biggbmV4dCApIHsKCQkJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJCQljb21wbGV0ZSA9IGFyZ3MuY29tcGxldGUsCgkJCQltb2RlID0gYXJncy5tb2RlOwoKCQkJZnVuY3Rpb24gZG9uZSgpIHsKCQkJCWlmICggJC5pc0Z1bmN0aW9uKCBjb21wbGV0ZSApICkgewoJCQkJCWNvbXBsZXRlLmNhbGwoIGVsZW1bMF0gKTsKCQkJCX0KCQkJCWlmICggJC5pc0Z1bmN0aW9uKCBuZXh0ICkgKSB7CgkJCQkJbmV4dCgpOwoJCQkJfQoJCQl9CgoJCQkvLyBJZiB0aGUgZWxlbWVudCBhbHJlYWR5IGhhcyB0aGUgY29ycmVjdCBmaW5hbCBzdGF0ZSwgZGVsZWdhdGUgdG8KCQkJLy8gdGhlIGNvcmUgbWV0aG9kcyBzbyB0aGUgaW50ZXJuYWwgdHJhY2tpbmcgb2YgIm9sZGRpc3BsYXkiIHdvcmtzLgoJCQlpZiAoIGVsZW0uaXMoICI6aGlkZGVuIiApID8gbW9kZSA9PT0gImhpZGUiIDogbW9kZSA9PT0gInNob3ciICkgewoJCQkJZWxlbVsgbW9kZSBdKCk7CgkJCQlkb25lKCk7CgkJCX0gZWxzZSB7CgkJCQllZmZlY3RNZXRob2QuY2FsbCggZWxlbVswXSwgYXJncywgZG9uZSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcXVldWUgPT09IGZhbHNlID8gdGhpcy5lYWNoKCBydW4gKSA6IHRoaXMucXVldWUoIHF1ZXVlIHx8ICJmeCIsIHJ1biApOwoJfSwKCglzaG93OiAoZnVuY3Rpb24oIG9yaWcgKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKCBvcHRpb24gKSB7CgkJCWlmICggc3RhbmRhcmRBbmltYXRpb25PcHRpb24oIG9wdGlvbiApICkgewoJCQkJcmV0dXJuIG9yaWcuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQl9IGVsc2UgewoJCQkJdmFyIGFyZ3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWFyZ3MubW9kZSA9ICJzaG93IjsKCQkJCXJldHVybiB0aGlzLmVmZmVjdC5jYWxsKCB0aGlzLCBhcmdzICk7CgkJCX0KCQl9OwoJfSkoICQuZm4uc2hvdyApLAoKCWhpZGU6IChmdW5jdGlvbiggb3JpZyApIHsKCQlyZXR1cm4gZnVuY3Rpb24oIG9wdGlvbiApIHsKCQkJaWYgKCBzdGFuZGFyZEFuaW1hdGlvbk9wdGlvbiggb3B0aW9uICkgKSB7CgkJCQlyZXR1cm4gb3JpZy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCX0gZWxzZSB7CgkJCQl2YXIgYXJncyA9IF9ub3JtYWxpemVBcmd1bWVudHMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJYXJncy5tb2RlID0gImhpZGUiOwoJCQkJcmV0dXJuIHRoaXMuZWZmZWN0LmNhbGwoIHRoaXMsIGFyZ3MgKTsKCQkJfQoJCX07Cgl9KSggJC5mbi5oaWRlICksCgoJdG9nZ2xlOiAoZnVuY3Rpb24oIG9yaWcgKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKCBvcHRpb24gKSB7CgkJCWlmICggc3RhbmRhcmRBbmltYXRpb25PcHRpb24oIG9wdGlvbiApIHx8IHR5cGVvZiBvcHRpb24gPT09ICJib29sZWFuIiApIHsKCQkJCXJldHVybiBvcmlnLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfSBlbHNlIHsKCQkJCXZhciBhcmdzID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQlhcmdzLm1vZGUgPSAidG9nZ2xlIjsKCQkJCXJldHVybiB0aGlzLmVmZmVjdC5jYWxsKCB0aGlzLCBhcmdzICk7CgkJCX0KCQl9OwoJfSkoICQuZm4udG9nZ2xlICksCgoJLy8gaGVscGVyIGZ1bmN0aW9ucwoJY3NzVW5pdDogZnVuY3Rpb24oa2V5KSB7CgkJdmFyIHN0eWxlID0gdGhpcy5jc3MoIGtleSApLAoJCQl2YWwgPSBbXTsKCgkJJC5lYWNoKCBbICJlbSIsICJweCIsICIlIiwgInB0IiBdLCBmdW5jdGlvbiggaSwgdW5pdCApIHsKCQkJaWYgKCBzdHlsZS5pbmRleE9mKCB1bml0ICkgPiAwICkgewoJCQkJdmFsID0gWyBwYXJzZUZsb2F0KCBzdHlsZSApLCB1bml0IF07CgkJCX0KCQl9KTsKCQlyZXR1cm4gdmFsOwoJfQp9KTsKCn0pKCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRUFTSU5HICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKKGZ1bmN0aW9uKCkgewoKLy8gYmFzZWQgb24gZWFzaW5nIGVxdWF0aW9ucyBmcm9tIFJvYmVydCBQZW5uZXIgKGh0dHA6Ly93d3cucm9iZXJ0cGVubmVyLmNvbS9lYXNpbmcpCgp2YXIgYmFzZUVhc2luZ3MgPSB7fTsKCiQuZWFjaCggWyAiUXVhZCIsICJDdWJpYyIsICJRdWFydCIsICJRdWludCIsICJFeHBvIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWJhc2VFYXNpbmdzWyBuYW1lIF0gPSBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gTWF0aC5wb3coIHAsIGkgKyAyICk7Cgl9Owp9KTsKCiQuZXh0ZW5kKCBiYXNlRWFzaW5ncywgewoJU2luZTogZnVuY3Rpb24gKCBwICkgewoJCXJldHVybiAxIC0gTWF0aC5jb3MoIHAgKiBNYXRoLlBJIC8gMiApOwoJfSwKCUNpcmM6IGZ1bmN0aW9uICggcCApIHsKCQlyZXR1cm4gMSAtIE1hdGguc3FydCggMSAtIHAgKiBwICk7Cgl9LAoJRWxhc3RpYzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIHAgPT09IDAgfHwgcCA9PT0gMSA/IHAgOgoJCQktTWF0aC5wb3coIDIsIDggKiAocCAtIDEpICkgKiBNYXRoLnNpbiggKCAocCAtIDEpICogODAgLSA3LjUgKSAqIE1hdGguUEkgLyAxNSApOwoJfSwKCUJhY2s6IGZ1bmN0aW9uKCBwICkgewoJCXJldHVybiBwICogcCAqICggMyAqIHAgLSAyICk7Cgl9LAoJQm91bmNlOiBmdW5jdGlvbiAoIHAgKSB7CgkJdmFyIHBvdzIsCgkJCWJvdW5jZSA9IDQ7CgoJCXdoaWxlICggcCA8ICggKCBwb3cyID0gTWF0aC5wb3coIDIsIC0tYm91bmNlICkgKSAtIDEgKSAvIDExICkge30KCQlyZXR1cm4gMSAvIE1hdGgucG93KCA0LCAzIC0gYm91bmNlICkgLSA3LjU2MjUgKiBNYXRoLnBvdyggKCBwb3cyICogMyAtIDIgKSAvIDIyIC0gcCwgMiApOwoJfQp9KTsKCiQuZWFjaCggYmFzZUVhc2luZ3MsIGZ1bmN0aW9uKCBuYW1lLCBlYXNlSW4gKSB7CgkkLmVhc2luZ1sgImVhc2VJbiIgKyBuYW1lIF0gPSBlYXNlSW47CgkkLmVhc2luZ1sgImVhc2VPdXQiICsgbmFtZSBdID0gZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDEgLSBlYXNlSW4oIDEgLSBwICk7Cgl9OwoJJC5lYXNpbmdbICJlYXNlSW5PdXQiICsgbmFtZSBdID0gZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIHAgPCAwLjUgPwoJCQllYXNlSW4oIHAgKiAyICkgLyAyIDoKCQkJMSAtIGVhc2VJbiggcCAqIC0yICsgMiApIC8gMjsKCX07Cn0pOwoKfSkoKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCnZhciB1aWQgPSAwLAoJaGlkZVByb3BzID0ge30sCglzaG93UHJvcHMgPSB7fTsKCmhpZGVQcm9wcy5oZWlnaHQgPSBoaWRlUHJvcHMucGFkZGluZ1RvcCA9IGhpZGVQcm9wcy5wYWRkaW5nQm90dG9tID0KCWhpZGVQcm9wcy5ib3JkZXJUb3BXaWR0aCA9IGhpZGVQcm9wcy5ib3JkZXJCb3R0b21XaWR0aCA9ICJoaWRlIjsKc2hvd1Byb3BzLmhlaWdodCA9IHNob3dQcm9wcy5wYWRkaW5nVG9wID0gc2hvd1Byb3BzLnBhZGRpbmdCb3R0b20gPQoJc2hvd1Byb3BzLmJvcmRlclRvcFdpZHRoID0gc2hvd1Byb3BzLmJvcmRlckJvdHRvbVdpZHRoID0gInNob3ciOwoKJC53aWRnZXQoICJ1aS5hY2NvcmRpb24iLCB7Cgl2ZXJzaW9uOiAiMS4xMC4zIiwKCW9wdGlvbnM6IHsKCQlhY3RpdmU6IDAsCgkJYW5pbWF0ZToge30sCgkJY29sbGFwc2libGU6IGZhbHNlLAoJCWV2ZW50OiAiY2xpY2siLAoJCWhlYWRlcjogIj4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpldmVuIiwKCQloZWlnaHRTdHlsZTogImF1dG8iLAoJCWljb25zOiB7CgkJCWFjdGl2ZUhlYWRlcjogInVpLWljb24tdHJpYW5nbGUtMS1zIiwKCQkJaGVhZGVyOiAidWktaWNvbi10cmlhbmdsZS0xLWUiCgkJfSwKCgkJLy8gY2FsbGJhY2tzCgkJYWN0aXZhdGU6IG51bGwsCgkJYmVmb3JlQWN0aXZhdGU6IG51bGwKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJdGhpcy5wcmV2U2hvdyA9IHRoaXMucHJldkhpZGUgPSAkKCk7CgkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCAidWktYWNjb3JkaW9uIHVpLXdpZGdldCB1aS1oZWxwZXItcmVzZXQiICkKCQkJLy8gQVJJQQoJCQkuYXR0ciggInJvbGUiLCAidGFibGlzdCIgKTsKCgkJLy8gZG9uJ3QgYWxsb3cgY29sbGFwc2libGU6IGZhbHNlIGFuZCBhY3RpdmU6IGZhbHNlIC8gbnVsbAoJCWlmICggIW9wdGlvbnMuY29sbGFwc2libGUgJiYgKG9wdGlvbnMuYWN0aXZlID09PSBmYWxzZSB8fCBvcHRpb25zLmFjdGl2ZSA9PSBudWxsKSApIHsKCQkJb3B0aW9ucy5hY3RpdmUgPSAwOwoJCX0KCgkJdGhpcy5fcHJvY2Vzc1BhbmVscygpOwoJCS8vIGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMKCQlpZiAoIG9wdGlvbnMuYWN0aXZlIDwgMCApIHsKCQkJb3B0aW9ucy5hY3RpdmUgKz0gdGhpcy5oZWFkZXJzLmxlbmd0aDsKCQl9CgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfZ2V0Q3JlYXRlRXZlbnREYXRhOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gewoJCQloZWFkZXI6IHRoaXMuYWN0aXZlLAoJCQlwYW5lbDogIXRoaXMuYWN0aXZlLmxlbmd0aCA/ICQoKSA6IHRoaXMuYWN0aXZlLm5leHQoKSwKCQkJY29udGVudDogIXRoaXMuYWN0aXZlLmxlbmd0aCA/ICQoKSA6IHRoaXMuYWN0aXZlLm5leHQoKQoJCX07Cgl9LAoKCV9jcmVhdGVJY29uczogZnVuY3Rpb24oKSB7CgkJdmFyIGljb25zID0gdGhpcy5vcHRpb25zLmljb25zOwoJCWlmICggaWNvbnMgKSB7CgkJCSQoICI8c3Bhbj4iICkKCQkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiB1aS1pY29uICIgKyBpY29ucy5oZWFkZXIgKQoJCQkJLnByZXBlbmRUbyggdGhpcy5oZWFkZXJzICk7CgkJCXRoaXMuYWN0aXZlLmNoaWxkcmVuKCAiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIgKQoJCQkJLnJlbW92ZUNsYXNzKCBpY29ucy5oZWFkZXIgKQoJCQkJLmFkZENsYXNzKCBpY29ucy5hY3RpdmVIZWFkZXIgKTsKCQkJdGhpcy5oZWFkZXJzLmFkZENsYXNzKCAidWktYWNjb3JkaW9uLWljb25zIiApOwoJCX0KCX0sCgoJX2Rlc3Ryb3lJY29uczogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWFkZXJzCgkJCS5yZW1vdmVDbGFzcyggInVpLWFjY29yZGlvbi1pY29ucyIgKQoJCQkuY2hpbGRyZW4oICIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIiApCgkJCQkucmVtb3ZlKCk7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl2YXIgY29udGVudHM7CgoJCS8vIGNsZWFuIHVwIG1haW4gZWxlbWVudAoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICk7CgoJCS8vIGNsZWFuIHVwIGhlYWRlcnMKCQl0aGlzLmhlYWRlcnMKCQkJLnJlbW92ZUNsYXNzKCAidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1oZWxwZXItcmVzZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIiApCgkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtc2VsZWN0ZWQiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWNvbnRyb2xzIiApCgkJCS5yZW1vdmVBdHRyKCAidGFiSW5kZXgiICkKCQkJLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlpZiAoIC9edWktYWNjb3JkaW9uLy50ZXN0KCB0aGlzLmlkICkgKSB7CgkJCQkJdGhpcy5yZW1vdmVBdHRyaWJ1dGUoICJpZCIgKTsKCQkJCX0KCQkJfSk7CgkJdGhpcy5fZGVzdHJveUljb25zKCk7CgoJCS8vIGNsZWFuIHVwIGNvbnRlbnQgcGFuZWxzCgkJY29udGVudHMgPSB0aGlzLmhlYWRlcnMubmV4dCgpCgkJCS5jc3MoICJkaXNwbGF5IiwgIiIgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWV4cGFuZGVkIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1oaWRkZW4iICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWxhYmVsbGVkYnkiICkKCQkJLnJlbW92ZUNsYXNzKCAidWktaGVscGVyLXJlc2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20gdWktYWNjb3JkaW9uLWNvbnRlbnQgdWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIiApCgkJCS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAvXnVpLWFjY29yZGlvbi8udGVzdCggdGhpcy5pZCApICkgewoJCQkJCXRoaXMucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQl9CgkJCX0pOwoJCWlmICggdGhpcy5vcHRpb25zLmhlaWdodFN0eWxlICE9PSAiY29udGVudCIgKSB7CgkJCWNvbnRlbnRzLmNzcyggImhlaWdodCIsICIiICk7CgkJfQoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQlpZiAoIGtleSA9PT0gImFjdGl2ZSIgKSB7CgkJCS8vIF9hY3RpdmF0ZSgpIHdpbGwgaGFuZGxlIGludmFsaWQgdmFsdWVzIGFuZCB1cGRhdGUgdGhpcy5vcHRpb25zCgkJCXRoaXMuX2FjdGl2YXRlKCB2YWx1ZSApOwoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGtleSA9PT0gImV2ZW50IiApIHsKCQkJaWYgKCB0aGlzLm9wdGlvbnMuZXZlbnQgKSB7CgkJCQl0aGlzLl9vZmYoIHRoaXMuaGVhZGVycywgdGhpcy5vcHRpb25zLmV2ZW50ICk7CgkJCX0KCQkJdGhpcy5fc2V0dXBFdmVudHMoIHZhbHVlICk7CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoKCQkvLyBzZXR0aW5nIGNvbGxhcHNpYmxlOiBmYWxzZSB3aGlsZSBjb2xsYXBzZWQ7IG9wZW4gZmlyc3QgcGFuZWwKCQlpZiAoIGtleSA9PT0gImNvbGxhcHNpYmxlIiAmJiAhdmFsdWUgJiYgdGhpcy5vcHRpb25zLmFjdGl2ZSA9PT0gZmFsc2UgKSB7CgkJCXRoaXMuX2FjdGl2YXRlKCAwICk7CgkJfQoKCQlpZiAoIGtleSA9PT0gImljb25zIiApIHsKCQkJdGhpcy5fZGVzdHJveUljb25zKCk7CgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLl9jcmVhdGVJY29ucygpOwoJCQl9CgkJfQoKCQkvLyAjNTMzMiAtIG9wYWNpdHkgZG9lc24ndCBjYXNjYWRlIHRvIHBvc2l0aW9uZWQgZWxlbWVudHMgaW4gSUUKCQkvLyBzbyB3ZSBuZWVkIHRvIGFkZCB0aGUgZGlzYWJsZWQgY2xhc3MgdG8gdGhlIGhlYWRlcnMgYW5kIHBhbmVscwoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLmhlYWRlcnMuYWRkKCB0aGlzLmhlYWRlcnMubmV4dCgpICkKCQkJCS50b2dnbGVDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiwgISF2YWx1ZSApOwoJCX0KCX0sCgoJX2tleWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkvKmpzaGludCBtYXhjb21wbGV4aXR5OjE1Ki8KCQlpZiAoIGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5ICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIga2V5Q29kZSA9ICQudWkua2V5Q29kZSwKCQkJbGVuZ3RoID0gdGhpcy5oZWFkZXJzLmxlbmd0aCwKCQkJY3VycmVudEluZGV4ID0gdGhpcy5oZWFkZXJzLmluZGV4KCBldmVudC50YXJnZXQgKSwKCQkJdG9Gb2N1cyA9IGZhbHNlOwoKCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgewoJCQljYXNlIGtleUNvZGUuUklHSFQ6CgkJCWNhc2Uga2V5Q29kZS5ET1dOOgoJCQkJdG9Gb2N1cyA9IHRoaXMuaGVhZGVyc1sgKCBjdXJyZW50SW5kZXggKyAxICkgJSBsZW5ndGggXTsKCQkJCWJyZWFrOwoJCQljYXNlIGtleUNvZGUuTEVGVDoKCQkJY2FzZSBrZXlDb2RlLlVQOgoJCQkJdG9Gb2N1cyA9IHRoaXMuaGVhZGVyc1sgKCBjdXJyZW50SW5kZXggLSAxICsgbGVuZ3RoICkgJSBsZW5ndGggXTsKCQkJCWJyZWFrOwoJCQljYXNlIGtleUNvZGUuU1BBQ0U6CgkJCWNhc2Uga2V5Q29kZS5FTlRFUjoKCQkJCXRoaXMuX2V2ZW50SGFuZGxlciggZXZlbnQgKTsKCQkJCWJyZWFrOwoJCQljYXNlIGtleUNvZGUuSE9NRToKCQkJCXRvRm9jdXMgPSB0aGlzLmhlYWRlcnNbIDAgXTsKCQkJCWJyZWFrOwoJCQljYXNlIGtleUNvZGUuRU5EOgoJCQkJdG9Gb2N1cyA9IHRoaXMuaGVhZGVyc1sgbGVuZ3RoIC0gMSBdOwoJCQkJYnJlYWs7CgkJfQoKCQlpZiAoIHRvRm9jdXMgKSB7CgkJCSQoIGV2ZW50LnRhcmdldCApLmF0dHIoICJ0YWJJbmRleCIsIC0xICk7CgkJCSQoIHRvRm9jdXMgKS5hdHRyKCAidGFiSW5kZXgiLCAwICk7CgkJCXRvRm9jdXMuZm9jdXMoKTsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9LAoKCV9wYW5lbEtleURvd24gOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuVVAgJiYgZXZlbnQuY3RybEtleSApIHsKCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnByZXYoKS5mb2N1cygpOwoJCX0KCX0sCgoJcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJdGhpcy5fcHJvY2Vzc1BhbmVscygpOwoKCQkvLyB3YXMgY29sbGFwc2VkIG9yIG5vIHBhbmVsCgkJaWYgKCAoIG9wdGlvbnMuYWN0aXZlID09PSBmYWxzZSAmJiBvcHRpb25zLmNvbGxhcHNpYmxlID09PSB0cnVlICkgfHwgIXRoaXMuaGVhZGVycy5sZW5ndGggKSB7CgkJCW9wdGlvbnMuYWN0aXZlID0gZmFsc2U7CgkJCXRoaXMuYWN0aXZlID0gJCgpOwoJCS8vIGFjdGl2ZSBmYWxzZSBvbmx5IHdoZW4gY29sbGFwc2libGUgaXMgdHJ1ZQoJCX0gZWxzZSBpZiAoIG9wdGlvbnMuYWN0aXZlID09PSBmYWxzZSApIHsKCQkJdGhpcy5fYWN0aXZhdGUoIDAgKTsKCQkvLyB3YXMgYWN0aXZlLCBidXQgYWN0aXZlIHBhbmVsIGlzIGdvbmUKCQl9IGVsc2UgaWYgKCB0aGlzLmFjdGl2ZS5sZW5ndGggJiYgISQuY29udGFpbnMoIHRoaXMuZWxlbWVudFsgMCBdLCB0aGlzLmFjdGl2ZVsgMCBdICkgKSB7CgkJCS8vIGFsbCByZW1haW5pbmcgcGFuZWwgYXJlIGRpc2FibGVkCgkJCWlmICggdGhpcy5oZWFkZXJzLmxlbmd0aCA9PT0gdGhpcy5oZWFkZXJzLmZpbmQoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLmxlbmd0aCApIHsKCQkJCW9wdGlvbnMuYWN0aXZlID0gZmFsc2U7CgkJCQl0aGlzLmFjdGl2ZSA9ICQoKTsKCQkJLy8gYWN0aXZhdGUgcHJldmlvdXMgcGFuZWwKCQkJfSBlbHNlIHsKCQkJCXRoaXMuX2FjdGl2YXRlKCBNYXRoLm1heCggMCwgb3B0aW9ucy5hY3RpdmUgLSAxICkgKTsKCQkJfQoJCS8vIHdhcyBhY3RpdmUsIGFjdGl2ZSBwYW5lbCBzdGlsbCBleGlzdHMKCQl9IGVsc2UgewoJCQkvLyBtYWtlIHN1cmUgYWN0aXZlIGluZGV4IGlzIGNvcnJlY3QKCQkJb3B0aW9ucy5hY3RpdmUgPSB0aGlzLmhlYWRlcnMuaW5kZXgoIHRoaXMuYWN0aXZlICk7CgkJfQoKCQl0aGlzLl9kZXN0cm95SWNvbnMoKTsKCgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfcHJvY2Vzc1BhbmVsczogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWFkZXJzID0gdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMub3B0aW9ucy5oZWFkZXIgKQoJCQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWhlbHBlci1yZXNldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiICk7CgoJCXRoaXMuaGVhZGVycy5uZXh0KCkKCQkJLmFkZENsYXNzKCAidWktYWNjb3JkaW9uLWNvbnRlbnQgdWktaGVscGVyLXJlc2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iICkKCQkJLmZpbHRlcigiOm5vdCgudWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlKSIpCgkJCS5oaWRlKCk7Cgl9LAoKCV9yZWZyZXNoOiBmdW5jdGlvbigpIHsKCQl2YXIgbWF4SGVpZ2h0LAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQloZWlnaHRTdHlsZSA9IG9wdGlvbnMuaGVpZ2h0U3R5bGUsCgkJCXBhcmVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnQoKSwKCQkJYWNjb3JkaW9uSWQgPSB0aGlzLmFjY29yZGlvbklkID0gInVpLWFjY29yZGlvbi0iICsKCQkJCSh0aGlzLmVsZW1lbnQuYXR0ciggImlkIiApIHx8ICsrdWlkKTsKCgkJdGhpcy5hY3RpdmUgPSB0aGlzLl9maW5kQWN0aXZlKCBvcHRpb25zLmFjdGl2ZSApCgkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIiApCgkJCS5yZW1vdmVDbGFzcyggInVpLWNvcm5lci1hbGwiICk7CgkJdGhpcy5hY3RpdmUubmV4dCgpCgkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIgKQoJCQkuc2hvdygpOwoKCQl0aGlzLmhlYWRlcnMKCQkJLmF0dHIoICJyb2xlIiwgInRhYiIgKQoJCQkuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJCXZhciBoZWFkZXIgPSAkKCB0aGlzICksCgkJCQkJaGVhZGVySWQgPSBoZWFkZXIuYXR0ciggImlkIiApLAoJCQkJCXBhbmVsID0gaGVhZGVyLm5leHQoKSwKCQkJCQlwYW5lbElkID0gcGFuZWwuYXR0ciggImlkIiApOwoJCQkJaWYgKCAhaGVhZGVySWQgKSB7CgkJCQkJaGVhZGVySWQgPSBhY2NvcmRpb25JZCArICItaGVhZGVyLSIgKyBpOwoJCQkJCWhlYWRlci5hdHRyKCAiaWQiLCBoZWFkZXJJZCApOwoJCQkJfQoJCQkJaWYgKCAhcGFuZWxJZCApIHsKCQkJCQlwYW5lbElkID0gYWNjb3JkaW9uSWQgKyAiLXBhbmVsLSIgKyBpOwoJCQkJCXBhbmVsLmF0dHIoICJpZCIsIHBhbmVsSWQgKTsKCQkJCX0KCQkJCWhlYWRlci5hdHRyKCAiYXJpYS1jb250cm9scyIsIHBhbmVsSWQgKTsKCQkJCXBhbmVsLmF0dHIoICJhcmlhLWxhYmVsbGVkYnkiLCBoZWFkZXJJZCApOwoJCQl9KQoJCQkubmV4dCgpCgkJCQkuYXR0ciggInJvbGUiLCAidGFicGFuZWwiICk7CgoJCXRoaXMuaGVhZGVycwoJCQkubm90KCB0aGlzLmFjdGl2ZSApCgkJCS5hdHRyKHsKCQkJCSJhcmlhLXNlbGVjdGVkIjogImZhbHNlIiwKCQkJCXRhYkluZGV4OiAtMQoJCQl9KQoJCQkubmV4dCgpCgkJCQkuYXR0cih7CgkJCQkJImFyaWEtZXhwYW5kZWQiOiAiZmFsc2UiLAoJCQkJCSJhcmlhLWhpZGRlbiI6ICJ0cnVlIgoJCQkJfSkKCQkJCS5oaWRlKCk7CgoJCS8vIG1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgaGVhZGVyIGlzIGluIHRoZSB0YWIgb3JkZXIKCQlpZiAoICF0aGlzLmFjdGl2ZS5sZW5ndGggKSB7CgkJCXRoaXMuaGVhZGVycy5lcSggMCApLmF0dHIoICJ0YWJJbmRleCIsIDAgKTsKCQl9IGVsc2UgewoJCQl0aGlzLmFjdGl2ZS5hdHRyKHsKCQkJCSJhcmlhLXNlbGVjdGVkIjogInRydWUiLAoJCQkJdGFiSW5kZXg6IDAKCQkJfSkKCQkJLm5leHQoKQoJCQkJLmF0dHIoewoJCQkJCSJhcmlhLWV4cGFuZGVkIjogInRydWUiLAoJCQkJCSJhcmlhLWhpZGRlbiI6ICJmYWxzZSIKCQkJCX0pOwoJCX0KCgkJdGhpcy5fY3JlYXRlSWNvbnMoKTsKCgkJdGhpcy5fc2V0dXBFdmVudHMoIG9wdGlvbnMuZXZlbnQgKTsKCgkJaWYgKCBoZWlnaHRTdHlsZSA9PT0gImZpbGwiICkgewoJCQltYXhIZWlnaHQgPSBwYXJlbnQuaGVpZ2h0KCk7CgkJCXRoaXMuZWxlbWVudC5zaWJsaW5ncyggIjp2aXNpYmxlIiApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9ICQoIHRoaXMgKSwKCQkJCQlwb3NpdGlvbiA9IGVsZW0uY3NzKCAicG9zaXRpb24iICk7CgoJCQkJaWYgKCBwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQltYXhIZWlnaHQgLT0gZWxlbS5vdXRlckhlaWdodCggdHJ1ZSApOwoJCQl9KTsKCgkJCXRoaXMuaGVhZGVycy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJbWF4SGVpZ2h0IC09ICQoIHRoaXMgKS5vdXRlckhlaWdodCggdHJ1ZSApOwoJCQl9KTsKCgkJCXRoaXMuaGVhZGVycy5uZXh0KCkKCQkJCS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCSQoIHRoaXMgKS5oZWlnaHQoIE1hdGgubWF4KCAwLCBtYXhIZWlnaHQgLQoJCQkJCQkkKCB0aGlzICkuaW5uZXJIZWlnaHQoKSArICQoIHRoaXMgKS5oZWlnaHQoKSApICk7CgkJCQl9KQoJCQkJLmNzcyggIm92ZXJmbG93IiwgImF1dG8iICk7CgkJfSBlbHNlIGlmICggaGVpZ2h0U3R5bGUgPT09ICJhdXRvIiApIHsKCQkJbWF4SGVpZ2h0ID0gMDsKCQkJdGhpcy5oZWFkZXJzLm5leHQoKQoJCQkJLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJbWF4SGVpZ2h0ID0gTWF0aC5tYXgoIG1heEhlaWdodCwgJCggdGhpcyApLmNzcyggImhlaWdodCIsICIiICkuaGVpZ2h0KCkgKTsKCQkJCX0pCgkJCQkuaGVpZ2h0KCBtYXhIZWlnaHQgKTsKCQl9Cgl9LAoKCV9hY3RpdmF0ZTogZnVuY3Rpb24oIGluZGV4ICkgewoJCXZhciBhY3RpdmUgPSB0aGlzLl9maW5kQWN0aXZlKCBpbmRleCApWyAwIF07CgoJCS8vIHRyeWluZyB0byBhY3RpdmF0ZSB0aGUgYWxyZWFkeSBhY3RpdmUgcGFuZWwKCQlpZiAoIGFjdGl2ZSA9PT0gdGhpcy5hY3RpdmVbIDAgXSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gdHJ5aW5nIHRvIGNvbGxhcHNlLCBzaW11bGF0ZSBhIGNsaWNrIG9uIHRoZSBjdXJyZW50bHkgYWN0aXZlIGhlYWRlcgoJCWFjdGl2ZSA9IGFjdGl2ZSB8fCB0aGlzLmFjdGl2ZVsgMCBdOwoKCQl0aGlzLl9ldmVudEhhbmRsZXIoewoJCQl0YXJnZXQ6IGFjdGl2ZSwKCQkJY3VycmVudFRhcmdldDogYWN0aXZlLAoJCQlwcmV2ZW50RGVmYXVsdDogJC5ub29wCgkJfSk7Cgl9LAoKCV9maW5kQWN0aXZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gIm51bWJlciIgPyB0aGlzLmhlYWRlcnMuZXEoIHNlbGVjdG9yICkgOiAkKCk7Cgl9LAoKCV9zZXR1cEV2ZW50czogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBldmVudHMgPSB7CgkJCWtleWRvd246ICJfa2V5ZG93biIKCQl9OwoJCWlmICggZXZlbnQgKSB7CgkJCSQuZWFjaCggZXZlbnQuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGluZGV4LCBldmVudE5hbWUgKSB7CgkJCQlldmVudHNbIGV2ZW50TmFtZSBdID0gIl9ldmVudEhhbmRsZXIiOwoJCQl9KTsKCQl9CgoJCXRoaXMuX29mZiggdGhpcy5oZWFkZXJzLmFkZCggdGhpcy5oZWFkZXJzLm5leHQoKSApICk7CgkJdGhpcy5fb24oIHRoaXMuaGVhZGVycywgZXZlbnRzICk7CgkJdGhpcy5fb24oIHRoaXMuaGVhZGVycy5uZXh0KCksIHsga2V5ZG93bjogIl9wYW5lbEtleURvd24iIH0pOwoJCXRoaXMuX2hvdmVyYWJsZSggdGhpcy5oZWFkZXJzICk7CgkJdGhpcy5fZm9jdXNhYmxlKCB0aGlzLmhlYWRlcnMgKTsKCX0sCgoJX2V2ZW50SGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlhY3RpdmUgPSB0aGlzLmFjdGl2ZSwKCQkJY2xpY2tlZCA9ICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwKCQkJY2xpY2tlZElzQWN0aXZlID0gY2xpY2tlZFsgMCBdID09PSBhY3RpdmVbIDAgXSwKCQkJY29sbGFwc2luZyA9IGNsaWNrZWRJc0FjdGl2ZSAmJiBvcHRpb25zLmNvbGxhcHNpYmxlLAoJCQl0b1Nob3cgPSBjb2xsYXBzaW5nID8gJCgpIDogY2xpY2tlZC5uZXh0KCksCgkJCXRvSGlkZSA9IGFjdGl2ZS5uZXh0KCksCgkJCWV2ZW50RGF0YSA9IHsKCQkJCW9sZEhlYWRlcjogYWN0aXZlLAoJCQkJb2xkUGFuZWw6IHRvSGlkZSwKCQkJCW5ld0hlYWRlcjogY29sbGFwc2luZyA/ICQoKSA6IGNsaWNrZWQsCgkJCQluZXdQYW5lbDogdG9TaG93CgkJCX07CgoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCWlmICgKCQkJCS8vIGNsaWNrIG9uIGFjdGl2ZSBoZWFkZXIsIGJ1dCBub3QgY29sbGFwc2libGUKCQkJCSggY2xpY2tlZElzQWN0aXZlICYmICFvcHRpb25zLmNvbGxhcHNpYmxlICkgfHwKCQkJCS8vIGFsbG93IGNhbmNlbGluZyBhY3RpdmF0aW9uCgkJCQkoIHRoaXMuX3RyaWdnZXIoICJiZWZvcmVBY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKSA9PT0gZmFsc2UgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJb3B0aW9ucy5hY3RpdmUgPSBjb2xsYXBzaW5nID8gZmFsc2UgOiB0aGlzLmhlYWRlcnMuaW5kZXgoIGNsaWNrZWQgKTsKCgkJLy8gd2hlbiB0aGUgY2FsbCB0byAuX3RvZ2dsZSgpIGNvbWVzIGFmdGVyIHRoZSBjbGFzcyBjaGFuZ2VzCgkJLy8gaXQgY2F1c2VzIGEgdmVyeSBvZGQgYnVnIGluIElFIDggKHNlZSAjNjcyMCkKCQl0aGlzLmFjdGl2ZSA9IGNsaWNrZWRJc0FjdGl2ZSA/ICQoKSA6IGNsaWNrZWQ7CgkJdGhpcy5fdG9nZ2xlKCBldmVudERhdGEgKTsKCgkJLy8gc3dpdGNoIGNsYXNzZXMKCQkvLyBjb3JuZXIgY2xhc3NlcyBvbiB0aGUgcHJldmlvdXNseSBhY3RpdmUgaGVhZGVyIHN0YXkgYWZ0ZXIgdGhlIGFuaW1hdGlvbgoJCWFjdGl2ZS5yZW1vdmVDbGFzcyggInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIgKTsKCQlpZiAoIG9wdGlvbnMuaWNvbnMgKSB7CgkJCWFjdGl2ZS5jaGlsZHJlbiggIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iICkKCQkJCS5yZW1vdmVDbGFzcyggb3B0aW9ucy5pY29ucy5hY3RpdmVIZWFkZXIgKQoJCQkJLmFkZENsYXNzKCBvcHRpb25zLmljb25zLmhlYWRlciApOwoJCX0KCgkJaWYgKCAhY2xpY2tlZElzQWN0aXZlICkgewoJCQljbGlja2VkCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApCgkJCQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIgKTsKCQkJaWYgKCBvcHRpb25zLmljb25zICkgewoJCQkJY2xpY2tlZC5jaGlsZHJlbiggIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iICkKCQkJCQkucmVtb3ZlQ2xhc3MoIG9wdGlvbnMuaWNvbnMuaGVhZGVyICkKCQkJCQkuYWRkQ2xhc3MoIG9wdGlvbnMuaWNvbnMuYWN0aXZlSGVhZGVyICk7CgkJCX0KCgkJCWNsaWNrZWQKCQkJCS5uZXh0KCkKCQkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIgKTsKCQl9Cgl9LAoKCV90b2dnbGU6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB0b1Nob3cgPSBkYXRhLm5ld1BhbmVsLAoJCQl0b0hpZGUgPSB0aGlzLnByZXZTaG93Lmxlbmd0aCA/IHRoaXMucHJldlNob3cgOiBkYXRhLm9sZFBhbmVsOwoKCQkvLyBoYW5kbGUgYWN0aXZhdGluZyBhIHBhbmVsIGR1cmluZyB0aGUgYW5pbWF0aW9uIGZvciBhbm90aGVyIGFjdGl2YXRpb24KCQl0aGlzLnByZXZTaG93LmFkZCggdGhpcy5wcmV2SGlkZSApLnN0b3AoIHRydWUsIHRydWUgKTsKCQl0aGlzLnByZXZTaG93ID0gdG9TaG93OwoJCXRoaXMucHJldkhpZGUgPSB0b0hpZGU7CgoJCWlmICggdGhpcy5vcHRpb25zLmFuaW1hdGUgKSB7CgkJCXRoaXMuX2FuaW1hdGUoIHRvU2hvdywgdG9IaWRlLCBkYXRhICk7CgkJfSBlbHNlIHsKCQkJdG9IaWRlLmhpZGUoKTsKCQkJdG9TaG93LnNob3coKTsKCQkJdGhpcy5fdG9nZ2xlQ29tcGxldGUoIGRhdGEgKTsKCQl9CgoJCXRvSGlkZS5hdHRyKHsKCQkJImFyaWEtZXhwYW5kZWQiOiAiZmFsc2UiLAoJCQkiYXJpYS1oaWRkZW4iOiAidHJ1ZSIKCQl9KTsKCQl0b0hpZGUucHJldigpLmF0dHIoICJhcmlhLXNlbGVjdGVkIiwgImZhbHNlIiApOwoJCS8vIGlmIHdlJ3JlIHN3aXRjaGluZyBwYW5lbHMsIHJlbW92ZSB0aGUgb2xkIGhlYWRlciBmcm9tIHRoZSB0YWIgb3JkZXIKCQkvLyBpZiB3ZSdyZSBvcGVuaW5nIGZyb20gY29sbGFwc2VkIHN0YXRlLCByZW1vdmUgdGhlIHByZXZpb3VzIGhlYWRlciBmcm9tIHRoZSB0YWIgb3JkZXIKCQkvLyBpZiB3ZSdyZSBjb2xsYXBzaW5nLCB0aGVuIGtlZXAgdGhlIGNvbGxhcHNpbmcgaGVhZGVyIGluIHRoZSB0YWIgb3JkZXIKCQlpZiAoIHRvU2hvdy5sZW5ndGggJiYgdG9IaWRlLmxlbmd0aCApIHsKCQkJdG9IaWRlLnByZXYoKS5hdHRyKCAidGFiSW5kZXgiLCAtMSApOwoJCX0gZWxzZSBpZiAoIHRvU2hvdy5sZW5ndGggKSB7CgkJCXRoaXMuaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gJCggdGhpcyApLmF0dHIoICJ0YWJJbmRleCIgKSA9PT0gMDsKCQkJfSkKCQkJLmF0dHIoICJ0YWJJbmRleCIsIC0xICk7CgkJfQoKCQl0b1Nob3cKCQkJLmF0dHIoewoJCQkJImFyaWEtZXhwYW5kZWQiOiAidHJ1ZSIsCgkJCQkiYXJpYS1oaWRkZW4iOiAiZmFsc2UiCgkJCX0pCgkJCS5wcmV2KCkKCQkJCS5hdHRyKHsKCQkJCQkiYXJpYS1zZWxlY3RlZCI6ICJ0cnVlIiwKCQkJCQl0YWJJbmRleDogMAoJCQkJfSk7Cgl9LAoKCV9hbmltYXRlOiBmdW5jdGlvbiggdG9TaG93LCB0b0hpZGUsIGRhdGEgKSB7CgkJdmFyIHRvdGFsLCBlYXNpbmcsIGR1cmF0aW9uLAoJCQl0aGF0ID0gdGhpcywKCQkJYWRqdXN0ID0gMCwKCQkJZG93biA9IHRvU2hvdy5sZW5ndGggJiYKCQkJCSggIXRvSGlkZS5sZW5ndGggfHwgKCB0b1Nob3cuaW5kZXgoKSA8IHRvSGlkZS5pbmRleCgpICkgKSwKCQkJYW5pbWF0ZSA9IHRoaXMub3B0aW9ucy5hbmltYXRlIHx8IHt9LAoJCQlvcHRpb25zID0gZG93biAmJiBhbmltYXRlLmRvd24gfHwgYW5pbWF0ZSwKCQkJY29tcGxldGUgPSBmdW5jdGlvbigpIHsKCQkJCXRoYXQuX3RvZ2dsZUNvbXBsZXRlKCBkYXRhICk7CgkJCX07CgoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlkdXJhdGlvbiA9IG9wdGlvbnM7CgkJfQoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciICkgewoJCQllYXNpbmcgPSBvcHRpb25zOwoJCX0KCQkvLyBmYWxsIGJhY2sgZnJvbSBvcHRpb25zIHRvIGFuaW1hdGlvbiBpbiBjYXNlIG9mIHBhcnRpYWwgZG93biBzZXR0aW5ncwoJCWVhc2luZyA9IGVhc2luZyB8fCBvcHRpb25zLmVhc2luZyB8fCBhbmltYXRlLmVhc2luZzsKCQlkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IG9wdGlvbnMuZHVyYXRpb24gfHwgYW5pbWF0ZS5kdXJhdGlvbjsKCgkJaWYgKCAhdG9IaWRlLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRvU2hvdy5hbmltYXRlKCBzaG93UHJvcHMsIGR1cmF0aW9uLCBlYXNpbmcsIGNvbXBsZXRlICk7CgkJfQoJCWlmICggIXRvU2hvdy5sZW5ndGggKSB7CgkJCXJldHVybiB0b0hpZGUuYW5pbWF0ZSggaGlkZVByb3BzLCBkdXJhdGlvbiwgZWFzaW5nLCBjb21wbGV0ZSApOwoJCX0KCgkJdG90YWwgPSB0b1Nob3cuc2hvdygpLm91dGVySGVpZ2h0KCk7CgkJdG9IaWRlLmFuaW1hdGUoIGhpZGVQcm9wcywgewoJCQlkdXJhdGlvbjogZHVyYXRpb24sCgkJCWVhc2luZzogZWFzaW5nLAoJCQlzdGVwOiBmdW5jdGlvbiggbm93LCBmeCApIHsKCQkJCWZ4Lm5vdyA9IE1hdGgucm91bmQoIG5vdyApOwoJCQl9CgkJfSk7CgkJdG9TaG93CgkJCS5oaWRlKCkKCQkJLmFuaW1hdGUoIHNob3dQcm9wcywgewoJCQkJZHVyYXRpb246IGR1cmF0aW9uLAoJCQkJZWFzaW5nOiBlYXNpbmcsCgkJCQljb21wbGV0ZTogY29tcGxldGUsCgkJCQlzdGVwOiBmdW5jdGlvbiggbm93LCBmeCApIHsKCQkJCQlmeC5ub3cgPSBNYXRoLnJvdW5kKCBub3cgKTsKCQkJCQlpZiAoIGZ4LnByb3AgIT09ICJoZWlnaHQiICkgewoJCQkJCQlhZGp1c3QgKz0gZngubm93OwoJCQkJCX0gZWxzZSBpZiAoIHRoYXQub3B0aW9ucy5oZWlnaHRTdHlsZSAhPT0gImNvbnRlbnQiICkgewoJCQkJCQlmeC5ub3cgPSBNYXRoLnJvdW5kKCB0b3RhbCAtIHRvSGlkZS5vdXRlckhlaWdodCgpIC0gYWRqdXN0ICk7CgkJCQkJCWFkanVzdCA9IDA7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCX0sCgoJX3RvZ2dsZUNvbXBsZXRlOiBmdW5jdGlvbiggZGF0YSApIHsKCQl2YXIgdG9IaWRlID0gZGF0YS5vbGRQYW5lbDsKCgkJdG9IaWRlCgkJCS5yZW1vdmVDbGFzcyggInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIgKQoJCQkucHJldigpCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItdG9wIiApCgkJCQkuYWRkQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApOwoKCQkvLyBXb3JrIGFyb3VuZCBmb3IgcmVuZGVyaW5nIGJ1ZyBpbiBJRSAoIzU0MjEpCgkJaWYgKCB0b0hpZGUubGVuZ3RoICkgewoJCQl0b0hpZGUucGFyZW50KClbMF0uY2xhc3NOYW1lID0gdG9IaWRlLnBhcmVudCgpWzBdLmNsYXNzTmFtZTsKCQl9CgoJCXRoaXMuX3RyaWdnZXIoICJhY3RpdmF0ZSIsIG51bGwsIGRhdGEgKTsKCX0KfSk7Cgp9KSggalF1ZXJ5ICk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCi8vIHVzZWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCByZW1vdGUgZGF0YSBzb3VyY2VzCnZhciByZXF1ZXN0SW5kZXggPSAwOwoKJC53aWRnZXQoICJ1aS5hdXRvY29tcGxldGUiLCB7Cgl2ZXJzaW9uOiAiMS4xMC4zIiwKCWRlZmF1bHRFbGVtZW50OiAiPGlucHV0PiIsCglvcHRpb25zOiB7CgkJYXBwZW5kVG86IG51bGwsCgkJYXV0b0ZvY3VzOiBmYWxzZSwKCQlkZWxheTogMzAwLAoJCW1pbkxlbmd0aDogMSwKCQlwb3NpdGlvbjogewoJCQlteTogImxlZnQgdG9wIiwKCQkJYXQ6ICJsZWZ0IGJvdHRvbSIsCgkJCWNvbGxpc2lvbjogIm5vbmUiCgkJfSwKCQlzb3VyY2U6IG51bGwsCgoJCS8vIGNhbGxiYWNrcwoJCWNoYW5nZTogbnVsbCwKCQljbG9zZTogbnVsbCwKCQlmb2N1czogbnVsbCwKCQlvcGVuOiBudWxsLAoJCXJlc3BvbnNlOiBudWxsLAoJCXNlYXJjaDogbnVsbCwKCQlzZWxlY3Q6IG51bGwKCX0sCgoJcGVuZGluZzogMCwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQkvLyBTb21lIGJyb3dzZXJzIG9ubHkgcmVwZWF0IGtleWRvd24gZXZlbnRzLCBub3Qga2V5cHJlc3MgZXZlbnRzLAoJCS8vIHNvIHdlIHVzZSB0aGUgc3VwcHJlc3NLZXlQcmVzcyBmbGFnIHRvIGRldGVybWluZSBpZiB3ZSd2ZSBhbHJlYWR5CgkJLy8gaGFuZGxlZCB0aGUga2V5ZG93biBldmVudC4gIzcyNjkKCQkvLyBVbmZvcnR1bmF0ZWx5IHRoZSBjb2RlIGZvciAmIGluIGtleXByZXNzIGlzIHRoZSBzYW1lIGFzIHRoZSB1cCBhcnJvdywKCQkvLyBzbyB3ZSB1c2UgdGhlIHN1cHByZXNzS2V5UHJlc3NSZXBlYXQgZmxhZyB0byBhdm9pZCBoYW5kbGluZyBrZXlwcmVzcwoJCS8vIGV2ZW50cyB3aGVuIHdlIGtub3cgdGhlIGtleWRvd24gZXZlbnQgd2FzIHVzZWQgdG8gbW9kaWZ5IHRoZQoJCS8vIHNlYXJjaCB0ZXJtLiAjNzc5OQoJCXZhciBzdXBwcmVzc0tleVByZXNzLCBzdXBwcmVzc0tleVByZXNzUmVwZWF0LCBzdXBwcmVzc0lucHV0LAoJCQlub2RlTmFtZSA9IHRoaXMuZWxlbWVudFswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAoJCQlpc1RleHRhcmVhID0gbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIsCgkJCWlzSW5wdXQgPSBub2RlTmFtZSA9PT0gImlucHV0IjsKCgkJdGhpcy5pc011bHRpTGluZSA9CgkJCS8vIFRleHRhcmVhcyBhcmUgYWx3YXlzIG11bHRpLWxpbmUKCQkJaXNUZXh0YXJlYSA/IHRydWUgOgoJCQkvLyBJbnB1dHMgYXJlIGFsd2F5cyBzaW5nbGUtbGluZSwgZXZlbiBpZiBpbnNpZGUgYSBjb250ZW50RWRpdGFibGUgZWxlbWVudAoJCQkvLyBJRSBhbHNvIHRyZWF0cyBpbnB1dHMgYXMgY29udGVudEVkaXRhYmxlCgkJCWlzSW5wdXQgPyBmYWxzZSA6CgkJCS8vIEFsbCBvdGhlciBlbGVtZW50IHR5cGVzIGFyZSBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIgb3Igbm90IHRoZXkncmUgY29udGVudEVkaXRhYmxlCgkJCXRoaXMuZWxlbWVudC5wcm9wKCAiaXNDb250ZW50RWRpdGFibGUiICk7CgoJCXRoaXMudmFsdWVNZXRob2QgPSB0aGlzLmVsZW1lbnRbIGlzVGV4dGFyZWEgfHwgaXNJbnB1dCA/ICJ2YWwiIDogInRleHQiIF07CgkJdGhpcy5pc05ld01lbnUgPSB0cnVlOwoKCQl0aGlzLmVsZW1lbnQKCQkJLmFkZENsYXNzKCAidWktYXV0b2NvbXBsZXRlLWlucHV0IiApCgkJCS5hdHRyKCAiYXV0b2NvbXBsZXRlIiwgIm9mZiIgKTsKCgkJdGhpcy5fb24oIHRoaXMuZWxlbWVudCwgewoJCQlrZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkvKmpzaGludCBtYXhjb21wbGV4aXR5OjE1Ki8KCQkJCWlmICggdGhpcy5lbGVtZW50LnByb3AoICJyZWFkT25seSIgKSApIHsKCQkJCQlzdXBwcmVzc0tleVByZXNzID0gdHJ1ZTsKCQkJCQlzdXBwcmVzc0lucHV0ID0gdHJ1ZTsKCQkJCQlzdXBwcmVzc0tleVByZXNzUmVwZWF0ID0gdHJ1ZTsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IGZhbHNlOwoJCQkJc3VwcHJlc3NJbnB1dCA9IGZhbHNlOwoJCQkJc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCA9IGZhbHNlOwoJCQkJdmFyIGtleUNvZGUgPSAkLnVpLmtleUNvZGU7CgkJCQlzd2l0Y2goIGV2ZW50LmtleUNvZGUgKSB7CgkJCQljYXNlIGtleUNvZGUuUEFHRV9VUDoKCQkJCQlzdXBwcmVzc0tleVByZXNzID0gdHJ1ZTsKCQkJCQl0aGlzLl9tb3ZlKCAicHJldmlvdXNQYWdlIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5QQUdFX0RPV046CgkJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IHRydWU7CgkJCQkJdGhpcy5fbW92ZSggIm5leHRQYWdlIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5VUDoKCQkJCQlzdXBwcmVzc0tleVByZXNzID0gdHJ1ZTsKCQkJCQl0aGlzLl9rZXlFdmVudCggInByZXZpb3VzIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5ET1dOOgoJCQkJCXN1cHByZXNzS2V5UHJlc3MgPSB0cnVlOwoJCQkJCXRoaXMuX2tleUV2ZW50KCAibmV4dCIsIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIGtleUNvZGUuRU5URVI6CgkJCQljYXNlIGtleUNvZGUuTlVNUEFEX0VOVEVSOgoJCQkJCS8vIHdoZW4gbWVudSBpcyBvcGVuIGFuZCBoYXMgZm9jdXMKCQkJCQlpZiAoIHRoaXMubWVudS5hY3RpdmUgKSB7CgkJCQkJCS8vICM2MDU1IC0gT3BlcmEgc3RpbGwgYWxsb3dzIHRoZSBrZXlwcmVzcyB0byBvY2N1cgoJCQkJCQkvLyB3aGljaCBjYXVzZXMgZm9ybXMgdG8gc3VibWl0CgkJCQkJCXN1cHByZXNzS2V5UHJlc3MgPSB0cnVlOwoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCQl0aGlzLm1lbnUuc2VsZWN0KCBldmVudCApOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5UQUI6CgkJCQkJaWYgKCB0aGlzLm1lbnUuYWN0aXZlICkgewoJCQkJCQl0aGlzLm1lbnUuc2VsZWN0KCBldmVudCApOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5FU0NBUEU6CgkJCQkJaWYgKCB0aGlzLm1lbnUuZWxlbWVudC5pcyggIjp2aXNpYmxlIiApICkgewoJCQkJCQl0aGlzLl92YWx1ZSggdGhpcy50ZXJtICk7CgkJCQkJCXRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJCQkJCS8vIERpZmZlcmVudCBicm93c2VycyBoYXZlIGRpZmZlcmVudCBkZWZhdWx0IGJlaGF2aW9yIGZvciBlc2NhcGUKCQkJCQkJLy8gU2luZ2xlIHByZXNzIGNhbiBtZWFuIHVuZG8gb3IgY2xlYXIKCQkJCQkJLy8gRG91YmxlIHByZXNzIGluIElFIG1lYW5zIGNsZWFyIHRoZSB3aG9sZSBmb3JtCgkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlzdXBwcmVzc0tleVByZXNzUmVwZWF0ID0gdHJ1ZTsKCQkJCQkvLyBzZWFyY2ggdGltZW91dCBzaG91bGQgYmUgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgaW5wdXQgdmFsdWUgaXMgY2hhbmdlZAoJCQkJCXRoaXMuX3NlYXJjaFRpbWVvdXQoIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0sCgkJCWtleXByZXNzOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoIHN1cHByZXNzS2V5UHJlc3MgKSB7CgkJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IGZhbHNlOwoJCQkJCWlmICggIXRoaXMuaXNNdWx0aUxpbmUgfHwgdGhpcy5tZW51LmVsZW1lbnQuaXMoICI6dmlzaWJsZSIgKSApIHsKCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQl9CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJaWYgKCBzdXBwcmVzc0tleVByZXNzUmVwZWF0ICkgewoJCQkJCXJldHVybjsKCQkJCX0KCgkJCQkvLyByZXBsaWNhdGUgc29tZSBrZXkgaGFuZGxlcnMgdG8gYWxsb3cgdGhlbSB0byByZXBlYXQgaW4gRmlyZWZveCBhbmQgT3BlcmEKCQkJCXZhciBrZXlDb2RlID0gJC51aS5rZXlDb2RlOwoJCQkJc3dpdGNoKCBldmVudC5rZXlDb2RlICkgewoJCQkJY2FzZSBrZXlDb2RlLlBBR0VfVVA6CgkJCQkJdGhpcy5fbW92ZSggInByZXZpb3VzUGFnZSIsIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIGtleUNvZGUuUEFHRV9ET1dOOgoJCQkJCXRoaXMuX21vdmUoICJuZXh0UGFnZSIsIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIGtleUNvZGUuVVA6CgkJCQkJdGhpcy5fa2V5RXZlbnQoICJwcmV2aW91cyIsIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIGtleUNvZGUuRE9XTjoKCQkJCQl0aGlzLl9rZXlFdmVudCggIm5leHQiLCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9LAoJCQlpbnB1dDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCBzdXBwcmVzc0lucHV0ICkgewoJCQkJCXN1cHByZXNzSW5wdXQgPSBmYWxzZTsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXRoaXMuX3NlYXJjaFRpbWVvdXQoIGV2ZW50ICk7CgkJCX0sCgkJCWZvY3VzOiBmdW5jdGlvbigpIHsKCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKCQkJCXRoaXMucHJldmlvdXMgPSB0aGlzLl92YWx1ZSgpOwoJCQl9LAoJCQlibHVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoIHRoaXMuY2FuY2VsQmx1ciApIHsKCQkJCQlkZWxldGUgdGhpcy5jYW5jZWxCbHVyOwoJCQkJCXJldHVybjsKCQkJCX0KCgkJCQljbGVhclRpbWVvdXQoIHRoaXMuc2VhcmNoaW5nICk7CgkJCQl0aGlzLmNsb3NlKCBldmVudCApOwoJCQkJdGhpcy5fY2hhbmdlKCBldmVudCApOwoJCQl9CgkJfSk7CgoJCXRoaXMuX2luaXRTb3VyY2UoKTsKCQl0aGlzLm1lbnUgPSAkKCAiPHVsPiIgKQoJCQkuYWRkQ2xhc3MoICJ1aS1hdXRvY29tcGxldGUgdWktZnJvbnQiICkKCQkJLmFwcGVuZFRvKCB0aGlzLl9hcHBlbmRUbygpICkKCQkJLm1lbnUoewoJCQkJLy8gZGlzYWJsZSBBUklBIHN1cHBvcnQsIHRoZSBsaXZlIHJlZ2lvbiB0YWtlcyBjYXJlIG9mIHRoYXQKCQkJCXJvbGU6IG51bGwKCQkJfSkKCQkJLmhpZGUoKQoJCQkuZGF0YSggInVpLW1lbnUiICk7CgoJCXRoaXMuX29uKCB0aGlzLm1lbnUuZWxlbWVudCwgewoJCQltb3VzZWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIHByZXZlbnQgbW92aW5nIGZvY3VzIG91dCBvZiB0aGUgdGV4dCBmaWVsZAoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCgkJCQkvLyBJRSBkb2Vzbid0IHByZXZlbnQgbW92aW5nIGZvY3VzIGV2ZW4gd2l0aCBldmVudC5wcmV2ZW50RGVmYXVsdCgpCgkJCQkvLyBzbyB3ZSBzZXQgYSBmbGFnIHRvIGtub3cgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBibHVyIGV2ZW50CgkJCQl0aGlzLmNhbmNlbEJsdXIgPSB0cnVlOwoJCQkJdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQkJZGVsZXRlIHRoaXMuY2FuY2VsQmx1cjsKCQkJCX0pOwoKCQkJCS8vIGNsaWNraW5nIG9uIHRoZSBzY3JvbGxiYXIgY2F1c2VzIGZvY3VzIHRvIHNoaWZ0IHRvIHRoZSBib2R5CgkJCQkvLyBidXQgd2UgY2FuJ3QgZGV0ZWN0IGEgbW91c2V1cCBvciBhIGNsaWNrIGltbWVkaWF0ZWx5IGFmdGVyd2FyZAoJCQkJLy8gc28gd2UgaGF2ZSB0byB0cmFjayB0aGUgbmV4dCBtb3VzZWRvd24gYW5kIGNsb3NlIHRoZSBtZW51IGlmCgkJCQkvLyB0aGUgdXNlciBjbGlja3Mgc29tZXdoZXJlIG91dHNpZGUgb2YgdGhlIGF1dG9jb21wbGV0ZQoJCQkJdmFyIG1lbnVFbGVtZW50ID0gdGhpcy5tZW51LmVsZW1lbnRbIDAgXTsKCQkJCWlmICggISQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoICIudWktbWVudS1pdGVtIiApLmxlbmd0aCApIHsKCQkJCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCQkJdmFyIHRoYXQgPSB0aGlzOwoJCQkJCQl0aGlzLmRvY3VtZW50Lm9uZSggIm1vdXNlZG93biIsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQkJCWlmICggZXZlbnQudGFyZ2V0ICE9PSB0aGF0LmVsZW1lbnRbIDAgXSAmJgoJCQkJCQkJCQlldmVudC50YXJnZXQgIT09IG1lbnVFbGVtZW50ICYmCgkJCQkJCQkJCSEkLmNvbnRhaW5zKCBtZW51RWxlbWVudCwgZXZlbnQudGFyZ2V0ICkgKSB7CgkJCQkJCQkJdGhhdC5jbG9zZSgpOwoJCQkJCQkJfQoJCQkJCQl9KTsKCQkJCQl9KTsKCQkJCX0KCQkJfSwKCQkJbWVudWZvY3VzOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJLy8gc3VwcG9ydDogRmlyZWZveAoJCQkJLy8gUHJldmVudCBhY2NpZGVudGFsIGFjdGl2YXRpb24gb2YgbWVudSBpdGVtcyBpbiBGaXJlZm94ICgjNzAyNCAjOTExOCkKCQkJCWlmICggdGhpcy5pc05ld01lbnUgKSB7CgkJCQkJdGhpcy5pc05ld01lbnUgPSBmYWxzZTsKCQkJCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQgJiYgL15tb3VzZS8udGVzdCggZXZlbnQub3JpZ2luYWxFdmVudC50eXBlICkgKSB7CgkJCQkJCXRoaXMubWVudS5ibHVyKCk7CgoJCQkJCQl0aGlzLmRvY3VtZW50Lm9uZSggIm1vdXNlbW92ZSIsIGZ1bmN0aW9uKCkgewoJCQkJCQkJJCggZXZlbnQudGFyZ2V0ICkudHJpZ2dlciggZXZlbnQub3JpZ2luYWxFdmVudCApOwoJCQkJCQl9KTsKCgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQl9CgoJCQkJdmFyIGl0ZW0gPSB1aS5pdGVtLmRhdGEoICJ1aS1hdXRvY29tcGxldGUtaXRlbSIgKTsKCQkJCWlmICggZmFsc2UgIT09IHRoaXMuX3RyaWdnZXIoICJmb2N1cyIsIGV2ZW50LCB7IGl0ZW06IGl0ZW0gfSApICkgewoJCQkJCS8vIHVzZSB2YWx1ZSB0byBtYXRjaCB3aGF0IHdpbGwgZW5kIHVwIGluIHRoZSBpbnB1dCwgaWYgaXQgd2FzIGEga2V5IGV2ZW50CgkJCQkJaWYgKCBldmVudC5vcmlnaW5hbEV2ZW50ICYmIC9ea2V5Ly50ZXN0KCBldmVudC5vcmlnaW5hbEV2ZW50LnR5cGUgKSApIHsKCQkJCQkJdGhpcy5fdmFsdWUoIGl0ZW0udmFsdWUgKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCS8vIE5vcm1hbGx5IHRoZSBpbnB1dCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgaXRlbSdzIHZhbHVlIGFzIHRoZQoJCQkJCS8vIG1lbnUgaXMgbmF2aWdhdGVkLCBjYXVzaW5nIHNjcmVlbiByZWFkZXJzIHRvIG5vdGljZSBhIGNoYW5nZSBhbmQKCQkJCQkvLyBhbm5vdW5jZSB0aGUgaXRlbS4gU2luY2UgdGhlIGZvY3VzIGV2ZW50IHdhcyBjYW5jZWxlZCwgdGhpcyBkb2Vzbid0CgkJCQkJLy8gaGFwcGVuLCBzbyB3ZSB1cGRhdGUgdGhlIGxpdmUgcmVnaW9uIHNvIHRoYXQgc2NyZWVuIHJlYWRlcnMgY2FuCgkJCQkJLy8gc3RpbGwgbm90aWNlIHRoZSBjaGFuZ2UgYW5kIGFubm91bmNlIGl0LgoJCQkJCXRoaXMubGl2ZVJlZ2lvbi50ZXh0KCBpdGVtLnZhbHVlICk7CgkJCQl9CgkJCX0sCgkJCW1lbnVzZWxlY3Q6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQl2YXIgaXRlbSA9IHVpLml0ZW0uZGF0YSggInVpLWF1dG9jb21wbGV0ZS1pdGVtIiApLAoJCQkJCXByZXZpb3VzID0gdGhpcy5wcmV2aW91czsKCgkJCQkvLyBvbmx5IHRyaWdnZXIgd2hlbiBmb2N1cyB3YXMgbG9zdCAoY2xpY2sgb24gbWVudSkKCQkJCWlmICggdGhpcy5lbGVtZW50WzBdICE9PSB0aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQgKSB7CgkJCQkJdGhpcy5lbGVtZW50LmZvY3VzKCk7CgkJCQkJdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzOwoJCQkJCS8vICM2MTA5IC0gSUUgdHJpZ2dlcnMgdHdvIGZvY3VzIGV2ZW50cyBhbmQgdGhlIHNlY29uZAoJCQkJCS8vIGlzIGFzeW5jaHJvbm91cywgc28gd2UgbmVlZCB0byByZXNldCB0aGUgcHJldmlvdXMKCQkJCQkvLyB0ZXJtIHN5bmNocm9ub3VzbHkgYW5kIGFzeW5jaHJvbm91c2x5IDotKAoJCQkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJCQl0aGlzLnByZXZpb3VzID0gcHJldmlvdXM7CgkJCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKCQkJCQl9KTsKCQkJCX0KCgkJCQlpZiAoIGZhbHNlICE9PSB0aGlzLl90cmlnZ2VyKCAic2VsZWN0IiwgZXZlbnQsIHsgaXRlbTogaXRlbSB9ICkgKSB7CgkJCQkJdGhpcy5fdmFsdWUoIGl0ZW0udmFsdWUgKTsKCQkJCX0KCQkJCS8vIHJlc2V0IHRoZSB0ZXJtIGFmdGVyIHRoZSBzZWxlY3QgZXZlbnQKCQkJCS8vIHRoaXMgYWxsb3dzIGN1c3RvbSBzZWxlY3QgaGFuZGxpbmcgdG8gd29yayBwcm9wZXJseQoJCQkJdGhpcy50ZXJtID0gdGhpcy5fdmFsdWUoKTsKCgkJCQl0aGlzLmNsb3NlKCBldmVudCApOwoJCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtOwoJCQl9CgkJfSk7CgoJCXRoaXMubGl2ZVJlZ2lvbiA9ICQoICI8c3Bhbj4iLCB7CgkJCQlyb2xlOiAic3RhdHVzIiwKCQkJCSJhcmlhLWxpdmUiOiAicG9saXRlIgoJCQl9KQoJCQkuYWRkQ2xhc3MoICJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiICkKCQkJLmluc2VydEJlZm9yZSggdGhpcy5lbGVtZW50ICk7CgoJCS8vIHR1cm5pbmcgb2ZmIGF1dG9jb21wbGV0ZSBwcmV2ZW50cyB0aGUgYnJvd3NlciBmcm9tIHJlbWVtYmVyaW5nIHRoZQoJCS8vIHZhbHVlIHdoZW4gbmF2aWdhdGluZyB0aHJvdWdoIGhpc3RvcnksIHNvIHdlIHJlLWVuYWJsZSBhdXRvY29tcGxldGUKCQkvLyBpZiB0aGUgcGFnZSBpcyB1bmxvYWRlZCBiZWZvcmUgdGhlIHdpZGdldCBpcyBkZXN0cm95ZWQuICM3NzkwCgkJdGhpcy5fb24oIHRoaXMud2luZG93LCB7CgkJCWJlZm9yZXVubG9hZDogZnVuY3Rpb24oKSB7CgkJCQl0aGlzLmVsZW1lbnQucmVtb3ZlQXR0ciggImF1dG9jb21wbGV0ZSIgKTsKCQkJfQoJCX0pOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLnNlYXJjaGluZyApOwoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1hdXRvY29tcGxldGUtaW5wdXQiICkKCQkJLnJlbW92ZUF0dHIoICJhdXRvY29tcGxldGUiICk7CgkJdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCk7CgkJdGhpcy5saXZlUmVnaW9uLnJlbW92ZSgpOwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoJCWlmICgga2V5ID09PSAic291cmNlIiApIHsKCQkJdGhpcy5faW5pdFNvdXJjZSgpOwoJCX0KCQlpZiAoIGtleSA9PT0gImFwcGVuZFRvIiApIHsKCQkJdGhpcy5tZW51LmVsZW1lbnQuYXBwZW5kVG8oIHRoaXMuX2FwcGVuZFRvKCkgKTsKCQl9CgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgJiYgdmFsdWUgJiYgdGhpcy54aHIgKSB7CgkJCXRoaXMueGhyLmFib3J0KCk7CgkJfQoJfSwKCglfYXBwZW5kVG86IGZ1bmN0aW9uKCkgewoJCXZhciBlbGVtZW50ID0gdGhpcy5vcHRpb25zLmFwcGVuZFRvOwoKCQlpZiAoIGVsZW1lbnQgKSB7CgkJCWVsZW1lbnQgPSBlbGVtZW50LmpxdWVyeSB8fCBlbGVtZW50Lm5vZGVUeXBlID8KCQkJCSQoIGVsZW1lbnQgKSA6CgkJCQl0aGlzLmRvY3VtZW50LmZpbmQoIGVsZW1lbnQgKS5lcSggMCApOwoJCX0KCgkJaWYgKCAhZWxlbWVudCApIHsKCQkJZWxlbWVudCA9IHRoaXMuZWxlbWVudC5jbG9zZXN0KCAiLnVpLWZyb250IiApOwoJCX0KCgkJaWYgKCAhZWxlbWVudC5sZW5ndGggKSB7CgkJCWVsZW1lbnQgPSB0aGlzLmRvY3VtZW50WzBdLmJvZHk7CgkJfQoKCQlyZXR1cm4gZWxlbWVudDsKCX0sCgoJX2luaXRTb3VyY2U6IGZ1bmN0aW9uKCkgewoJCXZhciBhcnJheSwgdXJsLAoJCQl0aGF0ID0gdGhpczsKCQlpZiAoICQuaXNBcnJheSh0aGlzLm9wdGlvbnMuc291cmNlKSApIHsKCQkJYXJyYXkgPSB0aGlzLm9wdGlvbnMuc291cmNlOwoJCQl0aGlzLnNvdXJjZSA9IGZ1bmN0aW9uKCByZXF1ZXN0LCByZXNwb25zZSApIHsKCQkJCXJlc3BvbnNlKCAkLnVpLmF1dG9jb21wbGV0ZS5maWx0ZXIoIGFycmF5LCByZXF1ZXN0LnRlcm0gKSApOwoJCQl9OwoJCX0gZWxzZSBpZiAoIHR5cGVvZiB0aGlzLm9wdGlvbnMuc291cmNlID09PSAic3RyaW5nIiApIHsKCQkJdXJsID0gdGhpcy5vcHRpb25zLnNvdXJjZTsKCQkJdGhpcy5zb3VyY2UgPSBmdW5jdGlvbiggcmVxdWVzdCwgcmVzcG9uc2UgKSB7CgkJCQlpZiAoIHRoYXQueGhyICkgewoJCQkJCXRoYXQueGhyLmFib3J0KCk7CgkJCQl9CgkJCQl0aGF0LnhociA9ICQuYWpheCh7CgkJCQkJdXJsOiB1cmwsCgkJCQkJZGF0YTogcmVxdWVzdCwKCQkJCQlkYXRhVHlwZTogImpzb24iLAoJCQkJCXN1Y2Nlc3M6IGZ1bmN0aW9uKCBkYXRhICkgewoJCQkJCQlyZXNwb25zZSggZGF0YSApOwoJCQkJCX0sCgkJCQkJZXJyb3I6IGZ1bmN0aW9uKCkgewoJCQkJCQlyZXNwb25zZSggW10gKTsKCQkJCQl9CgkJCQl9KTsKCQkJfTsKCQl9IGVsc2UgewoJCQl0aGlzLnNvdXJjZSA9IHRoaXMub3B0aW9ucy5zb3VyY2U7CgkJfQoJfSwKCglfc2VhcmNoVGltZW91dDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWNsZWFyVGltZW91dCggdGhpcy5zZWFyY2hpbmcgKTsKCQl0aGlzLnNlYXJjaGluZyA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkvLyBvbmx5IHNlYXJjaCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQKCQkJaWYgKCB0aGlzLnRlcm0gIT09IHRoaXMuX3ZhbHVlKCkgKSB7CgkJCQl0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CgkJCQl0aGlzLnNlYXJjaCggbnVsbCwgZXZlbnQgKTsKCQkJfQoJCX0sIHRoaXMub3B0aW9ucy5kZWxheSApOwoJfSwKCglzZWFyY2g6IGZ1bmN0aW9uKCB2YWx1ZSwgZXZlbnQgKSB7CgkJdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiB0aGlzLl92YWx1ZSgpOwoKCQkvLyBhbHdheXMgc2F2ZSB0aGUgYWN0dWFsIHZhbHVlLCBub3QgdGhlIG9uZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQKCQl0aGlzLnRlcm0gPSB0aGlzLl92YWx1ZSgpOwoKCQlpZiAoIHZhbHVlLmxlbmd0aCA8IHRoaXMub3B0aW9ucy5taW5MZW5ndGggKSB7CgkJCXJldHVybiB0aGlzLmNsb3NlKCBldmVudCApOwoJCX0KCgkJaWYgKCB0aGlzLl90cmlnZ2VyKCAic2VhcmNoIiwgZXZlbnQgKSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCXJldHVybiB0aGlzLl9zZWFyY2goIHZhbHVlICk7Cgl9LAoKCV9zZWFyY2g6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl0aGlzLnBlbmRpbmcrKzsKCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoICJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIgKTsKCQl0aGlzLmNhbmNlbFNlYXJjaCA9IGZhbHNlOwoKCQl0aGlzLnNvdXJjZSggeyB0ZXJtOiB2YWx1ZSB9LCB0aGlzLl9yZXNwb25zZSgpICk7Cgl9LAoKCV9yZXNwb25zZTogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlpbmRleCA9ICsrcmVxdWVzdEluZGV4OwoKCQlyZXR1cm4gZnVuY3Rpb24oIGNvbnRlbnQgKSB7CgkJCWlmICggaW5kZXggPT09IHJlcXVlc3RJbmRleCApIHsKCQkJCXRoYXQuX19yZXNwb25zZSggY29udGVudCApOwoJCQl9CgoJCQl0aGF0LnBlbmRpbmctLTsKCQkJaWYgKCAhdGhhdC5wZW5kaW5nICkgewoJCQkJdGhhdC5lbGVtZW50LnJlbW92ZUNsYXNzKCAidWktYXV0b2NvbXBsZXRlLWxvYWRpbmciICk7CgkJCX0KCQl9OwoJfSwKCglfX3Jlc3BvbnNlOiBmdW5jdGlvbiggY29udGVudCApIHsKCQlpZiAoIGNvbnRlbnQgKSB7CgkJCWNvbnRlbnQgPSB0aGlzLl9ub3JtYWxpemUoIGNvbnRlbnQgKTsKCQl9CgkJdGhpcy5fdHJpZ2dlciggInJlc3BvbnNlIiwgbnVsbCwgeyBjb250ZW50OiBjb250ZW50IH0gKTsKCQlpZiAoICF0aGlzLm9wdGlvbnMuZGlzYWJsZWQgJiYgY29udGVudCAmJiBjb250ZW50Lmxlbmd0aCAmJiAhdGhpcy5jYW5jZWxTZWFyY2ggKSB7CgkJCXRoaXMuX3N1Z2dlc3QoIGNvbnRlbnQgKTsKCQkJdGhpcy5fdHJpZ2dlciggIm9wZW4iICk7CgkJfSBlbHNlIHsKCQkJLy8gdXNlIC5fY2xvc2UoKSBpbnN0ZWFkIG9mIC5jbG9zZSgpIHNvIHdlIGRvbid0IGNhbmNlbCBmdXR1cmUgc2VhcmNoZXMKCQkJdGhpcy5fY2xvc2UoKTsKCQl9Cgl9LAoKCWNsb3NlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdGhpcy5jYW5jZWxTZWFyY2ggPSB0cnVlOwoJCXRoaXMuX2Nsb3NlKCBldmVudCApOwoJfSwKCglfY2xvc2U6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIHRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2libGUiICkgKSB7CgkJCXRoaXMubWVudS5lbGVtZW50LmhpZGUoKTsKCQkJdGhpcy5tZW51LmJsdXIoKTsKCQkJdGhpcy5pc05ld01lbnUgPSB0cnVlOwoJCQl0aGlzLl90cmlnZ2VyKCAiY2xvc2UiLCBldmVudCApOwoJCX0KCX0sCgoJX2NoYW5nZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggdGhpcy5wcmV2aW91cyAhPT0gdGhpcy5fdmFsdWUoKSApIHsKCQkJdGhpcy5fdHJpZ2dlciggImNoYW5nZSIsIGV2ZW50LCB7IGl0ZW06IHRoaXMuc2VsZWN0ZWRJdGVtIH0gKTsKCQl9Cgl9LAoKCV9ub3JtYWxpemU6IGZ1bmN0aW9uKCBpdGVtcyApIHsKCQkvLyBhc3N1bWUgYWxsIGl0ZW1zIGhhdmUgdGhlIHJpZ2h0IGZvcm1hdCB3aGVuIHRoZSBmaXJzdCBpdGVtIGlzIGNvbXBsZXRlCgkJaWYgKCBpdGVtcy5sZW5ndGggJiYgaXRlbXNbMF0ubGFiZWwgJiYgaXRlbXNbMF0udmFsdWUgKSB7CgkJCXJldHVybiBpdGVtczsKCQl9CgkJcmV0dXJuICQubWFwKCBpdGVtcywgZnVuY3Rpb24oIGl0ZW0gKSB7CgkJCWlmICggdHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciICkgewoJCQkJcmV0dXJuIHsKCQkJCQlsYWJlbDogaXRlbSwKCQkJCQl2YWx1ZTogaXRlbQoJCQkJfTsKCQkJfQoJCQlyZXR1cm4gJC5leHRlbmQoewoJCQkJbGFiZWw6IGl0ZW0ubGFiZWwgfHwgaXRlbS52YWx1ZSwKCQkJCXZhbHVlOiBpdGVtLnZhbHVlIHx8IGl0ZW0ubGFiZWwKCQkJfSwgaXRlbSApOwoJCX0pOwoJfSwKCglfc3VnZ2VzdDogZnVuY3Rpb24oIGl0ZW1zICkgewoJCXZhciB1bCA9IHRoaXMubWVudS5lbGVtZW50LmVtcHR5KCk7CgkJdGhpcy5fcmVuZGVyTWVudSggdWwsIGl0ZW1zICk7CgkJdGhpcy5pc05ld01lbnUgPSB0cnVlOwoJCXRoaXMubWVudS5yZWZyZXNoKCk7CgoJCS8vIHNpemUgYW5kIHBvc2l0aW9uIG1lbnUKCQl1bC5zaG93KCk7CgkJdGhpcy5fcmVzaXplTWVudSgpOwoJCXVsLnBvc2l0aW9uKCAkLmV4dGVuZCh7CgkJCW9mOiB0aGlzLmVsZW1lbnQKCQl9LCB0aGlzLm9wdGlvbnMucG9zaXRpb24gKSk7CgoJCWlmICggdGhpcy5vcHRpb25zLmF1dG9Gb2N1cyApIHsKCQkJdGhpcy5tZW51Lm5leHQoKTsKCQl9Cgl9LAoKCV9yZXNpemVNZW51OiBmdW5jdGlvbigpIHsKCQl2YXIgdWwgPSB0aGlzLm1lbnUuZWxlbWVudDsKCQl1bC5vdXRlcldpZHRoKCBNYXRoLm1heCgKCQkJLy8gRmlyZWZveCB3cmFwcyBsb25nIHRleHQgKHBvc3NpYmx5IGEgcm91bmRpbmcgYnVnKQoJCQkvLyBzbyB3ZSBhZGQgMXB4IHRvIGF2b2lkIHRoZSB3cmFwcGluZyAoIzc1MTMpCgkJCXVsLndpZHRoKCAiIiApLm91dGVyV2lkdGgoKSArIDEsCgkJCXRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkKCQkpICk7Cgl9LAoKCV9yZW5kZXJNZW51OiBmdW5jdGlvbiggdWwsIGl0ZW1zICkgewoJCXZhciB0aGF0ID0gdGhpczsKCQkkLmVhY2goIGl0ZW1zLCBmdW5jdGlvbiggaW5kZXgsIGl0ZW0gKSB7CgkJCXRoYXQuX3JlbmRlckl0ZW1EYXRhKCB1bCwgaXRlbSApOwoJCX0pOwoJfSwKCglfcmVuZGVySXRlbURhdGE6IGZ1bmN0aW9uKCB1bCwgaXRlbSApIHsKCQlyZXR1cm4gdGhpcy5fcmVuZGVySXRlbSggdWwsIGl0ZW0gKS5kYXRhKCAidWktYXV0b2NvbXBsZXRlLWl0ZW0iLCBpdGVtICk7Cgl9LAoKCV9yZW5kZXJJdGVtOiBmdW5jdGlvbiggdWwsIGl0ZW0gKSB7CgkJcmV0dXJuICQoICI8bGk+IiApCgkJCS5hcHBlbmQoICQoICI8YT4iICkudGV4dCggaXRlbS5sYWJlbCApICkKCQkJLmFwcGVuZFRvKCB1bCApOwoJfSwKCglfbW92ZTogZnVuY3Rpb24oIGRpcmVjdGlvbiwgZXZlbnQgKSB7CgkJaWYgKCAhdGhpcy5tZW51LmVsZW1lbnQuaXMoICI6dmlzaWJsZSIgKSApIHsKCQkJdGhpcy5zZWFyY2goIG51bGwsIGV2ZW50ICk7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSAmJiAvXnByZXZpb3VzLy50ZXN0KCBkaXJlY3Rpb24gKSB8fAoJCQkJdGhpcy5tZW51LmlzTGFzdEl0ZW0oKSAmJiAvXm5leHQvLnRlc3QoIGRpcmVjdGlvbiApICkgewoJCQl0aGlzLl92YWx1ZSggdGhpcy50ZXJtICk7CgkJCXRoaXMubWVudS5ibHVyKCk7CgkJCXJldHVybjsKCQl9CgkJdGhpcy5tZW51WyBkaXJlY3Rpb24gXSggZXZlbnQgKTsKCX0sCgoJd2lkZ2V0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tZW51LmVsZW1lbnQ7Cgl9LAoKCV92YWx1ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudmFsdWVNZXRob2QuYXBwbHkoIHRoaXMuZWxlbWVudCwgYXJndW1lbnRzICk7Cgl9LAoKCV9rZXlFdmVudDogZnVuY3Rpb24oIGtleUV2ZW50LCBldmVudCApIHsKCQlpZiAoICF0aGlzLmlzTXVsdGlMaW5lIHx8IHRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2libGUiICkgKSB7CgkJCXRoaXMuX21vdmUoIGtleUV2ZW50LCBldmVudCApOwoKCQkJLy8gcHJldmVudHMgbW92aW5nIGN1cnNvciB0byBiZWdpbm5pbmcvZW5kIG9mIHRoZSB0ZXh0IGZpZWxkIGluIHNvbWUgYnJvd3NlcnMKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9Cn0pOwoKJC5leHRlbmQoICQudWkuYXV0b2NvbXBsZXRlLCB7Cgllc2NhcGVSZWdleDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiB2YWx1ZS5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCAiXFwkJiIpOwoJfSwKCWZpbHRlcjogZnVuY3Rpb24oYXJyYXksIHRlcm0pIHsKCQl2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoICQudWkuYXV0b2NvbXBsZXRlLmVzY2FwZVJlZ2V4KHRlcm0pLCAiaSIgKTsKCQlyZXR1cm4gJC5ncmVwKCBhcnJheSwgZnVuY3Rpb24odmFsdWUpIHsKCQkJcmV0dXJuIG1hdGNoZXIudGVzdCggdmFsdWUubGFiZWwgfHwgdmFsdWUudmFsdWUgfHwgdmFsdWUgKTsKCQl9KTsKCX0KfSk7CgoKLy8gbGl2ZSByZWdpb24gZXh0ZW5zaW9uLCBhZGRpbmcgYSBgbWVzc2FnZXNgIG9wdGlvbgovLyBOT1RFOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBBUEkuIFdlIGFyZSBzdGlsbCBpbnZlc3RpZ2F0aW5nCi8vIGEgZnVsbCBzb2x1dGlvbiBmb3Igc3RyaW5nIG1hbmlwdWxhdGlvbiBhbmQgaW50ZXJuYXRpb25hbGl6YXRpb24uCiQud2lkZ2V0KCAidWkuYXV0b2NvbXBsZXRlIiwgJC51aS5hdXRvY29tcGxldGUsIHsKCW9wdGlvbnM6IHsKCQltZXNzYWdlczogewoJCQlub1Jlc3VsdHM6ICJObyBzZWFyY2ggcmVzdWx0cy4iLAoJCQlyZXN1bHRzOiBmdW5jdGlvbiggYW1vdW50ICkgewoJCQkJcmV0dXJuIGFtb3VudCArICggYW1vdW50ID4gMSA/ICIgcmVzdWx0cyBhcmUiIDogIiByZXN1bHQgaXMiICkgKwoJCQkJCSIgYXZhaWxhYmxlLCB1c2UgdXAgYW5kIGRvd24gYXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4iOwoJCQl9CgkJfQoJfSwKCglfX3Jlc3BvbnNlOiBmdW5jdGlvbiggY29udGVudCApIHsKCQl2YXIgbWVzc2FnZTsKCQl0aGlzLl9zdXBlckFwcGx5KCBhcmd1bWVudHMgKTsKCQlpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCB8fCB0aGlzLmNhbmNlbFNlYXJjaCApIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIGNvbnRlbnQgJiYgY29udGVudC5sZW5ndGggKSB7CgkJCW1lc3NhZ2UgPSB0aGlzLm9wdGlvbnMubWVzc2FnZXMucmVzdWx0cyggY29udGVudC5sZW5ndGggKTsKCQl9IGVsc2UgewoJCQltZXNzYWdlID0gdGhpcy5vcHRpb25zLm1lc3NhZ2VzLm5vUmVzdWx0czsKCQl9CgkJdGhpcy5saXZlUmVnaW9uLnRleHQoIG1lc3NhZ2UgKTsKCX0KfSk7Cgp9KCBqUXVlcnkgKSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCnZhciBsYXN0QWN0aXZlLCBzdGFydFhQb3MsIHN0YXJ0WVBvcywgY2xpY2tEcmFnZ2VkLAoJYmFzZUNsYXNzZXMgPSAidWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLAoJc3RhdGVDbGFzc2VzID0gInVpLXN0YXRlLWhvdmVyIHVpLXN0YXRlLWFjdGl2ZSAiLAoJdHlwZUNsYXNzZXMgPSAidWktYnV0dG9uLWljb25zLW9ubHkgdWktYnV0dG9uLWljb24tb25seSB1aS1idXR0b24tdGV4dC1pY29ucyB1aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgdWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgdWktYnV0dG9uLXRleHQtb25seSIsCglmb3JtUmVzZXRIYW5kbGVyID0gZnVuY3Rpb24oKSB7CgkJdmFyIGZvcm0gPSAkKCB0aGlzICk7CgkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJZm9ybS5maW5kKCAiOnVpLWJ1dHRvbiIgKS5idXR0b24oICJyZWZyZXNoIiApOwoJCX0sIDEgKTsKCX0sCglyYWRpb0dyb3VwID0gZnVuY3Rpb24oIHJhZGlvICkgewoJCXZhciBuYW1lID0gcmFkaW8ubmFtZSwKCQkJZm9ybSA9IHJhZGlvLmZvcm0sCgkJCXJhZGlvcyA9ICQoIFtdICk7CgkJaWYgKCBuYW1lICkgewoJCQluYW1lID0gbmFtZS5yZXBsYWNlKCAvJy9nLCAiXFwnIiApOwoJCQlpZiAoIGZvcm0gKSB7CgkJCQlyYWRpb3MgPSAkKCBmb3JtICkuZmluZCggIltuYW1lPSciICsgbmFtZSArICInXSIgKTsKCQkJfSBlbHNlIHsKCQkJCXJhZGlvcyA9ICQoICJbbmFtZT0nIiArIG5hbWUgKyAiJ10iLCByYWRpby5vd25lckRvY3VtZW50ICkKCQkJCQkuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQkJCQlyZXR1cm4gIXRoaXMuZm9ybTsKCQkJCQl9KTsKCQkJfQoJCX0KCQlyZXR1cm4gcmFkaW9zOwoJfTsKCiQud2lkZ2V0KCAidWkuYnV0dG9uIiwgewoJdmVyc2lvbjogIjEuMTAuMyIsCglkZWZhdWx0RWxlbWVudDogIjxidXR0b24+IiwKCW9wdGlvbnM6IHsKCQlkaXNhYmxlZDogbnVsbCwKCQl0ZXh0OiB0cnVlLAoJCWxhYmVsOiBudWxsLAoJCWljb25zOiB7CgkJCXByaW1hcnk6IG51bGwsCgkJCXNlY29uZGFyeTogbnVsbAoJCX0KCX0sCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQuY2xvc2VzdCggImZvcm0iICkKCQkJLnVuYmluZCggInJlc2V0IiArIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkuYmluZCggInJlc2V0IiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZvcm1SZXNldEhhbmRsZXIgKTsKCgkJaWYgKCB0eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkICE9PSAiYm9vbGVhbiIgKSB7CgkJCXRoaXMub3B0aW9ucy5kaXNhYmxlZCA9ICEhdGhpcy5lbGVtZW50LnByb3AoICJkaXNhYmxlZCIgKTsKCQl9IGVsc2UgewoJCQl0aGlzLmVsZW1lbnQucHJvcCggImRpc2FibGVkIiwgdGhpcy5vcHRpb25zLmRpc2FibGVkICk7CgkJfQoKCQl0aGlzLl9kZXRlcm1pbmVCdXR0b25UeXBlKCk7CgkJdGhpcy5oYXNUaXRsZSA9ICEhdGhpcy5idXR0b25FbGVtZW50LmF0dHIoICJ0aXRsZSIgKTsKCgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQl0b2dnbGVCdXR0b24gPSB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgfHwgdGhpcy50eXBlID09PSAicmFkaW8iLAoJCQlhY3RpdmVDbGFzcyA9ICF0b2dnbGVCdXR0b24gPyAidWktc3RhdGUtYWN0aXZlIiA6ICIiLAoJCQlmb2N1c0NsYXNzID0gInVpLXN0YXRlLWZvY3VzIjsKCgkJaWYgKCBvcHRpb25zLmxhYmVsID09PSBudWxsICkgewoJCQlvcHRpb25zLmxhYmVsID0gKHRoaXMudHlwZSA9PT0gImlucHV0IiA/IHRoaXMuYnV0dG9uRWxlbWVudC52YWwoKSA6IHRoaXMuYnV0dG9uRWxlbWVudC5odG1sKCkpOwoJCX0KCgkJdGhpcy5faG92ZXJhYmxlKCB0aGlzLmJ1dHRvbkVsZW1lbnQgKTsKCgkJdGhpcy5idXR0b25FbGVtZW50CgkJCS5hZGRDbGFzcyggYmFzZUNsYXNzZXMgKQoJCQkuYXR0ciggInJvbGUiLCAiYnV0dG9uIiApCgkJCS5iaW5kKCAibW91c2VlbnRlciIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlpZiAoIHRoaXMgPT09IGxhc3RBY3RpdmUgKSB7CgkJCQkJJCggdGhpcyApLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJfQoJCQl9KQoJCQkuYmluZCggIm1vdXNlbGVhdmUiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJJCggdGhpcyApLnJlbW92ZUNsYXNzKCBhY3RpdmVDbGFzcyApOwoJCQl9KQoJCQkuYmluZCggImNsaWNrIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCWV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwoJCQkJfQoJCQl9KTsKCgkJdGhpcy5lbGVtZW50CgkJCS5iaW5kKCAiZm9jdXMiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQkvLyBubyBuZWVkIHRvIGNoZWNrIGRpc2FibGVkLCBmb2N1cyB3b24ndCBiZSB0cmlnZ2VyZWQgYW55d2F5CgkJCQl0aGF0LmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoIGZvY3VzQ2xhc3MgKTsKCQkJfSkKCQkJLmJpbmQoICJibHVyIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCkgewoJCQkJdGhhdC5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKCBmb2N1c0NsYXNzICk7CgkJCX0pOwoKCQlpZiAoIHRvZ2dsZUJ1dHRvbiApIHsKCQkJdGhpcy5lbGVtZW50LmJpbmQoICJjaGFuZ2UiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNsaWNrRHJhZ2dlZCApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQl0aGF0LnJlZnJlc2goKTsKCQkJfSk7CgkJCS8vIGlmIG1vdXNlIG1vdmVzIGJldHdlZW4gbW91c2Vkb3duIGFuZCBtb3VzZXVwIChkcmFnKSBzZXQgY2xpY2tEcmFnZ2VkIGZsYWcKCQkJLy8gcHJldmVudHMgaXNzdWUgd2hlcmUgYnV0dG9uIHN0YXRlIGNoYW5nZXMgYnV0IGNoZWNrYm94L3JhZGlvIGNoZWNrZWQgc3RhdGUKCQkJLy8gZG9lcyBub3QgaW4gRmlyZWZveCAoc2VlIHRpY2tldCAjNjk3MCkKCQkJdGhpcy5idXR0b25FbGVtZW50CgkJCQkuYmluZCggIm1vdXNlZG93biIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCWNsaWNrRHJhZ2dlZCA9IGZhbHNlOwoJCQkJCXN0YXJ0WFBvcyA9IGV2ZW50LnBhZ2VYOwoJCQkJCXN0YXJ0WVBvcyA9IGV2ZW50LnBhZ2VZOwoJCQkJfSkKCQkJCS5iaW5kKCAibW91c2V1cCIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCWlmICggc3RhcnRYUG9zICE9PSBldmVudC5wYWdlWCB8fCBzdGFydFlQb3MgIT09IGV2ZW50LnBhZ2VZICkgewoJCQkJCQljbGlja0RyYWdnZWQgPSB0cnVlOwoJCQkJCX0KCQkJfSk7CgkJfQoKCQlpZiAoIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiApIHsKCQkJdGhpcy5idXR0b25FbGVtZW50LmJpbmQoICJjbGljayIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCB8fCBjbGlja0RyYWdnZWQgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgaWYgKCB0aGlzLnR5cGUgPT09ICJyYWRpbyIgKSB7CgkJCXRoaXMuYnV0dG9uRWxlbWVudC5iaW5kKCAiY2xpY2siICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQgfHwgY2xpY2tEcmFnZ2VkICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCSQoIHRoaXMgKS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCXRoYXQuYnV0dG9uRWxlbWVudC5hdHRyKCAiYXJpYS1wcmVzc2VkIiwgInRydWUiICk7CgoJCQkJdmFyIHJhZGlvID0gdGhhdC5lbGVtZW50WyAwIF07CgkJCQlyYWRpb0dyb3VwKCByYWRpbyApCgkJCQkJLm5vdCggcmFkaW8gKQoJCQkJCS5tYXAoZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiAkKCB0aGlzICkuYnV0dG9uKCAid2lkZ2V0IiApWyAwIF07CgkJCQkJfSkKCQkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICkKCQkJCQkuYXR0ciggImFyaWEtcHJlc3NlZCIsICJmYWxzZSIgKTsKCQkJfSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5idXR0b25FbGVtZW50CgkJCQkuYmluZCggIm1vdXNlZG93biIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJCggdGhpcyApLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJCWxhc3RBY3RpdmUgPSB0aGlzOwoJCQkJCXRoYXQuZG9jdW1lbnQub25lKCAibW91c2V1cCIsIGZ1bmN0aW9uKCkgewoJCQkJCQlsYXN0QWN0aXZlID0gbnVsbDsKCQkJCQl9KTsKCQkJCX0pCgkJCQkuYmluZCggIm1vdXNldXAiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCSQoIHRoaXMgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCX0pCgkJCQkuYmluZCggImtleWRvd24iICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oZXZlbnQpIHsKCQkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJaWYgKCBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuU1BBQ0UgfHwgZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLkVOVEVSICkgewoJCQkJCQkkKCB0aGlzICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQkJfQoJCQkJfSkKCQkJCS8vIHNlZSAjODU1OSwgd2UgYmluZCB0byBibHVyIGhlcmUgaW4gY2FzZSB0aGUgYnV0dG9uIGVsZW1lbnQgbG9zZXMKCQkJCS8vIGZvY3VzIGJldHdlZW4ga2V5ZG93biBhbmQga2V5dXAsIGl0IHdvdWxkIGJlIGxlZnQgaW4gYW4gImFjdGl2ZSIgc3RhdGUKCQkJCS5iaW5kKCAia2V5dXAiICsgdGhpcy5ldmVudE5hbWVzcGFjZSArICIgYmx1ciIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCQkkKCB0aGlzICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl9KTsKCgkJCWlmICggdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikgKSB7CgkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQua2V5dXAoZnVuY3Rpb24oZXZlbnQpIHsKCQkJCQlpZiAoIGV2ZW50LmtleUNvZGUgPT09ICQudWkua2V5Q29kZS5TUEFDRSApIHsKCQkJCQkJLy8gVE9ETyBwYXNzIHRocm91Z2ggb3JpZ2luYWwgZXZlbnQgY29ycmVjdGx5IChqdXN0IGFzIDJuZCBhcmd1bWVudCBkb2Vzbid0IHdvcmspCgkJCQkJCSQoIHRoaXMgKS5jbGljaygpOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfQoKCQkvLyBUT0RPOiBwdWxsIG91dCAkLldpZGdldCdzIGhhbmRsaW5nIGZvciB0aGUgZGlzYWJsZWQgb3B0aW9uIGludG8KCQkvLyAkLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbkRpc2FibGVkIHNvIGl0J3MgZWFzeSB0byBwcm94eSBhbmQgY2FuCgkJLy8gYmUgb3ZlcnJpZGRlbiBieSBpbmRpdmlkdWFsIHBsdWdpbnMKCQl0aGlzLl9zZXRPcHRpb24oICJkaXNhYmxlZCIsIG9wdGlvbnMuZGlzYWJsZWQgKTsKCQl0aGlzLl9yZXNldEJ1dHRvbigpOwoJfSwKCglfZGV0ZXJtaW5lQnV0dG9uVHlwZTogZnVuY3Rpb24oKSB7CgkJdmFyIGFuY2VzdG9yLCBsYWJlbFNlbGVjdG9yLCBjaGVja2VkOwoKCQlpZiAoIHRoaXMuZWxlbWVudC5pcygiW3R5cGU9Y2hlY2tib3hdIikgKSB7CgkJCXRoaXMudHlwZSA9ICJjaGVja2JveCI7CgkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50LmlzKCJbdHlwZT1yYWRpb10iKSApIHsKCQkJdGhpcy50eXBlID0gInJhZGlvIjsKCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQuaXMoImlucHV0IikgKSB7CgkJCXRoaXMudHlwZSA9ICJpbnB1dCI7CgkJfSBlbHNlIHsKCQkJdGhpcy50eXBlID0gImJ1dHRvbiI7CgkJfQoKCQlpZiAoIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiB8fCB0aGlzLnR5cGUgPT09ICJyYWRpbyIgKSB7CgkJCS8vIHdlIGRvbid0IHNlYXJjaCBhZ2FpbnN0IHRoZSBkb2N1bWVudCBpbiBjYXNlIHRoZSBlbGVtZW50CgkJCS8vIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBET00KCQkJYW5jZXN0b3IgPSB0aGlzLmVsZW1lbnQucGFyZW50cygpLmxhc3QoKTsKCQkJbGFiZWxTZWxlY3RvciA9ICJsYWJlbFtmb3I9JyIgKyB0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSArICInXSI7CgkJCXRoaXMuYnV0dG9uRWxlbWVudCA9IGFuY2VzdG9yLmZpbmQoIGxhYmVsU2VsZWN0b3IgKTsKCQkJaWYgKCAhdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aCApIHsKCQkJCWFuY2VzdG9yID0gYW5jZXN0b3IubGVuZ3RoID8gYW5jZXN0b3Iuc2libGluZ3MoKSA6IHRoaXMuZWxlbWVudC5zaWJsaW5ncygpOwoJCQkJdGhpcy5idXR0b25FbGVtZW50ID0gYW5jZXN0b3IuZmlsdGVyKCBsYWJlbFNlbGVjdG9yICk7CgkJCQlpZiAoICF0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RoICkgewoJCQkJCXRoaXMuYnV0dG9uRWxlbWVudCA9IGFuY2VzdG9yLmZpbmQoIGxhYmVsU2VsZWN0b3IgKTsKCQkJCX0KCQkJfQoJCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoICJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiICk7CgoJCQljaGVja2VkID0gdGhpcy5lbGVtZW50LmlzKCAiOmNoZWNrZWQiICk7CgkJCWlmICggY2hlY2tlZCApIHsKCQkJCXRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJfQoJCQl0aGlzLmJ1dHRvbkVsZW1lbnQucHJvcCggImFyaWEtcHJlc3NlZCIsIGNoZWNrZWQgKTsKCQl9IGVsc2UgewoJCQl0aGlzLmJ1dHRvbkVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJfQoJfSwKCgl3aWRnZXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmJ1dHRvbkVsZW1lbnQ7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCAidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiApOwoJCXRoaXMuYnV0dG9uRWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoIGJhc2VDbGFzc2VzICsgIiAiICsgc3RhdGVDbGFzc2VzICsgIiAiICsgdHlwZUNsYXNzZXMgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLXByZXNzZWQiICkKCQkJLmh0bWwoIHRoaXMuYnV0dG9uRWxlbWVudC5maW5kKCIudWktYnV0dG9uLXRleHQiKS5odG1sKCkgKTsKCgkJaWYgKCAhdGhpcy5oYXNUaXRsZSApIHsKCQkJdGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoICJ0aXRsZSIgKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7CgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgKSB7CgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmVsZW1lbnQucHJvcCggImRpc2FibGVkIiwgdHJ1ZSApOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5lbGVtZW50LnByb3AoICJkaXNhYmxlZCIsIGZhbHNlICk7CgkJCX0KCQkJcmV0dXJuOwoJCX0KCQl0aGlzLl9yZXNldEJ1dHRvbigpOwoJfSwKCglyZWZyZXNoOiBmdW5jdGlvbigpIHsKCQkvL1NlZSAjODIzNyAmICM4ODI4CgkJdmFyIGlzRGlzYWJsZWQgPSB0aGlzLmVsZW1lbnQuaXMoICJpbnB1dCwgYnV0dG9uIiApID8gdGhpcy5lbGVtZW50LmlzKCAiOmRpc2FibGVkIiApIDogdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCAidWktYnV0dG9uLWRpc2FibGVkIiApOwoKCQlpZiAoIGlzRGlzYWJsZWQgIT09IHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCAiZGlzYWJsZWQiLCBpc0Rpc2FibGVkICk7CgkJfQoJCWlmICggdGhpcy50eXBlID09PSAicmFkaW8iICkgewoJCQlyYWRpb0dyb3VwKCB0aGlzLmVsZW1lbnRbMF0gKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAkKCB0aGlzICkuaXMoICI6Y2hlY2tlZCIgKSApIHsKCQkJCQkkKCB0aGlzICkuYnV0dG9uKCAid2lkZ2V0IiApCgkJCQkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCQkuYXR0ciggImFyaWEtcHJlc3NlZCIsICJ0cnVlIiApOwoJCQkJfSBlbHNlIHsKCQkJCQkkKCB0aGlzICkuYnV0dG9uKCAid2lkZ2V0IiApCgkJCQkJCS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCQkuYXR0ciggImFyaWEtcHJlc3NlZCIsICJmYWxzZSIgKTsKCQkJCX0KCQkJfSk7CgkJfSBlbHNlIGlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICkgewoJCQlpZiAoIHRoaXMuZWxlbWVudC5pcyggIjpjaGVja2VkIiApICkgewoJCQkJdGhpcy5idXR0b25FbGVtZW50CgkJCQkJLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApCgkJCQkJLmF0dHIoICJhcmlhLXByZXNzZWQiLCAidHJ1ZSIgKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuYnV0dG9uRWxlbWVudAoJCQkJCS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCS5hdHRyKCAiYXJpYS1wcmVzc2VkIiwgImZhbHNlIiApOwoJCQl9CgkJfQoJfSwKCglfcmVzZXRCdXR0b246IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy50eXBlID09PSAiaW5wdXQiICkgewoJCQlpZiAoIHRoaXMub3B0aW9ucy5sYWJlbCApIHsKCQkJCXRoaXMuZWxlbWVudC52YWwoIHRoaXMub3B0aW9ucy5sYWJlbCApOwoJCQl9CgkJCXJldHVybjsKCQl9CgkJdmFyIGJ1dHRvbkVsZW1lbnQgPSB0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoIHR5cGVDbGFzc2VzICksCgkJCWJ1dHRvblRleHQgPSAkKCAiPHNwYW4+PC9zcGFuPiIsIHRoaXMuZG9jdW1lbnRbMF0gKQoJCQkJLmFkZENsYXNzKCAidWktYnV0dG9uLXRleHQiICkKCQkJCS5odG1sKCB0aGlzLm9wdGlvbnMubGFiZWwgKQoJCQkJLmFwcGVuZFRvKCBidXR0b25FbGVtZW50LmVtcHR5KCkgKQoJCQkJLnRleHQoKSwKCQkJaWNvbnMgPSB0aGlzLm9wdGlvbnMuaWNvbnMsCgkJCW11bHRpcGxlSWNvbnMgPSBpY29ucy5wcmltYXJ5ICYmIGljb25zLnNlY29uZGFyeSwKCQkJYnV0dG9uQ2xhc3NlcyA9IFtdOwoKCQlpZiAoIGljb25zLnByaW1hcnkgfHwgaWNvbnMuc2Vjb25kYXJ5ICkgewoJCQlpZiAoIHRoaXMub3B0aW9ucy50ZXh0ICkgewoJCQkJYnV0dG9uQ2xhc3Nlcy5wdXNoKCAidWktYnV0dG9uLXRleHQtaWNvbiIgKyAoIG11bHRpcGxlSWNvbnMgPyAicyIgOiAoIGljb25zLnByaW1hcnkgPyAiLXByaW1hcnkiIDogIi1zZWNvbmRhcnkiICkgKSApOwoJCQl9CgoJCQlpZiAoIGljb25zLnByaW1hcnkgKSB7CgkJCQlidXR0b25FbGVtZW50LnByZXBlbmQoICI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tcHJpbWFyeSB1aS1pY29uICIgKyBpY29ucy5wcmltYXJ5ICsgIic+PC9zcGFuPiIgKTsKCQkJfQoKCQkJaWYgKCBpY29ucy5zZWNvbmRhcnkgKSB7CgkJCQlidXR0b25FbGVtZW50LmFwcGVuZCggIjxzcGFuIGNsYXNzPSd1aS1idXR0b24taWNvbi1zZWNvbmRhcnkgdWktaWNvbiAiICsgaWNvbnMuc2Vjb25kYXJ5ICsgIic+PC9zcGFuPiIgKTsKCQkJfQoKCQkJaWYgKCAhdGhpcy5vcHRpb25zLnRleHQgKSB7CgkJCQlidXR0b25DbGFzc2VzLnB1c2goIG11bHRpcGxlSWNvbnMgPyAidWktYnV0dG9uLWljb25zLW9ubHkiIDogInVpLWJ1dHRvbi1pY29uLW9ubHkiICk7CgoJCQkJaWYgKCAhdGhpcy5oYXNUaXRsZSApIHsKCQkJCQlidXR0b25FbGVtZW50LmF0dHIoICJ0aXRsZSIsICQudHJpbSggYnV0dG9uVGV4dCApICk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlidXR0b25DbGFzc2VzLnB1c2goICJ1aS1idXR0b24tdGV4dC1vbmx5IiApOwoJCX0KCQlidXR0b25FbGVtZW50LmFkZENsYXNzKCBidXR0b25DbGFzc2VzLmpvaW4oICIgIiApICk7Cgl9Cn0pOwoKJC53aWRnZXQoICJ1aS5idXR0b25zZXQiLCB7Cgl2ZXJzaW9uOiAiMS4xMC4zIiwKCW9wdGlvbnM6IHsKCQlpdGVtczogImJ1dHRvbiwgaW5wdXRbdHlwZT1idXR0b25dLCBpbnB1dFt0eXBlPXN1Ym1pdF0sIGlucHV0W3R5cGU9cmVzZXRdLCBpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10sIGEsIDpkYXRhKHVpLWJ1dHRvbikiCgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxlbWVudC5hZGRDbGFzcyggInVpLWJ1dHRvbnNldCIgKTsKCX0sCgoJX2luaXQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMucmVmcmVzaCgpOwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpcy5idXR0b25zLmJ1dHRvbiggIm9wdGlvbiIsIGtleSwgdmFsdWUgKTsKCQl9CgoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7Cgl9LAoKCXJlZnJlc2g6IGZ1bmN0aW9uKCkgewoJCXZhciBydGwgPSB0aGlzLmVsZW1lbnQuY3NzKCAiZGlyZWN0aW9uIiApID09PSAicnRsIjsKCgkJdGhpcy5idXR0b25zID0gdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMub3B0aW9ucy5pdGVtcyApCgkJCS5maWx0ZXIoICI6dWktYnV0dG9uIiApCgkJCQkuYnV0dG9uKCAicmVmcmVzaCIgKQoJCQkuZW5kKCkKCQkJLm5vdCggIjp1aS1idXR0b24iICkKCQkJCS5idXR0b24oKQoJCQkuZW5kKCkKCQkJLm1hcChmdW5jdGlvbigpIHsKCQkJCXJldHVybiAkKCB0aGlzICkuYnV0dG9uKCAid2lkZ2V0IiApWyAwIF07CgkJCX0pCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIHVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodCIgKQoJCQkJLmZpbHRlciggIjpmaXJzdCIgKQoJCQkJCS5hZGRDbGFzcyggcnRsID8gInVpLWNvcm5lci1yaWdodCIgOiAidWktY29ybmVyLWxlZnQiICkKCQkJCS5lbmQoKQoJCQkJLmZpbHRlciggIjpsYXN0IiApCgkJCQkJLmFkZENsYXNzKCBydGwgPyAidWktY29ybmVyLWxlZnQiIDogInVpLWNvcm5lci1yaWdodCIgKQoJCQkJLmVuZCgpCgkJCS5lbmQoKTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyggInVpLWJ1dHRvbnNldCIgKTsKCQl0aGlzLmJ1dHRvbnMKCQkJLm1hcChmdW5jdGlvbigpIHsKCQkJCXJldHVybiAkKCB0aGlzICkuYnV0dG9uKCAid2lkZ2V0IiApWyAwIF07CgkJCX0pCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiICkKCQkJLmVuZCgpCgkJCS5idXR0b24oICJkZXN0cm95IiApOwoJfQp9KTsKCn0oIGpRdWVyeSApICk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZXh0ZW5kKCQudWksIHsgZGF0ZXBpY2tlcjogeyB2ZXJzaW9uOiAiMS4xMC4zIiB9IH0pOwoKdmFyIFBST1BfTkFNRSA9ICJkYXRlcGlja2VyIiwKCWluc3RBY3RpdmU7CgovKiBEYXRlIHBpY2tlciBtYW5hZ2VyLgogICBVc2UgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCAkLmRhdGVwaWNrZXIsIHRvIGludGVyYWN0IHdpdGggdGhlIGRhdGUgcGlja2VyLgogICBTZXR0aW5ncyBmb3IgKGdyb3VwcyBvZikgZGF0ZSBwaWNrZXJzIGFyZSBtYWludGFpbmVkIGluIGFuIGluc3RhbmNlIG9iamVjdCwKICAgYWxsb3dpbmcgbXVsdGlwbGUgZGlmZmVyZW50IHNldHRpbmdzIG9uIHRoZSBzYW1lIHBhZ2UuICovCgpmdW5jdGlvbiBEYXRlcGlja2VyKCkgewoJdGhpcy5fY3VySW5zdCA9IG51bGw7IC8vIFRoZSBjdXJyZW50IGluc3RhbmNlIGluIHVzZQoJdGhpcy5fa2V5RXZlbnQgPSBmYWxzZTsgLy8gSWYgdGhlIGxhc3QgZXZlbnQgd2FzIGEga2V5IGV2ZW50Cgl0aGlzLl9kaXNhYmxlZElucHV0cyA9IFtdOyAvLyBMaXN0IG9mIGRhdGUgcGlja2VyIGlucHV0cyB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZAoJdGhpcy5fZGF0ZXBpY2tlclNob3dpbmcgPSBmYWxzZTsgLy8gVHJ1ZSBpZiB0aGUgcG9wdXAgcGlja2VyIGlzIHNob3dpbmcgLCBmYWxzZSBpZiBub3QKCXRoaXMuX2luRGlhbG9nID0gZmFsc2U7IC8vIFRydWUgaWYgc2hvd2luZyB3aXRoaW4gYSAiZGlhbG9nIiwgZmFsc2UgaWYgbm90Cgl0aGlzLl9tYWluRGl2SWQgPSAidWktZGF0ZXBpY2tlci1kaXYiOyAvLyBUaGUgSUQgb2YgdGhlIG1haW4gZGF0ZXBpY2tlciBkaXZpc2lvbgoJdGhpcy5faW5saW5lQ2xhc3MgPSAidWktZGF0ZXBpY2tlci1pbmxpbmUiOyAvLyBUaGUgbmFtZSBvZiB0aGUgaW5saW5lIG1hcmtlciBjbGFzcwoJdGhpcy5fYXBwZW5kQ2xhc3MgPSAidWktZGF0ZXBpY2tlci1hcHBlbmQiOyAvLyBUaGUgbmFtZSBvZiB0aGUgYXBwZW5kIG1hcmtlciBjbGFzcwoJdGhpcy5fdHJpZ2dlckNsYXNzID0gInVpLWRhdGVwaWNrZXItdHJpZ2dlciI7IC8vIFRoZSBuYW1lIG9mIHRoZSB0cmlnZ2VyIG1hcmtlciBjbGFzcwoJdGhpcy5fZGlhbG9nQ2xhc3MgPSAidWktZGF0ZXBpY2tlci1kaWFsb2ciOyAvLyBUaGUgbmFtZSBvZiB0aGUgZGlhbG9nIG1hcmtlciBjbGFzcwoJdGhpcy5fZGlzYWJsZUNsYXNzID0gInVpLWRhdGVwaWNrZXItZGlzYWJsZWQiOyAvLyBUaGUgbmFtZSBvZiB0aGUgZGlzYWJsZWQgY292ZXJpbmcgbWFya2VyIGNsYXNzCgl0aGlzLl91bnNlbGVjdGFibGVDbGFzcyA9ICJ1aS1kYXRlcGlja2VyLXVuc2VsZWN0YWJsZSI7IC8vIFRoZSBuYW1lIG9mIHRoZSB1bnNlbGVjdGFibGUgY2VsbCBtYXJrZXIgY2xhc3MKCXRoaXMuX2N1cnJlbnRDbGFzcyA9ICJ1aS1kYXRlcGlja2VyLWN1cnJlbnQtZGF5IjsgLy8gVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZGF5IG1hcmtlciBjbGFzcwoJdGhpcy5fZGF5T3ZlckNsYXNzID0gInVpLWRhdGVwaWNrZXItZGF5cy1jZWxsLW92ZXIiOyAvLyBUaGUgbmFtZSBvZiB0aGUgZGF5IGhvdmVyIG1hcmtlciBjbGFzcwoJdGhpcy5yZWdpb25hbCA9IFtdOyAvLyBBdmFpbGFibGUgcmVnaW9uYWwgc2V0dGluZ3MsIGluZGV4ZWQgYnkgbGFuZ3VhZ2UgY29kZQoJdGhpcy5yZWdpb25hbFsiIl0gPSB7IC8vIERlZmF1bHQgcmVnaW9uYWwgc2V0dGluZ3MKCQljbG9zZVRleHQ6ICJEb25lIiwgLy8gRGlzcGxheSB0ZXh0IGZvciBjbG9zZSBsaW5rCgkJcHJldlRleHQ6ICJQcmV2IiwgLy8gRGlzcGxheSB0ZXh0IGZvciBwcmV2aW91cyBtb250aCBsaW5rCgkJbmV4dFRleHQ6ICJOZXh0IiwgLy8gRGlzcGxheSB0ZXh0IGZvciBuZXh0IG1vbnRoIGxpbmsKCQljdXJyZW50VGV4dDogIlRvZGF5IiwgLy8gRGlzcGxheSB0ZXh0IGZvciBjdXJyZW50IG1vbnRoIGxpbmsKCQltb250aE5hbWVzOiBbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwKCQkJIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLCAvLyBOYW1lcyBvZiBtb250aHMgZm9yIGRyb3AtZG93biBhbmQgZm9ybWF0dGluZwoJCW1vbnRoTmFtZXNTaG9ydDogWyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJdLCAvLyBGb3IgZm9ybWF0dGluZwoJCWRheU5hbWVzOiBbIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5Il0sIC8vIEZvciBmb3JtYXR0aW5nCgkJZGF5TmFtZXNTaG9ydDogWyJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiXSwgLy8gRm9yIGZvcm1hdHRpbmcKCQlkYXlOYW1lc01pbjogWyJTdSIsIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSJdLCAvLyBDb2x1bW4gaGVhZGluZ3MgZm9yIGRheXMgc3RhcnRpbmcgYXQgU3VuZGF5CgkJd2Vla0hlYWRlcjogIldrIiwgLy8gQ29sdW1uIGhlYWRlciBmb3Igd2VlayBvZiB0aGUgeWVhcgoJCWRhdGVGb3JtYXQ6ICJtbS9kZC95eSIsIC8vIFNlZSBmb3JtYXQgb3B0aW9ucyBvbiBwYXJzZURhdGUKCQlmaXJzdERheTogMCwgLy8gVGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaywgU3VuID0gMCwgTW9uID0gMSwgLi4uCgkJaXNSVEw6IGZhbHNlLCAvLyBUcnVlIGlmIHJpZ2h0LXRvLWxlZnQgbGFuZ3VhZ2UsIGZhbHNlIGlmIGxlZnQtdG8tcmlnaHQKCQlzaG93TW9udGhBZnRlclllYXI6IGZhbHNlLCAvLyBUcnVlIGlmIHRoZSB5ZWFyIHNlbGVjdCBwcmVjZWRlcyBtb250aCwgZmFsc2UgZm9yIG1vbnRoIHRoZW4geWVhcgoJCXllYXJTdWZmaXg6ICIiIC8vIEFkZGl0aW9uYWwgdGV4dCB0byBhcHBlbmQgdG8gdGhlIHllYXIgaW4gdGhlIG1vbnRoIGhlYWRlcnMKCX07Cgl0aGlzLl9kZWZhdWx0cyA9IHsgLy8gR2xvYmFsIGRlZmF1bHRzIGZvciBhbGwgdGhlIGRhdGUgcGlja2VyIGluc3RhbmNlcwoJCXNob3dPbjogImZvY3VzIiwgLy8gImZvY3VzIiBmb3IgcG9wdXAgb24gZm9jdXMsCgkJCS8vICJidXR0b24iIGZvciB0cmlnZ2VyIGJ1dHRvbiwgb3IgImJvdGgiIGZvciBlaXRoZXIKCQlzaG93QW5pbTogImZhZGVJbiIsIC8vIE5hbWUgb2YgalF1ZXJ5IGFuaW1hdGlvbiBmb3IgcG9wdXAKCQlzaG93T3B0aW9uczoge30sIC8vIE9wdGlvbnMgZm9yIGVuaGFuY2VkIGFuaW1hdGlvbnMKCQlkZWZhdWx0RGF0ZTogbnVsbCwgLy8gVXNlZCB3aGVuIGZpZWxkIGlzIGJsYW5rOiBhY3R1YWwgZGF0ZSwKCQkJLy8gKy8tbnVtYmVyIGZvciBvZmZzZXQgZnJvbSB0b2RheSwgbnVsbCBmb3IgdG9kYXkKCQlhcHBlbmRUZXh0OiAiIiwgLy8gRGlzcGxheSB0ZXh0IGZvbGxvd2luZyB0aGUgaW5wdXQgYm94LCBlLmcuIHNob3dpbmcgdGhlIGZvcm1hdAoJCWJ1dHRvblRleHQ6ICIuLi4iLCAvLyBUZXh0IGZvciB0cmlnZ2VyIGJ1dHRvbgoJCWJ1dHRvbkltYWdlOiAiIiwgLy8gVVJMIGZvciB0cmlnZ2VyIGJ1dHRvbiBpbWFnZQoJCWJ1dHRvbkltYWdlT25seTogZmFsc2UsIC8vIFRydWUgaWYgdGhlIGltYWdlIGFwcGVhcnMgYWxvbmUsIGZhbHNlIGlmIGl0IGFwcGVhcnMgb24gYSBidXR0b24KCQloaWRlSWZOb1ByZXZOZXh0OiBmYWxzZSwgLy8gVHJ1ZSB0byBoaWRlIG5leHQvcHJldmlvdXMgbW9udGggbGlua3MKCQkJLy8gaWYgbm90IGFwcGxpY2FibGUsIGZhbHNlIHRvIGp1c3QgZGlzYWJsZSB0aGVtCgkJbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdDogZmFsc2UsIC8vIFRydWUgaWYgZGF0ZSBmb3JtYXR0aW5nIGFwcGxpZWQgdG8gcHJldi90b2RheS9uZXh0IGxpbmtzCgkJZ290b0N1cnJlbnQ6IGZhbHNlLCAvLyBUcnVlIGlmIHRvZGF5IGxpbmsgZ29lcyBiYWNrIHRvIGN1cnJlbnQgc2VsZWN0aW9uIGluc3RlYWQKCQljaGFuZ2VNb250aDogZmFsc2UsIC8vIFRydWUgaWYgbW9udGggY2FuIGJlIHNlbGVjdGVkIGRpcmVjdGx5LCBmYWxzZSBpZiBvbmx5IHByZXYvbmV4dAoJCWNoYW5nZVllYXI6IGZhbHNlLCAvLyBUcnVlIGlmIHllYXIgY2FuIGJlIHNlbGVjdGVkIGRpcmVjdGx5LCBmYWxzZSBpZiBvbmx5IHByZXYvbmV4dAoJCXllYXJSYW5nZTogImMtMTA6YysxMCIsIC8vIFJhbmdlIG9mIHllYXJzIHRvIGRpc3BsYXkgaW4gZHJvcC1kb3duLAoJCQkvLyBlaXRoZXIgcmVsYXRpdmUgdG8gdG9kYXkncyB5ZWFyICgtbm46K25uKSwgcmVsYXRpdmUgdG8gY3VycmVudGx5IGRpc3BsYXllZCB5ZWFyCgkJCS8vIChjLW5uOmMrbm4pLCBhYnNvbHV0ZSAobm5ubjpubm5uKSwgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgKG5ubm46LW4pCgkJc2hvd090aGVyTW9udGhzOiBmYWxzZSwgLy8gVHJ1ZSB0byBzaG93IGRhdGVzIGluIG90aGVyIG1vbnRocywgZmFsc2UgdG8gbGVhdmUgYmxhbmsKCQlzZWxlY3RPdGhlck1vbnRoczogZmFsc2UsIC8vIFRydWUgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGRhdGVzIGluIG90aGVyIG1vbnRocywgZmFsc2UgZm9yIHVuc2VsZWN0YWJsZQoJCXNob3dXZWVrOiBmYWxzZSwgLy8gVHJ1ZSB0byBzaG93IHdlZWsgb2YgdGhlIHllYXIsIGZhbHNlIHRvIG5vdCBzaG93IGl0CgkJY2FsY3VsYXRlV2VlazogdGhpcy5pc284NjAxV2VlaywgLy8gSG93IHRvIGNhbGN1bGF0ZSB0aGUgd2VlayBvZiB0aGUgeWVhciwKCQkJLy8gdGFrZXMgYSBEYXRlIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHdlZWsgZm9yIGl0CgkJc2hvcnRZZWFyQ3V0b2ZmOiAiKzEwIiwgLy8gU2hvcnQgeWVhciB2YWx1ZXMgPCB0aGlzIGFyZSBpbiB0aGUgY3VycmVudCBjZW50dXJ5LAoJCQkvLyA+IHRoaXMgYXJlIGluIHRoZSBwcmV2aW91cyBjZW50dXJ5LAoJCQkvLyBzdHJpbmcgdmFsdWUgc3RhcnRpbmcgd2l0aCAiKyIgZm9yIGN1cnJlbnQgeWVhciArIHZhbHVlCgkJbWluRGF0ZTogbnVsbCwgLy8gVGhlIGVhcmxpZXN0IHNlbGVjdGFibGUgZGF0ZSwgb3IgbnVsbCBmb3Igbm8gbGltaXQKCQltYXhEYXRlOiBudWxsLCAvLyBUaGUgbGF0ZXN0IHNlbGVjdGFibGUgZGF0ZSwgb3IgbnVsbCBmb3Igbm8gbGltaXQKCQlkdXJhdGlvbjogImZhc3QiLCAvLyBEdXJhdGlvbiBvZiBkaXNwbGF5L2Nsb3N1cmUKCQliZWZvcmVTaG93RGF5OiBudWxsLCAvLyBGdW5jdGlvbiB0aGF0IHRha2VzIGEgZGF0ZSBhbmQgcmV0dXJucyBhbiBhcnJheSB3aXRoCgkJCS8vIFswXSA9IHRydWUgaWYgc2VsZWN0YWJsZSwgZmFsc2UgaWYgbm90LCBbMV0gPSBjdXN0b20gQ1NTIGNsYXNzIG5hbWUocykgb3IgIiIsCgkJCS8vIFsyXSA9IGNlbGwgdGl0bGUgKG9wdGlvbmFsKSwgZS5nLiAkLmRhdGVwaWNrZXIubm9XZWVrZW5kcwoJCWJlZm9yZVNob3c6IG51bGwsIC8vIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gaW5wdXQgZmllbGQgYW5kCgkJCS8vIHJldHVybnMgYSBzZXQgb2YgY3VzdG9tIHNldHRpbmdzIGZvciB0aGUgZGF0ZSBwaWNrZXIKCQlvblNlbGVjdDogbnVsbCwgLy8gRGVmaW5lIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBhIGRhdGUgaXMgc2VsZWN0ZWQKCQlvbkNoYW5nZU1vbnRoWWVhcjogbnVsbCwgLy8gRGVmaW5lIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgbW9udGggb3IgeWVhciBpcyBjaGFuZ2VkCgkJb25DbG9zZTogbnVsbCwgLy8gRGVmaW5lIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgZGF0ZXBpY2tlciBpcyBjbG9zZWQKCQludW1iZXJPZk1vbnRoczogMSwgLy8gTnVtYmVyIG9mIG1vbnRocyB0byBzaG93IGF0IGEgdGltZQoJCXNob3dDdXJyZW50QXRQb3M6IDAsIC8vIFRoZSBwb3NpdGlvbiBpbiBtdWx0aXBlIG1vbnRocyBhdCB3aGljaCB0byBzaG93IHRoZSBjdXJyZW50IG1vbnRoIChzdGFydGluZyBhdCAwKQoJCXN0ZXBNb250aHM6IDEsIC8vIE51bWJlciBvZiBtb250aHMgdG8gc3RlcCBiYWNrL2ZvcndhcmQKCQlzdGVwQmlnTW9udGhzOiAxMiwgLy8gTnVtYmVyIG9mIG1vbnRocyB0byBzdGVwIGJhY2svZm9yd2FyZCBmb3IgdGhlIGJpZyBsaW5rcwoJCWFsdEZpZWxkOiAiIiwgLy8gU2VsZWN0b3IgZm9yIGFuIGFsdGVybmF0ZSBmaWVsZCB0byBzdG9yZSBzZWxlY3RlZCBkYXRlcyBpbnRvCgkJYWx0Rm9ybWF0OiAiIiwgLy8gVGhlIGRhdGUgZm9ybWF0IHRvIHVzZSBmb3IgdGhlIGFsdGVybmF0ZSBmaWVsZAoJCWNvbnN0cmFpbklucHV0OiB0cnVlLCAvLyBUaGUgaW5wdXQgaXMgY29uc3RyYWluZWQgYnkgdGhlIGN1cnJlbnQgZGF0ZSBmb3JtYXQKCQlzaG93QnV0dG9uUGFuZWw6IGZhbHNlLCAvLyBUcnVlIHRvIHNob3cgYnV0dG9uIHBhbmVsLCBmYWxzZSB0byBub3Qgc2hvdyBpdAoJCWF1dG9TaXplOiBmYWxzZSwgLy8gVHJ1ZSB0byBzaXplIHRoZSBpbnB1dCBmb3IgdGhlIGRhdGUgZm9ybWF0LCBmYWxzZSB0byBsZWF2ZSBhcyBpcwoJCWRpc2FibGVkOiBmYWxzZSAvLyBUaGUgaW5pdGlhbCBkaXNhYmxlZCBzdGF0ZQoJfTsKCSQuZXh0ZW5kKHRoaXMuX2RlZmF1bHRzLCB0aGlzLnJlZ2lvbmFsWyIiXSk7Cgl0aGlzLmRwRGl2ID0gYmluZEhvdmVyKCQoIjxkaXYgaWQ9JyIgKyB0aGlzLl9tYWluRGl2SWQgKyAiJyBjbGFzcz0ndWktZGF0ZXBpY2tlciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVpLWNvcm5lci1hbGwnPjwvZGl2PiIpKTsKfQoKJC5leHRlbmQoRGF0ZXBpY2tlci5wcm90b3R5cGUsIHsKCS8qIENsYXNzIG5hbWUgYWRkZWQgdG8gZWxlbWVudHMgdG8gaW5kaWNhdGUgYWxyZWFkeSBjb25maWd1cmVkIHdpdGggYSBkYXRlIHBpY2tlci4gKi8KCW1hcmtlckNsYXNzTmFtZTogImhhc0RhdGVwaWNrZXIiLAoKCS8vS2VlcCB0cmFjayBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyBkaXNwbGF5ZWQgKHNlZSAjNzA0MykKCW1heFJvd3M6IDQsCgoJLy8gVE9ETyByZW5hbWUgdG8gIndpZGdldCIgd2hlbiBzd2l0Y2hpbmcgdG8gd2lkZ2V0IGZhY3RvcnkKCV93aWRnZXREYXRlcGlja2VyOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kcERpdjsKCX0sCgoJLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGRhdGUgcGlja2VyLgoJICogQHBhcmFtICBzZXR0aW5ncyAgb2JqZWN0IC0gdGhlIG5ldyBzZXR0aW5ncyB0byB1c2UgYXMgZGVmYXVsdHMgKGFub255bW91cyBvYmplY3QpCgkgKiBAcmV0dXJuIHRoZSBtYW5hZ2VyIG9iamVjdAoJICovCglzZXREZWZhdWx0czogZnVuY3Rpb24oc2V0dGluZ3MpIHsKCQlleHRlbmRSZW1vdmUodGhpcy5fZGVmYXVsdHMsIHNldHRpbmdzIHx8IHt9KTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyogQXR0YWNoIHRoZSBkYXRlIHBpY2tlciB0byBhIGpRdWVyeSBzZWxlY3Rpb24uCgkgKiBAcGFyYW0gIHRhcmdldAllbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKiBAcGFyYW0gIHNldHRpbmdzICBvYmplY3QgLSB0aGUgbmV3IHNldHRpbmdzIHRvIHVzZSBmb3IgdGhpcyBkYXRlIHBpY2tlciBpbnN0YW5jZSAoYW5vbnltb3VzKQoJICovCglfYXR0YWNoRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBzZXR0aW5ncykgewoJCXZhciBub2RlTmFtZSwgaW5saW5lLCBpbnN0OwoJCW5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJaW5saW5lID0gKG5vZGVOYW1lID09PSAiZGl2IiB8fCBub2RlTmFtZSA9PT0gInNwYW4iKTsKCQlpZiAoIXRhcmdldC5pZCkgewoJCQl0aGlzLnV1aWQgKz0gMTsKCQkJdGFyZ2V0LmlkID0gImRwIiArIHRoaXMudXVpZDsKCQl9CgkJaW5zdCA9IHRoaXMuX25ld0luc3QoJCh0YXJnZXQpLCBpbmxpbmUpOwoJCWluc3Quc2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgc2V0dGluZ3MgfHwge30pOwoJCWlmIChub2RlTmFtZSA9PT0gImlucHV0IikgewoJCQl0aGlzLl9jb25uZWN0RGF0ZXBpY2tlcih0YXJnZXQsIGluc3QpOwoJCX0gZWxzZSBpZiAoaW5saW5lKSB7CgkJCXRoaXMuX2lubGluZURhdGVwaWNrZXIodGFyZ2V0LCBpbnN0KTsKCQl9Cgl9LAoKCS8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvYmplY3QuICovCglfbmV3SW5zdDogZnVuY3Rpb24odGFyZ2V0LCBpbmxpbmUpIHsKCQl2YXIgaWQgPSB0YXJnZXRbMF0uaWQucmVwbGFjZSgvKFteQS1aYS16MC05X1wtXSkvZywgIlxcXFwkMSIpOyAvLyBlc2NhcGUgalF1ZXJ5IG1ldGEgY2hhcnMKCQlyZXR1cm4ge2lkOiBpZCwgaW5wdXQ6IHRhcmdldCwgLy8gYXNzb2NpYXRlZCB0YXJnZXQKCQkJc2VsZWN0ZWREYXk6IDAsIHNlbGVjdGVkTW9udGg6IDAsIHNlbGVjdGVkWWVhcjogMCwgLy8gY3VycmVudCBzZWxlY3Rpb24KCQkJZHJhd01vbnRoOiAwLCBkcmF3WWVhcjogMCwgLy8gbW9udGggYmVpbmcgZHJhd24KCQkJaW5saW5lOiBpbmxpbmUsIC8vIGlzIGRhdGVwaWNrZXIgaW5saW5lIG9yIG5vdAoJCQlkcERpdjogKCFpbmxpbmUgPyB0aGlzLmRwRGl2IDogLy8gcHJlc2VudGF0aW9uIGRpdgoJCQliaW5kSG92ZXIoJCgiPGRpdiBjbGFzcz0nIiArIHRoaXMuX2lubGluZUNsYXNzICsgIiB1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCc+PC9kaXY+IikpKX07Cgl9LAoKCS8qIEF0dGFjaCB0aGUgZGF0ZSBwaWNrZXIgdG8gYW4gaW5wdXQgZmllbGQuICovCglfY29ubmVjdERhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgaW5zdCkgewoJCXZhciBpbnB1dCA9ICQodGFyZ2V0KTsKCQlpbnN0LmFwcGVuZCA9ICQoW10pOwoJCWluc3QudHJpZ2dlciA9ICQoW10pOwoJCWlmIChpbnB1dC5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpIHsKCQkJcmV0dXJuOwoJCX0KCQl0aGlzLl9hdHRhY2htZW50cyhpbnB1dCwgaW5zdCk7CgkJaW5wdXQuYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmtleWRvd24odGhpcy5fZG9LZXlEb3duKS4KCQkJa2V5cHJlc3ModGhpcy5fZG9LZXlQcmVzcykua2V5dXAodGhpcy5fZG9LZXlVcCk7CgkJdGhpcy5fYXV0b1NpemUoaW5zdCk7CgkJJC5kYXRhKHRhcmdldCwgUFJPUF9OQU1FLCBpbnN0KTsKCQkvL0lmIGRpc2FibGVkIG9wdGlvbiBpcyB0cnVlLCBkaXNhYmxlIHRoZSBkYXRlcGlja2VyIG9uY2UgaXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIGlucHV0IChzZWUgdGlja2V0ICM1NjY1KQoJCWlmKCBpbnN0LnNldHRpbmdzLmRpc2FibGVkICkgewoJCQl0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlciggdGFyZ2V0ICk7CgkJfQoJfSwKCgkvKiBNYWtlIGF0dGFjaG1lbnRzIGJhc2VkIG9uIHNldHRpbmdzLiAqLwoJX2F0dGFjaG1lbnRzOiBmdW5jdGlvbihpbnB1dCwgaW5zdCkgewoJCXZhciBzaG93T24sIGJ1dHRvblRleHQsIGJ1dHRvbkltYWdlLAoJCQlhcHBlbmRUZXh0ID0gdGhpcy5fZ2V0KGluc3QsICJhcHBlbmRUZXh0IiksCgkJCWlzUlRMID0gdGhpcy5fZ2V0KGluc3QsICJpc1JUTCIpOwoKCQlpZiAoaW5zdC5hcHBlbmQpIHsKCQkJaW5zdC5hcHBlbmQucmVtb3ZlKCk7CgkJfQoJCWlmIChhcHBlbmRUZXh0KSB7CgkJCWluc3QuYXBwZW5kID0gJCgiPHNwYW4gY2xhc3M9JyIgKyB0aGlzLl9hcHBlbmRDbGFzcyArICInPiIgKyBhcHBlbmRUZXh0ICsgIjwvc3Bhbj4iKTsKCQkJaW5wdXRbaXNSVEwgPyAiYmVmb3JlIiA6ICJhZnRlciJdKGluc3QuYXBwZW5kKTsKCQl9CgoJCWlucHV0LnVuYmluZCgiZm9jdXMiLCB0aGlzLl9zaG93RGF0ZXBpY2tlcik7CgoJCWlmIChpbnN0LnRyaWdnZXIpIHsKCQkJaW5zdC50cmlnZ2VyLnJlbW92ZSgpOwoJCX0KCgkJc2hvd09uID0gdGhpcy5fZ2V0KGluc3QsICJzaG93T24iKTsKCQlpZiAoc2hvd09uID09PSAiZm9jdXMiIHx8IHNob3dPbiA9PT0gImJvdGgiKSB7IC8vIHBvcC11cCBkYXRlIHBpY2tlciB3aGVuIGluIHRoZSBtYXJrZWQgZmllbGQKCQkJaW5wdXQuZm9jdXModGhpcy5fc2hvd0RhdGVwaWNrZXIpOwoJCX0KCQlpZiAoc2hvd09uID09PSAiYnV0dG9uIiB8fCBzaG93T24gPT09ICJib3RoIikgeyAvLyBwb3AtdXAgZGF0ZSBwaWNrZXIgd2hlbiBidXR0b24gY2xpY2tlZAoJCQlidXR0b25UZXh0ID0gdGhpcy5fZ2V0KGluc3QsICJidXR0b25UZXh0Iik7CgkJCWJ1dHRvbkltYWdlID0gdGhpcy5fZ2V0KGluc3QsICJidXR0b25JbWFnZSIpOwoJCQlpbnN0LnRyaWdnZXIgPSAkKHRoaXMuX2dldChpbnN0LCAiYnV0dG9uSW1hZ2VPbmx5IikgPwoJCQkJJCgiPGltZy8+IikuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS4KCQkJCQlhdHRyKHsgc3JjOiBidXR0b25JbWFnZSwgYWx0OiBidXR0b25UZXh0LCB0aXRsZTogYnV0dG9uVGV4dCB9KSA6CgkJCQkkKCI8YnV0dG9uIHR5cGU9J2J1dHRvbic+PC9idXR0b24+IikuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS4KCQkJCQlodG1sKCFidXR0b25JbWFnZSA/IGJ1dHRvblRleHQgOiAkKCI8aW1nLz4iKS5hdHRyKAoJCQkJCXsgc3JjOmJ1dHRvbkltYWdlLCBhbHQ6YnV0dG9uVGV4dCwgdGl0bGU6YnV0dG9uVGV4dCB9KSkpOwoJCQlpbnB1dFtpc1JUTCA/ICJiZWZvcmUiIDogImFmdGVyIl0oaW5zdC50cmlnZ2VyKTsKCQkJaW5zdC50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgJiYgJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQgPT09IGlucHV0WzBdKSB7CgkJCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJCQkJfSBlbHNlIGlmICgkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nICYmICQuZGF0ZXBpY2tlci5fbGFzdElucHV0ICE9PSBpbnB1dFswXSkgewoJCQkJCSQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTsKCQkJCQkkLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKGlucHV0WzBdKTsKCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihpbnB1dFswXSk7CgkJCQl9CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0pOwoJCX0KCX0sCgoJLyogQXBwbHkgdGhlIG1heGltdW0gbGVuZ3RoIGZvciB0aGUgZGF0ZSBmb3JtYXQuICovCglfYXV0b1NpemU6IGZ1bmN0aW9uKGluc3QpIHsKCQlpZiAodGhpcy5fZ2V0KGluc3QsICJhdXRvU2l6ZSIpICYmICFpbnN0LmlubGluZSkgewoJCQl2YXIgZmluZE1heCwgbWF4LCBtYXhJLCBpLAoJCQkJZGF0ZSA9IG5ldyBEYXRlKDIwMDksIDEyIC0gMSwgMjApLCAvLyBFbnN1cmUgZG91YmxlIGRpZ2l0cwoJCQkJZGF0ZUZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAiZGF0ZUZvcm1hdCIpOwoKCQkJaWYgKGRhdGVGb3JtYXQubWF0Y2goL1tETV0vKSkgewoJCQkJZmluZE1heCA9IGZ1bmN0aW9uKG5hbWVzKSB7CgkJCQkJbWF4ID0gMDsKCQkJCQltYXhJID0gMDsKCQkJCQlmb3IgKGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKCQkJCQkJaWYgKG5hbWVzW2ldLmxlbmd0aCA+IG1heCkgewoJCQkJCQkJbWF4ID0gbmFtZXNbaV0ubGVuZ3RoOwoJCQkJCQkJbWF4SSA9IGk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJcmV0dXJuIG1heEk7CgkJCQl9OwoJCQkJZGF0ZS5zZXRNb250aChmaW5kTWF4KHRoaXMuX2dldChpbnN0LCAoZGF0ZUZvcm1hdC5tYXRjaCgvTU0vKSA/CgkJCQkJIm1vbnRoTmFtZXMiIDogIm1vbnRoTmFtZXNTaG9ydCIpKSkpOwoJCQkJZGF0ZS5zZXREYXRlKGZpbmRNYXgodGhpcy5fZ2V0KGluc3QsIChkYXRlRm9ybWF0Lm1hdGNoKC9ERC8pID8KCQkJCQkiZGF5TmFtZXMiIDogImRheU5hbWVzU2hvcnQiKSkpICsgMjAgLSBkYXRlLmdldERheSgpKTsKCQkJfQoJCQlpbnN0LmlucHV0LmF0dHIoInNpemUiLCB0aGlzLl9mb3JtYXREYXRlKGluc3QsIGRhdGUpLmxlbmd0aCk7CgkJfQoJfSwKCgkvKiBBdHRhY2ggYW4gaW5saW5lIGRhdGUgcGlja2VyIHRvIGEgZGl2LiAqLwoJX2lubGluZURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgaW5zdCkgewoJCXZhciBkaXZTcGFuID0gJCh0YXJnZXQpOwoJCWlmIChkaXZTcGFuLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSkgewoJCQlyZXR1cm47CgkJfQoJCWRpdlNwYW4uYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmFwcGVuZChpbnN0LmRwRGl2KTsKCQkkLmRhdGEodGFyZ2V0LCBQUk9QX05BTUUsIGluc3QpOwoJCXRoaXMuX3NldERhdGUoaW5zdCwgdGhpcy5fZ2V0RGVmYXVsdERhdGUoaW5zdCksIHRydWUpOwoJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGluc3QpOwoJCS8vSWYgZGlzYWJsZWQgb3B0aW9uIGlzIHRydWUsIGRpc2FibGUgdGhlIGRhdGVwaWNrZXIgYmVmb3JlIHNob3dpbmcgaXQgKHNlZSB0aWNrZXQgIzU2NjUpCgkJaWYoIGluc3Quc2V0dGluZ3MuZGlzYWJsZWQgKSB7CgkJCXRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKCB0YXJnZXQgKTsKCQl9CgkJLy8gU2V0IGRpc3BsYXk6YmxvY2sgaW4gcGxhY2Ugb2YgaW5zdC5kcERpdi5zaG93KCkgd2hpY2ggd29uJ3Qgd29yayBvbiBkaXNjb25uZWN0ZWQgZWxlbWVudHMKCQkvLyBodHRwOi8vYnVncy5qcXVlcnl1aS5jb20vdGlja2V0Lzc1NTIgLSBBIERhdGVwaWNrZXIgY3JlYXRlZCBvbiBhIGRldGFjaGVkIGRpdiBoYXMgemVybyBoZWlnaHQKCQlpbnN0LmRwRGl2LmNzcyggImRpc3BsYXkiLCAiYmxvY2siICk7Cgl9LAoKCS8qIFBvcC11cCB0aGUgZGF0ZSBwaWNrZXIgaW4gYSAiZGlhbG9nIiBib3guCgkgKiBAcGFyYW0gIGlucHV0IGVsZW1lbnQgLSBpZ25vcmVkCgkgKiBAcGFyYW0gIGRhdGUJc3RyaW5nIG9yIERhdGUgLSB0aGUgaW5pdGlhbCBkYXRlIHRvIGRpc3BsYXkKCSAqIEBwYXJhbSAgb25TZWxlY3QgIGZ1bmN0aW9uIC0gdGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIGRhdGUgaXMgc2VsZWN0ZWQKCSAqIEBwYXJhbSAgc2V0dGluZ3MgIG9iamVjdCAtIHVwZGF0ZSB0aGUgZGlhbG9nIGRhdGUgcGlja2VyIGluc3RhbmNlJ3Mgc2V0dGluZ3MgKGFub255bW91cyBvYmplY3QpCgkgKiBAcGFyYW0gIHBvcyBpbnRbMl0gLSBjb29yZGluYXRlcyBmb3IgdGhlIGRpYWxvZydzIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2NyZWVuIG9yCgkgKgkJCQkJZXZlbnQgLSB3aXRoIHgveSBjb29yZGluYXRlcyBvcgoJICoJCQkJCWxlYXZlIGVtcHR5IGZvciBkZWZhdWx0IChzY3JlZW4gY2VudHJlKQoJICogQHJldHVybiB0aGUgbWFuYWdlciBvYmplY3QKCSAqLwoJX2RpYWxvZ0RhdGVwaWNrZXI6IGZ1bmN0aW9uKGlucHV0LCBkYXRlLCBvblNlbGVjdCwgc2V0dGluZ3MsIHBvcykgewoJCXZhciBpZCwgYnJvd3NlcldpZHRoLCBicm93c2VySGVpZ2h0LCBzY3JvbGxYLCBzY3JvbGxZLAoJCQlpbnN0ID0gdGhpcy5fZGlhbG9nSW5zdDsgLy8gaW50ZXJuYWwgaW5zdGFuY2UKCgkJaWYgKCFpbnN0KSB7CgkJCXRoaXMudXVpZCArPSAxOwoJCQlpZCA9ICJkcCIgKyB0aGlzLnV1aWQ7CgkJCXRoaXMuX2RpYWxvZ0lucHV0ID0gJCgiPGlucHV0IHR5cGU9J3RleHQnIGlkPSciICsgaWQgKwoJCQkJIicgc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAtMTAwcHg7IHdpZHRoOiAwcHg7Jy8+Iik7CgkJCXRoaXMuX2RpYWxvZ0lucHV0LmtleWRvd24odGhpcy5fZG9LZXlEb3duKTsKCQkJJCgiYm9keSIpLmFwcGVuZCh0aGlzLl9kaWFsb2dJbnB1dCk7CgkJCWluc3QgPSB0aGlzLl9kaWFsb2dJbnN0ID0gdGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1dCwgZmFsc2UpOwoJCQlpbnN0LnNldHRpbmdzID0ge307CgkJCSQuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSwgUFJPUF9OQU1FLCBpbnN0KTsKCQl9CgkJZXh0ZW5kUmVtb3ZlKGluc3Quc2V0dGluZ3MsIHNldHRpbmdzIHx8IHt9KTsKCQlkYXRlID0gKGRhdGUgJiYgZGF0ZS5jb25zdHJ1Y3RvciA9PT0gRGF0ZSA/IHRoaXMuX2Zvcm1hdERhdGUoaW5zdCwgZGF0ZSkgOiBkYXRlKTsKCQl0aGlzLl9kaWFsb2dJbnB1dC52YWwoZGF0ZSk7CgoJCXRoaXMuX3BvcyA9IChwb3MgPyAocG9zLmxlbmd0aCA/IHBvcyA6IFtwb3MucGFnZVgsIHBvcy5wYWdlWV0pIDogbnVsbCk7CgkJaWYgKCF0aGlzLl9wb3MpIHsKCQkJYnJvd3NlcldpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOwoJCQlicm93c2VySGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKCQkJc2Nyb2xsWCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDsKCQkJc2Nyb2xsWSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgkJCXRoaXMuX3BvcyA9IC8vIHNob3VsZCB1c2UgYWN0dWFsIHdpZHRoL2hlaWdodCBiZWxvdwoJCQkJWyhicm93c2VyV2lkdGggLyAyKSAtIDEwMCArIHNjcm9sbFgsIChicm93c2VySGVpZ2h0IC8gMikgLSAxNTAgKyBzY3JvbGxZXTsKCQl9CgoJCS8vIG1vdmUgaW5wdXQgb24gc2NyZWVuIGZvciBmb2N1cywgYnV0IGhpZGRlbiBiZWhpbmQgZGlhbG9nCgkJdGhpcy5fZGlhbG9nSW5wdXQuY3NzKCJsZWZ0IiwgKHRoaXMuX3Bvc1swXSArIDIwKSArICJweCIpLmNzcygidG9wIiwgdGhpcy5fcG9zWzFdICsgInB4Iik7CgkJaW5zdC5zZXR0aW5ncy5vblNlbGVjdCA9IG9uU2VsZWN0OwoJCXRoaXMuX2luRGlhbG9nID0gdHJ1ZTsKCQl0aGlzLmRwRGl2LmFkZENsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKTsKCQl0aGlzLl9zaG93RGF0ZXBpY2tlcih0aGlzLl9kaWFsb2dJbnB1dFswXSk7CgkJaWYgKCQuYmxvY2tVSSkgewoJCQkkLmJsb2NrVUkodGhpcy5kcERpdik7CgkJfQoJCSQuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSwgUFJPUF9OQU1FLCBpbnN0KTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyogRGV0YWNoIGEgZGF0ZXBpY2tlciBmcm9tIGl0cyBjb250cm9sLgoJICogQHBhcmFtICB0YXJnZXQJZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICovCglfZGVzdHJveURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCkgewoJCXZhciBub2RlTmFtZSwKCQkJJHRhcmdldCA9ICQodGFyZ2V0KSwKCQkJaW5zdCA9ICQuZGF0YSh0YXJnZXQsIFBST1BfTkFNRSk7CgoJCWlmICghJHRhcmdldC5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpIHsKCQkJcmV0dXJuOwoJCX0KCgkJbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkkLnJlbW92ZURhdGEodGFyZ2V0LCBQUk9QX05BTUUpOwoJCWlmIChub2RlTmFtZSA9PT0gImlucHV0IikgewoJCQlpbnN0LmFwcGVuZC5yZW1vdmUoKTsKCQkJaW5zdC50cmlnZ2VyLnJlbW92ZSgpOwoJCQkkdGFyZ2V0LnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS4KCQkJCXVuYmluZCgiZm9jdXMiLCB0aGlzLl9zaG93RGF0ZXBpY2tlcikuCgkJCQl1bmJpbmQoImtleWRvd24iLCB0aGlzLl9kb0tleURvd24pLgoJCQkJdW5iaW5kKCJrZXlwcmVzcyIsIHRoaXMuX2RvS2V5UHJlc3MpLgoJCQkJdW5iaW5kKCJrZXl1cCIsIHRoaXMuX2RvS2V5VXApOwoJCX0gZWxzZSBpZiAobm9kZU5hbWUgPT09ICJkaXYiIHx8IG5vZGVOYW1lID09PSAic3BhbiIpIHsKCQkJJHRhcmdldC5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuZW1wdHkoKTsKCQl9Cgl9LAoKCS8qIEVuYWJsZSB0aGUgZGF0ZSBwaWNrZXIgdG8gYSBqUXVlcnkgc2VsZWN0aW9uLgoJICogQHBhcmFtICB0YXJnZXQJZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICovCglfZW5hYmxlRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyIG5vZGVOYW1lLCBpbmxpbmUsCgkJCSR0YXJnZXQgPSAkKHRhcmdldCksCgkJCWluc3QgPSAkLmRhdGEodGFyZ2V0LCBQUk9QX05BTUUpOwoKCQlpZiAoISR0YXJnZXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKSB7CgkJCXJldHVybjsKCQl9CgoJCW5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJaWYgKG5vZGVOYW1lID09PSAiaW5wdXQiKSB7CgkJCXRhcmdldC5kaXNhYmxlZCA9IGZhbHNlOwoJCQlpbnN0LnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS4KCQkJCWVhY2goZnVuY3Rpb24oKSB7IHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsgfSkuZW5kKCkuCgkJCQlmaWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eTogIjEuMCIsIGN1cnNvcjogIiJ9KTsKCQl9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAiZGl2IiB8fCBub2RlTmFtZSA9PT0gInNwYW4iKSB7CgkJCWlubGluZSA9ICR0YXJnZXQuY2hpbGRyZW4oIi4iICsgdGhpcy5faW5saW5lQ2xhc3MpOwoJCQlpbmxpbmUuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKTsKCQkJaW5saW5lLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikuCgkJCQlwcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCQl9CgkJdGhpcy5fZGlzYWJsZWRJbnB1dHMgPSAkLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cywKCQkJZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuICh2YWx1ZSA9PT0gdGFyZ2V0ID8gbnVsbCA6IHZhbHVlKTsgfSk7IC8vIGRlbGV0ZSBlbnRyeQoJfSwKCgkvKiBEaXNhYmxlIHRoZSBkYXRlIHBpY2tlciB0byBhIGpRdWVyeSBzZWxlY3Rpb24uCgkgKiBAcGFyYW0gIHRhcmdldAllbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKi8KCV9kaXNhYmxlRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyIG5vZGVOYW1lLCBpbmxpbmUsCgkJCSR0YXJnZXQgPSAkKHRhcmdldCksCgkJCWluc3QgPSAkLmRhdGEodGFyZ2V0LCBQUk9QX05BTUUpOwoKCQlpZiAoISR0YXJnZXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKSB7CgkJCXJldHVybjsKCQl9CgoJCW5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJaWYgKG5vZGVOYW1lID09PSAiaW5wdXQiKSB7CgkJCXRhcmdldC5kaXNhYmxlZCA9IHRydWU7CgkJCWluc3QudHJpZ2dlci5maWx0ZXIoImJ1dHRvbiIpLgoJCQkJZWFjaChmdW5jdGlvbigpIHsgdGhpcy5kaXNhYmxlZCA9IHRydWU7IH0pLmVuZCgpLgoJCQkJZmlsdGVyKCJpbWciKS5jc3Moe29wYWNpdHk6ICIwLjUiLCBjdXJzb3I6ICJkZWZhdWx0In0pOwoJCX0gZWxzZSBpZiAobm9kZU5hbWUgPT09ICJkaXYiIHx8IG5vZGVOYW1lID09PSAic3BhbiIpIHsKCQkJaW5saW5lID0gJHRhcmdldC5jaGlsZHJlbigiLiIgKyB0aGlzLl9pbmxpbmVDbGFzcyk7CgkJCWlubGluZS5jaGlsZHJlbigpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpOwoJCQlpbmxpbmUuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS4KCQkJCXByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgkJfQoJCXRoaXMuX2Rpc2FibGVkSW5wdXRzID0gJC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsCgkJCWZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiAodmFsdWUgPT09IHRhcmdldCA/IG51bGwgOiB2YWx1ZSk7IH0pOyAvLyBkZWxldGUgZW50cnkKCQl0aGlzLl9kaXNhYmxlZElucHV0c1t0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGhdID0gdGFyZ2V0OwoJfSwKCgkvKiBJcyB0aGUgZmlyc3QgZmllbGQgaW4gYSBqUXVlcnkgY29sbGVjdGlvbiBkaXNhYmxlZCBhcyBhIGRhdGVwaWNrZXI/CgkgKiBAcGFyYW0gIHRhcmdldAllbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIGRpc2FibGVkLCBmYWxzZSBpZiBlbmFibGVkCgkgKi8KCV9pc0Rpc2FibGVkRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJaWYgKCF0YXJnZXQpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJCWlmICh0aGlzLl9kaXNhYmxlZElucHV0c1tpXSA9PT0gdGFyZ2V0KSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCS8qIFJldHJpZXZlIHRoZSBpbnN0YW5jZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGNvbnRyb2wuCgkgKiBAcGFyYW0gIHRhcmdldCAgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICogQHJldHVybiAgb2JqZWN0IC0gdGhlIGFzc29jaWF0ZWQgaW5zdGFuY2UgZGF0YQoJICogQHRocm93cyAgZXJyb3IgaWYgYSBqUXVlcnkgcHJvYmxlbSBnZXR0aW5nIGRhdGEKCSAqLwoJX2dldEluc3Q6IGZ1bmN0aW9uKHRhcmdldCkgewoJCXRyeSB7CgkJCXJldHVybiAkLmRhdGEodGFyZ2V0LCBQUk9QX05BTUUpOwoJCX0KCQljYXRjaCAoZXJyKSB7CgkJCXRocm93ICJNaXNzaW5nIGluc3RhbmNlIGRhdGEgZm9yIHRoaXMgZGF0ZXBpY2tlciI7CgkJfQoJfSwKCgkvKiBVcGRhdGUgb3IgcmV0cmlldmUgdGhlIHNldHRpbmdzIGZvciBhIGRhdGUgcGlja2VyIGF0dGFjaGVkIHRvIGFuIGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uLgoJICogQHBhcmFtICB0YXJnZXQgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4KCSAqIEBwYXJhbSAgbmFtZQlvYmplY3QgLSB0aGUgbmV3IHNldHRpbmdzIHRvIHVwZGF0ZSBvcgoJICoJCQkJc3RyaW5nIC0gdGhlIG5hbWUgb2YgdGhlIHNldHRpbmcgdG8gY2hhbmdlIG9yIHJldHJpZXZlLAoJICoJCQkJd2hlbiByZXRyaWV2aW5nIGFsc28gImFsbCIgZm9yIGFsbCBpbnN0YW5jZSBzZXR0aW5ncyBvcgoJICoJCQkJImRlZmF1bHRzIiBmb3IgYWxsIGdsb2JhbCBkZWZhdWx0cwoJICogQHBhcmFtICB2YWx1ZSAgIGFueSAtIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzZXR0aW5nCgkgKgkJCQkob21pdCBpZiBhYm92ZSBpcyBhbiBvYmplY3Qgb3IgdG8gcmV0cmlldmUgYSB2YWx1ZSkKCSAqLwoJX29wdGlvbkRhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHsKCQl2YXIgc2V0dGluZ3MsIGRhdGUsIG1pbkRhdGUsIG1heERhdGUsCgkJCWluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgoJCWlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgewoJCQlyZXR1cm4gKG5hbWUgPT09ICJkZWZhdWx0cyIgPyAkLmV4dGVuZCh7fSwgJC5kYXRlcGlja2VyLl9kZWZhdWx0cykgOgoJCQkJKGluc3QgPyAobmFtZSA9PT0gImFsbCIgPyAkLmV4dGVuZCh7fSwgaW5zdC5zZXR0aW5ncykgOgoJCQkJdGhpcy5fZ2V0KGluc3QsIG5hbWUpKSA6IG51bGwpKTsKCQl9CgoJCXNldHRpbmdzID0gbmFtZSB8fCB7fTsKCQlpZiAodHlwZW9mIG5hbWUgPT09ICJzdHJpbmciKSB7CgkJCXNldHRpbmdzID0ge307CgkJCXNldHRpbmdzW25hbWVdID0gdmFsdWU7CgkJfQoKCQlpZiAoaW5zdCkgewoJCQlpZiAodGhpcy5fY3VySW5zdCA9PT0gaW5zdCkgewoJCQkJdGhpcy5faGlkZURhdGVwaWNrZXIoKTsKCQkJfQoKCQkJZGF0ZSA9IHRoaXMuX2dldERhdGVEYXRlcGlja2VyKHRhcmdldCwgdHJ1ZSk7CgkJCW1pbkRhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsICJtaW4iKTsKCQkJbWF4RGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgIm1heCIpOwoJCQlleHRlbmRSZW1vdmUoaW5zdC5zZXR0aW5ncywgc2V0dGluZ3MpOwoJCQkvLyByZWZvcm1hdCB0aGUgb2xkIG1pbkRhdGUvbWF4RGF0ZSB2YWx1ZXMgaWYgZGF0ZUZvcm1hdCBjaGFuZ2VzIGFuZCBhIG5ldyBtaW5EYXRlL21heERhdGUgaXNuJ3QgcHJvdmlkZWQKCQkJaWYgKG1pbkRhdGUgIT09IG51bGwgJiYgc2V0dGluZ3MuZGF0ZUZvcm1hdCAhPT0gdW5kZWZpbmVkICYmIHNldHRpbmdzLm1pbkRhdGUgPT09IHVuZGVmaW5lZCkgewoJCQkJaW5zdC5zZXR0aW5ncy5taW5EYXRlID0gdGhpcy5fZm9ybWF0RGF0ZShpbnN0LCBtaW5EYXRlKTsKCQkJfQoJCQlpZiAobWF4RGF0ZSAhPT0gbnVsbCAmJiBzZXR0aW5ncy5kYXRlRm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgc2V0dGluZ3MubWF4RGF0ZSA9PT0gdW5kZWZpbmVkKSB7CgkJCQlpbnN0LnNldHRpbmdzLm1heERhdGUgPSB0aGlzLl9mb3JtYXREYXRlKGluc3QsIG1heERhdGUpOwoJCQl9CgkJCWlmICggImRpc2FibGVkIiBpbiBzZXR0aW5ncyApIHsKCQkJCWlmICggc2V0dGluZ3MuZGlzYWJsZWQgKSB7CgkJCQkJdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIodGFyZ2V0KTsKCQkJCX0gZWxzZSB7CgkJCQkJdGhpcy5fZW5hYmxlRGF0ZXBpY2tlcih0YXJnZXQpOwoJCQkJfQoJCQl9CgkJCXRoaXMuX2F0dGFjaG1lbnRzKCQodGFyZ2V0KSwgaW5zdCk7CgkJCXRoaXMuX2F1dG9TaXplKGluc3QpOwoJCQl0aGlzLl9zZXREYXRlKGluc3QsIGRhdGUpOwoJCQl0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJfQoJfSwKCgkvLyBjaGFuZ2UgbWV0aG9kIGRlcHJlY2F0ZWQKCV9jaGFuZ2VEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7CgkJdGhpcy5fb3B0aW9uRGF0ZXBpY2tlcih0YXJnZXQsIG5hbWUsIHZhbHVlKTsKCX0sCgoJLyogUmVkcmF3IHRoZSBkYXRlIHBpY2tlciBhdHRhY2hlZCB0byBhbiBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbi4KCSAqIEBwYXJhbSAgdGFyZ2V0ICBlbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKi8KCV9yZWZyZXNoRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKGluc3QpIHsKCQkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCQl9Cgl9LAoKCS8qIFNldCB0aGUgZGF0ZXMgZm9yIGEgalF1ZXJ5IHNlbGVjdGlvbi4KCSAqIEBwYXJhbSAgdGFyZ2V0IGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4KCSAqIEBwYXJhbSAgZGF0ZQlEYXRlIC0gdGhlIG5ldyBkYXRlCgkgKi8KCV9zZXREYXRlRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBkYXRlKSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKGluc3QpIHsKCQkJdGhpcy5fc2V0RGF0ZShpbnN0LCBkYXRlKTsKCQkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCQkJdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGluc3QpOwoJCX0KCX0sCgoJLyogR2V0IHRoZSBkYXRlKHMpIGZvciB0aGUgZmlyc3QgZW50cnkgaW4gYSBqUXVlcnkgc2VsZWN0aW9uLgoJICogQHBhcmFtICB0YXJnZXQgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICogQHBhcmFtICBub0RlZmF1bHQgYm9vbGVhbiAtIHRydWUgaWYgbm8gZGVmYXVsdCBkYXRlIGlzIHRvIGJlIHVzZWQKCSAqIEByZXR1cm4gRGF0ZSAtIHRoZSBjdXJyZW50IGRhdGUKCSAqLwoJX2dldERhdGVEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIG5vRGVmYXVsdCkgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpOwoJCWlmIChpbnN0ICYmICFpbnN0LmlubGluZSkgewoJCQl0aGlzLl9zZXREYXRlRnJvbUZpZWxkKGluc3QsIG5vRGVmYXVsdCk7CgkJfQoJCXJldHVybiAoaW5zdCA/IHRoaXMuX2dldERhdGUoaW5zdCkgOiBudWxsKTsKCX0sCgoJLyogSGFuZGxlIGtleXN0cm9rZXMuICovCglfZG9LZXlEb3duOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBvblNlbGVjdCwgZGF0ZVN0ciwgc2VsLAoJCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCksCgkJCWhhbmRsZWQgPSB0cnVlLAoJCQlpc1JUTCA9IGluc3QuZHBEaXYuaXMoIi51aS1kYXRlcGlja2VyLXJ0bCIpOwoKCQlpbnN0Ll9rZXlFdmVudCA9IHRydWU7CgkJaWYgKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcpIHsKCQkJc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CgkJCQljYXNlIDk6ICQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTsKCQkJCQkJaGFuZGxlZCA9IGZhbHNlOwoJCQkJCQlicmVhazsgLy8gaGlkZSBvbiB0YWIgb3V0CgkJCQljYXNlIDEzOiBzZWwgPSAkKCJ0ZC4iICsgJC5kYXRlcGlja2VyLl9kYXlPdmVyQ2xhc3MgKyAiOm5vdCguIiArCgkJCQkJCQkJCSQuZGF0ZXBpY2tlci5fY3VycmVudENsYXNzICsgIikiLCBpbnN0LmRwRGl2KTsKCQkJCQkJaWYgKHNlbFswXSkgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9zZWxlY3REYXkoZXZlbnQudGFyZ2V0LCBpbnN0LnNlbGVjdGVkTW9udGgsIGluc3Quc2VsZWN0ZWRZZWFyLCBzZWxbMF0pOwoJCQkJCQl9CgoJCQkJCQlvblNlbGVjdCA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJvblNlbGVjdCIpOwoJCQkJCQlpZiAob25TZWxlY3QpIHsKCQkJCQkJCWRhdGVTdHIgPSAkLmRhdGVwaWNrZXIuX2Zvcm1hdERhdGUoaW5zdCk7CgoJCQkJCQkJLy8gdHJpZ2dlciBjdXN0b20gY2FsbGJhY2sKCQkJCQkJCW9uU2VsZWN0LmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLCBbZGF0ZVN0ciwgaW5zdF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJCQkJCQl9CgoJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHN1Ym1pdCB0aGUgZm9ybQoJCQkJY2FzZSAyNzogJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJCQkJCQlicmVhazsgLy8gaGlkZSBvbiBlc2NhcGUKCQkJCWNhc2UgMzM6ICQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChldmVudC5jdHJsS2V5ID8KCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcEJpZ01vbnRocyIpIDoKCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcE1vbnRocyIpKSwgIk0iKTsKCQkJCQkJYnJlYWs7IC8vIHByZXZpb3VzIG1vbnRoL3llYXIgb24gcGFnZSB1cC8rIGN0cmwKCQkJCWNhc2UgMzQ6ICQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChldmVudC5jdHJsS2V5ID8KCQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcEJpZ01vbnRocyIpIDoKCQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcE1vbnRocyIpKSwgIk0iKTsKCQkJCQkJYnJlYWs7IC8vIG5leHQgbW9udGgveWVhciBvbiBwYWdlIGRvd24vKyBjdHJsCgkJCQljYXNlIDM1OiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZShldmVudC50YXJnZXQpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCWJyZWFrOyAvLyBjbGVhciBvbiBjdHJsIG9yIGNvbW1hbmQgK2VuZAoJCQkJY2FzZSAzNjogaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9nb3RvVG9kYXkoZXZlbnQudGFyZ2V0KTsKCQkJCQkJfQoJCQkJCQloYW5kbGVkID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5OwoJCQkJCQlicmVhazsgLy8gY3VycmVudCBvbiBjdHJsIG9yIGNvbW1hbmQgK2hvbWUKCQkJCWNhc2UgMzc6IGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKCQkJCQkJCSQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChpc1JUTCA/ICsxIDogLTEpLCAiRCIpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCS8vIC0xIGRheSBvbiBjdHJsIG9yIGNvbW1hbmQgK2xlZnQKCQkJCQkJaWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQuYWx0S2V5KSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAoZXZlbnQuY3RybEtleSA/CgkJCQkJCQkJLSQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJzdGVwQmlnTW9udGhzIikgOgoJCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcE1vbnRocyIpKSwgIk0iKTsKCQkJCQkJfQoJCQkJCQkvLyBuZXh0IG1vbnRoL3llYXIgb24gYWx0ICtsZWZ0IG9uIE1hYwoJCQkJCQlicmVhazsKCQkJCWNhc2UgMzg6IGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKCQkJCQkJCSQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIC03LCAiRCIpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCWJyZWFrOyAvLyAtMSB3ZWVrIG9uIGN0cmwgb3IgY29tbWFuZCArdXAKCQkJCWNhc2UgMzk6IGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKCQkJCQkJCSQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChpc1JUTCA/IC0xIDogKzEpLCAiRCIpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCS8vICsxIGRheSBvbiBjdHJsIG9yIGNvbW1hbmQgK3JpZ2h0CgkJCQkJCWlmIChldmVudC5vcmlnaW5hbEV2ZW50LmFsdEtleSkgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwgKGV2ZW50LmN0cmxLZXkgPwoJCQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcEJpZ01vbnRocyIpIDoKCQkJCQkJCQkrJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgInN0ZXBNb250aHMiKSksICJNIik7CgkJCQkJCX0KCQkJCQkJLy8gbmV4dCBtb250aC95ZWFyIG9uIGFsdCArcmlnaHQKCQkJCQkJYnJlYWs7CgkJCQljYXNlIDQwOiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCArNywgIkQiKTsKCQkJCQkJfQoJCQkJCQloYW5kbGVkID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5OwoJCQkJCQlicmVhazsgLy8gKzEgd2VlayBvbiBjdHJsIG9yIGNvbW1hbmQgK2Rvd24KCQkJCWRlZmF1bHQ6IGhhbmRsZWQgPSBmYWxzZTsKCQkJfQoJCX0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzYgJiYgZXZlbnQuY3RybEtleSkgeyAvLyBkaXNwbGF5IHRoZSBkYXRlIHBpY2tlciBvbiBjdHJsK2hvbWUKCQkJJC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0aGlzKTsKCQl9IGVsc2UgewoJCQloYW5kbGVkID0gZmFsc2U7CgkJfQoKCQlpZiAoaGFuZGxlZCkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQl9Cgl9LAoKCS8qIEZpbHRlciBlbnRlcmVkIGNoYXJhY3RlcnMgLSBiYXNlZCBvbiBkYXRlIGZvcm1hdC4gKi8KCV9kb0tleVByZXNzOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBjaGFycywgY2hyLAoJCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCk7CgoJCWlmICgkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAiY29uc3RyYWluSW5wdXQiKSkgewoJCQljaGFycyA9ICQuZGF0ZXBpY2tlci5fcG9zc2libGVDaGFycygkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAiZGF0ZUZvcm1hdCIpKTsKCQkJY2hyID0gU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSA9PSBudWxsID8gZXZlbnQua2V5Q29kZSA6IGV2ZW50LmNoYXJDb2RlKTsKCQkJcmV0dXJuIGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCAoY2hyIDwgIiAiIHx8ICFjaGFycyB8fCBjaGFycy5pbmRleE9mKGNocikgPiAtMSk7CgkJfQoJfSwKCgkvKiBTeW5jaHJvbmlzZSBtYW51YWwgZW50cnkgYW5kIGZpZWxkL2FsdGVybmF0ZSBmaWVsZC4gKi8KCV9kb0tleVVwOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBkYXRlLAoJCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCk7CgoJCWlmIChpbnN0LmlucHV0LnZhbCgpICE9PSBpbnN0Lmxhc3RWYWwpIHsKCQkJdHJ5IHsKCQkJCWRhdGUgPSAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJkYXRlRm9ybWF0IiksCgkJCQkJKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0LnZhbCgpIDogbnVsbCksCgkJCQkJJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoaW5zdCkpOwoKCQkJCWlmIChkYXRlKSB7IC8vIG9ubHkgaWYgdmFsaWQKCQkJCQkkLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7CgkJCQkJJC5kYXRlcGlja2VyLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJCQkJJC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCQkJfQoJCQl9CgkJCWNhdGNoIChlcnIpIHsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJLyogUG9wLXVwIHRoZSBkYXRlIHBpY2tlciBmb3IgYSBnaXZlbiBpbnB1dCBmaWVsZC4KCSAqIElmIGZhbHNlIHJldHVybmVkIGZyb20gYmVmb3JlU2hvdyBldmVudCBoYW5kbGVyIGRvIG5vdCBzaG93LgoJICogQHBhcmFtICBpbnB1dCAgZWxlbWVudCAtIHRoZSBpbnB1dCBmaWVsZCBhdHRhY2hlZCB0byB0aGUgZGF0ZSBwaWNrZXIgb3IKCSAqCQkJCQlldmVudCAtIGlmIHRyaWdnZXJlZCBieSBmb2N1cwoJICovCglfc2hvd0RhdGVwaWNrZXI6IGZ1bmN0aW9uKGlucHV0KSB7CgkJaW5wdXQgPSBpbnB1dC50YXJnZXQgfHwgaW5wdXQ7CgkJaWYgKGlucHV0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJpbnB1dCIpIHsgLy8gZmluZCBmcm9tIGJ1dHRvbi9pbWFnZSB0cmlnZ2VyCgkJCWlucHV0ID0gJCgiaW5wdXQiLCBpbnB1dC5wYXJlbnROb2RlKVswXTsKCQl9CgoJCWlmICgkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKGlucHV0KSB8fCAkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCA9PT0gaW5wdXQpIHsgLy8gYWxyZWFkeSBoZXJlCgkJCXJldHVybjsKCQl9CgoJCXZhciBpbnN0LCBiZWZvcmVTaG93LCBiZWZvcmVTaG93U2V0dGluZ3MsIGlzRml4ZWQsCgkJCW9mZnNldCwgc2hvd0FuaW0sIGR1cmF0aW9uOwoKCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGlucHV0KTsKCQlpZiAoJC5kYXRlcGlja2VyLl9jdXJJbnN0ICYmICQuZGF0ZXBpY2tlci5fY3VySW5zdCAhPT0gaW5zdCkgewoJCQkkLmRhdGVwaWNrZXIuX2N1ckluc3QuZHBEaXYuc3RvcCh0cnVlLCB0cnVlKTsKCQkJaWYgKCBpbnN0ICYmICQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgKSB7CgkJCQkkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCAkLmRhdGVwaWNrZXIuX2N1ckluc3QuaW5wdXRbMF0gKTsKCQkJfQoJCX0KCgkJYmVmb3JlU2hvdyA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJiZWZvcmVTaG93Iik7CgkJYmVmb3JlU2hvd1NldHRpbmdzID0gYmVmb3JlU2hvdyA/IGJlZm9yZVNob3cuYXBwbHkoaW5wdXQsIFtpbnB1dCwgaW5zdF0pIDoge307CgkJaWYoYmVmb3JlU2hvd1NldHRpbmdzID09PSBmYWxzZSl7CgkJCXJldHVybjsKCQl9CgkJZXh0ZW5kUmVtb3ZlKGluc3Quc2V0dGluZ3MsIGJlZm9yZVNob3dTZXR0aW5ncyk7CgoJCWluc3QubGFzdFZhbCA9IG51bGw7CgkJJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQgPSBpbnB1dDsKCQkkLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7CgoJCWlmICgkLmRhdGVwaWNrZXIuX2luRGlhbG9nKSB7IC8vIGhpZGUgY3Vyc29yCgkJCWlucHV0LnZhbHVlID0gIiI7CgkJfQoJCWlmICghJC5kYXRlcGlja2VyLl9wb3MpIHsgLy8gcG9zaXRpb24gYmVsb3cgaW5wdXQKCQkJJC5kYXRlcGlja2VyLl9wb3MgPSAkLmRhdGVwaWNrZXIuX2ZpbmRQb3MoaW5wdXQpOwoJCQkkLmRhdGVwaWNrZXIuX3Bvc1sxXSArPSBpbnB1dC5vZmZzZXRIZWlnaHQ7IC8vIGFkZCB0aGUgaGVpZ2h0CgkJfQoKCQlpc0ZpeGVkID0gZmFsc2U7CgkJJChpbnB1dCkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlzRml4ZWQgfD0gJCh0aGlzKS5jc3MoInBvc2l0aW9uIikgPT09ICJmaXhlZCI7CgkJCXJldHVybiAhaXNGaXhlZDsKCQl9KTsKCgkJb2Zmc2V0ID0ge2xlZnQ6ICQuZGF0ZXBpY2tlci5fcG9zWzBdLCB0b3A6ICQuZGF0ZXBpY2tlci5fcG9zWzFdfTsKCQkkLmRhdGVwaWNrZXIuX3BvcyA9IG51bGw7CgkJLy90byBhdm9pZCBmbGFzaGVzIG9uIEZpcmVmb3gKCQlpbnN0LmRwRGl2LmVtcHR5KCk7CgkJLy8gZGV0ZXJtaW5lIHNpemluZyBvZmZzY3JlZW4KCQlpbnN0LmRwRGl2LmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIGRpc3BsYXk6ICJibG9jayIsIHRvcDogIi0xMDAwcHgifSk7CgkJJC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCS8vIGZpeCB3aWR0aCBmb3IgZHluYW1pYyBudW1iZXIgb2YgZGF0ZSBwaWNrZXJzCgkJLy8gYW5kIGFkanVzdCBwb3NpdGlvbiBiZWZvcmUgc2hvd2luZwoJCW9mZnNldCA9ICQuZGF0ZXBpY2tlci5fY2hlY2tPZmZzZXQoaW5zdCwgb2Zmc2V0LCBpc0ZpeGVkKTsKCQlpbnN0LmRwRGl2LmNzcyh7cG9zaXRpb246ICgkLmRhdGVwaWNrZXIuX2luRGlhbG9nICYmICQuYmxvY2tVSSA/CgkJCSJzdGF0aWMiIDogKGlzRml4ZWQgPyAiZml4ZWQiIDogImFic29sdXRlIikpLCBkaXNwbGF5OiAibm9uZSIsCgkJCWxlZnQ6IG9mZnNldC5sZWZ0ICsgInB4IiwgdG9wOiBvZmZzZXQudG9wICsgInB4In0pOwoKCQlpZiAoIWluc3QuaW5saW5lKSB7CgkJCXNob3dBbmltID0gJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgInNob3dBbmltIik7CgkJCWR1cmF0aW9uID0gJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgImR1cmF0aW9uIik7CgkJCWluc3QuZHBEaXYuekluZGV4KCQoaW5wdXQpLnpJbmRleCgpKzEpOwoJCQkkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nID0gdHJ1ZTsKCgkJCWlmICggJC5lZmZlY3RzICYmICQuZWZmZWN0cy5lZmZlY3RbIHNob3dBbmltIF0gKSB7CgkJCQlpbnN0LmRwRGl2LnNob3coc2hvd0FuaW0sICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJzaG93T3B0aW9ucyIpLCBkdXJhdGlvbik7CgkJCX0gZWxzZSB7CgkJCQlpbnN0LmRwRGl2W3Nob3dBbmltIHx8ICJzaG93Il0oc2hvd0FuaW0gPyBkdXJhdGlvbiA6IG51bGwpOwoJCQl9CgoJCQlpZiAoICQuZGF0ZXBpY2tlci5fc2hvdWxkRm9jdXNJbnB1dCggaW5zdCApICkgewoJCQkJaW5zdC5pbnB1dC5mb2N1cygpOwoJCQl9CgoJCQkkLmRhdGVwaWNrZXIuX2N1ckluc3QgPSBpbnN0OwoJCX0KCX0sCgoJLyogR2VuZXJhdGUgdGhlIGRhdGUgcGlja2VyIGNvbnRlbnQuICovCglfdXBkYXRlRGF0ZXBpY2tlcjogZnVuY3Rpb24oaW5zdCkgewoJCXRoaXMubWF4Um93cyA9IDQ7IC8vUmVzZXQgdGhlIG1heCBudW1iZXIgb2Ygcm93cyBiZWluZyBkaXNwbGF5ZWQgKHNlZSAjNzA0MykKCQlpbnN0QWN0aXZlID0gaW5zdDsgLy8gZm9yIGRlbGVnYXRlIGhvdmVyIGV2ZW50cwoJCWluc3QuZHBEaXYuZW1wdHkoKS5hcHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKGluc3QpKTsKCQl0aGlzLl9hdHRhY2hIYW5kbGVycyhpbnN0KTsKCQlpbnN0LmRwRGl2LmZpbmQoIi4iICsgdGhpcy5fZGF5T3ZlckNsYXNzICsgIiBhIikubW91c2VvdmVyKCk7CgoJCXZhciBvcmlneWVhcnNodG1sLAoJCQludW1Nb250aHMgPSB0aGlzLl9nZXROdW1iZXJPZk1vbnRocyhpbnN0KSwKCQkJY29scyA9IG51bU1vbnRoc1sxXSwKCQkJd2lkdGggPSAxNzsKCgkJaW5zdC5kcERpdi5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0yIHVpLWRhdGVwaWNrZXItbXVsdGktMyB1aS1kYXRlcGlja2VyLW11bHRpLTQiKS53aWR0aCgiIik7CgkJaWYgKGNvbHMgPiAxKSB7CgkJCWluc3QuZHBEaXYuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktIiArIGNvbHMpLmNzcygid2lkdGgiLCAod2lkdGggKiBjb2xzKSArICJlbSIpOwoJCX0KCQlpbnN0LmRwRGl2WyhudW1Nb250aHNbMF0gIT09IDEgfHwgbnVtTW9udGhzWzFdICE9PSAxID8gImFkZCIgOiAicmVtb3ZlIikgKwoJCQkiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1tdWx0aSIpOwoJCWluc3QuZHBEaXZbKHRoaXMuX2dldChpbnN0LCAiaXNSVEwiKSA/ICJhZGQiIDogInJlbW92ZSIpICsKCQkJIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItcnRsIik7CgoJCWlmIChpbnN0ID09PSAkLmRhdGVwaWNrZXIuX2N1ckluc3QgJiYgJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyAmJiAkLmRhdGVwaWNrZXIuX3Nob3VsZEZvY3VzSW5wdXQoIGluc3QgKSApIHsKCQkJaW5zdC5pbnB1dC5mb2N1cygpOwoJCX0KCgkJLy8gZGVmZmVyZWQgcmVuZGVyIG9mIHRoZSB5ZWFycyBzZWxlY3QgKHRvIGF2b2lkIGZsYXNoZXMgb24gRmlyZWZveCkKCQlpZiggaW5zdC55ZWFyc2h0bWwgKXsKCQkJb3JpZ3llYXJzaHRtbCA9IGluc3QueWVhcnNodG1sOwoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkvL2Fzc3VyZSB0aGF0IGluc3QueWVhcnNodG1sIGRpZG4ndCBjaGFuZ2UuCgkJCQlpZiggb3JpZ3llYXJzaHRtbCA9PT0gaW5zdC55ZWFyc2h0bWwgJiYgaW5zdC55ZWFyc2h0bWwgKXsKCQkJCQlpbnN0LmRwRGl2LmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLXllYXI6Zmlyc3QiKS5yZXBsYWNlV2l0aChpbnN0LnllYXJzaHRtbCk7CgkJCQl9CgkJCQlvcmlneWVhcnNodG1sID0gaW5zdC55ZWFyc2h0bWwgPSBudWxsOwoJCQl9LCAwKTsKCQl9Cgl9LAoKCS8vICM2Njk0IC0gZG9uJ3QgZm9jdXMgdGhlIGlucHV0IGlmIGl0J3MgYWxyZWFkeSBmb2N1c2VkCgkvLyB0aGlzIGJyZWFrcyB0aGUgY2hhbmdlIGV2ZW50IGluIElFCgkvLyBTdXBwb3J0OiBJRSBhbmQgalF1ZXJ5IDwxLjkKCV9zaG91bGRGb2N1c0lucHV0OiBmdW5jdGlvbiggaW5zdCApIHsKCQlyZXR1cm4gaW5zdC5pbnB1dCAmJiBpbnN0LmlucHV0LmlzKCAiOnZpc2libGUiICkgJiYgIWluc3QuaW5wdXQuaXMoICI6ZGlzYWJsZWQiICkgJiYgIWluc3QuaW5wdXQuaXMoICI6Zm9jdXMiICk7Cgl9LAoKCS8qIENoZWNrIHBvc2l0aW9uaW5nIHRvIHJlbWFpbiBvbiBzY3JlZW4uICovCglfY2hlY2tPZmZzZXQ6IGZ1bmN0aW9uKGluc3QsIG9mZnNldCwgaXNGaXhlZCkgewoJCXZhciBkcFdpZHRoID0gaW5zdC5kcERpdi5vdXRlcldpZHRoKCksCgkJCWRwSGVpZ2h0ID0gaW5zdC5kcERpdi5vdXRlckhlaWdodCgpLAoJCQlpbnB1dFdpZHRoID0gaW5zdC5pbnB1dCA/IGluc3QuaW5wdXQub3V0ZXJXaWR0aCgpIDogMCwKCQkJaW5wdXRIZWlnaHQgPSBpbnN0LmlucHV0ID8gaW5zdC5pbnB1dC5vdXRlckhlaWdodCgpIDogMCwKCQkJdmlld1dpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoICsgKGlzRml4ZWQgPyAwIDogJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKSwKCQkJdmlld0hlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgKyAoaXNGaXhlZCA/IDAgOiAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk7CgoJCW9mZnNldC5sZWZ0IC09ICh0aGlzLl9nZXQoaW5zdCwgImlzUlRMIikgPyAoZHBXaWR0aCAtIGlucHV0V2lkdGgpIDogMCk7CgkJb2Zmc2V0LmxlZnQgLT0gKGlzRml4ZWQgJiYgb2Zmc2V0LmxlZnQgPT09IGluc3QuaW5wdXQub2Zmc2V0KCkubGVmdCkgPyAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgOiAwOwoJCW9mZnNldC50b3AgLT0gKGlzRml4ZWQgJiYgb2Zmc2V0LnRvcCA9PT0gKGluc3QuaW5wdXQub2Zmc2V0KCkudG9wICsgaW5wdXRIZWlnaHQpKSA/ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIDogMDsKCgkJLy8gbm93IGNoZWNrIGlmIGRhdGVwaWNrZXIgaXMgc2hvd2luZyBvdXRzaWRlIHdpbmRvdyB2aWV3cG9ydCAtIG1vdmUgdG8gYSBiZXR0ZXIgcGxhY2UgaWYgc28uCgkJb2Zmc2V0LmxlZnQgLT0gTWF0aC5taW4ob2Zmc2V0LmxlZnQsIChvZmZzZXQubGVmdCArIGRwV2lkdGggPiB2aWV3V2lkdGggJiYgdmlld1dpZHRoID4gZHBXaWR0aCkgPwoJCQlNYXRoLmFicyhvZmZzZXQubGVmdCArIGRwV2lkdGggLSB2aWV3V2lkdGgpIDogMCk7CgkJb2Zmc2V0LnRvcCAtPSBNYXRoLm1pbihvZmZzZXQudG9wLCAob2Zmc2V0LnRvcCArIGRwSGVpZ2h0ID4gdmlld0hlaWdodCAmJiB2aWV3SGVpZ2h0ID4gZHBIZWlnaHQpID8KCQkJTWF0aC5hYnMoZHBIZWlnaHQgKyBpbnB1dEhlaWdodCkgOiAwKTsKCgkJcmV0dXJuIG9mZnNldDsKCX0sCgoJLyogRmluZCBhbiBvYmplY3QncyBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuLiAqLwoJX2ZpbmRQb3M6IGZ1bmN0aW9uKG9iaikgewoJCXZhciBwb3NpdGlvbiwKCQkJaW5zdCA9IHRoaXMuX2dldEluc3Qob2JqKSwKCQkJaXNSVEwgPSB0aGlzLl9nZXQoaW5zdCwgImlzUlRMIik7CgoJCXdoaWxlIChvYmogJiYgKG9iai50eXBlID09PSAiaGlkZGVuIiB8fCBvYmoubm9kZVR5cGUgIT09IDEgfHwgJC5leHByLmZpbHRlcnMuaGlkZGVuKG9iaikpKSB7CgkJCW9iaiA9IG9ialtpc1JUTCA/ICJwcmV2aW91c1NpYmxpbmciIDogIm5leHRTaWJsaW5nIl07CgkJfQoKCQlwb3NpdGlvbiA9ICQob2JqKS5vZmZzZXQoKTsKCQlyZXR1cm4gW3Bvc2l0aW9uLmxlZnQsIHBvc2l0aW9uLnRvcF07Cgl9LAoKCS8qIEhpZGUgdGhlIGRhdGUgcGlja2VyIGZyb20gdmlldy4KCSAqIEBwYXJhbSAgaW5wdXQgIGVsZW1lbnQgLSB0aGUgaW5wdXQgZmllbGQgYXR0YWNoZWQgdG8gdGhlIGRhdGUgcGlja2VyCgkgKi8KCV9oaWRlRGF0ZXBpY2tlcjogZnVuY3Rpb24oaW5wdXQpIHsKCQl2YXIgc2hvd0FuaW0sIGR1cmF0aW9uLCBwb3N0UHJvY2Vzcywgb25DbG9zZSwKCQkJaW5zdCA9IHRoaXMuX2N1ckluc3Q7CgoJCWlmICghaW5zdCB8fCAoaW5wdXQgJiYgaW5zdCAhPT0gJC5kYXRhKGlucHV0LCBQUk9QX05BTUUpKSkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAodGhpcy5fZGF0ZXBpY2tlclNob3dpbmcpIHsKCQkJc2hvd0FuaW0gPSB0aGlzLl9nZXQoaW5zdCwgInNob3dBbmltIik7CgkJCWR1cmF0aW9uID0gdGhpcy5fZ2V0KGluc3QsICJkdXJhdGlvbiIpOwoJCQlwb3N0UHJvY2VzcyA9IGZ1bmN0aW9uKCkgewoJCQkJJC5kYXRlcGlja2VyLl90aWR5RGlhbG9nKGluc3QpOwoJCQl9OwoKCQkJLy8gREVQUkVDQVRFRDogYWZ0ZXIgQkMgZm9yIDEuOC54ICQuZWZmZWN0c1sgc2hvd0FuaW0gXSBpcyBub3QgbmVlZGVkCgkJCWlmICggJC5lZmZlY3RzICYmICggJC5lZmZlY3RzLmVmZmVjdFsgc2hvd0FuaW0gXSB8fCAkLmVmZmVjdHNbIHNob3dBbmltIF0gKSApIHsKCQkJCWluc3QuZHBEaXYuaGlkZShzaG93QW5pbSwgJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgInNob3dPcHRpb25zIiksIGR1cmF0aW9uLCBwb3N0UHJvY2Vzcyk7CgkJCX0gZWxzZSB7CgkJCQlpbnN0LmRwRGl2WyhzaG93QW5pbSA9PT0gInNsaWRlRG93biIgPyAic2xpZGVVcCIgOgoJCQkJCShzaG93QW5pbSA9PT0gImZhZGVJbiIgPyAiZmFkZU91dCIgOiAiaGlkZSIpKV0oKHNob3dBbmltID8gZHVyYXRpb24gOiBudWxsKSwgcG9zdFByb2Nlc3MpOwoJCQl9CgoJCQlpZiAoIXNob3dBbmltKSB7CgkJCQlwb3N0UHJvY2VzcygpOwoJCQl9CgkJCXRoaXMuX2RhdGVwaWNrZXJTaG93aW5nID0gZmFsc2U7CgoJCQlvbkNsb3NlID0gdGhpcy5fZ2V0KGluc3QsICJvbkNsb3NlIik7CgkJCWlmIChvbkNsb3NlKSB7CgkJCQlvbkNsb3NlLmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLCBbKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0LnZhbCgpIDogIiIpLCBpbnN0XSk7CgkJCX0KCgkJCXRoaXMuX2xhc3RJbnB1dCA9IG51bGw7CgkJCWlmICh0aGlzLl9pbkRpYWxvZykgewoJCQkJdGhpcy5fZGlhbG9nSW5wdXQuY3NzKHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIGxlZnQ6ICIwIiwgdG9wOiAiLTEwMHB4IiB9KTsKCQkJCWlmICgkLmJsb2NrVUkpIHsKCQkJCQkkLnVuYmxvY2tVSSgpOwoJCQkJCSQoImJvZHkiKS5hcHBlbmQodGhpcy5kcERpdik7CgkJCQl9CgkJCX0KCQkJdGhpcy5faW5EaWFsb2cgPSBmYWxzZTsKCQl9Cgl9LAoKCS8qIFRpZHkgdXAgYWZ0ZXIgYSBkaWFsb2cgZGlzcGxheS4gKi8KCV90aWR5RGlhbG9nOiBmdW5jdGlvbihpbnN0KSB7CgkJaW5zdC5kcERpdi5yZW1vdmVDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcykudW5iaW5kKCIudWktZGF0ZXBpY2tlci1jYWxlbmRhciIpOwoJfSwKCgkvKiBDbG9zZSBkYXRlIHBpY2tlciBpZiBjbGlja2VkIGVsc2V3aGVyZS4gKi8KCV9jaGVja0V4dGVybmFsQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKCEkLmRhdGVwaWNrZXIuX2N1ckluc3QpIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyICR0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCksCgkJCWluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QoJHRhcmdldFswXSk7CgoJCWlmICggKCAoICR0YXJnZXRbMF0uaWQgIT09ICQuZGF0ZXBpY2tlci5fbWFpbkRpdklkICYmCgkJCQkkdGFyZ2V0LnBhcmVudHMoIiMiICsgJC5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aCA9PT0gMCAmJgoJCQkJISR0YXJnZXQuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkgJiYKCQkJCSEkdGFyZ2V0LmNsb3Nlc3QoIi4iICsgJC5kYXRlcGlja2VyLl90cmlnZ2VyQ2xhc3MpLmxlbmd0aCAmJgoJCQkJJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyAmJiAhKCQuZGF0ZXBpY2tlci5faW5EaWFsb2cgJiYgJC5ibG9ja1VJKSApICkgfHwKCQkJKCAkdGFyZ2V0Lmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpICYmICQuZGF0ZXBpY2tlci5fY3VySW5zdCAhPT0gaW5zdCApICkgewoJCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJCX0KCX0sCgoJLyogQWRqdXN0IG9uZSBvZiB0aGUgZGF0ZSBzdWItZmllbGRzLiAqLwoJX2FkanVzdERhdGU6IGZ1bmN0aW9uKGlkLCBvZmZzZXQsIHBlcmlvZCkgewoJCXZhciB0YXJnZXQgPSAkKGlkKSwKCQkJaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCgkJaWYgKHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHRhcmdldFswXSkpIHsKCQkJcmV0dXJuOwoJCX0KCQl0aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0LCBvZmZzZXQgKwoJCQkocGVyaW9kID09PSAiTSIgPyB0aGlzLl9nZXQoaW5zdCwgInNob3dDdXJyZW50QXRQb3MiKSA6IDApLCAvLyB1bmRvIHBvc2l0aW9uaW5nCgkJCXBlcmlvZCk7CgkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCX0sCgoJLyogQWN0aW9uIGZvciBjdXJyZW50IGxpbmsuICovCglfZ290b1RvZGF5OiBmdW5jdGlvbihpZCkgewoJCXZhciBkYXRlLAoJCQl0YXJnZXQgPSAkKGlkKSwKCQkJaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCgkJaWYgKHRoaXMuX2dldChpbnN0LCAiZ290b0N1cnJlbnQiKSAmJiBpbnN0LmN1cnJlbnREYXkpIHsKCQkJaW5zdC5zZWxlY3RlZERheSA9IGluc3QuY3VycmVudERheTsKCQkJaW5zdC5kcmF3TW9udGggPSBpbnN0LnNlbGVjdGVkTW9udGggPSBpbnN0LmN1cnJlbnRNb250aDsKCQkJaW5zdC5kcmF3WWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyID0gaW5zdC5jdXJyZW50WWVhcjsKCQl9IGVsc2UgewoJCQlkYXRlID0gbmV3IERhdGUoKTsKCQkJaW5zdC5zZWxlY3RlZERheSA9IGRhdGUuZ2V0RGF0ZSgpOwoJCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKCQkJaW5zdC5kcmF3WWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwoJCX0KCQl0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7CgkJdGhpcy5fYWRqdXN0RGF0ZSh0YXJnZXQpOwoJfSwKCgkvKiBBY3Rpb24gZm9yIHNlbGVjdGluZyBhIG5ldyBtb250aC95ZWFyLiAqLwoJX3NlbGVjdE1vbnRoWWVhcjogZnVuY3Rpb24oaWQsIHNlbGVjdCwgcGVyaW9kKSB7CgkJdmFyIHRhcmdldCA9ICQoaWQpLAoJCQlpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pOwoKCQlpbnN0WyJzZWxlY3RlZCIgKyAocGVyaW9kID09PSAiTSIgPyAiTW9udGgiIDogIlllYXIiKV0gPQoJCWluc3RbImRyYXciICsgKHBlcmlvZCA9PT0gIk0iID8gIk1vbnRoIiA6ICJZZWFyIildID0KCQkJcGFyc2VJbnQoc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLnZhbHVlLDEwKTsKCgkJdGhpcy5fbm90aWZ5Q2hhbmdlKGluc3QpOwoJCXRoaXMuX2FkanVzdERhdGUodGFyZ2V0KTsKCX0sCgoJLyogQWN0aW9uIGZvciBzZWxlY3RpbmcgYSBkYXkuICovCglfc2VsZWN0RGF5OiBmdW5jdGlvbihpZCwgbW9udGgsIHllYXIsIHRkKSB7CgkJdmFyIGluc3QsCgkJCXRhcmdldCA9ICQoaWQpOwoKCQlpZiAoJCh0ZCkuaGFzQ2xhc3ModGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MpIHx8IHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHRhcmdldFswXSkpIHsKCQkJcmV0dXJuOwoJCX0KCgkJaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCQlpbnN0LnNlbGVjdGVkRGF5ID0gaW5zdC5jdXJyZW50RGF5ID0gJCgiYSIsIHRkKS5odG1sKCk7CgkJaW5zdC5zZWxlY3RlZE1vbnRoID0gaW5zdC5jdXJyZW50TW9udGggPSBtb250aDsKCQlpbnN0LnNlbGVjdGVkWWVhciA9IGluc3QuY3VycmVudFllYXIgPSB5ZWFyOwoJCXRoaXMuX3NlbGVjdERhdGUoaWQsIHRoaXMuX2Zvcm1hdERhdGUoaW5zdCwKCQkJaW5zdC5jdXJyZW50RGF5LCBpbnN0LmN1cnJlbnRNb250aCwgaW5zdC5jdXJyZW50WWVhcikpOwoJfSwKCgkvKiBFcmFzZSB0aGUgaW5wdXQgZmllbGQgYW5kIGhpZGUgdGhlIGRhdGUgcGlja2VyLiAqLwoJX2NsZWFyRGF0ZTogZnVuY3Rpb24oaWQpIHsKCQl2YXIgdGFyZ2V0ID0gJChpZCk7CgkJdGhpcy5fc2VsZWN0RGF0ZSh0YXJnZXQsICIiKTsKCX0sCgoJLyogVXBkYXRlIHRoZSBpbnB1dCBmaWVsZCB3aXRoIHRoZSBzZWxlY3RlZCBkYXRlLiAqLwoJX3NlbGVjdERhdGU6IGZ1bmN0aW9uKGlkLCBkYXRlU3RyKSB7CgkJdmFyIG9uU2VsZWN0LAoJCQl0YXJnZXQgPSAkKGlkKSwKCQkJaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCgkJZGF0ZVN0ciA9IChkYXRlU3RyICE9IG51bGwgPyBkYXRlU3RyIDogdGhpcy5fZm9ybWF0RGF0ZShpbnN0KSk7CgkJaWYgKGluc3QuaW5wdXQpIHsKCQkJaW5zdC5pbnB1dC52YWwoZGF0ZVN0cik7CgkJfQoJCXRoaXMuX3VwZGF0ZUFsdGVybmF0ZShpbnN0KTsKCgkJb25TZWxlY3QgPSB0aGlzLl9nZXQoaW5zdCwgIm9uU2VsZWN0Iik7CgkJaWYgKG9uU2VsZWN0KSB7CgkJCW9uU2VsZWN0LmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLCBbZGF0ZVN0ciwgaW5zdF0pOyAgLy8gdHJpZ2dlciBjdXN0b20gY2FsbGJhY2sKCQl9IGVsc2UgaWYgKGluc3QuaW5wdXQpIHsKCQkJaW5zdC5pbnB1dC50cmlnZ2VyKCJjaGFuZ2UiKTsgLy8gZmlyZSB0aGUgY2hhbmdlIGV2ZW50CgkJfQoKCQlpZiAoaW5zdC5pbmxpbmUpewoJCQl0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCX0gZWxzZSB7CgkJCXRoaXMuX2hpZGVEYXRlcGlja2VyKCk7CgkJCXRoaXMuX2xhc3RJbnB1dCA9IGluc3QuaW5wdXRbMF07CgkJCWlmICh0eXBlb2YoaW5zdC5pbnB1dFswXSkgIT09ICJvYmplY3QiKSB7CgkJCQlpbnN0LmlucHV0LmZvY3VzKCk7IC8vIHJlc3RvcmUgZm9jdXMKCQkJfQoJCQl0aGlzLl9sYXN0SW5wdXQgPSBudWxsOwoJCX0KCX0sCgoJLyogVXBkYXRlIGFueSBhbHRlcm5hdGUgZmllbGQgdG8gc3luY2hyb25pc2Ugd2l0aCB0aGUgbWFpbiBmaWVsZC4gKi8KCV91cGRhdGVBbHRlcm5hdGU6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgYWx0Rm9ybWF0LCBkYXRlLCBkYXRlU3RyLAoJCQlhbHRGaWVsZCA9IHRoaXMuX2dldChpbnN0LCAiYWx0RmllbGQiKTsKCgkJaWYgKGFsdEZpZWxkKSB7IC8vIHVwZGF0ZSBhbHRlcm5hdGUgZmllbGQgdG9vCgkJCWFsdEZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAiYWx0Rm9ybWF0IikgfHwgdGhpcy5fZ2V0KGluc3QsICJkYXRlRm9ybWF0Iik7CgkJCWRhdGUgPSB0aGlzLl9nZXREYXRlKGluc3QpOwoJCQlkYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGFsdEZvcm1hdCwgZGF0ZSwgdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpKTsKCQkJJChhbHRGaWVsZCkuZWFjaChmdW5jdGlvbigpIHsgJCh0aGlzKS52YWwoZGF0ZVN0cik7IH0pOwoJCX0KCX0sCgoJLyogU2V0IGFzIGJlZm9yZVNob3dEYXkgZnVuY3Rpb24gdG8gcHJldmVudCBzZWxlY3Rpb24gb2Ygd2Vla2VuZHMuCgkgKiBAcGFyYW0gIGRhdGUgIERhdGUgLSB0aGUgZGF0ZSB0byBjdXN0b21pc2UKCSAqIEByZXR1cm4gW2Jvb2xlYW4sIHN0cmluZ10gLSBpcyB0aGlzIGRhdGUgc2VsZWN0YWJsZT8sIHdoYXQgaXMgaXRzIENTUyBjbGFzcz8KCSAqLwoJbm9XZWVrZW5kczogZnVuY3Rpb24oZGF0ZSkgewoJCXZhciBkYXkgPSBkYXRlLmdldERheSgpOwoJCXJldHVybiBbKGRheSA+IDAgJiYgZGF5IDwgNiksICIiXTsKCX0sCgoJLyogU2V0IGFzIGNhbGN1bGF0ZVdlZWsgdG8gZGV0ZXJtaW5lIHRoZSB3ZWVrIG9mIHRoZSB5ZWFyIGJhc2VkIG9uIHRoZSBJU08gODYwMSBkZWZpbml0aW9uLgoJICogQHBhcmFtICBkYXRlICBEYXRlIC0gdGhlIGRhdGUgdG8gZ2V0IHRoZSB3ZWVrIGZvcgoJICogQHJldHVybiAgbnVtYmVyIC0gdGhlIG51bWJlciBvZiB0aGUgd2VlayB3aXRoaW4gdGhlIHllYXIgdGhhdCBjb250YWlucyB0aGlzIGRhdGUKCSAqLwoJaXNvODYwMVdlZWs6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgdGltZSwKCQkJY2hlY2tEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpOwoKCQkvLyBGaW5kIFRodXJzZGF5IG9mIHRoaXMgd2VlayBzdGFydGluZyBvbiBNb25kYXkKCQljaGVja0RhdGUuc2V0RGF0ZShjaGVja0RhdGUuZ2V0RGF0ZSgpICsgNCAtIChjaGVja0RhdGUuZ2V0RGF5KCkgfHwgNykpOwoKCQl0aW1lID0gY2hlY2tEYXRlLmdldFRpbWUoKTsKCQljaGVja0RhdGUuc2V0TW9udGgoMCk7IC8vIENvbXBhcmUgd2l0aCBKYW4gMQoJCWNoZWNrRGF0ZS5zZXREYXRlKDEpOwoJCXJldHVybiBNYXRoLmZsb29yKE1hdGgucm91bmQoKHRpbWUgLSBjaGVja0RhdGUpIC8gODY0MDAwMDApIC8gNykgKyAxOwoJfSwKCgkvKiBQYXJzZSBhIHN0cmluZyB2YWx1ZSBpbnRvIGEgZGF0ZSBvYmplY3QuCgkgKiBTZWUgZm9ybWF0RGF0ZSBiZWxvdyBmb3IgdGhlIHBvc3NpYmxlIGZvcm1hdHMuCgkgKgoJICogQHBhcmFtICBmb3JtYXQgc3RyaW5nIC0gdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiB0aGUgZGF0ZQoJICogQHBhcmFtICB2YWx1ZSBzdHJpbmcgLSB0aGUgZGF0ZSBpbiB0aGUgYWJvdmUgZm9ybWF0CgkgKiBAcGFyYW0gIHNldHRpbmdzIE9iamVjdCAtIGF0dHJpYnV0ZXMgaW5jbHVkZToKCSAqCQkJCQlzaG9ydFllYXJDdXRvZmYgIG51bWJlciAtIHRoZSBjdXRvZmYgeWVhciBmb3IgZGV0ZXJtaW5pbmcgdGhlIGNlbnR1cnkgKG9wdGlvbmFsKQoJICoJCQkJCWRheU5hbWVzU2hvcnQJc3RyaW5nWzddIC0gYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIGRheXMgZnJvbSBTdW5kYXkgKG9wdGlvbmFsKQoJICoJCQkJCWRheU5hbWVzCQlzdHJpbmdbN10gLSBuYW1lcyBvZiB0aGUgZGF5cyBmcm9tIFN1bmRheSAob3B0aW9uYWwpCgkgKgkJCQkJbW9udGhOYW1lc1Nob3J0IHN0cmluZ1sxMl0gLSBhYmJyZXZpYXRlZCBuYW1lcyBvZiB0aGUgbW9udGhzIChvcHRpb25hbCkKCSAqCQkJCQltb250aE5hbWVzCQlzdHJpbmdbMTJdIC0gbmFtZXMgb2YgdGhlIG1vbnRocyAob3B0aW9uYWwpCgkgKiBAcmV0dXJuICBEYXRlIC0gdGhlIGV4dHJhY3RlZCBkYXRlIHZhbHVlIG9yIG51bGwgaWYgdmFsdWUgaXMgYmxhbmsKCSAqLwoJcGFyc2VEYXRlOiBmdW5jdGlvbiAoZm9ybWF0LCB2YWx1ZSwgc2V0dGluZ3MpIHsKCQlpZiAoZm9ybWF0ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewoJCQl0aHJvdyAiSW52YWxpZCBhcmd1bWVudHMiOwoJCX0KCgkJdmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAib2JqZWN0IiA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2YWx1ZSArICIiKTsKCQlpZiAodmFsdWUgPT09ICIiKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJdmFyIGlGb3JtYXQsIGRpbSwgZXh0cmEsCgkJCWlWYWx1ZSA9IDAsCgkJCXNob3J0WWVhckN1dG9mZlRlbXAgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5zaG9ydFllYXJDdXRvZmYgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmYsCgkJCXNob3J0WWVhckN1dG9mZiA9ICh0eXBlb2Ygc2hvcnRZZWFyQ3V0b2ZmVGVtcCAhPT0gInN0cmluZyIgPyBzaG9ydFllYXJDdXRvZmZUZW1wIDoKCQkJCW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCArIHBhcnNlSW50KHNob3J0WWVhckN1dG9mZlRlbXAsIDEwKSksCgkJCWRheU5hbWVzU2hvcnQgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXlOYW1lc1Nob3J0IDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCwKCQkJZGF5TmFtZXMgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXlOYW1lcyA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLAoJCQltb250aE5hbWVzU2hvcnQgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5tb250aE5hbWVzU2hvcnQgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQsCgkJCW1vbnRoTmFtZXMgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5tb250aE5hbWVzIDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcywKCQkJeWVhciA9IC0xLAoJCQltb250aCA9IC0xLAoJCQlkYXkgPSAtMSwKCQkJZG95ID0gLTEsCgkJCWxpdGVyYWwgPSBmYWxzZSwKCQkJZGF0ZSwKCQkJLy8gQ2hlY2sgd2hldGhlciBhIGZvcm1hdCBjaGFyYWN0ZXIgaXMgZG91YmxlZAoJCQlsb29rQWhlYWQgPSBmdW5jdGlvbihtYXRjaCkgewoJCQkJdmFyIG1hdGNoZXMgPSAoaUZvcm1hdCArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdC5jaGFyQXQoaUZvcm1hdCArIDEpID09PSBtYXRjaCk7CgkJCQlpZiAobWF0Y2hlcykgewoJCQkJCWlGb3JtYXQrKzsKCQkJCX0KCQkJCXJldHVybiBtYXRjaGVzOwoJCQl9LAoJCQkvLyBFeHRyYWN0IGEgbnVtYmVyIGZyb20gdGhlIHN0cmluZyB2YWx1ZQoJCQlnZXROdW1iZXIgPSBmdW5jdGlvbihtYXRjaCkgewoJCQkJdmFyIGlzRG91YmxlZCA9IGxvb2tBaGVhZChtYXRjaCksCgkJCQkJc2l6ZSA9IChtYXRjaCA9PT0gIkAiID8gMTQgOiAobWF0Y2ggPT09ICIhIiA/IDIwIDoKCQkJCQkobWF0Y2ggPT09ICJ5IiAmJiBpc0RvdWJsZWQgPyA0IDogKG1hdGNoID09PSAibyIgPyAzIDogMikpKSksCgkJCQkJZGlnaXRzID0gbmV3IFJlZ0V4cCgiXlxcZHsxLCIgKyBzaXplICsgIn0iKSwKCQkJCQludW0gPSB2YWx1ZS5zdWJzdHJpbmcoaVZhbHVlKS5tYXRjaChkaWdpdHMpOwoJCQkJaWYgKCFudW0pIHsKCQkJCQl0aHJvdyAiTWlzc2luZyBudW1iZXIgYXQgcG9zaXRpb24gIiArIGlWYWx1ZTsKCQkJCX0KCQkJCWlWYWx1ZSArPSBudW1bMF0ubGVuZ3RoOwoJCQkJcmV0dXJuIHBhcnNlSW50KG51bVswXSwgMTApOwoJCQl9LAoJCQkvLyBFeHRyYWN0IGEgbmFtZSBmcm9tIHRoZSBzdHJpbmcgdmFsdWUgYW5kIGNvbnZlcnQgdG8gYW4gaW5kZXgKCQkJZ2V0TmFtZSA9IGZ1bmN0aW9uKG1hdGNoLCBzaG9ydE5hbWVzLCBsb25nTmFtZXMpIHsKCQkJCXZhciBpbmRleCA9IC0xLAoJCQkJCW5hbWVzID0gJC5tYXAobG9va0FoZWFkKG1hdGNoKSA/IGxvbmdOYW1lcyA6IHNob3J0TmFtZXMsIGZ1bmN0aW9uICh2LCBrKSB7CgkJCQkJCXJldHVybiBbIFtrLCB2XSBdOwoJCQkJCX0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCQkJCQkJcmV0dXJuIC0oYVsxXS5sZW5ndGggLSBiWzFdLmxlbmd0aCk7CgkJCQkJfSk7CgoJCQkJJC5lYWNoKG5hbWVzLCBmdW5jdGlvbiAoaSwgcGFpcikgewoJCQkJCXZhciBuYW1lID0gcGFpclsxXTsKCQkJCQlpZiAodmFsdWUuc3Vic3RyKGlWYWx1ZSwgbmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKSkgewoJCQkJCQlpbmRleCA9IHBhaXJbMF07CgkJCQkJCWlWYWx1ZSArPSBuYW1lLmxlbmd0aDsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0pOwoJCQkJaWYgKGluZGV4ICE9PSAtMSkgewoJCQkJCXJldHVybiBpbmRleCArIDE7CgkJCQl9IGVsc2UgewoJCQkJCXRocm93ICJVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gIiArIGlWYWx1ZTsKCQkJCX0KCQkJfSwKCQkJLy8gQ29uZmlybSB0aGF0IGEgbGl0ZXJhbCBjaGFyYWN0ZXIgbWF0Y2hlcyB0aGUgc3RyaW5nIHZhbHVlCgkJCWNoZWNrTGl0ZXJhbCA9IGZ1bmN0aW9uKCkgewoJCQkJaWYgKHZhbHVlLmNoYXJBdChpVmFsdWUpICE9PSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpKSB7CgkJCQkJdGhyb3cgIlVuZXhwZWN0ZWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiAiICsgaVZhbHVlOwoJCQkJfQoJCQkJaVZhbHVlKys7CgkJCX07CgoJCWZvciAoaUZvcm1hdCA9IDA7IGlGb3JtYXQgPCBmb3JtYXQubGVuZ3RoOyBpRm9ybWF0KyspIHsKCQkJaWYgKGxpdGVyYWwpIHsKCQkJCWlmIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpID09PSAiJyIgJiYgIWxvb2tBaGVhZCgiJyIpKSB7CgkJCQkJbGl0ZXJhbCA9IGZhbHNlOwoJCQkJfSBlbHNlIHsKCQkJCQljaGVja0xpdGVyYWwoKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXN3aXRjaCAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkgewoJCQkJCWNhc2UgImQiOgoJCQkJCQlkYXkgPSBnZXROdW1iZXIoImQiKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiRCI6CgkJCQkJCWdldE5hbWUoIkQiLCBkYXlOYW1lc1Nob3J0LCBkYXlOYW1lcyk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIm8iOgoJCQkJCQlkb3kgPSBnZXROdW1iZXIoIm8iKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAibSI6CgkJCQkJCW1vbnRoID0gZ2V0TnVtYmVyKCJtIik7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIk0iOgoJCQkJCQltb250aCA9IGdldE5hbWUoIk0iLCBtb250aE5hbWVzU2hvcnQsIG1vbnRoTmFtZXMpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICJ5IjoKCQkJCQkJeWVhciA9IGdldE51bWJlcigieSIpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICJAIjoKCQkJCQkJZGF0ZSA9IG5ldyBEYXRlKGdldE51bWJlcigiQCIpKTsKCQkJCQkJeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKCQkJCQkJbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxOwoJCQkJCQlkYXkgPSBkYXRlLmdldERhdGUoKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiISI6CgkJCQkJCWRhdGUgPSBuZXcgRGF0ZSgoZ2V0TnVtYmVyKCIhIikgLSB0aGlzLl90aWNrc1RvMTk3MCkgLyAxMDAwMCk7CgkJCQkJCXllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CgkJCQkJCW1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTsKCQkJCQkJZGF5ID0gZGF0ZS5nZXREYXRlKCk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIiciOgoJCQkJCQlpZiAobG9va0FoZWFkKCInIikpewoJCQkJCQkJY2hlY2tMaXRlcmFsKCk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlsaXRlcmFsID0gdHJ1ZTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQljaGVja0xpdGVyYWwoKTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKGlWYWx1ZSA8IHZhbHVlLmxlbmd0aCl7CgkJCWV4dHJhID0gdmFsdWUuc3Vic3RyKGlWYWx1ZSk7CgkJCWlmICghL15ccysvLnRlc3QoZXh0cmEpKSB7CgkJCQl0aHJvdyAiRXh0cmEvdW5wYXJzZWQgY2hhcmFjdGVycyBmb3VuZCBpbiBkYXRlOiAiICsgZXh0cmE7CgkJCX0KCQl9CgoJCWlmICh5ZWFyID09PSAtMSkgewoJCQl5ZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpOwoJCX0gZWxzZSBpZiAoeWVhciA8IDEwMCkgewoJCQl5ZWFyICs9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCArCgkJCQkoeWVhciA8PSBzaG9ydFllYXJDdXRvZmYgPyAwIDogLTEwMCk7CgkJfQoKCQlpZiAoZG95ID4gLTEpIHsKCQkJbW9udGggPSAxOwoJCQlkYXkgPSBkb3k7CgkJCWRvIHsKCQkJCWRpbSA9IHRoaXMuX2dldERheXNJbk1vbnRoKHllYXIsIG1vbnRoIC0gMSk7CgkJCQlpZiAoZGF5IDw9IGRpbSkgewoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJbW9udGgrKzsKCQkJCWRheSAtPSBkaW07CgkJCX0gd2hpbGUgKHRydWUpOwoJCX0KCgkJZGF0ZSA9IHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KSk7CgkJaWYgKGRhdGUuZ2V0RnVsbFllYXIoKSAhPT0geWVhciB8fCBkYXRlLmdldE1vbnRoKCkgKyAxICE9PSBtb250aCB8fCBkYXRlLmdldERhdGUoKSAhPT0gZGF5KSB7CgkJCXRocm93ICJJbnZhbGlkIGRhdGUiOyAvLyBFLmcuIDMxLzAyLzAwCgkJfQoJCXJldHVybiBkYXRlOwoJfSwKCgkvKiBTdGFuZGFyZCBkYXRlIGZvcm1hdHMuICovCglBVE9NOiAieXktbW0tZGQiLCAvLyBSRkMgMzMzOSAoSVNPIDg2MDEpCglDT09LSUU6ICJELCBkZCBNIHl5IiwKCUlTT184NjAxOiAieXktbW0tZGQiLAoJUkZDXzgyMjogIkQsIGQgTSB5IiwKCVJGQ184NTA6ICJERCwgZGQtTS15IiwKCVJGQ18xMDM2OiAiRCwgZCBNIHkiLAoJUkZDXzExMjM6ICJELCBkIE0geXkiLAoJUkZDXzI4MjI6ICJELCBkIE0geXkiLAoJUlNTOiAiRCwgZCBNIHkiLCAvLyBSRkMgODIyCglUSUNLUzogIiEiLAoJVElNRVNUQU1QOiAiQCIsCglXM0M6ICJ5eS1tbS1kZCIsIC8vIElTTyA4NjAxCgoJX3RpY2tzVG8xOTcwOiAoKCgxOTcwIC0gMSkgKiAzNjUgKyBNYXRoLmZsb29yKDE5NzAgLyA0KSAtIE1hdGguZmxvb3IoMTk3MCAvIDEwMCkgKwoJCU1hdGguZmxvb3IoMTk3MCAvIDQwMCkpICogMjQgKiA2MCAqIDYwICogMTAwMDAwMDApLAoKCS8qIEZvcm1hdCBhIGRhdGUgb2JqZWN0IGludG8gYSBzdHJpbmcgdmFsdWUuCgkgKiBUaGUgZm9ybWF0IGNhbiBiZSBjb21iaW5hdGlvbnMgb2YgdGhlIGZvbGxvd2luZzoKCSAqIGQgIC0gZGF5IG9mIG1vbnRoIChubyBsZWFkaW5nIHplcm8pCgkgKiBkZCAtIGRheSBvZiBtb250aCAodHdvIGRpZ2l0KQoJICogbyAgLSBkYXkgb2YgeWVhciAobm8gbGVhZGluZyB6ZXJvcykKCSAqIG9vIC0gZGF5IG9mIHllYXIgKHRocmVlIGRpZ2l0KQoJICogRCAgLSBkYXkgbmFtZSBzaG9ydAoJICogREQgLSBkYXkgbmFtZSBsb25nCgkgKiBtICAtIG1vbnRoIG9mIHllYXIgKG5vIGxlYWRpbmcgemVybykKCSAqIG1tIC0gbW9udGggb2YgeWVhciAodHdvIGRpZ2l0KQoJICogTSAgLSBtb250aCBuYW1lIHNob3J0CgkgKiBNTSAtIG1vbnRoIG5hbWUgbG9uZwoJICogeSAgLSB5ZWFyICh0d28gZGlnaXQpCgkgKiB5eSAtIHllYXIgKGZvdXIgZGlnaXQpCgkgKiBAIC0gVW5peCB0aW1lc3RhbXAgKG1zIHNpbmNlIDAxLzAxLzE5NzApCgkgKiAhIC0gV2luZG93cyB0aWNrcyAoMTAwbnMgc2luY2UgMDEvMDEvMDAwMSkKCSAqICIuLi4iIC0gbGl0ZXJhbCB0ZXh0CgkgKiAnJyAtIHNpbmdsZSBxdW90ZQoJICoKCSAqIEBwYXJhbSAgZm9ybWF0IHN0cmluZyAtIHRoZSBkZXNpcmVkIGZvcm1hdCBvZiB0aGUgZGF0ZQoJICogQHBhcmFtICBkYXRlIERhdGUgLSB0aGUgZGF0ZSB2YWx1ZSB0byBmb3JtYXQKCSAqIEBwYXJhbSAgc2V0dGluZ3MgT2JqZWN0IC0gYXR0cmlidXRlcyBpbmNsdWRlOgoJICoJCQkJCWRheU5hbWVzU2hvcnQJc3RyaW5nWzddIC0gYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIGRheXMgZnJvbSBTdW5kYXkgKG9wdGlvbmFsKQoJICoJCQkJCWRheU5hbWVzCQlzdHJpbmdbN10gLSBuYW1lcyBvZiB0aGUgZGF5cyBmcm9tIFN1bmRheSAob3B0aW9uYWwpCgkgKgkJCQkJbW9udGhOYW1lc1Nob3J0IHN0cmluZ1sxMl0gLSBhYmJyZXZpYXRlZCBuYW1lcyBvZiB0aGUgbW9udGhzIChvcHRpb25hbCkKCSAqCQkJCQltb250aE5hbWVzCQlzdHJpbmdbMTJdIC0gbmFtZXMgb2YgdGhlIG1vbnRocyAob3B0aW9uYWwpCgkgKiBAcmV0dXJuICBzdHJpbmcgLSB0aGUgZGF0ZSBpbiB0aGUgYWJvdmUgZm9ybWF0CgkgKi8KCWZvcm1hdERhdGU6IGZ1bmN0aW9uIChmb3JtYXQsIGRhdGUsIHNldHRpbmdzKSB7CgkJaWYgKCFkYXRlKSB7CgkJCXJldHVybiAiIjsKCQl9CgoJCXZhciBpRm9ybWF0LAoJCQlkYXlOYW1lc1Nob3J0ID0gKHNldHRpbmdzID8gc2V0dGluZ3MuZGF5TmFtZXNTaG9ydCA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQsCgkJCWRheU5hbWVzID0gKHNldHRpbmdzID8gc2V0dGluZ3MuZGF5TmFtZXMgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5kYXlOYW1lcywKCQkJbW9udGhOYW1lc1Nob3J0ID0gKHNldHRpbmdzID8gc2V0dGluZ3MubW9udGhOYW1lc1Nob3J0IDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LAoJCQltb250aE5hbWVzID0gKHNldHRpbmdzID8gc2V0dGluZ3MubW9udGhOYW1lcyA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXMsCgkJCS8vIENoZWNrIHdoZXRoZXIgYSBmb3JtYXQgY2hhcmFjdGVyIGlzIGRvdWJsZWQKCQkJbG9va0FoZWFkID0gZnVuY3Rpb24obWF0Y2gpIHsKCQkJCXZhciBtYXRjaGVzID0gKGlGb3JtYXQgKyAxIDwgZm9ybWF0Lmxlbmd0aCAmJiBmb3JtYXQuY2hhckF0KGlGb3JtYXQgKyAxKSA9PT0gbWF0Y2gpOwoJCQkJaWYgKG1hdGNoZXMpIHsKCQkJCQlpRm9ybWF0Kys7CgkJCQl9CgkJCQlyZXR1cm4gbWF0Y2hlczsKCQkJfSwKCQkJLy8gRm9ybWF0IGEgbnVtYmVyLCB3aXRoIGxlYWRpbmcgemVybyBpZiBuZWNlc3NhcnkKCQkJZm9ybWF0TnVtYmVyID0gZnVuY3Rpb24obWF0Y2gsIHZhbHVlLCBsZW4pIHsKCQkJCXZhciBudW0gPSAiIiArIHZhbHVlOwoJCQkJaWYgKGxvb2tBaGVhZChtYXRjaCkpIHsKCQkJCQl3aGlsZSAobnVtLmxlbmd0aCA8IGxlbikgewoJCQkJCQludW0gPSAiMCIgKyBudW07CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIG51bTsKCQkJfSwKCQkJLy8gRm9ybWF0IGEgbmFtZSwgc2hvcnQgb3IgbG9uZyBhcyByZXF1ZXN0ZWQKCQkJZm9ybWF0TmFtZSA9IGZ1bmN0aW9uKG1hdGNoLCB2YWx1ZSwgc2hvcnROYW1lcywgbG9uZ05hbWVzKSB7CgkJCQlyZXR1cm4gKGxvb2tBaGVhZChtYXRjaCkgPyBsb25nTmFtZXNbdmFsdWVdIDogc2hvcnROYW1lc1t2YWx1ZV0pOwoJCQl9LAoJCQlvdXRwdXQgPSAiIiwKCQkJbGl0ZXJhbCA9IGZhbHNlOwoKCQlpZiAoZGF0ZSkgewoJCQlmb3IgKGlGb3JtYXQgPSAwOyBpRm9ybWF0IDwgZm9ybWF0Lmxlbmd0aDsgaUZvcm1hdCsrKSB7CgkJCQlpZiAobGl0ZXJhbCkgewoJCQkJCWlmIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpID09PSAiJyIgJiYgIWxvb2tBaGVhZCgiJyIpKSB7CgkJCQkJCWxpdGVyYWwgPSBmYWxzZTsKCQkJCQl9IGVsc2UgewoJCQkJCQlvdXRwdXQgKz0gZm9ybWF0LmNoYXJBdChpRm9ybWF0KTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXN3aXRjaCAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkgewoJCQkJCQljYXNlICJkIjoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROdW1iZXIoImQiLCBkYXRlLmdldERhdGUoKSwgMik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAiRCI6CgkJCQkJCQlvdXRwdXQgKz0gZm9ybWF0TmFtZSgiRCIsIGRhdGUuZ2V0RGF5KCksIGRheU5hbWVzU2hvcnQsIGRheU5hbWVzKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICJvIjoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROdW1iZXIoIm8iLAoJCQkJCQkJCU1hdGgucm91bmQoKG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAwKS5nZXRUaW1lKCkpIC8gODY0MDAwMDApLCAzKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICJtIjoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROdW1iZXIoIm0iLCBkYXRlLmdldE1vbnRoKCkgKyAxLCAyKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICJNIjoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROYW1lKCJNIiwgZGF0ZS5nZXRNb250aCgpLCBtb250aE5hbWVzU2hvcnQsIG1vbnRoTmFtZXMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgInkiOgoJCQkJCQkJb3V0cHV0ICs9IChsb29rQWhlYWQoInkiKSA/IGRhdGUuZ2V0RnVsbFllYXIoKSA6CgkJCQkJCQkJKGRhdGUuZ2V0WWVhcigpICUgMTAwIDwgMTAgPyAiMCIgOiAiIikgKyBkYXRlLmdldFllYXIoKSAlIDEwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAiQCI6CgkJCQkJCQlvdXRwdXQgKz0gZGF0ZS5nZXRUaW1lKCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAiISI6CgkJCQkJCQlvdXRwdXQgKz0gZGF0ZS5nZXRUaW1lKCkgKiAxMDAwMCArIHRoaXMuX3RpY2tzVG8xOTcwOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgIiciOgoJCQkJCQkJaWYgKGxvb2tBaGVhZCgiJyIpKSB7CgkJCQkJCQkJb3V0cHV0ICs9ICInIjsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJbGl0ZXJhbCA9IHRydWU7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gb3V0cHV0OwoJfSwKCgkvKiBFeHRyYWN0IGFsbCBwb3NzaWJsZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGRhdGUgZm9ybWF0LiAqLwoJX3Bvc3NpYmxlQ2hhcnM6IGZ1bmN0aW9uIChmb3JtYXQpIHsKCQl2YXIgaUZvcm1hdCwKCQkJY2hhcnMgPSAiIiwKCQkJbGl0ZXJhbCA9IGZhbHNlLAoJCQkvLyBDaGVjayB3aGV0aGVyIGEgZm9ybWF0IGNoYXJhY3RlciBpcyBkb3VibGVkCgkJCWxvb2tBaGVhZCA9IGZ1bmN0aW9uKG1hdGNoKSB7CgkJCQl2YXIgbWF0Y2hlcyA9IChpRm9ybWF0ICsgMSA8IGZvcm1hdC5sZW5ndGggJiYgZm9ybWF0LmNoYXJBdChpRm9ybWF0ICsgMSkgPT09IG1hdGNoKTsKCQkJCWlmIChtYXRjaGVzKSB7CgkJCQkJaUZvcm1hdCsrOwoJCQkJfQoJCQkJcmV0dXJuIG1hdGNoZXM7CgkJCX07CgoJCWZvciAoaUZvcm1hdCA9IDA7IGlGb3JtYXQgPCBmb3JtYXQubGVuZ3RoOyBpRm9ybWF0KyspIHsKCQkJaWYgKGxpdGVyYWwpIHsKCQkJCWlmIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpID09PSAiJyIgJiYgIWxvb2tBaGVhZCgiJyIpKSB7CgkJCQkJbGl0ZXJhbCA9IGZhbHNlOwoJCQkJfSBlbHNlIHsKCQkJCQljaGFycyArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJc3dpdGNoIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpKSB7CgkJCQkJY2FzZSAiZCI6IGNhc2UgIm0iOiBjYXNlICJ5IjogY2FzZSAiQCI6CgkJCQkJCWNoYXJzICs9ICIwMTIzNDU2Nzg5IjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiRCI6IGNhc2UgIk0iOgoJCQkJCQlyZXR1cm4gbnVsbDsgLy8gQWNjZXB0IGFueXRoaW5nCgkJCQkJY2FzZSAiJyI6CgkJCQkJCWlmIChsb29rQWhlYWQoIiciKSkgewoJCQkJCQkJY2hhcnMgKz0gIiciOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJbGl0ZXJhbCA9IHRydWU7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJY2hhcnMgKz0gZm9ybWF0LmNoYXJBdChpRm9ybWF0KTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gY2hhcnM7Cgl9LAoKCS8qIEdldCBhIHNldHRpbmcgdmFsdWUsIGRlZmF1bHRpbmcgaWYgbmVjZXNzYXJ5LiAqLwoJX2dldDogZnVuY3Rpb24oaW5zdCwgbmFtZSkgewoJCXJldHVybiBpbnN0LnNldHRpbmdzW25hbWVdICE9PSB1bmRlZmluZWQgPwoJCQlpbnN0LnNldHRpbmdzW25hbWVdIDogdGhpcy5fZGVmYXVsdHNbbmFtZV07Cgl9LAoKCS8qIFBhcnNlIGV4aXN0aW5nIGRhdGUgYW5kIGluaXRpYWxpc2UgZGF0ZSBwaWNrZXIuICovCglfc2V0RGF0ZUZyb21GaWVsZDogZnVuY3Rpb24oaW5zdCwgbm9EZWZhdWx0KSB7CgkJaWYgKGluc3QuaW5wdXQudmFsKCkgPT09IGluc3QubGFzdFZhbCkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgZGF0ZUZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAiZGF0ZUZvcm1hdCIpLAoJCQlkYXRlcyA9IGluc3QubGFzdFZhbCA9IGluc3QuaW5wdXQgPyBpbnN0LmlucHV0LnZhbCgpIDogbnVsbCwKCQkJZGVmYXVsdERhdGUgPSB0aGlzLl9nZXREZWZhdWx0RGF0ZShpbnN0KSwKCQkJZGF0ZSA9IGRlZmF1bHREYXRlLAoJCQlzZXR0aW5ncyA9IHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KTsKCgkJdHJ5IHsKCQkJZGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGVGb3JtYXQsIGRhdGVzLCBzZXR0aW5ncykgfHwgZGVmYXVsdERhdGU7CgkJfSBjYXRjaCAoZXZlbnQpIHsKCQkJZGF0ZXMgPSAobm9EZWZhdWx0ID8gIiIgOiBkYXRlcyk7CgkJfQoJCWluc3Quc2VsZWN0ZWREYXkgPSBkYXRlLmdldERhdGUoKTsKCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKCQlpbnN0LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CgkJaW5zdC5jdXJyZW50RGF5ID0gKGRhdGVzID8gZGF0ZS5nZXREYXRlKCkgOiAwKTsKCQlpbnN0LmN1cnJlbnRNb250aCA9IChkYXRlcyA/IGRhdGUuZ2V0TW9udGgoKSA6IDApOwoJCWluc3QuY3VycmVudFllYXIgPSAoZGF0ZXMgPyBkYXRlLmdldEZ1bGxZZWFyKCkgOiAwKTsKCQl0aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0KTsKCX0sCgoJLyogUmV0cmlldmUgdGhlIGRlZmF1bHQgZGF0ZSBzaG93biBvbiBvcGVuaW5nLiAqLwoJX2dldERlZmF1bHREYXRlOiBmdW5jdGlvbihpbnN0KSB7CgkJcmV0dXJuIHRoaXMuX3Jlc3RyaWN0TWluTWF4KGluc3QsCgkJCXRoaXMuX2RldGVybWluZURhdGUoaW5zdCwgdGhpcy5fZ2V0KGluc3QsICJkZWZhdWx0RGF0ZSIpLCBuZXcgRGF0ZSgpKSk7Cgl9LAoKCS8qIEEgZGF0ZSBtYXkgYmUgc3BlY2lmaWVkIGFzIGFuIGV4YWN0IHZhbHVlIG9yIGEgcmVsYXRpdmUgb25lLiAqLwoJX2RldGVybWluZURhdGU6IGZ1bmN0aW9uKGluc3QsIGRhdGUsIGRlZmF1bHREYXRlKSB7CgkJdmFyIG9mZnNldE51bWVyaWMgPSBmdW5jdGlvbihvZmZzZXQpIHsKCQkJCXZhciBkYXRlID0gbmV3IERhdGUoKTsKCQkJCWRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIG9mZnNldCk7CgkJCQlyZXR1cm4gZGF0ZTsKCQkJfSwKCQkJb2Zmc2V0U3RyaW5nID0gZnVuY3Rpb24ob2Zmc2V0KSB7CgkJCQl0cnkgewoJCQkJCXJldHVybiAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJkYXRlRm9ybWF0IiksCgkJCQkJCW9mZnNldCwgJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoaW5zdCkpOwoJCQkJfQoJCQkJY2F0Y2ggKGUpIHsKCQkJCQkvLyBJZ25vcmUKCQkJCX0KCgkJCQl2YXIgZGF0ZSA9IChvZmZzZXQudG9Mb3dlckNhc2UoKS5tYXRjaCgvXmMvKSA/CgkJCQkJJC5kYXRlcGlja2VyLl9nZXREYXRlKGluc3QpIDogbnVsbCkgfHwgbmV3IERhdGUoKSwKCQkJCQl5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpLAoJCQkJCW1vbnRoID0gZGF0ZS5nZXRNb250aCgpLAoJCQkJCWRheSA9IGRhdGUuZ2V0RGF0ZSgpLAoJCQkJCXBhdHRlcm4gPSAvKFsrXC1dP1swLTldKylccyooZHxEfHd8V3xtfE18eXxZKT8vZywKCQkJCQltYXRjaGVzID0gcGF0dGVybi5leGVjKG9mZnNldCk7CgoJCQkJd2hpbGUgKG1hdGNoZXMpIHsKCQkJCQlzd2l0Y2ggKG1hdGNoZXNbMl0gfHwgImQiKSB7CgkJCQkJCWNhc2UgImQiIDogY2FzZSAiRCIgOgoJCQkJCQkJZGF5ICs9IHBhcnNlSW50KG1hdGNoZXNbMV0sMTApOyBicmVhazsKCQkJCQkJY2FzZSAidyIgOiBjYXNlICJXIiA6CgkJCQkJCQlkYXkgKz0gcGFyc2VJbnQobWF0Y2hlc1sxXSwxMCkgKiA3OyBicmVhazsKCQkJCQkJY2FzZSAibSIgOiBjYXNlICJNIiA6CgkJCQkJCQltb250aCArPSBwYXJzZUludChtYXRjaGVzWzFdLDEwKTsKCQkJCQkJCWRheSA9IE1hdGgubWluKGRheSwgJC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgInkiOiBjYXNlICJZIiA6CgkJCQkJCQl5ZWFyICs9IHBhcnNlSW50KG1hdGNoZXNbMV0sMTApOwoJCQkJCQkJZGF5ID0gTWF0aC5taW4oZGF5LCAkLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSk7CgkJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJbWF0Y2hlcyA9IHBhdHRlcm4uZXhlYyhvZmZzZXQpOwoJCQkJfQoJCQkJcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpOwoJCQl9LAoJCQluZXdEYXRlID0gKGRhdGUgPT0gbnVsbCB8fCBkYXRlID09PSAiIiA/IGRlZmF1bHREYXRlIDogKHR5cGVvZiBkYXRlID09PSAic3RyaW5nIiA/IG9mZnNldFN0cmluZyhkYXRlKSA6CgkJCQkodHlwZW9mIGRhdGUgPT09ICJudW1iZXIiID8gKGlzTmFOKGRhdGUpID8gZGVmYXVsdERhdGUgOiBvZmZzZXROdW1lcmljKGRhdGUpKSA6IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKSkpKTsKCgkJbmV3RGF0ZSA9IChuZXdEYXRlICYmIG5ld0RhdGUudG9TdHJpbmcoKSA9PT0gIkludmFsaWQgRGF0ZSIgPyBkZWZhdWx0RGF0ZSA6IG5ld0RhdGUpOwoJCWlmIChuZXdEYXRlKSB7CgkJCW5ld0RhdGUuc2V0SG91cnMoMCk7CgkJCW5ld0RhdGUuc2V0TWludXRlcygwKTsKCQkJbmV3RGF0ZS5zZXRTZWNvbmRzKDApOwoJCQluZXdEYXRlLnNldE1pbGxpc2Vjb25kcygwKTsKCQl9CgkJcmV0dXJuIHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ld0RhdGUpOwoJfSwKCgkvKiBIYW5kbGUgc3dpdGNoIHRvL2Zyb20gZGF5bGlnaHQgc2F2aW5nLgoJICogSG91cnMgbWF5IGJlIG5vbi16ZXJvIG9uIGRheWxpZ2h0IHNhdmluZyBjdXQtb3ZlcjoKCSAqID4gMTIgd2hlbiBtaWRuaWdodCBjaGFuZ2VvdmVyLCBidXQgdGhlbiBjYW5ub3QgZ2VuZXJhdGUKCSAqIG1pZG5pZ2h0IGRhdGV0aW1lLCBzbyBqdW1wIHRvIDFBTSwgb3RoZXJ3aXNlIHJlc2V0LgoJICogQHBhcmFtICBkYXRlICAoRGF0ZSkgdGhlIGRhdGUgdG8gY2hlY2sKCSAqIEByZXR1cm4gIChEYXRlKSB0aGUgY29ycmVjdGVkIGRhdGUKCSAqLwoJX2RheWxpZ2h0U2F2aW5nQWRqdXN0OiBmdW5jdGlvbihkYXRlKSB7CgkJaWYgKCFkYXRlKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCQlkYXRlLnNldEhvdXJzKGRhdGUuZ2V0SG91cnMoKSA+IDEyID8gZGF0ZS5nZXRIb3VycygpICsgMiA6IDApOwoJCXJldHVybiBkYXRlOwoJfSwKCgkvKiBTZXQgdGhlIGRhdGUocykgZGlyZWN0bHkuICovCglfc2V0RGF0ZTogZnVuY3Rpb24oaW5zdCwgZGF0ZSwgbm9DaGFuZ2UpIHsKCQl2YXIgY2xlYXIgPSAhZGF0ZSwKCQkJb3JpZ01vbnRoID0gaW5zdC5zZWxlY3RlZE1vbnRoLAoJCQlvcmlnWWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyLAoJCQluZXdEYXRlID0gdGhpcy5fcmVzdHJpY3RNaW5NYXgoaW5zdCwgdGhpcy5fZGV0ZXJtaW5lRGF0ZShpbnN0LCBkYXRlLCBuZXcgRGF0ZSgpKSk7CgoJCWluc3Quc2VsZWN0ZWREYXkgPSBpbnN0LmN1cnJlbnREYXkgPSBuZXdEYXRlLmdldERhdGUoKTsKCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGluc3QuY3VycmVudE1vbnRoID0gbmV3RGF0ZS5nZXRNb250aCgpOwoJCWluc3QuZHJhd1llYXIgPSBpbnN0LnNlbGVjdGVkWWVhciA9IGluc3QuY3VycmVudFllYXIgPSBuZXdEYXRlLmdldEZ1bGxZZWFyKCk7CgkJaWYgKChvcmlnTW9udGggIT09IGluc3Quc2VsZWN0ZWRNb250aCB8fCBvcmlnWWVhciAhPT0gaW5zdC5zZWxlY3RlZFllYXIpICYmICFub0NoYW5nZSkgewoJCQl0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7CgkJfQoJCXRoaXMuX2FkanVzdEluc3REYXRlKGluc3QpOwoJCWlmIChpbnN0LmlucHV0KSB7CgkJCWluc3QuaW5wdXQudmFsKGNsZWFyID8gIiIgOiB0aGlzLl9mb3JtYXREYXRlKGluc3QpKTsKCQl9Cgl9LAoKCS8qIFJldHJpZXZlIHRoZSBkYXRlKHMpIGRpcmVjdGx5LiAqLwoJX2dldERhdGU6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgc3RhcnREYXRlID0gKCFpbnN0LmN1cnJlbnRZZWFyIHx8IChpbnN0LmlucHV0ICYmIGluc3QuaW5wdXQudmFsKCkgPT09ICIiKSA/IG51bGwgOgoJCQl0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSgKCQkJaW5zdC5jdXJyZW50WWVhciwgaW5zdC5jdXJyZW50TW9udGgsIGluc3QuY3VycmVudERheSkpKTsKCQkJcmV0dXJuIHN0YXJ0RGF0ZTsKCX0sCgoJLyogQXR0YWNoIHRoZSBvbnh4eCBoYW5kbGVycy4gIFRoZXNlIGFyZSBkZWNsYXJlZCBzdGF0aWNhbGx5IHNvCgkgKiB0aGV5IHdvcmsgd2l0aCBzdGF0aWMgY29kZSB0cmFuc2Zvcm1lcnMgbGlrZSBDYWphLgoJICovCglfYXR0YWNoSGFuZGxlcnM6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgc3RlcE1vbnRocyA9IHRoaXMuX2dldChpbnN0LCAic3RlcE1vbnRocyIpLAoJCQlpZCA9ICIjIiArIGluc3QuaWQucmVwbGFjZSggL1xcXFwvZywgIlxcIiApOwoJCWluc3QuZHBEaXYuZmluZCgiW2RhdGEtaGFuZGxlcl0iKS5tYXAoZnVuY3Rpb24gKCkgewoJCQl2YXIgaGFuZGxlciA9IHsKCQkJCXByZXY6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoaWQsIC1zdGVwTW9udGhzLCAiTSIpOwoJCQkJfSwKCQkJCW5leHQ6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoaWQsICtzdGVwTW9udGhzLCAiTSIpOwoJCQkJfSwKCQkJCWhpZGU6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7CgkJCQl9LAoJCQkJdG9kYXk6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShpZCk7CgkJCQl9LAoJCQkJc2VsZWN0RGF5OiBmdW5jdGlvbiAoKSB7CgkJCQkJJC5kYXRlcGlja2VyLl9zZWxlY3REYXkoaWQsICt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1tb250aCIpLCArdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEteWVhciIpLCB0aGlzKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9LAoJCQkJc2VsZWN0TW9udGg6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihpZCwgdGhpcywgIk0iKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9LAoJCQkJc2VsZWN0WWVhcjogZnVuY3Rpb24gKCkgewoJCQkJCSQuZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKGlkLCB0aGlzLCAiWSIpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfTsKCQkJJCh0aGlzKS5iaW5kKHRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWV2ZW50IiksIGhhbmRsZXJbdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtaGFuZGxlciIpXSk7CgkJfSk7Cgl9LAoKCS8qIEdlbmVyYXRlIHRoZSBIVE1MIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGF0ZSBwaWNrZXIuICovCglfZ2VuZXJhdGVIVE1MOiBmdW5jdGlvbihpbnN0KSB7CgkJdmFyIG1heERyYXcsIHByZXZUZXh0LCBwcmV2LCBuZXh0VGV4dCwgbmV4dCwgY3VycmVudFRleHQsIGdvdG9EYXRlLAoJCQljb250cm9scywgYnV0dG9uUGFuZWwsIGZpcnN0RGF5LCBzaG93V2VlaywgZGF5TmFtZXMsIGRheU5hbWVzTWluLAoJCQltb250aE5hbWVzLCBtb250aE5hbWVzU2hvcnQsIGJlZm9yZVNob3dEYXksIHNob3dPdGhlck1vbnRocywKCQkJc2VsZWN0T3RoZXJNb250aHMsIGRlZmF1bHREYXRlLCBodG1sLCBkb3csIHJvdywgZ3JvdXAsIGNvbCwgc2VsZWN0ZWREYXRlLAoJCQljb3JuZXJDbGFzcywgY2FsZW5kZXIsIHRoZWFkLCBkYXksIGRheXNJbk1vbnRoLCBsZWFkRGF5cywgY3VyUm93cywgbnVtUm93cywKCQkJcHJpbnREYXRlLCBkUm93LCB0Ym9keSwgZGF5U2V0dGluZ3MsIG90aGVyTW9udGgsIHVuc2VsZWN0YWJsZSwKCQkJdGVtcERhdGUgPSBuZXcgRGF0ZSgpLAoJCQl0b2RheSA9IHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KAoJCQkJbmV3IERhdGUodGVtcERhdGUuZ2V0RnVsbFllYXIoKSwgdGVtcERhdGUuZ2V0TW9udGgoKSwgdGVtcERhdGUuZ2V0RGF0ZSgpKSksIC8vIGNsZWFyIHRpbWUKCQkJaXNSVEwgPSB0aGlzLl9nZXQoaW5zdCwgImlzUlRMIiksCgkJCXNob3dCdXR0b25QYW5lbCA9IHRoaXMuX2dldChpbnN0LCAic2hvd0J1dHRvblBhbmVsIiksCgkJCWhpZGVJZk5vUHJldk5leHQgPSB0aGlzLl9nZXQoaW5zdCwgImhpZGVJZk5vUHJldk5leHQiKSwKCQkJbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAibmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCIpLAoJCQludW1Nb250aHMgPSB0aGlzLl9nZXROdW1iZXJPZk1vbnRocyhpbnN0KSwKCQkJc2hvd0N1cnJlbnRBdFBvcyA9IHRoaXMuX2dldChpbnN0LCAic2hvd0N1cnJlbnRBdFBvcyIpLAoJCQlzdGVwTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICJzdGVwTW9udGhzIiksCgkJCWlzTXVsdGlNb250aCA9IChudW1Nb250aHNbMF0gIT09IDEgfHwgbnVtTW9udGhzWzFdICE9PSAxKSwKCQkJY3VycmVudERhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdCgoIWluc3QuY3VycmVudERheSA/IG5ldyBEYXRlKDk5OTksIDksIDkpIDoKCQkJCW5ldyBEYXRlKGluc3QuY3VycmVudFllYXIsIGluc3QuY3VycmVudE1vbnRoLCBpbnN0LmN1cnJlbnREYXkpKSksCgkJCW1pbkRhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsICJtaW4iKSwKCQkJbWF4RGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgIm1heCIpLAoJCQlkcmF3TW9udGggPSBpbnN0LmRyYXdNb250aCAtIHNob3dDdXJyZW50QXRQb3MsCgkJCWRyYXdZZWFyID0gaW5zdC5kcmF3WWVhcjsKCgkJaWYgKGRyYXdNb250aCA8IDApIHsKCQkJZHJhd01vbnRoICs9IDEyOwoJCQlkcmF3WWVhci0tOwoJCX0KCQlpZiAobWF4RGF0ZSkgewoJCQltYXhEcmF3ID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobWF4RGF0ZS5nZXRGdWxsWWVhcigpLAoJCQkJbWF4RGF0ZS5nZXRNb250aCgpIC0gKG51bU1vbnRoc1swXSAqIG51bU1vbnRoc1sxXSkgKyAxLCBtYXhEYXRlLmdldERhdGUoKSkpOwoJCQltYXhEcmF3ID0gKG1pbkRhdGUgJiYgbWF4RHJhdyA8IG1pbkRhdGUgPyBtaW5EYXRlIDogbWF4RHJhdyk7CgkJCXdoaWxlICh0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhciwgZHJhd01vbnRoLCAxKSkgPiBtYXhEcmF3KSB7CgkJCQlkcmF3TW9udGgtLTsKCQkJCWlmIChkcmF3TW9udGggPCAwKSB7CgkJCQkJZHJhd01vbnRoID0gMTE7CgkJCQkJZHJhd1llYXItLTsKCQkJCX0KCQkJfQoJCX0KCQlpbnN0LmRyYXdNb250aCA9IGRyYXdNb250aDsKCQlpbnN0LmRyYXdZZWFyID0gZHJhd1llYXI7CgoJCXByZXZUZXh0ID0gdGhpcy5fZ2V0KGluc3QsICJwcmV2VGV4dCIpOwoJCXByZXZUZXh0ID0gKCFuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0ID8gcHJldlRleHQgOiB0aGlzLmZvcm1hdERhdGUocHJldlRleHQsCgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLCBkcmF3TW9udGggLSBzdGVwTW9udGhzLCAxKSksCgkJCXRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoKCQlwcmV2ID0gKHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3QsIC0xLCBkcmF3WWVhciwgZHJhd01vbnRoKSA/CgkJCSI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0ncHJldicgZGF0YS1ldmVudD0nY2xpY2snIiArCgkJCSIgdGl0bGU9JyIgKyBwcmV2VGV4dCArICInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLSIgKyAoIGlzUlRMID8gImUiIDogInciKSArICInPiIgKyBwcmV2VGV4dCArICI8L3NwYW4+PC9hPiIgOgoJCQkoaGlkZUlmTm9QcmV2TmV4dCA/ICIiIDogIjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9JyIrIHByZXZUZXh0ICsiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iICsgKCBpc1JUTCA/ICJlIiA6ICJ3IikgKyAiJz4iICsgcHJldlRleHQgKyAiPC9zcGFuPjwvYT4iKSk7CgoJCW5leHRUZXh0ID0gdGhpcy5fZ2V0KGluc3QsICJuZXh0VGV4dCIpOwoJCW5leHRUZXh0ID0gKCFuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0ID8gbmV4dFRleHQgOiB0aGlzLmZvcm1hdERhdGUobmV4dFRleHQsCgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLCBkcmF3TW9udGggKyBzdGVwTW9udGhzLCAxKSksCgkJCXRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoKCQluZXh0ID0gKHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3QsICsxLCBkcmF3WWVhciwgZHJhd01vbnRoKSA/CgkJCSI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0nbmV4dCcgZGF0YS1ldmVudD0nY2xpY2snIiArCgkJCSIgdGl0bGU9JyIgKyBuZXh0VGV4dCArICInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLSIgKyAoIGlzUlRMID8gInciIDogImUiKSArICInPiIgKyBuZXh0VGV4dCArICI8L3NwYW4+PC9hPiIgOgoJCQkoaGlkZUlmTm9QcmV2TmV4dCA/ICIiIDogIjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9JyIrIG5leHRUZXh0ICsgIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIiArICggaXNSVEwgPyAidyIgOiAiZSIpICsgIic+IiArIG5leHRUZXh0ICsgIjwvc3Bhbj48L2E+IikpOwoKCQljdXJyZW50VGV4dCA9IHRoaXMuX2dldChpbnN0LCAiY3VycmVudFRleHQiKTsKCQlnb3RvRGF0ZSA9ICh0aGlzLl9nZXQoaW5zdCwgImdvdG9DdXJyZW50IikgJiYgaW5zdC5jdXJyZW50RGF5ID8gY3VycmVudERhdGUgOiB0b2RheSk7CgkJY3VycmVudFRleHQgPSAoIW5hdmlnYXRpb25Bc0RhdGVGb3JtYXQgPyBjdXJyZW50VGV4dCA6CgkJCXRoaXMuZm9ybWF0RGF0ZShjdXJyZW50VGV4dCwgZ290b0RhdGUsIHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoKCQljb250cm9scyA9ICghaW5zdC5pbmxpbmUgPyAiPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSd1aS1kYXRlcGlja2VyLWNsb3NlIHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktcHJpbWFyeSB1aS1jb3JuZXItYWxsJyBkYXRhLWhhbmRsZXI9J2hpZGUnIGRhdGEtZXZlbnQ9J2NsaWNrJz4iICsKCQkJdGhpcy5fZ2V0KGluc3QsICJjbG9zZVRleHQiKSArICI8L2J1dHRvbj4iIDogIiIpOwoKCQlidXR0b25QYW5lbCA9IChzaG93QnV0dG9uUGFuZWwpID8gIjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCc+IiArIChpc1JUTCA/IGNvbnRyb2xzIDogIiIpICsKCQkJKHRoaXMuX2lzSW5SYW5nZShpbnN0LCBnb3RvRGF0ZSkgPyAiPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSd1aS1kYXRlcGlja2VyLWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSd0b2RheScgZGF0YS1ldmVudD0nY2xpY2snIiArCgkJCSI+IiArIGN1cnJlbnRUZXh0ICsgIjwvYnV0dG9uPiIgOiAiIikgKyAoaXNSVEwgPyAiIiA6IGNvbnRyb2xzKSArICI8L2Rpdj4iIDogIiI7CgoJCWZpcnN0RGF5ID0gcGFyc2VJbnQodGhpcy5fZ2V0KGluc3QsICJmaXJzdERheSIpLDEwKTsKCQlmaXJzdERheSA9IChpc05hTihmaXJzdERheSkgPyAwIDogZmlyc3REYXkpOwoKCQlzaG93V2VlayA9IHRoaXMuX2dldChpbnN0LCAic2hvd1dlZWsiKTsKCQlkYXlOYW1lcyA9IHRoaXMuX2dldChpbnN0LCAiZGF5TmFtZXMiKTsKCQlkYXlOYW1lc01pbiA9IHRoaXMuX2dldChpbnN0LCAiZGF5TmFtZXNNaW4iKTsKCQltb250aE5hbWVzID0gdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzIik7CgkJbW9udGhOYW1lc1Nob3J0ID0gdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzU2hvcnQiKTsKCQliZWZvcmVTaG93RGF5ID0gdGhpcy5fZ2V0KGluc3QsICJiZWZvcmVTaG93RGF5Iik7CgkJc2hvd090aGVyTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICJzaG93T3RoZXJNb250aHMiKTsKCQlzZWxlY3RPdGhlck1vbnRocyA9IHRoaXMuX2dldChpbnN0LCAic2VsZWN0T3RoZXJNb250aHMiKTsKCQlkZWZhdWx0RGF0ZSA9IHRoaXMuX2dldERlZmF1bHREYXRlKGluc3QpOwoJCWh0bWwgPSAiIjsKCQlkb3c7CgkJZm9yIChyb3cgPSAwOyByb3cgPCBudW1Nb250aHNbMF07IHJvdysrKSB7CgkJCWdyb3VwID0gIiI7CgkJCXRoaXMubWF4Um93cyA9IDQ7CgkJCWZvciAoY29sID0gMDsgY29sIDwgbnVtTW9udGhzWzFdOyBjb2wrKykgewoJCQkJc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsIGRyYXdNb250aCwgaW5zdC5zZWxlY3RlZERheSkpOwoJCQkJY29ybmVyQ2xhc3MgPSAiIHVpLWNvcm5lci1hbGwiOwoJCQkJY2FsZW5kZXIgPSAiIjsKCQkJCWlmIChpc011bHRpTW9udGgpIHsKCQkJCQljYWxlbmRlciArPSAiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1ncm91cCI7CgkJCQkJaWYgKG51bU1vbnRoc1sxXSA+IDEpIHsKCQkJCQkJc3dpdGNoIChjb2wpIHsKCQkJCQkJCWNhc2UgMDogY2FsZW5kZXIgKz0gIiB1aS1kYXRlcGlja2VyLWdyb3VwLWZpcnN0IjsKCQkJCQkJCQljb3JuZXJDbGFzcyA9ICIgdWktY29ybmVyLSIgKyAoaXNSVEwgPyAicmlnaHQiIDogImxlZnQiKTsgYnJlYWs7CgkJCQkJCQljYXNlIG51bU1vbnRoc1sxXS0xOiBjYWxlbmRlciArPSAiIHVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCI7CgkJCQkJCQkJY29ybmVyQ2xhc3MgPSAiIHVpLWNvcm5lci0iICsgKGlzUlRMID8gImxlZnQiIDogInJpZ2h0Iik7IGJyZWFrOwoJCQkJCQkJZGVmYXVsdDogY2FsZW5kZXIgKz0gIiB1aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSI7IGNvcm5lckNsYXNzID0gIiI7IGJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWNhbGVuZGVyICs9ICInPiI7CgkJCQl9CgkJCQljYWxlbmRlciArPSAiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgiICsgY29ybmVyQ2xhc3MgKyAiJz4iICsKCQkJCQkoL2FsbHxsZWZ0Ly50ZXN0KGNvcm5lckNsYXNzKSAmJiByb3cgPT09IDAgPyAoaXNSVEwgPyBuZXh0IDogcHJldikgOiAiIikgKwoJCQkJCSgvYWxsfHJpZ2h0Ly50ZXN0KGNvcm5lckNsYXNzKSAmJiByb3cgPT09IDAgPyAoaXNSVEwgPyBwcmV2IDogbmV4dCkgOiAiIikgKwoJCQkJCXRoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGluc3QsIGRyYXdNb250aCwgZHJhd1llYXIsIG1pbkRhdGUsIG1heERhdGUsCgkJCQkJcm93ID4gMCB8fCBjb2wgPiAwLCBtb250aE5hbWVzLCBtb250aE5hbWVzU2hvcnQpICsgLy8gZHJhdyBtb250aCBoZWFkZXJzCgkJCQkJIjwvZGl2Pjx0YWJsZSBjbGFzcz0ndWktZGF0ZXBpY2tlci1jYWxlbmRhcic+PHRoZWFkPiIgKwoJCQkJCSI8dHI+IjsKCQkJCXRoZWFkID0gKHNob3dXZWVrID8gIjx0aCBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWNvbCc+IiArIHRoaXMuX2dldChpbnN0LCAid2Vla0hlYWRlciIpICsgIjwvdGg+IiA6ICIiKTsKCQkJCWZvciAoZG93ID0gMDsgZG93IDwgNzsgZG93KyspIHsgLy8gZGF5cyBvZiB0aGUgd2VlawoJCQkJCWRheSA9IChkb3cgKyBmaXJzdERheSkgJSA3OwoJCQkJCXRoZWFkICs9ICI8dGgiICsgKChkb3cgKyBmaXJzdERheSArIDYpICUgNyA+PSA1ID8gIiBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWVuZCciIDogIiIpICsgIj4iICsKCQkJCQkJIjxzcGFuIHRpdGxlPSciICsgZGF5TmFtZXNbZGF5XSArICInPiIgKyBkYXlOYW1lc01pbltkYXldICsgIjwvc3Bhbj48L3RoPiI7CgkJCQl9CgkJCQljYWxlbmRlciArPSB0aGVhZCArICI8L3RyPjwvdGhlYWQ+PHRib2R5PiI7CgkJCQlkYXlzSW5Nb250aCA9IHRoaXMuX2dldERheXNJbk1vbnRoKGRyYXdZZWFyLCBkcmF3TW9udGgpOwoJCQkJaWYgKGRyYXdZZWFyID09PSBpbnN0LnNlbGVjdGVkWWVhciAmJiBkcmF3TW9udGggPT09IGluc3Quc2VsZWN0ZWRNb250aCkgewoJCQkJCWluc3Quc2VsZWN0ZWREYXkgPSBNYXRoLm1pbihpbnN0LnNlbGVjdGVkRGF5LCBkYXlzSW5Nb250aCk7CgkJCQl9CgkJCQlsZWFkRGF5cyA9ICh0aGlzLl9nZXRGaXJzdERheU9mTW9udGgoZHJhd1llYXIsIGRyYXdNb250aCkgLSBmaXJzdERheSArIDcpICUgNzsKCQkJCWN1clJvd3MgPSBNYXRoLmNlaWwoKGxlYWREYXlzICsgZGF5c0luTW9udGgpIC8gNyk7IC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gZ2VuZXJhdGUKCQkJCW51bVJvd3MgPSAoaXNNdWx0aU1vbnRoID8gdGhpcy5tYXhSb3dzID4gY3VyUm93cyA/IHRoaXMubWF4Um93cyA6IGN1clJvd3MgOiBjdXJSb3dzKTsgLy9JZiBtdWx0aXBsZSBtb250aHMsIHVzZSB0aGUgaGlnaGVyIG51bWJlciBvZiByb3dzIChzZWUgIzcwNDMpCgkJCQl0aGlzLm1heFJvd3MgPSBudW1Sb3dzOwoJCQkJcHJpbnREYXRlID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsIGRyYXdNb250aCwgMSAtIGxlYWREYXlzKSk7CgkJCQlmb3IgKGRSb3cgPSAwOyBkUm93IDwgbnVtUm93czsgZFJvdysrKSB7IC8vIGNyZWF0ZSBkYXRlIHBpY2tlciByb3dzCgkJCQkJY2FsZW5kZXIgKz0gIjx0cj4iOwoJCQkJCXRib2R5ID0gKCFzaG93V2VlayA/ICIiIDogIjx0ZCBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWNvbCc+IiArCgkJCQkJCXRoaXMuX2dldChpbnN0LCAiY2FsY3VsYXRlV2VlayIpKHByaW50RGF0ZSkgKyAiPC90ZD4iKTsKCQkJCQlmb3IgKGRvdyA9IDA7IGRvdyA8IDc7IGRvdysrKSB7IC8vIGNyZWF0ZSBkYXRlIHBpY2tlciBkYXlzCgkJCQkJCWRheVNldHRpbmdzID0gKGJlZm9yZVNob3dEYXkgPwoJCQkJCQkJYmVmb3JlU2hvd0RheS5hcHBseSgoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXRbMF0gOiBudWxsKSwgW3ByaW50RGF0ZV0pIDogW3RydWUsICIiXSk7CgkJCQkJCW90aGVyTW9udGggPSAocHJpbnREYXRlLmdldE1vbnRoKCkgIT09IGRyYXdNb250aCk7CgkJCQkJCXVuc2VsZWN0YWJsZSA9IChvdGhlck1vbnRoICYmICFzZWxlY3RPdGhlck1vbnRocykgfHwgIWRheVNldHRpbmdzWzBdIHx8CgkJCQkJCQkobWluRGF0ZSAmJiBwcmludERhdGUgPCBtaW5EYXRlKSB8fCAobWF4RGF0ZSAmJiBwcmludERhdGUgPiBtYXhEYXRlKTsKCQkJCQkJdGJvZHkgKz0gIjx0ZCBjbGFzcz0nIiArCgkJCQkJCQkoKGRvdyArIGZpcnN0RGF5ICsgNikgJSA3ID49IDUgPyAiIHVpLWRhdGVwaWNrZXItd2Vlay1lbmQiIDogIiIpICsgLy8gaGlnaGxpZ2h0IHdlZWtlbmRzCgkJCQkJCQkob3RoZXJNb250aCA/ICIgdWktZGF0ZXBpY2tlci1vdGhlci1tb250aCIgOiAiIikgKyAvLyBoaWdobGlnaHQgZGF5cyBmcm9tIG90aGVyIG1vbnRocwoJCQkJCQkJKChwcmludERhdGUuZ2V0VGltZSgpID09PSBzZWxlY3RlZERhdGUuZ2V0VGltZSgpICYmIGRyYXdNb250aCA9PT0gaW5zdC5zZWxlY3RlZE1vbnRoICYmIGluc3QuX2tleUV2ZW50KSB8fCAvLyB1c2VyIHByZXNzZWQga2V5CgkJCQkJCQkoZGVmYXVsdERhdGUuZ2V0VGltZSgpID09PSBwcmludERhdGUuZ2V0VGltZSgpICYmIGRlZmF1bHREYXRlLmdldFRpbWUoKSA9PT0gc2VsZWN0ZWREYXRlLmdldFRpbWUoKSkgPwoJCQkJCQkJLy8gb3IgZGVmYXVsdERhdGUgaXMgY3VycmVudCBwcmludGVkRGF0ZSBhbmQgZGVmYXVsdERhdGUgaXMgc2VsZWN0ZWREYXRlCgkJCQkJCQkiICIgKyB0aGlzLl9kYXlPdmVyQ2xhc3MgOiAiIikgKyAvLyBoaWdobGlnaHQgc2VsZWN0ZWQgZGF5CgkJCQkJCQkodW5zZWxlY3RhYmxlID8gIiAiICsgdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MgKyAiIHVpLXN0YXRlLWRpc2FibGVkIjogIiIpICsgIC8vIGhpZ2hsaWdodCB1bnNlbGVjdGFibGUgZGF5cwoJCQkJCQkJKG90aGVyTW9udGggJiYgIXNob3dPdGhlck1vbnRocyA/ICIiIDogIiAiICsgZGF5U2V0dGluZ3NbMV0gKyAvLyBoaWdobGlnaHQgY3VzdG9tIGRhdGVzCgkJCQkJCQkocHJpbnREYXRlLmdldFRpbWUoKSA9PT0gY3VycmVudERhdGUuZ2V0VGltZSgpID8gIiAiICsgdGhpcy5fY3VycmVudENsYXNzIDogIiIpICsgLy8gaGlnaGxpZ2h0IHNlbGVjdGVkIGRheQoJCQkJCQkJKHByaW50RGF0ZS5nZXRUaW1lKCkgPT09IHRvZGF5LmdldFRpbWUoKSA/ICIgdWktZGF0ZXBpY2tlci10b2RheSIgOiAiIikpICsgIiciICsgLy8gaGlnaGxpZ2h0IHRvZGF5IChpZiBkaWZmZXJlbnQpCgkJCQkJCQkoKCFvdGhlck1vbnRoIHx8IHNob3dPdGhlck1vbnRocykgJiYgZGF5U2V0dGluZ3NbMl0gPyAiIHRpdGxlPSciICsgZGF5U2V0dGluZ3NbMl0ucmVwbGFjZSgvJy9nLCAiJiMzOTsiKSArICInIiA6ICIiKSArIC8vIGNlbGwgdGl0bGUKCQkJCQkJCSh1bnNlbGVjdGFibGUgPyAiIiA6ICIgZGF0YS1oYW5kbGVyPSdzZWxlY3REYXknIGRhdGEtZXZlbnQ9J2NsaWNrJyBkYXRhLW1vbnRoPSciICsgcHJpbnREYXRlLmdldE1vbnRoKCkgKyAiJyBkYXRhLXllYXI9JyIgKyBwcmludERhdGUuZ2V0RnVsbFllYXIoKSArICInIikgKyAiPiIgKyAvLyBhY3Rpb25zCgkJCQkJCQkob3RoZXJNb250aCAmJiAhc2hvd090aGVyTW9udGhzID8gIiYjeGEwOyIgOiAvLyBkaXNwbGF5IGZvciBvdGhlciBtb250aHMKCQkJCQkJCSh1bnNlbGVjdGFibGUgPyAiPHNwYW4gY2xhc3M9J3VpLXN0YXRlLWRlZmF1bHQnPiIgKyBwcmludERhdGUuZ2V0RGF0ZSgpICsgIjwvc3Bhbj4iIDogIjxhIGNsYXNzPSd1aS1zdGF0ZS1kZWZhdWx0IiArCgkJCQkJCQkocHJpbnREYXRlLmdldFRpbWUoKSA9PT0gdG9kYXkuZ2V0VGltZSgpID8gIiB1aS1zdGF0ZS1oaWdobGlnaHQiIDogIiIpICsKCQkJCQkJCShwcmludERhdGUuZ2V0VGltZSgpID09PSBjdXJyZW50RGF0ZS5nZXRUaW1lKCkgPyAiIHVpLXN0YXRlLWFjdGl2ZSIgOiAiIikgKyAvLyBoaWdobGlnaHQgc2VsZWN0ZWQgZGF5CgkJCQkJCQkob3RoZXJNb250aCA/ICIgdWktcHJpb3JpdHktc2Vjb25kYXJ5IiA6ICIiKSArIC8vIGRpc3Rpbmd1aXNoIGRhdGVzIGZyb20gb3RoZXIgbW9udGhzCgkJCQkJCQkiJyBocmVmPScjJz4iICsgcHJpbnREYXRlLmdldERhdGUoKSArICI8L2E+IikpICsgIjwvdGQ+IjsgLy8gZGlzcGxheSBzZWxlY3RhYmxlIGRhdGUKCQkJCQkJcHJpbnREYXRlLnNldERhdGUocHJpbnREYXRlLmdldERhdGUoKSArIDEpOwoJCQkJCQlwcmludERhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChwcmludERhdGUpOwoJCQkJCX0KCQkJCQljYWxlbmRlciArPSB0Ym9keSArICI8L3RyPiI7CgkJCQl9CgkJCQlkcmF3TW9udGgrKzsKCQkJCWlmIChkcmF3TW9udGggPiAxMSkgewoJCQkJCWRyYXdNb250aCA9IDA7CgkJCQkJZHJhd1llYXIrKzsKCQkJCX0KCQkJCWNhbGVuZGVyICs9ICI8L3Rib2R5PjwvdGFibGU+IiArIChpc011bHRpTW9udGggPyAiPC9kaXY+IiArCgkJCQkJCQkoKG51bU1vbnRoc1swXSA+IDAgJiYgY29sID09PSBudW1Nb250aHNbMV0tMSkgPyAiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1yb3ctYnJlYWsnPjwvZGl2PiIgOiAiIikgOiAiIik7CgkJCQlncm91cCArPSBjYWxlbmRlcjsKCQkJfQoJCQlodG1sICs9IGdyb3VwOwoJCX0KCQlodG1sICs9IGJ1dHRvblBhbmVsOwoJCWluc3QuX2tleUV2ZW50ID0gZmFsc2U7CgkJcmV0dXJuIGh0bWw7Cgl9LAoKCS8qIEdlbmVyYXRlIHRoZSBtb250aCBhbmQgeWVhciBoZWFkZXIuICovCglfZ2VuZXJhdGVNb250aFllYXJIZWFkZXI6IGZ1bmN0aW9uKGluc3QsIGRyYXdNb250aCwgZHJhd1llYXIsIG1pbkRhdGUsIG1heERhdGUsCgkJCXNlY29uZGFyeSwgbW9udGhOYW1lcywgbW9udGhOYW1lc1Nob3J0KSB7CgoJCXZhciBpbk1pblllYXIsIGluTWF4WWVhciwgbW9udGgsIHllYXJzLCB0aGlzWWVhciwgZGV0ZXJtaW5lWWVhciwgeWVhciwgZW5kWWVhciwKCQkJY2hhbmdlTW9udGggPSB0aGlzLl9nZXQoaW5zdCwgImNoYW5nZU1vbnRoIiksCgkJCWNoYW5nZVllYXIgPSB0aGlzLl9nZXQoaW5zdCwgImNoYW5nZVllYXIiKSwKCQkJc2hvd01vbnRoQWZ0ZXJZZWFyID0gdGhpcy5fZ2V0KGluc3QsICJzaG93TW9udGhBZnRlclllYXIiKSwKCQkJaHRtbCA9ICI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLXRpdGxlJz4iLAoJCQltb250aEh0bWwgPSAiIjsKCgkJLy8gbW9udGggc2VsZWN0aW9uCgkJaWYgKHNlY29uZGFyeSB8fCAhY2hhbmdlTW9udGgpIHsKCQkJbW9udGhIdG1sICs9ICI8c3BhbiBjbGFzcz0ndWktZGF0ZXBpY2tlci1tb250aCc+IiArIG1vbnRoTmFtZXNbZHJhd01vbnRoXSArICI8L3NwYW4+IjsKCQl9IGVsc2UgewoJCQlpbk1pblllYXIgPSAobWluRGF0ZSAmJiBtaW5EYXRlLmdldEZ1bGxZZWFyKCkgPT09IGRyYXdZZWFyKTsKCQkJaW5NYXhZZWFyID0gKG1heERhdGUgJiYgbWF4RGF0ZS5nZXRGdWxsWWVhcigpID09PSBkcmF3WWVhcik7CgkJCW1vbnRoSHRtbCArPSAiPHNlbGVjdCBjbGFzcz0ndWktZGF0ZXBpY2tlci1tb250aCcgZGF0YS1oYW5kbGVyPSdzZWxlY3RNb250aCcgZGF0YS1ldmVudD0nY2hhbmdlJz4iOwoJCQlmb3IgKCBtb250aCA9IDA7IG1vbnRoIDwgMTI7IG1vbnRoKyspIHsKCQkJCWlmICgoIWluTWluWWVhciB8fCBtb250aCA+PSBtaW5EYXRlLmdldE1vbnRoKCkpICYmICghaW5NYXhZZWFyIHx8IG1vbnRoIDw9IG1heERhdGUuZ2V0TW9udGgoKSkpIHsKCQkJCQltb250aEh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKyBtb250aCArICInIiArCgkJCQkJCShtb250aCA9PT0gZHJhd01vbnRoID8gIiBzZWxlY3RlZD0nc2VsZWN0ZWQnIiA6ICIiKSArCgkJCQkJCSI+IiArIG1vbnRoTmFtZXNTaG9ydFttb250aF0gKyAiPC9vcHRpb24+IjsKCQkJCX0KCQkJfQoJCQltb250aEh0bWwgKz0gIjwvc2VsZWN0PiI7CgkJfQoKCQlpZiAoIXNob3dNb250aEFmdGVyWWVhcikgewoJCQlodG1sICs9IG1vbnRoSHRtbCArIChzZWNvbmRhcnkgfHwgIShjaGFuZ2VNb250aCAmJiBjaGFuZ2VZZWFyKSA/ICImI3hhMDsiIDogIiIpOwoJCX0KCgkJLy8geWVhciBzZWxlY3Rpb24KCQlpZiAoICFpbnN0LnllYXJzaHRtbCApIHsKCQkJaW5zdC55ZWFyc2h0bWwgPSAiIjsKCQkJaWYgKHNlY29uZGFyeSB8fCAhY2hhbmdlWWVhcikgewoJCQkJaHRtbCArPSAiPHNwYW4gY2xhc3M9J3VpLWRhdGVwaWNrZXIteWVhcic+IiArIGRyYXdZZWFyICsgIjwvc3Bhbj4iOwoJCQl9IGVsc2UgewoJCQkJLy8gZGV0ZXJtaW5lIHJhbmdlIG9mIHllYXJzIHRvIGRpc3BsYXkKCQkJCXllYXJzID0gdGhpcy5fZ2V0KGluc3QsICJ5ZWFyUmFuZ2UiKS5zcGxpdCgiOiIpOwoJCQkJdGhpc1llYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7CgkJCQlkZXRlcm1pbmVZZWFyID0gZnVuY3Rpb24odmFsdWUpIHsKCQkJCQl2YXIgeWVhciA9ICh2YWx1ZS5tYXRjaCgvY1srXC1dLiovKSA/IGRyYXdZZWFyICsgcGFyc2VJbnQodmFsdWUuc3Vic3RyaW5nKDEpLCAxMCkgOgoJCQkJCQkodmFsdWUubWF0Y2goL1srXC1dLiovKSA/IHRoaXNZZWFyICsgcGFyc2VJbnQodmFsdWUsIDEwKSA6CgkJCQkJCXBhcnNlSW50KHZhbHVlLCAxMCkpKTsKCQkJCQlyZXR1cm4gKGlzTmFOKHllYXIpID8gdGhpc1llYXIgOiB5ZWFyKTsKCQkJCX07CgkJCQl5ZWFyID0gZGV0ZXJtaW5lWWVhcih5ZWFyc1swXSk7CgkJCQllbmRZZWFyID0gTWF0aC5tYXgoeWVhciwgZGV0ZXJtaW5lWWVhcih5ZWFyc1sxXSB8fCAiIikpOwoJCQkJeWVhciA9IChtaW5EYXRlID8gTWF0aC5tYXgoeWVhciwgbWluRGF0ZS5nZXRGdWxsWWVhcigpKSA6IHllYXIpOwoJCQkJZW5kWWVhciA9IChtYXhEYXRlID8gTWF0aC5taW4oZW5kWWVhciwgbWF4RGF0ZS5nZXRGdWxsWWVhcigpKSA6IGVuZFllYXIpOwoJCQkJaW5zdC55ZWFyc2h0bWwgKz0gIjxzZWxlY3QgY2xhc3M9J3VpLWRhdGVwaWNrZXIteWVhcicgZGF0YS1oYW5kbGVyPSdzZWxlY3RZZWFyJyBkYXRhLWV2ZW50PSdjaGFuZ2UnPiI7CgkJCQlmb3IgKDsgeWVhciA8PSBlbmRZZWFyOyB5ZWFyKyspIHsKCQkJCQlpbnN0LnllYXJzaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nIiArIHllYXIgKyAiJyIgKwoJCQkJCQkoeWVhciA9PT0gZHJhd1llYXIgPyAiIHNlbGVjdGVkPSdzZWxlY3RlZCciIDogIiIpICsKCQkJCQkJIj4iICsgeWVhciArICI8L29wdGlvbj4iOwoJCQkJfQoJCQkJaW5zdC55ZWFyc2h0bWwgKz0gIjwvc2VsZWN0PiI7CgoJCQkJaHRtbCArPSBpbnN0LnllYXJzaHRtbDsKCQkJCWluc3QueWVhcnNodG1sID0gbnVsbDsKCQkJfQoJCX0KCgkJaHRtbCArPSB0aGlzLl9nZXQoaW5zdCwgInllYXJTdWZmaXgiKTsKCQlpZiAoc2hvd01vbnRoQWZ0ZXJZZWFyKSB7CgkJCWh0bWwgKz0gKHNlY29uZGFyeSB8fCAhKGNoYW5nZU1vbnRoICYmIGNoYW5nZVllYXIpID8gIiYjeGEwOyIgOiAiIikgKyBtb250aEh0bWw7CgkJfQoJCWh0bWwgKz0gIjwvZGl2PiI7IC8vIENsb3NlIGRhdGVwaWNrZXJfaGVhZGVyCgkJcmV0dXJuIGh0bWw7Cgl9LAoKCS8qIEFkanVzdCBvbmUgb2YgdGhlIGRhdGUgc3ViLWZpZWxkcy4gKi8KCV9hZGp1c3RJbnN0RGF0ZTogZnVuY3Rpb24oaW5zdCwgb2Zmc2V0LCBwZXJpb2QpIHsKCQl2YXIgeWVhciA9IGluc3QuZHJhd1llYXIgKyAocGVyaW9kID09PSAiWSIgPyBvZmZzZXQgOiAwKSwKCQkJbW9udGggPSBpbnN0LmRyYXdNb250aCArIChwZXJpb2QgPT09ICJNIiA/IG9mZnNldCA6IDApLAoJCQlkYXkgPSBNYXRoLm1pbihpbnN0LnNlbGVjdGVkRGF5LCB0aGlzLl9nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpICsgKHBlcmlvZCA9PT0gIkQiID8gb2Zmc2V0IDogMCksCgkJCWRhdGUgPSB0aGlzLl9yZXN0cmljdE1pbk1heChpbnN0LCB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSkpOwoKCQlpbnN0LnNlbGVjdGVkRGF5ID0gZGF0ZS5nZXREYXRlKCk7CgkJaW5zdC5kcmF3TW9udGggPSBpbnN0LnNlbGVjdGVkTW9udGggPSBkYXRlLmdldE1vbnRoKCk7CgkJaW5zdC5kcmF3WWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwoJCWlmIChwZXJpb2QgPT09ICJNIiB8fCBwZXJpb2QgPT09ICJZIikgewoJCQl0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7CgkJfQoJfSwKCgkvKiBFbnN1cmUgYSBkYXRlIGlzIHdpdGhpbiBhbnkgbWluL21heCBib3VuZHMuICovCglfcmVzdHJpY3RNaW5NYXg6IGZ1bmN0aW9uKGluc3QsIGRhdGUpIHsKCQl2YXIgbWluRGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgIm1pbiIpLAoJCQltYXhEYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAibWF4IiksCgkJCW5ld0RhdGUgPSAobWluRGF0ZSAmJiBkYXRlIDwgbWluRGF0ZSA/IG1pbkRhdGUgOiBkYXRlKTsKCQlyZXR1cm4gKG1heERhdGUgJiYgbmV3RGF0ZSA+IG1heERhdGUgPyBtYXhEYXRlIDogbmV3RGF0ZSk7Cgl9LAoKCS8qIE5vdGlmeSBjaGFuZ2Ugb2YgbW9udGgveWVhci4gKi8KCV9ub3RpZnlDaGFuZ2U6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgb25DaGFuZ2UgPSB0aGlzLl9nZXQoaW5zdCwgIm9uQ2hhbmdlTW9udGhZZWFyIik7CgkJaWYgKG9uQ2hhbmdlKSB7CgkJCW9uQ2hhbmdlLmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLAoJCQkJW2luc3Quc2VsZWN0ZWRZZWFyLCBpbnN0LnNlbGVjdGVkTW9udGggKyAxLCBpbnN0XSk7CgkJfQoJfSwKCgkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBtb250aHMgdG8gc2hvdy4gKi8KCV9nZXROdW1iZXJPZk1vbnRoczogZnVuY3Rpb24oaW5zdCkgewoJCXZhciBudW1Nb250aHMgPSB0aGlzLl9nZXQoaW5zdCwgIm51bWJlck9mTW9udGhzIik7CgkJcmV0dXJuIChudW1Nb250aHMgPT0gbnVsbCA/IFsxLCAxXSA6ICh0eXBlb2YgbnVtTW9udGhzID09PSAibnVtYmVyIiA/IFsxLCBudW1Nb250aHNdIDogbnVtTW9udGhzKSk7Cgl9LAoKCS8qIERldGVybWluZSB0aGUgY3VycmVudCBtYXhpbXVtIGRhdGUgLSBlbnN1cmUgbm8gdGltZSBjb21wb25lbnRzIGFyZSBzZXQuICovCglfZ2V0TWluTWF4RGF0ZTogZnVuY3Rpb24oaW5zdCwgbWluTWF4KSB7CgkJcmV0dXJuIHRoaXMuX2RldGVybWluZURhdGUoaW5zdCwgdGhpcy5fZ2V0KGluc3QsIG1pbk1heCArICJEYXRlIiksIG51bGwpOwoJfSwKCgkvKiBGaW5kIHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIGdpdmVuIG1vbnRoLiAqLwoJX2dldERheXNJbk1vbnRoOiBmdW5jdGlvbih5ZWFyLCBtb250aCkgewoJCXJldHVybiAzMiAtIHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoLCAzMikpLmdldERhdGUoKTsKCX0sCgoJLyogRmluZCB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9mIHRoZSBmaXJzdCBvZiBhIG1vbnRoLiAqLwoJX2dldEZpcnN0RGF5T2ZNb250aDogZnVuY3Rpb24oeWVhciwgbW9udGgpIHsKCQlyZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpLmdldERheSgpOwoJfSwKCgkvKiBEZXRlcm1pbmVzIGlmIHdlIHNob3VsZCBhbGxvdyBhICJuZXh0L3ByZXYiIG1vbnRoIGRpc3BsYXkgY2hhbmdlLiAqLwoJX2NhbkFkanVzdE1vbnRoOiBmdW5jdGlvbihpbnN0LCBvZmZzZXQsIGN1clllYXIsIGN1ck1vbnRoKSB7CgkJdmFyIG51bU1vbnRocyA9IHRoaXMuX2dldE51bWJlck9mTW9udGhzKGluc3QpLAoJCQlkYXRlID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoY3VyWWVhciwKCQkJY3VyTW9udGggKyAob2Zmc2V0IDwgMCA/IG9mZnNldCA6IG51bU1vbnRoc1swXSAqIG51bU1vbnRoc1sxXSksIDEpKTsKCgkJaWYgKG9mZnNldCA8IDApIHsKCQkJZGF0ZS5zZXREYXRlKHRoaXMuX2dldERheXNJbk1vbnRoKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpKSk7CgkJfQoJCXJldHVybiB0aGlzLl9pc0luUmFuZ2UoaW5zdCwgZGF0ZSk7Cgl9LAoKCS8qIElzIHRoZSBnaXZlbiBkYXRlIGluIHRoZSBhY2NlcHRlZCByYW5nZT8gKi8KCV9pc0luUmFuZ2U6IGZ1bmN0aW9uKGluc3QsIGRhdGUpIHsKCQl2YXIgeWVhclNwbGl0LCBjdXJyZW50WWVhciwKCQkJbWluRGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgIm1pbiIpLAoJCQltYXhEYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAibWF4IiksCgkJCW1pblllYXIgPSBudWxsLAoJCQltYXhZZWFyID0gbnVsbCwKCQkJeWVhcnMgPSB0aGlzLl9nZXQoaW5zdCwgInllYXJSYW5nZSIpOwoJCQlpZiAoeWVhcnMpewoJCQkJeWVhclNwbGl0ID0geWVhcnMuc3BsaXQoIjoiKTsKCQkJCWN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpOwoJCQkJbWluWWVhciA9IHBhcnNlSW50KHllYXJTcGxpdFswXSwgMTApOwoJCQkJbWF4WWVhciA9IHBhcnNlSW50KHllYXJTcGxpdFsxXSwgMTApOwoJCQkJaWYgKCB5ZWFyU3BsaXRbMF0ubWF0Y2goL1srXC1dLiovKSApIHsKCQkJCQltaW5ZZWFyICs9IGN1cnJlbnRZZWFyOwoJCQkJfQoJCQkJaWYgKCB5ZWFyU3BsaXRbMV0ubWF0Y2goL1srXC1dLiovKSApIHsKCQkJCQltYXhZZWFyICs9IGN1cnJlbnRZZWFyOwoJCQkJfQoJCQl9CgoJCXJldHVybiAoKCFtaW5EYXRlIHx8IGRhdGUuZ2V0VGltZSgpID49IG1pbkRhdGUuZ2V0VGltZSgpKSAmJgoJCQkoIW1heERhdGUgfHwgZGF0ZS5nZXRUaW1lKCkgPD0gbWF4RGF0ZS5nZXRUaW1lKCkpICYmCgkJCSghbWluWWVhciB8fCBkYXRlLmdldEZ1bGxZZWFyKCkgPj0gbWluWWVhcikgJiYKCQkJKCFtYXhZZWFyIHx8IGRhdGUuZ2V0RnVsbFllYXIoKSA8PSBtYXhZZWFyKSk7Cgl9LAoKCS8qIFByb3ZpZGUgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGZvcm1hdHRpbmcvcGFyc2luZy4gKi8KCV9nZXRGb3JtYXRDb25maWc6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgc2hvcnRZZWFyQ3V0b2ZmID0gdGhpcy5fZ2V0KGluc3QsICJzaG9ydFllYXJDdXRvZmYiKTsKCQlzaG9ydFllYXJDdXRvZmYgPSAodHlwZW9mIHNob3J0WWVhckN1dG9mZiAhPT0gInN0cmluZyIgPyBzaG9ydFllYXJDdXRvZmYgOgoJCQluZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgJSAxMDAgKyBwYXJzZUludChzaG9ydFllYXJDdXRvZmYsIDEwKSk7CgkJcmV0dXJuIHtzaG9ydFllYXJDdXRvZmY6IHNob3J0WWVhckN1dG9mZiwKCQkJZGF5TmFtZXNTaG9ydDogdGhpcy5fZ2V0KGluc3QsICJkYXlOYW1lc1Nob3J0IiksIGRheU5hbWVzOiB0aGlzLl9nZXQoaW5zdCwgImRheU5hbWVzIiksCgkJCW1vbnRoTmFtZXNTaG9ydDogdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzU2hvcnQiKSwgbW9udGhOYW1lczogdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzIil9OwoJfSwKCgkvKiBGb3JtYXQgdGhlIGdpdmVuIGRhdGUgZm9yIGRpc3BsYXkuICovCglfZm9ybWF0RGF0ZTogZnVuY3Rpb24oaW5zdCwgZGF5LCBtb250aCwgeWVhcikgewoJCWlmICghZGF5KSB7CgkJCWluc3QuY3VycmVudERheSA9IGluc3Quc2VsZWN0ZWREYXk7CgkJCWluc3QuY3VycmVudE1vbnRoID0gaW5zdC5zZWxlY3RlZE1vbnRoOwoJCQlpbnN0LmN1cnJlbnRZZWFyID0gaW5zdC5zZWxlY3RlZFllYXI7CgkJfQoJCXZhciBkYXRlID0gKGRheSA/ICh0eXBlb2YgZGF5ID09PSAib2JqZWN0IiA/IGRheSA6CgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpKSkgOgoJCQl0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpbnN0LmN1cnJlbnRZZWFyLCBpbnN0LmN1cnJlbnRNb250aCwgaW5zdC5jdXJyZW50RGF5KSkpOwoJCXJldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGluc3QsICJkYXRlRm9ybWF0IiksIGRhdGUsIHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSk7Cgl9Cn0pOwoKLyoKICogQmluZCBob3ZlciBldmVudHMgZm9yIGRhdGVwaWNrZXIgZWxlbWVudHMuCiAqIERvbmUgdmlhIGRlbGVnYXRlIHNvIHRoZSBiaW5kaW5nIG9ubHkgb2NjdXJzIG9uY2UgaW4gdGhlIGxpZmV0aW1lIG9mIHRoZSBwYXJlbnQgZGl2LgogKiBHbG9iYWwgaW5zdEFjdGl2ZSwgc2V0IGJ5IF91cGRhdGVEYXRlcGlja2VyIGFsbG93cyB0aGUgaGFuZGxlcnMgdG8gZmluZCB0aGVpciB3YXkgYmFjayB0byB0aGUgYWN0aXZlIHBpY2tlci4KICovCmZ1bmN0aW9uIGJpbmRIb3ZlcihkcERpdikgewoJdmFyIHNlbGVjdG9yID0gImJ1dHRvbiwgLnVpLWRhdGVwaWNrZXItcHJldiwgLnVpLWRhdGVwaWNrZXItbmV4dCwgLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgdGQgYSI7CglyZXR1cm4gZHBEaXYuZGVsZWdhdGUoc2VsZWN0b3IsICJtb3VzZW91dCIsIGZ1bmN0aW9uKCkgewoJCQkkKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpOwoJCQlpZiAodGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1wcmV2IikgIT09IC0xKSB7CgkJCQkkKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLXByZXYtaG92ZXIiKTsKCQkJfQoJCQlpZiAodGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1uZXh0IikgIT09IC0xKSB7CgkJCQkkKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW5leHQtaG92ZXIiKTsKCQkJfQoJCX0pCgkJLmRlbGVnYXRlKHNlbGVjdG9yLCAibW91c2VvdmVyIiwgZnVuY3Rpb24oKXsKCQkJaWYgKCEkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKCBpbnN0QWN0aXZlLmlubGluZSA/IGRwRGl2LnBhcmVudCgpWzBdIDogaW5zdEFjdGl2ZS5pbnB1dFswXSkpIHsKCQkJCSQodGhpcykucGFyZW50cygiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKS5maW5kKCJhIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIik7CgkJCQkkKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpOwoJCQkJaWYgKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoInVpLWRhdGVwaWNrZXItcHJldiIpICE9PSAtMSkgewoJCQkJCSQodGhpcykuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciIpOwoJCQkJfQoJCQkJaWYgKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoInVpLWRhdGVwaWNrZXItbmV4dCIpICE9PSAtMSkgewoJCQkJCSQodGhpcykuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpOwoJCQkJfQoJCQl9CgkJfSk7Cn0KCi8qIGpRdWVyeSBleHRlbmQgbm93IGlnbm9yZXMgbnVsbHMhICovCmZ1bmN0aW9uIGV4dGVuZFJlbW92ZSh0YXJnZXQsIHByb3BzKSB7CgkkLmV4dGVuZCh0YXJnZXQsIHByb3BzKTsKCWZvciAodmFyIG5hbWUgaW4gcHJvcHMpIHsKCQlpZiAocHJvcHNbbmFtZV0gPT0gbnVsbCkgewoJCQl0YXJnZXRbbmFtZV0gPSBwcm9wc1tuYW1lXTsKCQl9Cgl9CglyZXR1cm4gdGFyZ2V0Owp9CgovKiBJbnZva2UgdGhlIGRhdGVwaWNrZXIgZnVuY3Rpb25hbGl0eS4KICAgQHBhcmFtICBvcHRpb25zICBzdHJpbmcgLSBhIGNvbW1hbmQsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG9yCgkJCQkJT2JqZWN0IC0gc2V0dGluZ3MgZm9yIGF0dGFjaGluZyBuZXcgZGF0ZXBpY2tlciBmdW5jdGlvbmFsaXR5CiAgIEByZXR1cm4gIGpRdWVyeSBvYmplY3QgKi8KJC5mbi5kYXRlcGlja2VyID0gZnVuY3Rpb24ob3B0aW9ucyl7CgoJLyogVmVyaWZ5IGFuIGVtcHR5IGNvbGxlY3Rpb24gd2Fzbid0IHBhc3NlZCAtIEZpeGVzICM2OTc2ICovCglpZiAoICF0aGlzLmxlbmd0aCApIHsKCQlyZXR1cm4gdGhpczsKCX0KCgkvKiBJbml0aWFsaXNlIHRoZSBkYXRlIHBpY2tlci4gKi8KCWlmICghJC5kYXRlcGlja2VyLmluaXRpYWxpemVkKSB7CgkJJChkb2N1bWVudCkubW91c2Vkb3duKCQuZGF0ZXBpY2tlci5fY2hlY2tFeHRlcm5hbENsaWNrKTsKCQkkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQgPSB0cnVlOwoJfQoKCS8qIEFwcGVuZCBkYXRlcGlja2VyIG1haW4gY29udGFpbmVyIHRvIGJvZHkgaWYgbm90IGV4aXN0LiAqLwoJaWYgKCQoIiMiKyQuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGggPT09IDApIHsKCQkkKCJib2R5IikuYXBwZW5kKCQuZGF0ZXBpY2tlci5kcERpdik7Cgl9CgoJdmFyIG90aGVyQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CglpZiAodHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciICYmIChvcHRpb25zID09PSAiaXNEaXNhYmxlZCIgfHwgb3B0aW9ucyA9PT0gImdldERhdGUiIHx8IG9wdGlvbnMgPT09ICJ3aWRnZXQiKSkgewoJCXJldHVybiAkLmRhdGVwaWNrZXJbIl8iICsgb3B0aW9ucyArICJEYXRlcGlja2VyIl0uCgkJCWFwcGx5KCQuZGF0ZXBpY2tlciwgW3RoaXNbMF1dLmNvbmNhdChvdGhlckFyZ3MpKTsKCX0KCWlmIChvcHRpb25zID09PSAib3B0aW9uIiAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICJzdHJpbmciKSB7CgkJcmV0dXJuICQuZGF0ZXBpY2tlclsiXyIgKyBvcHRpb25zICsgIkRhdGVwaWNrZXIiXS4KCQkJYXBwbHkoJC5kYXRlcGlja2VyLCBbdGhpc1swXV0uY29uY2F0KG90aGVyQXJncykpOwoJfQoJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQl0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCQkkLmRhdGVwaWNrZXJbIl8iICsgb3B0aW9ucyArICJEYXRlcGlja2VyIl0uCgkJCQlhcHBseSgkLmRhdGVwaWNrZXIsIFt0aGlzXS5jb25jYXQob3RoZXJBcmdzKSkgOgoJCQkkLmRhdGVwaWNrZXIuX2F0dGFjaERhdGVwaWNrZXIodGhpcywgb3B0aW9ucyk7Cgl9KTsKfTsKCiQuZGF0ZXBpY2tlciA9IG5ldyBEYXRlcGlja2VyKCk7IC8vIHNpbmdsZXRvbiBpbnN0YW5jZQokLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKJC5kYXRlcGlja2VyLnV1aWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKJC5kYXRlcGlja2VyLnZlcnNpb24gPSAiMS4xMC4zIjsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCnZhciBzaXplUmVsYXRlZE9wdGlvbnMgPSB7CgkJYnV0dG9uczogdHJ1ZSwKCQloZWlnaHQ6IHRydWUsCgkJbWF4SGVpZ2h0OiB0cnVlLAoJCW1heFdpZHRoOiB0cnVlLAoJCW1pbkhlaWdodDogdHJ1ZSwKCQltaW5XaWR0aDogdHJ1ZSwKCQl3aWR0aDogdHJ1ZQoJfSwKCXJlc2l6YWJsZVJlbGF0ZWRPcHRpb25zID0gewoJCW1heEhlaWdodDogdHJ1ZSwKCQltYXhXaWR0aDogdHJ1ZSwKCQltaW5IZWlnaHQ6IHRydWUsCgkJbWluV2lkdGg6IHRydWUKCX07CgokLndpZGdldCggInVpLmRpYWxvZyIsIHsKCXZlcnNpb246ICIxLjEwLjMiLAoJb3B0aW9uczogewoJCWFwcGVuZFRvOiAiYm9keSIsCgkJYXV0b09wZW46IHRydWUsCgkJYnV0dG9uczogW10sCgkJY2xvc2VPbkVzY2FwZTogdHJ1ZSwKCQljbG9zZVRleHQ6ICJjbG9zZSIsCgkJZGlhbG9nQ2xhc3M6ICIiLAoJCWRyYWdnYWJsZTogdHJ1ZSwKCQloaWRlOiBudWxsLAoJCWhlaWdodDogImF1dG8iLAoJCW1heEhlaWdodDogbnVsbCwKCQltYXhXaWR0aDogbnVsbCwKCQltaW5IZWlnaHQ6IDE1MCwKCQltaW5XaWR0aDogMTUwLAoJCW1vZGFsOiBmYWxzZSwKCQlwb3NpdGlvbjogewoJCQlteTogImNlbnRlciIsCgkJCWF0OiAiY2VudGVyIiwKCQkJb2Y6IHdpbmRvdywKCQkJY29sbGlzaW9uOiAiZml0IiwKCQkJLy8gRW5zdXJlIHRoZSB0aXRsZWJhciBpcyBhbHdheXMgdmlzaWJsZQoJCQl1c2luZzogZnVuY3Rpb24oIHBvcyApIHsKCQkJCXZhciB0b3BPZmZzZXQgPSAkKCB0aGlzICkuY3NzKCBwb3MgKS5vZmZzZXQoKS50b3A7CgkJCQlpZiAoIHRvcE9mZnNldCA8IDAgKSB7CgkJCQkJJCggdGhpcyApLmNzcyggInRvcCIsIHBvcy50b3AgLSB0b3BPZmZzZXQgKTsKCQkJCX0KCQkJfQoJCX0sCgkJcmVzaXphYmxlOiB0cnVlLAoJCXNob3c6IG51bGwsCgkJdGl0bGU6IG51bGwsCgkJd2lkdGg6IDMwMCwKCgkJLy8gY2FsbGJhY2tzCgkJYmVmb3JlQ2xvc2U6IG51bGwsCgkJY2xvc2U6IG51bGwsCgkJZHJhZzogbnVsbCwKCQlkcmFnU3RhcnQ6IG51bGwsCgkJZHJhZ1N0b3A6IG51bGwsCgkJZm9jdXM6IG51bGwsCgkJb3BlbjogbnVsbCwKCQlyZXNpemU6IG51bGwsCgkJcmVzaXplU3RhcnQ6IG51bGwsCgkJcmVzaXplU3RvcDogbnVsbAoJfSwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLm9yaWdpbmFsQ3NzID0gewoJCQlkaXNwbGF5OiB0aGlzLmVsZW1lbnRbMF0uc3R5bGUuZGlzcGxheSwKCQkJd2lkdGg6IHRoaXMuZWxlbWVudFswXS5zdHlsZS53aWR0aCwKCQkJbWluSGVpZ2h0OiB0aGlzLmVsZW1lbnRbMF0uc3R5bGUubWluSGVpZ2h0LAoJCQltYXhIZWlnaHQ6IHRoaXMuZWxlbWVudFswXS5zdHlsZS5tYXhIZWlnaHQsCgkJCWhlaWdodDogdGhpcy5lbGVtZW50WzBdLnN0eWxlLmhlaWdodAoJCX07CgkJdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gewoJCQlwYXJlbnQ6IHRoaXMuZWxlbWVudC5wYXJlbnQoKSwKCQkJaW5kZXg6IHRoaXMuZWxlbWVudC5wYXJlbnQoKS5jaGlsZHJlbigpLmluZGV4KCB0aGlzLmVsZW1lbnQgKQoJCX07CgkJdGhpcy5vcmlnaW5hbFRpdGxlID0gdGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIik7CgkJdGhpcy5vcHRpb25zLnRpdGxlID0gdGhpcy5vcHRpb25zLnRpdGxlIHx8IHRoaXMub3JpZ2luYWxUaXRsZTsKCgkJdGhpcy5fY3JlYXRlV3JhcHBlcigpOwoKCQl0aGlzLmVsZW1lbnQKCQkJLnNob3coKQoJCQkucmVtb3ZlQXR0cigidGl0bGUiKQoJCQkuYWRkQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikKCQkJLmFwcGVuZFRvKCB0aGlzLnVpRGlhbG9nICk7CgoJCXRoaXMuX2NyZWF0ZVRpdGxlYmFyKCk7CgkJdGhpcy5fY3JlYXRlQnV0dG9uUGFuZSgpOwoKCQlpZiAoIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUgJiYgJC5mbi5kcmFnZ2FibGUgKSB7CgkJCXRoaXMuX21ha2VEcmFnZ2FibGUoKTsKCQl9CgkJaWYgKCB0aGlzLm9wdGlvbnMucmVzaXphYmxlICYmICQuZm4ucmVzaXphYmxlICkgewoJCQl0aGlzLl9tYWtlUmVzaXphYmxlKCk7CgkJfQoKCQl0aGlzLl9pc09wZW4gPSBmYWxzZTsKCX0sCgoJX2luaXQ6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy5vcHRpb25zLmF1dG9PcGVuICkgewoJCQl0aGlzLm9wZW4oKTsKCQl9Cgl9LAoKCV9hcHBlbmRUbzogZnVuY3Rpb24oKSB7CgkJdmFyIGVsZW1lbnQgPSB0aGlzLm9wdGlvbnMuYXBwZW5kVG87CgkJaWYgKCBlbGVtZW50ICYmIChlbGVtZW50LmpxdWVyeSB8fCBlbGVtZW50Lm5vZGVUeXBlKSApIHsKCQkJcmV0dXJuICQoIGVsZW1lbnQgKTsKCQl9CgkJcmV0dXJuIHRoaXMuZG9jdW1lbnQuZmluZCggZWxlbWVudCB8fCAiYm9keSIgKS5lcSggMCApOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdmFyIG5leHQsCgkJCW9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLm9yaWdpbmFsUG9zaXRpb247CgoJCXRoaXMuX2Rlc3Ryb3lPdmVybGF5KCk7CgoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlVW5pcXVlSWQoKQoJCQkucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikKCQkJLmNzcyggdGhpcy5vcmlnaW5hbENzcyApCgkJCS8vIFdpdGhvdXQgZGV0YWNoaW5nIGZpcnN0LCB0aGUgZm9sbG93aW5nIGJlY29tZXMgcmVhbGx5IHNsb3cKCQkJLmRldGFjaCgpOwoKCQl0aGlzLnVpRGlhbG9nLnN0b3AoIHRydWUsIHRydWUgKS5yZW1vdmUoKTsKCgkJaWYgKCB0aGlzLm9yaWdpbmFsVGl0bGUgKSB7CgkJCXRoaXMuZWxlbWVudC5hdHRyKCAidGl0bGUiLCB0aGlzLm9yaWdpbmFsVGl0bGUgKTsKCQl9CgoJCW5leHQgPSBvcmlnaW5hbFBvc2l0aW9uLnBhcmVudC5jaGlsZHJlbigpLmVxKCBvcmlnaW5hbFBvc2l0aW9uLmluZGV4ICk7CgkJLy8gRG9uJ3QgdHJ5IHRvIHBsYWNlIHRoZSBkaWFsb2cgbmV4dCB0byBpdHNlbGYgKCM4NjEzKQoJCWlmICggbmV4dC5sZW5ndGggJiYgbmV4dFswXSAhPT0gdGhpcy5lbGVtZW50WzBdICkgewoJCQluZXh0LmJlZm9yZSggdGhpcy5lbGVtZW50ICk7CgkJfSBlbHNlIHsKCQkJb3JpZ2luYWxQb3NpdGlvbi5wYXJlbnQuYXBwZW5kKCB0aGlzLmVsZW1lbnQgKTsKCQl9Cgl9LAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudWlEaWFsb2c7Cgl9LAoKCWRpc2FibGU6ICQubm9vcCwKCWVuYWJsZTogJC5ub29wLAoKCWNsb3NlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQlpZiAoICF0aGlzLl9pc09wZW4gfHwgdGhpcy5fdHJpZ2dlciggImJlZm9yZUNsb3NlIiwgZXZlbnQgKSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMuX2lzT3BlbiA9IGZhbHNlOwoJCXRoaXMuX2Rlc3Ryb3lPdmVybGF5KCk7CgoJCWlmICggIXRoaXMub3BlbmVyLmZpbHRlcigiOmZvY3VzYWJsZSIpLmZvY3VzKCkubGVuZ3RoICkgewoJCQkvLyBIaWRpbmcgYSBmb2N1c2VkIGVsZW1lbnQgZG9lc24ndCB0cmlnZ2VyIGJsdXIgaW4gV2ViS2l0CgkJCS8vIHNvIGluIGNhc2Ugd2UgaGF2ZSBub3RoaW5nIHRvIGZvY3VzIG9uLCBleHBsaWNpdGx5IGJsdXIgdGhlIGFjdGl2ZSBlbGVtZW50CgkJCS8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NzE4MgoJCQkkKCB0aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQgKS5ibHVyKCk7CgkJfQoKCQl0aGlzLl9oaWRlKCB0aGlzLnVpRGlhbG9nLCB0aGlzLm9wdGlvbnMuaGlkZSwgZnVuY3Rpb24oKSB7CgkJCXRoYXQuX3RyaWdnZXIoICJjbG9zZSIsIGV2ZW50ICk7CgkJfSk7Cgl9LAoKCWlzT3BlbjogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX2lzT3BlbjsKCX0sCgoJbW92ZVRvVG9wOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9tb3ZlVG9Ub3AoKTsKCX0sCgoJX21vdmVUb1RvcDogZnVuY3Rpb24oIGV2ZW50LCBzaWxlbnQgKSB7CgkJdmFyIG1vdmVkID0gISF0aGlzLnVpRGlhbG9nLm5leHRBbGwoIjp2aXNpYmxlIikuaW5zZXJ0QmVmb3JlKCB0aGlzLnVpRGlhbG9nICkubGVuZ3RoOwoJCWlmICggbW92ZWQgJiYgIXNpbGVudCApIHsKCQkJdGhpcy5fdHJpZ2dlciggImZvY3VzIiwgZXZlbnQgKTsKCQl9CgkJcmV0dXJuIG1vdmVkOwoJfSwKCglvcGVuOiBmdW5jdGlvbigpIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgkJaWYgKCB0aGlzLl9pc09wZW4gKSB7CgkJCWlmICggdGhpcy5fbW92ZVRvVG9wKCkgKSB7CgkJCQl0aGlzLl9mb2N1c1RhYmJhYmxlKCk7CgkJCX0KCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5faXNPcGVuID0gdHJ1ZTsKCQl0aGlzLm9wZW5lciA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCApOwoKCQl0aGlzLl9zaXplKCk7CgkJdGhpcy5fcG9zaXRpb24oKTsKCQl0aGlzLl9jcmVhdGVPdmVybGF5KCk7CgkJdGhpcy5fbW92ZVRvVG9wKCBudWxsLCB0cnVlICk7CgkJdGhpcy5fc2hvdyggdGhpcy51aURpYWxvZywgdGhpcy5vcHRpb25zLnNob3csIGZ1bmN0aW9uKCkgewoJCQl0aGF0Ll9mb2N1c1RhYmJhYmxlKCk7CgkJCXRoYXQuX3RyaWdnZXIoImZvY3VzIik7CgkJfSk7CgoJCXRoaXMuX3RyaWdnZXIoIm9wZW4iKTsKCX0sCgoJX2ZvY3VzVGFiYmFibGU6IGZ1bmN0aW9uKCkgewoJCS8vIFNldCBmb2N1cyB0byB0aGUgZmlyc3QgbWF0Y2g6CgkJLy8gMS4gRmlyc3QgZWxlbWVudCBpbnNpZGUgdGhlIGRpYWxvZyBtYXRjaGluZyBbYXV0b2ZvY3VzXQoJCS8vIDIuIFRhYmJhYmxlIGVsZW1lbnQgaW5zaWRlIHRoZSBjb250ZW50IGVsZW1lbnQKCQkvLyAzLiBUYWJiYWJsZSBlbGVtZW50IGluc2lkZSB0aGUgYnV0dG9ucGFuZQoJCS8vIDQuIFRoZSBjbG9zZSBidXR0b24KCQkvLyA1LiBUaGUgZGlhbG9nIGl0c2VsZgoJCXZhciBoYXNGb2N1cyA9IHRoaXMuZWxlbWVudC5maW5kKCJbYXV0b2ZvY3VzXSIpOwoJCWlmICggIWhhc0ZvY3VzLmxlbmd0aCApIHsKCQkJaGFzRm9jdXMgPSB0aGlzLmVsZW1lbnQuZmluZCgiOnRhYmJhYmxlIik7CgkJfQoJCWlmICggIWhhc0ZvY3VzLmxlbmd0aCApIHsKCQkJaGFzRm9jdXMgPSB0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZS5maW5kKCI6dGFiYmFibGUiKTsKCQl9CgkJaWYgKCAhaGFzRm9jdXMubGVuZ3RoICkgewoJCQloYXNGb2N1cyA9IHRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlLmZpbHRlcigiOnRhYmJhYmxlIik7CgkJfQoJCWlmICggIWhhc0ZvY3VzLmxlbmd0aCApIHsKCQkJaGFzRm9jdXMgPSB0aGlzLnVpRGlhbG9nOwoJCX0KCQloYXNGb2N1cy5lcSggMCApLmZvY3VzKCk7Cgl9LAoKCV9rZWVwRm9jdXM6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlmdW5jdGlvbiBjaGVja0ZvY3VzKCkgewoJCQl2YXIgYWN0aXZlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCwKCQkJCWlzQWN0aXZlID0gdGhpcy51aURpYWxvZ1swXSA9PT0gYWN0aXZlRWxlbWVudCB8fAoJCQkJCSQuY29udGFpbnMoIHRoaXMudWlEaWFsb2dbMF0sIGFjdGl2ZUVsZW1lbnQgKTsKCQkJaWYgKCAhaXNBY3RpdmUgKSB7CgkJCQl0aGlzLl9mb2N1c1RhYmJhYmxlKCk7CgkJCX0KCQl9CgkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQljaGVja0ZvY3VzLmNhbGwoIHRoaXMgKTsKCQkvLyBzdXBwb3J0OiBJRQoJCS8vIElFIDw9IDggZG9lc24ndCBwcmV2ZW50IG1vdmluZyBmb2N1cyBldmVuIHdpdGggZXZlbnQucHJldmVudERlZmF1bHQoKQoJCS8vIHNvIHdlIGNoZWNrIGFnYWluIGxhdGVyCgkJdGhpcy5fZGVsYXkoIGNoZWNrRm9jdXMgKTsKCX0sCgoJX2NyZWF0ZVdyYXBwZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudWlEaWFsb2cgPSAkKCI8ZGl2PiIpCgkJCS5hZGRDbGFzcyggInVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS1mcm9udCAiICsKCQkJCXRoaXMub3B0aW9ucy5kaWFsb2dDbGFzcyApCgkJCS5oaWRlKCkKCQkJLmF0dHIoewoJCQkJLy8gU2V0dGluZyB0YWJJbmRleCBtYWtlcyB0aGUgZGl2IGZvY3VzYWJsZQoJCQkJdGFiSW5kZXg6IC0xLAoJCQkJcm9sZTogImRpYWxvZyIKCQkJfSkKCQkJLmFwcGVuZFRvKCB0aGlzLl9hcHBlbmRUbygpICk7CgoJCXRoaXMuX29uKCB0aGlzLnVpRGlhbG9nLCB7CgkJCWtleWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggdGhpcy5vcHRpb25zLmNsb3NlT25Fc2NhcGUgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICYmIGV2ZW50LmtleUNvZGUgJiYKCQkJCQkJZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLkVTQ0FQRSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCXRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCS8vIHByZXZlbnQgdGFiYmluZyBvdXQgb2YgZGlhbG9ncwoJCQkJaWYgKCBldmVudC5rZXlDb2RlICE9PSAkLnVpLmtleUNvZGUuVEFCICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXZhciB0YWJiYWJsZXMgPSB0aGlzLnVpRGlhbG9nLmZpbmQoIjp0YWJiYWJsZSIpLAoJCQkJCWZpcnN0ID0gdGFiYmFibGVzLmZpbHRlcigiOmZpcnN0IiksCgkJCQkJbGFzdCAgPSB0YWJiYWJsZXMuZmlsdGVyKCI6bGFzdCIpOwoKCQkJCWlmICggKCBldmVudC50YXJnZXQgPT09IGxhc3RbMF0gfHwgZXZlbnQudGFyZ2V0ID09PSB0aGlzLnVpRGlhbG9nWzBdICkgJiYgIWV2ZW50LnNoaWZ0S2V5ICkgewoJCQkJCWZpcnN0LmZvY3VzKCAxICk7CgkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCX0gZWxzZSBpZiAoICggZXZlbnQudGFyZ2V0ID09PSBmaXJzdFswXSB8fCBldmVudC50YXJnZXQgPT09IHRoaXMudWlEaWFsb2dbMF0gKSAmJiBldmVudC5zaGlmdEtleSApIHsKCQkJCQlsYXN0LmZvY3VzKCAxICk7CgkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCX0KCQkJfSwKCQkJbW91c2Vkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoIHRoaXMuX21vdmVUb1RvcCggZXZlbnQgKSApIHsKCQkJCQl0aGlzLl9mb2N1c1RhYmJhYmxlKCk7CgkJCQl9CgkJCX0KCQl9KTsKCgkJLy8gV2UgYXNzdW1lIHRoYXQgYW55IGV4aXN0aW5nIGFyaWEtZGVzY3JpYmVkYnkgYXR0cmlidXRlIG1lYW5zCgkJLy8gdGhhdCB0aGUgZGlhbG9nIGNvbnRlbnQgaXMgbWFya2VkIHVwIHByb3Blcmx5CgkJLy8gb3RoZXJ3aXNlIHdlIGJydXRlIGZvcmNlIHRoZSBjb250ZW50IGFzIHRoZSBkZXNjcmlwdGlvbgoJCWlmICggIXRoaXMuZWxlbWVudC5maW5kKCJbYXJpYS1kZXNjcmliZWRieV0iKS5sZW5ndGggKSB7CgkJCXRoaXMudWlEaWFsb2cuYXR0cih7CgkJCQkiYXJpYS1kZXNjcmliZWRieSI6IHRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmF0dHIoImlkIikKCQkJfSk7CgkJfQoJfSwKCglfY3JlYXRlVGl0bGViYXI6IGZ1bmN0aW9uKCkgewoJCXZhciB1aURpYWxvZ1RpdGxlOwoKCQl0aGlzLnVpRGlhbG9nVGl0bGViYXIgPSAkKCI8ZGl2PiIpCgkJCS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCB1aS1oZWxwZXItY2xlYXJmaXgiKQoJCQkucHJlcGVuZFRvKCB0aGlzLnVpRGlhbG9nICk7CgkJdGhpcy5fb24oIHRoaXMudWlEaWFsb2dUaXRsZWJhciwgewoJCQltb3VzZWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIERvbid0IHByZXZlbnQgY2xpY2sgb24gY2xvc2UgYnV0dG9uICgjODgzOCkKCQkJCS8vIEZvY3VzaW5nIGEgZGlhbG9nIHRoYXQgaXMgcGFydGlhbGx5IHNjcm9sbGVkIG91dCBvZiB2aWV3CgkJCQkvLyBjYXVzZXMgdGhlIGJyb3dzZXIgdG8gc2Nyb2xsIGl0IGludG8gdmlldywgcHJldmVudGluZyB0aGUgY2xpY2sgZXZlbnQKCQkJCWlmICggISQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIi51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiKSApIHsKCQkJCQkvLyBEaWFsb2cgaXNuJ3QgZ2V0dGluZyBmb2N1cyB3aGVuIGRyYWdnaW5nICgjODA2MykKCQkJCQl0aGlzLnVpRGlhbG9nLmZvY3VzKCk7CgkJCQl9CgkJCX0KCQl9KTsKCgkJdGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2UgPSAkKCI8YnV0dG9uPjwvYnV0dG9uPiIpCgkJCS5idXR0b24oewoJCQkJbGFiZWw6IHRoaXMub3B0aW9ucy5jbG9zZVRleHQsCgkJCQlpY29uczogewoJCQkJCXByaW1hcnk6ICJ1aS1pY29uLWNsb3NldGhpY2siCgkJCQl9LAoJCQkJdGV4dDogZmFsc2UKCQkJfSkKCQkJLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiKQoJCQkuYXBwZW5kVG8oIHRoaXMudWlEaWFsb2dUaXRsZWJhciApOwoJCXRoaXMuX29uKCB0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZSwgewoJCQljbGljazogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCXRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJCX0KCQl9KTsKCgkJdWlEaWFsb2dUaXRsZSA9ICQoIjxzcGFuPiIpCgkJCS51bmlxdWVJZCgpCgkJCS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlIikKCQkJLnByZXBlbmRUbyggdGhpcy51aURpYWxvZ1RpdGxlYmFyICk7CgkJdGhpcy5fdGl0bGUoIHVpRGlhbG9nVGl0bGUgKTsKCgkJdGhpcy51aURpYWxvZy5hdHRyKHsKCQkJImFyaWEtbGFiZWxsZWRieSI6IHVpRGlhbG9nVGl0bGUuYXR0cigiaWQiKQoJCX0pOwoJfSwKCglfdGl0bGU6IGZ1bmN0aW9uKCB0aXRsZSApIHsKCQlpZiAoICF0aGlzLm9wdGlvbnMudGl0bGUgKSB7CgkJCXRpdGxlLmh0bWwoIiYjMTYwOyIpOwoJCX0KCQl0aXRsZS50ZXh0KCB0aGlzLm9wdGlvbnMudGl0bGUgKTsKCX0sCgoJX2NyZWF0ZUJ1dHRvblBhbmU6IGZ1bmN0aW9uKCkgewoJCXRoaXMudWlEaWFsb2dCdXR0b25QYW5lID0gJCgiPGRpdj4iKQoJCQkuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCIpOwoKCQl0aGlzLnVpQnV0dG9uU2V0ID0gJCgiPGRpdj4iKQoJCQkuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zZXQiKQoJCQkuYXBwZW5kVG8oIHRoaXMudWlEaWFsb2dCdXR0b25QYW5lICk7CgoJCXRoaXMuX2NyZWF0ZUJ1dHRvbnMoKTsKCX0sCgoJX2NyZWF0ZUJ1dHRvbnM6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpcywKCQkJYnV0dG9ucyA9IHRoaXMub3B0aW9ucy5idXR0b25zOwoKCQkvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBidXR0b24gcGFuZSwgcmVtb3ZlIGl0CgkJdGhpcy51aURpYWxvZ0J1dHRvblBhbmUucmVtb3ZlKCk7CgkJdGhpcy51aUJ1dHRvblNldC5lbXB0eSgpOwoKCQlpZiAoICQuaXNFbXB0eU9iamVjdCggYnV0dG9ucyApIHx8ICgkLmlzQXJyYXkoIGJ1dHRvbnMgKSAmJiAhYnV0dG9ucy5sZW5ndGgpICkgewoJCQl0aGlzLnVpRGlhbG9nLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucyIpOwoJCQlyZXR1cm47CgkJfQoKCQkkLmVhY2goIGJ1dHRvbnMsIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCQkJdmFyIGNsaWNrLCBidXR0b25PcHRpb25zOwoJCQlwcm9wcyA9ICQuaXNGdW5jdGlvbiggcHJvcHMgKSA/CgkJCQl7IGNsaWNrOiBwcm9wcywgdGV4dDogbmFtZSB9IDoKCQkJCXByb3BzOwoJCQkvLyBEZWZhdWx0IHRvIGEgbm9uLXN1Ym1pdHRpbmcgYnV0dG9uCgkJCXByb3BzID0gJC5leHRlbmQoIHsgdHlwZTogImJ1dHRvbiIgfSwgcHJvcHMgKTsKCQkJLy8gQ2hhbmdlIHRoZSBjb250ZXh0IGZvciB0aGUgY2xpY2sgY2FsbGJhY2sgdG8gYmUgdGhlIG1haW4gZWxlbWVudAoJCQljbGljayA9IHByb3BzLmNsaWNrOwoJCQlwcm9wcy5jbGljayA9IGZ1bmN0aW9uKCkgewoJCQkJY2xpY2suYXBwbHkoIHRoYXQuZWxlbWVudFswXSwgYXJndW1lbnRzICk7CgkJCX07CgkJCWJ1dHRvbk9wdGlvbnMgPSB7CgkJCQlpY29uczogcHJvcHMuaWNvbnMsCgkJCQl0ZXh0OiBwcm9wcy5zaG93VGV4dAoJCQl9OwoJCQlkZWxldGUgcHJvcHMuaWNvbnM7CgkJCWRlbGV0ZSBwcm9wcy5zaG93VGV4dDsKCQkJJCggIjxidXR0b24+PC9idXR0b24+IiwgcHJvcHMgKQoJCQkJLmJ1dHRvbiggYnV0dG9uT3B0aW9ucyApCgkJCQkuYXBwZW5kVG8oIHRoYXQudWlCdXR0b25TZXQgKTsKCQl9KTsKCQl0aGlzLnVpRGlhbG9nLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucyIpOwoJCXRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmFwcGVuZFRvKCB0aGlzLnVpRGlhbG9nICk7Cgl9LAoKCV9tYWtlRHJhZ2dhYmxlOiBmdW5jdGlvbigpIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJCWZ1bmN0aW9uIGZpbHRlcmVkVWkoIHVpICkgewoJCQlyZXR1cm4gewoJCQkJcG9zaXRpb246IHVpLnBvc2l0aW9uLAoJCQkJb2Zmc2V0OiB1aS5vZmZzZXQKCQkJfTsKCQl9CgoJCXRoaXMudWlEaWFsb2cuZHJhZ2dhYmxlKHsKCQkJY2FuY2VsOiAiLnVpLWRpYWxvZy1jb250ZW50LCAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIiwKCQkJaGFuZGxlOiAiLnVpLWRpYWxvZy10aXRsZWJhciIsCgkJCWNvbnRhaW5tZW50OiAiZG9jdW1lbnQiLAoJCQlzdGFydDogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQkJCSQoIHRoaXMgKS5hZGRDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIik7CgkJCQl0aGF0Ll9ibG9ja0ZyYW1lcygpOwoJCQkJdGhhdC5fdHJpZ2dlciggImRyYWdTdGFydCIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0sCgkJCWRyYWc6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQl0aGF0Ll90cmlnZ2VyKCAiZHJhZyIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQlvcHRpb25zLnBvc2l0aW9uID0gWwoJCQkJCXVpLnBvc2l0aW9uLmxlZnQgLSB0aGF0LmRvY3VtZW50LnNjcm9sbExlZnQoKSwKCQkJCQl1aS5wb3NpdGlvbi50b3AgLSB0aGF0LmRvY3VtZW50LnNjcm9sbFRvcCgpCgkJCQldOwoJCQkJJCggdGhpcyApLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctZHJhZ2dpbmciKTsKCQkJCXRoYXQuX3VuYmxvY2tGcmFtZXMoKTsKCQkJCXRoYXQuX3RyaWdnZXIoICJkcmFnU3RvcCIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0KCQl9KTsKCX0sCgoJX21ha2VSZXNpemFibGU6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJaGFuZGxlcyA9IG9wdGlvbnMucmVzaXphYmxlLAoJCQkvLyAudWktcmVzaXphYmxlIGhhcyBwb3NpdGlvbjogcmVsYXRpdmUgZGVmaW5lZCBpbiB0aGUgc3R5bGVzaGVldAoJCQkvLyBidXQgZGlhbG9ncyBoYXZlIHRvIHVzZSBhYnNvbHV0ZSBvciBmaXhlZCBwb3NpdGlvbmluZwoJCQlwb3NpdGlvbiA9IHRoaXMudWlEaWFsb2cuY3NzKCJwb3NpdGlvbiIpLAoJCQlyZXNpemVIYW5kbGVzID0gdHlwZW9mIGhhbmRsZXMgPT09ICJzdHJpbmciID8KCQkJCWhhbmRsZXMJOgoJCQkJIm4sZSxzLHcsc2Usc3csbmUsbnciOwoKCQlmdW5jdGlvbiBmaWx0ZXJlZFVpKCB1aSApIHsKCQkJcmV0dXJuIHsKCQkJCW9yaWdpbmFsUG9zaXRpb246IHVpLm9yaWdpbmFsUG9zaXRpb24sCgkJCQlvcmlnaW5hbFNpemU6IHVpLm9yaWdpbmFsU2l6ZSwKCQkJCXBvc2l0aW9uOiB1aS5wb3NpdGlvbiwKCQkJCXNpemU6IHVpLnNpemUKCQkJfTsKCQl9CgoJCXRoaXMudWlEaWFsb2cucmVzaXphYmxlKHsKCQkJY2FuY2VsOiAiLnVpLWRpYWxvZy1jb250ZW50IiwKCQkJY29udGFpbm1lbnQ6ICJkb2N1bWVudCIsCgkJCWFsc29SZXNpemU6IHRoaXMuZWxlbWVudCwKCQkJbWF4V2lkdGg6IG9wdGlvbnMubWF4V2lkdGgsCgkJCW1heEhlaWdodDogb3B0aW9ucy5tYXhIZWlnaHQsCgkJCW1pbldpZHRoOiBvcHRpb25zLm1pbldpZHRoLAoJCQltaW5IZWlnaHQ6IHRoaXMuX21pbkhlaWdodCgpLAoJCQloYW5kbGVzOiByZXNpemVIYW5kbGVzLAoJCQlzdGFydDogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQkJCSQoIHRoaXMgKS5hZGRDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIik7CgkJCQl0aGF0Ll9ibG9ja0ZyYW1lcygpOwoJCQkJdGhhdC5fdHJpZ2dlciggInJlc2l6ZVN0YXJ0IiwgZXZlbnQsIGZpbHRlcmVkVWkoIHVpICkgKTsKCQkJfSwKCQkJcmVzaXplOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJdGhhdC5fdHJpZ2dlciggInJlc2l6ZSIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQlvcHRpb25zLmhlaWdodCA9ICQoIHRoaXMgKS5oZWlnaHQoKTsKCQkJCW9wdGlvbnMud2lkdGggPSAkKCB0aGlzICkud2lkdGgoKTsKCQkJCSQoIHRoaXMgKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIik7CgkJCQl0aGF0Ll91bmJsb2NrRnJhbWVzKCk7CgkJCQl0aGF0Ll90cmlnZ2VyKCAicmVzaXplU3RvcCIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0KCQl9KQoJCS5jc3MoICJwb3NpdGlvbiIsIHBvc2l0aW9uICk7Cgl9LAoKCV9taW5IZWlnaHQ6IGZ1bmN0aW9uKCkgewoJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQlyZXR1cm4gb3B0aW9ucy5oZWlnaHQgPT09ICJhdXRvIiA/CgkJCW9wdGlvbnMubWluSGVpZ2h0IDoKCQkJTWF0aC5taW4oIG9wdGlvbnMubWluSGVpZ2h0LCBvcHRpb25zLmhlaWdodCApOwoJfSwKCglfcG9zaXRpb246IGZ1bmN0aW9uKCkgewoJCS8vIE5lZWQgdG8gc2hvdyB0aGUgZGlhbG9nIHRvIGdldCB0aGUgYWN0dWFsIG9mZnNldCBpbiB0aGUgcG9zaXRpb24gcGx1Z2luCgkJdmFyIGlzVmlzaWJsZSA9IHRoaXMudWlEaWFsb2cuaXMoIjp2aXNpYmxlIik7CgkJaWYgKCAhaXNWaXNpYmxlICkgewoJCQl0aGlzLnVpRGlhbG9nLnNob3coKTsKCQl9CgkJdGhpcy51aURpYWxvZy5wb3NpdGlvbiggdGhpcy5vcHRpb25zLnBvc2l0aW9uICk7CgkJaWYgKCAhaXNWaXNpYmxlICkgewoJCQl0aGlzLnVpRGlhbG9nLmhpZGUoKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXJlc2l6ZSA9IGZhbHNlLAoJCQlyZXNpemFibGVPcHRpb25zID0ge307CgoJCSQuZWFjaCggb3B0aW9ucywgZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCXRoYXQuX3NldE9wdGlvbigga2V5LCB2YWx1ZSApOwoKCQkJaWYgKCBrZXkgaW4gc2l6ZVJlbGF0ZWRPcHRpb25zICkgewoJCQkJcmVzaXplID0gdHJ1ZTsKCQkJfQoJCQlpZiAoIGtleSBpbiByZXNpemFibGVSZWxhdGVkT3B0aW9ucyApIHsKCQkJCXJlc2l6YWJsZU9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgkJCX0KCQl9KTsKCgkJaWYgKCByZXNpemUgKSB7CgkJCXRoaXMuX3NpemUoKTsKCQkJdGhpcy5fcG9zaXRpb24oKTsKCQl9CgkJaWYgKCB0aGlzLnVpRGlhbG9nLmlzKCI6ZGF0YSh1aS1yZXNpemFibGUpIikgKSB7CgkJCXRoaXMudWlEaWFsb2cucmVzaXphYmxlKCAib3B0aW9uIiwgcmVzaXphYmxlT3B0aW9ucyApOwoJCX0KCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJLypqc2hpbnQgbWF4Y29tcGxleGl0eToxNSovCgkJdmFyIGlzRHJhZ2dhYmxlLCBpc1Jlc2l6YWJsZSwKCQkJdWlEaWFsb2cgPSB0aGlzLnVpRGlhbG9nOwoKCQlpZiAoIGtleSA9PT0gImRpYWxvZ0NsYXNzIiApIHsKCQkJdWlEaWFsb2cKCQkJCS5yZW1vdmVDbGFzcyggdGhpcy5vcHRpb25zLmRpYWxvZ0NsYXNzICkKCQkJCS5hZGRDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoKCQlpZiAoIGtleSA9PT0gImFwcGVuZFRvIiApIHsKCQkJdGhpcy51aURpYWxvZy5hcHBlbmRUbyggdGhpcy5fYXBwZW5kVG8oKSApOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJidXR0b25zIiApIHsKCQkJdGhpcy5fY3JlYXRlQnV0dG9ucygpOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJjbG9zZVRleHQiICkgewoJCQl0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZS5idXR0b24oewoJCQkJLy8gRW5zdXJlIHRoYXQgd2UgYWx3YXlzIHBhc3MgYSBzdHJpbmcKCQkJCWxhYmVsOiAiIiArIHZhbHVlCgkJCX0pOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJkcmFnZ2FibGUiICkgewoJCQlpc0RyYWdnYWJsZSA9IHVpRGlhbG9nLmlzKCI6ZGF0YSh1aS1kcmFnZ2FibGUpIik7CgkJCWlmICggaXNEcmFnZ2FibGUgJiYgIXZhbHVlICkgewoJCQkJdWlEaWFsb2cuZHJhZ2dhYmxlKCJkZXN0cm95Iik7CgkJCX0KCgkJCWlmICggIWlzRHJhZ2dhYmxlICYmIHZhbHVlICkgewoJCQkJdGhpcy5fbWFrZURyYWdnYWJsZSgpOwoJCQl9CgkJfQoKCQlpZiAoIGtleSA9PT0gInBvc2l0aW9uIiApIHsKCQkJdGhpcy5fcG9zaXRpb24oKTsKCQl9CgoJCWlmICgga2V5ID09PSAicmVzaXphYmxlIiApIHsKCQkJLy8gY3VycmVudGx5IHJlc2l6YWJsZSwgYmVjb21pbmcgbm9uLXJlc2l6YWJsZQoJCQlpc1Jlc2l6YWJsZSA9IHVpRGlhbG9nLmlzKCI6ZGF0YSh1aS1yZXNpemFibGUpIik7CgkJCWlmICggaXNSZXNpemFibGUgJiYgIXZhbHVlICkgewoJCQkJdWlEaWFsb2cucmVzaXphYmxlKCJkZXN0cm95Iik7CgkJCX0KCgkJCS8vIGN1cnJlbnRseSByZXNpemFibGUsIGNoYW5naW5nIGhhbmRsZXMKCQkJaWYgKCBpc1Jlc2l6YWJsZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICkgewoJCQkJdWlEaWFsb2cucmVzaXphYmxlKCAib3B0aW9uIiwgImhhbmRsZXMiLCB2YWx1ZSApOwoJCQl9CgoJCQkvLyBjdXJyZW50bHkgbm9uLXJlc2l6YWJsZSwgYmVjb21pbmcgcmVzaXphYmxlCgkJCWlmICggIWlzUmVzaXphYmxlICYmIHZhbHVlICE9PSBmYWxzZSApIHsKCQkJCXRoaXMuX21ha2VSZXNpemFibGUoKTsKCQkJfQoJCX0KCgkJaWYgKCBrZXkgPT09ICJ0aXRsZSIgKSB7CgkJCXRoaXMuX3RpdGxlKCB0aGlzLnVpRGlhbG9nVGl0bGViYXIuZmluZCgiLnVpLWRpYWxvZy10aXRsZSIpICk7CgkJfQoJfSwKCglfc2l6ZTogZnVuY3Rpb24oKSB7CgkJLy8gSWYgdGhlIHVzZXIgaGFzIHJlc2l6ZWQgdGhlIGRpYWxvZywgdGhlIC51aS1kaWFsb2cgYW5kIC51aS1kaWFsb2ctY29udGVudAoJCS8vIGRpdnMgd2lsbCBib3RoIGhhdmUgd2lkdGggYW5kIGhlaWdodCBzZXQsIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlbQoJCXZhciBub25Db250ZW50SGVpZ2h0LCBtaW5Db250ZW50SGVpZ2h0LCBtYXhDb250ZW50SGVpZ2h0LAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQkvLyBSZXNldCBjb250ZW50IHNpemluZwoJCXRoaXMuZWxlbWVudC5zaG93KCkuY3NzKHsKCQkJd2lkdGg6ICJhdXRvIiwKCQkJbWluSGVpZ2h0OiAwLAoJCQltYXhIZWlnaHQ6ICJub25lIiwKCQkJaGVpZ2h0OiAwCgkJfSk7CgoJCWlmICggb3B0aW9ucy5taW5XaWR0aCA+IG9wdGlvbnMud2lkdGggKSB7CgkJCW9wdGlvbnMud2lkdGggPSBvcHRpb25zLm1pbldpZHRoOwoJCX0KCgkJLy8gcmVzZXQgd3JhcHBlciBzaXppbmcKCQkvLyBkZXRlcm1pbmUgdGhlIGhlaWdodCBvZiBhbGwgdGhlIG5vbi1jb250ZW50IGVsZW1lbnRzCgkJbm9uQ29udGVudEhlaWdodCA9IHRoaXMudWlEaWFsb2cuY3NzKHsKCQkJCWhlaWdodDogImF1dG8iLAoJCQkJd2lkdGg6IG9wdGlvbnMud2lkdGgKCQkJfSkKCQkJLm91dGVySGVpZ2h0KCk7CgkJbWluQ29udGVudEhlaWdodCA9IE1hdGgubWF4KCAwLCBvcHRpb25zLm1pbkhlaWdodCAtIG5vbkNvbnRlbnRIZWlnaHQgKTsKCQltYXhDb250ZW50SGVpZ2h0ID0gdHlwZW9mIG9wdGlvbnMubWF4SGVpZ2h0ID09PSAibnVtYmVyIiA/CgkJCU1hdGgubWF4KCAwLCBvcHRpb25zLm1heEhlaWdodCAtIG5vbkNvbnRlbnRIZWlnaHQgKSA6CgkJCSJub25lIjsKCgkJaWYgKCBvcHRpb25zLmhlaWdodCA9PT0gImF1dG8iICkgewoJCQl0aGlzLmVsZW1lbnQuY3NzKHsKCQkJCW1pbkhlaWdodDogbWluQ29udGVudEhlaWdodCwKCQkJCW1heEhlaWdodDogbWF4Q29udGVudEhlaWdodCwKCQkJCWhlaWdodDogImF1dG8iCgkJCX0pOwoJCX0gZWxzZSB7CgkJCXRoaXMuZWxlbWVudC5oZWlnaHQoIE1hdGgubWF4KCAwLCBvcHRpb25zLmhlaWdodCAtIG5vbkNvbnRlbnRIZWlnaHQgKSApOwoJCX0KCgkJaWYgKHRoaXMudWlEaWFsb2cuaXMoIjpkYXRhKHVpLXJlc2l6YWJsZSkiKSApIHsKCQkJdGhpcy51aURpYWxvZy5yZXNpemFibGUoICJvcHRpb24iLCAibWluSGVpZ2h0IiwgdGhpcy5fbWluSGVpZ2h0KCkgKTsKCQl9Cgl9LAoKCV9ibG9ja0ZyYW1lczogZnVuY3Rpb24oKSB7CgkJdGhpcy5pZnJhbWVCbG9ja3MgPSB0aGlzLmRvY3VtZW50LmZpbmQoICJpZnJhbWUiICkubWFwKGZ1bmN0aW9uKCkgewoJCQl2YXIgaWZyYW1lID0gJCggdGhpcyApOwoKCQkJcmV0dXJuICQoICI8ZGl2PiIgKQoJCQkJLmNzcyh7CgkJCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsCgkJCQkJd2lkdGg6IGlmcmFtZS5vdXRlcldpZHRoKCksCgkJCQkJaGVpZ2h0OiBpZnJhbWUub3V0ZXJIZWlnaHQoKQoJCQkJfSkKCQkJCS5hcHBlbmRUbyggaWZyYW1lLnBhcmVudCgpICkKCQkJCS5vZmZzZXQoIGlmcmFtZS5vZmZzZXQoKSApWzBdOwoJCX0pOwoJfSwKCglfdW5ibG9ja0ZyYW1lczogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLmlmcmFtZUJsb2NrcyApIHsKCQkJdGhpcy5pZnJhbWVCbG9ja3MucmVtb3ZlKCk7CgkJCWRlbGV0ZSB0aGlzLmlmcmFtZUJsb2NrczsKCQl9Cgl9LAoKCV9hbGxvd0ludGVyYWN0aW9uOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCAkKCBldmVudC50YXJnZXQgKS5jbG9zZXN0KCIudWktZGlhbG9nIikubGVuZ3RoICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCS8vIFRPRE86IFJlbW92ZSBoYWNrIHdoZW4gZGF0ZXBpY2tlciBpbXBsZW1lbnRzCgkJLy8gdGhlIC51aS1mcm9udCBsb2dpYyAoIzg5ODkpCgkJcmV0dXJuICEhJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCgiLnVpLWRhdGVwaWNrZXIiKS5sZW5ndGg7Cgl9LAoKCV9jcmVhdGVPdmVybGF5OiBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzLm9wdGlvbnMubW9kYWwgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0aGF0ID0gdGhpcywKCQkJd2lkZ2V0RnVsbE5hbWUgPSB0aGlzLndpZGdldEZ1bGxOYW1lOwoJCWlmICggISQudWkuZGlhbG9nLm92ZXJsYXlJbnN0YW5jZXMgKSB7CgkJCS8vIFByZXZlbnQgdXNlIG9mIGFuY2hvcnMgYW5kIGlucHV0cy4KCQkJLy8gV2UgdXNlIGEgZGVsYXkgaW4gY2FzZSB0aGUgb3ZlcmxheSBpcyBjcmVhdGVkIGZyb20gYW4KCQkJLy8gZXZlbnQgdGhhdCB3ZSdyZSBnb2luZyB0byBiZSBjYW5jZWxsaW5nLiAoIzI4MDQpCgkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJLy8gSGFuZGxlIC5kaWFsb2coKS5kaWFsb2coImNsb3NlIikgKCM0MDY1KQoJCQkJaWYgKCAkLnVpLmRpYWxvZy5vdmVybGF5SW5zdGFuY2VzICkgewoJCQkJCXRoaXMuZG9jdW1lbnQuYmluZCggImZvY3VzaW4uZGlhbG9nIiwgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJCQlpZiAoICF0aGF0Ll9hbGxvd0ludGVyYWN0aW9uKCBldmVudCApICkgewoJCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCSQoIi51aS1kaWFsb2c6dmlzaWJsZTpsYXN0IC51aS1kaWFsb2ctY29udGVudCIpCgkJCQkJCQkJLmRhdGEoIHdpZGdldEZ1bGxOYW1lICkuX2ZvY3VzVGFiYmFibGUoKTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfQoJCQl9KTsKCQl9CgoJCXRoaXMub3ZlcmxheSA9ICQoIjxkaXY+IikKCQkJLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSB1aS1mcm9udCIpCgkJCS5hcHBlbmRUbyggdGhpcy5fYXBwZW5kVG8oKSApOwoJCXRoaXMuX29uKCB0aGlzLm92ZXJsYXksIHsKCQkJbW91c2Vkb3duOiAiX2tlZXBGb2N1cyIKCQl9KTsKCQkkLnVpLmRpYWxvZy5vdmVybGF5SW5zdGFuY2VzKys7Cgl9LAoKCV9kZXN0cm95T3ZlcmxheTogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpcy5vcHRpb25zLm1vZGFsICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIHRoaXMub3ZlcmxheSApIHsKCQkJJC51aS5kaWFsb2cub3ZlcmxheUluc3RhbmNlcy0tOwoKCQkJaWYgKCAhJC51aS5kaWFsb2cub3ZlcmxheUluc3RhbmNlcyApIHsKCQkJCXRoaXMuZG9jdW1lbnQudW5iaW5kKCAiZm9jdXNpbi5kaWFsb2ciICk7CgkJCX0KCQkJdGhpcy5vdmVybGF5LnJlbW92ZSgpOwoJCQl0aGlzLm92ZXJsYXkgPSBudWxsOwoJCX0KCX0KfSk7CgokLnVpLmRpYWxvZy5vdmVybGF5SW5zdGFuY2VzID0gMDsKCi8vIERFUFJFQ0FURUQKaWYgKCAkLnVpQmFja0NvbXBhdCAhPT0gZmFsc2UgKSB7CgkvLyBwb3NpdGlvbiBvcHRpb24gd2l0aCBhcnJheSBub3RhdGlvbgoJLy8ganVzdCBvdmVycmlkZSB3aXRoIG9sZCBpbXBsZW1lbnRhdGlvbgoJJC53aWRnZXQoICJ1aS5kaWFsb2ciLCAkLnVpLmRpYWxvZywgewoJCV9wb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCXZhciBwb3NpdGlvbiA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbiwKCQkJCW15QXQgPSBbXSwKCQkJCW9mZnNldCA9IFsgMCwgMCBdLAoJCQkJaXNWaXNpYmxlOwoKCQkJaWYgKCBwb3NpdGlvbiApIHsKCQkJCWlmICggdHlwZW9mIHBvc2l0aW9uID09PSAic3RyaW5nIiB8fCAodHlwZW9mIHBvc2l0aW9uID09PSAib2JqZWN0IiAmJiAiMCIgaW4gcG9zaXRpb24gKSApIHsKCQkJCQlteUF0ID0gcG9zaXRpb24uc3BsaXQgPyBwb3NpdGlvbi5zcGxpdCgiICIpIDogWyBwb3NpdGlvblswXSwgcG9zaXRpb25bMV0gXTsKCQkJCQlpZiAoIG15QXQubGVuZ3RoID09PSAxICkgewoJCQkJCQlteUF0WzFdID0gbXlBdFswXTsKCQkJCQl9CgoJCQkJCSQuZWFjaCggWyAibGVmdCIsICJ0b3AiIF0sIGZ1bmN0aW9uKCBpLCBvZmZzZXRQb3NpdGlvbiApIHsKCQkJCQkJaWYgKCArbXlBdFsgaSBdID09PSBteUF0WyBpIF0gKSB7CgkJCQkJCQlvZmZzZXRbIGkgXSA9IG15QXRbIGkgXTsKCQkJCQkJCW15QXRbIGkgXSA9IG9mZnNldFBvc2l0aW9uOwoJCQkJCQl9CgkJCQkJfSk7CgoJCQkJCXBvc2l0aW9uID0gewoJCQkJCQlteTogbXlBdFswXSArIChvZmZzZXRbMF0gPCAwID8gb2Zmc2V0WzBdIDogIisiICsgb2Zmc2V0WzBdKSArICIgIiArCgkJCQkJCQlteUF0WzFdICsgKG9mZnNldFsxXSA8IDAgPyBvZmZzZXRbMV0gOiAiKyIgKyBvZmZzZXRbMV0pLAoJCQkJCQlhdDogbXlBdC5qb2luKCIgIikKCQkJCQl9OwoJCQkJfQoKCQkJCXBvc2l0aW9uID0gJC5leHRlbmQoIHt9LCAkLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5wb3NpdGlvbiwgcG9zaXRpb24gKTsKCQkJfSBlbHNlIHsKCQkJCXBvc2l0aW9uID0gJC51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb247CgkJCX0KCgkJCS8vIG5lZWQgdG8gc2hvdyB0aGUgZGlhbG9nIHRvIGdldCB0aGUgYWN0dWFsIG9mZnNldCBpbiB0aGUgcG9zaXRpb24gcGx1Z2luCgkJCWlzVmlzaWJsZSA9IHRoaXMudWlEaWFsb2cuaXMoIjp2aXNpYmxlIik7CgkJCWlmICggIWlzVmlzaWJsZSApIHsKCQkJCXRoaXMudWlEaWFsb2cuc2hvdygpOwoJCQl9CgkJCXRoaXMudWlEaWFsb2cucG9zaXRpb24oIHBvc2l0aW9uICk7CgkJCWlmICggIWlzVmlzaWJsZSApIHsKCQkJCXRoaXMudWlEaWFsb2cuaGlkZSgpOwoJCQl9CgkJfQoJfSk7Cn0KCn0oIGpRdWVyeSApICk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCnZhciBydmVydGljYWwgPSAvdXB8ZG93bnx2ZXJ0aWNhbC8sCglycG9zaXRpdmVtb3Rpb24gPSAvdXB8bGVmdHx2ZXJ0aWNhbHxob3Jpem9udGFsLzsKCiQuZWZmZWN0cy5lZmZlY3QuYmxpbmQgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCS8vIENyZWF0ZSBlbGVtZW50Cgl2YXIgZWwgPSAkKCB0aGlzICksCgkJcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAidXAiLAoJCXZlcnRpY2FsID0gcnZlcnRpY2FsLnRlc3QoIGRpcmVjdGlvbiApLAoJCXJlZiA9IHZlcnRpY2FsID8gImhlaWdodCIgOiAid2lkdGgiLAoJCXJlZjIgPSB2ZXJ0aWNhbCA/ICJ0b3AiIDogImxlZnQiLAoJCW1vdGlvbiA9IHJwb3NpdGl2ZW1vdGlvbi50ZXN0KCBkaXJlY3Rpb24gKSwKCQlhbmltYXRpb24gPSB7fSwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCXdyYXBwZXIsIGRpc3RhbmNlLCBtYXJnaW47CgoJLy8gaWYgYWxyZWFkeSB3cmFwcGVkLCB0aGUgd3JhcHBlcidzIHByb3BlcnRpZXMgYXJlIG15IHByb3BlcnR5LiAjNjI0NQoJaWYgKCBlbC5wYXJlbnQoKS5pcyggIi51aS1lZmZlY3RzLXdyYXBwZXIiICkgKSB7CgkJJC5lZmZlY3RzLnNhdmUoIGVsLnBhcmVudCgpLCBwcm9wcyApOwoJfSBlbHNlIHsKCQkkLmVmZmVjdHMuc2F2ZSggZWwsIHByb3BzICk7Cgl9CgllbC5zaG93KCk7Cgl3cmFwcGVyID0gJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICkuY3NzKHsKCQlvdmVyZmxvdzogImhpZGRlbiIKCX0pOwoKCWRpc3RhbmNlID0gd3JhcHBlclsgcmVmIF0oKTsKCW1hcmdpbiA9IHBhcnNlRmxvYXQoIHdyYXBwZXIuY3NzKCByZWYyICkgKSB8fCAwOwoKCWFuaW1hdGlvblsgcmVmIF0gPSBzaG93ID8gZGlzdGFuY2UgOiAwOwoJaWYgKCAhbW90aW9uICkgewoJCWVsCgkJCS5jc3MoIHZlcnRpY2FsID8gImJvdHRvbSIgOiAicmlnaHQiLCAwICkKCQkJLmNzcyggdmVydGljYWwgPyAidG9wIiA6ICJsZWZ0IiwgImF1dG8iICkKCQkJLmNzcyh7IHBvc2l0aW9uOiAiYWJzb2x1dGUiIH0pOwoKCQlhbmltYXRpb25bIHJlZjIgXSA9IHNob3cgPyBtYXJnaW4gOiBkaXN0YW5jZSArIG1hcmdpbjsKCX0KCgkvLyBzdGFydCBhdCAwIGlmIHdlIGFyZSBzaG93aW5nCglpZiAoIHNob3cgKSB7CgkJd3JhcHBlci5jc3MoIHJlZiwgMCApOwoJCWlmICggISBtb3Rpb24gKSB7CgkJCXdyYXBwZXIuY3NzKCByZWYyLCBtYXJnaW4gKyBkaXN0YW5jZSApOwoJCX0KCX0KCgkvLyBBbmltYXRlCgl3cmFwcGVyLmFuaW1hdGUoIGFuaW1hdGlvbiwgewoJCWR1cmF0aW9uOiBvLmR1cmF0aW9uLAoJCWVhc2luZzogby5lYXNpbmcsCgkJcXVldWU6IGZhbHNlLAoJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJaWYgKCBtb2RlID09PSAiaGlkZSIgKSB7CgkJCQllbC5oaWRlKCk7CgkJCX0KCQkJJC5lZmZlY3RzLnJlc3RvcmUoIGVsLCBwcm9wcyApOwoJCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsKCQkJZG9uZSgpOwoJCX0KCX0pOwoKfTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3QuYm91bmNlID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7Cgl2YXIgZWwgPSAkKCB0aGlzICksCgkJcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiBdLAoKCQkvLyBkZWZhdWx0czoKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImVmZmVjdCIgKSwKCQloaWRlID0gbW9kZSA9PT0gImhpZGUiLAoJCXNob3cgPSBtb2RlID09PSAic2hvdyIsCgkJZGlyZWN0aW9uID0gby5kaXJlY3Rpb24gfHwgInVwIiwKCQlkaXN0YW5jZSA9IG8uZGlzdGFuY2UsCgkJdGltZXMgPSBvLnRpbWVzIHx8IDUsCgoJCS8vIG51bWJlciBvZiBpbnRlcm5hbCBhbmltYXRpb25zCgkJYW5pbXMgPSB0aW1lcyAqIDIgKyAoIHNob3cgfHwgaGlkZSA/IDEgOiAwICksCgkJc3BlZWQgPSBvLmR1cmF0aW9uIC8gYW5pbXMsCgkJZWFzaW5nID0gby5lYXNpbmcsCgoJCS8vIHV0aWxpdHk6CgkJcmVmID0gKCBkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAiZG93biIgKSA/ICJ0b3AiIDogImxlZnQiLAoJCW1vdGlvbiA9ICggZGlyZWN0aW9uID09PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImxlZnQiICksCgkJaSwKCQl1cEFuaW0sCgkJZG93bkFuaW0sCgoJCS8vIHdlIHdpbGwgbmVlZCB0byByZS1hc3NlbWJsZSB0aGUgcXVldWUgdG8gc3RhY2sgb3VyIGFuaW1hdGlvbnMgaW4gcGxhY2UKCQlxdWV1ZSA9IGVsLnF1ZXVlKCksCgkJcXVldWVsZW4gPSBxdWV1ZS5sZW5ndGg7CgoJLy8gQXZvaWQgdG91Y2hpbmcgb3BhY2l0eSB0byBwcmV2ZW50IGNsZWFyVHlwZSBhbmQgUE5HIGlzc3VlcyBpbiBJRQoJaWYgKCBzaG93IHx8IGhpZGUgKSB7CgkJcHJvcHMucHVzaCggIm9wYWNpdHkiICk7Cgl9CgoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoJJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICk7IC8vIENyZWF0ZSBXcmFwcGVyCgoJLy8gZGVmYXVsdCBkaXN0YW5jZSBmb3IgdGhlIEJJR0dFU1QgYm91bmNlIGlzIHRoZSBvdXRlciBEaXN0YW5jZSAvIDMKCWlmICggIWRpc3RhbmNlICkgewoJCWRpc3RhbmNlID0gZWxbIHJlZiA9PT0gInRvcCIgPyAib3V0ZXJIZWlnaHQiIDogIm91dGVyV2lkdGgiIF0oKSAvIDM7Cgl9CgoJaWYgKCBzaG93ICkgewoJCWRvd25BbmltID0geyBvcGFjaXR5OiAxIH07CgkJZG93bkFuaW1bIHJlZiBdID0gMDsKCgkJLy8gaWYgd2UgYXJlIHNob3dpbmcsIGZvcmNlIG9wYWNpdHkgMCBhbmQgc2V0IHRoZSBpbml0aWFsIHBvc2l0aW9uCgkJLy8gdGhlbiBkbyB0aGUgImZpcnN0IiBhbmltYXRpb24KCQllbC5jc3MoICJvcGFjaXR5IiwgMCApCgkJCS5jc3MoIHJlZiwgbW90aW9uID8gLWRpc3RhbmNlICogMiA6IGRpc3RhbmNlICogMiApCgkJCS5hbmltYXRlKCBkb3duQW5pbSwgc3BlZWQsIGVhc2luZyApOwoJfQoKCS8vIHN0YXJ0IGF0IHRoZSBzbWFsbGVzdCBkaXN0YW5jZSBpZiB3ZSBhcmUgaGlkaW5nCglpZiAoIGhpZGUgKSB7CgkJZGlzdGFuY2UgPSBkaXN0YW5jZSAvIE1hdGgucG93KCAyLCB0aW1lcyAtIDEgKTsKCX0KCglkb3duQW5pbSA9IHt9OwoJZG93bkFuaW1bIHJlZiBdID0gMDsKCS8vIEJvdW5jZXMgdXAvZG93bi9sZWZ0L3JpZ2h0IHRoZW4gYmFjayB0byAwIC0tIHRpbWVzICogMiBhbmltYXRpb25zIGhhcHBlbiBoZXJlCglmb3IgKCBpID0gMDsgaSA8IHRpbWVzOyBpKysgKSB7CgkJdXBBbmltID0ge307CgkJdXBBbmltWyByZWYgXSA9ICggbW90aW9uID8gIi09IiA6ICIrPSIgKSArIGRpc3RhbmNlOwoKCQllbC5hbmltYXRlKCB1cEFuaW0sIHNwZWVkLCBlYXNpbmcgKQoJCQkuYW5pbWF0ZSggZG93bkFuaW0sIHNwZWVkLCBlYXNpbmcgKTsKCgkJZGlzdGFuY2UgPSBoaWRlID8gZGlzdGFuY2UgKiAyIDogZGlzdGFuY2UgLyAyOwoJfQoKCS8vIExhc3QgQm91bmNlIHdoZW4gSGlkaW5nCglpZiAoIGhpZGUgKSB7CgkJdXBBbmltID0geyBvcGFjaXR5OiAwIH07CgkJdXBBbmltWyByZWYgXSA9ICggbW90aW9uID8gIi09IiA6ICIrPSIgKSArIGRpc3RhbmNlOwoKCQllbC5hbmltYXRlKCB1cEFuaW0sIHNwZWVkLCBlYXNpbmcgKTsKCX0KCgllbC5xdWV1ZShmdW5jdGlvbigpIHsKCQlpZiAoIGhpZGUgKSB7CgkJCWVsLmhpZGUoKTsKCQl9CgkJJC5lZmZlY3RzLnJlc3RvcmUoIGVsLCBwcm9wcyApOwoJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCWRvbmUoKTsKCX0pOwoKCS8vIGluamVjdCBhbGwgdGhlIGFuaW1hdGlvbnMgd2UganVzdCBxdWV1ZWQgdG8gYmUgZmlyc3QgaW4gbGluZSAoYWZ0ZXIgImlucHJvZ3Jlc3MiKQoJaWYgKCBxdWV1ZWxlbiA+IDEpIHsKCQlxdWV1ZS5zcGxpY2UuYXBwbHkoIHF1ZXVlLAoJCQlbIDEsIDAgXS5jb25jYXQoIHF1ZXVlLnNwbGljZSggcXVldWVsZW4sIGFuaW1zICsgMSApICkgKTsKCX0KCWVsLmRlcXVldWUoKTsKCn07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LmNsaXAgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCS8vIENyZWF0ZSBlbGVtZW50Cgl2YXIgZWwgPSAkKCB0aGlzICksCgkJcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCWRpcmVjdGlvbiA9IG8uZGlyZWN0aW9uIHx8ICJ2ZXJ0aWNhbCIsCgkJdmVydCA9IGRpcmVjdGlvbiA9PT0gInZlcnRpY2FsIiwKCQlzaXplID0gdmVydCA/ICJoZWlnaHQiIDogIndpZHRoIiwKCQlwb3NpdGlvbiA9IHZlcnQgPyAidG9wIiA6ICJsZWZ0IiwKCQlhbmltYXRpb24gPSB7fSwKCQl3cmFwcGVyLCBhbmltYXRlLCBkaXN0YW5jZTsKCgkvLyBTYXZlICYgU2hvdwoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoKCS8vIENyZWF0ZSBXcmFwcGVyCgl3cmFwcGVyID0gJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICkuY3NzKHsKCQlvdmVyZmxvdzogImhpZGRlbiIKCX0pOwoJYW5pbWF0ZSA9ICggZWxbMF0udGFnTmFtZSA9PT0gIklNRyIgKSA/IHdyYXBwZXIgOiBlbDsKCWRpc3RhbmNlID0gYW5pbWF0ZVsgc2l6ZSBdKCk7CgoJLy8gU2hpZnQKCWlmICggc2hvdyApIHsKCQlhbmltYXRlLmNzcyggc2l6ZSwgMCApOwoJCWFuaW1hdGUuY3NzKCBwb3NpdGlvbiwgZGlzdGFuY2UgLyAyICk7Cgl9CgoJLy8gQ3JlYXRlIEFuaW1hdGlvbiBPYmplY3Q6CglhbmltYXRpb25bIHNpemUgXSA9IHNob3cgPyBkaXN0YW5jZSA6IDA7CglhbmltYXRpb25bIHBvc2l0aW9uIF0gPSBzaG93ID8gMCA6IGRpc3RhbmNlIC8gMjsKCgkvLyBBbmltYXRlCglhbmltYXRlLmFuaW1hdGUoIGFuaW1hdGlvbiwgewoJCXF1ZXVlOiBmYWxzZSwKCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQllYXNpbmc6IG8uZWFzaW5nLAoJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJaWYgKCAhc2hvdyApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfQoJfSk7Cgp9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVmZmVjdC5kcm9wID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7CgoJdmFyIGVsID0gJCggdGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgIm9wYWNpdHkiLCAiaGVpZ2h0IiwgIndpZHRoIiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCWRpcmVjdGlvbiA9IG8uZGlyZWN0aW9uIHx8ICJsZWZ0IiwKCQlyZWYgPSAoIGRpcmVjdGlvbiA9PT0gInVwIiB8fCBkaXJlY3Rpb24gPT09ICJkb3duIiApID8gInRvcCIgOiAibGVmdCIsCgkJbW90aW9uID0gKCBkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAibGVmdCIgKSA/ICJwb3MiIDogIm5lZyIsCgkJYW5pbWF0aW9uID0gewoJCQlvcGFjaXR5OiBzaG93ID8gMSA6IDAKCQl9LAoJCWRpc3RhbmNlOwoKCS8vIEFkanVzdAoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoJJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICk7CgoJZGlzdGFuY2UgPSBvLmRpc3RhbmNlIHx8IGVsWyByZWYgPT09ICJ0b3AiID8gIm91dGVySGVpZ2h0IjogIm91dGVyV2lkdGgiIF0oIHRydWUgKSAvIDI7CgoJaWYgKCBzaG93ICkgewoJCWVsCgkJCS5jc3MoICJvcGFjaXR5IiwgMCApCgkJCS5jc3MoIHJlZiwgbW90aW9uID09PSAicG9zIiA/IC1kaXN0YW5jZSA6IGRpc3RhbmNlICk7Cgl9CgoJLy8gQW5pbWF0aW9uCglhbmltYXRpb25bIHJlZiBdID0gKCBzaG93ID8KCQkoIG1vdGlvbiA9PT0gInBvcyIgPyAiKz0iIDogIi09IiApIDoKCQkoIG1vdGlvbiA9PT0gInBvcyIgPyAiLT0iIDogIis9IiApICkgKwoJCWRpc3RhbmNlOwoKCS8vIEFuaW1hdGUKCWVsLmFuaW1hdGUoIGFuaW1hdGlvbiwgewoJCXF1ZXVlOiBmYWxzZSwKCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQllYXNpbmc6IG8uZWFzaW5nLAoJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJaWYgKCBtb2RlID09PSAiaGlkZSIgKSB7CgkJCQllbC5oaWRlKCk7CgkJCX0KCQkJJC5lZmZlY3RzLnJlc3RvcmUoIGVsLCBwcm9wcyApOwoJCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsKCQkJZG9uZSgpOwoJCX0KCX0pOwp9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVmZmVjdC5leHBsb2RlID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7CgoJdmFyIHJvd3MgPSBvLnBpZWNlcyA/IE1hdGgucm91bmQoIE1hdGguc3FydCggby5waWVjZXMgKSApIDogMywKCQljZWxscyA9IHJvd3MsCgkJZWwgPSAkKCB0aGlzICksCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2RlIHx8ICJoaWRlIiApLAoJCXNob3cgPSBtb2RlID09PSAic2hvdyIsCgoJCS8vIHNob3cgYW5kIHRoZW4gdmlzaWJpbGl0eTpoaWRkZW4gdGhlIGVsZW1lbnQgYmVmb3JlIGNhbGN1bGF0aW5nIG9mZnNldAoJCW9mZnNldCA9IGVsLnNob3coKS5jc3MoICJ2aXNpYmlsaXR5IiwgImhpZGRlbiIgKS5vZmZzZXQoKSwKCgkJLy8gd2lkdGggYW5kIGhlaWdodCBvZiBhIHBpZWNlCgkJd2lkdGggPSBNYXRoLmNlaWwoIGVsLm91dGVyV2lkdGgoKSAvIGNlbGxzICksCgkJaGVpZ2h0ID0gTWF0aC5jZWlsKCBlbC5vdXRlckhlaWdodCgpIC8gcm93cyApLAoJCXBpZWNlcyA9IFtdLAoKCQkvLyBsb29wCgkJaSwgaiwgbGVmdCwgdG9wLCBteCwgbXk7CgoJLy8gY2hpbGRyZW4gYW5pbWF0ZSBjb21wbGV0ZToKCWZ1bmN0aW9uIGNoaWxkQ29tcGxldGUoKSB7CgkJcGllY2VzLnB1c2goIHRoaXMgKTsKCQlpZiAoIHBpZWNlcy5sZW5ndGggPT09IHJvd3MgKiBjZWxscyApIHsKCQkJYW5pbUNvbXBsZXRlKCk7CgkJfQoJfQoKCS8vIGNsb25lIHRoZSBlbGVtZW50IGZvciBlYWNoIHJvdyBhbmQgY2VsbC4KCWZvciggaSA9IDA7IGkgPCByb3dzIDsgaSsrICkgeyAvLyA9PT0+CgkJdG9wID0gb2Zmc2V0LnRvcCArIGkgKiBoZWlnaHQ7CgkJbXkgPSBpIC0gKCByb3dzIC0gMSApIC8gMiA7CgoJCWZvciggaiA9IDA7IGogPCBjZWxscyA7IGorKyApIHsgLy8gfHx8CgkJCWxlZnQgPSBvZmZzZXQubGVmdCArIGogKiB3aWR0aDsKCQkJbXggPSBqIC0gKCBjZWxscyAtIDEgKSAvIDIgOwoKCQkJLy8gQ3JlYXRlIGEgY2xvbmUgb2YgdGhlIG5vdyBoaWRkZW4gbWFpbiBlbGVtZW50IHRoYXQgd2lsbCBiZSBhYnNvbHV0ZSBwb3NpdGlvbmVkCgkJCS8vIHdpdGhpbiBhIHdyYXBwZXIgZGl2IG9mZiB0aGUgLWxlZnQgYW5kIC10b3AgZXF1YWwgdG8gc2l6ZSBvZiBvdXIgcGllY2VzCgkJCWVsCgkJCQkuY2xvbmUoKQoJCQkJLmFwcGVuZFRvKCAiYm9keSIgKQoJCQkJLndyYXAoICI8ZGl2PjwvZGl2PiIgKQoJCQkJLmNzcyh7CgkJCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsCgkJCQkJdmlzaWJpbGl0eTogInZpc2libGUiLAoJCQkJCWxlZnQ6IC1qICogd2lkdGgsCgkJCQkJdG9wOiAtaSAqIGhlaWdodAoJCQkJfSkKCgkJCS8vIHNlbGVjdCB0aGUgd3JhcHBlciAtIG1ha2UgaXQgb3ZlcmZsb3c6IGhpZGRlbiBhbmQgYWJzb2x1dGUgcG9zaXRpb25lZCBiYXNlZCBvbgoJCQkvLyB3aGVyZSB0aGUgb3JpZ2luYWwgd2FzIGxvY2F0ZWQgK2xlZnQgYW5kICt0b3AgZXF1YWwgdG8gdGhlIHNpemUgb2YgcGllY2VzCgkJCQkucGFyZW50KCkKCQkJCS5hZGRDbGFzcyggInVpLWVmZmVjdHMtZXhwbG9kZSIgKQoJCQkJLmNzcyh7CgkJCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsCgkJCQkJb3ZlcmZsb3c6ICJoaWRkZW4iLAoJCQkJCXdpZHRoOiB3aWR0aCwKCQkJCQloZWlnaHQ6IGhlaWdodCwKCQkJCQlsZWZ0OiBsZWZ0ICsgKCBzaG93ID8gbXggKiB3aWR0aCA6IDAgKSwKCQkJCQl0b3A6IHRvcCArICggc2hvdyA/IG15ICogaGVpZ2h0IDogMCApLAoJCQkJCW9wYWNpdHk6IHNob3cgPyAwIDogMQoJCQkJfSkuYW5pbWF0ZSh7CgkJCQkJbGVmdDogbGVmdCArICggc2hvdyA/IDAgOiBteCAqIHdpZHRoICksCgkJCQkJdG9wOiB0b3AgKyAoIHNob3cgPyAwIDogbXkgKiBoZWlnaHQgKSwKCQkJCQlvcGFjaXR5OiBzaG93ID8gMSA6IDAKCQkJCX0sIG8uZHVyYXRpb24gfHwgNTAwLCBvLmVhc2luZywgY2hpbGRDb21wbGV0ZSApOwoJCX0KCX0KCglmdW5jdGlvbiBhbmltQ29tcGxldGUoKSB7CgkJZWwuY3NzKHsKCQkJdmlzaWJpbGl0eTogInZpc2libGUiCgkJfSk7CgkJJCggcGllY2VzICkucmVtb3ZlKCk7CgkJaWYgKCAhc2hvdyApIHsKCQkJZWwuaGlkZSgpOwoJCX0KCQlkb25lKCk7Cgl9Cn07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LmZhZGUgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgInRvZ2dsZSIgKTsKCgllbC5hbmltYXRlKHsKCQlvcGFjaXR5OiBtb2RlCgl9LCB7CgkJcXVldWU6IGZhbHNlLAoJCWR1cmF0aW9uOiBvLmR1cmF0aW9uLAoJCWVhc2luZzogby5lYXNpbmcsCgkJY29tcGxldGU6IGRvbmUKCX0pOwp9OwoKfSkoIGpRdWVyeSApOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LmZvbGQgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCgkvLyBDcmVhdGUgZWxlbWVudAoJdmFyIGVsID0gJCggdGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgImhlaWdodCIsICJ3aWR0aCIgXSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImhpZGUiICksCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQloaWRlID0gbW9kZSA9PT0gImhpZGUiLAoJCXNpemUgPSBvLnNpemUgfHwgMTUsCgkJcGVyY2VudCA9IC8oWzAtOV0rKSUvLmV4ZWMoIHNpemUgKSwKCQlob3JpekZpcnN0ID0gISFvLmhvcml6Rmlyc3QsCgkJd2lkdGhGaXJzdCA9IHNob3cgIT09IGhvcml6Rmlyc3QsCgkJcmVmID0gd2lkdGhGaXJzdCA/IFsgIndpZHRoIiwgImhlaWdodCIgXSA6IFsgImhlaWdodCIsICJ3aWR0aCIgXSwKCQlkdXJhdGlvbiA9IG8uZHVyYXRpb24gLyAyLAoJCXdyYXBwZXIsIGRpc3RhbmNlLAoJCWFuaW1hdGlvbjEgPSB7fSwKCQlhbmltYXRpb24yID0ge307CgoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoKCS8vIENyZWF0ZSBXcmFwcGVyCgl3cmFwcGVyID0gJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICkuY3NzKHsKCQlvdmVyZmxvdzogImhpZGRlbiIKCX0pOwoJZGlzdGFuY2UgPSB3aWR0aEZpcnN0ID8KCQlbIHdyYXBwZXIud2lkdGgoKSwgd3JhcHBlci5oZWlnaHQoKSBdIDoKCQlbIHdyYXBwZXIuaGVpZ2h0KCksIHdyYXBwZXIud2lkdGgoKSBdOwoKCWlmICggcGVyY2VudCApIHsKCQlzaXplID0gcGFyc2VJbnQoIHBlcmNlbnRbIDEgXSwgMTAgKSAvIDEwMCAqIGRpc3RhbmNlWyBoaWRlID8gMCA6IDEgXTsKCX0KCWlmICggc2hvdyApIHsKCQl3cmFwcGVyLmNzcyggaG9yaXpGaXJzdCA/IHsKCQkJaGVpZ2h0OiAwLAoJCQl3aWR0aDogc2l6ZQoJCX0gOiB7CgkJCWhlaWdodDogc2l6ZSwKCQkJd2lkdGg6IDAKCQl9KTsKCX0KCgkvLyBBbmltYXRpb24KCWFuaW1hdGlvbjFbIHJlZlsgMCBdIF0gPSBzaG93ID8gZGlzdGFuY2VbIDAgXSA6IHNpemU7CglhbmltYXRpb24yWyByZWZbIDEgXSBdID0gc2hvdyA/IGRpc3RhbmNlWyAxIF0gOiAwOwoKCS8vIEFuaW1hdGUKCXdyYXBwZXIKCQkuYW5pbWF0ZSggYW5pbWF0aW9uMSwgZHVyYXRpb24sIG8uZWFzaW5nICkKCQkuYW5pbWF0ZSggYW5pbWF0aW9uMiwgZHVyYXRpb24sIG8uZWFzaW5nLCBmdW5jdGlvbigpIHsKCQkJaWYgKCBoaWRlICkgewoJCQkJZWwuaGlkZSgpOwoJCQl9CgkJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbCwgcHJvcHMgKTsKCQkJJC5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoIGVsICk7CgkJCWRvbmUoKTsKCQl9KTsKCn07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LmhpZ2hsaWdodCA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJcHJvcHMgPSBbICJiYWNrZ3JvdW5kSW1hZ2UiLCAiYmFja2dyb3VuZENvbG9yIiwgIm9wYWNpdHkiIF0sCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbGVtLCBvLm1vZGUgfHwgInNob3ciICksCgkJYW5pbWF0aW9uID0gewoJCQliYWNrZ3JvdW5kQ29sb3I6IGVsZW0uY3NzKCAiYmFja2dyb3VuZENvbG9yIiApCgkJfTsKCglpZiAobW9kZSA9PT0gImhpZGUiKSB7CgkJYW5pbWF0aW9uLm9wYWNpdHkgPSAwOwoJfQoKCSQuZWZmZWN0cy5zYXZlKCBlbGVtLCBwcm9wcyApOwoKCWVsZW0KCQkuc2hvdygpCgkJLmNzcyh7CgkJCWJhY2tncm91bmRJbWFnZTogIm5vbmUiLAoJCQliYWNrZ3JvdW5kQ29sb3I6IG8uY29sb3IgfHwgIiNmZmZmOTkiCgkJfSkKCQkuYW5pbWF0ZSggYW5pbWF0aW9uLCB7CgkJCXF1ZXVlOiBmYWxzZSwKCQkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJCWVhc2luZzogby5lYXNpbmcsCgkJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbW9kZSA9PT0gImhpZGUiICkgewoJCQkJCWVsZW0uaGlkZSgpOwoJCQkJfQoJCQkJJC5lZmZlY3RzLnJlc3RvcmUoIGVsZW0sIHByb3BzICk7CgkJCQlkb25lKCk7CgkJCX0KCQl9KTsKfTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3QucHVsc2F0ZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbGVtLCBvLm1vZGUgfHwgInNob3ciICksCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQloaWRlID0gbW9kZSA9PT0gImhpZGUiLAoJCXNob3doaWRlID0gKCBzaG93IHx8IG1vZGUgPT09ICJoaWRlIiApLAoKCQkvLyBzaG93aW5nIG9yIGhpZGluZyBsZWF2ZXMgb2YgdGhlICJsYXN0IiBhbmltYXRpb24KCQlhbmltcyA9ICggKCBvLnRpbWVzIHx8IDUgKSAqIDIgKSArICggc2hvd2hpZGUgPyAxIDogMCApLAoJCWR1cmF0aW9uID0gby5kdXJhdGlvbiAvIGFuaW1zLAoJCWFuaW1hdGVUbyA9IDAsCgkJcXVldWUgPSBlbGVtLnF1ZXVlKCksCgkJcXVldWVsZW4gPSBxdWV1ZS5sZW5ndGgsCgkJaTsKCglpZiAoIHNob3cgfHwgIWVsZW0uaXMoIjp2aXNpYmxlIikpIHsKCQllbGVtLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpOwoJCWFuaW1hdGVUbyA9IDE7Cgl9CgoJLy8gYW5pbXMgLSAxIG9wYWNpdHkgInRvZ2dsZXMiCglmb3IgKCBpID0gMTsgaSA8IGFuaW1zOyBpKysgKSB7CgkJZWxlbS5hbmltYXRlKHsKCQkJb3BhY2l0eTogYW5pbWF0ZVRvCgkJfSwgZHVyYXRpb24sIG8uZWFzaW5nICk7CgkJYW5pbWF0ZVRvID0gMSAtIGFuaW1hdGVUbzsKCX0KCgllbGVtLmFuaW1hdGUoewoJCW9wYWNpdHk6IGFuaW1hdGVUbwoJfSwgZHVyYXRpb24sIG8uZWFzaW5nKTsKCgllbGVtLnF1ZXVlKGZ1bmN0aW9uKCkgewoJCWlmICggaGlkZSApIHsKCQkJZWxlbS5oaWRlKCk7CgkJfQoJCWRvbmUoKTsKCX0pOwoKCS8vIFdlIGp1c3QgcXVldWVkIHVwICJhbmltcyIgYW5pbWF0aW9ucywgd2UgbmVlZCB0byBwdXQgdGhlbSBuZXh0IGluIHRoZSBxdWV1ZQoJaWYgKCBxdWV1ZWxlbiA+IDEgKSB7CgkJcXVldWUuc3BsaWNlLmFwcGx5KCBxdWV1ZSwKCQkJWyAxLCAwIF0uY29uY2F0KCBxdWV1ZS5zcGxpY2UoIHF1ZXVlbGVuLCBhbmltcyArIDEgKSApICk7Cgl9CgllbGVtLmRlcXVldWUoKTsKfTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3QucHVmZiA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbGVtLCBvLm1vZGUgfHwgImhpZGUiICksCgkJaGlkZSA9IG1vZGUgPT09ICJoaWRlIiwKCQlwZXJjZW50ID0gcGFyc2VJbnQoIG8ucGVyY2VudCwgMTAgKSB8fCAxNTAsCgkJZmFjdG9yID0gcGVyY2VudCAvIDEwMCwKCQlvcmlnaW5hbCA9IHsKCQkJaGVpZ2h0OiBlbGVtLmhlaWdodCgpLAoJCQl3aWR0aDogZWxlbS53aWR0aCgpLAoJCQlvdXRlckhlaWdodDogZWxlbS5vdXRlckhlaWdodCgpLAoJCQlvdXRlcldpZHRoOiBlbGVtLm91dGVyV2lkdGgoKQoJCX07CgoJJC5leHRlbmQoIG8sIHsKCQllZmZlY3Q6ICJzY2FsZSIsCgkJcXVldWU6IGZhbHNlLAoJCWZhZGU6IHRydWUsCgkJbW9kZTogbW9kZSwKCQljb21wbGV0ZTogZG9uZSwKCQlwZXJjZW50OiBoaWRlID8gcGVyY2VudCA6IDEwMCwKCQlmcm9tOiBoaWRlID8KCQkJb3JpZ2luYWwgOgoJCQl7CgkJCQloZWlnaHQ6IG9yaWdpbmFsLmhlaWdodCAqIGZhY3RvciwKCQkJCXdpZHRoOiBvcmlnaW5hbC53aWR0aCAqIGZhY3RvciwKCQkJCW91dGVySGVpZ2h0OiBvcmlnaW5hbC5vdXRlckhlaWdodCAqIGZhY3RvciwKCQkJCW91dGVyV2lkdGg6IG9yaWdpbmFsLm91dGVyV2lkdGggKiBmYWN0b3IKCQkJfQoJfSk7CgoJZWxlbS5lZmZlY3QoIG8gKTsKfTsKCiQuZWZmZWN0cy5lZmZlY3Quc2NhbGUgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCgkvLyBDcmVhdGUgZWxlbWVudAoJdmFyIGVsID0gJCggdGhpcyApLAoJCW9wdGlvbnMgPSAkLmV4dGVuZCggdHJ1ZSwge30sIG8gKSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImVmZmVjdCIgKSwKCQlwZXJjZW50ID0gcGFyc2VJbnQoIG8ucGVyY2VudCwgMTAgKSB8fAoJCQkoIHBhcnNlSW50KCBvLnBlcmNlbnQsIDEwICkgPT09IDAgPyAwIDogKCBtb2RlID09PSAiaGlkZSIgPyAwIDogMTAwICkgKSwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAiYm90aCIsCgkJb3JpZ2luID0gby5vcmlnaW4sCgkJb3JpZ2luYWwgPSB7CgkJCWhlaWdodDogZWwuaGVpZ2h0KCksCgkJCXdpZHRoOiBlbC53aWR0aCgpLAoJCQlvdXRlckhlaWdodDogZWwub3V0ZXJIZWlnaHQoKSwKCQkJb3V0ZXJXaWR0aDogZWwub3V0ZXJXaWR0aCgpCgkJfSwKCQlmYWN0b3IgPSB7CgkJCXk6IGRpcmVjdGlvbiAhPT0gImhvcml6b250YWwiID8gKHBlcmNlbnQgLyAxMDApIDogMSwKCQkJeDogZGlyZWN0aW9uICE9PSAidmVydGljYWwiID8gKHBlcmNlbnQgLyAxMDApIDogMQoJCX07CgoJLy8gV2UgYXJlIGdvaW5nIHRvIHBhc3MgdGhpcyBlZmZlY3QgdG8gdGhlIHNpemUgZWZmZWN0OgoJb3B0aW9ucy5lZmZlY3QgPSAic2l6ZSI7CglvcHRpb25zLnF1ZXVlID0gZmFsc2U7CglvcHRpb25zLmNvbXBsZXRlID0gZG9uZTsKCgkvLyBTZXQgZGVmYXVsdCBvcmlnaW4gYW5kIHJlc3RvcmUgZm9yIHNob3cvaGlkZQoJaWYgKCBtb2RlICE9PSAiZWZmZWN0IiApIHsKCQlvcHRpb25zLm9yaWdpbiA9IG9yaWdpbiB8fCBbIm1pZGRsZSIsImNlbnRlciJdOwoJCW9wdGlvbnMucmVzdG9yZSA9IHRydWU7Cgl9CgoJb3B0aW9ucy5mcm9tID0gby5mcm9tIHx8ICggbW9kZSA9PT0gInNob3ciID8gewoJCWhlaWdodDogMCwKCQl3aWR0aDogMCwKCQlvdXRlckhlaWdodDogMCwKCQlvdXRlcldpZHRoOiAwCgl9IDogb3JpZ2luYWwgKTsKCW9wdGlvbnMudG8gPSB7CgkJaGVpZ2h0OiBvcmlnaW5hbC5oZWlnaHQgKiBmYWN0b3IueSwKCQl3aWR0aDogb3JpZ2luYWwud2lkdGggKiBmYWN0b3IueCwKCQlvdXRlckhlaWdodDogb3JpZ2luYWwub3V0ZXJIZWlnaHQgKiBmYWN0b3IueSwKCQlvdXRlcldpZHRoOiBvcmlnaW5hbC5vdXRlcldpZHRoICogZmFjdG9yLngKCX07CgoJLy8gRmFkZSBvcHRpb24gdG8gc3VwcG9ydCBwdWZmCglpZiAoIG9wdGlvbnMuZmFkZSApIHsKCQlpZiAoIG1vZGUgPT09ICJzaG93IiApIHsKCQkJb3B0aW9ucy5mcm9tLm9wYWNpdHkgPSAwOwoJCQlvcHRpb25zLnRvLm9wYWNpdHkgPSAxOwoJCX0KCQlpZiAoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJb3B0aW9ucy5mcm9tLm9wYWNpdHkgPSAxOwoJCQlvcHRpb25zLnRvLm9wYWNpdHkgPSAwOwoJCX0KCX0KCgkvLyBBbmltYXRlCgllbC5lZmZlY3QoIG9wdGlvbnMgKTsKCn07CgokLmVmZmVjdHMuZWZmZWN0LnNpemUgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCgkvLyBDcmVhdGUgZWxlbWVudAoJdmFyIG9yaWdpbmFsLCBiYXNlbGluZSwgZmFjdG9yLAoJCWVsID0gJCggdGhpcyApLAoJCXByb3BzMCA9IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJ3aWR0aCIsICJoZWlnaHQiLCAib3ZlcmZsb3ciLCAib3BhY2l0eSIgXSwKCgkJLy8gQWx3YXlzIHJlc3RvcmUKCQlwcm9wczEgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAib3ZlcmZsb3ciLCAib3BhY2l0eSIgXSwKCgkJLy8gQ29weSBmb3IgY2hpbGRyZW4KCQlwcm9wczIgPSBbICJ3aWR0aCIsICJoZWlnaHQiLCAib3ZlcmZsb3ciIF0sCgkJY1Byb3BzID0gWyAiZm9udFNpemUiIF0sCgkJdlByb3BzID0gWyAiYm9yZGVyVG9wV2lkdGgiLCAiYm9yZGVyQm90dG9tV2lkdGgiLCAicGFkZGluZ1RvcCIsICJwYWRkaW5nQm90dG9tIiBdLAoJCWhQcm9wcyA9IFsgImJvcmRlckxlZnRXaWR0aCIsICJib3JkZXJSaWdodFdpZHRoIiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIgXSwKCgkJLy8gU2V0IG9wdGlvbnMKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImVmZmVjdCIgKSwKCQlyZXN0b3JlID0gby5yZXN0b3JlIHx8IG1vZGUgIT09ICJlZmZlY3QiLAoJCXNjYWxlID0gby5zY2FsZSB8fCAiYm90aCIsCgkJb3JpZ2luID0gby5vcmlnaW4gfHwgWyAibWlkZGxlIiwgImNlbnRlciIgXSwKCQlwb3NpdGlvbiA9IGVsLmNzcyggInBvc2l0aW9uIiApLAoJCXByb3BzID0gcmVzdG9yZSA/IHByb3BzMCA6IHByb3BzMSwKCQl6ZXJvID0gewoJCQloZWlnaHQ6IDAsCgkJCXdpZHRoOiAwLAoJCQlvdXRlckhlaWdodDogMCwKCQkJb3V0ZXJXaWR0aDogMAoJCX07CgoJaWYgKCBtb2RlID09PSAic2hvdyIgKSB7CgkJZWwuc2hvdygpOwoJfQoJb3JpZ2luYWwgPSB7CgkJaGVpZ2h0OiBlbC5oZWlnaHQoKSwKCQl3aWR0aDogZWwud2lkdGgoKSwKCQlvdXRlckhlaWdodDogZWwub3V0ZXJIZWlnaHQoKSwKCQlvdXRlcldpZHRoOiBlbC5vdXRlcldpZHRoKCkKCX07CgoJaWYgKCBvLm1vZGUgPT09ICJ0b2dnbGUiICYmIG1vZGUgPT09ICJzaG93IiApIHsKCQllbC5mcm9tID0gby50byB8fCB6ZXJvOwoJCWVsLnRvID0gby5mcm9tIHx8IG9yaWdpbmFsOwoJfSBlbHNlIHsKCQllbC5mcm9tID0gby5mcm9tIHx8ICggbW9kZSA9PT0gInNob3ciID8gemVybyA6IG9yaWdpbmFsICk7CgkJZWwudG8gPSBvLnRvIHx8ICggbW9kZSA9PT0gImhpZGUiID8gemVybyA6IG9yaWdpbmFsICk7Cgl9CgoJLy8gU2V0IHNjYWxpbmcgZmFjdG9yCglmYWN0b3IgPSB7CgkJZnJvbTogewoJCQl5OiBlbC5mcm9tLmhlaWdodCAvIG9yaWdpbmFsLmhlaWdodCwKCQkJeDogZWwuZnJvbS53aWR0aCAvIG9yaWdpbmFsLndpZHRoCgkJfSwKCQl0bzogewoJCQl5OiBlbC50by5oZWlnaHQgLyBvcmlnaW5hbC5oZWlnaHQsCgkJCXg6IGVsLnRvLndpZHRoIC8gb3JpZ2luYWwud2lkdGgKCQl9Cgl9OwoKCS8vIFNjYWxlIHRoZSBjc3MgYm94CglpZiAoIHNjYWxlID09PSAiYm94IiB8fCBzY2FsZSA9PT0gImJvdGgiICkgewoKCQkvLyBWZXJ0aWNhbCBwcm9wcyBzY2FsaW5nCgkJaWYgKCBmYWN0b3IuZnJvbS55ICE9PSBmYWN0b3IudG8ueSApIHsKCQkJcHJvcHMgPSBwcm9wcy5jb25jYXQoIHZQcm9wcyApOwoJCQllbC5mcm9tID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGVsLCB2UHJvcHMsIGZhY3Rvci5mcm9tLnksIGVsLmZyb20gKTsKCQkJZWwudG8gPSAkLmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggZWwsIHZQcm9wcywgZmFjdG9yLnRvLnksIGVsLnRvICk7CgkJfQoKCQkvLyBIb3Jpem9udGFsIHByb3BzIHNjYWxpbmcKCQlpZiAoIGZhY3Rvci5mcm9tLnggIT09IGZhY3Rvci50by54ICkgewoJCQlwcm9wcyA9IHByb3BzLmNvbmNhdCggaFByb3BzICk7CgkJCWVsLmZyb20gPSAkLmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggZWwsIGhQcm9wcywgZmFjdG9yLmZyb20ueCwgZWwuZnJvbSApOwoJCQllbC50byA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBlbCwgaFByb3BzLCBmYWN0b3IudG8ueCwgZWwudG8gKTsKCQl9Cgl9CgoJLy8gU2NhbGUgdGhlIGNvbnRlbnQKCWlmICggc2NhbGUgPT09ICJjb250ZW50IiB8fCBzY2FsZSA9PT0gImJvdGgiICkgewoKCQkvLyBWZXJ0aWNhbCBwcm9wcyBzY2FsaW5nCgkJaWYgKCBmYWN0b3IuZnJvbS55ICE9PSBmYWN0b3IudG8ueSApIHsKCQkJcHJvcHMgPSBwcm9wcy5jb25jYXQoIGNQcm9wcyApLmNvbmNhdCggcHJvcHMyICk7CgkJCWVsLmZyb20gPSAkLmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggZWwsIGNQcm9wcywgZmFjdG9yLmZyb20ueSwgZWwuZnJvbSApOwoJCQllbC50byA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBlbCwgY1Byb3BzLCBmYWN0b3IudG8ueSwgZWwudG8gKTsKCQl9Cgl9CgoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoJJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICk7CgllbC5jc3MoICJvdmVyZmxvdyIsICJoaWRkZW4iICkuY3NzKCBlbC5mcm9tICk7CgoJLy8gQWRqdXN0CglpZiAob3JpZ2luKSB7IC8vIENhbGN1bGF0ZSBiYXNlbGluZSBzaGlmdHMKCQliYXNlbGluZSA9ICQuZWZmZWN0cy5nZXRCYXNlbGluZSggb3JpZ2luLCBvcmlnaW5hbCApOwoJCWVsLmZyb20udG9wID0gKCBvcmlnaW5hbC5vdXRlckhlaWdodCAtIGVsLm91dGVySGVpZ2h0KCkgKSAqIGJhc2VsaW5lLnk7CgkJZWwuZnJvbS5sZWZ0ID0gKCBvcmlnaW5hbC5vdXRlcldpZHRoIC0gZWwub3V0ZXJXaWR0aCgpICkgKiBiYXNlbGluZS54OwoJCWVsLnRvLnRvcCA9ICggb3JpZ2luYWwub3V0ZXJIZWlnaHQgLSBlbC50by5vdXRlckhlaWdodCApICogYmFzZWxpbmUueTsKCQllbC50by5sZWZ0ID0gKCBvcmlnaW5hbC5vdXRlcldpZHRoIC0gZWwudG8ub3V0ZXJXaWR0aCApICogYmFzZWxpbmUueDsKCX0KCWVsLmNzcyggZWwuZnJvbSApOyAvLyBzZXQgdG9wICYgbGVmdAoKCS8vIEFuaW1hdGUKCWlmICggc2NhbGUgPT09ICJjb250ZW50IiB8fCBzY2FsZSA9PT0gImJvdGgiICkgeyAvLyBTY2FsZSB0aGUgY2hpbGRyZW4KCgkJLy8gQWRkIG1hcmdpbnMvZm9udC1zaXplCgkJdlByb3BzID0gdlByb3BzLmNvbmNhdChbICJtYXJnaW5Ub3AiLCAibWFyZ2luQm90dG9tIiBdKS5jb25jYXQoY1Byb3BzKTsKCQloUHJvcHMgPSBoUHJvcHMuY29uY2F0KFsgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiIF0pOwoJCXByb3BzMiA9IHByb3BzMC5jb25jYXQodlByb3BzKS5jb25jYXQoaFByb3BzKTsKCgkJZWwuZmluZCggIipbd2lkdGhdIiApLmVhY2goIGZ1bmN0aW9uKCl7CgkJCXZhciBjaGlsZCA9ICQoIHRoaXMgKSwKCQkJCWNfb3JpZ2luYWwgPSB7CgkJCQkJaGVpZ2h0OiBjaGlsZC5oZWlnaHQoKSwKCQkJCQl3aWR0aDogY2hpbGQud2lkdGgoKSwKCQkJCQlvdXRlckhlaWdodDogY2hpbGQub3V0ZXJIZWlnaHQoKSwKCQkJCQlvdXRlcldpZHRoOiBjaGlsZC5vdXRlcldpZHRoKCkKCQkJCX07CgkJCWlmIChyZXN0b3JlKSB7CgkJCQkkLmVmZmVjdHMuc2F2ZShjaGlsZCwgcHJvcHMyKTsKCQkJfQoKCQkJY2hpbGQuZnJvbSA9IHsKCQkJCWhlaWdodDogY19vcmlnaW5hbC5oZWlnaHQgKiBmYWN0b3IuZnJvbS55LAoJCQkJd2lkdGg6IGNfb3JpZ2luYWwud2lkdGggKiBmYWN0b3IuZnJvbS54LAoJCQkJb3V0ZXJIZWlnaHQ6IGNfb3JpZ2luYWwub3V0ZXJIZWlnaHQgKiBmYWN0b3IuZnJvbS55LAoJCQkJb3V0ZXJXaWR0aDogY19vcmlnaW5hbC5vdXRlcldpZHRoICogZmFjdG9yLmZyb20ueAoJCQl9OwoJCQljaGlsZC50byA9IHsKCQkJCWhlaWdodDogY19vcmlnaW5hbC5oZWlnaHQgKiBmYWN0b3IudG8ueSwKCQkJCXdpZHRoOiBjX29yaWdpbmFsLndpZHRoICogZmFjdG9yLnRvLngsCgkJCQlvdXRlckhlaWdodDogY19vcmlnaW5hbC5oZWlnaHQgKiBmYWN0b3IudG8ueSwKCQkJCW91dGVyV2lkdGg6IGNfb3JpZ2luYWwud2lkdGggKiBmYWN0b3IudG8ueAoJCQl9OwoKCQkJLy8gVmVydGljYWwgcHJvcHMgc2NhbGluZwoJCQlpZiAoIGZhY3Rvci5mcm9tLnkgIT09IGZhY3Rvci50by55ICkgewoJCQkJY2hpbGQuZnJvbSA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBjaGlsZCwgdlByb3BzLCBmYWN0b3IuZnJvbS55LCBjaGlsZC5mcm9tICk7CgkJCQljaGlsZC50byA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBjaGlsZCwgdlByb3BzLCBmYWN0b3IudG8ueSwgY2hpbGQudG8gKTsKCQkJfQoKCQkJLy8gSG9yaXpvbnRhbCBwcm9wcyBzY2FsaW5nCgkJCWlmICggZmFjdG9yLmZyb20ueCAhPT0gZmFjdG9yLnRvLnggKSB7CgkJCQljaGlsZC5mcm9tID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGNoaWxkLCBoUHJvcHMsIGZhY3Rvci5mcm9tLngsIGNoaWxkLmZyb20gKTsKCQkJCWNoaWxkLnRvID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGNoaWxkLCBoUHJvcHMsIGZhY3Rvci50by54LCBjaGlsZC50byApOwoJCQl9CgoJCQkvLyBBbmltYXRlIGNoaWxkcmVuCgkJCWNoaWxkLmNzcyggY2hpbGQuZnJvbSApOwoJCQljaGlsZC5hbmltYXRlKCBjaGlsZC50bywgby5kdXJhdGlvbiwgby5lYXNpbmcsIGZ1bmN0aW9uKCkgewoKCQkJCS8vIFJlc3RvcmUgY2hpbGRyZW4KCQkJCWlmICggcmVzdG9yZSApIHsKCQkJCQkkLmVmZmVjdHMucmVzdG9yZSggY2hpbGQsIHByb3BzMiApOwoJCQkJfQoJCQl9KTsKCQl9KTsKCX0KCgkvLyBBbmltYXRlCgllbC5hbmltYXRlKCBlbC50bywgewoJCXF1ZXVlOiBmYWxzZSwKCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQllYXNpbmc6IG8uZWFzaW5nLAoJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJaWYgKCBlbC50by5vcGFjaXR5ID09PSAwICkgewoJCQkJZWwuY3NzKCAib3BhY2l0eSIsIGVsLmZyb20ub3BhY2l0eSApOwoJCQl9CgkJCWlmKCBtb2RlID09PSAiaGlkZSIgKSB7CgkJCQllbC5oaWRlKCk7CgkJCX0KCQkJJC5lZmZlY3RzLnJlc3RvcmUoIGVsLCBwcm9wcyApOwoJCQlpZiAoICFyZXN0b3JlICkgewoKCQkJCS8vIHdlIG5lZWQgdG8gY2FsY3VsYXRlIG91ciBuZXcgcG9zaXRpb25pbmcgYmFzZWQgb24gdGhlIHNjYWxpbmcKCQkJCWlmICggcG9zaXRpb24gPT09ICJzdGF0aWMiICkgewoJCQkJCWVsLmNzcyh7CgkJCQkJCXBvc2l0aW9uOiAicmVsYXRpdmUiLAoJCQkJCQl0b3A6IGVsLnRvLnRvcCwKCQkJCQkJbGVmdDogZWwudG8ubGVmdAoJCQkJCX0pOwoJCQkJfSBlbHNlIHsKCQkJCQkkLmVhY2goWyAidG9wIiwgImxlZnQiIF0sIGZ1bmN0aW9uKCBpZHgsIHBvcyApIHsKCQkJCQkJZWwuY3NzKCBwb3MsIGZ1bmN0aW9uKCBfLCBzdHIgKSB7CgkJCQkJCQl2YXIgdmFsID0gcGFyc2VJbnQoIHN0ciwgMTAgKSwKCQkJCQkJCQl0b1JlZiA9IGlkeCA/IGVsLnRvLmxlZnQgOiBlbC50by50b3A7CgoJCQkJCQkJLy8gaWYgb3JpZ2luYWwgd2FzICJhdXRvIiwgcmVjYWxjdWxhdGUgdGhlIG5ldyB2YWx1ZSBmcm9tIHdyYXBwZXIKCQkJCQkJCWlmICggc3RyID09PSAiYXV0byIgKSB7CgkJCQkJCQkJcmV0dXJuIHRvUmVmICsgInB4IjsKCQkJCQkJCX0KCgkJCQkJCQlyZXR1cm4gdmFsICsgdG9SZWYgKyAicHgiOwoJCQkJCQl9KTsKCQkJCQl9KTsKCQkJCX0KCQkJfQoKCQkJJC5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoIGVsICk7CgkJCWRvbmUoKTsKCQl9Cgl9KTsKCn07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LnNoYWtlID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7CgoJdmFyIGVsID0gJCggdGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgImhlaWdodCIsICJ3aWR0aCIgXSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImVmZmVjdCIgKSwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAibGVmdCIsCgkJZGlzdGFuY2UgPSBvLmRpc3RhbmNlIHx8IDIwLAoJCXRpbWVzID0gby50aW1lcyB8fCAzLAoJCWFuaW1zID0gdGltZXMgKiAyICsgMSwKCQlzcGVlZCA9IE1hdGgucm91bmQoby5kdXJhdGlvbi9hbmltcyksCgkJcmVmID0gKGRpcmVjdGlvbiA9PT0gInVwIiB8fCBkaXJlY3Rpb24gPT09ICJkb3duIikgPyAidG9wIiA6ICJsZWZ0IiwKCQlwb3NpdGl2ZU1vdGlvbiA9IChkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAibGVmdCIpLAoJCWFuaW1hdGlvbiA9IHt9LAoJCWFuaW1hdGlvbjEgPSB7fSwKCQlhbmltYXRpb24yID0ge30sCgkJaSwKCgkJLy8gd2Ugd2lsbCBuZWVkIHRvIHJlLWFzc2VtYmxlIHRoZSBxdWV1ZSB0byBzdGFjayBvdXIgYW5pbWF0aW9ucyBpbiBwbGFjZQoJCXF1ZXVlID0gZWwucXVldWUoKSwKCQlxdWV1ZWxlbiA9IHF1ZXVlLmxlbmd0aDsKCgkkLmVmZmVjdHMuc2F2ZSggZWwsIHByb3BzICk7CgllbC5zaG93KCk7CgkkLmVmZmVjdHMuY3JlYXRlV3JhcHBlciggZWwgKTsKCgkvLyBBbmltYXRpb24KCWFuaW1hdGlvblsgcmVmIF0gPSAoIHBvc2l0aXZlTW90aW9uID8gIi09IiA6ICIrPSIgKSArIGRpc3RhbmNlOwoJYW5pbWF0aW9uMVsgcmVmIF0gPSAoIHBvc2l0aXZlTW90aW9uID8gIis9IiA6ICItPSIgKSArIGRpc3RhbmNlICogMjsKCWFuaW1hdGlvbjJbIHJlZiBdID0gKCBwb3NpdGl2ZU1vdGlvbiA/ICItPSIgOiAiKz0iICkgKyBkaXN0YW5jZSAqIDI7CgoJLy8gQW5pbWF0ZQoJZWwuYW5pbWF0ZSggYW5pbWF0aW9uLCBzcGVlZCwgby5lYXNpbmcgKTsKCgkvLyBTaGFrZXMKCWZvciAoIGkgPSAxOyBpIDwgdGltZXM7IGkrKyApIHsKCQllbC5hbmltYXRlKCBhbmltYXRpb24xLCBzcGVlZCwgby5lYXNpbmcgKS5hbmltYXRlKCBhbmltYXRpb24yLCBzcGVlZCwgby5lYXNpbmcgKTsKCX0KCWVsCgkJLmFuaW1hdGUoIGFuaW1hdGlvbjEsIHNwZWVkLCBvLmVhc2luZyApCgkJLmFuaW1hdGUoIGFuaW1hdGlvbiwgc3BlZWQgLyAyLCBvLmVhc2luZyApCgkJLnF1ZXVlKGZ1bmN0aW9uKCkgewoJCQlpZiAoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfSk7CgoJLy8gaW5qZWN0IGFsbCB0aGUgYW5pbWF0aW9ucyB3ZSBqdXN0IHF1ZXVlZCB0byBiZSBmaXJzdCBpbiBsaW5lIChhZnRlciAiaW5wcm9ncmVzcyIpCglpZiAoIHF1ZXVlbGVuID4gMSkgewoJCXF1ZXVlLnNwbGljZS5hcHBseSggcXVldWUsCgkJCVsgMSwgMCBdLmNvbmNhdCggcXVldWUuc3BsaWNlKCBxdWV1ZWxlbiwgYW5pbXMgKyAxICkgKSApOwoJfQoJZWwuZGVxdWV1ZSgpOwoKfTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3Quc2xpZGUgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCgkvLyBDcmVhdGUgZWxlbWVudAoJdmFyIGVsID0gJCggdGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgIndpZHRoIiwgImhlaWdodCIgXSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgInNob3ciICksCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAibGVmdCIsCgkJcmVmID0gKGRpcmVjdGlvbiA9PT0gInVwIiB8fCBkaXJlY3Rpb24gPT09ICJkb3duIikgPyAidG9wIiA6ICJsZWZ0IiwKCQlwb3NpdGl2ZU1vdGlvbiA9IChkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAibGVmdCIpLAoJCWRpc3RhbmNlLAoJCWFuaW1hdGlvbiA9IHt9OwoKCS8vIEFkanVzdAoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoJZGlzdGFuY2UgPSBvLmRpc3RhbmNlIHx8IGVsWyByZWYgPT09ICJ0b3AiID8gIm91dGVySGVpZ2h0IiA6ICJvdXRlcldpZHRoIiBdKCB0cnVlICk7CgoJJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICkuY3NzKHsKCQlvdmVyZmxvdzogImhpZGRlbiIKCX0pOwoKCWlmICggc2hvdyApIHsKCQllbC5jc3MoIHJlZiwgcG9zaXRpdmVNb3Rpb24gPyAoaXNOYU4oZGlzdGFuY2UpID8gIi0iICsgZGlzdGFuY2UgOiAtZGlzdGFuY2UpIDogZGlzdGFuY2UgKTsKCX0KCgkvLyBBbmltYXRpb24KCWFuaW1hdGlvblsgcmVmIF0gPSAoIHNob3cgPwoJCSggcG9zaXRpdmVNb3Rpb24gPyAiKz0iIDogIi09IikgOgoJCSggcG9zaXRpdmVNb3Rpb24gPyAiLT0iIDogIis9IikpICsKCQlkaXN0YW5jZTsKCgkvLyBBbmltYXRlCgllbC5hbmltYXRlKCBhbmltYXRpb24sIHsKCQlxdWV1ZTogZmFsc2UsCgkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJZWFzaW5nOiBvLmVhc2luZywKCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCWlmICggbW9kZSA9PT0gImhpZGUiICkgewoJCQkJZWwuaGlkZSgpOwoJCQl9CgkJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbCwgcHJvcHMgKTsKCQkJJC5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoIGVsICk7CgkJCWRvbmUoKTsKCQl9Cgl9KTsKfTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3QudHJhbnNmZXIgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCXZhciBlbGVtID0gJCggdGhpcyApLAoJCXRhcmdldCA9ICQoIG8udG8gKSwKCQl0YXJnZXRGaXhlZCA9IHRhcmdldC5jc3MoICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiwKCQlib2R5ID0gJCgiYm9keSIpLAoJCWZpeFRvcCA9IHRhcmdldEZpeGVkID8gYm9keS5zY3JvbGxUb3AoKSA6IDAsCgkJZml4TGVmdCA9IHRhcmdldEZpeGVkID8gYm9keS5zY3JvbGxMZWZ0KCkgOiAwLAoJCWVuZFBvc2l0aW9uID0gdGFyZ2V0Lm9mZnNldCgpLAoJCWFuaW1hdGlvbiA9IHsKCQkJdG9wOiBlbmRQb3NpdGlvbi50b3AgLSBmaXhUb3AgLAoJCQlsZWZ0OiBlbmRQb3NpdGlvbi5sZWZ0IC0gZml4TGVmdCAsCgkJCWhlaWdodDogdGFyZ2V0LmlubmVySGVpZ2h0KCksCgkJCXdpZHRoOiB0YXJnZXQuaW5uZXJXaWR0aCgpCgkJfSwKCQlzdGFydFBvc2l0aW9uID0gZWxlbS5vZmZzZXQoKSwKCQl0cmFuc2ZlciA9ICQoICI8ZGl2IGNsYXNzPSd1aS1lZmZlY3RzLXRyYW5zZmVyJz48L2Rpdj4iICkKCQkJLmFwcGVuZFRvKCBkb2N1bWVudC5ib2R5ICkKCQkJLmFkZENsYXNzKCBvLmNsYXNzTmFtZSApCgkJCS5jc3MoewoJCQkJdG9wOiBzdGFydFBvc2l0aW9uLnRvcCAtIGZpeFRvcCAsCgkJCQlsZWZ0OiBzdGFydFBvc2l0aW9uLmxlZnQgLSBmaXhMZWZ0ICwKCQkJCWhlaWdodDogZWxlbS5pbm5lckhlaWdodCgpLAoJCQkJd2lkdGg6IGVsZW0uaW5uZXJXaWR0aCgpLAoJCQkJcG9zaXRpb246IHRhcmdldEZpeGVkID8gImZpeGVkIiA6ICJhYnNvbHV0ZSIKCQkJfSkKCQkJLmFuaW1hdGUoIGFuaW1hdGlvbiwgby5kdXJhdGlvbiwgby5lYXNpbmcsIGZ1bmN0aW9uKCkgewoJCQkJdHJhbnNmZXIucmVtb3ZlKCk7CgkJCQlkb25lKCk7CgkJCX0pOwp9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC53aWRnZXQoICJ1aS5tZW51IiwgewoJdmVyc2lvbjogIjEuMTAuMyIsCglkZWZhdWx0RWxlbWVudDogIjx1bD4iLAoJZGVsYXk6IDMwMCwKCW9wdGlvbnM6IHsKCQlpY29uczogewoJCQlzdWJtZW51OiAidWktaWNvbi1jYXJhdC0xLWUiCgkJfSwKCQltZW51czogInVsIiwKCQlwb3NpdGlvbjogewoJCQlteTogImxlZnQgdG9wIiwKCQkJYXQ6ICJyaWdodCB0b3AiCgkJfSwKCQlyb2xlOiAibWVudSIsCgoJCS8vIGNhbGxiYWNrcwoJCWJsdXI6IG51bGwsCgkJZm9jdXM6IG51bGwsCgkJc2VsZWN0OiBudWxsCgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuYWN0aXZlTWVudSA9IHRoaXMuZWxlbWVudDsKCQkvLyBmbGFnIHVzZWQgdG8gcHJldmVudCBmaXJpbmcgb2YgdGhlIGNsaWNrIGhhbmRsZXIKCQkvLyBhcyB0aGUgZXZlbnQgYnViYmxlcyB1cCB0aHJvdWdoIG5lc3RlZCBtZW51cwoJCXRoaXMubW91c2VIYW5kbGVkID0gZmFsc2U7CgkJdGhpcy5lbGVtZW50CgkJCS51bmlxdWVJZCgpCgkJCS5hZGRDbGFzcyggInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiICkKCQkJLnRvZ2dsZUNsYXNzKCAidWktbWVudS1pY29ucyIsICEhdGhpcy5lbGVtZW50LmZpbmQoICIudWktaWNvbiIgKS5sZW5ndGggKQoJCQkuYXR0cih7CgkJCQlyb2xlOiB0aGlzLm9wdGlvbnMucm9sZSwKCQkJCXRhYkluZGV4OiAwCgkJCX0pCgkJCS8vIG5lZWQgdG8gY2F0Y2ggYWxsIGNsaWNrcyBvbiBkaXNhYmxlZCBtZW51CgkJCS8vIG5vdCBwb3NzaWJsZSB0aHJvdWdoIF9vbgoJCQkuYmluZCggImNsaWNrIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsICQucHJveHkoZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCX0KCQkJfSwgdGhpcyApKTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCXRoaXMuZWxlbWVudAoJCQkJLmFkZENsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkKCQkJCS5hdHRyKCAiYXJpYS1kaXNhYmxlZCIsICJ0cnVlIiApOwoJCX0KCgkJdGhpcy5fb24oewoJCQkvLyBQcmV2ZW50IGZvY3VzIGZyb20gc3RpY2tpbmcgdG8gbGlua3MgaW5zaWRlIG1lbnUgYWZ0ZXIgY2xpY2tpbmcKCQkJLy8gdGhlbSAoZm9jdXMgc2hvdWxkIGFsd2F5cyBzdGF5IG9uIFVMIGR1cmluZyBuYXZpZ2F0aW9uKS4KCQkJIm1vdXNlZG93biAudWktbWVudS1pdGVtID4gYSI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCX0sCgkJCSJjbGljayAudWktc3RhdGUtZGlzYWJsZWQgPiBhIjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfSwKCQkJImNsaWNrIC51aS1tZW51LWl0ZW06aGFzKGEpIjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJdmFyIHRhcmdldCA9ICQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoICIudWktbWVudS1pdGVtIiApOwoJCQkJaWYgKCAhdGhpcy5tb3VzZUhhbmRsZWQgJiYgdGFyZ2V0Lm5vdCggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKS5sZW5ndGggKSB7CgkJCQkJdGhpcy5tb3VzZUhhbmRsZWQgPSB0cnVlOwoKCQkJCQl0aGlzLnNlbGVjdCggZXZlbnQgKTsKCQkJCQkvLyBPcGVuIHN1Ym1lbnUgb24gY2xpY2sKCQkJCQlpZiAoIHRhcmdldC5oYXMoICIudWktbWVudSIgKS5sZW5ndGggKSB7CgkJCQkJCXRoaXMuZXhwYW5kKCBldmVudCApOwoJCQkJCX0gZWxzZSBpZiAoICF0aGlzLmVsZW1lbnQuaXMoICI6Zm9jdXMiICkgKSB7CgkJCQkJCS8vIFJlZGlyZWN0IGZvY3VzIHRvIHRoZSBtZW51CgkJCQkJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCAiZm9jdXMiLCBbIHRydWUgXSApOwoKCQkJCQkJLy8gSWYgdGhlIGFjdGl2ZSBpdGVtIGlzIG9uIHRoZSB0b3AgbGV2ZWwsIGxldCBpdCBzdGF5IGFjdGl2ZS4KCQkJCQkJLy8gT3RoZXJ3aXNlLCBibHVyIHRoZSBhY3RpdmUgaXRlbSBzaW5jZSBpdCBpcyBubyBsb25nZXIgdmlzaWJsZS4KCQkJCQkJaWYgKCB0aGlzLmFjdGl2ZSAmJiB0aGlzLmFjdGl2ZS5wYXJlbnRzKCAiLnVpLW1lbnUiICkubGVuZ3RoID09PSAxICkgewoJCQkJCQkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0sCgkJCSJtb3VzZWVudGVyIC51aS1tZW51LWl0ZW0iOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gJCggZXZlbnQuY3VycmVudFRhcmdldCApOwoJCQkJLy8gUmVtb3ZlIHVpLXN0YXRlLWFjdGl2ZSBjbGFzcyBmcm9tIHNpYmxpbmdzIG9mIHRoZSBuZXdseSBmb2N1c2VkIG1lbnUgaXRlbQoJCQkJLy8gdG8gYXZvaWQgYSBqdW1wIGNhdXNlZCBieSBhZGphY2VudCBlbGVtZW50cyBib3RoIGhhdmluZyBhIGNsYXNzIHdpdGggYSBib3JkZXIKCQkJCXRhcmdldC5zaWJsaW5ncygpLmNoaWxkcmVuKCAiLnVpLXN0YXRlLWFjdGl2ZSIgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCXRoaXMuZm9jdXMoIGV2ZW50LCB0YXJnZXQgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogImNvbGxhcHNlQWxsIiwKCQkJIm1vdXNlbGVhdmUgLnVpLW1lbnUiOiAiY29sbGFwc2VBbGwiLAoJCQlmb2N1czogZnVuY3Rpb24oIGV2ZW50LCBrZWVwQWN0aXZlSXRlbSApIHsKCQkJCS8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhbiBhY3RpdmUgaXRlbSwga2VlcCBpdCBhY3RpdmUKCQkJCS8vIElmIG5vdCwgYWN0aXZhdGUgdGhlIGZpcnN0IGl0ZW0KCQkJCXZhciBpdGVtID0gdGhpcy5hY3RpdmUgfHwgdGhpcy5lbGVtZW50LmNoaWxkcmVuKCAiLnVpLW1lbnUtaXRlbSIgKS5lcSggMCApOwoKCQkJCWlmICggIWtlZXBBY3RpdmVJdGVtICkgewoJCQkJCXRoaXMuZm9jdXMoIGV2ZW50LCBpdGVtICk7CgkJCQl9CgkJCX0sCgkJCWJsdXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJCWlmICggISQuY29udGFpbnMoIHRoaXMuZWxlbWVudFswXSwgdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50ICkgKSB7CgkJCQkJCXRoaXMuY29sbGFwc2VBbGwoIGV2ZW50ICk7CgkJCQkJfQoJCQkJfSk7CgkJCX0sCgkJCWtleWRvd246ICJfa2V5ZG93biIKCQl9KTsKCgkJdGhpcy5yZWZyZXNoKCk7CgoJCS8vIENsaWNrcyBvdXRzaWRlIG9mIGEgbWVudSBjb2xsYXBzZSBhbnkgb3BlbiBtZW51cwoJCXRoaXMuX29uKCB0aGlzLmRvY3VtZW50LCB7CgkJCWNsaWNrOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoICEkKCBldmVudC50YXJnZXQgKS5jbG9zZXN0KCAiLnVpLW1lbnUiICkubGVuZ3RoICkgewoJCQkJCXRoaXMuY29sbGFwc2VBbGwoIGV2ZW50ICk7CgkJCQl9CgoJCQkJLy8gUmVzZXQgdGhlIG1vdXNlSGFuZGxlZCBmbGFnCgkJCQl0aGlzLm1vdXNlSGFuZGxlZCA9IGZhbHNlOwoJCQl9CgkJfSk7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQkvLyBEZXN0cm95IChzdWIpbWVudXMKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiICkKCQkJLmZpbmQoICIudWktbWVudSIgKS5hZGRCYWNrKCkKCQkJCS5yZW1vdmVDbGFzcyggInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktbWVudS1pY29ucyIgKQoJCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCQkucmVtb3ZlQXR0ciggInRhYkluZGV4IiApCgkJCQkucmVtb3ZlQXR0ciggImFyaWEtbGFiZWxsZWRieSIgKQoJCQkJLnJlbW92ZUF0dHIoICJhcmlhLWV4cGFuZGVkIiApCgkJCQkucmVtb3ZlQXR0ciggImFyaWEtaGlkZGVuIiApCgkJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICkKCQkJCS5yZW1vdmVVbmlxdWVJZCgpCgkJCQkuc2hvdygpOwoKCQkvLyBEZXN0cm95IG1lbnUgaXRlbXMKCQl0aGlzLmVsZW1lbnQuZmluZCggIi51aS1tZW51LWl0ZW0iICkKCQkJLnJlbW92ZUNsYXNzKCAidWktbWVudS1pdGVtIiApCgkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICkKCQkJLmNoaWxkcmVuKCAiYSIgKQoJCQkJLnJlbW92ZVVuaXF1ZUlkKCkKCQkJCS5yZW1vdmVDbGFzcyggInVpLWNvcm5lci1hbGwgdWktc3RhdGUtaG92ZXIiICkKCQkJCS5yZW1vdmVBdHRyKCAidGFiSW5kZXgiICkKCQkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkJLnJlbW92ZUF0dHIoICJhcmlhLWhhc3BvcHVwIiApCgkJCQkuY2hpbGRyZW4oKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQl2YXIgZWxlbSA9ICQoIHRoaXMgKTsKCQkJCQlpZiAoIGVsZW0uZGF0YSggInVpLW1lbnUtc3VibWVudS1jYXJhdCIgKSApIHsKCQkJCQkJZWxlbS5yZW1vdmUoKTsKCQkJCQl9CgkJCQl9KTsKCgkJLy8gRGVzdHJveSBtZW51IGRpdmlkZXJzCgkJdGhpcy5lbGVtZW50LmZpbmQoICIudWktbWVudS1kaXZpZGVyIiApLnJlbW92ZUNsYXNzKCAidWktbWVudS1kaXZpZGVyIHVpLXdpZGdldC1jb250ZW50IiApOwoJfSwKCglfa2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCS8qanNoaW50IG1heGNvbXBsZXhpdHk6MjAqLwoJCXZhciBtYXRjaCwgcHJldiwgY2hhcmFjdGVyLCBza2lwLCByZWdleCwKCQkJcHJldmVudERlZmF1bHQgPSB0cnVlOwoKCQlmdW5jdGlvbiBlc2NhcGUoIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUucmVwbGFjZSggL1tcLVxbXF17fSgpKis/LixcXFxeJHwjXHNdL2csICJcXCQmIiApOwoJCX0KCgkJc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQljYXNlICQudWkua2V5Q29kZS5QQUdFX1VQOgoJCQl0aGlzLnByZXZpb3VzUGFnZSggZXZlbnQgKTsKCQkJYnJlYWs7CgkJY2FzZSAkLnVpLmtleUNvZGUuUEFHRV9ET1dOOgoJCQl0aGlzLm5leHRQYWdlKCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5IT01FOgoJCQl0aGlzLl9tb3ZlKCAiZmlyc3QiLCAiZmlyc3QiLCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5FTkQ6CgkJCXRoaXMuX21vdmUoICJsYXN0IiwgImxhc3QiLCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5VUDoKCQkJdGhpcy5wcmV2aW91cyggZXZlbnQgKTsKCQkJYnJlYWs7CgkJY2FzZSAkLnVpLmtleUNvZGUuRE9XTjoKCQkJdGhpcy5uZXh0KCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5MRUZUOgoJCQl0aGlzLmNvbGxhcHNlKCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5SSUdIVDoKCQkJaWYgKCB0aGlzLmFjdGl2ZSAmJiAhdGhpcy5hY3RpdmUuaXMoICIudWktc3RhdGUtZGlzYWJsZWQiICkgKSB7CgkJCQl0aGlzLmV4cGFuZCggZXZlbnQgKTsKCQkJfQoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5FTlRFUjoKCQljYXNlICQudWkua2V5Q29kZS5TUEFDRToKCQkJdGhpcy5fYWN0aXZhdGUoIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkVTQ0FQRToKCQkJdGhpcy5jb2xsYXBzZSggZXZlbnQgKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJcHJldmVudERlZmF1bHQgPSBmYWxzZTsKCQkJcHJldiA9IHRoaXMucHJldmlvdXNGaWx0ZXIgfHwgIiI7CgkJCWNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LmtleUNvZGUgKTsKCQkJc2tpcCA9IGZhbHNlOwoKCQkJY2xlYXJUaW1lb3V0KCB0aGlzLmZpbHRlclRpbWVyICk7CgoJCQlpZiAoIGNoYXJhY3RlciA9PT0gcHJldiApIHsKCQkJCXNraXAgPSB0cnVlOwoJCQl9IGVsc2UgewoJCQkJY2hhcmFjdGVyID0gcHJldiArIGNoYXJhY3RlcjsKCQkJfQoKCQkJcmVnZXggPSBuZXcgUmVnRXhwKCAiXiIgKyBlc2NhcGUoIGNoYXJhY3RlciApLCAiaSIgKTsKCQkJbWF0Y2ggPSB0aGlzLmFjdGl2ZU1lbnUuY2hpbGRyZW4oICIudWktbWVudS1pdGVtIiApLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJCXJldHVybiByZWdleC50ZXN0KCAkKCB0aGlzICkuY2hpbGRyZW4oICJhIiApLnRleHQoKSApOwoJCQl9KTsKCQkJbWF0Y2ggPSBza2lwICYmIG1hdGNoLmluZGV4KCB0aGlzLmFjdGl2ZS5uZXh0KCkgKSAhPT0gLTEgPwoJCQkJdGhpcy5hY3RpdmUubmV4dEFsbCggIi51aS1tZW51LWl0ZW0iICkgOgoJCQkJbWF0Y2g7CgoJCQkvLyBJZiBubyBtYXRjaGVzIG9uIHRoZSBjdXJyZW50IGZpbHRlciwgcmVzZXQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIHByZXNzZWQKCQkJLy8gdG8gbW92ZSBkb3duIHRoZSBtZW51IHRvIHRoZSBmaXJzdCBpdGVtIHRoYXQgc3RhcnRzIHdpdGggdGhhdCBjaGFyYWN0ZXIKCQkJaWYgKCAhbWF0Y2gubGVuZ3RoICkgewoJCQkJY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSggZXZlbnQua2V5Q29kZSApOwoJCQkJcmVnZXggPSBuZXcgUmVnRXhwKCAiXiIgKyBlc2NhcGUoIGNoYXJhY3RlciApLCAiaSIgKTsKCQkJCW1hdGNoID0gdGhpcy5hY3RpdmVNZW51LmNoaWxkcmVuKCAiLnVpLW1lbnUtaXRlbSIgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHJlZ2V4LnRlc3QoICQoIHRoaXMgKS5jaGlsZHJlbiggImEiICkudGV4dCgpICk7CgkJCQl9KTsKCQkJfQoKCQkJaWYgKCBtYXRjaC5sZW5ndGggKSB7CgkJCQl0aGlzLmZvY3VzKCBldmVudCwgbWF0Y2ggKTsKCQkJCWlmICggbWF0Y2gubGVuZ3RoID4gMSApIHsKCQkJCQl0aGlzLnByZXZpb3VzRmlsdGVyID0gY2hhcmFjdGVyOwoJCQkJCXRoaXMuZmlsdGVyVGltZXIgPSB0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCQkJZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXI7CgkJCQkJfSwgMTAwMCApOwoJCQkJfSBlbHNlIHsKCQkJCQlkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcjsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWRlbGV0ZSB0aGlzLnByZXZpb3VzRmlsdGVyOwoJCQl9CgkJfQoKCQlpZiAoIHByZXZlbnREZWZhdWx0ICkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCX0sCgoJX2FjdGl2YXRlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCAhdGhpcy5hY3RpdmUuaXMoICIudWktc3RhdGUtZGlzYWJsZWQiICkgKSB7CgkJCWlmICggdGhpcy5hY3RpdmUuY2hpbGRyZW4oICJhW2FyaWEtaGFzcG9wdXA9J3RydWUnXSIgKS5sZW5ndGggKSB7CgkJCQl0aGlzLmV4cGFuZCggZXZlbnQgKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuc2VsZWN0KCBldmVudCApOwoJCQl9CgkJfQoJfSwKCglyZWZyZXNoOiBmdW5jdGlvbigpIHsKCQl2YXIgbWVudXMsCgkJCWljb24gPSB0aGlzLm9wdGlvbnMuaWNvbnMuc3VibWVudSwKCQkJc3VibWVudXMgPSB0aGlzLmVsZW1lbnQuZmluZCggdGhpcy5vcHRpb25zLm1lbnVzICk7CgoJCS8vIEluaXRpYWxpemUgbmVzdGVkIG1lbnVzCgkJc3VibWVudXMuZmlsdGVyKCAiOm5vdCgudWktbWVudSkiICkKCQkJLmFkZENsYXNzKCAidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIgKQoJCQkuaGlkZSgpCgkJCS5hdHRyKHsKCQkJCXJvbGU6IHRoaXMub3B0aW9ucy5yb2xlLAoJCQkJImFyaWEtaGlkZGVuIjogInRydWUiLAoJCQkJImFyaWEtZXhwYW5kZWQiOiAiZmFsc2UiCgkJCX0pCgkJCS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1lbnUgPSAkKCB0aGlzICksCgkJCQkJaXRlbSA9IG1lbnUucHJldiggImEiICksCgkJCQkJc3VibWVudUNhcmF0ID0gJCggIjxzcGFuPiIgKQoJCQkJCQkuYWRkQ2xhc3MoICJ1aS1tZW51LWljb24gdWktaWNvbiAiICsgaWNvbiApCgkJCQkJCS5kYXRhKCAidWktbWVudS1zdWJtZW51LWNhcmF0IiwgdHJ1ZSApOwoKCQkJCWl0ZW0KCQkJCQkuYXR0ciggImFyaWEtaGFzcG9wdXAiLCAidHJ1ZSIgKQoJCQkJCS5wcmVwZW5kKCBzdWJtZW51Q2FyYXQgKTsKCQkJCW1lbnUuYXR0ciggImFyaWEtbGFiZWxsZWRieSIsIGl0ZW0uYXR0ciggImlkIiApICk7CgkJCX0pOwoKCQltZW51cyA9IHN1Ym1lbnVzLmFkZCggdGhpcy5lbGVtZW50ICk7CgoJCS8vIERvbid0IHJlZnJlc2ggbGlzdCBpdGVtcyB0aGF0IGFyZSBhbHJlYWR5IGFkYXB0ZWQKCQltZW51cy5jaGlsZHJlbiggIjpub3QoLnVpLW1lbnUtaXRlbSk6aGFzKGEpIiApCgkJCS5hZGRDbGFzcyggInVpLW1lbnUtaXRlbSIgKQoJCQkuYXR0ciggInJvbGUiLCAicHJlc2VudGF0aW9uIiApCgkJCS5jaGlsZHJlbiggImEiICkKCQkJCS51bmlxdWVJZCgpCgkJCQkuYWRkQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApCgkJCQkuYXR0cih7CgkJCQkJdGFiSW5kZXg6IC0xLAoJCQkJCXJvbGU6IHRoaXMuX2l0ZW1Sb2xlKCkKCQkJCX0pOwoKCQkvLyBJbml0aWFsaXplIHVubGlua2VkIG1lbnUtaXRlbXMgY29udGFpbmluZyBzcGFjZXMgYW5kL29yIGRhc2hlcyBvbmx5IGFzIGRpdmlkZXJzCgkJbWVudXMuY2hpbGRyZW4oICI6bm90KC51aS1tZW51LWl0ZW0pIiApLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBpdGVtID0gJCggdGhpcyApOwoJCQkvLyBoeXBoZW4sIGVtIGRhc2gsIGVuIGRhc2gKCQkJaWYgKCAhL1teXC1cdTIwMTRcdTIwMTNcc10vLnRlc3QoIGl0ZW0udGV4dCgpICkgKSB7CgkJCQlpdGVtLmFkZENsYXNzKCAidWktd2lkZ2V0LWNvbnRlbnQgdWktbWVudS1kaXZpZGVyIiApOwoJCQl9CgkJfSk7CgoJCS8vIEFkZCBhcmlhLWRpc2FibGVkIGF0dHJpYnV0ZSB0byBhbnkgZGlzYWJsZWQgbWVudSBpdGVtCgkJbWVudXMuY2hpbGRyZW4oICIudWktc3RhdGUtZGlzYWJsZWQiICkuYXR0ciggImFyaWEtZGlzYWJsZWQiLCAidHJ1ZSIgKTsKCgkJLy8gSWYgdGhlIGFjdGl2ZSBpdGVtIGhhcyBiZWVuIHJlbW92ZWQsIGJsdXIgdGhlIG1lbnUKCQlpZiAoIHRoaXMuYWN0aXZlICYmICEkLmNvbnRhaW5zKCB0aGlzLmVsZW1lbnRbIDAgXSwgdGhpcy5hY3RpdmVbIDAgXSApICkgewoJCQl0aGlzLmJsdXIoKTsKCQl9Cgl9LAoKCV9pdGVtUm9sZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHsKCQkJbWVudTogIm1lbnVpdGVtIiwKCQkJbGlzdGJveDogIm9wdGlvbiIKCQl9WyB0aGlzLm9wdGlvbnMucm9sZSBdOwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQlpZiAoIGtleSA9PT0gImljb25zIiApIHsKCQkJdGhpcy5lbGVtZW50LmZpbmQoICIudWktbWVudS1pY29uIiApCgkJCQkucmVtb3ZlQ2xhc3MoIHRoaXMub3B0aW9ucy5pY29ucy5zdWJtZW51ICkKCQkJCS5hZGRDbGFzcyggdmFsdWUuc3VibWVudSApOwoJCX0KCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoJfSwKCglmb2N1czogZnVuY3Rpb24oIGV2ZW50LCBpdGVtICkgewoJCXZhciBuZXN0ZWQsIGZvY3VzZWQ7CgkJdGhpcy5ibHVyKCBldmVudCwgZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gImZvY3VzIiApOwoKCQl0aGlzLl9zY3JvbGxJbnRvVmlldyggaXRlbSApOwoKCQl0aGlzLmFjdGl2ZSA9IGl0ZW0uZmlyc3QoKTsKCQlmb2N1c2VkID0gdGhpcy5hY3RpdmUuY2hpbGRyZW4oICJhIiApLmFkZENsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJLy8gT25seSB1cGRhdGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IGlmIHRoZXJlJ3MgYSByb2xlCgkJLy8gb3RoZXJ3aXNlIHdlIGFzc3VtZSBmb2N1cyBpcyBtYW5hZ2VkIGVsc2V3aGVyZQoJCWlmICggdGhpcy5vcHRpb25zLnJvbGUgKSB7CgkJCXRoaXMuZWxlbWVudC5hdHRyKCAiYXJpYS1hY3RpdmVkZXNjZW5kYW50IiwgZm9jdXNlZC5hdHRyKCAiaWQiICkgKTsKCQl9CgoJCS8vIEhpZ2hsaWdodCBhY3RpdmUgcGFyZW50IG1lbnUgaXRlbSwgaWYgYW55CgkJdGhpcy5hY3RpdmUKCQkJLnBhcmVudCgpCgkJCS5jbG9zZXN0KCAiLnVpLW1lbnUtaXRlbSIgKQoJCQkuY2hpbGRyZW4oICJhOmZpcnN0IiApCgkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCgkJaWYgKCBldmVudCAmJiBldmVudC50eXBlID09PSAia2V5ZG93biIgKSB7CgkJCXRoaXMuX2Nsb3NlKCk7CgkJfSBlbHNlIHsKCQkJdGhpcy50aW1lciA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJdGhpcy5fY2xvc2UoKTsKCQkJfSwgdGhpcy5kZWxheSApOwoJCX0KCgkJbmVzdGVkID0gaXRlbS5jaGlsZHJlbiggIi51aS1tZW51IiApOwoJCWlmICggbmVzdGVkLmxlbmd0aCAmJiAoIC9ebW91c2UvLnRlc3QoIGV2ZW50LnR5cGUgKSApICkgewoJCQl0aGlzLl9zdGFydE9wZW5pbmcobmVzdGVkKTsKCQl9CgkJdGhpcy5hY3RpdmVNZW51ID0gaXRlbS5wYXJlbnQoKTsKCgkJdGhpcy5fdHJpZ2dlciggImZvY3VzIiwgZXZlbnQsIHsgaXRlbTogaXRlbSB9ICk7Cgl9LAoKCV9zY3JvbGxJbnRvVmlldzogZnVuY3Rpb24oIGl0ZW0gKSB7CgkJdmFyIGJvcmRlclRvcCwgcGFkZGluZ1RvcCwgb2Zmc2V0LCBzY3JvbGwsIGVsZW1lbnRIZWlnaHQsIGl0ZW1IZWlnaHQ7CgkJaWYgKCB0aGlzLl9oYXNTY3JvbGwoKSApIHsKCQkJYm9yZGVyVG9wID0gcGFyc2VGbG9hdCggJC5jc3MoIHRoaXMuYWN0aXZlTWVudVswXSwgImJvcmRlclRvcFdpZHRoIiApICkgfHwgMDsKCQkJcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoICQuY3NzKCB0aGlzLmFjdGl2ZU1lbnVbMF0sICJwYWRkaW5nVG9wIiApICkgfHwgMDsKCQkJb2Zmc2V0ID0gaXRlbS5vZmZzZXQoKS50b3AgLSB0aGlzLmFjdGl2ZU1lbnUub2Zmc2V0KCkudG9wIC0gYm9yZGVyVG9wIC0gcGFkZGluZ1RvcDsKCQkJc2Nyb2xsID0gdGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcCgpOwoJCQllbGVtZW50SGVpZ2h0ID0gdGhpcy5hY3RpdmVNZW51LmhlaWdodCgpOwoJCQlpdGVtSGVpZ2h0ID0gaXRlbS5oZWlnaHQoKTsKCgkJCWlmICggb2Zmc2V0IDwgMCApIHsKCQkJCXRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoIHNjcm9sbCArIG9mZnNldCApOwoJCQl9IGVsc2UgaWYgKCBvZmZzZXQgKyBpdGVtSGVpZ2h0ID4gZWxlbWVudEhlaWdodCApIHsKCQkJCXRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoIHNjcm9sbCArIG9mZnNldCAtIGVsZW1lbnRIZWlnaHQgKyBpdGVtSGVpZ2h0ICk7CgkJCX0KCQl9Cgl9LAoKCWJsdXI6IGZ1bmN0aW9uKCBldmVudCwgZnJvbUZvY3VzICkgewoJCWlmICggIWZyb21Gb2N1cyApIHsKCQkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgkJfQoKCQlpZiAoICF0aGlzLmFjdGl2ZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5hY3RpdmUuY2hpbGRyZW4oICJhIiApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJdGhpcy5hY3RpdmUgPSBudWxsOwoKCQl0aGlzLl90cmlnZ2VyKCAiYmx1ciIsIGV2ZW50LCB7IGl0ZW06IHRoaXMuYWN0aXZlIH0gKTsKCX0sCgoJX3N0YXJ0T3BlbmluZzogZnVuY3Rpb24oIHN1Ym1lbnUgKSB7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgoJCS8vIERvbid0IG9wZW4gaWYgYWxyZWFkeSBvcGVuIGZpeGVzIGEgRmlyZWZveCBidWcgdGhhdCBjYXVzZWQgYSAuNSBwaXhlbAoJCS8vIHNoaWZ0IGluIHRoZSBzdWJtZW51IHBvc2l0aW9uIHdoZW4gbW91c2luZyBvdmVyIHRoZSBjYXJhdCBpY29uCgkJaWYgKCBzdWJtZW51LmF0dHIoICJhcmlhLWhpZGRlbiIgKSAhPT0gInRydWUiICkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLnRpbWVyID0gdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCXRoaXMuX2Nsb3NlKCk7CgkJCXRoaXMuX29wZW4oIHN1Ym1lbnUgKTsKCQl9LCB0aGlzLmRlbGF5ICk7Cgl9LAoKCV9vcGVuOiBmdW5jdGlvbiggc3VibWVudSApIHsKCQl2YXIgcG9zaXRpb24gPSAkLmV4dGVuZCh7CgkJCW9mOiB0aGlzLmFjdGl2ZQoJCX0sIHRoaXMub3B0aW9ucy5wb3NpdGlvbiApOwoKCQljbGVhclRpbWVvdXQoIHRoaXMudGltZXIgKTsKCQl0aGlzLmVsZW1lbnQuZmluZCggIi51aS1tZW51IiApLm5vdCggc3VibWVudS5wYXJlbnRzKCAiLnVpLW1lbnUiICkgKQoJCQkuaGlkZSgpCgkJCS5hdHRyKCAiYXJpYS1oaWRkZW4iLCAidHJ1ZSIgKTsKCgkJc3VibWVudQoJCQkuc2hvdygpCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1oaWRkZW4iICkKCQkJLmF0dHIoICJhcmlhLWV4cGFuZGVkIiwgInRydWUiICkKCQkJLnBvc2l0aW9uKCBwb3NpdGlvbiApOwoJfSwKCgljb2xsYXBzZUFsbDogZnVuY3Rpb24oIGV2ZW50LCBhbGwgKSB7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgkJdGhpcy50aW1lciA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkvLyBJZiB3ZSB3ZXJlIHBhc3NlZCBhbiBldmVudCwgbG9vayBmb3IgdGhlIHN1Ym1lbnUgdGhhdCBjb250YWlucyB0aGUgZXZlbnQKCQkJdmFyIGN1cnJlbnRNZW51ID0gYWxsID8gdGhpcy5lbGVtZW50IDoKCQkJCSQoIGV2ZW50ICYmIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIHRoaXMuZWxlbWVudC5maW5kKCAiLnVpLW1lbnUiICkgKTsKCgkJCS8vIElmIHdlIGZvdW5kIG5vIHZhbGlkIHN1Ym1lbnUgYW5jZXN0b3IsIHVzZSB0aGUgbWFpbiBtZW51IHRvIGNsb3NlIGFsbCBzdWIgbWVudXMgYW55d2F5CgkJCWlmICggIWN1cnJlbnRNZW51Lmxlbmd0aCApIHsKCQkJCWN1cnJlbnRNZW51ID0gdGhpcy5lbGVtZW50OwoJCQl9CgoJCQl0aGlzLl9jbG9zZSggY3VycmVudE1lbnUgKTsKCgkJCXRoaXMuYmx1ciggZXZlbnQgKTsKCQkJdGhpcy5hY3RpdmVNZW51ID0gY3VycmVudE1lbnU7CgkJfSwgdGhpcy5kZWxheSApOwoJfSwKCgkvLyBXaXRoIG5vIGFyZ3VtZW50cywgY2xvc2VzIHRoZSBjdXJyZW50bHkgYWN0aXZlIG1lbnUgLSBpZiBub3RoaW5nIGlzIGFjdGl2ZQoJLy8gaXQgY2xvc2VzIGFsbCBtZW51cy4gIElmIHBhc3NlZCBhbiBhcmd1bWVudCwgaXQgd2lsbCBzZWFyY2ggZm9yIG1lbnVzIEJFTE9XCglfY2xvc2U6IGZ1bmN0aW9uKCBzdGFydE1lbnUgKSB7CgkJaWYgKCAhc3RhcnRNZW51ICkgewoJCQlzdGFydE1lbnUgPSB0aGlzLmFjdGl2ZSA/IHRoaXMuYWN0aXZlLnBhcmVudCgpIDogdGhpcy5lbGVtZW50OwoJCX0KCgkJc3RhcnRNZW51CgkJCS5maW5kKCAiLnVpLW1lbnUiICkKCQkJCS5oaWRlKCkKCQkJCS5hdHRyKCAiYXJpYS1oaWRkZW4iLCAidHJ1ZSIgKQoJCQkJLmF0dHIoICJhcmlhLWV4cGFuZGVkIiwgImZhbHNlIiApCgkJCS5lbmQoKQoJCQkuZmluZCggImEudWktc3RhdGUtYWN0aXZlIiApCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7Cgl9LAoKCWNvbGxhcHNlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIG5ld0l0ZW0gPSB0aGlzLmFjdGl2ZSAmJgoJCQl0aGlzLmFjdGl2ZS5wYXJlbnQoKS5jbG9zZXN0KCAiLnVpLW1lbnUtaXRlbSIsIHRoaXMuZWxlbWVudCApOwoJCWlmICggbmV3SXRlbSAmJiBuZXdJdGVtLmxlbmd0aCApIHsKCQkJdGhpcy5fY2xvc2UoKTsKCQkJdGhpcy5mb2N1cyggZXZlbnQsIG5ld0l0ZW0gKTsKCQl9Cgl9LAoKCWV4cGFuZDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBuZXdJdGVtID0gdGhpcy5hY3RpdmUgJiYKCQkJdGhpcy5hY3RpdmUKCQkJCS5jaGlsZHJlbiggIi51aS1tZW51ICIgKQoJCQkJLmNoaWxkcmVuKCAiLnVpLW1lbnUtaXRlbSIgKQoJCQkJLmZpcnN0KCk7CgoJCWlmICggbmV3SXRlbSAmJiBuZXdJdGVtLmxlbmd0aCApIHsKCQkJdGhpcy5fb3BlbiggbmV3SXRlbS5wYXJlbnQoKSApOwoKCQkJLy8gRGVsYXkgc28gRmlyZWZveCB3aWxsIG5vdCBoaWRlIGFjdGl2ZWRlc2NlbmRhbnQgY2hhbmdlIGluIGV4cGFuZGluZyBzdWJtZW51IGZyb20gQVQKCQkJdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQl0aGlzLmZvY3VzKCBldmVudCwgbmV3SXRlbSApOwoJCQl9KTsKCQl9Cgl9LAoKCW5leHQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl0aGlzLl9tb3ZlKCAibmV4dCIsICJmaXJzdCIsIGV2ZW50ICk7Cgl9LAoKCXByZXZpb3VzOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdGhpcy5fbW92ZSggInByZXYiLCAibGFzdCIsIGV2ZW50ICk7Cgl9LAoKCWlzRmlyc3RJdGVtOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5hY3RpdmUgJiYgIXRoaXMuYWN0aXZlLnByZXZBbGwoICIudWktbWVudS1pdGVtIiApLmxlbmd0aDsKCX0sCgoJaXNMYXN0SXRlbTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuYWN0aXZlICYmICF0aGlzLmFjdGl2ZS5uZXh0QWxsKCAiLnVpLW1lbnUtaXRlbSIgKS5sZW5ndGg7Cgl9LAoKCV9tb3ZlOiBmdW5jdGlvbiggZGlyZWN0aW9uLCBmaWx0ZXIsIGV2ZW50ICkgewoJCXZhciBuZXh0OwoJCWlmICggdGhpcy5hY3RpdmUgKSB7CgkJCWlmICggZGlyZWN0aW9uID09PSAiZmlyc3QiIHx8IGRpcmVjdGlvbiA9PT0gImxhc3QiICkgewoJCQkJbmV4dCA9IHRoaXMuYWN0aXZlCgkJCQkJWyBkaXJlY3Rpb24gPT09ICJmaXJzdCIgPyAicHJldkFsbCIgOiAibmV4dEFsbCIgXSggIi51aS1tZW51LWl0ZW0iICkKCQkJCQkuZXEoIC0xICk7CgkJCX0gZWxzZSB7CgkJCQluZXh0ID0gdGhpcy5hY3RpdmUKCQkJCQlbIGRpcmVjdGlvbiArICJBbGwiIF0oICIudWktbWVudS1pdGVtIiApCgkJCQkJLmVxKCAwICk7CgkJCX0KCQl9CgkJaWYgKCAhbmV4dCB8fCAhbmV4dC5sZW5ndGggfHwgIXRoaXMuYWN0aXZlICkgewoJCQluZXh0ID0gdGhpcy5hY3RpdmVNZW51LmNoaWxkcmVuKCAiLnVpLW1lbnUtaXRlbSIgKVsgZmlsdGVyIF0oKTsKCQl9CgoJCXRoaXMuZm9jdXMoIGV2ZW50LCBuZXh0ICk7Cgl9LAoKCW5leHRQYWdlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIGl0ZW0sIGJhc2UsIGhlaWdodDsKCgkJaWYgKCAhdGhpcy5hY3RpdmUgKSB7CgkJCXRoaXMubmV4dCggZXZlbnQgKTsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIHRoaXMuaXNMYXN0SXRlbSgpICkgewoJCQlyZXR1cm47CgkJfQoJCWlmICggdGhpcy5faGFzU2Nyb2xsKCkgKSB7CgkJCWJhc2UgPSB0aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3A7CgkJCWhlaWdodCA9IHRoaXMuZWxlbWVudC5oZWlnaHQoKTsKCQkJdGhpcy5hY3RpdmUubmV4dEFsbCggIi51aS1tZW51LWl0ZW0iICkuZWFjaChmdW5jdGlvbigpIHsKCQkJCWl0ZW0gPSAkKCB0aGlzICk7CgkJCQlyZXR1cm4gaXRlbS5vZmZzZXQoKS50b3AgLSBiYXNlIC0gaGVpZ2h0IDwgMDsKCQkJfSk7CgoJCQl0aGlzLmZvY3VzKCBldmVudCwgaXRlbSApOwoJCX0gZWxzZSB7CgkJCXRoaXMuZm9jdXMoIGV2ZW50LCB0aGlzLmFjdGl2ZU1lbnUuY2hpbGRyZW4oICIudWktbWVudS1pdGVtIiApCgkJCQlbICF0aGlzLmFjdGl2ZSA/ICJmaXJzdCIgOiAibGFzdCIgXSgpICk7CgkJfQoJfSwKCglwcmV2aW91c1BhZ2U6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgaXRlbSwgYmFzZSwgaGVpZ2h0OwoJCWlmICggIXRoaXMuYWN0aXZlICkgewoJCQl0aGlzLm5leHQoIGV2ZW50ICk7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0aGlzLmlzRmlyc3RJdGVtKCkgKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0aGlzLl9oYXNTY3JvbGwoKSApIHsKCQkJYmFzZSA9IHRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcDsKCQkJaGVpZ2h0ID0gdGhpcy5lbGVtZW50LmhlaWdodCgpOwoJCQl0aGlzLmFjdGl2ZS5wcmV2QWxsKCAiLnVpLW1lbnUtaXRlbSIgKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJaXRlbSA9ICQoIHRoaXMgKTsKCQkJCXJldHVybiBpdGVtLm9mZnNldCgpLnRvcCAtIGJhc2UgKyBoZWlnaHQgPiAwOwoJCQl9KTsKCgkJCXRoaXMuZm9jdXMoIGV2ZW50LCBpdGVtICk7CgkJfSBlbHNlIHsKCQkJdGhpcy5mb2N1cyggZXZlbnQsIHRoaXMuYWN0aXZlTWVudS5jaGlsZHJlbiggIi51aS1tZW51LWl0ZW0iICkuZmlyc3QoKSApOwoJCX0KCX0sCgoJX2hhc1Njcm9sbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpIDwgdGhpcy5lbGVtZW50LnByb3AoICJzY3JvbGxIZWlnaHQiICk7Cgl9LAoKCXNlbGVjdDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCS8vIFRPRE86IEl0IHNob3VsZCBuZXZlciBiZSBwb3NzaWJsZSB0byBub3QgaGF2ZSBhbiBhY3RpdmUgaXRlbSBhdCB0aGlzCgkJLy8gcG9pbnQsIGJ1dCB0aGUgdGVzdHMgZG9uJ3QgdHJpZ2dlciBtb3VzZWVudGVyIGJlZm9yZSBjbGljay4KCQl0aGlzLmFjdGl2ZSA9IHRoaXMuYWN0aXZlIHx8ICQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoICIudWktbWVudS1pdGVtIiApOwoJCXZhciB1aSA9IHsgaXRlbTogdGhpcy5hY3RpdmUgfTsKCQlpZiAoICF0aGlzLmFjdGl2ZS5oYXMoICIudWktbWVudSIgKS5sZW5ndGggKSB7CgkJCXRoaXMuY29sbGFwc2VBbGwoIGV2ZW50LCB0cnVlICk7CgkJfQoJCXRoaXMuX3RyaWdnZXIoICJzZWxlY3QiLCBldmVudCwgdWkgKTsKCX0KfSk7Cgp9KCBqUXVlcnkgKSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCiQudWkgPSAkLnVpIHx8IHt9OwoKdmFyIGNhY2hlZFNjcm9sbGJhcldpZHRoLAoJbWF4ID0gTWF0aC5tYXgsCglhYnMgPSBNYXRoLmFicywKCXJvdW5kID0gTWF0aC5yb3VuZCwKCXJob3Jpem9udGFsID0gL2xlZnR8Y2VudGVyfHJpZ2h0LywKCXJ2ZXJ0aWNhbCA9IC90b3B8Y2VudGVyfGJvdHRvbS8sCglyb2Zmc2V0ID0gL1tcK1wtXVxkKyhcLltcZF0rKT8lPy8sCglycG9zaXRpb24gPSAvXlx3Ky8sCglycGVyY2VudCA9IC8lJC8sCglfcG9zaXRpb24gPSAkLmZuLnBvc2l0aW9uOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0cyggb2Zmc2V0cywgd2lkdGgsIGhlaWdodCApIHsKCXJldHVybiBbCgkJcGFyc2VGbG9hdCggb2Zmc2V0c1sgMCBdICkgKiAoIHJwZXJjZW50LnRlc3QoIG9mZnNldHNbIDAgXSApID8gd2lkdGggLyAxMDAgOiAxICksCgkJcGFyc2VGbG9hdCggb2Zmc2V0c1sgMSBdICkgKiAoIHJwZXJjZW50LnRlc3QoIG9mZnNldHNbIDEgXSApID8gaGVpZ2h0IC8gMTAwIDogMSApCgldOwp9CgpmdW5jdGlvbiBwYXJzZUNzcyggZWxlbWVudCwgcHJvcGVydHkgKSB7CglyZXR1cm4gcGFyc2VJbnQoICQuY3NzKCBlbGVtZW50LCBwcm9wZXJ0eSApLCAxMCApIHx8IDA7Cn0KCmZ1bmN0aW9uIGdldERpbWVuc2lvbnMoIGVsZW0gKSB7Cgl2YXIgcmF3ID0gZWxlbVswXTsKCWlmICggcmF3Lm5vZGVUeXBlID09PSA5ICkgewoJCXJldHVybiB7CgkJCXdpZHRoOiBlbGVtLndpZHRoKCksCgkJCWhlaWdodDogZWxlbS5oZWlnaHQoKSwKCQkJb2Zmc2V0OiB7IHRvcDogMCwgbGVmdDogMCB9CgkJfTsKCX0KCWlmICggJC5pc1dpbmRvdyggcmF3ICkgKSB7CgkJcmV0dXJuIHsKCQkJd2lkdGg6IGVsZW0ud2lkdGgoKSwKCQkJaGVpZ2h0OiBlbGVtLmhlaWdodCgpLAoJCQlvZmZzZXQ6IHsgdG9wOiBlbGVtLnNjcm9sbFRvcCgpLCBsZWZ0OiBlbGVtLnNjcm9sbExlZnQoKSB9CgkJfTsKCX0KCWlmICggcmF3LnByZXZlbnREZWZhdWx0ICkgewoJCXJldHVybiB7CgkJCXdpZHRoOiAwLAoJCQloZWlnaHQ6IDAsCgkJCW9mZnNldDogeyB0b3A6IHJhdy5wYWdlWSwgbGVmdDogcmF3LnBhZ2VYIH0KCQl9OwoJfQoJcmV0dXJuIHsKCQl3aWR0aDogZWxlbS5vdXRlcldpZHRoKCksCgkJaGVpZ2h0OiBlbGVtLm91dGVySGVpZ2h0KCksCgkJb2Zmc2V0OiBlbGVtLm9mZnNldCgpCgl9Owp9CgokLnBvc2l0aW9uID0gewoJc2Nyb2xsYmFyV2lkdGg6IGZ1bmN0aW9uKCkgewoJCWlmICggY2FjaGVkU2Nyb2xsYmFyV2lkdGggIT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIGNhY2hlZFNjcm9sbGJhcldpZHRoOwoJCX0KCQl2YXIgdzEsIHcyLAoJCQlkaXYgPSAkKCAiPGRpdiBzdHlsZT0nZGlzcGxheTpibG9jazt3aWR0aDo1MHB4O2hlaWdodDo1MHB4O292ZXJmbG93OmhpZGRlbjsnPjxkaXYgc3R5bGU9J2hlaWdodDoxMDBweDt3aWR0aDphdXRvOyc+PC9kaXY+PC9kaXY+IiApLAoJCQlpbm5lckRpdiA9IGRpdi5jaGlsZHJlbigpWzBdOwoKCQkkKCAiYm9keSIgKS5hcHBlbmQoIGRpdiApOwoJCXcxID0gaW5uZXJEaXYub2Zmc2V0V2lkdGg7CgkJZGl2LmNzcyggIm92ZXJmbG93IiwgInNjcm9sbCIgKTsKCgkJdzIgPSBpbm5lckRpdi5vZmZzZXRXaWR0aDsKCgkJaWYgKCB3MSA9PT0gdzIgKSB7CgkJCXcyID0gZGl2WzBdLmNsaWVudFdpZHRoOwoJCX0KCgkJZGl2LnJlbW92ZSgpOwoKCQlyZXR1cm4gKGNhY2hlZFNjcm9sbGJhcldpZHRoID0gdzEgLSB3Mik7Cgl9LAoJZ2V0U2Nyb2xsSW5mbzogZnVuY3Rpb24oIHdpdGhpbiApIHsKCQl2YXIgb3ZlcmZsb3dYID0gd2l0aGluLmlzV2luZG93ID8gIiIgOiB3aXRoaW4uZWxlbWVudC5jc3MoICJvdmVyZmxvdy14IiApLAoJCQlvdmVyZmxvd1kgPSB3aXRoaW4uaXNXaW5kb3cgPyAiIiA6IHdpdGhpbi5lbGVtZW50LmNzcyggIm92ZXJmbG93LXkiICksCgkJCWhhc092ZXJmbG93WCA9IG92ZXJmbG93WCA9PT0gInNjcm9sbCIgfHwKCQkJCSggb3ZlcmZsb3dYID09PSAiYXV0byIgJiYgd2l0aGluLndpZHRoIDwgd2l0aGluLmVsZW1lbnRbMF0uc2Nyb2xsV2lkdGggKSwKCQkJaGFzT3ZlcmZsb3dZID0gb3ZlcmZsb3dZID09PSAic2Nyb2xsIiB8fAoJCQkJKCBvdmVyZmxvd1kgPT09ICJhdXRvIiAmJiB3aXRoaW4uaGVpZ2h0IDwgd2l0aGluLmVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0ICk7CgkJcmV0dXJuIHsKCQkJd2lkdGg6IGhhc092ZXJmbG93WSA/ICQucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKSA6IDAsCgkJCWhlaWdodDogaGFzT3ZlcmZsb3dYID8gJC5wb3NpdGlvbi5zY3JvbGxiYXJXaWR0aCgpIDogMAoJCX07Cgl9LAoJZ2V0V2l0aGluSW5mbzogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdmFyIHdpdGhpbkVsZW1lbnQgPSAkKCBlbGVtZW50IHx8IHdpbmRvdyApLAoJCQlpc1dpbmRvdyA9ICQuaXNXaW5kb3coIHdpdGhpbkVsZW1lbnRbMF0gKTsKCQlyZXR1cm4gewoJCQllbGVtZW50OiB3aXRoaW5FbGVtZW50LAoJCQlpc1dpbmRvdzogaXNXaW5kb3csCgkJCW9mZnNldDogd2l0aGluRWxlbWVudC5vZmZzZXQoKSB8fCB7IGxlZnQ6IDAsIHRvcDogMCB9LAoJCQlzY3JvbGxMZWZ0OiB3aXRoaW5FbGVtZW50LnNjcm9sbExlZnQoKSwKCQkJc2Nyb2xsVG9wOiB3aXRoaW5FbGVtZW50LnNjcm9sbFRvcCgpLAoJCQl3aWR0aDogaXNXaW5kb3cgPyB3aXRoaW5FbGVtZW50LndpZHRoKCkgOiB3aXRoaW5FbGVtZW50Lm91dGVyV2lkdGgoKSwKCQkJaGVpZ2h0OiBpc1dpbmRvdyA/IHdpdGhpbkVsZW1lbnQuaGVpZ2h0KCkgOiB3aXRoaW5FbGVtZW50Lm91dGVySGVpZ2h0KCkKCQl9OwoJfQp9OwoKJC5mbi5wb3NpdGlvbiA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJaWYgKCAhb3B0aW9ucyB8fCAhb3B0aW9ucy5vZiApIHsKCQlyZXR1cm4gX3Bvc2l0aW9uLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCX0KCgkvLyBtYWtlIGEgY29weSwgd2UgZG9uJ3Qgd2FudCB0byBtb2RpZnkgYXJndW1lbnRzCglvcHRpb25zID0gJC5leHRlbmQoIHt9LCBvcHRpb25zICk7CgoJdmFyIGF0T2Zmc2V0LCB0YXJnZXRXaWR0aCwgdGFyZ2V0SGVpZ2h0LCB0YXJnZXRPZmZzZXQsIGJhc2VQb3NpdGlvbiwgZGltZW5zaW9ucywKCQl0YXJnZXQgPSAkKCBvcHRpb25zLm9mICksCgkJd2l0aGluID0gJC5wb3NpdGlvbi5nZXRXaXRoaW5JbmZvKCBvcHRpb25zLndpdGhpbiApLAoJCXNjcm9sbEluZm8gPSAkLnBvc2l0aW9uLmdldFNjcm9sbEluZm8oIHdpdGhpbiApLAoJCWNvbGxpc2lvbiA9ICggb3B0aW9ucy5jb2xsaXNpb24gfHwgImZsaXAiICkuc3BsaXQoICIgIiApLAoJCW9mZnNldHMgPSB7fTsKCglkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyggdGFyZ2V0ICk7CglpZiAoIHRhcmdldFswXS5wcmV2ZW50RGVmYXVsdCApIHsKCQkvLyBmb3JjZSBsZWZ0IHRvcCB0byBhbGxvdyBmbGlwcGluZwoJCW9wdGlvbnMuYXQgPSAibGVmdCB0b3AiOwoJfQoJdGFyZ2V0V2lkdGggPSBkaW1lbnNpb25zLndpZHRoOwoJdGFyZ2V0SGVpZ2h0ID0gZGltZW5zaW9ucy5oZWlnaHQ7Cgl0YXJnZXRPZmZzZXQgPSBkaW1lbnNpb25zLm9mZnNldDsKCS8vIGNsb25lIHRvIHJldXNlIG9yaWdpbmFsIHRhcmdldE9mZnNldCBsYXRlcgoJYmFzZVBvc2l0aW9uID0gJC5leHRlbmQoIHt9LCB0YXJnZXRPZmZzZXQgKTsKCgkvLyBmb3JjZSBteSBhbmQgYXQgdG8gaGF2ZSB2YWxpZCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBwb3NpdGlvbnMKCS8vIGlmIGEgdmFsdWUgaXMgbWlzc2luZyBvciBpbnZhbGlkLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBjZW50ZXIKCSQuZWFjaCggWyAibXkiLCAiYXQiIF0sIGZ1bmN0aW9uKCkgewoJCXZhciBwb3MgPSAoIG9wdGlvbnNbIHRoaXMgXSB8fCAiIiApLnNwbGl0KCAiICIgKSwKCQkJaG9yaXpvbnRhbE9mZnNldCwKCQkJdmVydGljYWxPZmZzZXQ7CgoJCWlmICggcG9zLmxlbmd0aCA9PT0gMSkgewoJCQlwb3MgPSByaG9yaXpvbnRhbC50ZXN0KCBwb3NbIDAgXSApID8KCQkJCXBvcy5jb25jYXQoIFsgImNlbnRlciIgXSApIDoKCQkJCXJ2ZXJ0aWNhbC50ZXN0KCBwb3NbIDAgXSApID8KCQkJCQlbICJjZW50ZXIiIF0uY29uY2F0KCBwb3MgKSA6CgkJCQkJWyAiY2VudGVyIiwgImNlbnRlciIgXTsKCQl9CgkJcG9zWyAwIF0gPSByaG9yaXpvbnRhbC50ZXN0KCBwb3NbIDAgXSApID8gcG9zWyAwIF0gOiAiY2VudGVyIjsKCQlwb3NbIDEgXSA9IHJ2ZXJ0aWNhbC50ZXN0KCBwb3NbIDEgXSApID8gcG9zWyAxIF0gOiAiY2VudGVyIjsKCgkJLy8gY2FsY3VsYXRlIG9mZnNldHMKCQlob3Jpem9udGFsT2Zmc2V0ID0gcm9mZnNldC5leGVjKCBwb3NbIDAgXSApOwoJCXZlcnRpY2FsT2Zmc2V0ID0gcm9mZnNldC5leGVjKCBwb3NbIDEgXSApOwoJCW9mZnNldHNbIHRoaXMgXSA9IFsKCQkJaG9yaXpvbnRhbE9mZnNldCA/IGhvcml6b250YWxPZmZzZXRbIDAgXSA6IDAsCgkJCXZlcnRpY2FsT2Zmc2V0ID8gdmVydGljYWxPZmZzZXRbIDAgXSA6IDAKCQldOwoKCQkvLyByZWR1Y2UgdG8ganVzdCB0aGUgcG9zaXRpb25zIHdpdGhvdXQgdGhlIG9mZnNldHMKCQlvcHRpb25zWyB0aGlzIF0gPSBbCgkJCXJwb3NpdGlvbi5leGVjKCBwb3NbIDAgXSApWyAwIF0sCgkJCXJwb3NpdGlvbi5leGVjKCBwb3NbIDEgXSApWyAwIF0KCQldOwoJfSk7CgoJLy8gbm9ybWFsaXplIGNvbGxpc2lvbiBvcHRpb24KCWlmICggY29sbGlzaW9uLmxlbmd0aCA9PT0gMSApIHsKCQljb2xsaXNpb25bIDEgXSA9IGNvbGxpc2lvblsgMCBdOwoJfQoKCWlmICggb3B0aW9ucy5hdFsgMCBdID09PSAicmlnaHQiICkgewoJCWJhc2VQb3NpdGlvbi5sZWZ0ICs9IHRhcmdldFdpZHRoOwoJfSBlbHNlIGlmICggb3B0aW9ucy5hdFsgMCBdID09PSAiY2VudGVyIiApIHsKCQliYXNlUG9zaXRpb24ubGVmdCArPSB0YXJnZXRXaWR0aCAvIDI7Cgl9CgoJaWYgKCBvcHRpb25zLmF0WyAxIF0gPT09ICJib3R0b20iICkgewoJCWJhc2VQb3NpdGlvbi50b3AgKz0gdGFyZ2V0SGVpZ2h0OwoJfSBlbHNlIGlmICggb3B0aW9ucy5hdFsgMSBdID09PSAiY2VudGVyIiApIHsKCQliYXNlUG9zaXRpb24udG9wICs9IHRhcmdldEhlaWdodCAvIDI7Cgl9CgoJYXRPZmZzZXQgPSBnZXRPZmZzZXRzKCBvZmZzZXRzLmF0LCB0YXJnZXRXaWR0aCwgdGFyZ2V0SGVpZ2h0ICk7CgliYXNlUG9zaXRpb24ubGVmdCArPSBhdE9mZnNldFsgMCBdOwoJYmFzZVBvc2l0aW9uLnRvcCArPSBhdE9mZnNldFsgMSBdOwoKCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJdmFyIGNvbGxpc2lvblBvc2l0aW9uLCB1c2luZywKCQkJZWxlbSA9ICQoIHRoaXMgKSwKCQkJZWxlbVdpZHRoID0gZWxlbS5vdXRlcldpZHRoKCksCgkJCWVsZW1IZWlnaHQgPSBlbGVtLm91dGVySGVpZ2h0KCksCgkJCW1hcmdpbkxlZnQgPSBwYXJzZUNzcyggdGhpcywgIm1hcmdpbkxlZnQiICksCgkJCW1hcmdpblRvcCA9IHBhcnNlQ3NzKCB0aGlzLCAibWFyZ2luVG9wIiApLAoJCQljb2xsaXNpb25XaWR0aCA9IGVsZW1XaWR0aCArIG1hcmdpbkxlZnQgKyBwYXJzZUNzcyggdGhpcywgIm1hcmdpblJpZ2h0IiApICsgc2Nyb2xsSW5mby53aWR0aCwKCQkJY29sbGlzaW9uSGVpZ2h0ID0gZWxlbUhlaWdodCArIG1hcmdpblRvcCArIHBhcnNlQ3NzKCB0aGlzLCAibWFyZ2luQm90dG9tIiApICsgc2Nyb2xsSW5mby5oZWlnaHQsCgkJCXBvc2l0aW9uID0gJC5leHRlbmQoIHt9LCBiYXNlUG9zaXRpb24gKSwKCQkJbXlPZmZzZXQgPSBnZXRPZmZzZXRzKCBvZmZzZXRzLm15LCBlbGVtLm91dGVyV2lkdGgoKSwgZWxlbS5vdXRlckhlaWdodCgpICk7CgoJCWlmICggb3B0aW9ucy5teVsgMCBdID09PSAicmlnaHQiICkgewoJCQlwb3NpdGlvbi5sZWZ0IC09IGVsZW1XaWR0aDsKCQl9IGVsc2UgaWYgKCBvcHRpb25zLm15WyAwIF0gPT09ICJjZW50ZXIiICkgewoJCQlwb3NpdGlvbi5sZWZ0IC09IGVsZW1XaWR0aCAvIDI7CgkJfQoKCQlpZiAoIG9wdGlvbnMubXlbIDEgXSA9PT0gImJvdHRvbSIgKSB7CgkJCXBvc2l0aW9uLnRvcCAtPSBlbGVtSGVpZ2h0OwoJCX0gZWxzZSBpZiAoIG9wdGlvbnMubXlbIDEgXSA9PT0gImNlbnRlciIgKSB7CgkJCXBvc2l0aW9uLnRvcCAtPSBlbGVtSGVpZ2h0IC8gMjsKCQl9CgoJCXBvc2l0aW9uLmxlZnQgKz0gbXlPZmZzZXRbIDAgXTsKCQlwb3NpdGlvbi50b3AgKz0gbXlPZmZzZXRbIDEgXTsKCgkJLy8gaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGZyYWN0aW9ucywgdGhlbiByb3VuZCBmb3IgY29uc2lzdGVudCByZXN1bHRzCgkJaWYgKCAhJC5zdXBwb3J0Lm9mZnNldEZyYWN0aW9ucyApIHsKCQkJcG9zaXRpb24ubGVmdCA9IHJvdW5kKCBwb3NpdGlvbi5sZWZ0ICk7CgkJCXBvc2l0aW9uLnRvcCA9IHJvdW5kKCBwb3NpdGlvbi50b3AgKTsKCQl9CgoJCWNvbGxpc2lvblBvc2l0aW9uID0gewoJCQltYXJnaW5MZWZ0OiBtYXJnaW5MZWZ0LAoJCQltYXJnaW5Ub3A6IG1hcmdpblRvcAoJCX07CgoJCSQuZWFjaCggWyAibGVmdCIsICJ0b3AiIF0sIGZ1bmN0aW9uKCBpLCBkaXIgKSB7CgkJCWlmICggJC51aS5wb3NpdGlvblsgY29sbGlzaW9uWyBpIF0gXSApIHsKCQkJCSQudWkucG9zaXRpb25bIGNvbGxpc2lvblsgaSBdIF1bIGRpciBdKCBwb3NpdGlvbiwgewoJCQkJCXRhcmdldFdpZHRoOiB0YXJnZXRXaWR0aCwKCQkJCQl0YXJnZXRIZWlnaHQ6IHRhcmdldEhlaWdodCwKCQkJCQllbGVtV2lkdGg6IGVsZW1XaWR0aCwKCQkJCQllbGVtSGVpZ2h0OiBlbGVtSGVpZ2h0LAoJCQkJCWNvbGxpc2lvblBvc2l0aW9uOiBjb2xsaXNpb25Qb3NpdGlvbiwKCQkJCQljb2xsaXNpb25XaWR0aDogY29sbGlzaW9uV2lkdGgsCgkJCQkJY29sbGlzaW9uSGVpZ2h0OiBjb2xsaXNpb25IZWlnaHQsCgkJCQkJb2Zmc2V0OiBbIGF0T2Zmc2V0WyAwIF0gKyBteU9mZnNldFsgMCBdLCBhdE9mZnNldCBbIDEgXSArIG15T2Zmc2V0WyAxIF0gXSwKCQkJCQlteTogb3B0aW9ucy5teSwKCQkJCQlhdDogb3B0aW9ucy5hdCwKCQkJCQl3aXRoaW46IHdpdGhpbiwKCQkJCQllbGVtIDogZWxlbQoJCQkJfSk7CgkJCX0KCQl9KTsKCgkJaWYgKCBvcHRpb25zLnVzaW5nICkgewoJCQkvLyBhZGRzIGZlZWRiYWNrIGFzIHNlY29uZCBhcmd1bWVudCB0byB1c2luZyBjYWxsYmFjaywgaWYgcHJlc2VudAoJCQl1c2luZyA9IGZ1bmN0aW9uKCBwcm9wcyApIHsKCQkJCXZhciBsZWZ0ID0gdGFyZ2V0T2Zmc2V0LmxlZnQgLSBwb3NpdGlvbi5sZWZ0LAoJCQkJCXJpZ2h0ID0gbGVmdCArIHRhcmdldFdpZHRoIC0gZWxlbVdpZHRoLAoJCQkJCXRvcCA9IHRhcmdldE9mZnNldC50b3AgLSBwb3NpdGlvbi50b3AsCgkJCQkJYm90dG9tID0gdG9wICsgdGFyZ2V0SGVpZ2h0IC0gZWxlbUhlaWdodCwKCQkJCQlmZWVkYmFjayA9IHsKCQkJCQkJdGFyZ2V0OiB7CgkJCQkJCQllbGVtZW50OiB0YXJnZXQsCgkJCQkJCQlsZWZ0OiB0YXJnZXRPZmZzZXQubGVmdCwKCQkJCQkJCXRvcDogdGFyZ2V0T2Zmc2V0LnRvcCwKCQkJCQkJCXdpZHRoOiB0YXJnZXRXaWR0aCwKCQkJCQkJCWhlaWdodDogdGFyZ2V0SGVpZ2h0CgkJCQkJCX0sCgkJCQkJCWVsZW1lbnQ6IHsKCQkJCQkJCWVsZW1lbnQ6IGVsZW0sCgkJCQkJCQlsZWZ0OiBwb3NpdGlvbi5sZWZ0LAoJCQkJCQkJdG9wOiBwb3NpdGlvbi50b3AsCgkJCQkJCQl3aWR0aDogZWxlbVdpZHRoLAoJCQkJCQkJaGVpZ2h0OiBlbGVtSGVpZ2h0CgkJCQkJCX0sCgkJCQkJCWhvcml6b250YWw6IHJpZ2h0IDwgMCA/ICJsZWZ0IiA6IGxlZnQgPiAwID8gInJpZ2h0IiA6ICJjZW50ZXIiLAoJCQkJCQl2ZXJ0aWNhbDogYm90dG9tIDwgMCA/ICJ0b3AiIDogdG9wID4gMCA/ICJib3R0b20iIDogIm1pZGRsZSIKCQkJCQl9OwoJCQkJaWYgKCB0YXJnZXRXaWR0aCA8IGVsZW1XaWR0aCAmJiBhYnMoIGxlZnQgKyByaWdodCApIDwgdGFyZ2V0V2lkdGggKSB7CgkJCQkJZmVlZGJhY2suaG9yaXpvbnRhbCA9ICJjZW50ZXIiOwoJCQkJfQoJCQkJaWYgKCB0YXJnZXRIZWlnaHQgPCBlbGVtSGVpZ2h0ICYmIGFicyggdG9wICsgYm90dG9tICkgPCB0YXJnZXRIZWlnaHQgKSB7CgkJCQkJZmVlZGJhY2sudmVydGljYWwgPSAibWlkZGxlIjsKCQkJCX0KCQkJCWlmICggbWF4KCBhYnMoIGxlZnQgKSwgYWJzKCByaWdodCApICkgPiBtYXgoIGFicyggdG9wICksIGFicyggYm90dG9tICkgKSApIHsKCQkJCQlmZWVkYmFjay5pbXBvcnRhbnQgPSAiaG9yaXpvbnRhbCI7CgkJCQl9IGVsc2UgewoJCQkJCWZlZWRiYWNrLmltcG9ydGFudCA9ICJ2ZXJ0aWNhbCI7CgkJCQl9CgkJCQlvcHRpb25zLnVzaW5nLmNhbGwoIHRoaXMsIHByb3BzLCBmZWVkYmFjayApOwoJCQl9OwoJCX0KCgkJZWxlbS5vZmZzZXQoICQuZXh0ZW5kKCBwb3NpdGlvbiwgeyB1c2luZzogdXNpbmcgfSApICk7Cgl9KTsKfTsKCiQudWkucG9zaXRpb24gPSB7CglmaXQ6IHsKCQlsZWZ0OiBmdW5jdGlvbiggcG9zaXRpb24sIGRhdGEgKSB7CgkJCXZhciB3aXRoaW4gPSBkYXRhLndpdGhpbiwKCQkJCXdpdGhpbk9mZnNldCA9IHdpdGhpbi5pc1dpbmRvdyA/IHdpdGhpbi5zY3JvbGxMZWZ0IDogd2l0aGluLm9mZnNldC5sZWZ0LAoJCQkJb3V0ZXJXaWR0aCA9IHdpdGhpbi53aWR0aCwKCQkJCWNvbGxpc2lvblBvc0xlZnQgPSBwb3NpdGlvbi5sZWZ0IC0gZGF0YS5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0LAoJCQkJb3ZlckxlZnQgPSB3aXRoaW5PZmZzZXQgLSBjb2xsaXNpb25Qb3NMZWZ0LAoJCQkJb3ZlclJpZ2h0ID0gY29sbGlzaW9uUG9zTGVmdCArIGRhdGEuY29sbGlzaW9uV2lkdGggLSBvdXRlcldpZHRoIC0gd2l0aGluT2Zmc2V0LAoJCQkJbmV3T3ZlclJpZ2h0OwoKCQkJLy8gZWxlbWVudCBpcyB3aWRlciB0aGFuIHdpdGhpbgoJCQlpZiAoIGRhdGEuY29sbGlzaW9uV2lkdGggPiBvdXRlcldpZHRoICkgewoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkgb3ZlciB0aGUgbGVmdCBzaWRlIG9mIHdpdGhpbgoJCQkJaWYgKCBvdmVyTGVmdCA+IDAgJiYgb3ZlclJpZ2h0IDw9IDAgKSB7CgkJCQkJbmV3T3ZlclJpZ2h0ID0gcG9zaXRpb24ubGVmdCArIG92ZXJMZWZ0ICsgZGF0YS5jb2xsaXNpb25XaWR0aCAtIG91dGVyV2lkdGggLSB3aXRoaW5PZmZzZXQ7CgkJCQkJcG9zaXRpb24ubGVmdCArPSBvdmVyTGVmdCAtIG5ld092ZXJSaWdodDsKCQkJCS8vIGVsZW1lbnQgaXMgaW5pdGlhbGx5IG92ZXIgcmlnaHQgc2lkZSBvZiB3aXRoaW4KCQkJCX0gZWxzZSBpZiAoIG92ZXJSaWdodCA+IDAgJiYgb3ZlckxlZnQgPD0gMCApIHsKCQkJCQlwb3NpdGlvbi5sZWZ0ID0gd2l0aGluT2Zmc2V0OwoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkgb3ZlciBib3RoIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIG9mIHdpdGhpbgoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIG92ZXJMZWZ0ID4gb3ZlclJpZ2h0ICkgewoJCQkJCQlwb3NpdGlvbi5sZWZ0ID0gd2l0aGluT2Zmc2V0ICsgb3V0ZXJXaWR0aCAtIGRhdGEuY29sbGlzaW9uV2lkdGg7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcG9zaXRpb24ubGVmdCA9IHdpdGhpbk9mZnNldDsKCQkJCQl9CgkJCQl9CgkJCS8vIHRvbyBmYXIgbGVmdCAtPiBhbGlnbiB3aXRoIGxlZnQgZWRnZQoJCQl9IGVsc2UgaWYgKCBvdmVyTGVmdCA+IDAgKSB7CgkJCQlwb3NpdGlvbi5sZWZ0ICs9IG92ZXJMZWZ0OwoJCQkvLyB0b28gZmFyIHJpZ2h0IC0+IGFsaWduIHdpdGggcmlnaHQgZWRnZQoJCQl9IGVsc2UgaWYgKCBvdmVyUmlnaHQgPiAwICkgewoJCQkJcG9zaXRpb24ubGVmdCAtPSBvdmVyUmlnaHQ7CgkJCS8vIGFkanVzdCBiYXNlZCBvbiBwb3NpdGlvbiBhbmQgbWFyZ2luCgkJCX0gZWxzZSB7CgkJCQlwb3NpdGlvbi5sZWZ0ID0gbWF4KCBwb3NpdGlvbi5sZWZ0IC0gY29sbGlzaW9uUG9zTGVmdCwgcG9zaXRpb24ubGVmdCApOwoJCQl9CgkJfSwKCQl0b3A6IGZ1bmN0aW9uKCBwb3NpdGlvbiwgZGF0YSApIHsKCQkJdmFyIHdpdGhpbiA9IGRhdGEud2l0aGluLAoJCQkJd2l0aGluT2Zmc2V0ID0gd2l0aGluLmlzV2luZG93ID8gd2l0aGluLnNjcm9sbFRvcCA6IHdpdGhpbi5vZmZzZXQudG9wLAoJCQkJb3V0ZXJIZWlnaHQgPSBkYXRhLndpdGhpbi5oZWlnaHQsCgkJCQljb2xsaXNpb25Qb3NUb3AgPSBwb3NpdGlvbi50b3AgLSBkYXRhLmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCwKCQkJCW92ZXJUb3AgPSB3aXRoaW5PZmZzZXQgLSBjb2xsaXNpb25Qb3NUb3AsCgkJCQlvdmVyQm90dG9tID0gY29sbGlzaW9uUG9zVG9wICsgZGF0YS5jb2xsaXNpb25IZWlnaHQgLSBvdXRlckhlaWdodCAtIHdpdGhpbk9mZnNldCwKCQkJCW5ld092ZXJCb3R0b207CgoJCQkvLyBlbGVtZW50IGlzIHRhbGxlciB0aGFuIHdpdGhpbgoJCQlpZiAoIGRhdGEuY29sbGlzaW9uSGVpZ2h0ID4gb3V0ZXJIZWlnaHQgKSB7CgkJCQkvLyBlbGVtZW50IGlzIGluaXRpYWxseSBvdmVyIHRoZSB0b3Agb2Ygd2l0aGluCgkJCQlpZiAoIG92ZXJUb3AgPiAwICYmIG92ZXJCb3R0b20gPD0gMCApIHsKCQkJCQluZXdPdmVyQm90dG9tID0gcG9zaXRpb24udG9wICsgb3ZlclRvcCArIGRhdGEuY29sbGlzaW9uSGVpZ2h0IC0gb3V0ZXJIZWlnaHQgLSB3aXRoaW5PZmZzZXQ7CgkJCQkJcG9zaXRpb24udG9wICs9IG92ZXJUb3AgLSBuZXdPdmVyQm90dG9tOwoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkgb3ZlciBib3R0b20gb2Ygd2l0aGluCgkJCQl9IGVsc2UgaWYgKCBvdmVyQm90dG9tID4gMCAmJiBvdmVyVG9wIDw9IDAgKSB7CgkJCQkJcG9zaXRpb24udG9wID0gd2l0aGluT2Zmc2V0OwoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkgb3ZlciBib3RoIHRvcCBhbmQgYm90dG9tIG9mIHdpdGhpbgoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIG92ZXJUb3AgPiBvdmVyQm90dG9tICkgewoJCQkJCQlwb3NpdGlvbi50b3AgPSB3aXRoaW5PZmZzZXQgKyBvdXRlckhlaWdodCAtIGRhdGEuY29sbGlzaW9uSGVpZ2h0OwoJCQkJCX0gZWxzZSB7CgkJCQkJCXBvc2l0aW9uLnRvcCA9IHdpdGhpbk9mZnNldDsKCQkJCQl9CgkJCQl9CgkJCS8vIHRvbyBmYXIgdXAgLT4gYWxpZ24gd2l0aCB0b3AKCQkJfSBlbHNlIGlmICggb3ZlclRvcCA+IDAgKSB7CgkJCQlwb3NpdGlvbi50b3AgKz0gb3ZlclRvcDsKCQkJLy8gdG9vIGZhciBkb3duIC0+IGFsaWduIHdpdGggYm90dG9tIGVkZ2UKCQkJfSBlbHNlIGlmICggb3ZlckJvdHRvbSA+IDAgKSB7CgkJCQlwb3NpdGlvbi50b3AgLT0gb3ZlckJvdHRvbTsKCQkJLy8gYWRqdXN0IGJhc2VkIG9uIHBvc2l0aW9uIGFuZCBtYXJnaW4KCQkJfSBlbHNlIHsKCQkJCXBvc2l0aW9uLnRvcCA9IG1heCggcG9zaXRpb24udG9wIC0gY29sbGlzaW9uUG9zVG9wLCBwb3NpdGlvbi50b3AgKTsKCQkJfQoJCX0KCX0sCglmbGlwOiB7CgkJbGVmdDogZnVuY3Rpb24oIHBvc2l0aW9uLCBkYXRhICkgewoJCQl2YXIgd2l0aGluID0gZGF0YS53aXRoaW4sCgkJCQl3aXRoaW5PZmZzZXQgPSB3aXRoaW4ub2Zmc2V0LmxlZnQgKyB3aXRoaW4uc2Nyb2xsTGVmdCwKCQkJCW91dGVyV2lkdGggPSB3aXRoaW4ud2lkdGgsCgkJCQlvZmZzZXRMZWZ0ID0gd2l0aGluLmlzV2luZG93ID8gd2l0aGluLnNjcm9sbExlZnQgOiB3aXRoaW4ub2Zmc2V0LmxlZnQsCgkJCQljb2xsaXNpb25Qb3NMZWZ0ID0gcG9zaXRpb24ubGVmdCAtIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCwKCQkJCW92ZXJMZWZ0ID0gY29sbGlzaW9uUG9zTGVmdCAtIG9mZnNldExlZnQsCgkJCQlvdmVyUmlnaHQgPSBjb2xsaXNpb25Qb3NMZWZ0ICsgZGF0YS5jb2xsaXNpb25XaWR0aCAtIG91dGVyV2lkdGggLSBvZmZzZXRMZWZ0LAoJCQkJbXlPZmZzZXQgPSBkYXRhLm15WyAwIF0gPT09ICJsZWZ0IiA/CgkJCQkJLWRhdGEuZWxlbVdpZHRoIDoKCQkJCQlkYXRhLm15WyAwIF0gPT09ICJyaWdodCIgPwoJCQkJCQlkYXRhLmVsZW1XaWR0aCA6CgkJCQkJCTAsCgkJCQlhdE9mZnNldCA9IGRhdGEuYXRbIDAgXSA9PT0gImxlZnQiID8KCQkJCQlkYXRhLnRhcmdldFdpZHRoIDoKCQkJCQlkYXRhLmF0WyAwIF0gPT09ICJyaWdodCIgPwoJCQkJCQktZGF0YS50YXJnZXRXaWR0aCA6CgkJCQkJCTAsCgkJCQlvZmZzZXQgPSAtMiAqIGRhdGEub2Zmc2V0WyAwIF0sCgkJCQluZXdPdmVyUmlnaHQsCgkJCQluZXdPdmVyTGVmdDsKCgkJCWlmICggb3ZlckxlZnQgPCAwICkgewoJCQkJbmV3T3ZlclJpZ2h0ID0gcG9zaXRpb24ubGVmdCArIG15T2Zmc2V0ICsgYXRPZmZzZXQgKyBvZmZzZXQgKyBkYXRhLmNvbGxpc2lvbldpZHRoIC0gb3V0ZXJXaWR0aCAtIHdpdGhpbk9mZnNldDsKCQkJCWlmICggbmV3T3ZlclJpZ2h0IDwgMCB8fCBuZXdPdmVyUmlnaHQgPCBhYnMoIG92ZXJMZWZ0ICkgKSB7CgkJCQkJcG9zaXRpb24ubGVmdCArPSBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0OwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYgKCBvdmVyUmlnaHQgPiAwICkgewoJCQkJbmV3T3ZlckxlZnQgPSBwb3NpdGlvbi5sZWZ0IC0gZGF0YS5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0ICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldCAtIG9mZnNldExlZnQ7CgkJCQlpZiAoIG5ld092ZXJMZWZ0ID4gMCB8fCBhYnMoIG5ld092ZXJMZWZ0ICkgPCBvdmVyUmlnaHQgKSB7CgkJCQkJcG9zaXRpb24ubGVmdCArPSBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0OwoJCQkJfQoJCQl9CgkJfSwKCQl0b3A6IGZ1bmN0aW9uKCBwb3NpdGlvbiwgZGF0YSApIHsKCQkJdmFyIHdpdGhpbiA9IGRhdGEud2l0aGluLAoJCQkJd2l0aGluT2Zmc2V0ID0gd2l0aGluLm9mZnNldC50b3AgKyB3aXRoaW4uc2Nyb2xsVG9wLAoJCQkJb3V0ZXJIZWlnaHQgPSB3aXRoaW4uaGVpZ2h0LAoJCQkJb2Zmc2V0VG9wID0gd2l0aGluLmlzV2luZG93ID8gd2l0aGluLnNjcm9sbFRvcCA6IHdpdGhpbi5vZmZzZXQudG9wLAoJCQkJY29sbGlzaW9uUG9zVG9wID0gcG9zaXRpb24udG9wIC0gZGF0YS5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3AsCgkJCQlvdmVyVG9wID0gY29sbGlzaW9uUG9zVG9wIC0gb2Zmc2V0VG9wLAoJCQkJb3ZlckJvdHRvbSA9IGNvbGxpc2lvblBvc1RvcCArIGRhdGEuY29sbGlzaW9uSGVpZ2h0IC0gb3V0ZXJIZWlnaHQgLSBvZmZzZXRUb3AsCgkJCQl0b3AgPSBkYXRhLm15WyAxIF0gPT09ICJ0b3AiLAoJCQkJbXlPZmZzZXQgPSB0b3AgPwoJCQkJCS1kYXRhLmVsZW1IZWlnaHQgOgoJCQkJCWRhdGEubXlbIDEgXSA9PT0gImJvdHRvbSIgPwoJCQkJCQlkYXRhLmVsZW1IZWlnaHQgOgoJCQkJCQkwLAoJCQkJYXRPZmZzZXQgPSBkYXRhLmF0WyAxIF0gPT09ICJ0b3AiID8KCQkJCQlkYXRhLnRhcmdldEhlaWdodCA6CgkJCQkJZGF0YS5hdFsgMSBdID09PSAiYm90dG9tIiA/CgkJCQkJCS1kYXRhLnRhcmdldEhlaWdodCA6CgkJCQkJCTAsCgkJCQlvZmZzZXQgPSAtMiAqIGRhdGEub2Zmc2V0WyAxIF0sCgkJCQluZXdPdmVyVG9wLAoJCQkJbmV3T3ZlckJvdHRvbTsKCQkJaWYgKCBvdmVyVG9wIDwgMCApIHsKCQkJCW5ld092ZXJCb3R0b20gPSBwb3NpdGlvbi50b3AgKyBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0ICsgZGF0YS5jb2xsaXNpb25IZWlnaHQgLSBvdXRlckhlaWdodCAtIHdpdGhpbk9mZnNldDsKCQkJCWlmICggKCBwb3NpdGlvbi50b3AgKyBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0KSA+IG92ZXJUb3AgJiYgKCBuZXdPdmVyQm90dG9tIDwgMCB8fCBuZXdPdmVyQm90dG9tIDwgYWJzKCBvdmVyVG9wICkgKSApIHsKCQkJCQlwb3NpdGlvbi50b3AgKz0gbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmICggb3ZlckJvdHRvbSA+IDAgKSB7CgkJCQluZXdPdmVyVG9wID0gcG9zaXRpb24udG9wIC0gIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldCAtIG9mZnNldFRvcDsKCQkJCWlmICggKCBwb3NpdGlvbi50b3AgKyBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0KSA+IG92ZXJCb3R0b20gJiYgKCBuZXdPdmVyVG9wID4gMCB8fCBhYnMoIG5ld092ZXJUb3AgKSA8IG92ZXJCb3R0b20gKSApIHsKCQkJCQlwb3NpdGlvbi50b3AgKz0gbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldDsKCQkJCX0KCQkJfQoJCX0KCX0sCglmbGlwZml0OiB7CgkJbGVmdDogZnVuY3Rpb24oKSB7CgkJCSQudWkucG9zaXRpb24uZmxpcC5sZWZ0LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJJC51aS5wb3NpdGlvbi5maXQubGVmdC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSwKCQl0b3A6IGZ1bmN0aW9uKCkgewoJCQkkLnVpLnBvc2l0aW9uLmZsaXAudG9wLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJJC51aS5wb3NpdGlvbi5maXQudG9wLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl9Cgl9Cn07CgovLyBmcmFjdGlvbiBzdXBwb3J0IHRlc3QKKGZ1bmN0aW9uICgpIHsKCXZhciB0ZXN0RWxlbWVudCwgdGVzdEVsZW1lbnRQYXJlbnQsIHRlc3RFbGVtZW50U3R5bGUsIG9mZnNldExlZnQsIGksCgkJYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiYm9keSIgKVsgMCBdLAoJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7CgoJLy9DcmVhdGUgYSAiZmFrZSBib2R5IiBmb3IgdGVzdGluZyBiYXNlZCBvbiBtZXRob2QgdXNlZCBpbiBqUXVlcnkuc3VwcG9ydAoJdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBib2R5ID8gImRpdiIgOiAiYm9keSIgKTsKCXRlc3RFbGVtZW50U3R5bGUgPSB7CgkJdmlzaWJpbGl0eTogImhpZGRlbiIsCgkJd2lkdGg6IDAsCgkJaGVpZ2h0OiAwLAoJCWJvcmRlcjogMCwKCQltYXJnaW46IDAsCgkJYmFja2dyb3VuZDogIm5vbmUiCgl9OwoJaWYgKCBib2R5ICkgewoJCSQuZXh0ZW5kKCB0ZXN0RWxlbWVudFN0eWxlLCB7CgkJCXBvc2l0aW9uOiAiYWJzb2x1dGUiLAoJCQlsZWZ0OiAiLTEwMDBweCIsCgkJCXRvcDogIi0xMDAwcHgiCgkJfSk7Cgl9Cglmb3IgKCBpIGluIHRlc3RFbGVtZW50U3R5bGUgKSB7CgkJdGVzdEVsZW1lbnQuc3R5bGVbIGkgXSA9IHRlc3RFbGVtZW50U3R5bGVbIGkgXTsKCX0KCXRlc3RFbGVtZW50LmFwcGVuZENoaWxkKCBkaXYgKTsKCXRlc3RFbGVtZW50UGFyZW50ID0gYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Cgl0ZXN0RWxlbWVudFBhcmVudC5pbnNlcnRCZWZvcmUoIHRlc3RFbGVtZW50LCB0ZXN0RWxlbWVudFBhcmVudC5maXJzdENoaWxkICk7CgoJZGl2LnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAxMC43NDMyMjIycHg7IjsKCglvZmZzZXRMZWZ0ID0gJCggZGl2ICkub2Zmc2V0KCkubGVmdDsKCSQuc3VwcG9ydC5vZmZzZXRGcmFjdGlvbnMgPSBvZmZzZXRMZWZ0ID4gMTAgJiYgb2Zmc2V0TGVmdCA8IDExOwoKCXRlc3RFbGVtZW50LmlubmVySFRNTCA9ICIiOwoJdGVzdEVsZW1lbnRQYXJlbnQucmVtb3ZlQ2hpbGQoIHRlc3RFbGVtZW50ICk7Cn0pKCk7Cgp9KCBqUXVlcnkgKSApOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLndpZGdldCggInVpLnByb2dyZXNzYmFyIiwgewoJdmVyc2lvbjogIjEuMTAuMyIsCglvcHRpb25zOiB7CgkJbWF4OiAxMDAsCgkJdmFsdWU6IDAsCgoJCWNoYW5nZTogbnVsbCwKCQljb21wbGV0ZTogbnVsbAoJfSwKCgltaW46IDAsCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJLy8gQ29uc3RyYWluIGluaXRpYWwgdmFsdWUKCQl0aGlzLm9sZFZhbHVlID0gdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy5fY29uc3RyYWluZWRWYWx1ZSgpOwoKCQl0aGlzLmVsZW1lbnQKCQkJLmFkZENsYXNzKCAidWktcHJvZ3Jlc3NiYXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiICkKCQkJLmF0dHIoewoJCQkJLy8gT25seSBzZXQgc3RhdGljIHZhbHVlcywgYXJpYS12YWx1ZW5vdyBhbmQgYXJpYS12YWx1ZW1heCBhcmUKCQkJCS8vIHNldCBpbnNpZGUgX3JlZnJlc2hWYWx1ZSgpCgkJCQlyb2xlOiAicHJvZ3Jlc3NiYXIiLAoJCQkJImFyaWEtdmFsdWVtaW4iOiB0aGlzLm1pbgoJCQl9KTsKCgkJdGhpcy52YWx1ZURpdiA9ICQoICI8ZGl2IGNsYXNzPSd1aS1wcm9ncmVzc2Jhci12YWx1ZSB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1sZWZ0Jz48L2Rpdj4iICkKCQkJLmFwcGVuZFRvKCB0aGlzLmVsZW1lbnQgKTsKCgkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCAidWktcHJvZ3Jlc3NiYXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS12YWx1ZW1pbiIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtdmFsdWVtYXgiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLXZhbHVlbm93IiApOwoKCQl0aGlzLnZhbHVlRGl2LnJlbW92ZSgpOwoJfSwKCgl2YWx1ZTogZnVuY3Rpb24oIG5ld1ZhbHVlICkgewoJCWlmICggbmV3VmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZTsKCQl9CgoJCXRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuX2NvbnN0cmFpbmVkVmFsdWUoIG5ld1ZhbHVlICk7CgkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7Cgl9LAoKCV9jb25zdHJhaW5lZFZhbHVlOiBmdW5jdGlvbiggbmV3VmFsdWUgKSB7CgkJaWYgKCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQluZXdWYWx1ZSA9IHRoaXMub3B0aW9ucy52YWx1ZTsKCQl9CgoJCXRoaXMuaW5kZXRlcm1pbmF0ZSA9IG5ld1ZhbHVlID09PSBmYWxzZTsKCgkJLy8gc2FuaXRpemUgdmFsdWUKCQlpZiAoIHR5cGVvZiBuZXdWYWx1ZSAhPT0gIm51bWJlciIgKSB7CgkJCW5ld1ZhbHVlID0gMDsKCQl9CgoJCXJldHVybiB0aGlzLmluZGV0ZXJtaW5hdGUgPyBmYWxzZSA6CgkJCU1hdGgubWluKCB0aGlzLm9wdGlvbnMubWF4LCBNYXRoLm1heCggdGhpcy5taW4sIG5ld1ZhbHVlICkgKTsKCX0sCgoJX3NldE9wdGlvbnM6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCS8vIEVuc3VyZSAidmFsdWUiIG9wdGlvbiBpcyBzZXQgYWZ0ZXIgb3RoZXIgdmFsdWVzIChsaWtlIG1heCkKCQl2YXIgdmFsdWUgPSBvcHRpb25zLnZhbHVlOwoJCWRlbGV0ZSBvcHRpb25zLnZhbHVlOwoKCQl0aGlzLl9zdXBlciggb3B0aW9ucyApOwoKCQl0aGlzLm9wdGlvbnMudmFsdWUgPSB0aGlzLl9jb25zdHJhaW5lZFZhbHVlKCB2YWx1ZSApOwoJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQlpZiAoIGtleSA9PT0gIm1heCIgKSB7CgkJCS8vIERvbid0IGFsbG93IGEgbWF4IGxlc3MgdGhhbiBtaW4KCQkJdmFsdWUgPSBNYXRoLm1heCggdGhpcy5taW4sIHZhbHVlICk7CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoJfSwKCglfcGVyY2VudGFnZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuaW5kZXRlcm1pbmF0ZSA/IDEwMCA6IDEwMCAqICggdGhpcy5vcHRpb25zLnZhbHVlIC0gdGhpcy5taW4gKSAvICggdGhpcy5vcHRpb25zLm1heCAtIHRoaXMubWluICk7Cgl9LAoKCV9yZWZyZXNoVmFsdWU6IGZ1bmN0aW9uKCkgewoJCXZhciB2YWx1ZSA9IHRoaXMub3B0aW9ucy52YWx1ZSwKCQkJcGVyY2VudGFnZSA9IHRoaXMuX3BlcmNlbnRhZ2UoKTsKCgkJdGhpcy52YWx1ZURpdgoJCQkudG9nZ2xlKCB0aGlzLmluZGV0ZXJtaW5hdGUgfHwgdmFsdWUgPiB0aGlzLm1pbiApCgkJCS50b2dnbGVDbGFzcyggInVpLWNvcm5lci1yaWdodCIsIHZhbHVlID09PSB0aGlzLm9wdGlvbnMubWF4ICkKCQkJLndpZHRoKCBwZXJjZW50YWdlLnRvRml4ZWQoMCkgKyAiJSIgKTsKCgkJdGhpcy5lbGVtZW50LnRvZ2dsZUNsYXNzKCAidWktcHJvZ3Jlc3NiYXItaW5kZXRlcm1pbmF0ZSIsIHRoaXMuaW5kZXRlcm1pbmF0ZSApOwoKCQlpZiAoIHRoaXMuaW5kZXRlcm1pbmF0ZSApIHsKCQkJdGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoICJhcmlhLXZhbHVlbm93IiApOwoJCQlpZiAoICF0aGlzLm92ZXJsYXlEaXYgKSB7CgkJCQl0aGlzLm92ZXJsYXlEaXYgPSAkKCAiPGRpdiBjbGFzcz0ndWktcHJvZ3Jlc3NiYXItb3ZlcmxheSc+PC9kaXY+IiApLmFwcGVuZFRvKCB0aGlzLnZhbHVlRGl2ICk7CgkJCX0KCQl9IGVsc2UgewoJCQl0aGlzLmVsZW1lbnQuYXR0cih7CgkJCQkiYXJpYS12YWx1ZW1heCI6IHRoaXMub3B0aW9ucy5tYXgsCgkJCQkiYXJpYS12YWx1ZW5vdyI6IHZhbHVlCgkJCX0pOwoJCQlpZiAoIHRoaXMub3ZlcmxheURpdiApIHsKCQkJCXRoaXMub3ZlcmxheURpdi5yZW1vdmUoKTsKCQkJCXRoaXMub3ZlcmxheURpdiA9IG51bGw7CgkJCX0KCQl9CgoJCWlmICggdGhpcy5vbGRWYWx1ZSAhPT0gdmFsdWUgKSB7CgkJCXRoaXMub2xkVmFsdWUgPSB2YWx1ZTsKCQkJdGhpcy5fdHJpZ2dlciggImNoYW5nZSIgKTsKCQl9CgkJaWYgKCB2YWx1ZSA9PT0gdGhpcy5vcHRpb25zLm1heCApIHsKCQkJdGhpcy5fdHJpZ2dlciggImNvbXBsZXRlIiApOwoJCX0KCX0KfSk7Cgp9KSggalF1ZXJ5ICk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCi8vIG51bWJlciBvZiBwYWdlcyBpbiBhIHNsaWRlcgovLyAoaG93IG1hbnkgdGltZXMgY2FuIHlvdSBwYWdlIHVwL2Rvd24gdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgcmFuZ2UpCnZhciBudW1QYWdlcyA9IDU7CgokLndpZGdldCggInVpLnNsaWRlciIsICQudWkubW91c2UsIHsKCXZlcnNpb246ICIxLjEwLjMiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICJzbGlkZSIsCgoJb3B0aW9uczogewoJCWFuaW1hdGU6IGZhbHNlLAoJCWRpc3RhbmNlOiAwLAoJCW1heDogMTAwLAoJCW1pbjogMCwKCQlvcmllbnRhdGlvbjogImhvcml6b250YWwiLAoJCXJhbmdlOiBmYWxzZSwKCQlzdGVwOiAxLAoJCXZhbHVlOiAwLAoJCXZhbHVlczogbnVsbCwKCgkJLy8gY2FsbGJhY2tzCgkJY2hhbmdlOiBudWxsLAoJCXNsaWRlOiBudWxsLAoJCXN0YXJ0OiBudWxsLAoJCXN0b3A6IG51bGwKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5fa2V5U2xpZGluZyA9IGZhbHNlOwoJCXRoaXMuX21vdXNlU2xpZGluZyA9IGZhbHNlOwoJCXRoaXMuX2FuaW1hdGVPZmYgPSB0cnVlOwoJCXRoaXMuX2hhbmRsZUluZGV4ID0gbnVsbDsKCQl0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpOwoJCXRoaXMuX21vdXNlSW5pdCgpOwoKCQl0aGlzLmVsZW1lbnQKCQkJLmFkZENsYXNzKCAidWktc2xpZGVyIiArCgkJCQkiIHVpLXNsaWRlci0iICsgdGhpcy5vcmllbnRhdGlvbiArCgkJCQkiIHVpLXdpZGdldCIgKwoJCQkJIiB1aS13aWRnZXQtY29udGVudCIgKwoJCQkJIiB1aS1jb3JuZXItYWxsIik7CgoJCXRoaXMuX3JlZnJlc2goKTsKCQl0aGlzLl9zZXRPcHRpb24oICJkaXNhYmxlZCIsIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApOwoKCQl0aGlzLl9hbmltYXRlT2ZmID0gZmFsc2U7Cgl9LAoKCV9yZWZyZXNoOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9jcmVhdGVSYW5nZSgpOwoJCXRoaXMuX2NyZWF0ZUhhbmRsZXMoKTsKCQl0aGlzLl9zZXR1cEV2ZW50cygpOwoJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJfSwKCglfY3JlYXRlSGFuZGxlczogZnVuY3Rpb24oKSB7CgkJdmFyIGksIGhhbmRsZUNvdW50LAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlleGlzdGluZ0hhbmRsZXMgPSB0aGlzLmVsZW1lbnQuZmluZCggIi51aS1zbGlkZXItaGFuZGxlIiApLmFkZENsYXNzKCAidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiApLAoJCQloYW5kbGUgPSAiPGEgY2xhc3M9J3VpLXNsaWRlci1oYW5kbGUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJyBocmVmPScjJz48L2E+IiwKCQkJaGFuZGxlcyA9IFtdOwoKCQloYW5kbGVDb3VudCA9ICggb3B0aW9ucy52YWx1ZXMgJiYgb3B0aW9ucy52YWx1ZXMubGVuZ3RoICkgfHwgMTsKCgkJaWYgKCBleGlzdGluZ0hhbmRsZXMubGVuZ3RoID4gaGFuZGxlQ291bnQgKSB7CgkJCWV4aXN0aW5nSGFuZGxlcy5zbGljZSggaGFuZGxlQ291bnQgKS5yZW1vdmUoKTsKCQkJZXhpc3RpbmdIYW5kbGVzID0gZXhpc3RpbmdIYW5kbGVzLnNsaWNlKCAwLCBoYW5kbGVDb3VudCApOwoJCX0KCgkJZm9yICggaSA9IGV4aXN0aW5nSGFuZGxlcy5sZW5ndGg7IGkgPCBoYW5kbGVDb3VudDsgaSsrICkgewoJCQloYW5kbGVzLnB1c2goIGhhbmRsZSApOwoJCX0KCgkJdGhpcy5oYW5kbGVzID0gZXhpc3RpbmdIYW5kbGVzLmFkZCggJCggaGFuZGxlcy5qb2luKCAiIiApICkuYXBwZW5kVG8oIHRoaXMuZWxlbWVudCApICk7CgoJCXRoaXMuaGFuZGxlID0gdGhpcy5oYW5kbGVzLmVxKCAwICk7CgoJCXRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkkKCB0aGlzICkuZGF0YSggInVpLXNsaWRlci1oYW5kbGUtaW5kZXgiLCBpICk7CgkJfSk7Cgl9LAoKCV9jcmVhdGVSYW5nZTogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCWNsYXNzZXMgPSAiIjsKCgkJaWYgKCBvcHRpb25zLnJhbmdlICkgewoJCQlpZiAoIG9wdGlvbnMucmFuZ2UgPT09IHRydWUgKSB7CgkJCQlpZiAoICFvcHRpb25zLnZhbHVlcyApIHsKCQkJCQlvcHRpb25zLnZhbHVlcyA9IFsgdGhpcy5fdmFsdWVNaW4oKSwgdGhpcy5fdmFsdWVNaW4oKSBdOwoJCQkJfSBlbHNlIGlmICggb3B0aW9ucy52YWx1ZXMubGVuZ3RoICYmIG9wdGlvbnMudmFsdWVzLmxlbmd0aCAhPT0gMiApIHsKCQkJCQlvcHRpb25zLnZhbHVlcyA9IFsgb3B0aW9ucy52YWx1ZXNbMF0sIG9wdGlvbnMudmFsdWVzWzBdIF07CgkJCQl9IGVsc2UgaWYgKCAkLmlzQXJyYXkoIG9wdGlvbnMudmFsdWVzICkgKSB7CgkJCQkJb3B0aW9ucy52YWx1ZXMgPSBvcHRpb25zLnZhbHVlcy5zbGljZSgwKTsKCQkJCX0KCQkJfQoKCQkJaWYgKCAhdGhpcy5yYW5nZSB8fCAhdGhpcy5yYW5nZS5sZW5ndGggKSB7CgkJCQl0aGlzLnJhbmdlID0gJCggIjxkaXY+PC9kaXY+IiApCgkJCQkJLmFwcGVuZFRvKCB0aGlzLmVsZW1lbnQgKTsKCgkJCQljbGFzc2VzID0gInVpLXNsaWRlci1yYW5nZSIgKwoJCQkJLy8gbm90ZTogdGhpcyBpc24ndCB0aGUgbW9zdCBmaXR0aW5nbHkgc2VtYW50aWMgZnJhbWV3b3JrIGNsYXNzIGZvciB0aGlzIGVsZW1lbnQsCgkJCQkvLyBidXQgd29ya2VkIGJlc3QgdmlzdWFsbHkgd2l0aCBhIHZhcmlldHkgb2YgdGhlbWVzCgkJCQkiIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCI7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnJhbmdlLnJlbW92ZUNsYXNzKCAidWktc2xpZGVyLXJhbmdlLW1pbiB1aS1zbGlkZXItcmFuZ2UtbWF4IiApCgkJCQkJLy8gSGFuZGxlIHJhbmdlIHN3aXRjaGluZyBmcm9tIHRydWUgdG8gbWluL21heAoJCQkJCS5jc3MoewoJCQkJCQkibGVmdCI6ICIiLAoJCQkJCQkiYm90dG9tIjogIiIKCQkJCQl9KTsKCQkJfQoKCQkJdGhpcy5yYW5nZS5hZGRDbGFzcyggY2xhc3NlcyArCgkJCQkoICggb3B0aW9ucy5yYW5nZSA9PT0gIm1pbiIgfHwgb3B0aW9ucy5yYW5nZSA9PT0gIm1heCIgKSA/ICIgdWktc2xpZGVyLXJhbmdlLSIgKyBvcHRpb25zLnJhbmdlIDogIiIgKSApOwoJCX0gZWxzZSB7CgkJCXRoaXMucmFuZ2UgPSAkKFtdKTsKCQl9Cgl9LAoKCV9zZXR1cEV2ZW50czogZnVuY3Rpb24oKSB7CgkJdmFyIGVsZW1lbnRzID0gdGhpcy5oYW5kbGVzLmFkZCggdGhpcy5yYW5nZSApLmZpbHRlciggImEiICk7CgkJdGhpcy5fb2ZmKCBlbGVtZW50cyApOwoJCXRoaXMuX29uKCBlbGVtZW50cywgdGhpcy5faGFuZGxlRXZlbnRzICk7CgkJdGhpcy5faG92ZXJhYmxlKCBlbGVtZW50cyApOwoJCXRoaXMuX2ZvY3VzYWJsZSggZWxlbWVudHMgKTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGFuZGxlcy5yZW1vdmUoKTsKCQl0aGlzLnJhbmdlLnJlbW92ZSgpOwoKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCAidWktc2xpZGVyIiArCgkJCQkiIHVpLXNsaWRlci1ob3Jpem9udGFsIiArCgkJCQkiIHVpLXNsaWRlci12ZXJ0aWNhbCIgKwoJCQkJIiB1aS13aWRnZXQiICsKCQkJCSIgdWktd2lkZ2V0LWNvbnRlbnQiICsKCQkJCSIgdWktY29ybmVyLWFsbCIgKTsKCgkJdGhpcy5fbW91c2VEZXN0cm95KCk7Cgl9LAoKCV9tb3VzZUNhcHR1cmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgcG9zaXRpb24sIG5vcm1WYWx1ZSwgZGlzdGFuY2UsIGNsb3Nlc3RIYW5kbGUsIGluZGV4LCBhbGxvd2VkLCBvZmZzZXQsIG1vdXNlT3ZlckhhbmRsZSwKCQkJdGhhdCA9IHRoaXMsCgkJCW8gPSB0aGlzLm9wdGlvbnM7CgoJCWlmICggby5kaXNhYmxlZCApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdGhpcy5lbGVtZW50U2l6ZSA9IHsKCQkJd2lkdGg6IHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksCgkJCWhlaWdodDogdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCkKCQl9OwoJCXRoaXMuZWxlbWVudE9mZnNldCA9IHRoaXMuZWxlbWVudC5vZmZzZXQoKTsKCgkJcG9zaXRpb24gPSB7IHg6IGV2ZW50LnBhZ2VYLCB5OiBldmVudC5wYWdlWSB9OwoJCW5vcm1WYWx1ZSA9IHRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZSggcG9zaXRpb24gKTsKCQlkaXN0YW5jZSA9IHRoaXMuX3ZhbHVlTWF4KCkgLSB0aGlzLl92YWx1ZU1pbigpICsgMTsKCQl0aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJdmFyIHRoaXNEaXN0YW5jZSA9IE1hdGguYWJzKCBub3JtVmFsdWUgLSB0aGF0LnZhbHVlcyhpKSApOwoJCQlpZiAoKCBkaXN0YW5jZSA+IHRoaXNEaXN0YW5jZSApIHx8CgkJCQkoIGRpc3RhbmNlID09PSB0aGlzRGlzdGFuY2UgJiYKCQkJCQkoaSA9PT0gdGhhdC5fbGFzdENoYW5nZWRWYWx1ZSB8fCB0aGF0LnZhbHVlcyhpKSA9PT0gby5taW4gKSkpIHsKCQkJCWRpc3RhbmNlID0gdGhpc0Rpc3RhbmNlOwoJCQkJY2xvc2VzdEhhbmRsZSA9ICQoIHRoaXMgKTsKCQkJCWluZGV4ID0gaTsKCQkJfQoJCX0pOwoKCQlhbGxvd2VkID0gdGhpcy5fc3RhcnQoIGV2ZW50LCBpbmRleCApOwoJCWlmICggYWxsb3dlZCA9PT0gZmFsc2UgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJdGhpcy5fbW91c2VTbGlkaW5nID0gdHJ1ZTsKCgkJdGhpcy5faGFuZGxlSW5kZXggPSBpbmRleDsKCgkJY2xvc2VzdEhhbmRsZQoJCQkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICkKCQkJLmZvY3VzKCk7CgoJCW9mZnNldCA9IGNsb3Nlc3RIYW5kbGUub2Zmc2V0KCk7CgkJbW91c2VPdmVySGFuZGxlID0gISQoIGV2ZW50LnRhcmdldCApLnBhcmVudHMoKS5hZGRCYWNrKCkuaXMoICIudWktc2xpZGVyLWhhbmRsZSIgKTsKCQl0aGlzLl9jbGlja09mZnNldCA9IG1vdXNlT3ZlckhhbmRsZSA/IHsgbGVmdDogMCwgdG9wOiAwIH0gOiB7CgkJCWxlZnQ6IGV2ZW50LnBhZ2VYIC0gb2Zmc2V0LmxlZnQgLSAoIGNsb3Nlc3RIYW5kbGUud2lkdGgoKSAvIDIgKSwKCQkJdG9wOiBldmVudC5wYWdlWSAtIG9mZnNldC50b3AgLQoJCQkJKCBjbG9zZXN0SGFuZGxlLmhlaWdodCgpIC8gMiApIC0KCQkJCSggcGFyc2VJbnQoIGNsb3Nlc3RIYW5kbGUuY3NzKCJib3JkZXJUb3BXaWR0aCIpLCAxMCApIHx8IDAgKSAtCgkJCQkoIHBhcnNlSW50KCBjbG9zZXN0SGFuZGxlLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwgMTAgKSB8fCAwKSArCgkJCQkoIHBhcnNlSW50KCBjbG9zZXN0SGFuZGxlLmNzcygibWFyZ2luVG9wIiksIDEwICkgfHwgMCkKCQl9OwoKCQlpZiAoICF0aGlzLmhhbmRsZXMuaGFzQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKSApIHsKCQkJdGhpcy5fc2xpZGUoIGV2ZW50LCBpbmRleCwgbm9ybVZhbHVlICk7CgkJfQoJCXRoaXMuX2FuaW1hdGVPZmYgPSB0cnVlOwoJCXJldHVybiB0cnVlOwoJfSwKCglfbW91c2VTdGFydDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgcG9zaXRpb24gPSB7IHg6IGV2ZW50LnBhZ2VYLCB5OiBldmVudC5wYWdlWSB9LAoJCQlub3JtVmFsdWUgPSB0aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UoIHBvc2l0aW9uICk7CgoJCXRoaXMuX3NsaWRlKCBldmVudCwgdGhpcy5faGFuZGxlSW5kZXgsIG5vcm1WYWx1ZSApOwoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZVN0b3A6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJdGhpcy5fbW91c2VTbGlkaW5nID0gZmFsc2U7CgoJCXRoaXMuX3N0b3AoIGV2ZW50LCB0aGlzLl9oYW5kbGVJbmRleCApOwoJCXRoaXMuX2NoYW5nZSggZXZlbnQsIHRoaXMuX2hhbmRsZUluZGV4ICk7CgoJCXRoaXMuX2hhbmRsZUluZGV4ID0gbnVsbDsKCQl0aGlzLl9jbGlja09mZnNldCA9IG51bGw7CgkJdGhpcy5fYW5pbWF0ZU9mZiA9IGZhbHNlOwoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9kZXRlY3RPcmllbnRhdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5vcmllbnRhdGlvbiA9ICggdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSAidmVydGljYWwiICkgPyAidmVydGljYWwiIDogImhvcml6b250YWwiOwoJfSwKCglfbm9ybVZhbHVlRnJvbU1vdXNlOiBmdW5jdGlvbiggcG9zaXRpb24gKSB7CgkJdmFyIHBpeGVsVG90YWwsCgkJCXBpeGVsTW91c2UsCgkJCXBlcmNlbnRNb3VzZSwKCQkJdmFsdWVUb3RhbCwKCQkJdmFsdWVNb3VzZTsKCgkJaWYgKCB0aGlzLm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgKSB7CgkJCXBpeGVsVG90YWwgPSB0aGlzLmVsZW1lbnRTaXplLndpZHRoOwoJCQlwaXhlbE1vdXNlID0gcG9zaXRpb24ueCAtIHRoaXMuZWxlbWVudE9mZnNldC5sZWZ0IC0gKCB0aGlzLl9jbGlja09mZnNldCA/IHRoaXMuX2NsaWNrT2Zmc2V0LmxlZnQgOiAwICk7CgkJfSBlbHNlIHsKCQkJcGl4ZWxUb3RhbCA9IHRoaXMuZWxlbWVudFNpemUuaGVpZ2h0OwoJCQlwaXhlbE1vdXNlID0gcG9zaXRpb24ueSAtIHRoaXMuZWxlbWVudE9mZnNldC50b3AgLSAoIHRoaXMuX2NsaWNrT2Zmc2V0ID8gdGhpcy5fY2xpY2tPZmZzZXQudG9wIDogMCApOwoJCX0KCgkJcGVyY2VudE1vdXNlID0gKCBwaXhlbE1vdXNlIC8gcGl4ZWxUb3RhbCApOwoJCWlmICggcGVyY2VudE1vdXNlID4gMSApIHsKCQkJcGVyY2VudE1vdXNlID0gMTsKCQl9CgkJaWYgKCBwZXJjZW50TW91c2UgPCAwICkgewoJCQlwZXJjZW50TW91c2UgPSAwOwoJCX0KCQlpZiAoIHRoaXMub3JpZW50YXRpb24gPT09ICJ2ZXJ0aWNhbCIgKSB7CgkJCXBlcmNlbnRNb3VzZSA9IDEgLSBwZXJjZW50TW91c2U7CgkJfQoKCQl2YWx1ZVRvdGFsID0gdGhpcy5fdmFsdWVNYXgoKSAtIHRoaXMuX3ZhbHVlTWluKCk7CgkJdmFsdWVNb3VzZSA9IHRoaXMuX3ZhbHVlTWluKCkgKyBwZXJjZW50TW91c2UgKiB2YWx1ZVRvdGFsOwoKCQlyZXR1cm4gdGhpcy5fdHJpbUFsaWduVmFsdWUoIHZhbHVlTW91c2UgKTsKCX0sCgoJX3N0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIGluZGV4ICkgewoJCXZhciB1aUhhc2ggPSB7CgkJCWhhbmRsZTogdGhpcy5oYW5kbGVzWyBpbmRleCBdLAoJCQl2YWx1ZTogdGhpcy52YWx1ZSgpCgkJfTsKCQlpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCXVpSGFzaC52YWx1ZSA9IHRoaXMudmFsdWVzKCBpbmRleCApOwoJCQl1aUhhc2gudmFsdWVzID0gdGhpcy52YWx1ZXMoKTsKCQl9CgkJcmV0dXJuIHRoaXMuX3RyaWdnZXIoICJzdGFydCIsIGV2ZW50LCB1aUhhc2ggKTsKCX0sCgoJX3NsaWRlOiBmdW5jdGlvbiggZXZlbnQsIGluZGV4LCBuZXdWYWwgKSB7CgkJdmFyIG90aGVyVmFsLAoJCQluZXdWYWx1ZXMsCgkJCWFsbG93ZWQ7CgoJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJb3RoZXJWYWwgPSB0aGlzLnZhbHVlcyggaW5kZXggPyAwIDogMSApOwoKCQkJaWYgKCAoIHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoID09PSAyICYmIHRoaXMub3B0aW9ucy5yYW5nZSA9PT0gdHJ1ZSApICYmCgkJCQkJKCAoIGluZGV4ID09PSAwICYmIG5ld1ZhbCA+IG90aGVyVmFsKSB8fCAoIGluZGV4ID09PSAxICYmIG5ld1ZhbCA8IG90aGVyVmFsICkgKQoJCQkJKSB7CgkJCQluZXdWYWwgPSBvdGhlclZhbDsKCQkJfQoKCQkJaWYgKCBuZXdWYWwgIT09IHRoaXMudmFsdWVzKCBpbmRleCApICkgewoJCQkJbmV3VmFsdWVzID0gdGhpcy52YWx1ZXMoKTsKCQkJCW5ld1ZhbHVlc1sgaW5kZXggXSA9IG5ld1ZhbDsKCQkJCS8vIEEgc2xpZGUgY2FuIGJlIGNhbmNlbGVkIGJ5IHJldHVybmluZyBmYWxzZSBmcm9tIHRoZSBzbGlkZSBjYWxsYmFjawoJCQkJYWxsb3dlZCA9IHRoaXMuX3RyaWdnZXIoICJzbGlkZSIsIGV2ZW50LCB7CgkJCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCQkJdmFsdWU6IG5ld1ZhbCwKCQkJCQl2YWx1ZXM6IG5ld1ZhbHVlcwoJCQkJfSApOwoJCQkJb3RoZXJWYWwgPSB0aGlzLnZhbHVlcyggaW5kZXggPyAwIDogMSApOwoJCQkJaWYgKCBhbGxvd2VkICE9PSBmYWxzZSApIHsKCQkJCQl0aGlzLnZhbHVlcyggaW5kZXgsIG5ld1ZhbCwgdHJ1ZSApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKCBuZXdWYWwgIT09IHRoaXMudmFsdWUoKSApIHsKCQkJCS8vIEEgc2xpZGUgY2FuIGJlIGNhbmNlbGVkIGJ5IHJldHVybmluZyBmYWxzZSBmcm9tIHRoZSBzbGlkZSBjYWxsYmFjawoJCQkJYWxsb3dlZCA9IHRoaXMuX3RyaWdnZXIoICJzbGlkZSIsIGV2ZW50LCB7CgkJCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCQkJdmFsdWU6IG5ld1ZhbAoJCQkJfSApOwoJCQkJaWYgKCBhbGxvd2VkICE9PSBmYWxzZSApIHsKCQkJCQl0aGlzLnZhbHVlKCBuZXdWYWwgKTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJX3N0b3A6IGZ1bmN0aW9uKCBldmVudCwgaW5kZXggKSB7CgkJdmFyIHVpSGFzaCA9IHsKCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCXZhbHVlOiB0aGlzLnZhbHVlKCkKCQl9OwoJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJdWlIYXNoLnZhbHVlID0gdGhpcy52YWx1ZXMoIGluZGV4ICk7CgkJCXVpSGFzaC52YWx1ZXMgPSB0aGlzLnZhbHVlcygpOwoJCX0KCgkJdGhpcy5fdHJpZ2dlciggInN0b3AiLCBldmVudCwgdWlIYXNoICk7Cgl9LAoKCV9jaGFuZ2U6IGZ1bmN0aW9uKCBldmVudCwgaW5kZXggKSB7CgkJaWYgKCAhdGhpcy5fa2V5U2xpZGluZyAmJiAhdGhpcy5fbW91c2VTbGlkaW5nICkgewoJCQl2YXIgdWlIYXNoID0gewoJCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCQl2YWx1ZTogdGhpcy52YWx1ZSgpCgkJCX07CgkJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJCXVpSGFzaC52YWx1ZSA9IHRoaXMudmFsdWVzKCBpbmRleCApOwoJCQkJdWlIYXNoLnZhbHVlcyA9IHRoaXMudmFsdWVzKCk7CgkJCX0KCgkJCS8vc3RvcmUgdGhlIGxhc3QgY2hhbmdlZCB2YWx1ZSBpbmRleCBmb3IgcmVmZXJlbmNlIHdoZW4gaGFuZGxlcyBvdmVybGFwCgkJCXRoaXMuX2xhc3RDaGFuZ2VkVmFsdWUgPSBpbmRleDsKCgkJCXRoaXMuX3RyaWdnZXIoICJjaGFuZ2UiLCBldmVudCwgdWlIYXNoICk7CgkJfQoJfSwKCgl2YWx1ZTogZnVuY3Rpb24oIG5ld1ZhbHVlICkgewoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIG5ld1ZhbHVlICk7CgkJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJCQl0aGlzLl9jaGFuZ2UoIG51bGwsIDAgKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmV0dXJuIHRoaXMuX3ZhbHVlKCk7Cgl9LAoKCXZhbHVlczogZnVuY3Rpb24oIGluZGV4LCBuZXdWYWx1ZSApIHsKCQl2YXIgdmFscywKCQkJbmV3VmFsdWVzLAoJCQlpOwoKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkgewoJCQl0aGlzLm9wdGlvbnMudmFsdWVzWyBpbmRleCBdID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIG5ld1ZhbHVlICk7CgkJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJCQl0aGlzLl9jaGFuZ2UoIG51bGwsIGluZGV4ICk7CgkJCXJldHVybjsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJaWYgKCAkLmlzQXJyYXkoIGFyZ3VtZW50c1sgMCBdICkgKSB7CgkJCQl2YWxzID0gdGhpcy5vcHRpb25zLnZhbHVlczsKCQkJCW5ld1ZhbHVlcyA9IGFyZ3VtZW50c1sgMCBdOwoJCQkJZm9yICggaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSArPSAxICkgewoJCQkJCXZhbHNbIGkgXSA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKCBuZXdWYWx1ZXNbIGkgXSApOwoJCQkJCXRoaXMuX2NoYW5nZSggbnVsbCwgaSApOwoJCQkJfQoJCQkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCQkJcmV0dXJuIHRoaXMuX3ZhbHVlcyggaW5kZXggKTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMudmFsdWUoKTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLl92YWx1ZXMoKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBpLAoJCQl2YWxzTGVuZ3RoID0gMDsKCgkJaWYgKCBrZXkgPT09ICJyYW5nZSIgJiYgdGhpcy5vcHRpb25zLnJhbmdlID09PSB0cnVlICkgewoJCQlpZiAoIHZhbHVlID09PSAibWluIiApIHsKCQkJCXRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuX3ZhbHVlcyggMCApOwoJCQkJdGhpcy5vcHRpb25zLnZhbHVlcyA9IG51bGw7CgkJCX0gZWxzZSBpZiAoIHZhbHVlID09PSAibWF4IiApIHsKCQkJCXRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuX3ZhbHVlcyggdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgtMSApOwoJCQkJdGhpcy5vcHRpb25zLnZhbHVlcyA9IG51bGw7CgkJCX0KCQl9CgoJCWlmICggJC5pc0FycmF5KCB0aGlzLm9wdGlvbnMudmFsdWVzICkgKSB7CgkJCXZhbHNMZW5ndGggPSB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aDsKCQl9CgoJCSQuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJc3dpdGNoICgga2V5ICkgewoJCQljYXNlICJvcmllbnRhdGlvbiI6CgkJCQl0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpOwoJCQkJdGhpcy5lbGVtZW50CgkJCQkJLnJlbW92ZUNsYXNzKCAidWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIiApCgkJCQkJLmFkZENsYXNzKCAidWktc2xpZGVyLSIgKyB0aGlzLm9yaWVudGF0aW9uICk7CgkJCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCQkJCWJyZWFrOwoJCQljYXNlICJ2YWx1ZSI6CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0gdHJ1ZTsKCQkJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJCQkJdGhpcy5fY2hhbmdlKCBudWxsLCAwICk7CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0gZmFsc2U7CgkJCQlicmVhazsKCQkJY2FzZSAidmFsdWVzIjoKCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSB0cnVlOwoJCQkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgkJCQlmb3IgKCBpID0gMDsgaSA8IHZhbHNMZW5ndGg7IGkgKz0gMSApIHsKCQkJCQl0aGlzLl9jaGFuZ2UoIG51bGwsIGkgKTsKCQkJCX0KCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQljYXNlICJtaW4iOgoJCQljYXNlICJtYXgiOgoJCQkJdGhpcy5fYW5pbWF0ZU9mZiA9IHRydWU7CgkJCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQljYXNlICJyYW5nZSI6CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0gdHJ1ZTsKCQkJCXRoaXMuX3JlZnJlc2goKTsKCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCX0KCX0sCgoJLy9pbnRlcm5hbCB2YWx1ZSBnZXR0ZXIKCS8vIF92YWx1ZSgpIHJldHVybnMgdmFsdWUgdHJpbW1lZCBieSBtaW4gYW5kIG1heCwgYWxpZ25lZCBieSBzdGVwCglfdmFsdWU6IGZ1bmN0aW9uKCkgewoJCXZhciB2YWwgPSB0aGlzLm9wdGlvbnMudmFsdWU7CgkJdmFsID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIHZhbCApOwoKCQlyZXR1cm4gdmFsOwoJfSwKCgkvL2ludGVybmFsIHZhbHVlcyBnZXR0ZXIKCS8vIF92YWx1ZXMoKSByZXR1cm5zIGFycmF5IG9mIHZhbHVlcyB0cmltbWVkIGJ5IG1pbiBhbmQgbWF4LCBhbGlnbmVkIGJ5IHN0ZXAKCS8vIF92YWx1ZXMoIGluZGV4ICkgcmV0dXJucyBzaW5nbGUgdmFsdWUgdHJpbW1lZCBieSBtaW4gYW5kIG1heCwgYWxpZ25lZCBieSBzdGVwCglfdmFsdWVzOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJdmFyIHZhbCwKCQkJdmFscywKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YWwgPSB0aGlzLm9wdGlvbnMudmFsdWVzWyBpbmRleCBdOwoJCQl2YWwgPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggdmFsICk7CgoJCQlyZXR1cm4gdmFsOwoJCX0gZWxzZSBpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCS8vIC5zbGljZSgpIGNyZWF0ZXMgYSBjb3B5IG9mIHRoZSBhcnJheQoJCQkvLyB0aGlzIGNvcHkgZ2V0cyB0cmltbWVkIGJ5IG1pbiBhbmQgbWF4IGFuZCB0aGVuIHJldHVybmVkCgkJCXZhbHMgPSB0aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCk7CgkJCWZvciAoIGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrPSAxKSB7CgkJCQl2YWxzWyBpIF0gPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggdmFsc1sgaSBdICk7CgkJCX0KCgkJCXJldHVybiB2YWxzOwoJCX0gZWxzZSB7CgkJCXJldHVybiBbXTsKCQl9Cgl9LAoKCS8vIHJldHVybnMgdGhlIHN0ZXAtYWxpZ25lZCB2YWx1ZSB0aGF0IHZhbCBpcyBjbG9zZXN0IHRvLCBiZXR3ZWVuIChpbmNsdXNpdmUpIG1pbiBhbmQgbWF4CglfdHJpbUFsaWduVmFsdWU6IGZ1bmN0aW9uKCB2YWwgKSB7CgkJaWYgKCB2YWwgPD0gdGhpcy5fdmFsdWVNaW4oKSApIHsKCQkJcmV0dXJuIHRoaXMuX3ZhbHVlTWluKCk7CgkJfQoJCWlmICggdmFsID49IHRoaXMuX3ZhbHVlTWF4KCkgKSB7CgkJCXJldHVybiB0aGlzLl92YWx1ZU1heCgpOwoJCX0KCQl2YXIgc3RlcCA9ICggdGhpcy5vcHRpb25zLnN0ZXAgPiAwICkgPyB0aGlzLm9wdGlvbnMuc3RlcCA6IDEsCgkJCXZhbE1vZFN0ZXAgPSAodmFsIC0gdGhpcy5fdmFsdWVNaW4oKSkgJSBzdGVwLAoJCQlhbGlnblZhbHVlID0gdmFsIC0gdmFsTW9kU3RlcDsKCgkJaWYgKCBNYXRoLmFicyh2YWxNb2RTdGVwKSAqIDIgPj0gc3RlcCApIHsKCQkJYWxpZ25WYWx1ZSArPSAoIHZhbE1vZFN0ZXAgPiAwICkgPyBzdGVwIDogKCAtc3RlcCApOwoJCX0KCgkJLy8gU2luY2UgSmF2YVNjcmlwdCBoYXMgcHJvYmxlbXMgd2l0aCBsYXJnZSBmbG9hdHMsIHJvdW5kCgkJLy8gdGhlIGZpbmFsIHZhbHVlIHRvIDUgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IChzZWUgIzQxMjQpCgkJcmV0dXJuIHBhcnNlRmxvYXQoIGFsaWduVmFsdWUudG9GaXhlZCg1KSApOwoJfSwKCglfdmFsdWVNaW46IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm9wdGlvbnMubWluOwoJfSwKCglfdmFsdWVNYXg6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm9wdGlvbnMubWF4OwoJfSwKCglfcmVmcmVzaFZhbHVlOiBmdW5jdGlvbigpIHsKCQl2YXIgbGFzdFZhbFBlcmNlbnQsIHZhbFBlcmNlbnQsIHZhbHVlLCB2YWx1ZU1pbiwgdmFsdWVNYXgsCgkJCW9SYW5nZSA9IHRoaXMub3B0aW9ucy5yYW5nZSwKCQkJbyA9IHRoaXMub3B0aW9ucywKCQkJdGhhdCA9IHRoaXMsCgkJCWFuaW1hdGUgPSAoICF0aGlzLl9hbmltYXRlT2ZmICkgPyBvLmFuaW1hdGUgOiBmYWxzZSwKCQkJX3NldCA9IHt9OwoKCQlpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCXRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJdmFsUGVyY2VudCA9ICggdGhhdC52YWx1ZXMoaSkgLSB0aGF0Ll92YWx1ZU1pbigpICkgLyAoIHRoYXQuX3ZhbHVlTWF4KCkgLSB0aGF0Ll92YWx1ZU1pbigpICkgKiAxMDA7CgkJCQlfc2V0WyB0aGF0Lm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgPyAibGVmdCIgOiAiYm90dG9tIiBdID0gdmFsUGVyY2VudCArICIlIjsKCQkJCSQoIHRoaXMgKS5zdG9wKCAxLCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCBfc2V0LCBvLmFuaW1hdGUgKTsKCQkJCWlmICggdGhhdC5vcHRpb25zLnJhbmdlID09PSB0cnVlICkgewoJCQkJCWlmICggdGhhdC5vcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiICkgewoJCQkJCQlpZiAoIGkgPT09IDAgKSB7CgkJCQkJCQl0aGF0LnJhbmdlLnN0b3AoIDEsIDEgKVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3MiIF0oIHsgbGVmdDogdmFsUGVyY2VudCArICIlIiB9LCBvLmFuaW1hdGUgKTsKCQkJCQkJfQoJCQkJCQlpZiAoIGkgPT09IDEgKSB7CgkJCQkJCQl0aGF0LnJhbmdlWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggeyB3aWR0aDogKCB2YWxQZXJjZW50IC0gbGFzdFZhbFBlcmNlbnQgKSArICIlIiB9LCB7IHF1ZXVlOiBmYWxzZSwgZHVyYXRpb246IG8uYW5pbWF0ZSB9ICk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoIGkgPT09IDAgKSB7CgkJCQkJCQl0aGF0LnJhbmdlLnN0b3AoIDEsIDEgKVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3MiIF0oIHsgYm90dG9tOiAoIHZhbFBlcmNlbnQgKSArICIlIiB9LCBvLmFuaW1hdGUgKTsKCQkJCQkJfQoJCQkJCQlpZiAoIGkgPT09IDEgKSB7CgkJCQkJCQl0aGF0LnJhbmdlWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggeyBoZWlnaHQ6ICggdmFsUGVyY2VudCAtIGxhc3RWYWxQZXJjZW50ICkgKyAiJSIgfSwgeyBxdWV1ZTogZmFsc2UsIGR1cmF0aW9uOiBvLmFuaW1hdGUgfSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJbGFzdFZhbFBlcmNlbnQgPSB2YWxQZXJjZW50OwoJCQl9KTsKCQl9IGVsc2UgewoJCQl2YWx1ZSA9IHRoaXMudmFsdWUoKTsKCQkJdmFsdWVNaW4gPSB0aGlzLl92YWx1ZU1pbigpOwoJCQl2YWx1ZU1heCA9IHRoaXMuX3ZhbHVlTWF4KCk7CgkJCXZhbFBlcmNlbnQgPSAoIHZhbHVlTWF4ICE9PSB2YWx1ZU1pbiApID8KCQkJCQkoIHZhbHVlIC0gdmFsdWVNaW4gKSAvICggdmFsdWVNYXggLSB2YWx1ZU1pbiApICogMTAwIDoKCQkJCQkwOwoJCQlfc2V0WyB0aGlzLm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgPyAibGVmdCIgOiAiYm90dG9tIiBdID0gdmFsUGVyY2VudCArICIlIjsKCQkJdGhpcy5oYW5kbGUuc3RvcCggMSwgMSApWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggX3NldCwgby5hbmltYXRlICk7CgoJCQlpZiAoIG9SYW5nZSA9PT0gIm1pbiIgJiYgdGhpcy5vcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiICkgewoJCQkJdGhpcy5yYW5nZS5zdG9wKCAxLCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IHdpZHRoOiB2YWxQZXJjZW50ICsgIiUiIH0sIG8uYW5pbWF0ZSApOwoJCQl9CgkJCWlmICggb1JhbmdlID09PSAibWF4IiAmJiB0aGlzLm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgKSB7CgkJCQl0aGlzLnJhbmdlWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggeyB3aWR0aDogKCAxMDAgLSB2YWxQZXJjZW50ICkgKyAiJSIgfSwgeyBxdWV1ZTogZmFsc2UsIGR1cmF0aW9uOiBvLmFuaW1hdGUgfSApOwoJCQl9CgkJCWlmICggb1JhbmdlID09PSAibWluIiAmJiB0aGlzLm9yaWVudGF0aW9uID09PSAidmVydGljYWwiICkgewoJCQkJdGhpcy5yYW5nZS5zdG9wKCAxLCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IGhlaWdodDogdmFsUGVyY2VudCArICIlIiB9LCBvLmFuaW1hdGUgKTsKCQkJfQoJCQlpZiAoIG9SYW5nZSA9PT0gIm1heCIgJiYgdGhpcy5vcmllbnRhdGlvbiA9PT0gInZlcnRpY2FsIiApIHsKCQkJCXRoaXMucmFuZ2VbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IGhlaWdodDogKCAxMDAgLSB2YWxQZXJjZW50ICkgKyAiJSIgfSwgeyBxdWV1ZTogZmFsc2UsIGR1cmF0aW9uOiBvLmFuaW1hdGUgfSApOwoJCQl9CgkJfQoJfSwKCglfaGFuZGxlRXZlbnRzOiB7CgkJa2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkvKmpzaGludCBtYXhjb21wbGV4aXR5OjI1Ki8KCQkJdmFyIGFsbG93ZWQsIGN1clZhbCwgbmV3VmFsLCBzdGVwLAoJCQkJaW5kZXggPSAkKCBldmVudC50YXJnZXQgKS5kYXRhKCAidWktc2xpZGVyLWhhbmRsZS1pbmRleCIgKTsKCgkJCXN3aXRjaCAoIGV2ZW50LmtleUNvZGUgKSB7CgkJCQljYXNlICQudWkua2V5Q29kZS5IT01FOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUuRU5EOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUuUEFHRV9VUDoKCQkJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfRE9XTjoKCQkJCWNhc2UgJC51aS5rZXlDb2RlLlVQOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUuUklHSFQ6CgkJCQljYXNlICQudWkua2V5Q29kZS5ET1dOOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUuTEVGVDoKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCWlmICggIXRoaXMuX2tleVNsaWRpbmcgKSB7CgkJCQkJCXRoaXMuX2tleVNsaWRpbmcgPSB0cnVlOwoJCQkJCQkkKCBldmVudC50YXJnZXQgKS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCQkJYWxsb3dlZCA9IHRoaXMuX3N0YXJ0KCBldmVudCwgaW5kZXggKTsKCQkJCQkJaWYgKCBhbGxvd2VkID09PSBmYWxzZSApIHsKCQkJCQkJCXJldHVybjsKCQkJCQkJfQoJCQkJCX0KCQkJCQlicmVhazsKCQkJfQoKCQkJc3RlcCA9IHRoaXMub3B0aW9ucy5zdGVwOwoJCQlpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCQljdXJWYWwgPSBuZXdWYWwgPSB0aGlzLnZhbHVlcyggaW5kZXggKTsKCQkJfSBlbHNlIHsKCQkJCWN1clZhbCA9IG5ld1ZhbCA9IHRoaXMudmFsdWUoKTsKCQkJfQoKCQkJc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkhPTUU6CgkJCQkJbmV3VmFsID0gdGhpcy5fdmFsdWVNaW4oKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkVORDoKCQkJCQluZXdWYWwgPSB0aGlzLl92YWx1ZU1heCgpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUuUEFHRV9VUDoKCQkJCQluZXdWYWwgPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggY3VyVmFsICsgKCAodGhpcy5fdmFsdWVNYXgoKSAtIHRoaXMuX3ZhbHVlTWluKCkpIC8gbnVtUGFnZXMgKSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUuUEFHRV9ET1dOOgoJCQkJCW5ld1ZhbCA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKCBjdXJWYWwgLSAoICh0aGlzLl92YWx1ZU1heCgpIC0gdGhpcy5fdmFsdWVNaW4oKSkgLyBudW1QYWdlcyApICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICQudWkua2V5Q29kZS5VUDoKCQkJCWNhc2UgJC51aS5rZXlDb2RlLlJJR0hUOgoJCQkJCWlmICggY3VyVmFsID09PSB0aGlzLl92YWx1ZU1heCgpICkgewoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCW5ld1ZhbCA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKCBjdXJWYWwgKyBzdGVwICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICQudWkua2V5Q29kZS5ET1dOOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUuTEVGVDoKCQkJCQlpZiAoIGN1clZhbCA9PT0gdGhpcy5fdmFsdWVNaW4oKSApIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQluZXdWYWwgPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggY3VyVmFsIC0gc3RlcCApOwoJCQkJCWJyZWFrOwoJCQl9CgoJCQl0aGlzLl9zbGlkZSggZXZlbnQsIGluZGV4LCBuZXdWYWwgKTsKCQl9LAoJCWNsaWNrOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJfSwKCQlrZXl1cDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgaW5kZXggPSAkKCBldmVudC50YXJnZXQgKS5kYXRhKCAidWktc2xpZGVyLWhhbmRsZS1pbmRleCIgKTsKCgkJCWlmICggdGhpcy5fa2V5U2xpZGluZyApIHsKCQkJCXRoaXMuX2tleVNsaWRpbmcgPSBmYWxzZTsKCQkJCXRoaXMuX3N0b3AoIGV2ZW50LCBpbmRleCApOwoJCQkJdGhpcy5fY2hhbmdlKCBldmVudCwgaW5kZXggKTsKCQkJCSQoIGV2ZW50LnRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQl9CgkJfQoJfQoKfSk7Cgp9KGpRdWVyeSkpOwoKKGZ1bmN0aW9uKCAkICkgewoKZnVuY3Rpb24gbW9kaWZpZXIoIGZuICkgewoJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCXZhciBwcmV2aW91cyA9IHRoaXMuZWxlbWVudC52YWwoKTsKCQlmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJdGhpcy5fcmVmcmVzaCgpOwoJCWlmICggcHJldmlvdXMgIT09IHRoaXMuZWxlbWVudC52YWwoKSApIHsKCQkJdGhpcy5fdHJpZ2dlciggImNoYW5nZSIgKTsKCQl9Cgl9Owp9CgokLndpZGdldCggInVpLnNwaW5uZXIiLCB7Cgl2ZXJzaW9uOiAiMS4xMC4zIiwKCWRlZmF1bHRFbGVtZW50OiAiPGlucHV0PiIsCgl3aWRnZXRFdmVudFByZWZpeDogInNwaW4iLAoJb3B0aW9uczogewoJCWN1bHR1cmU6IG51bGwsCgkJaWNvbnM6IHsKCQkJZG93bjogInVpLWljb24tdHJpYW5nbGUtMS1zIiwKCQkJdXA6ICJ1aS1pY29uLXRyaWFuZ2xlLTEtbiIKCQl9LAoJCWluY3JlbWVudGFsOiB0cnVlLAoJCW1heDogbnVsbCwKCQltaW46IG51bGwsCgkJbnVtYmVyRm9ybWF0OiBudWxsLAoJCXBhZ2U6IDEwLAoJCXN0ZXA6IDEsCgoJCWNoYW5nZTogbnVsbCwKCQlzcGluOiBudWxsLAoJCXN0YXJ0OiBudWxsLAoJCXN0b3A6IG51bGwKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJLy8gaGFuZGxlIHN0cmluZyB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHBhcnNlZAoJCXRoaXMuX3NldE9wdGlvbiggIm1heCIsIHRoaXMub3B0aW9ucy5tYXggKTsKCQl0aGlzLl9zZXRPcHRpb24oICJtaW4iLCB0aGlzLm9wdGlvbnMubWluICk7CgkJdGhpcy5fc2V0T3B0aW9uKCAic3RlcCIsIHRoaXMub3B0aW9ucy5zdGVwICk7CgoJCS8vIGZvcm1hdCB0aGUgdmFsdWUsIGJ1dCBkb24ndCBjb25zdHJhaW4KCQl0aGlzLl92YWx1ZSggdGhpcy5lbGVtZW50LnZhbCgpLCB0cnVlICk7CgoJCXRoaXMuX2RyYXcoKTsKCQl0aGlzLl9vbiggdGhpcy5fZXZlbnRzICk7CgkJdGhpcy5fcmVmcmVzaCgpOwoKCQkvLyB0dXJuaW5nIG9mZiBhdXRvY29tcGxldGUgcHJldmVudHMgdGhlIGJyb3dzZXIgZnJvbSByZW1lbWJlcmluZyB0aGUKCQkvLyB2YWx1ZSB3aGVuIG5hdmlnYXRpbmcgdGhyb3VnaCBoaXN0b3J5LCBzbyB3ZSByZS1lbmFibGUgYXV0b2NvbXBsZXRlCgkJLy8gaWYgdGhlIHBhZ2UgaXMgdW5sb2FkZWQgYmVmb3JlIHRoZSB3aWRnZXQgaXMgZGVzdHJveWVkLiAjNzc5MAoJCXRoaXMuX29uKCB0aGlzLndpbmRvdywgewoJCQliZWZvcmV1bmxvYWQ6IGZ1bmN0aW9uKCkgewoJCQkJdGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoICJhdXRvY29tcGxldGUiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2dldENyZWF0ZU9wdGlvbnM6IGZ1bmN0aW9uKCkgewoJCXZhciBvcHRpb25zID0ge30sCgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgoJCSQuZWFjaCggWyAibWluIiwgIm1heCIsICJzdGVwIiBdLCBmdW5jdGlvbiggaSwgb3B0aW9uICkgewoJCQl2YXIgdmFsdWUgPSBlbGVtZW50LmF0dHIoIG9wdGlvbiApOwoJCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubGVuZ3RoICkgewoJCQkJb3B0aW9uc1sgb3B0aW9uIF0gPSB2YWx1ZTsKCQkJfQoJCX0pOwoKCQlyZXR1cm4gb3B0aW9uczsKCX0sCgoJX2V2ZW50czogewoJCWtleWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJaWYgKCB0aGlzLl9zdGFydCggZXZlbnQgKSAmJiB0aGlzLl9rZXlkb3duKCBldmVudCApICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoJCX0sCgkJa2V5dXA6ICJfc3RvcCIsCgkJZm9jdXM6IGZ1bmN0aW9uKCkgewoJCQl0aGlzLnByZXZpb3VzID0gdGhpcy5lbGVtZW50LnZhbCgpOwoJCX0sCgkJYmx1cjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQlpZiAoIHRoaXMuY2FuY2VsQmx1ciApIHsKCQkJCWRlbGV0ZSB0aGlzLmNhbmNlbEJsdXI7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXRoaXMuX3N0b3AoKTsKCQkJdGhpcy5fcmVmcmVzaCgpOwoJCQlpZiAoIHRoaXMucHJldmlvdXMgIT09IHRoaXMuZWxlbWVudC52YWwoKSApIHsKCQkJCXRoaXMuX3RyaWdnZXIoICJjaGFuZ2UiLCBldmVudCApOwoJCQl9CgkJfSwKCQltb3VzZXdoZWVsOiBmdW5jdGlvbiggZXZlbnQsIGRlbHRhICkgewoJCQlpZiAoICFkZWx0YSApIHsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAoICF0aGlzLnNwaW5uaW5nICYmICF0aGlzLl9zdGFydCggZXZlbnQgKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJdGhpcy5fc3BpbiggKGRlbHRhID4gMCA/IDEgOiAtMSkgKiB0aGlzLm9wdGlvbnMuc3RlcCwgZXZlbnQgKTsKCQkJY2xlYXJUaW1lb3V0KCB0aGlzLm1vdXNld2hlZWxUaW1lciApOwoJCQl0aGlzLm1vdXNld2hlZWxUaW1lciA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJaWYgKCB0aGlzLnNwaW5uaW5nICkgewoJCQkJCXRoaXMuX3N0b3AoIGV2ZW50ICk7CgkJCQl9CgkJCX0sIDEwMCApOwoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCX0sCgkJIm1vdXNlZG93biAudWktc3Bpbm5lci1idXR0b24iOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCXZhciBwcmV2aW91czsKCgkJCS8vIFdlIG5ldmVyIHdhbnQgdGhlIGJ1dHRvbnMgdG8gaGF2ZSBmb2N1czsgd2hlbmV2ZXIgdGhlIHVzZXIgaXMKCQkJLy8gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc3Bpbm5lciwgdGhlIGZvY3VzIHNob3VsZCBiZSBvbiB0aGUgaW5wdXQuCgkJCS8vIElmIHRoZSBpbnB1dCBpcyBmb2N1c2VkIHRoZW4gdGhpcy5wcmV2aW91cyBpcyBwcm9wZXJseSBzZXQgZnJvbQoJCQkvLyB3aGVuIHRoZSBpbnB1dCBmaXJzdCByZWNlaXZlZCBmb2N1cy4gSWYgdGhlIGlucHV0IGlzIG5vdCBmb2N1c2VkCgkJCS8vIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhpcy5wcmV2aW91cyBiYXNlZCBvbiB0aGUgdmFsdWUgYmVmb3JlIHNwaW5uaW5nLgoJCQlwcmV2aW91cyA9IHRoaXMuZWxlbWVudFswXSA9PT0gdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50ID8KCQkJCXRoaXMucHJldmlvdXMgOiB0aGlzLmVsZW1lbnQudmFsKCk7CgkJCWZ1bmN0aW9uIGNoZWNrRm9jdXMoKSB7CgkJCQl2YXIgaXNBY3RpdmUgPSB0aGlzLmVsZW1lbnRbMF0gPT09IHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudDsKCQkJCWlmICggIWlzQWN0aXZlICkgewoJCQkJCXRoaXMuZWxlbWVudC5mb2N1cygpOwoJCQkJCXRoaXMucHJldmlvdXMgPSBwcmV2aW91czsKCQkJCQkvLyBzdXBwb3J0OiBJRQoJCQkJCS8vIElFIHNldHMgZm9jdXMgYXN5bmNocm9ub3VzbHksIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgZm9jdXMKCQkJCQkvLyBtb3ZlZCBvZmYgb2YgdGhlIGlucHV0IGJlY2F1c2UgdGhlIHVzZXIgY2xpY2tlZCBvbiB0aGUgYnV0dG9uLgoJCQkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJCQl0aGlzLnByZXZpb3VzID0gcHJldmlvdXM7CgkJCQkJfSk7CgkJCQl9CgkJCX0KCgkJCS8vIGVuc3VyZSBmb2N1cyBpcyBvbiAob3Igc3RheXMgb24pIHRoZSB0ZXh0IGZpZWxkCgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCWNoZWNrRm9jdXMuY2FsbCggdGhpcyApOwoKCQkJLy8gc3VwcG9ydDogSUUKCQkJLy8gSUUgZG9lc24ndCBwcmV2ZW50IG1vdmluZyBmb2N1cyBldmVuIHdpdGggZXZlbnQucHJldmVudERlZmF1bHQoKQoJCQkvLyBzbyB3ZSBzZXQgYSBmbGFnIHRvIGtub3cgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBibHVyIGV2ZW50CgkJCS8vIGFuZCBjaGVjayAoYWdhaW4pIGlmIGZvY3VzIG1vdmVkIG9mZiBvZiB0aGUgaW5wdXQuCgkJCXRoaXMuY2FuY2VsQmx1ciA9IHRydWU7CgkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJZGVsZXRlIHRoaXMuY2FuY2VsQmx1cjsKCQkJCWNoZWNrRm9jdXMuY2FsbCggdGhpcyApOwoJCQl9KTsKCgkJCWlmICggdGhpcy5fc3RhcnQoIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQl0aGlzLl9yZXBlYXQoIG51bGwsICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5oYXNDbGFzcyggInVpLXNwaW5uZXItdXAiICkgPyAxIDogLTEsIGV2ZW50ICk7CgkJfSwKCQkibW91c2V1cCAudWktc3Bpbm5lci1idXR0b24iOiAiX3N0b3AiLAoJCSJtb3VzZWVudGVyIC51aS1zcGlubmVyLWJ1dHRvbiI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJLy8gYnV0dG9uIHdpbGwgYWRkIHVpLXN0YXRlLWFjdGl2ZSBpZiBtb3VzZSB3YXMgZG93biB3aGlsZSBtb3VzZWxlYXZlIGFuZCBrZXB0IGRvd24KCQkJaWYgKCAhJCggZXZlbnQuY3VycmVudFRhcmdldCApLmhhc0NsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIHRoaXMuX3N0YXJ0KCBldmVudCApID09PSBmYWxzZSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl0aGlzLl9yZXBlYXQoIG51bGwsICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5oYXNDbGFzcyggInVpLXNwaW5uZXItdXAiICkgPyAxIDogLTEsIGV2ZW50ICk7CgkJfSwKCQkvLyBUT0RPOiBkbyB3ZSByZWFsbHkgd2FudCB0byBjb25zaWRlciB0aGlzIGEgc3RvcD8KCQkvLyBzaG91bGRuJ3Qgd2UganVzdCBzdG9wIHRoZSByZXBlYXRlciBhbmQgd2FpdCB1bnRpbCBtb3VzZXVwIGJlZm9yZQoJCS8vIHdlIHRyaWdnZXIgdGhlIHN0b3AgZXZlbnQ/CgkJIm1vdXNlbGVhdmUgLnVpLXNwaW5uZXItYnV0dG9uIjogIl9zdG9wIgoJfSwKCglfZHJhdzogZnVuY3Rpb24oKSB7CgkJdmFyIHVpU3Bpbm5lciA9IHRoaXMudWlTcGlubmVyID0gdGhpcy5lbGVtZW50CgkJCS5hZGRDbGFzcyggInVpLXNwaW5uZXItaW5wdXQiICkKCQkJLmF0dHIoICJhdXRvY29tcGxldGUiLCAib2ZmIiApCgkJCS53cmFwKCB0aGlzLl91aVNwaW5uZXJIdG1sKCkgKQoJCQkucGFyZW50KCkKCQkJCS8vIGFkZCBidXR0b25zCgkJCQkuYXBwZW5kKCB0aGlzLl9idXR0b25IdG1sKCkgKTsKCgkJdGhpcy5lbGVtZW50LmF0dHIoICJyb2xlIiwgInNwaW5idXR0b24iICk7CgoJCS8vIGJ1dHRvbiBiaW5kaW5ncwoJCXRoaXMuYnV0dG9ucyA9IHVpU3Bpbm5lci5maW5kKCAiLnVpLXNwaW5uZXItYnV0dG9uIiApCgkJCS5hdHRyKCAidGFiSW5kZXgiLCAtMSApCgkJCS5idXR0b24oKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApOwoKCQkvLyBJRSA2IGRvZXNuJ3QgdW5kZXJzdGFuZCBoZWlnaHQ6IDUwJSBmb3IgdGhlIGJ1dHRvbnMKCQkvLyB1bmxlc3MgdGhlIHdyYXBwZXIgaGFzIGFuIGV4cGxpY2l0IGhlaWdodAoJCWlmICggdGhpcy5idXR0b25zLmhlaWdodCgpID4gTWF0aC5jZWlsKCB1aVNwaW5uZXIuaGVpZ2h0KCkgKiAwLjUgKSAmJgoJCQkJdWlTcGlubmVyLmhlaWdodCgpID4gMCApIHsKCQkJdWlTcGlubmVyLmhlaWdodCggdWlTcGlubmVyLmhlaWdodCgpICk7CgkJfQoKCQkvLyBkaXNhYmxlIHNwaW5uZXIgaWYgZWxlbWVudCB3YXMgYWxyZWFkeSBkaXNhYmxlZAoJCWlmICggdGhpcy5vcHRpb25zLmRpc2FibGVkICkgewoJCQl0aGlzLmRpc2FibGUoKTsKCQl9Cgl9LAoKCV9rZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCWtleUNvZGUgPSAkLnVpLmtleUNvZGU7CgoJCXN3aXRjaCAoIGV2ZW50LmtleUNvZGUgKSB7CgkJY2FzZSBrZXlDb2RlLlVQOgoJCQl0aGlzLl9yZXBlYXQoIG51bGwsIDEsIGV2ZW50ICk7CgkJCXJldHVybiB0cnVlOwoJCWNhc2Uga2V5Q29kZS5ET1dOOgoJCQl0aGlzLl9yZXBlYXQoIG51bGwsIC0xLCBldmVudCApOwoJCQlyZXR1cm4gdHJ1ZTsKCQljYXNlIGtleUNvZGUuUEFHRV9VUDoKCQkJdGhpcy5fcmVwZWF0KCBudWxsLCBvcHRpb25zLnBhZ2UsIGV2ZW50ICk7CgkJCXJldHVybiB0cnVlOwoJCWNhc2Uga2V5Q29kZS5QQUdFX0RPV046CgkJCXRoaXMuX3JlcGVhdCggbnVsbCwgLW9wdGlvbnMucGFnZSwgZXZlbnQgKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV91aVNwaW5uZXJIdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSd1aS1zcGlubmVyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsJz48L3NwYW4+IjsKCX0sCgoJX2J1dHRvbkh0bWw6IGZ1bmN0aW9uKCkgewoJCXJldHVybiAiIiArCgkJCSI8YSBjbGFzcz0ndWktc3Bpbm5lci1idXR0b24gdWktc3Bpbm5lci11cCB1aS1jb3JuZXItdHInPiIgKwoJCQkJIjxzcGFuIGNsYXNzPSd1aS1pY29uICIgKyB0aGlzLm9wdGlvbnMuaWNvbnMudXAgKyAiJz4mIzk2NTA7PC9zcGFuPiIgKwoJCQkiPC9hPiIgKwoJCQkiPGEgY2xhc3M9J3VpLXNwaW5uZXItYnV0dG9uIHVpLXNwaW5uZXItZG93biB1aS1jb3JuZXItYnInPiIgKwoJCQkJIjxzcGFuIGNsYXNzPSd1aS1pY29uICIgKyB0aGlzLm9wdGlvbnMuaWNvbnMuZG93biArICInPiYjOTY2MDs8L3NwYW4+IiArCgkJCSI8L2E+IjsKCX0sCgoJX3N0YXJ0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCAhdGhpcy5zcGlubmluZyAmJiB0aGlzLl90cmlnZ2VyKCAic3RhcnQiLCBldmVudCApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCAhdGhpcy5jb3VudGVyICkgewoJCQl0aGlzLmNvdW50ZXIgPSAxOwoJCX0KCQl0aGlzLnNwaW5uaW5nID0gdHJ1ZTsKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJX3JlcGVhdDogZnVuY3Rpb24oIGksIHN0ZXBzLCBldmVudCApIHsKCQlpID0gaSB8fCA1MDA7CgoJCWNsZWFyVGltZW91dCggdGhpcy50aW1lciApOwoJCXRoaXMudGltZXIgPSB0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJdGhpcy5fcmVwZWF0KCA0MCwgc3RlcHMsIGV2ZW50ICk7CgkJfSwgaSApOwoKCQl0aGlzLl9zcGluKCBzdGVwcyAqIHRoaXMub3B0aW9ucy5zdGVwLCBldmVudCApOwoJfSwKCglfc3BpbjogZnVuY3Rpb24oIHN0ZXAsIGV2ZW50ICkgewoJCXZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKSB8fCAwOwoKCQlpZiAoICF0aGlzLmNvdW50ZXIgKSB7CgkJCXRoaXMuY291bnRlciA9IDE7CgkJfQoKCQl2YWx1ZSA9IHRoaXMuX2FkanVzdFZhbHVlKCB2YWx1ZSArIHN0ZXAgKiB0aGlzLl9pbmNyZW1lbnQoIHRoaXMuY291bnRlciApICk7CgoJCWlmICggIXRoaXMuc3Bpbm5pbmcgfHwgdGhpcy5fdHJpZ2dlciggInNwaW4iLCBldmVudCwgeyB2YWx1ZTogdmFsdWUgfSApICE9PSBmYWxzZSkgewoJCQl0aGlzLl92YWx1ZSggdmFsdWUgKTsKCQkJdGhpcy5jb3VudGVyKys7CgkJfQoJfSwKCglfaW5jcmVtZW50OiBmdW5jdGlvbiggaSApIHsKCQl2YXIgaW5jcmVtZW50YWwgPSB0aGlzLm9wdGlvbnMuaW5jcmVtZW50YWw7CgoJCWlmICggaW5jcmVtZW50YWwgKSB7CgkJCXJldHVybiAkLmlzRnVuY3Rpb24oIGluY3JlbWVudGFsICkgPwoJCQkJaW5jcmVtZW50YWwoIGkgKSA6CgkJCQlNYXRoLmZsb29yKCBpKmkqaS81MDAwMCAtIGkqaS81MDAgKyAxNyppLzIwMCArIDEgKTsKCQl9CgoJCXJldHVybiAxOwoJfSwKCglfcHJlY2lzaW9uOiBmdW5jdGlvbigpIHsKCQl2YXIgcHJlY2lzaW9uID0gdGhpcy5fcHJlY2lzaW9uT2YoIHRoaXMub3B0aW9ucy5zdGVwICk7CgkJaWYgKCB0aGlzLm9wdGlvbnMubWluICE9PSBudWxsICkgewoJCQlwcmVjaXNpb24gPSBNYXRoLm1heCggcHJlY2lzaW9uLCB0aGlzLl9wcmVjaXNpb25PZiggdGhpcy5vcHRpb25zLm1pbiApICk7CgkJfQoJCXJldHVybiBwcmVjaXNpb247Cgl9LAoKCV9wcmVjaXNpb25PZjogZnVuY3Rpb24oIG51bSApIHsKCQl2YXIgc3RyID0gbnVtLnRvU3RyaW5nKCksCgkJCWRlY2ltYWwgPSBzdHIuaW5kZXhPZiggIi4iICk7CgkJcmV0dXJuIGRlY2ltYWwgPT09IC0xID8gMCA6IHN0ci5sZW5ndGggLSBkZWNpbWFsIC0gMTsKCX0sCgoJX2FkanVzdFZhbHVlOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGJhc2UsIGFib3ZlTWluLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQkvLyBtYWtlIHN1cmUgd2UncmUgYXQgYSB2YWxpZCBzdGVwCgkJLy8gLSBmaW5kIG91dCB3aGVyZSB3ZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgKG1pbiBvciAwKQoJCWJhc2UgPSBvcHRpb25zLm1pbiAhPT0gbnVsbCA/IG9wdGlvbnMubWluIDogMDsKCQlhYm92ZU1pbiA9IHZhbHVlIC0gYmFzZTsKCQkvLyAtIHJvdW5kIHRvIHRoZSBuZWFyZXN0IHN0ZXAKCQlhYm92ZU1pbiA9IE1hdGgucm91bmQoYWJvdmVNaW4gLyBvcHRpb25zLnN0ZXApICogb3B0aW9ucy5zdGVwOwoJCS8vIC0gcm91bmRpbmcgaXMgYmFzZWQgb24gMCwgc28gYWRqdXN0IGJhY2sgdG8gb3VyIGJhc2UKCQl2YWx1ZSA9IGJhc2UgKyBhYm92ZU1pbjsKCgkJLy8gZml4IHByZWNpc2lvbiBmcm9tIGJhZCBKUyBmbG9hdGluZyBwb2ludCBtYXRoCgkJdmFsdWUgPSBwYXJzZUZsb2F0KCB2YWx1ZS50b0ZpeGVkKCB0aGlzLl9wcmVjaXNpb24oKSApICk7CgoJCS8vIGNsYW1wIHRoZSB2YWx1ZQoJCWlmICggb3B0aW9ucy5tYXggIT09IG51bGwgJiYgdmFsdWUgPiBvcHRpb25zLm1heCkgewoJCQlyZXR1cm4gb3B0aW9ucy5tYXg7CgkJfQoJCWlmICggb3B0aW9ucy5taW4gIT09IG51bGwgJiYgdmFsdWUgPCBvcHRpb25zLm1pbiApIHsKCQkJcmV0dXJuIG9wdGlvbnMubWluOwoJCX0KCgkJcmV0dXJuIHZhbHVlOwoJfSwKCglfc3RvcDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggIXRoaXMuc3Bpbm5pbmcgKSB7CgkJCXJldHVybjsKCQl9CgoJCWNsZWFyVGltZW91dCggdGhpcy50aW1lciApOwoJCWNsZWFyVGltZW91dCggdGhpcy5tb3VzZXdoZWVsVGltZXIgKTsKCQl0aGlzLmNvdW50ZXIgPSAwOwoJCXRoaXMuc3Bpbm5pbmcgPSBmYWxzZTsKCQl0aGlzLl90cmlnZ2VyKCAic3RvcCIsIGV2ZW50ICk7Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCWlmICgga2V5ID09PSAiY3VsdHVyZSIgfHwga2V5ID09PSAibnVtYmVyRm9ybWF0IiApIHsKCQkJdmFyIHByZXZWYWx1ZSA9IHRoaXMuX3BhcnNlKCB0aGlzLmVsZW1lbnQudmFsKCkgKTsKCQkJdGhpcy5vcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl0aGlzLmVsZW1lbnQudmFsKCB0aGlzLl9mb3JtYXQoIHByZXZWYWx1ZSApICk7CgkJCXJldHVybjsKCQl9CgoJCWlmICgga2V5ID09PSAibWF4IiB8fCBrZXkgPT09ICJtaW4iIHx8IGtleSA9PT0gInN0ZXAiICkgewoJCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJCQl2YWx1ZSA9IHRoaXMuX3BhcnNlKCB2YWx1ZSApOwoJCQl9CgkJfQoJCWlmICgga2V5ID09PSAiaWNvbnMiICkgewoJCQl0aGlzLmJ1dHRvbnMuZmlyc3QoKS5maW5kKCAiLnVpLWljb24iICkKCQkJCS5yZW1vdmVDbGFzcyggdGhpcy5vcHRpb25zLmljb25zLnVwICkKCQkJCS5hZGRDbGFzcyggdmFsdWUudXAgKTsKCQkJdGhpcy5idXR0b25zLmxhc3QoKS5maW5kKCAiLnVpLWljb24iICkKCQkJCS5yZW1vdmVDbGFzcyggdGhpcy5vcHRpb25zLmljb25zLmRvd24gKQoJCQkJLmFkZENsYXNzKCB2YWx1ZS5kb3duICk7CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJaWYgKCB2YWx1ZSApIHsKCQkJCXRoaXMuZWxlbWVudC5wcm9wKCAiZGlzYWJsZWQiLCB0cnVlICk7CgkJCQl0aGlzLmJ1dHRvbnMuYnV0dG9uKCAiZGlzYWJsZSIgKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuZWxlbWVudC5wcm9wKCAiZGlzYWJsZWQiLCBmYWxzZSApOwoJCQkJdGhpcy5idXR0b25zLmJ1dHRvbiggImVuYWJsZSIgKTsKCQkJfQoJCX0KCX0sCgoJX3NldE9wdGlvbnM6IG1vZGlmaWVyKGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXRoaXMuX3N1cGVyKCBvcHRpb25zICk7CgkJdGhpcy5fdmFsdWUoIHRoaXMuZWxlbWVudC52YWwoKSApOwoJfSksCgoJX3BhcnNlOiBmdW5jdGlvbiggdmFsICkgewoJCWlmICggdHlwZW9mIHZhbCA9PT0gInN0cmluZyIgJiYgdmFsICE9PSAiIiApIHsKCQkJdmFsID0gd2luZG93Lkdsb2JhbGl6ZSAmJiB0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0ID8KCQkJCUdsb2JhbGl6ZS5wYXJzZUZsb2F0KCB2YWwsIDEwLCB0aGlzLm9wdGlvbnMuY3VsdHVyZSApIDogK3ZhbDsKCQl9CgkJcmV0dXJuIHZhbCA9PT0gIiIgfHwgaXNOYU4oIHZhbCApID8gbnVsbCA6IHZhbDsKCX0sCgoJX2Zvcm1hdDogZnVuY3Rpb24oIHZhbHVlICkgewoJCWlmICggdmFsdWUgPT09ICIiICkgewoJCQlyZXR1cm4gIiI7CgkJfQoJCXJldHVybiB3aW5kb3cuR2xvYmFsaXplICYmIHRoaXMub3B0aW9ucy5udW1iZXJGb3JtYXQgPwoJCQlHbG9iYWxpemUuZm9ybWF0KCB2YWx1ZSwgdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdCwgdGhpcy5vcHRpb25zLmN1bHR1cmUgKSA6CgkJCXZhbHVlOwoJfSwKCglfcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LmF0dHIoewoJCQkiYXJpYS12YWx1ZW1pbiI6IHRoaXMub3B0aW9ucy5taW4sCgkJCSJhcmlhLXZhbHVlbWF4IjogdGhpcy5vcHRpb25zLm1heCwKCQkJLy8gVE9ETzogd2hhdCBzaG91bGQgd2UgZG8gd2l0aCB2YWx1ZXMgdGhhdCBjYW4ndCBiZSBwYXJzZWQ/CgkJCSJhcmlhLXZhbHVlbm93IjogdGhpcy5fcGFyc2UoIHRoaXMuZWxlbWVudC52YWwoKSApCgkJfSk7Cgl9LAoKCS8vIHVwZGF0ZSB0aGUgdmFsdWUgd2l0aG91dCB0cmlnZ2VyaW5nIGNoYW5nZQoJX3ZhbHVlOiBmdW5jdGlvbiggdmFsdWUsIGFsbG93QW55ICkgewoJCXZhciBwYXJzZWQ7CgkJaWYgKCB2YWx1ZSAhPT0gIiIgKSB7CgkJCXBhcnNlZCA9IHRoaXMuX3BhcnNlKCB2YWx1ZSApOwoJCQlpZiAoIHBhcnNlZCAhPT0gbnVsbCApIHsKCQkJCWlmICggIWFsbG93QW55ICkgewoJCQkJCXBhcnNlZCA9IHRoaXMuX2FkanVzdFZhbHVlKCBwYXJzZWQgKTsKCQkJCX0KCQkJCXZhbHVlID0gdGhpcy5fZm9ybWF0KCBwYXJzZWQgKTsKCQkJfQoJCX0KCQl0aGlzLmVsZW1lbnQudmFsKCB2YWx1ZSApOwoJCXRoaXMuX3JlZnJlc2goKTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1zcGlubmVyLWlucHV0IiApCgkJCS5wcm9wKCAiZGlzYWJsZWQiLCBmYWxzZSApCgkJCS5yZW1vdmVBdHRyKCAiYXV0b2NvbXBsZXRlIiApCgkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtdmFsdWVtaW4iICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLXZhbHVlbWF4IiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS12YWx1ZW5vdyIgKTsKCQl0aGlzLnVpU3Bpbm5lci5yZXBsYWNlV2l0aCggdGhpcy5lbGVtZW50ICk7Cgl9LAoKCXN0ZXBVcDogbW9kaWZpZXIoZnVuY3Rpb24oIHN0ZXBzICkgewoJCXRoaXMuX3N0ZXBVcCggc3RlcHMgKTsKCX0pLAoJX3N0ZXBVcDogZnVuY3Rpb24oIHN0ZXBzICkgewoJCWlmICggdGhpcy5fc3RhcnQoKSApIHsKCQkJdGhpcy5fc3BpbiggKHN0ZXBzIHx8IDEpICogdGhpcy5vcHRpb25zLnN0ZXAgKTsKCQkJdGhpcy5fc3RvcCgpOwoJCX0KCX0sCgoJc3RlcERvd246IG1vZGlmaWVyKGZ1bmN0aW9uKCBzdGVwcyApIHsKCQl0aGlzLl9zdGVwRG93biggc3RlcHMgKTsKCX0pLAoJX3N0ZXBEb3duOiBmdW5jdGlvbiggc3RlcHMgKSB7CgkJaWYgKCB0aGlzLl9zdGFydCgpICkgewoJCQl0aGlzLl9zcGluKCAoc3RlcHMgfHwgMSkgKiAtdGhpcy5vcHRpb25zLnN0ZXAgKTsKCQkJdGhpcy5fc3RvcCgpOwoJCX0KCX0sCgoJcGFnZVVwOiBtb2RpZmllcihmdW5jdGlvbiggcGFnZXMgKSB7CgkJdGhpcy5fc3RlcFVwKCAocGFnZXMgfHwgMSkgKiB0aGlzLm9wdGlvbnMucGFnZSApOwoJfSksCgoJcGFnZURvd246IG1vZGlmaWVyKGZ1bmN0aW9uKCBwYWdlcyApIHsKCQl0aGlzLl9zdGVwRG93biggKHBhZ2VzIHx8IDEpICogdGhpcy5vcHRpb25zLnBhZ2UgKTsKCX0pLAoKCXZhbHVlOiBmdW5jdGlvbiggbmV3VmFsICkgewoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXJldHVybiB0aGlzLl9wYXJzZSggdGhpcy5lbGVtZW50LnZhbCgpICk7CgkJfQoJCW1vZGlmaWVyKCB0aGlzLl92YWx1ZSApLmNhbGwoIHRoaXMsIG5ld1ZhbCApOwoJfSwKCgl3aWRnZXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnVpU3Bpbm5lcjsKCX0KfSk7Cgp9KCBqUXVlcnkgKSApOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgdGFiSWQgPSAwLAoJcmhhc2ggPSAvIy4qJC87CgpmdW5jdGlvbiBnZXROZXh0VGFiSWQoKSB7CglyZXR1cm4gKyt0YWJJZDsKfQoKZnVuY3Rpb24gaXNMb2NhbCggYW5jaG9yICkgewoJcmV0dXJuIGFuY2hvci5oYXNoLmxlbmd0aCA+IDEgJiYKCQlkZWNvZGVVUklDb21wb25lbnQoIGFuY2hvci5ocmVmLnJlcGxhY2UoIHJoYXNoLCAiIiApICkgPT09CgkJCWRlY29kZVVSSUNvbXBvbmVudCggbG9jYXRpb24uaHJlZi5yZXBsYWNlKCByaGFzaCwgIiIgKSApOwp9CgokLndpZGdldCggInVpLnRhYnMiLCB7Cgl2ZXJzaW9uOiAiMS4xMC4zIiwKCWRlbGF5OiAzMDAsCglvcHRpb25zOiB7CgkJYWN0aXZlOiBudWxsLAoJCWNvbGxhcHNpYmxlOiBmYWxzZSwKCQlldmVudDogImNsaWNrIiwKCQloZWlnaHRTdHlsZTogImNvbnRlbnQiLAoJCWhpZGU6IG51bGwsCgkJc2hvdzogbnVsbCwKCgkJLy8gY2FsbGJhY2tzCgkJYWN0aXZhdGU6IG51bGwsCgkJYmVmb3JlQWN0aXZhdGU6IG51bGwsCgkJYmVmb3JlTG9hZDogbnVsbCwKCQlsb2FkOiBudWxsCgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCgkJdGhpcy5ydW5uaW5nID0gZmFsc2U7CgoJCXRoaXMuZWxlbWVudAoJCQkuYWRkQ2xhc3MoICJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiApCgkJCS50b2dnbGVDbGFzcyggInVpLXRhYnMtY29sbGFwc2libGUiLCBvcHRpb25zLmNvbGxhcHNpYmxlICkKCQkJLy8gUHJldmVudCB1c2VycyBmcm9tIGZvY3VzaW5nIGRpc2FibGVkIHRhYnMgdmlhIGNsaWNrCgkJCS5kZWxlZ2F0ZSggIi51aS10YWJzLW5hdiA+IGxpIiwgIm1vdXNlZG93biIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoICQoIHRoaXMgKS5pcyggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9KQoJCQkvLyBzdXBwb3J0OiBJRSA8OQoJCQkvLyBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGFjdGlvbiBpbiBtb3VzZWRvd24gZG9lc24ndCBwcmV2ZW50IElFCgkJCS8vIGZyb20gZm9jdXNpbmcgdGhlIGVsZW1lbnQsIHNvIGlmIHRoZSBhbmNob3IgZ2V0cyBmb2N1c2VkLCBibHVyLgoJCQkvLyBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGZvY3VzaW5nIHRoZSBwcmV2aW91c2x5IGZvY3VzZWQKCQkJLy8gZWxlbWVudCBzaW5jZSBjbGlja2luZyBvbiBhIG5vbi1mb2N1c2FibGUgZWxlbWVudCBzaG91bGQgZm9jdXMKCQkJLy8gdGhlIGJvZHkgYW55d2F5LgoJCQkuZGVsZWdhdGUoICIudWktdGFicy1hbmNob3IiLCAiZm9jdXMiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoICQoIHRoaXMgKS5jbG9zZXN0KCAibGkiICkuaXMoICIudWktc3RhdGUtZGlzYWJsZWQiICkgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQl9CgkJCX0pOwoKCQl0aGlzLl9wcm9jZXNzVGFicygpOwoJCW9wdGlvbnMuYWN0aXZlID0gdGhpcy5faW5pdGlhbEFjdGl2ZSgpOwoKCQkvLyBUYWtlIGRpc2FibGluZyB0YWJzIHZpYSBjbGFzcyBhdHRyaWJ1dGUgZnJvbSBIVE1MCgkJLy8gaW50byBhY2NvdW50IGFuZCB1cGRhdGUgb3B0aW9uIHByb3Blcmx5LgoJCWlmICggJC5pc0FycmF5KCBvcHRpb25zLmRpc2FibGVkICkgKSB7CgkJCW9wdGlvbnMuZGlzYWJsZWQgPSAkLnVuaXF1ZSggb3B0aW9ucy5kaXNhYmxlZC5jb25jYXQoCgkJCQkkLm1hcCggdGhpcy50YWJzLmZpbHRlciggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSwgZnVuY3Rpb24oIGxpICkgewoJCQkJCXJldHVybiB0aGF0LnRhYnMuaW5kZXgoIGxpICk7CgkJCQl9KQoJCQkpICkuc29ydCgpOwoJCX0KCgkJLy8gY2hlY2sgZm9yIGxlbmd0aCBhdm9pZHMgZXJyb3Igd2hlbiBpbml0aWFsaXppbmcgZW1wdHkgbGlzdAoJCWlmICggdGhpcy5vcHRpb25zLmFjdGl2ZSAhPT0gZmFsc2UgJiYgdGhpcy5hbmNob3JzLmxlbmd0aCApIHsKCQkJdGhpcy5hY3RpdmUgPSB0aGlzLl9maW5kQWN0aXZlKCBvcHRpb25zLmFjdGl2ZSApOwoJCX0gZWxzZSB7CgkJCXRoaXMuYWN0aXZlID0gJCgpOwoJCX0KCgkJdGhpcy5fcmVmcmVzaCgpOwoKCQlpZiAoIHRoaXMuYWN0aXZlLmxlbmd0aCApIHsKCQkJdGhpcy5sb2FkKCBvcHRpb25zLmFjdGl2ZSApOwoJCX0KCX0sCgoJX2luaXRpYWxBY3RpdmU6IGZ1bmN0aW9uKCkgewoJCXZhciBhY3RpdmUgPSB0aGlzLm9wdGlvbnMuYWN0aXZlLAoJCQljb2xsYXBzaWJsZSA9IHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSwKCQkJbG9jYXRpb25IYXNoID0gbG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoIDEgKTsKCgkJaWYgKCBhY3RpdmUgPT09IG51bGwgKSB7CgkJCS8vIGNoZWNrIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGluIHRoZSBVUkwKCQkJaWYgKCBsb2NhdGlvbkhhc2ggKSB7CgkJCQl0aGlzLnRhYnMuZWFjaChmdW5jdGlvbiggaSwgdGFiICkgewoJCQkJCWlmICggJCggdGFiICkuYXR0ciggImFyaWEtY29udHJvbHMiICkgPT09IGxvY2F0aW9uSGFzaCApIHsKCQkJCQkJYWN0aXZlID0gaTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyBjaGVjayBmb3IgYSB0YWIgbWFya2VkIGFjdGl2ZSB2aWEgYSBjbGFzcwoJCQlpZiAoIGFjdGl2ZSA9PT0gbnVsbCApIHsKCQkJCWFjdGl2ZSA9IHRoaXMudGFicy5pbmRleCggdGhpcy50YWJzLmZpbHRlciggIi51aS10YWJzLWFjdGl2ZSIgKSApOwoJCQl9CgoJCQkvLyBubyBhY3RpdmUgdGFiLCBzZXQgdG8gZmFsc2UKCQkJaWYgKCBhY3RpdmUgPT09IG51bGwgfHwgYWN0aXZlID09PSAtMSApIHsKCQkJCWFjdGl2ZSA9IHRoaXMudGFicy5sZW5ndGggPyAwIDogZmFsc2U7CgkJCX0KCQl9CgoJCS8vIGhhbmRsZSBudW1iZXJzOiBuZWdhdGl2ZSwgb3V0IG9mIHJhbmdlCgkJaWYgKCBhY3RpdmUgIT09IGZhbHNlICkgewoJCQlhY3RpdmUgPSB0aGlzLnRhYnMuaW5kZXgoIHRoaXMudGFicy5lcSggYWN0aXZlICkgKTsKCQkJaWYgKCBhY3RpdmUgPT09IC0xICkgewoJCQkJYWN0aXZlID0gY29sbGFwc2libGUgPyBmYWxzZSA6IDA7CgkJCX0KCQl9CgoJCS8vIGRvbid0IGFsbG93IGNvbGxhcHNpYmxlOiBmYWxzZSBhbmQgYWN0aXZlOiBmYWxzZQoJCWlmICggIWNvbGxhcHNpYmxlICYmIGFjdGl2ZSA9PT0gZmFsc2UgJiYgdGhpcy5hbmNob3JzLmxlbmd0aCApIHsKCQkJYWN0aXZlID0gMDsKCQl9CgoJCXJldHVybiBhY3RpdmU7Cgl9LAoKCV9nZXRDcmVhdGVFdmVudERhdGE6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB7CgkJCXRhYjogdGhpcy5hY3RpdmUsCgkJCXBhbmVsOiAhdGhpcy5hY3RpdmUubGVuZ3RoID8gJCgpIDogdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIHRoaXMuYWN0aXZlICkKCQl9OwoJfSwKCglfdGFiS2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCS8qanNoaW50IG1heGNvbXBsZXhpdHk6MTUqLwoJCXZhciBmb2N1c2VkVGFiID0gJCggdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50ICkuY2xvc2VzdCggImxpIiApLAoJCQlzZWxlY3RlZEluZGV4ID0gdGhpcy50YWJzLmluZGV4KCBmb2N1c2VkVGFiICksCgkJCWdvaW5nRm9yd2FyZCA9IHRydWU7CgoJCWlmICggdGhpcy5faGFuZGxlUGFnZU5hdiggZXZlbnQgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQkJY2FzZSAkLnVpLmtleUNvZGUuUklHSFQ6CgkJCWNhc2UgJC51aS5rZXlDb2RlLkRPV046CgkJCQlzZWxlY3RlZEluZGV4Kys7CgkJCQlicmVhazsKCQkJY2FzZSAkLnVpLmtleUNvZGUuVVA6CgkJCWNhc2UgJC51aS5rZXlDb2RlLkxFRlQ6CgkJCQlnb2luZ0ZvcndhcmQgPSBmYWxzZTsKCQkJCXNlbGVjdGVkSW5kZXgtLTsKCQkJCWJyZWFrOwoJCQljYXNlICQudWkua2V5Q29kZS5FTkQ6CgkJCQlzZWxlY3RlZEluZGV4ID0gdGhpcy5hbmNob3JzLmxlbmd0aCAtIDE7CgkJCQlicmVhazsKCQkJY2FzZSAkLnVpLmtleUNvZGUuSE9NRToKCQkJCXNlbGVjdGVkSW5kZXggPSAwOwoJCQkJYnJlYWs7CgkJCWNhc2UgJC51aS5rZXlDb2RlLlNQQUNFOgoJCQkJLy8gQWN0aXZhdGUgb25seSwgbm8gY29sbGFwc2luZwoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCWNsZWFyVGltZW91dCggdGhpcy5hY3RpdmF0aW5nICk7CgkJCQl0aGlzLl9hY3RpdmF0ZSggc2VsZWN0ZWRJbmRleCApOwoJCQkJcmV0dXJuOwoJCQljYXNlICQudWkua2V5Q29kZS5FTlRFUjoKCQkJCS8vIFRvZ2dsZSAoY2FuY2VsIGRlbGF5ZWQgYWN0aXZhdGlvbiwgYWxsb3cgY29sbGFwc2luZykKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQljbGVhclRpbWVvdXQoIHRoaXMuYWN0aXZhdGluZyApOwoJCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBjb2xsYXBzZSBvciBhY3RpdmF0ZQoJCQkJdGhpcy5fYWN0aXZhdGUoIHNlbGVjdGVkSW5kZXggPT09IHRoaXMub3B0aW9ucy5hY3RpdmUgPyBmYWxzZSA6IHNlbGVjdGVkSW5kZXggKTsKCQkJCXJldHVybjsKCQkJZGVmYXVsdDoKCQkJCXJldHVybjsKCQl9CgoJCS8vIEZvY3VzIHRoZSBhcHByb3ByaWF0ZSB0YWIsIGJhc2VkIG9uIHdoaWNoIGtleSB3YXMgcHJlc3NlZAoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLmFjdGl2YXRpbmcgKTsKCQlzZWxlY3RlZEluZGV4ID0gdGhpcy5fZm9jdXNOZXh0VGFiKCBzZWxlY3RlZEluZGV4LCBnb2luZ0ZvcndhcmQgKTsKCgkJLy8gTmF2aWdhdGluZyB3aXRoIGNvbnRyb2wga2V5IHdpbGwgcHJldmVudCBhdXRvbWF0aWMgYWN0aXZhdGlvbgoJCWlmICggIWV2ZW50LmN0cmxLZXkgKSB7CgkJCS8vIFVwZGF0ZSBhcmlhLXNlbGVjdGVkIGltbWVkaWF0ZWx5IHNvIHRoYXQgQVQgdGhpbmsgdGhlIHRhYiBpcyBhbHJlYWR5IHNlbGVjdGVkLgoJCQkvLyBPdGhlcndpc2UgQVQgbWF5IGNvbmZ1c2UgdGhlIHVzZXIgYnkgc3RhdGluZyB0aGF0IHRoZXkgbmVlZCB0byBhY3RpdmF0ZSB0aGUgdGFiLAoJCQkvLyBidXQgdGhlIHRhYiB3aWxsIGFscmVhZHkgYmUgYWN0aXZhdGVkIGJ5IHRoZSB0aW1lIHRoZSBhbm5vdW5jZW1lbnQgZmluaXNoZXMuCgkJCWZvY3VzZWRUYWIuYXR0ciggImFyaWEtc2VsZWN0ZWQiLCAiZmFsc2UiICk7CgkJCXRoaXMudGFicy5lcSggc2VsZWN0ZWRJbmRleCApLmF0dHIoICJhcmlhLXNlbGVjdGVkIiwgInRydWUiICk7CgoJCQl0aGlzLmFjdGl2YXRpbmcgPSB0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCXRoaXMub3B0aW9uKCAiYWN0aXZlIiwgc2VsZWN0ZWRJbmRleCApOwoJCQl9LCB0aGlzLmRlbGF5ICk7CgkJfQoJfSwKCglfcGFuZWxLZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCB0aGlzLl9oYW5kbGVQYWdlTmF2KCBldmVudCApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBDdHJsK3VwIG1vdmVzIGZvY3VzIHRvIHRoZSBjdXJyZW50IHRhYgoJCWlmICggZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuVVAgKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCXRoaXMuYWN0aXZlLmZvY3VzKCk7CgkJfQoJfSwKCgkvLyBBbHQrcGFnZSB1cC9kb3duIG1vdmVzIGZvY3VzIHRvIHRoZSBwcmV2aW91cy9uZXh0IHRhYiAoYW5kIGFjdGl2YXRlcykKCV9oYW5kbGVQYWdlTmF2OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCBldmVudC5hbHRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLlBBR0VfVVAgKSB7CgkJCXRoaXMuX2FjdGl2YXRlKCB0aGlzLl9mb2N1c05leHRUYWIoIHRoaXMub3B0aW9ucy5hY3RpdmUgLSAxLCBmYWxzZSApICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlpZiAoIGV2ZW50LmFsdEtleSAmJiBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuUEFHRV9ET1dOICkgewoJCQl0aGlzLl9hY3RpdmF0ZSggdGhpcy5fZm9jdXNOZXh0VGFiKCB0aGlzLm9wdGlvbnMuYWN0aXZlICsgMSwgdHJ1ZSApICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0sCgoJX2ZpbmROZXh0VGFiOiBmdW5jdGlvbiggaW5kZXgsIGdvaW5nRm9yd2FyZCApIHsKCQl2YXIgbGFzdFRhYkluZGV4ID0gdGhpcy50YWJzLmxlbmd0aCAtIDE7CgoJCWZ1bmN0aW9uIGNvbnN0cmFpbigpIHsKCQkJaWYgKCBpbmRleCA+IGxhc3RUYWJJbmRleCApIHsKCQkJCWluZGV4ID0gMDsKCQkJfQoJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCWluZGV4ID0gbGFzdFRhYkluZGV4OwoJCQl9CgkJCXJldHVybiBpbmRleDsKCQl9CgoJCXdoaWxlICggJC5pbkFycmF5KCBjb25zdHJhaW4oKSwgdGhpcy5vcHRpb25zLmRpc2FibGVkICkgIT09IC0xICkgewoJCQlpbmRleCA9IGdvaW5nRm9yd2FyZCA/IGluZGV4ICsgMSA6IGluZGV4IC0gMTsKCQl9CgoJCXJldHVybiBpbmRleDsKCX0sCgoJX2ZvY3VzTmV4dFRhYjogZnVuY3Rpb24oIGluZGV4LCBnb2luZ0ZvcndhcmQgKSB7CgkJaW5kZXggPSB0aGlzLl9maW5kTmV4dFRhYiggaW5kZXgsIGdvaW5nRm9yd2FyZCApOwoJCXRoaXMudGFicy5lcSggaW5kZXggKS5mb2N1cygpOwoJCXJldHVybiBpbmRleDsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkgPT09ICJhY3RpdmUiICkgewoJCQkvLyBfYWN0aXZhdGUoKSB3aWxsIGhhbmRsZSBpbnZhbGlkIHZhbHVlcyBhbmQgdXBkYXRlIHRoaXMub3B0aW9ucwoJCQl0aGlzLl9hY3RpdmF0ZSggdmFsdWUgKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgKSB7CgkJCS8vIGRvbid0IHVzZSB0aGUgd2lkZ2V0IGZhY3RvcnkncyBkaXNhYmxlZCBoYW5kbGluZwoJCQl0aGlzLl9zZXR1cERpc2FibGVkKCB2YWx1ZSApOwoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSk7CgoJCWlmICgga2V5ID09PSAiY29sbGFwc2libGUiICkgewoJCQl0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoICJ1aS10YWJzLWNvbGxhcHNpYmxlIiwgdmFsdWUgKTsKCQkJLy8gU2V0dGluZyBjb2xsYXBzaWJsZTogZmFsc2Ugd2hpbGUgY29sbGFwc2VkOyBvcGVuIGZpcnN0IHBhbmVsCgkJCWlmICggIXZhbHVlICYmIHRoaXMub3B0aW9ucy5hY3RpdmUgPT09IGZhbHNlICkgewoJCQkJdGhpcy5fYWN0aXZhdGUoIDAgKTsKCQkJfQoJCX0KCgkJaWYgKCBrZXkgPT09ICJldmVudCIgKSB7CgkJCXRoaXMuX3NldHVwRXZlbnRzKCB2YWx1ZSApOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJoZWlnaHRTdHlsZSIgKSB7CgkJCXRoaXMuX3NldHVwSGVpZ2h0U3R5bGUoIHZhbHVlICk7CgkJfQoJfSwKCglfdGFiSWQ6IGZ1bmN0aW9uKCB0YWIgKSB7CgkJcmV0dXJuIHRhYi5hdHRyKCAiYXJpYS1jb250cm9scyIgKSB8fCAidWktdGFicy0iICsgZ2V0TmV4dFRhYklkKCk7Cgl9LAoKCV9zYW5pdGl6ZVNlbGVjdG9yOiBmdW5jdGlvbiggaGFzaCApIHsKCQlyZXR1cm4gaGFzaCA/IGhhc2gucmVwbGFjZSggL1shIiQlJicoKSorLC5cLzo7PD0+P0BcW1xdXF5ge3x9fl0vZywgIlxcJCYiICkgOiAiIjsKCX0sCgoJcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCWxpcyA9IHRoaXMudGFibGlzdC5jaGlsZHJlbiggIjpoYXMoYVtocmVmXSkiICk7CgoJCS8vIGdldCBkaXNhYmxlZCB0YWJzIGZyb20gY2xhc3MgYXR0cmlidXRlIGZyb20gSFRNTAoJCS8vIHRoaXMgd2lsbCBnZXQgY29udmVydGVkIHRvIGEgYm9vbGVhbiBpZiBuZWVkZWQgaW4gX3JlZnJlc2goKQoJCW9wdGlvbnMuZGlzYWJsZWQgPSAkLm1hcCggbGlzLmZpbHRlciggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSwgZnVuY3Rpb24oIHRhYiApIHsKCQkJcmV0dXJuIGxpcy5pbmRleCggdGFiICk7CgkJfSk7CgoJCXRoaXMuX3Byb2Nlc3NUYWJzKCk7CgoJCS8vIHdhcyBjb2xsYXBzZWQgb3Igbm8gdGFicwoJCWlmICggb3B0aW9ucy5hY3RpdmUgPT09IGZhbHNlIHx8ICF0aGlzLmFuY2hvcnMubGVuZ3RoICkgewoJCQlvcHRpb25zLmFjdGl2ZSA9IGZhbHNlOwoJCQl0aGlzLmFjdGl2ZSA9ICQoKTsKCQkvLyB3YXMgYWN0aXZlLCBidXQgYWN0aXZlIHRhYiBpcyBnb25lCgkJfSBlbHNlIGlmICggdGhpcy5hY3RpdmUubGVuZ3RoICYmICEkLmNvbnRhaW5zKCB0aGlzLnRhYmxpc3RbIDAgXSwgdGhpcy5hY3RpdmVbIDAgXSApICkgewoJCQkvLyBhbGwgcmVtYWluaW5nIHRhYnMgYXJlIGRpc2FibGVkCgkJCWlmICggdGhpcy50YWJzLmxlbmd0aCA9PT0gb3B0aW9ucy5kaXNhYmxlZC5sZW5ndGggKSB7CgkJCQlvcHRpb25zLmFjdGl2ZSA9IGZhbHNlOwoJCQkJdGhpcy5hY3RpdmUgPSAkKCk7CgkJCS8vIGFjdGl2YXRlIHByZXZpb3VzIHRhYgoJCQl9IGVsc2UgewoJCQkJdGhpcy5fYWN0aXZhdGUoIHRoaXMuX2ZpbmROZXh0VGFiKCBNYXRoLm1heCggMCwgb3B0aW9ucy5hY3RpdmUgLSAxICksIGZhbHNlICkgKTsKCQkJfQoJCS8vIHdhcyBhY3RpdmUsIGFjdGl2ZSB0YWIgc3RpbGwgZXhpc3RzCgkJfSBlbHNlIHsKCQkJLy8gbWFrZSBzdXJlIGFjdGl2ZSBpbmRleCBpcyBjb3JyZWN0CgkJCW9wdGlvbnMuYWN0aXZlID0gdGhpcy50YWJzLmluZGV4KCB0aGlzLmFjdGl2ZSApOwoJCX0KCgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdGhpcy5fc2V0dXBEaXNhYmxlZCggdGhpcy5vcHRpb25zLmRpc2FibGVkICk7CgkJdGhpcy5fc2V0dXBFdmVudHMoIHRoaXMub3B0aW9ucy5ldmVudCApOwoJCXRoaXMuX3NldHVwSGVpZ2h0U3R5bGUoIHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSApOwoKCQl0aGlzLnRhYnMubm90KCB0aGlzLmFjdGl2ZSApLmF0dHIoewoJCQkiYXJpYS1zZWxlY3RlZCI6ICJmYWxzZSIsCgkJCXRhYkluZGV4OiAtMQoJCX0pOwoJCXRoaXMucGFuZWxzLm5vdCggdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIHRoaXMuYWN0aXZlICkgKQoJCQkuaGlkZSgpCgkJCS5hdHRyKHsKCQkJCSJhcmlhLWV4cGFuZGVkIjogImZhbHNlIiwKCQkJCSJhcmlhLWhpZGRlbiI6ICJ0cnVlIgoJCQl9KTsKCgkJLy8gTWFrZSBzdXJlIG9uZSB0YWIgaXMgaW4gdGhlIHRhYiBvcmRlcgoJCWlmICggIXRoaXMuYWN0aXZlLmxlbmd0aCApIHsKCQkJdGhpcy50YWJzLmVxKCAwICkuYXR0ciggInRhYkluZGV4IiwgMCApOwoJCX0gZWxzZSB7CgkJCXRoaXMuYWN0aXZlCgkJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiICkKCQkJCS5hdHRyKHsKCQkJCQkiYXJpYS1zZWxlY3RlZCI6ICJ0cnVlIiwKCQkJCQl0YWJJbmRleDogMAoJCQkJfSk7CgkJCXRoaXMuX2dldFBhbmVsRm9yVGFiKCB0aGlzLmFjdGl2ZSApCgkJCQkuc2hvdygpCgkJCQkuYXR0cih7CgkJCQkJImFyaWEtZXhwYW5kZWQiOiAidHJ1ZSIsCgkJCQkJImFyaWEtaGlkZGVuIjogImZhbHNlIgoJCQkJfSk7CgkJfQoJfSwKCglfcHJvY2Vzc1RhYnM6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpczsKCgkJdGhpcy50YWJsaXN0ID0gdGhpcy5fZ2V0TGlzdCgpCgkJCS5hZGRDbGFzcyggInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiApCgkJCS5hdHRyKCAicm9sZSIsICJ0YWJsaXN0IiApOwoKCQl0aGlzLnRhYnMgPSB0aGlzLnRhYmxpc3QuZmluZCggIj4gbGk6aGFzKGFbaHJlZl0pIiApCgkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIgKQoJCQkuYXR0cih7CgkJCQlyb2xlOiAidGFiIiwKCQkJCXRhYkluZGV4OiAtMQoJCQl9KTsKCgkJdGhpcy5hbmNob3JzID0gdGhpcy50YWJzLm1hcChmdW5jdGlvbigpIHsKCQkJCXJldHVybiAkKCAiYSIsIHRoaXMgKVsgMCBdOwoJCQl9KQoJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLWFuY2hvciIgKQoJCQkuYXR0cih7CgkJCQlyb2xlOiAicHJlc2VudGF0aW9uIiwKCQkJCXRhYkluZGV4OiAtMQoJCQl9KTsKCgkJdGhpcy5wYW5lbHMgPSAkKCk7CgoJCXRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKCBpLCBhbmNob3IgKSB7CgkJCXZhciBzZWxlY3RvciwgcGFuZWwsIHBhbmVsSWQsCgkJCQlhbmNob3JJZCA9ICQoIGFuY2hvciApLnVuaXF1ZUlkKCkuYXR0ciggImlkIiApLAoJCQkJdGFiID0gJCggYW5jaG9yICkuY2xvc2VzdCggImxpIiApLAoJCQkJb3JpZ2luYWxBcmlhQ29udHJvbHMgPSB0YWIuYXR0ciggImFyaWEtY29udHJvbHMiICk7CgoJCQkvLyBpbmxpbmUgdGFiCgkJCWlmICggaXNMb2NhbCggYW5jaG9yICkgKSB7CgkJCQlzZWxlY3RvciA9IGFuY2hvci5oYXNoOwoJCQkJcGFuZWwgPSB0aGF0LmVsZW1lbnQuZmluZCggdGhhdC5fc2FuaXRpemVTZWxlY3Rvciggc2VsZWN0b3IgKSApOwoJCQkvLyByZW1vdGUgdGFiCgkJCX0gZWxzZSB7CgkJCQlwYW5lbElkID0gdGhhdC5fdGFiSWQoIHRhYiApOwoJCQkJc2VsZWN0b3IgPSAiIyIgKyBwYW5lbElkOwoJCQkJcGFuZWwgPSB0aGF0LmVsZW1lbnQuZmluZCggc2VsZWN0b3IgKTsKCQkJCWlmICggIXBhbmVsLmxlbmd0aCApIHsKCQkJCQlwYW5lbCA9IHRoYXQuX2NyZWF0ZVBhbmVsKCBwYW5lbElkICk7CgkJCQkJcGFuZWwuaW5zZXJ0QWZ0ZXIoIHRoYXQucGFuZWxzWyBpIC0gMSBdIHx8IHRoYXQudGFibGlzdCApOwoJCQkJfQoJCQkJcGFuZWwuYXR0ciggImFyaWEtbGl2ZSIsICJwb2xpdGUiICk7CgkJCX0KCgkJCWlmICggcGFuZWwubGVuZ3RoKSB7CgkJCQl0aGF0LnBhbmVscyA9IHRoYXQucGFuZWxzLmFkZCggcGFuZWwgKTsKCQkJfQoJCQlpZiAoIG9yaWdpbmFsQXJpYUNvbnRyb2xzICkgewoJCQkJdGFiLmRhdGEoICJ1aS10YWJzLWFyaWEtY29udHJvbHMiLCBvcmlnaW5hbEFyaWFDb250cm9scyApOwoJCQl9CgkJCXRhYi5hdHRyKHsKCQkJCSJhcmlhLWNvbnRyb2xzIjogc2VsZWN0b3Iuc3Vic3RyaW5nKCAxICksCgkJCQkiYXJpYS1sYWJlbGxlZGJ5IjogYW5jaG9ySWQKCQkJfSk7CgkJCXBhbmVsLmF0dHIoICJhcmlhLWxhYmVsbGVkYnkiLCBhbmNob3JJZCApOwoJCX0pOwoKCQl0aGlzLnBhbmVscwoJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iICkKCQkJLmF0dHIoICJyb2xlIiwgInRhYnBhbmVsIiApOwoJfSwKCgkvLyBhbGxvdyBvdmVycmlkaW5nIGhvdyB0byBmaW5kIHRoZSBsaXN0IGZvciByYXJlIHVzYWdlIHNjZW5hcmlvcyAoIzc3MTUpCglfZ2V0TGlzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKCAib2wsdWwiICkuZXEoIDAgKTsKCX0sCgoJX2NyZWF0ZVBhbmVsOiBmdW5jdGlvbiggaWQgKSB7CgkJcmV0dXJuICQoICI8ZGl2PiIgKQoJCQkuYXR0ciggImlkIiwgaWQgKQoJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iICkKCQkJLmRhdGEoICJ1aS10YWJzLWRlc3Ryb3kiLCB0cnVlICk7Cgl9LAoKCV9zZXR1cERpc2FibGVkOiBmdW5jdGlvbiggZGlzYWJsZWQgKSB7CgkJaWYgKCAkLmlzQXJyYXkoIGRpc2FibGVkICkgKSB7CgkJCWlmICggIWRpc2FibGVkLmxlbmd0aCApIHsKCQkJCWRpc2FibGVkID0gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIGRpc2FibGVkLmxlbmd0aCA9PT0gdGhpcy5hbmNob3JzLmxlbmd0aCApIHsKCQkJCWRpc2FibGVkID0gdHJ1ZTsKCQkJfQoJCX0KCgkJLy8gZGlzYWJsZSB0YWJzCgkJZm9yICggdmFyIGkgPSAwLCBsaTsgKCBsaSA9IHRoaXMudGFic1sgaSBdICk7IGkrKyApIHsKCQkJaWYgKCBkaXNhYmxlZCA9PT0gdHJ1ZSB8fCAkLmluQXJyYXkoIGksIGRpc2FibGVkICkgIT09IC0xICkgewoJCQkJJCggbGkgKQoJCQkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiApCgkJCQkJLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgInRydWUiICk7CgkJCX0gZWxzZSB7CgkJCQkkKCBsaSApCgkJCQkJLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICk7CgkJCX0KCQl9CgoJCXRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGRpc2FibGVkOwoJfSwKCglfc2V0dXBFdmVudHM6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgZXZlbnRzID0gewoJCQljbGljazogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoJCX07CgkJaWYgKCBldmVudCApIHsKCQkJJC5lYWNoKCBldmVudC5zcGxpdCgiICIpLCBmdW5jdGlvbiggaW5kZXgsIGV2ZW50TmFtZSApIHsKCQkJCWV2ZW50c1sgZXZlbnROYW1lIF0gPSAiX2V2ZW50SGFuZGxlciI7CgkJCX0pOwoJCX0KCgkJdGhpcy5fb2ZmKCB0aGlzLmFuY2hvcnMuYWRkKCB0aGlzLnRhYnMgKS5hZGQoIHRoaXMucGFuZWxzICkgKTsKCQl0aGlzLl9vbiggdGhpcy5hbmNob3JzLCBldmVudHMgKTsKCQl0aGlzLl9vbiggdGhpcy50YWJzLCB7IGtleWRvd246ICJfdGFiS2V5ZG93biIgfSApOwoJCXRoaXMuX29uKCB0aGlzLnBhbmVscywgeyBrZXlkb3duOiAiX3BhbmVsS2V5ZG93biIgfSApOwoKCQl0aGlzLl9mb2N1c2FibGUoIHRoaXMudGFicyApOwoJCXRoaXMuX2hvdmVyYWJsZSggdGhpcy50YWJzICk7Cgl9LAoKCV9zZXR1cEhlaWdodFN0eWxlOiBmdW5jdGlvbiggaGVpZ2h0U3R5bGUgKSB7CgkJdmFyIG1heEhlaWdodCwKCQkJcGFyZW50ID0gdGhpcy5lbGVtZW50LnBhcmVudCgpOwoKCQlpZiAoIGhlaWdodFN0eWxlID09PSAiZmlsbCIgKSB7CgkJCW1heEhlaWdodCA9IHBhcmVudC5oZWlnaHQoKTsKCQkJbWF4SGVpZ2h0IC09IHRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpIC0gdGhpcy5lbGVtZW50LmhlaWdodCgpOwoKCQkJdGhpcy5lbGVtZW50LnNpYmxpbmdzKCAiOnZpc2libGUiICkuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBlbGVtID0gJCggdGhpcyApLAoJCQkJCXBvc2l0aW9uID0gZWxlbS5jc3MoICJwb3NpdGlvbiIgKTsKCgkJCQlpZiAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCW1heEhlaWdodCAtPSBlbGVtLm91dGVySGVpZ2h0KCB0cnVlICk7CgkJCX0pOwoKCQkJdGhpcy5lbGVtZW50LmNoaWxkcmVuKCkubm90KCB0aGlzLnBhbmVscyApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQltYXhIZWlnaHQgLT0gJCggdGhpcyApLm91dGVySGVpZ2h0KCB0cnVlICk7CgkJCX0pOwoKCQkJdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpIHsKCQkJCSQoIHRoaXMgKS5oZWlnaHQoIE1hdGgubWF4KCAwLCBtYXhIZWlnaHQgLQoJCQkJCSQoIHRoaXMgKS5pbm5lckhlaWdodCgpICsgJCggdGhpcyApLmhlaWdodCgpICkgKTsKCQkJfSkKCQkJLmNzcyggIm92ZXJmbG93IiwgImF1dG8iICk7CgkJfSBlbHNlIGlmICggaGVpZ2h0U3R5bGUgPT09ICJhdXRvIiApIHsKCQkJbWF4SGVpZ2h0ID0gMDsKCQkJdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpIHsKCQkJCW1heEhlaWdodCA9IE1hdGgubWF4KCBtYXhIZWlnaHQsICQoIHRoaXMgKS5oZWlnaHQoICIiICkuaGVpZ2h0KCkgKTsKCQkJfSkuaGVpZ2h0KCBtYXhIZWlnaHQgKTsKCQl9Cgl9LAoKCV9ldmVudEhhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJYWN0aXZlID0gdGhpcy5hY3RpdmUsCgkJCWFuY2hvciA9ICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwKCQkJdGFiID0gYW5jaG9yLmNsb3Nlc3QoICJsaSIgKSwKCQkJY2xpY2tlZElzQWN0aXZlID0gdGFiWyAwIF0gPT09IGFjdGl2ZVsgMCBdLAoJCQljb2xsYXBzaW5nID0gY2xpY2tlZElzQWN0aXZlICYmIG9wdGlvbnMuY29sbGFwc2libGUsCgkJCXRvU2hvdyA9IGNvbGxhcHNpbmcgPyAkKCkgOiB0aGlzLl9nZXRQYW5lbEZvclRhYiggdGFiICksCgkJCXRvSGlkZSA9ICFhY3RpdmUubGVuZ3RoID8gJCgpIDogdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIGFjdGl2ZSApLAoJCQlldmVudERhdGEgPSB7CgkJCQlvbGRUYWI6IGFjdGl2ZSwKCQkJCW9sZFBhbmVsOiB0b0hpZGUsCgkJCQluZXdUYWI6IGNvbGxhcHNpbmcgPyAkKCkgOiB0YWIsCgkJCQluZXdQYW5lbDogdG9TaG93CgkJCX07CgoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCWlmICggdGFiLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgfHwKCQkJCS8vIHRhYiBpcyBhbHJlYWR5IGxvYWRpbmcKCQkJCXRhYi5oYXNDbGFzcyggInVpLXRhYnMtbG9hZGluZyIgKSB8fAoJCQkJLy8gY2FuJ3Qgc3dpdGNoIGR1cm5pbmcgYW4gYW5pbWF0aW9uCgkJCQl0aGlzLnJ1bm5pbmcgfHwKCQkJCS8vIGNsaWNrIG9uIGFjdGl2ZSBoZWFkZXIsIGJ1dCBub3QgY29sbGFwc2libGUKCQkJCSggY2xpY2tlZElzQWN0aXZlICYmICFvcHRpb25zLmNvbGxhcHNpYmxlICkgfHwKCQkJCS8vIGFsbG93IGNhbmNlbGluZyBhY3RpdmF0aW9uCgkJCQkoIHRoaXMuX3RyaWdnZXIoICJiZWZvcmVBY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKSA9PT0gZmFsc2UgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJb3B0aW9ucy5hY3RpdmUgPSBjb2xsYXBzaW5nID8gZmFsc2UgOiB0aGlzLnRhYnMuaW5kZXgoIHRhYiApOwoKCQl0aGlzLmFjdGl2ZSA9IGNsaWNrZWRJc0FjdGl2ZSA/ICQoKSA6IHRhYjsKCQlpZiAoIHRoaXMueGhyICkgewoJCQl0aGlzLnhoci5hYm9ydCgpOwoJCX0KCgkJaWYgKCAhdG9IaWRlLmxlbmd0aCAmJiAhdG9TaG93Lmxlbmd0aCApIHsKCQkJJC5lcnJvciggImpRdWVyeSBVSSBUYWJzOiBNaXNtYXRjaGluZyBmcmFnbWVudCBpZGVudGlmaWVyLiIgKTsKCQl9CgoJCWlmICggdG9TaG93Lmxlbmd0aCApIHsKCQkJdGhpcy5sb2FkKCB0aGlzLnRhYnMuaW5kZXgoIHRhYiApLCBldmVudCApOwoJCX0KCQl0aGlzLl90b2dnbGUoIGV2ZW50LCBldmVudERhdGEgKTsKCX0sCgoJLy8gaGFuZGxlcyBzaG93L2hpZGUgZm9yIHNlbGVjdGluZyB0YWJzCglfdG9nZ2xlOiBmdW5jdGlvbiggZXZlbnQsIGV2ZW50RGF0YSApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRvU2hvdyA9IGV2ZW50RGF0YS5uZXdQYW5lbCwKCQkJdG9IaWRlID0gZXZlbnREYXRhLm9sZFBhbmVsOwoKCQl0aGlzLnJ1bm5pbmcgPSB0cnVlOwoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpIHsKCQkJdGhhdC5ydW5uaW5nID0gZmFsc2U7CgkJCXRoYXQuX3RyaWdnZXIoICJhY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKTsKCQl9CgoJCWZ1bmN0aW9uIHNob3coKSB7CgkJCWV2ZW50RGF0YS5uZXdUYWIuY2xvc2VzdCggImxpIiApLmFkZENsYXNzKCAidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiApOwoKCQkJaWYgKCB0b1Nob3cubGVuZ3RoICYmIHRoYXQub3B0aW9ucy5zaG93ICkgewoJCQkJdGhhdC5fc2hvdyggdG9TaG93LCB0aGF0Lm9wdGlvbnMuc2hvdywgY29tcGxldGUgKTsKCQkJfSBlbHNlIHsKCQkJCXRvU2hvdy5zaG93KCk7CgkJCQljb21wbGV0ZSgpOwoJCQl9CgkJfQoKCQkvLyBzdGFydCBvdXQgYnkgaGlkaW5nLCB0aGVuIHNob3dpbmcsIHRoZW4gY29tcGxldGluZwoJCWlmICggdG9IaWRlLmxlbmd0aCAmJiB0aGlzLm9wdGlvbnMuaGlkZSApIHsKCQkJdGhpcy5faGlkZSggdG9IaWRlLCB0aGlzLm9wdGlvbnMuaGlkZSwgZnVuY3Rpb24oKSB7CgkJCQlldmVudERhdGEub2xkVGFiLmNsb3Nlc3QoICJsaSIgKS5yZW1vdmVDbGFzcyggInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCXNob3coKTsKCQkJfSk7CgkJfSBlbHNlIHsKCQkJZXZlbnREYXRhLm9sZFRhYi5jbG9zZXN0KCAibGkiICkucmVtb3ZlQ2xhc3MoICJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCXRvSGlkZS5oaWRlKCk7CgkJCXNob3coKTsKCQl9CgoJCXRvSGlkZS5hdHRyKHsKCQkJImFyaWEtZXhwYW5kZWQiOiAiZmFsc2UiLAoJCQkiYXJpYS1oaWRkZW4iOiAidHJ1ZSIKCQl9KTsKCQlldmVudERhdGEub2xkVGFiLmF0dHIoICJhcmlhLXNlbGVjdGVkIiwgImZhbHNlIiApOwoJCS8vIElmIHdlJ3JlIHN3aXRjaGluZyB0YWJzLCByZW1vdmUgdGhlIG9sZCB0YWIgZnJvbSB0aGUgdGFiIG9yZGVyLgoJCS8vIElmIHdlJ3JlIG9wZW5pbmcgZnJvbSBjb2xsYXBzZWQgc3RhdGUsIHJlbW92ZSB0aGUgcHJldmlvdXMgdGFiIGZyb20gdGhlIHRhYiBvcmRlci4KCQkvLyBJZiB3ZSdyZSBjb2xsYXBzaW5nLCB0aGVuIGtlZXAgdGhlIGNvbGxhcHNpbmcgdGFiIGluIHRoZSB0YWIgb3JkZXIuCgkJaWYgKCB0b1Nob3cubGVuZ3RoICYmIHRvSGlkZS5sZW5ndGggKSB7CgkJCWV2ZW50RGF0YS5vbGRUYWIuYXR0ciggInRhYkluZGV4IiwgLTEgKTsKCQl9IGVsc2UgaWYgKCB0b1Nob3cubGVuZ3RoICkgewoJCQl0aGlzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICQoIHRoaXMgKS5hdHRyKCAidGFiSW5kZXgiICkgPT09IDA7CgkJCX0pCgkJCS5hdHRyKCAidGFiSW5kZXgiLCAtMSApOwoJCX0KCgkJdG9TaG93LmF0dHIoewoJCQkiYXJpYS1leHBhbmRlZCI6ICJ0cnVlIiwKCQkJImFyaWEtaGlkZGVuIjogImZhbHNlIgoJCX0pOwoJCWV2ZW50RGF0YS5uZXdUYWIuYXR0cih7CgkJCSJhcmlhLXNlbGVjdGVkIjogInRydWUiLAoJCQl0YWJJbmRleDogMAoJCX0pOwoJfSwKCglfYWN0aXZhdGU6IGZ1bmN0aW9uKCBpbmRleCApIHsKCQl2YXIgYW5jaG9yLAoJCQlhY3RpdmUgPSB0aGlzLl9maW5kQWN0aXZlKCBpbmRleCApOwoKCQkvLyB0cnlpbmcgdG8gYWN0aXZhdGUgdGhlIGFscmVhZHkgYWN0aXZlIHBhbmVsCgkJaWYgKCBhY3RpdmVbIDAgXSA9PT0gdGhpcy5hY3RpdmVbIDAgXSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gdHJ5aW5nIHRvIGNvbGxhcHNlLCBzaW11bGF0ZSBhIGNsaWNrIG9uIHRoZSBjdXJyZW50IGFjdGl2ZSBoZWFkZXIKCQlpZiAoICFhY3RpdmUubGVuZ3RoICkgewoJCQlhY3RpdmUgPSB0aGlzLmFjdGl2ZTsKCQl9CgoJCWFuY2hvciA9IGFjdGl2ZS5maW5kKCAiLnVpLXRhYnMtYW5jaG9yIiApWyAwIF07CgkJdGhpcy5fZXZlbnRIYW5kbGVyKHsKCQkJdGFyZ2V0OiBhbmNob3IsCgkJCWN1cnJlbnRUYXJnZXQ6IGFuY2hvciwKCQkJcHJldmVudERlZmF1bHQ6ICQubm9vcAoJCX0pOwoJfSwKCglfZmluZEFjdGl2ZTogZnVuY3Rpb24oIGluZGV4ICkgewoJCXJldHVybiBpbmRleCA9PT0gZmFsc2UgPyAkKCkgOiB0aGlzLnRhYnMuZXEoIGluZGV4ICk7Cgl9LAoKCV9nZXRJbmRleDogZnVuY3Rpb24oIGluZGV4ICkgewoJCS8vIG1ldGEtZnVuY3Rpb24gdG8gZ2l2ZSB1c2VycyBvcHRpb24gdG8gcHJvdmlkZSBhIGhyZWYgc3RyaW5nIGluc3RlYWQgb2YgYSBudW1lcmljYWwgaW5kZXguCgkJaWYgKCB0eXBlb2YgaW5kZXggPT09ICJzdHJpbmciICkgewoJCQlpbmRleCA9IHRoaXMuYW5jaG9ycy5pbmRleCggdGhpcy5hbmNob3JzLmZpbHRlciggIltocmVmJD0nIiArIGluZGV4ICsgIiddIiApICk7CgkJfQoKCQlyZXR1cm4gaW5kZXg7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQlpZiAoIHRoaXMueGhyICkgewoJCQl0aGlzLnhoci5hYm9ydCgpOwoJCX0KCgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCAidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIiApOwoKCQl0aGlzLnRhYmxpc3QKCQkJLnJlbW92ZUNsYXNzKCAidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApOwoKCQl0aGlzLmFuY2hvcnMKCQkJLnJlbW92ZUNsYXNzKCAidWktdGFicy1hbmNob3IiICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCS5yZW1vdmVBdHRyKCAidGFiSW5kZXgiICkKCQkJLnJlbW92ZVVuaXF1ZUlkKCk7CgoJCXRoaXMudGFicy5hZGQoIHRoaXMucGFuZWxzICkuZWFjaChmdW5jdGlvbigpIHsKCQkJaWYgKCAkLmRhdGEoIHRoaXMsICJ1aS10YWJzLWRlc3Ryb3kiICkgKSB7CgkJCQkkKCB0aGlzICkucmVtb3ZlKCk7CgkJCX0gZWxzZSB7CgkJCQkkKCB0aGlzICkKCQkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1kZWZhdWx0IHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCAiICsKCQkJCQkJInVpLWNvcm5lci10b3AgdWktY29ybmVyLWJvdHRvbSB1aS13aWRnZXQtY29udGVudCB1aS10YWJzLWFjdGl2ZSB1aS10YWJzLXBhbmVsIiApCgkJCQkJLnJlbW92ZUF0dHIoICJ0YWJJbmRleCIgKQoJCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1saXZlIiApCgkJCQkJLnJlbW92ZUF0dHIoICJhcmlhLWJ1c3kiICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtc2VsZWN0ZWQiICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtbGFiZWxsZWRieSIgKQoJCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1oaWRkZW4iICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtZXhwYW5kZWQiICkKCQkJCQkucmVtb3ZlQXR0ciggInJvbGUiICk7CgkJCX0KCQl9KTsKCgkJdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBsaSA9ICQoIHRoaXMgKSwKCQkJCXByZXYgPSBsaS5kYXRhKCAidWktdGFicy1hcmlhLWNvbnRyb2xzIiApOwoJCQlpZiAoIHByZXYgKSB7CgkJCQlsaQoJCQkJCS5hdHRyKCAiYXJpYS1jb250cm9scyIsIHByZXYgKQoJCQkJCS5yZW1vdmVEYXRhKCAidWktdGFicy1hcmlhLWNvbnRyb2xzIiApOwoJCQl9IGVsc2UgewoJCQkJbGkucmVtb3ZlQXR0ciggImFyaWEtY29udHJvbHMiICk7CgkJCX0KCQl9KTsKCgkJdGhpcy5wYW5lbHMuc2hvdygpOwoKCQlpZiAoIHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSAhPT0gImNvbnRlbnQiICkgewoJCQl0aGlzLnBhbmVscy5jc3MoICJoZWlnaHQiLCAiIiApOwoJCX0KCX0sCgoJZW5hYmxlOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJdmFyIGRpc2FibGVkID0gdGhpcy5vcHRpb25zLmRpc2FibGVkOwoJCWlmICggZGlzYWJsZWQgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7CgkJCWRpc2FibGVkID0gZmFsc2U7CgkJfSBlbHNlIHsKCQkJaW5kZXggPSB0aGlzLl9nZXRJbmRleCggaW5kZXggKTsKCQkJaWYgKCAkLmlzQXJyYXkoIGRpc2FibGVkICkgKSB7CgkJCQlkaXNhYmxlZCA9ICQubWFwKCBkaXNhYmxlZCwgZnVuY3Rpb24oIG51bSApIHsKCQkJCQlyZXR1cm4gbnVtICE9PSBpbmRleCA/IG51bSA6IG51bGw7CgkJCQl9KTsKCQkJfSBlbHNlIHsKCQkJCWRpc2FibGVkID0gJC5tYXAoIHRoaXMudGFicywgZnVuY3Rpb24oIGxpLCBudW0gKSB7CgkJCQkJcmV0dXJuIG51bSAhPT0gaW5kZXggPyBudW0gOiBudWxsOwoJCQkJfSk7CgkJCX0KCQl9CgkJdGhpcy5fc2V0dXBEaXNhYmxlZCggZGlzYWJsZWQgKTsKCX0sCgoJZGlzYWJsZTogZnVuY3Rpb24oIGluZGV4ICkgewoJCXZhciBkaXNhYmxlZCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlZDsKCQlpZiAoIGRpc2FibGVkID09PSB0cnVlICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7CgkJCWRpc2FibGVkID0gdHJ1ZTsKCQl9IGVsc2UgewoJCQlpbmRleCA9IHRoaXMuX2dldEluZGV4KCBpbmRleCApOwoJCQlpZiAoICQuaW5BcnJheSggaW5kZXgsIGRpc2FibGVkICkgIT09IC0xICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCWlmICggJC5pc0FycmF5KCBkaXNhYmxlZCApICkgewoJCQkJZGlzYWJsZWQgPSAkLm1lcmdlKCBbIGluZGV4IF0sIGRpc2FibGVkICkuc29ydCgpOwoJCQl9IGVsc2UgewoJCQkJZGlzYWJsZWQgPSBbIGluZGV4IF07CgkJCX0KCQl9CgkJdGhpcy5fc2V0dXBEaXNhYmxlZCggZGlzYWJsZWQgKTsKCX0sCgoJbG9hZDogZnVuY3Rpb24oIGluZGV4LCBldmVudCApIHsKCQlpbmRleCA9IHRoaXMuX2dldEluZGV4KCBpbmRleCApOwoJCXZhciB0aGF0ID0gdGhpcywKCQkJdGFiID0gdGhpcy50YWJzLmVxKCBpbmRleCApLAoJCQlhbmNob3IgPSB0YWIuZmluZCggIi51aS10YWJzLWFuY2hvciIgKSwKCQkJcGFuZWwgPSB0aGlzLl9nZXRQYW5lbEZvclRhYiggdGFiICksCgkJCWV2ZW50RGF0YSA9IHsKCQkJCXRhYjogdGFiLAoJCQkJcGFuZWw6IHBhbmVsCgkJCX07CgoJCS8vIG5vdCByZW1vdGUKCQlpZiAoIGlzTG9jYWwoIGFuY2hvclsgMCBdICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMueGhyID0gJC5hamF4KCB0aGlzLl9hamF4U2V0dGluZ3MoIGFuY2hvciwgZXZlbnQsIGV2ZW50RGF0YSApICk7CgoJCS8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CgkJLy8galF1ZXJ5IDwxLjggcmV0dXJucyBmYWxzZSBpZiB0aGUgcmVxdWVzdCBpcyBjYW5jZWxlZCBpbiBiZWZvcmVTZW5kLAoJCS8vIGJ1dCBhcyBvZiAxLjgsICQuYWpheCgpIGFsd2F5cyByZXR1cm5zIGEganFYSFIgb2JqZWN0LgoJCWlmICggdGhpcy54aHIgJiYgdGhpcy54aHIuc3RhdHVzVGV4dCAhPT0gImNhbmNlbGVkIiApIHsKCQkJdGFiLmFkZENsYXNzKCAidWktdGFicy1sb2FkaW5nIiApOwoJCQlwYW5lbC5hdHRyKCAiYXJpYS1idXN5IiwgInRydWUiICk7CgoJCQl0aGlzLnhocgoJCQkJLnN1Y2Nlc3MoZnVuY3Rpb24oIHJlc3BvbnNlICkgewoJCQkJCS8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CgkJCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTE3NzgKCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJCQlwYW5lbC5odG1sKCByZXNwb25zZSApOwoJCQkJCQl0aGF0Ll90cmlnZ2VyKCAibG9hZCIsIGV2ZW50LCBldmVudERhdGEgKTsKCQkJCQl9LCAxICk7CgkJCQl9KQoJCQkJLmNvbXBsZXRlKGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkgewoJCQkJCS8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CgkJCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTE3NzgKCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJCQlpZiAoIHN0YXR1cyA9PT0gImFib3J0IiApIHsKCQkJCQkJCXRoYXQucGFuZWxzLnN0b3AoIGZhbHNlLCB0cnVlICk7CgkJCQkJCX0KCgkJCQkJCXRhYi5yZW1vdmVDbGFzcyggInVpLXRhYnMtbG9hZGluZyIgKTsKCQkJCQkJcGFuZWwucmVtb3ZlQXR0ciggImFyaWEtYnVzeSIgKTsKCgkJCQkJCWlmICgganFYSFIgPT09IHRoYXQueGhyICkgewoJCQkJCQkJZGVsZXRlIHRoYXQueGhyOwoJCQkJCQl9CgkJCQkJfSwgMSApOwoJCQkJfSk7CgkJfQoJfSwKCglfYWpheFNldHRpbmdzOiBmdW5jdGlvbiggYW5jaG9yLCBldmVudCwgZXZlbnREYXRhICkgewoJCXZhciB0aGF0ID0gdGhpczsKCQlyZXR1cm4gewoJCQl1cmw6IGFuY2hvci5hdHRyKCAiaHJlZiIgKSwKCQkJYmVmb3JlU2VuZDogZnVuY3Rpb24oIGpxWEhSLCBzZXR0aW5ncyApIHsKCQkJCXJldHVybiB0aGF0Ll90cmlnZ2VyKCAiYmVmb3JlTG9hZCIsIGV2ZW50LAoJCQkJCSQuZXh0ZW5kKCB7IGpxWEhSIDoganFYSFIsIGFqYXhTZXR0aW5nczogc2V0dGluZ3MgfSwgZXZlbnREYXRhICkgKTsKCQkJfQoJCX07Cgl9LAoKCV9nZXRQYW5lbEZvclRhYjogZnVuY3Rpb24oIHRhYiApIHsKCQl2YXIgaWQgPSAkKCB0YWIgKS5hdHRyKCAiYXJpYS1jb250cm9scyIgKTsKCQlyZXR1cm4gdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMuX3Nhbml0aXplU2VsZWN0b3IoICIjIiArIGlkICkgKTsKCX0KfSk7Cgp9KSggalF1ZXJ5ICk7CgooZnVuY3Rpb24oICQgKSB7Cgp2YXIgaW5jcmVtZW50cyA9IDA7CgpmdW5jdGlvbiBhZGREZXNjcmliZWRCeSggZWxlbSwgaWQgKSB7Cgl2YXIgZGVzY3JpYmVkYnkgPSAoZWxlbS5hdHRyKCAiYXJpYS1kZXNjcmliZWRieSIgKSB8fCAiIikuc3BsaXQoIC9ccysvICk7CglkZXNjcmliZWRieS5wdXNoKCBpZCApOwoJZWxlbQoJCS5kYXRhKCAidWktdG9vbHRpcC1pZCIsIGlkICkKCQkuYXR0ciggImFyaWEtZGVzY3JpYmVkYnkiLCAkLnRyaW0oIGRlc2NyaWJlZGJ5LmpvaW4oICIgIiApICkgKTsKfQoKZnVuY3Rpb24gcmVtb3ZlRGVzY3JpYmVkQnkoIGVsZW0gKSB7Cgl2YXIgaWQgPSBlbGVtLmRhdGEoICJ1aS10b29sdGlwLWlkIiApLAoJCWRlc2NyaWJlZGJ5ID0gKGVsZW0uYXR0ciggImFyaWEtZGVzY3JpYmVkYnkiICkgfHwgIiIpLnNwbGl0KCAvXHMrLyApLAoJCWluZGV4ID0gJC5pbkFycmF5KCBpZCwgZGVzY3JpYmVkYnkgKTsKCWlmICggaW5kZXggIT09IC0xICkgewoJCWRlc2NyaWJlZGJ5LnNwbGljZSggaW5kZXgsIDEgKTsKCX0KCgllbGVtLnJlbW92ZURhdGEoICJ1aS10b29sdGlwLWlkIiApOwoJZGVzY3JpYmVkYnkgPSAkLnRyaW0oIGRlc2NyaWJlZGJ5LmpvaW4oICIgIiApICk7CglpZiAoIGRlc2NyaWJlZGJ5ICkgewoJCWVsZW0uYXR0ciggImFyaWEtZGVzY3JpYmVkYnkiLCBkZXNjcmliZWRieSApOwoJfSBlbHNlIHsKCQllbGVtLnJlbW92ZUF0dHIoICJhcmlhLWRlc2NyaWJlZGJ5IiApOwoJfQp9CgokLndpZGdldCggInVpLnRvb2x0aXAiLCB7Cgl2ZXJzaW9uOiAiMS4xMC4zIiwKCW9wdGlvbnM6IHsKCQljb250ZW50OiBmdW5jdGlvbigpIHsKCQkJLy8gc3VwcG9ydDogSUU8OSwgT3BlcmEgaW4galF1ZXJ5IDwxLjcKCQkJLy8gLnRleHQoKSBjYW4ndCBhY2NlcHQgdW5kZWZpbmVkLCBzbyBjb2VyY2UgdG8gYSBzdHJpbmcKCQkJdmFyIHRpdGxlID0gJCggdGhpcyApLmF0dHIoICJ0aXRsZSIgKSB8fCAiIjsKCQkJLy8gRXNjYXBlIHRpdGxlLCBzaW5jZSB3ZSdyZSBnb2luZyBmcm9tIGFuIGF0dHJpYnV0ZSB0byByYXcgSFRNTAoJCQlyZXR1cm4gJCggIjxhPiIgKS50ZXh0KCB0aXRsZSApLmh0bWwoKTsKCQl9LAoJCWhpZGU6IHRydWUsCgkJLy8gRGlzYWJsZWQgZWxlbWVudHMgaGF2ZSBpbmNvbnNpc3RlbnQgYmVoYXZpb3IgYWNyb3NzIGJyb3dzZXJzICgjODY2MSkKCQlpdGVtczogIlt0aXRsZV06bm90KFtkaXNhYmxlZF0pIiwKCQlwb3NpdGlvbjogewoJCQlteTogImxlZnQgdG9wKzE1IiwKCQkJYXQ6ICJsZWZ0IGJvdHRvbSIsCgkJCWNvbGxpc2lvbjogImZsaXBmaXQgZmxpcCIKCQl9LAoJCXNob3c6IHRydWUsCgkJdG9vbHRpcENsYXNzOiBudWxsLAoJCXRyYWNrOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY2xvc2U6IG51bGwsCgkJb3BlbjogbnVsbAoJfSwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9vbih7CgkJCW1vdXNlb3ZlcjogIm9wZW4iLAoJCQlmb2N1c2luOiAib3BlbiIKCQl9KTsKCgkJLy8gSURzIG9mIGdlbmVyYXRlZCB0b29sdGlwcywgbmVlZGVkIGZvciBkZXN0cm95CgkJdGhpcy50b29sdGlwcyA9IHt9OwoJCS8vIElEcyBvZiBwYXJlbnQgdG9vbHRpcHMgd2hlcmUgd2UgcmVtb3ZlZCB0aGUgdGl0bGUgYXR0cmlidXRlCgkJdGhpcy5wYXJlbnRzID0ge307CgoJCWlmICggdGhpcy5vcHRpb25zLmRpc2FibGVkICkgewoJCQl0aGlzLl9kaXNhYmxlKCk7CgkJfQoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzWyB2YWx1ZSA/ICJfZGlzYWJsZSIgOiAiX2VuYWJsZSIgXSgpOwoJCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgkJCS8vIGRpc2FibGUgZWxlbWVudCBzdHlsZSBjaGFuZ2VzCgkJCXJldHVybjsKCQl9CgoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7CgoJCWlmICgga2V5ID09PSAiY29udGVudCIgKSB7CgkJCSQuZWFjaCggdGhpcy50b29sdGlwcywgZnVuY3Rpb24oIGlkLCBlbGVtZW50ICkgewoJCQkJdGhhdC5fdXBkYXRlQ29udGVudCggZWxlbWVudCApOwoJCQl9KTsKCQl9Cgl9LAoKCV9kaXNhYmxlOiBmdW5jdGlvbigpIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgoJCS8vIGNsb3NlIG9wZW4gdG9vbHRpcHMKCQkkLmVhY2goIHRoaXMudG9vbHRpcHMsIGZ1bmN0aW9uKCBpZCwgZWxlbWVudCApIHsKCQkJdmFyIGV2ZW50ID0gJC5FdmVudCggImJsdXIiICk7CgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50WzBdOwoJCQl0aGF0LmNsb3NlKCBldmVudCwgdHJ1ZSApOwoJCX0pOwoKCQkvLyByZW1vdmUgdGl0bGUgYXR0cmlidXRlcyB0byBwcmV2ZW50IG5hdGl2ZSB0b29sdGlwcwoJCXRoaXMuZWxlbWVudC5maW5kKCB0aGlzLm9wdGlvbnMuaXRlbXMgKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGVsZW1lbnQgPSAkKCB0aGlzICk7CgkJCWlmICggZWxlbWVudC5pcyggIlt0aXRsZV0iICkgKSB7CgkJCQllbGVtZW50CgkJCQkJLmRhdGEoICJ1aS10b29sdGlwLXRpdGxlIiwgZWxlbWVudC5hdHRyKCAidGl0bGUiICkgKQoJCQkJCS5hdHRyKCAidGl0bGUiLCAiIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV9lbmFibGU6IGZ1bmN0aW9uKCkgewoJCS8vIHJlc3RvcmUgdGl0bGUgYXR0cmlidXRlcwoJCXRoaXMuZWxlbWVudC5maW5kKCB0aGlzLm9wdGlvbnMuaXRlbXMgKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGVsZW1lbnQgPSAkKCB0aGlzICk7CgkJCWlmICggZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApIHsKCQkJCWVsZW1lbnQuYXR0ciggInRpdGxlIiwgZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApOwoJCQl9CgkJfSk7Cgl9LAoKCW9wZW46IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRhcmdldCA9ICQoIGV2ZW50ID8gZXZlbnQudGFyZ2V0IDogdGhpcy5lbGVtZW50ICkKCQkJCS8vIHdlIG5lZWQgY2xvc2VzdCBoZXJlIGR1ZSB0byBtb3VzZW92ZXIgYnViYmxpbmcsCgkJCQkvLyBidXQgYWx3YXlzIHBvaW50aW5nIGF0IHRoZSBzYW1lIGV2ZW50IHRhcmdldAoJCQkJLmNsb3Nlc3QoIHRoaXMub3B0aW9ucy5pdGVtcyApOwoKCQkvLyBObyBlbGVtZW50IHRvIHNob3cgYSB0b29sdGlwIGZvciBvciB0aGUgdG9vbHRpcCBpcyBhbHJlYWR5IG9wZW4KCQlpZiAoICF0YXJnZXQubGVuZ3RoIHx8IHRhcmdldC5kYXRhKCAidWktdG9vbHRpcC1pZCIgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCB0YXJnZXQuYXR0ciggInRpdGxlIiApICkgewoJCQl0YXJnZXQuZGF0YSggInVpLXRvb2x0aXAtdGl0bGUiLCB0YXJnZXQuYXR0ciggInRpdGxlIiApICk7CgkJfQoKCQl0YXJnZXQuZGF0YSggInVpLXRvb2x0aXAtb3BlbiIsIHRydWUgKTsKCgkJLy8ga2lsbCBwYXJlbnQgdG9vbHRpcHMsIGN1c3RvbSBvciBuYXRpdmUsIGZvciBob3ZlcgoJCWlmICggZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gIm1vdXNlb3ZlciIgKSB7CgkJCXRhcmdldC5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBwYXJlbnQgPSAkKCB0aGlzICksCgkJCQkJYmx1ckV2ZW50OwoJCQkJaWYgKCBwYXJlbnQuZGF0YSggInVpLXRvb2x0aXAtb3BlbiIgKSApIHsKCQkJCQlibHVyRXZlbnQgPSAkLkV2ZW50KCAiYmx1ciIgKTsKCQkJCQlibHVyRXZlbnQudGFyZ2V0ID0gYmx1ckV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOwoJCQkJCXRoYXQuY2xvc2UoIGJsdXJFdmVudCwgdHJ1ZSApOwoJCQkJfQoJCQkJaWYgKCBwYXJlbnQuYXR0ciggInRpdGxlIiApICkgewoJCQkJCXBhcmVudC51bmlxdWVJZCgpOwoJCQkJCXRoYXQucGFyZW50c1sgdGhpcy5pZCBdID0gewoJCQkJCQllbGVtZW50OiB0aGlzLAoJCQkJCQl0aXRsZTogcGFyZW50LmF0dHIoICJ0aXRsZSIgKQoJCQkJCX07CgkJCQkJcGFyZW50LmF0dHIoICJ0aXRsZSIsICIiICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJdGhpcy5fdXBkYXRlQ29udGVudCggdGFyZ2V0LCBldmVudCApOwoJfSwKCglfdXBkYXRlQ29udGVudDogZnVuY3Rpb24oIHRhcmdldCwgZXZlbnQgKSB7CgkJdmFyIGNvbnRlbnQsCgkJCWNvbnRlbnRPcHRpb24gPSB0aGlzLm9wdGlvbnMuY29udGVudCwKCQkJdGhhdCA9IHRoaXMsCgkJCWV2ZW50VHlwZSA9IGV2ZW50ID8gZXZlbnQudHlwZSA6IG51bGw7CgoJCWlmICggdHlwZW9mIGNvbnRlbnRPcHRpb24gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5fb3BlbiggZXZlbnQsIHRhcmdldCwgY29udGVudE9wdGlvbiApOwoJCX0KCgkJY29udGVudCA9IGNvbnRlbnRPcHRpb24uY2FsbCggdGFyZ2V0WzBdLCBmdW5jdGlvbiggcmVzcG9uc2UgKSB7CgkJCS8vIGlnbm9yZSBhc3luYyByZXNwb25zZSBpZiB0b29sdGlwIHdhcyBjbG9zZWQgYWxyZWFkeQoJCQlpZiAoICF0YXJnZXQuZGF0YSggInVpLXRvb2x0aXAtb3BlbiIgKSApIHsKCQkJCXJldHVybjsKCQkJfQoJCQkvLyBJRSBtYXkgaW5zdGFudGx5IHNlcnZlIGEgY2FjaGVkIHJlc3BvbnNlIGZvciBhamF4IHJlcXVlc3RzCgkJCS8vIGRlbGF5IHRoaXMgY2FsbCB0byBfb3BlbiBzbyB0aGUgb3RoZXIgY2FsbCB0byBfb3BlbiBydW5zIGZpcnN0CgkJCXRoYXQuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJLy8galF1ZXJ5IGNyZWF0ZXMgYSBzcGVjaWFsIGV2ZW50IGZvciBmb2N1c2luIHdoZW4gaXQgZG9lc24ndAoJCQkJLy8gZXhpc3QgbmF0aXZlbHkuIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHRoZSBuYXRpdmUgZXZlbnQKCQkJCS8vIG9iamVjdCBpcyByZXVzZWQgYW5kIHRoZSB0eXBlIGlzIGNoYW5nZWQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QKCQkJCS8vIHJlbHkgb24gdGhlIHR5cGUgYmVpbmcgY29ycmVjdCBhZnRlciB0aGUgZXZlbnQgZmluaXNoZWQKCQkJCS8vIGJ1YmJsaW5nLCBzbyB3ZSBzZXQgaXQgYmFjayB0byB0aGUgcHJldmlvdXMgdmFsdWUuICgjODc0MCkKCQkJCWlmICggZXZlbnQgKSB7CgkJCQkJZXZlbnQudHlwZSA9IGV2ZW50VHlwZTsKCQkJCX0KCQkJCXRoaXMuX29wZW4oIGV2ZW50LCB0YXJnZXQsIHJlc3BvbnNlICk7CgkJCX0pOwoJCX0pOwoJCWlmICggY29udGVudCApIHsKCQkJdGhpcy5fb3BlbiggZXZlbnQsIHRhcmdldCwgY29udGVudCApOwoJCX0KCX0sCgoJX29wZW46IGZ1bmN0aW9uKCBldmVudCwgdGFyZ2V0LCBjb250ZW50ICkgewoJCXZhciB0b29sdGlwLCBldmVudHMsIGRlbGF5ZWRTaG93LAoJCQlwb3NpdGlvbk9wdGlvbiA9ICQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uICk7CgoJCWlmICggIWNvbnRlbnQgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENvbnRlbnQgY2FuIGJlIHVwZGF0ZWQgbXVsdGlwbGUgdGltZXMuIElmIHRoZSB0b29sdGlwIGFscmVhZHkKCQkvLyBleGlzdHMsIHRoZW4ganVzdCB1cGRhdGUgdGhlIGNvbnRlbnQgYW5kIGJhaWwuCgkJdG9vbHRpcCA9IHRoaXMuX2ZpbmQoIHRhcmdldCApOwoJCWlmICggdG9vbHRpcC5sZW5ndGggKSB7CgkJCXRvb2x0aXAuZmluZCggIi51aS10b29sdGlwLWNvbnRlbnQiICkuaHRtbCggY29udGVudCApOwoJCQlyZXR1cm47CgkJfQoKCQkvLyBpZiB3ZSBoYXZlIGEgdGl0bGUsIGNsZWFyIGl0IHRvIHByZXZlbnQgdGhlIG5hdGl2ZSB0b29sdGlwCgkJLy8gd2UgaGF2ZSB0byBjaGVjayBmaXJzdCB0byBhdm9pZCBkZWZpbmluZyBhIHRpdGxlIGlmIG5vbmUgZXhpc3RzCgkJLy8gKHdlIGRvbid0IHdhbnQgdG8gY2F1c2UgYW4gZWxlbWVudCB0byBzdGFydCBtYXRjaGluZyBbdGl0bGVdKQoJCS8vCgkJLy8gV2UgdXNlIHJlbW92ZUF0dHIgb25seSBmb3Iga2V5IGV2ZW50cywgdG8gYWxsb3cgSUUgdG8gZXhwb3J0IHRoZSBjb3JyZWN0CgkJLy8gYWNjZXNzaWJsZSBhdHRyaWJ1dGVzLiBGb3IgbW91c2UgZXZlbnRzLCBzZXQgdG8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkCgkJLy8gbmF0aXZlIHRvb2x0aXAgc2hvd2luZyB1cCAoaGFwcGVucyBvbmx5IHdoZW4gcmVtb3ZpbmcgaW5zaWRlIG1vdXNlb3ZlcikuCgkJaWYgKCB0YXJnZXQuaXMoICJbdGl0bGVdIiApICkgewoJCQlpZiAoIGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICJtb3VzZW92ZXIiICkgewoJCQkJdGFyZ2V0LmF0dHIoICJ0aXRsZSIsICIiICk7CgkJCX0gZWxzZSB7CgkJCQl0YXJnZXQucmVtb3ZlQXR0ciggInRpdGxlIiApOwoJCQl9CgkJfQoKCQl0b29sdGlwID0gdGhpcy5fdG9vbHRpcCggdGFyZ2V0ICk7CgkJYWRkRGVzY3JpYmVkQnkoIHRhcmdldCwgdG9vbHRpcC5hdHRyKCAiaWQiICkgKTsKCQl0b29sdGlwLmZpbmQoICIudWktdG9vbHRpcC1jb250ZW50IiApLmh0bWwoIGNvbnRlbnQgKTsKCgkJZnVuY3Rpb24gcG9zaXRpb24oIGV2ZW50ICkgewoJCQlwb3NpdGlvbk9wdGlvbi5vZiA9IGV2ZW50OwoJCQlpZiAoIHRvb2x0aXAuaXMoICI6aGlkZGVuIiApICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCXRvb2x0aXAucG9zaXRpb24oIHBvc2l0aW9uT3B0aW9uICk7CgkJfQoJCWlmICggdGhpcy5vcHRpb25zLnRyYWNrICYmIGV2ZW50ICYmIC9ebW91c2UvLnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJdGhpcy5fb24oIHRoaXMuZG9jdW1lbnQsIHsKCQkJCW1vdXNlbW92ZTogcG9zaXRpb24KCQkJfSk7CgkJCS8vIHRyaWdnZXIgb25jZSB0byBvdmVycmlkZSBlbGVtZW50LXJlbGF0aXZlIHBvc2l0aW9uaW5nCgkJCXBvc2l0aW9uKCBldmVudCApOwoJCX0gZWxzZSB7CgkJCXRvb2x0aXAucG9zaXRpb24oICQuZXh0ZW5kKHsKCQkJCW9mOiB0YXJnZXQKCQkJfSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uICkgKTsKCQl9CgoJCXRvb2x0aXAuaGlkZSgpOwoKCQl0aGlzLl9zaG93KCB0b29sdGlwLCB0aGlzLm9wdGlvbnMuc2hvdyApOwoJCS8vIEhhbmRsZSB0cmFja2luZyB0b29sdGlwcyB0aGF0IGFyZSBzaG93biB3aXRoIGEgZGVsYXkgKCM4NjQ0KS4gQXMgc29vbgoJCS8vIGFzIHRoZSB0b29sdGlwIGlzIHZpc2libGUsIHBvc2l0aW9uIHRoZSB0b29sdGlwIHVzaW5nIHRoZSBtb3N0IHJlY2VudAoJCS8vIGV2ZW50LgoJCWlmICggdGhpcy5vcHRpb25zLnNob3cgJiYgdGhpcy5vcHRpb25zLnNob3cuZGVsYXkgKSB7CgkJCWRlbGF5ZWRTaG93ID0gdGhpcy5kZWxheWVkU2hvdyA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCB0b29sdGlwLmlzKCAiOnZpc2libGUiICkgKSB7CgkJCQkJcG9zaXRpb24oIHBvc2l0aW9uT3B0aW9uLm9mICk7CgkJCQkJY2xlYXJJbnRlcnZhbCggZGVsYXllZFNob3cgKTsKCQkJCX0KCQkJfSwgJC5meC5pbnRlcnZhbCApOwoJCX0KCgkJdGhpcy5fdHJpZ2dlciggIm9wZW4iLCBldmVudCwgeyB0b29sdGlwOiB0b29sdGlwIH0gKTsKCgkJZXZlbnRzID0gewoJCQlrZXl1cDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuRVNDQVBFICkgewoJCQkJCXZhciBmYWtlRXZlbnQgPSAkLkV2ZW50KGV2ZW50KTsKCQkJCQlmYWtlRXZlbnQuY3VycmVudFRhcmdldCA9IHRhcmdldFswXTsKCQkJCQl0aGlzLmNsb3NlKCBmYWtlRXZlbnQsIHRydWUgKTsKCQkJCX0KCQkJfSwKCQkJcmVtb3ZlOiBmdW5jdGlvbigpIHsKCQkJCXRoaXMuX3JlbW92ZVRvb2x0aXAoIHRvb2x0aXAgKTsKCQkJfQoJCX07CgkJaWYgKCAhZXZlbnQgfHwgZXZlbnQudHlwZSA9PT0gIm1vdXNlb3ZlciIgKSB7CgkJCWV2ZW50cy5tb3VzZWxlYXZlID0gImNsb3NlIjsKCQl9CgkJaWYgKCAhZXZlbnQgfHwgZXZlbnQudHlwZSA9PT0gImZvY3VzaW4iICkgewoJCQlldmVudHMuZm9jdXNvdXQgPSAiY2xvc2UiOwoJCX0KCQl0aGlzLl9vbiggdHJ1ZSwgdGFyZ2V0LCBldmVudHMgKTsKCX0sCgoJY2xvc2U6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRhcmdldCA9ICQoIGV2ZW50ID8gZXZlbnQuY3VycmVudFRhcmdldCA6IHRoaXMuZWxlbWVudCApLAoJCQl0b29sdGlwID0gdGhpcy5fZmluZCggdGFyZ2V0ICk7CgoJCS8vIGRpc2FibGluZyBjbG9zZXMgdGhlIHRvb2x0aXAsIHNvIHdlIG5lZWQgdG8gdHJhY2sgd2hlbiB3ZSdyZSBjbG9zaW5nCgkJLy8gdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCBpbiBjYXNlIHRoZSB0b29sdGlwIGJlY29tZXMgZGlzYWJsZWQgb24gY2xvc2UKCQlpZiAoIHRoaXMuY2xvc2luZyApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2xlYXIgdGhlIGludGVydmFsIGZvciBkZWxheWVkIHRyYWNraW5nIHRvb2x0aXBzCgkJY2xlYXJJbnRlcnZhbCggdGhpcy5kZWxheWVkU2hvdyApOwoKCQkvLyBvbmx5IHNldCB0aXRsZSBpZiB3ZSBoYWQgb25lIGJlZm9yZSAoc2VlIGNvbW1lbnQgaW4gX29wZW4oKSkKCQlpZiAoIHRhcmdldC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApIHsKCQkJdGFyZ2V0LmF0dHIoICJ0aXRsZSIsIHRhcmdldC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApOwoJCX0KCgkJcmVtb3ZlRGVzY3JpYmVkQnkoIHRhcmdldCApOwoKCQl0b29sdGlwLnN0b3AoIHRydWUgKTsKCQl0aGlzLl9oaWRlKCB0b29sdGlwLCB0aGlzLm9wdGlvbnMuaGlkZSwgZnVuY3Rpb24oKSB7CgkJCXRoYXQuX3JlbW92ZVRvb2x0aXAoICQoIHRoaXMgKSApOwoJCX0pOwoKCQl0YXJnZXQucmVtb3ZlRGF0YSggInVpLXRvb2x0aXAtb3BlbiIgKTsKCQl0aGlzLl9vZmYoIHRhcmdldCwgIm1vdXNlbGVhdmUgZm9jdXNvdXQga2V5dXAiICk7CgkJLy8gUmVtb3ZlICdyZW1vdmUnIGJpbmRpbmcgb25seSBvbiBkZWxlZ2F0ZWQgdGFyZ2V0cwoJCWlmICggdGFyZ2V0WzBdICE9PSB0aGlzLmVsZW1lbnRbMF0gKSB7CgkJCXRoaXMuX29mZiggdGFyZ2V0LCAicmVtb3ZlIiApOwoJCX0KCQl0aGlzLl9vZmYoIHRoaXMuZG9jdW1lbnQsICJtb3VzZW1vdmUiICk7CgoJCWlmICggZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gIm1vdXNlbGVhdmUiICkgewoJCQkkLmVhY2goIHRoaXMucGFyZW50cywgZnVuY3Rpb24oIGlkLCBwYXJlbnQgKSB7CgkJCQkkKCBwYXJlbnQuZWxlbWVudCApLmF0dHIoICJ0aXRsZSIsIHBhcmVudC50aXRsZSApOwoJCQkJZGVsZXRlIHRoYXQucGFyZW50c1sgaWQgXTsKCQkJfSk7CgkJfQoKCQl0aGlzLmNsb3NpbmcgPSB0cnVlOwoJCXRoaXMuX3RyaWdnZXIoICJjbG9zZSIsIGV2ZW50LCB7IHRvb2x0aXA6IHRvb2x0aXAgfSApOwoJCXRoaXMuY2xvc2luZyA9IGZhbHNlOwoJfSwKCglfdG9vbHRpcDogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdmFyIGlkID0gInVpLXRvb2x0aXAtIiArIGluY3JlbWVudHMrKywKCQkJdG9vbHRpcCA9ICQoICI8ZGl2PiIgKQoJCQkJLmF0dHIoewoJCQkJCWlkOiBpZCwKCQkJCQlyb2xlOiAidG9vbHRpcCIKCQkJCX0pCgkJCQkuYWRkQ2xhc3MoICJ1aS10b29sdGlwIHVpLXdpZGdldCB1aS1jb3JuZXItYWxsIHVpLXdpZGdldC1jb250ZW50ICIgKwoJCQkJCSggdGhpcy5vcHRpb25zLnRvb2x0aXBDbGFzcyB8fCAiIiApICk7CgkJJCggIjxkaXY+IiApCgkJCS5hZGRDbGFzcyggInVpLXRvb2x0aXAtY29udGVudCIgKQoJCQkuYXBwZW5kVG8oIHRvb2x0aXAgKTsKCQl0b29sdGlwLmFwcGVuZFRvKCB0aGlzLmRvY3VtZW50WzBdLmJvZHkgKTsKCQl0aGlzLnRvb2x0aXBzWyBpZCBdID0gZWxlbWVudDsKCQlyZXR1cm4gdG9vbHRpcDsKCX0sCgoJX2ZpbmQ6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIGlkID0gdGFyZ2V0LmRhdGEoICJ1aS10b29sdGlwLWlkIiApOwoJCXJldHVybiBpZCA/ICQoICIjIiArIGlkICkgOiAkKCk7Cgl9LAoKCV9yZW1vdmVUb29sdGlwOiBmdW5jdGlvbiggdG9vbHRpcCApIHsKCQl0b29sdGlwLnJlbW92ZSgpOwoJCWRlbGV0ZSB0aGlzLnRvb2x0aXBzWyB0b29sdGlwLmF0dHIoICJpZCIgKSBdOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQkvLyBjbG9zZSBvcGVuIHRvb2x0aXBzCgkJJC5lYWNoKCB0aGlzLnRvb2x0aXBzLCBmdW5jdGlvbiggaWQsIGVsZW1lbnQgKSB7CgkJCS8vIERlbGVnYXRlIHRvIGNsb3NlIG1ldGhvZCB0byBoYW5kbGUgY29tbW9uIGNsZWFudXAKCQkJdmFyIGV2ZW50ID0gJC5FdmVudCggImJsdXIiICk7CgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50WzBdOwoJCQl0aGF0LmNsb3NlKCBldmVudCwgdHJ1ZSApOwoKCQkJLy8gUmVtb3ZlIGltbWVkaWF0ZWx5OyBkZXN0cm95aW5nIGFuIG9wZW4gdG9vbHRpcCBkb2Vzbid0IHVzZSB0aGUKCQkJLy8gaGlkZSBhbmltYXRpb24KCQkJJCggIiMiICsgaWQgKS5yZW1vdmUoKTsKCgkJCS8vIFJlc3RvcmUgdGhlIHRpdGxlCgkJCWlmICggZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApIHsKCQkJCWVsZW1lbnQuYXR0ciggInRpdGxlIiwgZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApOwoJCQkJZWxlbWVudC5yZW1vdmVEYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKTsKCQkJfQoJCX0pOwoJfQp9KTsKCn0oIGpRdWVyeSApICk7Cg==')
},
{
'name': '/app/data/components.json', 'data': base64.b64decode(b'LyoqCiAqIENyZWF0ZWQgYnkgbWFydWYgbWFuaXJ1enphbWFuIG9uIDgvMjEvMTQuCiAqLwpbCnsKICAgICJuYW1lIjoicGF5cGFsYnV0dG9uIiwKICAgICJ0aXRsZSI6ICJQYXlwYWwgQnV0dG9uIiwKICAgICJzZXR0aW5ncyI6WwogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogInRleHQiLAogICAgICAgICAgICAiaXRlbW5hbWUiOiJ0ZXh0IiwKICAgICAgICAgICAgIml0ZW1pZCI6InRleHQiLAogICAgICAgICAgICAicHJpY2UiOiJ0ZXh0IiwKICAgICAgICAgICAgImN1cnJlbmN5IjoiQ3VycmVuY3kiCiAgICAgICAgfQogICAgXQp9Cl0=')
},
{
'name': '/app/data/sample.css', 'data': base64.b64decode(b'LnByb2R1Y3QgewogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDMyMHB4OwogICAgbWluLWhlaWdodDogMjUwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjRUZFRkVGOwogICAgbWFyZ2luOiA3cHg7CiAgICBwYWRkaW5nOiA3cHg7Cn0=')
},
{
'name': '/app/data/app_init.json', 'data': base64.b64decode(b'ewogICAgImlkIjogIjJmZmQ3NTZlNzMxNzdiOTZjYTc3NTczNjQ0YmIyOWJiIiwKICAgICJuYW1lIjogImNvc21vcy5hcHBsaWNhdGlvbi5hZG1pbiIsCiAgICAidGl0bGUiOiAiQ29zbW9zIEFkbWluIEFwcGxpY2F0aW9uIiwKICAgICJhdXRob3IiOiAiTWFydWYgTWFuaXJ1enphbWFuIiwKICAgICJjb250YWN0IjogIm1hcnVmbUBjb3Ntb3NmcmFtZXdvcmsuY29tIiwKICAgICJ3ZWJzaXRlIjogImh0dHA6Ly93d3cuY29zbW9zZnJhbWV3b3JrLmNvbSIsCiAgICAiY29weXJpZ2h0IjogIihjKSAyMDE0LCBNYXJ1ZiBNYW5pcnV6emFtYW4iLAogICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICJ2ZXJzaW9uIjogIjAuMDAuMDAxLjAwIiwKICAgICJzZXR0aW5ncyI6IHsKICAgICAgICAibmFtZSI6ICJib290c3RyYXBfb2JqZWN0cyIsCiAgICAgICAgInZhbHVlIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAib2JqZWN0IjogImNvc21vcy53aWRnZXRzIiwKICAgICAgICAgICAgICAgICJkYXRhIjogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29zbW9zLndpZGdldF9pdGVtX2xpc3QuaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICI8ZGl2IGNsYXNzPVwicHJvZHVjdFwiIG5nLXJlcGVhdD1cIml0ZW0gaW4gZGF0YVwiIG5nLWluY2x1ZGU9XCIgJ2Nvc21vcy53aWRnZXRfaXRlbS5odG1sJyBcIiAvPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJfaWQiOiAiNTNjMTk1Y2M4YzY2YWIzNWZhYjU0OGRjIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ3aWRnZXRfaXRlbS5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogIjxsYWJlbD5UZXN0PC9sYWJlbD48ZGl2IG5nLXJlcGVhdD1cImNvbHVtbiBpbiBsaXN0Q29uZmlndXJhdGlvbi5jb2x1bW5zXCI+e3tpdGVtW2NvbHVtbi5uYW1lXX19PC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIl9pZCI6ICI1M2MxOTcwMThjNjZhYjM1ZmFiNTQ4ZGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImNvc21vcy5saXN0LWRldGFpbC5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogIjxkaXY+PGVycm9yIG5nLWluY2x1ZGU9XCIgJ2Nvc21vcy53aWRnZXRfZXJyb3JfYmFubmVyLmh0bWwnIFwiIC8+PC9kaXY+PGgzPnt7bGlzdENvbmZpZ3VyYXRpb24udGl0bGV9fTwvaDM+PGRpdiBjbGFzcz1cImxlZnQtY29sXCI+PC9kaXY+PGRpdiBjbGFzcz1cInJpZ2h0LWNvbFwiIG5nLWluY2x1ZGU9XCIgJ2Nvc21vcy53aWRnZXRfaXRlbV9saXN0Lmh0bWwnIFwiID48L2Rpdj4iLAogICAgICAgICAgICAgICAgICAgICAgICAiX2lkIjogIjUzYzFjZWFkOGM2NmFiNjMwMjVlMGMwNiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAid2lkZ2V0LWxpc3QuaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICI8dGFibGUgY2xhc3M9XCJ0YWJsZVwiPlxuICAgIDx0cj5cbiAgICAgICAgPHRoPk5hbWU8L3RoPjx0aD5UZW1wbGF0ZTwvdGg+PHRoPiZuYnNwOzwvdGg+XG4gICAgPC90cj5cbiAgICA8dHIgbmctcmVwZWF0PVwiaXRlbSBpbiBkYXRhXCI+XG4gICAgICAgIDx0ZD57e2l0ZW0ubmFtZX19PC90ZD5cbiAgICAgICAgPHRkPnt7aXRlbS50ZW1wbGF0ZX19PC90ZD5cbiAgICAgICAgPHRkPjxhIGhyZWY9XCIvIy9mb3Jtcy81M2Q5MGY2ZjhjNjZhYjU0NTA0MTE0Mzcve3tpdGVtLl9pZH19L1wiPkVkaXQ8L2E+PC90ZD5cbiAgICA8L3RyPlxuPC90YWJsZT5cblxuPGEgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBocmVmPVwiLyMvZm9ybXMvNTNkOTBmNmY4YzY2YWI1NDUwNDExNDM3XCI+TmV3IHdpZGdldDwvYT4iLAogICAgICAgICAgICAgICAgICAgICAgICAiX2lkIjogIjUzZGJhYTEzOGM2NmFiNTk2MGM0YWFhZiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIl9pZCI6ICI1M2U3ZDNjNzhjNjZhYjdkYjgzZjZjNjQiLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJjb3Ntb3MubGlzdGNvbmZpZy1jb2x1bW5zLmh0bWwiLAogICAgICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiPGRpdiBuZy1yZXBlYXQ9XCJjb2x1bW4gaW4gaXRlbS5jb2x1bW5zXCI+XG4gICAge3tjb2x1bW4udGl0bGV9fSAoe3tjb2x1bW4ubmFtZX19KVxuPC9kaXY+IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJjb3Ntb3MubGlzdC1jb25maWctZGV0YWlsLmh0bWwiLAogICAgICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiPHRhYmxlIGNsYXNzPVwidGFibGVcIj48dHI+PHRoPklkPC90aD48dGg+T2JqZWN0PC90aD48dGg+VGl0bGU8L3RoPjx0aD5Db2x1bW5zPC90aD48L3RyPjx0ciBuZy1yZXBlYXQ9XCJpdGVtIGluIGRhdGFcIj48dGQ+e3tpdGVtLl9pZH19PC90ZD48dGQ+e3tpdGVtLm9iamVjdE5hbWV9fTx0ZD57e2l0ZW0udGl0bGV9fTwvdGQ+IDx0ZD48ZGl2IG5nLXJlcGVhdD1cImNvbHVtbiBpbiBpdGVtLmNvbHVtbnNcIj57e2NvbHVtbi50aXRsZX19ICh7e2NvbHVtbi5uYW1lfX0pPC9kaXY+PC90ZD48L3RyPjwvdGFibGU+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIl9pZCI6ICI1M2Q4NTRhYThjNjZhYjU0NTA0MTE0MzAiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJfaWQiOiAiNTNlYjUzM2U4YzY2YWI3ZGI4M2Y2YzY1IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29zbW9zLmVkaXRvci12aWV3Lmh0bWwiLAogICAgICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiPGRpdiB1aS1hY2UgY2xhc3M9XCJlZGl0b3JcIiByZWFkb25seT1cInJlYWRvbmx5XCIgbmctbW9kZWw9XCJpdGVtW2NvbHVtbi5uYW1lXVwiPjwvZGl2PiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29zbW9zLndpZGdldF9lcnJvcl9iYW5uZXIuaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICI8ZGl2IG5nLXNob3c9XCJoYXNFcnJvclwiIGNsYXNzPVwiYmctd2FybmluZ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXhzIGJ0bi1kYW5nZXIgZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUgcHVsbC1yaWdodFwiIG5nLWNsaWNrPVwiY2xlYXJFcnJvcigpO1wiPjwvYnV0dG9uPlxuICAgIDxkaXY+PGxhYmVsPkVycm9yIGNvZGU6PC9sYWJlbD48c3BhbiBuZy1iaW5kPVwic3RhdHVzXCIgLz48L2Rpdj4gXG4gICAgPGRpdiBuZy1iaW5kPVwic3RhdHVzX2RhdGFcIj48L2Rpdj5cbjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJfaWQiOiAiNTNjMWM3MDA4YzY2YWIzNWZhZDRjN2FlIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJjb3Ntb3MuYmFzaWNsaXN0Lmh0bWwiLAogICAgICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiPGRpdj5cbjxlcnJvciBuZy1pbmNsdWRlPVwiICdjb3Ntb3Mud2lkZ2V0X2Vycm9yX2Jhbm5lci5odG1sJyBcIiAvPlxuPC9kaXY+XG48aDM+e3tsaXN0Q29uZmlndXJhdGlvbi50aXRsZX19PC9oMz5cbjxkaXYgY2xhc3M9XCJsZWZ0LWNvbFwiPlxuPC9kaXY+XG48dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ob3ZlciByaWdodC1jb2xcIj5cbiAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBuZy1yZXBlYXQ9XCJjb2x1bW4gaW4gbGlzdENvbmZpZ3VyYXRpb24uY29sdW1uc1wiIG5nLWlmPVwiY29sdW1uLnNob3dJbkxpc3RcIj57e2NvbHVtbi50aXRsZX19PC90aD5cbiAgICAgICAgICAgIDx0aCBuZy1pZj1cImxpc3RDb25maWd1cmF0aW9uLmVkaXRhYmxlICYmIGxpc3RDb25maWd1cmF0aW9uLml0ZW1lZGl0b3JfaWRcIj4mbmJzcDs8L3RoPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5PlxuICAgICAgICA8dHIgbmctcmVwZWF0PVwiaXRlbSBpbiBkYXRhXCI+XG4gICAgICAgICAgICA8dGQgbmctcmVwZWF0PVwiY29sdW1uIGluIGxpc3RDb25maWd1cmF0aW9uLmNvbHVtbnNcIiBuZy1jbGljaz1cInNob3dEZXRhaWxzKCdsZycsIGl0ZW0sIGxpc3RDb25maWd1cmF0aW9uKVwiIG5nLWlmPVwiY29sdW1uLnNob3dJbkxpc3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IG5nLWlmPVwiY29sdW1uLndpZGdldCAmJiBjb2x1bW4ud2lkZ2V0Lmxlbmd0aD4wXCIgbmctaW5jbHVkZT1cImNvbHVtbi53aWRnZXRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdiBuZy1pZj1cIiFjb2x1bW4ud2lkZ2V0XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7aXRlbVtjb2x1bW4ubmFtZV19fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBuZy1pZj1cImxpc3RDb25maWd1cmF0aW9uLmVkaXRhYmxlICYmbGlzdENvbmZpZ3VyYXRpb24uaXRlbWVkaXRvcl9pZFwiPlxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjL2Zvcm1zL3t7bGlzdENvbmZpZ3VyYXRpb24uaXRlbWVkaXRvcl9pZH19L3t7aXRlbS5faWR9fVwiPkVkaXQ8L2E+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGJvZHk+XG48L3RhYmxlPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJfaWQiOiAiNTNlN2E3NDk4YzY2YWI3ZGI4M2Y2YzYzIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJjb3Ntb3MuZm9ybV9saXN0X3dpZGdldC5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogIjxkaXYgbmctcmVwZWF0PVwiaXRlbSBpbiBkYXRhXCI+PGEgaHJlZj1cIiMvZm9ybXMve3tpdGVtWydfaWQnXX19XCI+e3tpdGVtWyd0aXRsZSddfX08L2E+IDxhIGNsYXNzPVwiYnRuIGJ0bi14cyBidG4td2FybmluZyBnbHlwaGljb24gZ2x5cGhpY29uLWVkaXQgcHVsbC1yaWdodFwiIGhyZWY9XCIjL2Zvcm1kZXNpZ24ve3tpdGVtWydfaWQnXX19XCI+PC9hPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJfaWQiOiAiNTNkNjA0YWE4YzY2YWI1NDUwNDExNDI5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJjb3Ntb3MuZm9ybXMtbGlzdC5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogIiA8ZGl2PlxuIDxlcnJvciBuZy1pbmNsdWRlPVwiICdjb3Ntb3Mud2lkZ2V0X2Vycm9yX2Jhbm5lci5odG1sJyBcIiAvPjwvZGl2PlxuIDxoMz57e2xpc3RDb25maWd1cmF0aW9uLnRpdGxlfX08L2gzPiBcbiA8ZGl2IGNsYXNzPVwibGVmdC1jb2xcIj48L2Rpdj48ZGl2IGNsYXNzPVwicmlnaHQtY29sXCIgbmctaW5jbHVkZT1cIiAnY29zbW9zLmZvcm1fbGlzdF93aWRnZXQuaHRtbCcgXCIgPjwvZGl2PlxuIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgaHJlZj1cIiMvZm9ybWRlc2lnbi9cIj5OZXcgZm9ybTwvYT4iLAogICAgICAgICAgICAgICAgICAgICAgICAiX2lkIjogIjUzZDYwMmUyOGM2NmFiNTQ1MDQxMTQyOCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJvYmplY3QiOiAiY29zbW9zLmxpc3Rjb25maWd1cmF0aW9ucyIsCiAgICAgICAgICAgICAgICAiZGF0YSI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ3aWRnZXROYW1lIjogImNvc21vcy5iYXNpY2xpc3QuaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3ROYW1lIjogImNvc21vcy5yYmFjLm9iamVjdC5yb2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImNvbHVtbnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAibmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogInNpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNJRCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJvbGVzIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiY29sdW1ucyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJfaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAidGl0bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdE5hbWUiOiAiY29zbW9zLmZvcm1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgIndpZGdldE5hbWUiOiAiY29zbW9zLmZvcm1zLWxpc3QuaHRtbCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIndpZGdldE5hbWUiOiAiY29zbW9zLmJhc2ljbGlzdC5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdE5hbWUiOiAiY29zbW9zLmxpc3Rjb25maWd1cmF0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjb2x1bW5zIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG93SW5MaXN0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ0aXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRpdGxlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0luTGlzdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAib2JqZWN0TmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9iamVjdCBuYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0luTGlzdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAid2lkZ2V0TmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldpZGdldCBOYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0luTGlzdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZGdldCI6ICJjb3Ntb3MubGlzdGNvbmZpZy1jb2x1bW5zLmh0bWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2x1bW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMaXN0cyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIndpZGdldE5hbWUiOiAiY29zbW9zLmJhc2ljbGlzdC5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdE5hbWUiOiAiY29zbW9zLndpZGdldHMiLAogICAgICAgICAgICAgICAgICAgICAgICAiY29sdW1ucyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0luTGlzdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAibmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG93SW5MaXN0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkZ2V0IjogImNvc21vcy5lZGl0b3Itdmlldy5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJ0ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRlbXBsYXRlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2lkZ2V0cyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9Cn0=')
},
{
'name': '/app/js/app.js', 'data': base64.b64decode(b'J3VzZSBzdHJpY3QnOwoKCi8vIERlY2xhcmUgYXBwIGxldmVsIG1vZHVsZSB3aGljaCBkZXBlbmRzIG9uIGZpbHRlcnMsIGFuZCBzZXJ2aWNlcwp2YXIgY29zbW9zVUlEZW1vID0gYW5ndWxhci5tb2R1bGUoJ2Nvc21vc1VJRGVtbycsIFsKICAgICduZ1JvdXRlJywKICAgICd1aS5ib290c3RyYXAnLAogICAgJ3VpLnNvcnRhYmxlJywKICAgICd1aS5hY2UnLAogICAgJ3VpLnNlbGVjdCcsCiAgICAneWFydTIyLmpzb25IdW1hbicsCiAgICAnTG9jYWxTdG9yYWdlTW9kdWxlJywKICAgICdjb3Ntb3NVSS5maWx0ZXJzJywKICAgICdjb3Ntb3NVSS5zZXJ2aWNlcycsCiAgICAnY29zbW9zVUkuZGlyZWN0aXZlcycsCiAgICAnY29zbW9zVUkuY29udHJvbGxlcnMnCl0pLgpjb25maWcoWyckcm91dGVQcm92aWRlcicsIGZ1bmN0aW9uKCRyb3V0ZVByb3ZpZGVyKSB7CiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvdGVybWluYWwnLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL3Rlcm1pbmFsLmh0bWwnLCBjb250cm9sbGVyOiAnVGVybWluYWxDdHJsJ30pOwogICAgJHJvdXRlUHJvdmlkZXIud2hlbignL2ZpbGVtYW5hZ2VyJywge3RlbXBsYXRlVXJsOiAnbGliL2Nvc21vcy9wYXJ0aWFscy9maWxlbWFuYWdlci5odG1sJywgY29udHJvbGxlcjogJ0ZpbGVNYW5hZ2VyQ3RybCd9KTsKCiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvaW5zdGFsbCcsIHt0ZW1wbGF0ZVVybDogJ2xpYi9jb3Ntb3MvcGFydGlhbHMvaW5zdGFsbC5odG1sJywgY29udHJvbGxlcjogJ1Rlcm1pbmFsQ3RybCd9KTsKICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oJy9tZXNzYWdlJywge3RlbXBsYXRlVXJsOiAnbGliL2Nvc21vcy9wYXJ0aWFscy9tZXNzYWdlLmh0bWwnLCBjb250cm9sbGVyOiAnTWVzc2FnZVZpZXdDdHJsJ30pOwoKICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oJy91c2VycycsIHt0ZW1wbGF0ZVVybDogJ2xpYi9jb3Ntb3MvcGFydGlhbHMvdXNlcnMuaHRtbCcsIGNvbnRyb2xsZXI6ICdVc2Vyc0N0cmwnfSk7CiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvcm9sZXMnLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL3JvbGVzLmh0bWwnLCBjb250cm9sbGVyOiAnUm9sZXNDdHJsJ30pOwogICAgJHJvdXRlUHJvdmlkZXIud2hlbignL2xpc3RzLycsIHt0ZW1wbGF0ZVVybDogJ2xpYi9jb3Ntb3MvcGFydGlhbHMvbGlzdC5odG1sJywgY29udHJvbGxlcjogJ0xpc3RDdHJsJ30pOwogICAgJHJvdXRlUHJvdmlkZXIud2hlbignL2xvZ2luLycsIHt0ZW1wbGF0ZVVybDogJ2xpYi9jb3Ntb3MvcGFydGlhbHMvbG9naW4uaHRtbCcsIGNvbnRyb2xsZXI6ICdMb2dpbkN0cmwnfSk7CgogICAgJHJvdXRlUHJvdmlkZXIud2hlbignL2FwcHN0dWRpby86YXBwUGF0aD8nLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL2FwcHN0dWRpby5odG1sJywgY29udHJvbGxlcjogJ0FwcFN0dWRpb0N0cmwnfSk7CiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvYXBwc3R1ZGlvL3BhZ2UvOmFwcFBhdGgvOnBhZ2VJZD8nLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL3BhZ2UtZGVzaWduLmh0bWwnLCBjb250cm9sbGVyOiAnUGFnZURlc2lnbkN0cmwnfSk7CiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvYXBwc3R1ZGlvL2Zvcm0vOmFwcFBhdGgvOmZvcm1JZD8nLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL2Zvcm0tZGVzaWduLmh0bWwnLCBjb250cm9sbGVyOiAnRm9ybURlc2lnbkNvbnRyb2xsZXInfSk7CgogICAgJHJvdXRlUHJvdmlkZXIud2hlbignL2FwcHN0dWRpby86aXRlbVR5cGUvOmFwcFBhdGgvOml0ZW1JZD8nLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL2l0ZW0tZGVzaWduLmh0bWwnLCBjb250cm9sbGVyOiAnSXRlbURlc2lnbkN0cmwnfSk7CgogICAgJHJvdXRlUHJvdmlkZXIud2hlbignL2EvOmFwcFBhdGgvZm9ybWRlc2lnbi86Zm9ybUlkPycsIHt0ZW1wbGF0ZVVybDogJ2xpYi9jb3Ntb3MvcGFydGlhbHMvZm9ybS1kZXNpZ24uaHRtbCcsIGNvbnRyb2xsZXI6ICdGb3JtRGVzaWduQ29udHJvbGxlcid9KTsKICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oJy9hLzphcHBQYXRoL3BhZ2VkZXNpZ24vOnBhZ2VJZD8nLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL3BhZ2UtZGVzaWduLmh0bWwnLCBjb250cm9sbGVyOiAnUGFnZURlc2lnbkN0cmwnfSk7CgoKICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oJy9hLzphcHBQYXRoPy8nLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL3BhZ2Vob2xkZXIuaHRtbCcsIGNvbnRyb2xsZXI6ICdJbmRleEN0cmwnfSk7CiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvYS86YXBwUGF0aC9saXN0cy86bGlzdElkLycsIHt0ZW1wbGF0ZVVybDogJ2xpYi9jb3Ntb3MvcGFydGlhbHMvd2lkZ2V0LWhvc3QuaHRtbCcsIGNvbnRyb2xsZXI6ICdMaXN0RGV0YWlsQ3RybCd9KTsKCiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvYS86YXBwUGF0aC9jb250ZW50LzpmaWxlT2JqZWN0TmFtZS8nLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL3VwbG9hZGZpbGUuaHRtbCcsIGNvbnRyb2xsZXI6ICdGaWxlVXBsb2FkQ3RybCd9KTsKICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oJy9hLzphcHBQYXRoL2Zvcm1zLzpmb3JtSWQ/LzpkYXRhSWQ/Jywge3RlbXBsYXRlVXJsOiAnbGliL2Nvc21vcy9wYXJ0aWFscy9mb3Jtdmlldy5odG1sJywgY29udHJvbGxlcjogJ0Zvcm1WaWV3Q3RybCd9KTsKCiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvYS86YXBwUGF0aC9wYWdlLzpwYWdlSWQ/Jywge3RlbXBsYXRlVXJsOiAnbGliL2Nvc21vcy9wYXJ0aWFscy9wYWdlLmh0bWwnLCBjb250cm9sbGVyOiAnUGFnZVZpZXdDdHJsJ30pOwoKICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oJy9hLzphcHBQYXRoL3ZpZXcvOmNvbmZpZ0lkLzppdGVtSWQvJywge3RlbXBsYXRlVXJsOiAnbGliL2Nvc21vcy9wYXJ0aWFscy9zaW5nbGVpdGVtdmlldy5odG1sJywgY29udHJvbGxlcjogJ1NpbmdsZUl0ZW1WaWV3Q3RybCd9KTsKCiAgICAkcm91dGVQcm92aWRlci53aGVuKCcvYXBwbGlzdC8nLCB7dGVtcGxhdGVVcmw6ICdsaWIvY29zbW9zL3BhcnRpYWxzL2FwcGxpc3QuaHRtbCcsIGNvbnRyb2xsZXI6ICdBcHBMaXN0Q3RybCd9KTsKCgogICAgJHJvdXRlUHJvdmlkZXIub3RoZXJ3aXNlKHtyZWRpcmVjdFRvOiAnL2EvJ30pOwp9XSk7Cgpjb3Ntb3NVSURlbW8uY29uZmlnKGZ1bmN0aW9uIChsb2NhbFN0b3JhZ2VTZXJ2aWNlUHJvdmlkZXIpIHsKICBsb2NhbFN0b3JhZ2VTZXJ2aWNlUHJvdmlkZXIuc2V0UHJlZml4KCdjb3Ntb3NVSScpOwp9KTsKCmNvc21vc1VJRGVtby5mYWN0b3J5KCckdGVtcGxhdGVDYWNoZScsIGZ1bmN0aW9uKCRjYWNoZUZhY3RvcnksICRodHRwLCAkaW5qZWN0b3IsICRsb2cpIHsKICAgIHZhciBjYWNoZSA9ICRjYWNoZUZhY3RvcnkoJ3RlbXBsYXRlcycpOwogICAgdmFyIHdpZGdldFByb21pc2U7CgogICAgcmV0dXJuIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICB2YXIgY2FjaGVkID0gY2FjaGUuZ2V0KHVybCk7CgogICAgICAgICAgICBpZiAoY2FjaGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXdpZGdldFByb21pc2UpIHsKICAgICAgICAgICAgICAgIHZhciB1cmk9Jy9zZXJ2aWNlL2Nvc21vcy53aWRnZXRzLyc7CgogICAgICAgICAgICAgICAgd2lkZ2V0UHJvbWlzZSA9ICRodHRwLmdldCh1cmkpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGVfZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UuZGF0YS5fZCk7CiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRlbXBsYXRlX2RhdGEsIGZ1bmN0aW9uIChkYXRhLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiBpZD0iJyArIGRhdGEubmFtZSArICciPicgKyBkYXRhLnRlbXBsYXRlICsgJzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICRpbmplY3Rvci5nZXQoJyRjb21waWxlJykodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkID0gY2FjaGUuZ2V0KHVybCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAkaHR0cC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICRsb2cuZXJyb3IoIkNvdWxkIG5vdCBsb2FkIHdpZGdldHM6Iik7CiAgICAgICAgICAgICAgICAgICAgJGxvZy5lcnJvcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHdpZGdldFByb21pc2UudGhlbihmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVkID0gY2FjaGUuZ2V0KHVybCk7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vRmFsbGJhY2sgdG8gcmVxdWVzdCB0aGUgc2VydmVyCiAgICAgICAgICAgICAgICByZXR1cm4gJGh0dHAuZ2V0KHVybCkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pCiAgICAgICAgfSwKCiAgICAgICAgcHV0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIGNhY2hlLnB1dChrZXksIHZhbHVlKTsKICAgICAgICB9CiAgICB9Owp9KTsK')
}]